一、TF工具让ros2成为机器人开发利器的不仅仅是我们前面介绍的通讯机制还有各种强大的应用工具前面用的rqt就是ros2中的一个常用的可视化工具。1、坐标变换工具介绍在机器人的开发工程中坐标变换是非常重要的而且不好处理ros2就基于话题通讯机制就设计了一套库和工具用于管理机器人的坐标变换那么本章我们就从坐标变换工具入手学习使用ros2的常用工具。图中有几个特殊的点1base_link机器人的中心点2base_laser雷达、激光的中心点所有激光是从这里发射出去的ros2针对以上问题的情况机器人开发过程中非常常见的坐标变换的情况就设计了一套专门的工具就叫“坐标变换工具简称TF”。2、如何使用1通过命令行使用TF①、发布base_link到base_laser之间的变换ros2 run tf2_ros static_transform_publisher --x 0.1 --y 0.0 --z 0.2 --roll 0.0 --pitch 0.0 --yaw 0.0 --frame-id base_link --child-frame-id base_lasertf2_ros功能包名static_transform_publisher静态坐标变换发布--x 0.1 --y 0.0 --z 0.2X、Y、Z的值--roll 0.0 --pitch 0.0 --yaw 0.0旋转数据相当于绕X轴旋转在真实的物理环境中其实就是翻滚左右翻滚绕Y轴旋转俯仰就是上下头抬起来低下去绕Z轴旋转偏航向左转弯向右转弯--frame-id base_link将 base_link 作为父亲的坐标系名字--child-frame-id base_laserbase_laser 字坐标系的名字运行后可以看到已经发布了从base_link到base_laser之间的静态坐标变换。我们会发现平移translation部分和我们指定的一样但旋转rotation则变成了四个数字最后一个还是1.这是因为ros2中旋转量一般都是用四元数表示而我们给的是欧拉角形式本质上它们表示的姿态都是相同的就像同一温度可以用华氏度和摄氏度来表示。②、发布base_laser到wall_point之间的变换ros2 run tf2_ros static_transform_publisher --x 0.3 --y 0.0 --z 0.0 --roll 0.0 --pitch 0.0 --yaw 0.0 --frame-id base_laser --child-frame-id wall_point③、查询base_link到wall_point之间的关系ros2 run tf2_ros tf2_echo base_link wall_point23D旋转可视化sudo apt install ros-humble-mrpt2 -y这个是书本上的指令但是现在找不到 ros-humble-mrpt2库了可以之间使用3d-rotation-converter他会提示你安装哪个库错误截图直接使用 3d-rotation-converter现在安装命令sudo apt install mrpt-apps使用启动命令3d-rotation-converter 注意WSL系统需要使用 LIBGL_ALWAYS_SOFTWARE1 3d-rotation-converter 强制让程序使用 CPU 软件来渲染图像不要用显卡GPU去渲染。加了 LIBGL_ALWAYS_SOFTWARE1之后WSL系统就不再折腾显卡了直接使用CPU把图像画出来虽然CPU画图的速度不如显卡快跑复杂的3D游戏会卡但兼容性极其强大100%能看到画面。3、查看TF树ros2 run tf2_tools view_frames4、TF原理的简单探究1怎么计算的首先是有一个坐标关系发布的过程其实这个发布利用的就是ros2的话题通讯机制进行发布的。2过程分析①查看话题使用 ros2 topic list②查看话题信息ros2 topic info /tf_static③看消息接口定义ros2 interface show tf2_msgs/msg/TFMessage5、代码中的使用查看话题ros2 topic echo /tf_static如果在代码中查询base_link到wall_point之间的关系其实有个过程的首先建议一个缓冲区去订阅/tf_static话题然后把所有话题的内容都记录下来比如base_link到base_later的关系记录下来base_later到wall_point之间的关系记录下来。当我们通过这个缓冲区去问他base_link到wall_point之间的关系的时候他就会执行一系列的计算得出base_link到wall_point之间的关系然后把结果给我们返回。6、动态TF话题除了tf_static话题静态tf话题外还有另外一种tf话题叫做动态话题名字叫“/tf”没有这个“_static”和tf_static区别就是/tf这个话题需要不断的发布往往描述的是机器人中一些动态的关节比如说机器人的轮子相对于机器人的本体它会一直动态的旋转所以他的坐标关系也是在不断变化的所以需要使用动态的TF而一些固定的主架比如说雷达、固定带机器人的本体上它是固定的静态的不变的这是使用静态TF发布。二、python TF之手眼坐标变换手指机械臂眼指相机1、需求相机固定在右上方的camera_link处机械臂的底座固定在base_link处从base_link到 camera_link的位置是固定不变的平移分量0.5,0.3,0.6旋转分量180,0,0相机通过识别得到瓶子bottle_link的坐标其中平移分量0.2,0.3,0.5瓶子相对相机的坐标旋转分量0,0,02、静态TF发布从机械臂底座到相机使用静态发布。1原理发布/tf_static话题2安装库sudo apt install ros-$ROS_DISTRO-tf-transformations # ROS2中C语言用来处理TF坐标变换的工具包。sudo pip3 install transforms3d #旋转的转换库就是将旋转的欧拉角转换为四元素。3实现①新建工作空间及功能包ros2 pkg create --build-type ament_python --dependencies rclpy geometry_msgs tf_transformations --license Apache-2.0 demo_python_tf②编写③添加可执行文件④运行4静态发布注意事项虽然静态发布我们只发布了一次但因为他的QOS的策略会一直发布。也就是说发布TF话题和其他话题不太一样。使用命令查看详细信息ros2 topic info /tf_static -vDurability持续性TRANSIENT_LOCAL——保留最新的数据每发布一次会保留一条保留的时间是无限。Liveliness lease duration: Infinite——保留时间无限出现新的订阅者的时候就会将数据拿出来给新的订阅者因为一直保留的这就是为什么已经发布过了订阅者还能获取到信息的原因。5输出两者的关系ros2 run tf2_ros tf2_echo base_link camera_link3、动态TF发布1原理不停发布 /tf 话题2实现3运行其实就是将动态发布放入定时器里只是用的对象不一样静态发布是用StaticTransformBroadcaster动态发布使用TransformBroadcaster。4、通过python查询TF关系1原理订阅话题/tf /tf_static 收集所有坐标系关系进行计算。2实现注意记得同时启动static_tf和tf_broadcaster三、C下TF使用1、发布静态TF1需求2原理发布 /tf_static 话题StaticTransformBroadcaster静态变换发布器。this当前节点指针为什么传this因为我们要发布/tf_static 话题传入this后在StaticTransformBroadcaster里面创建一个发布者当调用StaticTransformBroadcaster去sendTransform()的时候会去调用发布者把我们的坐标关系父、子、坐标的关系给发布出去。3实现①创建功能包ros2 pkg create demo_cpp_tf --build-type ament_cmake --dependencies rclcpp tf2_ros geometry_msgs tf2_geometry_msgs --license Apache-2.0②编写详细步骤可以看代码中的注释相关函数介绍和python版本差不多可以看python版本的介绍就在上面。③运行记得在CMakeLists.txt里添加相关介绍可以回看鱼香ros2七功能包组织C节点-CSDN博客和鱼香ros2十C编程-CSDN博客④查看话题查看话题列表ros2 topic list查看某个话题详细信息ros2 topic echo ***2、发布动态TF1原理不停发布 /tf 话题机器人在地图中的位置因为随着机器人的运动他在地图中的相对位置会随时间的改变而改变。需要用到的广播者是TransformBroadcaster2实现唯一和静态TF不同的是我们需要定时器不断地发布动态的TF而且我们使用的广播者是TransformBroadcaster不是StaticTransformBroadcaster。3运行记得在CMakeLists.txt里添加因为我们的代码里面没有输出所以看不到任何东西可以使用topic相关指令。4查看查看话 题列表ros2 topic list查看某个话题详细信息ros2 topic echo ***3、查询TF关系1原理订阅话题/tf /tf_static 收集所有坐标系关系进行计算。订阅话题/tf动态TF /tf_static静态TF并收集所有的坐标关系然后把收集到的坐标关系放到Buffer里之后我们可以利用buffer里面的坐标关系向它进行查询并告知它我查询哪个时间的以及最长的超时时间。查询到了就会返回我们的坐标关系查询不到就会报出一个异常2实现3运行四、其他工具1、rqt1GUI工具rqtrqt是一个框架这个框架可以编写新的工具。2使用rqt安装插件以/tf来举例①安装插件$ROS_DISTRO——使用环境变量代替ros的版本号这样使用其他版本的ros也可以同样可以使用这个命令sudo apt install ros-$ROS_DISTRO-rqt-tf-tree -y②更新配置文件因为rqt会生成配置文件在/.config/ros.org/目录下你只有把这个配置文件删掉他才会重新的去扫描系统中所有的rqt插件这样你刚刚安装的tf-tree才会被加载rm -rf ~/.config/ros.org/rqt_gui.ini③重新打开rqttf-tree 插件有了实时查看TF数据。2、Rviz1Rviz在学习TF时虽然可以通过tf2_tools或rqt-tf-tree查看TF数据间的关系但并能直观的看到他们在空间中的关系而Rviz不仅可以帮助我们实现坐标变换的可视化还可以实现机器人传感器数据、3D模型、点云、激光雷达数据这些数据的可视化与交互。2使用命令rviz2如果是使用WSL打开发现框框字体很小可以先关闭然后使用命令export QT_SCALE_FACTOR2.0修改下字体大小再rviz2重新启动Rviz注意字体的更改字针对当前的终端。Display用于显示数据使用左下角的add可以添加可视化视图。WSL有图形渲染的问题打开Rviz前先输入命令export LIBGL_ALWAYS_SOFTWARE1然后输入 rviz2动态/tf也启动就可以在Rviz上看到了。3、ros2 bag1ros2 bag数据记录工具ros2 bag机器人开发过程中很多问题往往出现在数据上数据一般是通过话题传递的如果能记录话题发布的数据并保存下来我们需要的时候就重新播放数据然后进行数据的分析和多次试验就好了。ros2 bag就是提供这一功能的工具。我们以对小海龟的轨迹进行录制和重放。2使用记录ros2 bag record /turtle1/cmd_vel①启动小海龟ros2 run turtlesim turtlesim_node查看下当前的话题ros2 topic list使用键盘控制节点ros2 run turtlesim turtle_teleop_key使用该命令后我们可以使用键盘来控制小海龟其实就是发布了一个话题/turtle1/cmd_vel我们只需要把这个话题的内容记录下来我们再重播就可以实现小海龟轨迹的复刻。②记录ros2 bag record /turtle1/cmd_vel这样就可以记录/turtle1/cmd_vel这个话题的数据了。回到键盘控制终端控制键盘移动小海龟。Press SPACE for pausing/resuming记录的时候可以按空格暂停和恢复。Opened database rosbag2_2026_10_22-15_44_43/rosbag2_2026_10_22-15_44_43_0.db3 for READ_WRITE.打开数据文件记录当前数据。Listening for topics...监听话题。All requested topics are subscribed. Stopping discovery...所有需要监听的话题已经开始订阅了停止发现新的话题了。CtrlC后会出现以下几行。Writing remaining messages from cache to the bag. It may take a while需要时间写入包里。Event publisher thread: Exiting退出发布的线程。Recording stopped记录停止。③使用关闭小海龟和键盘控制节点。重新启动小海龟模拟器 ros2 run turtlesim turtlesim_node使用 ls ros* 可以看到我们刚刚备份的文件.db3ros2记录话题数据默认使用的格式。metadata.yaml详细记录的内容。使用 ros2 bag play rosbag2_2026_10_22-15_44_43就可以看到小海龟按刚刚记录的轨迹运行了。