[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!!!

posted @ 2022-09-03 17:33  Gentle_Jan  阅读(178)  评论(0编辑  收藏  举报