在机器人系统中,我们经常会遇到坐标变换相关的问题。比如说,在一个导航系统中,我们通过激光雷达、双目摄像头等传感器对周围环境进行感知,但是这些传感器直接采集的数据是相对于传感器而言的, 而传感器在机器人身上的安装位置又各不相同,我们关心的则是外部环境与机器人本体之间的关系,所以还需要把相对于传感器的数据变换成为相对于机器人的数据。这个过程就是所谓的坐标变换。
如果涉及到多个机器人之间的协同工作,则需要维护两两之间的相对位置关系,在机器人很多的情况下,或者说是自由度很多的情况下,这种坐标系之间的变换关系就相对比较复杂。 ROS系统提供了一个叫做tf的坐标变换库,这个库使得我们能够在各种坐标系之间自由地切换。
在ROS中有一个turtle的例子,一个通过键盘控制turtle1跑,另外一个turtle2跟在turtle1后面,跟随其坐标进行跟踪。
这是:官方例子
这一过程就是通过tf来实现的。一个tf系统由tf广播者(tf broadcaster)和tf监听者(tf listener)两个部分构成的。这里的白龟(turtle1)和红龟(turtle2)就是两个tf广播者,它们不断的向外发送自己相对于世界坐标系的位置(也就是自己坐标系的原点在世界坐标系下的位置)。这里的是广播,所以所有的都会接收到他们发送的。
另外有一个监听者负责维护两个乌龟的坐标系,通过tf的API系统计算白龟(turtle1)相对红龟(turtle2)的位置,并控制红龟(turtle2)跟踪白龟(turtle1)。为了跟随,就需要知道turtle1相对于turtle2的坐标位置,也就是说turtle1的坐标原点在turtle2下的位置,也就是说turtle1在turtle2下的位置
创建功能包及其依赖catkin_create_pkg learning_tf tf roscpp rospy turtlesim
broadcaster.cpp,我们发布的节点就是通过这个来广播自己在世界坐标系的位置
1 | //这里有我们访问master的接口 |
turtle_tf_listener.cpp
1 | #include <ros/ros.h> |
最后,在learning_tf下新建launch文件turtle_tf_demo.launch
1 | <launch> |
最后在CMakeLists.txt中添加
1 | add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp) |
- 本文作者: 蓉城蒲菊
- 本文链接: https://github.com/liangpu597/2020/07/15/学习ros-turtle-TF坐标转换与roslaunch的编写/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!