基于B站ROS公开课:【古月居】古月·ROS入门21讲
基于Ubuntu 20.04.1、Noetic版本
修正错误,并详述Python版本部署
上节学习了坐标管理系统tf的简介和理论,这节讲解TF坐(部分图摘自:b站【古月居】古月·ROS入门21讲)
创建的 learning_tf 包来进行代码存放和编译。
cd ~/catkin_ws/src
catkin_create_pkg learning_tf roscpp rospy tf turtlesim
如何实现一个TF广播器:
如何实现一个TF监听器:
(源码:https://github.com/guyuehome/ros_21_tutorials/tree/master/learning_tf/src)
用红字标示了自己的注解笔记。
a、在learning_tf/src
下创创建turtle_tf_broadcaster.cpp
文件
turtle_tf_broadcaster.cpp :根据实现的步骤,我们想要通过TF广播任意两个坐标系之间的位置关系,需要建立一个广播器,然后创建坐标的变换值,将这个变换矩阵的信息广播出去(插入TF tree)。
注意下面main函数时我们需要传入参数,参数从终端命令行输入(输入的参数包括节点名称 和 turtle_name),下面运行部分会解释一下传入的参数的方法。这样我们从终端传参可以重复跑两遍这个C++程序分别对应turtle1和turtle2的广播器。
坐标关系插入TF tree后,树会自动运算变换矩阵,后面我们就可以用监听器调用了。
b、在learning_tf/src
下创创建turtle_tf_listener.cpp
文件
turtle_tf_listener.cpp:根据步骤,从tf中获取任意两个坐标之间的位置关系(通过waitfor和lookup),然后命令turtle2向turtle1以定义的速度(Twist)移动。
将代码拷贝到src文件夹下。
先配置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
rosrun turtlesim turtle_teleop_key
如何实现一个TF广播器:
如何实现一个TF监听器:
(源码:https://github.com/guyuehome/ros_21_tutorials/tree/master/learning_tf/scripts)
用红字标示了自己的注解笔记。
turtle_tf_broadcaster.py :根据实现的步骤,我们想要通过TF广播任意两个坐标系之间的位置关系,需要建立一个广播器,然后创建坐标的变换值,将这个变换矩阵的信息广播出去(插入TF tree)。
注意下面main函数中,我们的turtlename是一个通过终端传入的参数,下面运行部分会解释一下传入的参数的方法。这样我们从终端传参可以重复跑两遍这个python程序分别对应turtle1和turtle2的广播器。
坐标关系插入TF tree后,树会自动运算变换矩阵,后面我们就可以用监听器调用了。
turtle_tf_listener.py:根据步骤,从tf中获取任意两个坐标之间的位置关系,然后命令turtle2向turtle1以定义的速度(Twist)移动。
将代码拷贝到新建的scripts文件夹下。
右击py文件→属性,打开执行权限。
先配置CMakeLists.txt编译规则:
加上一个关于turtle_tf_broadcaster.py和turtle_tf_listener.py的catkin_install_python方法:
将下面代码写到指定位置:
cd ~/catkin_ws
catkin_make
默认已经source,接着运行。
roscore
rosrun turtlesim turtlesim_node
注:
我们下面直接在命令行传入参数。
第1个参数:我们在turtle_tf_broadcaster.py定义节点时使用了"turtle_tf_broadcaster"的名字,我们使用__name:=
传入新的名字取代"my_tf_broadcaster",这样避免名字重复(因为ROS中节点名字不能重复),这样就可以重复跑程序了。
第2个参数是turtle名称 turtle1 和 turtle2。
rosrun learning_tf turtle_tf_broadcaster.py __name:=turtle1_tf_broadcaster _turtle:=turtle1
rosrun learning_tf turtle_tf_broadcaster.py __name:=turtle2_tf_broadcaster _turtle:=turtle2
rosrun learning_tf turtle_tf_listener.py
注:显示“ the rosdep view is empty: call ‘sudo rosdep init’ and ‘rosdep update’ ”的话不用介意。
上面完成后就会有一个海龟生成并跑向中间的第1只海龟。
rosrun turtlesim turtle_teleop_key
本文转自 https://blog.csdn.net/takedachia/article/details/1226149531,如有侵权,请联系删除。