news 2026/8/14 14:50:05

ROS2学习笔记五

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ROS2学习笔记五

ROS2 工程实践指南:URDF 打包与 TF 发布

目标:将 URDF/Xacro 模型打包为标准功能包,实现一键启动 TF 发布与 RViz 可视化。
适用:ROS2 Jazzy / Humble / Iron
前置:已完成 URDF/Xacro 建模。


目录

  1. 核心原理(2分钟理解)
  2. 手动测试:从终端发布 TFs
  3. RViz 配置与保存
  4. 创建标准功能包
  5. 安装资源文件
  6. 编写启动文件
  7. 编译运行与验证
  8. 常见错误速查
  9. 附录:核心知识点速查

一、核心原理(2分钟理解)

发布 TF 只需要两个东西

组件作用来源
robot_state_publisher解析 URDF,发布/tf/tf_static系统自带
/joint_states告诉机器人关节当前角度/速度真实编码器 / Gazebo /joint_state_publisher_gui

数据流

URDF 文件 → robot_state_publisher → /tf (坐标变换树) ↑ /joint_states (关节实时状态)

关键点robot_state_publisher需要robot_description参数(URDF 字符串),不是文件路径。URDF 只定义了关节的静态关系(父子连接、偏移量),而/joint_states提供了关节的动态数值(如轮子转了多少度)。两者结合才能生成完整的 TF 树。


二、手动测试:从终端发布 TFs

在编写启动文件前,建议先通过终端手动启动各节点,验证链路正确。

2.1 确认 URDF 文件存在

ls~/ros2_ws/src/my_robot_description/urdf/

期望输出robot.xacro(或你的主 Xacro 文件名)
如果文件名不同,后续命令中的robot.xacro需替换为实际文件名。

2.2 安装必要工具

sudoaptupdatesudoaptinstall-y\ros-$ROS_DISTRO-robot-state-publisher\ros-$ROS_DISTRO-joint-state-publisher-gui\ros-$ROS_DISTRO-rviz2\ros-$ROS_DISTRO-tf2-tools

$ROS_DISTRO会自动解析为jazzyhumble,无需手动替换。

2.3 启动 robot_state_publisher

终端 1

ros2 run robot_state_publisher robot_state_publisher\--ros-args-probot_description:="$(xacro ~/ros2_ws/src/my_robot_description/urdf/robot.xacro)"

成功标志

[INFO] [robot_state_publisher]: Robot initialized got segment base_link got segment left_wheel_link

2.4 启动 joint_state_publisher

终端 2:启动关节状态发布器(带 GUI 滑块)

ros2 run joint_state_publisher_gui joint_state_publisher_gui
  • 将弹出一个滑动条窗口
  • 拖动光标即可向/joint_states发布数值
  • robot_state_publisher接收后会实时更新/tf

2.5 验证 TF 发布

终端 3

# 查看 TF 数据ros2 topicecho/tf--once|grepframe_id# 查看 TF 树(生成 frames.pdf)ros2 run tf2_tools view_frames# 查看节点图rqt_graph

期望输出(示例):

frame_id: base_link child_frame_id: left_wheel frame_id: base_link child_frame_id: right_wheel

三、RViz 配置与保存

终端 4:启动 RViz

ros2 run rviz2 rviz2

3.1 必做配置

步骤操作位置设置值
1Global Options → Fixed Frame输入base_link(或 URDF 根坐标系,按 Enter)
2左下角Add → RobotModel确认 Topic 为/robot_description
3Add → TF显示坐标系箭头
4RobotModel → Alpha可改为0.8,方便透过模型查看 TF

此时应看到机器人模型和 TF 树。拖动 Joint GUI 滑块时,模型关节应联动。

3.2 保存配置

为避免每次重复设置:

  1. RViz 菜单栏 →File → Save Config As
  2. 保存到~/ros2_ws/src/my_robot_description/rviz/urdf_config.rviz

后续启动时直接加载:

ros2 run rviz2 rviz2-d~/ros2_ws/src/my_robot_description/rviz/urdf_config.rviz

四、创建标准功能包

4.1 新建工作空间(如需要)

mkdir-p~/my_robot_ws/srccd~/my_robot_ws colcon build

配置环境变量(修改~/.bashrc):

source/opt/ros/$ROS_DISTRO/setup.bashsource~/my_robot_ws/install/setup.bash

修改后关闭所有终端,重新打开以使配置生效。

4.2 创建my_robot_description

cd~/my_robot_ws/src ros2 pkg create my_robot_description --build-type ament_cmake

清理不必要的目录(本包仅用于存放资源,不编译节点):

cdmy_robot_descriptionrm-rfinclude/ src/

4.3 建立标准目录结构

mkdir-plaunch rviz urdf meshes

最终结构:

my_robot_description/ ├── CMakeLists.txt ├── package.xml ├── launch/ │ └── display.launch.xml # 一键启动文件 ├── rviz/ │ └── urdf_config.rviz # RViz 配置 ├── urdf/ │ ├── robot.xacro # 主入口 Xacro │ ├── common_properties.xacro # 颜色/材料宏 │ └── mobile_base.xacro # 底盘/轮子定义 └── meshes/ # 可选:.stl / .dae 文件

五、安装资源文件(URDF / Meshes / RViz)

5.1 放置 URDF/Xacro 文件

将所有 Xacro 文件移入urdf/目录。

关键修改:在主 Xacro 文件中,使用find关键字确保路径健壮:

<xacro:includefilename="$(find my_robot_description)/urdf/common_properties.xacro"/><xacro:includefilename="$(find my_robot_description)/urdf/mobile_base.xacro"/>

5.2 配置 CMakeLists.txt

编辑CMakeLists.txt

cmake_minimum_required(VERSION 3.8) project(my_robot_description) find_package(ament_cmake REQUIRED) install( DIRECTORY urdf meshes rviz launch DESTINATION share/${PROJECT_NAME}/ ) ament_package()

关键点DIRECTORY后列出所有资源文件夹,用空格分隔。构建时,colcon会将这些文件夹复制到install/my_robot_description/share/my_robot_description/下,供其他包通过find-pkg-share查找。

5.3 配置 package.xml

编辑package.xml,确保包含:

<packageformat="3"><name>my_robot_description</name><version>0.0.0</version><description>Robot model and visualization</description><buildtool_depend>ament_cmake</buildtool_depend><depend>robot_state_publisher</depend><depend>joint_state_publisher_gui</depend><depend>rviz2</depend><depend>xacro</depend><export><build_type>ament_cmake</build_type></export></package>

六、编写启动文件

launch/目录下创建启动文件。提供XML(推荐)和Python两种版本。

6.1 XML 启动文件(推荐)

创建launch/display.launch.xml

<launch><!-- 定义路径变量,避免硬编码 --><letname="urdf_path"value="$(find-pkg-share my_robot_description)/urdf/robot.xacro"/><letname="rviz_config_path"value="$(find-pkg-share my_robot_description)/rviz/urdf_config.rviz"/><!-- 1. 发布 TF --><nodepkg="robot_state_publisher"exec="robot_state_publisher"><paramname="robot_description"value="$(command 'xacro $(var urdf_path)')"/></node><!-- 2. 发布关节状态(GUI 滑块) --><nodepkg="joint_state_publisher_gui"exec="joint_state_publisher_gui"/><!-- 3. 启动 RViz(加载保存的配置) --><nodepkg="rviz2"exec="rviz2"args="-d $(var rviz_config_path)"/></launch>

语法要点

语法含义示例
$(find-pkg-share <pkg>)查找功能包的共享目录用于定位 URDF/RViz 文件
$(var <name>)引用 launch 文件内定义的变量$(var urdf_path)
$(command '...')执行 shell 命令并捕获输出用于调用xacro解析
<let name="..." value="..."/>定义局部常量避免路径硬编码

6.2 Python 启动文件(如需逻辑控制时使用)

创建launch/display.launch.py

importosfromament_index_python.packagesimportget_package_share_pathfromlaunchimportLaunchDescriptionfromlaunch_ros.parameter_descriptionsimportParameterValuefromlaunch_ros.actionsimportNodefromlaunch.substitutionsimportCommanddefgenerate_launch_description():urdf_path=os.path.join(get_package_share_path('my_robot_description'),'urdf','robot.xacro')rviz_path=os.path.join(get_package_share_path('my_robot_description'),'rviz','urdf_config.rviz')robot_desc=ParameterValue(Command(['xacro ',urdf_path]),value_type=str)returnLaunchDescription([Node(package='robot_state_publisher',executable='robot_state_publisher',parameters=[{'robot_description':robot_desc}]),Node(package='joint_state_publisher_gui',executable='joint_state_publisher_gui'),Node(package='rviz2',executable='rviz2',arguments=['-d',rviz_path])])

XML vs Python 对比

维度XML LaunchPython Launch
代码量约 15 行,简洁直观约 40 行,较冗长
路径处理find-pkg-share+letget_package_share_path+os.path.join
Xacro 解析$(command 'xacro ...')Command(['xacro ', ...])+ParameterValue
适用场景静态节点启动(推荐)需逻辑判断、循环、动态参数时
学习曲线低,类似 HTML高,需熟悉 Python API

建议:对于纯可视化/TF 发布场景,优先使用 XML,代码更简洁且不易出错。


七、编译运行与验证

7.1 编译安装

cd~/my_robot_ws colcon build --packages-select my_robot_descriptionsourceinstall/setup.bash

7.2 一键启动

# XML 版本(推荐)ros2 launch my_robot_description display.launch.xml# Python 版本ros2 launch my_robot_description display.launch.py

7.3 验证清单

启动后按此清单逐项确认:

检查项命令通过标准
节点运行ros2 node list看到robot_state_publisherjoint_state_publisherrviz2
TF 发布ros2 topic echo /tf --once有坐标变换数据输出
TF 树完整ros2 run tf2_tools view_frames生成frames.pdf,包含所有连杆
RViz 状态RViz 界面Global Status 显示Ok
模型可见RViz 界面能看到底盘、轮子及坐标轴,拖动滑块时关节联动

八、常见错误速查

错误现象原因解决
bash: user: No such file or directory命令中<user>未替换改为实际用户名,或用~代替/home/<user>
Package 'joint_state_publisher_gui' not found未安装sudo apt install ros-$ROS_DISTRO-joint-state-publisher-gui
Frame [map] does not existRViz Fixed Frame 错误改为 URDF 根坐标系名(如base_link
Failed to parse global argumentsrobot_description参数为空检查xacro命令是否成功,先单独运行xacro file.xacro测试
No such file or directory: ...my_robot.urdf.xacro文件名不匹配ls确认实际文件名,修改命令
xacro.XacroException: name 'M_PI' is not definedXacro 内置常量冲突自定义<xacro:property name="MY_PI" value="3.14159"/>

九、附录:核心知识点速查

问题答案
谁负责发布 TF?robot_state_publisher节点
它需要哪些输入?robot_description参数(URDF);②/joint_states话题
没有真机时如何模拟关节?启动joint_state_publisher_gui
如何在 launch 中解析 Xacro?XML:$(command 'xacro $(var path)');Python:Command(['xacro ', path])
资源文件如何被其他包找到?通过CMakeLists.txtinstall(DIRECTORY ...)安装到share/目录
RViz 配置如何复用?保存为.rviz文件,启动时通过-d参数加载

核心记住三点robot_state_publisher发布 TF、需要 URDF + joint_states、用 Launch 文件一键启动。
该包(my_robot_description)是后续Gazebo 仿真、Navigation2 导航、MoveIt2 运动规划的基础,所有功能包都将依赖此处定义的机器人模型与 TF 结构。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 14:46:06

PoeCharm汉化版快速上手:把流放之路角色构建变成全中文体验

PoeCharm汉化版快速上手&#xff1a;把流放之路角色构建变成全中文体验 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 很多国服《流放之路》玩家都栽在同一个坎上&#xff1a;Path of Building 计…

作者头像 李华
网站建设 2026/8/14 14:45:05

BiliTools 快速上手:3 分钟搞定 B 站视频、音频与弹幕的本地下载

BiliTools 快速上手&#xff1a;3 分钟搞定 B 站视频、音频与弹幕的本地下载 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 早高峰的地铁车厢里&#xff0c;你刚点开追到一半的番剧&#xff0c;进度条…

作者头像 李华
网站建设 2026/8/14 14:43:42

三步备份QQ空间历史说说:GetQzonehistory一键导出完整攻略

三步备份QQ空间历史说说&#xff1a;GetQzonehistory一键导出完整攻略 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你有没有想过&#xff0c;那些写满青春细节的QQ空间说说&#xff…

作者头像 李华
网站建设 2026/8/14 14:42:28

IINA播放器快速上手指南:从安装到进阶,让Mac彻底告别播放难题

IINA播放器快速上手指南&#xff1a;从安装到进阶&#xff0c;让Mac彻底告别播放难题 【免费下载链接】iina The modern video player for macOS. 项目地址: https://gitcode.com/gh_mirrors/iin/iina 先讲个很多人都经历过的场景&#xff1a;从网盘下载的MKV双击打不开…

作者头像 李华
网站建设 2026/8/14 14:42:08

声网母公司披露2026 Q2财报:连续7个季度GAAP盈利

8月14日&#xff0c;声网母公司 Agora, Inc.&#xff08;NASDAQ&#xff1a;API&#xff09;公布2026年第二季度财报。财报显示&#xff0c;第二季度 Agora, Inc. 总营收4042万美元&#xff0c;同比增长18%&#xff0c;超过指引区间高端&#xff1b;公司指引第三季度营收区间为…

作者头像 李华