[ROS学习]14. tf坐标系广播与监听的编程实现
笔记参考:【ROS学习笔记】14.tf坐标系广播与监听的编程实现
内容参考:B站ROS公开课:【古月居】古月·ROS入门21讲
本节说明
上节学习了坐标管理系统tf的简介和理论,这节讲解TF坐标变换的实现机制 广播与 监听的编程实现。
1 创建功能包
创建的 learning_tf 包来进行代码存放和编译。
cd ~/catkin_ws/src
catkin_create_pkg learning_tf roscpp rospy tf turtlesim
2 创建代码并编译运行(C++)
如何实现一个TF广播器:
- 定义TF广播器(TransformBroadcaster)
- 创建坐标变换值
- 发布坐标变换(sendTransform)
如何实现一个TF监听器:
- 定义TF监听器(TransformListener)
- 查找坐标变换(waitForTransform、lookupTransform)
创建代码
turtle_tf_broadcaster.cpp :根据实现的步骤,我们想要通过TF广播任意两个坐标系之间的位置关系,需要建立一个广播器,然后创建坐标的变换值,将这个变换矩阵的信息广播出去(插入TF tree)。
注意下面main函数时我们需要传入参数,参数从终端命令行输入(输入的参数包括节点名称 和 turtle_name),下面运行部分会解释一下传入的参数的方法。这样我们从终端传参可以重复跑两遍这个C++程序分别对应turtle1和turtle2的广播器。
坐标关系插入TF tree后,树会自动运算变换矩阵,后面我们就可以用监听器调用了。
turtle_tf_listener.cpp:根据步骤,从tf中获取任意两个坐标之间的位置关系(通过waitfor和lookup),然后命令turtle2向turtle1以定义的速度(Twist)移动。
编译
先配置CMakeLists.txt编译规则:
- 设置需要编译的代码和生成的可执行文件;
- 设置链接库;
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})
cd ~/catkin_ws
catkin_make
运行
默认已经source,接着分别在每个终端运行。
roscore
rosrun turtlesim turtlesim_node
注:
我们下面直接在命令行传入参数。
第1个参数:我们在turtle_tf_broadcaster.cpp定义节点时使用了"my_tf_broadcaster"的名字,我们使用__name:=传入新的名字取代"my_tf_broadcaster",这样避免名字重复(因为ROS中节点名字不能重复),这样就可以重复跑程序了。
第2个参数是turtle名称 turtle1 和 turtle2。
rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1
rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2
rosrun learning_tf turtle_tf_listener
上面完成后就会有一个海龟生成并跑向中间的第1只海龟。
rosrun turtlesim turtle_teleop_key
键盘控制海龟,同样可以让第2只海龟追着我们跑。
2 创建代码并编译运行(Python)
如何实现一个TF广播器:
- 定义TF广播器(TransformBroadcaster)
- 创建坐标变换值
- 发布坐标变换(sendTransform)
如何实现一个TF监听器:
- 定义TF监听器(TransformListener)
- 查找坐标变换(lookupTransform)
将代码拷贝到新建的scripts文件夹下。
右击py文件→属性,打开执行权限。
坐标关系插入TF tree后,树会自动运算变换矩阵,后面我们就可以用监听器调用了。
turtle_tf_listener.py:根据步骤,从tf中获取任意两个坐标之间的位置关系,然后命令turtle2向turtle1以定义的速度(Twist)移动。
roscore
rosrun turtlesim turtlesim_node
rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1
rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2
rosrun learning_tf turtle_tf_listener
rosrun turtlesim turtle_teleop_key
同样实现了turtle2追赶turtle1!!!