资讯动态

ROS2学习笔记五

发布时间:2026/8/14 14:50:13 来源:尧图企业网站定制
ROS2 工程实践指南URDF 打包与 TF 发布目标将 URDF/Xacro 模型打包为标准功能包实现一键启动 TF 发布与 RViz 可视化。适用ROS2 Jazzy / Humble / Iron前置已完成 URDF/Xacro 建模。目录核心原理2分钟理解手动测试从终端发布 TFsRViz 配置与保存创建标准功能包安装资源文件编写启动文件编译运行与验证常见错误速查附录核心知识点速查一、核心原理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会自动解析为jazzy或humble无需手动替换。2.3 启动 robot_state_publisher终端 1ros2 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_link2.4 启动 joint_state_publisher终端 2启动关节状态发布器带 GUI 滑块ros2 run joint_state_publisher_gui joint_state_publisher_gui将弹出一个滑动条窗口拖动光标即可向/joint_states发布数值robot_state_publisher接收后会实时更新/tf2.5 验证 TF 发布终端 3# 查看 TF 数据ros2 topicecho/tf--once|grepframe_id# 查看 TF 树生成 frames.pdfros2 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启动 RVizros2 run rviz2 rviz23.1 必做配置步骤操作位置设置值1Global Options → Fixed Frame输入base_link或 URDF 根坐标系按 Enter2左下角Add → RobotModel确认 Topic 为/robot_description3Add → TF显示坐标系箭头4RobotModel → Alpha可改为0.8方便透过模型查看 TF此时应看到机器人模型和 TF 树。拖动 Joint GUI 滑块时模型关节应联动。3.2 保存配置为避免每次重复设置RViz 菜单栏 →File → Save Config As保存到~/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配置环境变量修改~/.bashrcsource/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 / RViz5.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.txtcmake_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确保包含packageformat3namemy_robot_description/nameversion0.0.0/versiondescriptionRobot model and visualization/descriptionbuildtool_dependament_cmake/buildtool_dependdependrobot_state_publisher/dependdependjoint_state_publisher_gui/dependdependrviz2/dependdependxacro/dependexportbuild_typeament_cmake/build_type/export/package六、编写启动文件在launch/目录下创建启动文件。提供XML推荐和Python两种版本。6.1 XML 启动文件推荐创建launch/display.launch.xmllaunch!-- 定义路径变量避免硬编码 --letnameurdf_pathvalue$(find-pkg-share my_robot_description)/urdf/robot.xacro/letnamerviz_config_pathvalue$(find-pkg-share my_robot_description)/rviz/urdf_config.rviz/!-- 1. 发布 TF --nodepkgrobot_state_publisherexecrobot_state_publisherparamnamerobot_descriptionvalue$(command xacro $(var urdf_path))//node!-- 2. 发布关节状态GUI 滑块 --nodepkgjoint_state_publisher_guiexecjoint_state_publisher_gui/!-- 3. 启动 RViz加载保存的配置 --nodepkgrviz2execrviz2args-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.pyimportosfromament_index_python.packagesimportget_package_share_pathfromlaunchimportLaunchDescriptionfromlaunch_ros.parameter_descriptionsimportParameterValuefromlaunch_ros.actionsimportNodefromlaunch.substitutionsimportCommanddefgenerate_launch_description():urdf_pathos.path.join(get_package_share_path(my_robot_description),urdf,robot.xacro)rviz_pathos.path.join(get_package_share_path(my_robot_description),rviz,urdf_config.rviz)robot_descParameterValue(Command([xacro ,urdf_path]),value_typestr)returnLaunchDescription([Node(packagerobot_state_publisher,executablerobot_state_publisher,parameters[{robot_description:robot_desc}]),Node(packagejoint_state_publisher_gui,executablejoint_state_publisher_gui),Node(packagerviz2,executablerviz2,arguments[-d,rviz_path])])XML vs Python 对比维度XML LaunchPython Launch代码量约 15 行简洁直观约 40 行较冗长路径处理find-pkg-shareletget_package_share_pathos.path.joinXacro 解析$(command xacro ...)Command([xacro , ...])ParameterValue适用场景静态节点启动推荐需逻辑判断、循环、动态参数时学习曲线低类似 HTML高需熟悉 Python API建议对于纯可视化/TF 发布场景优先使用 XML代码更简洁且不易出错。七、编译运行与验证7.1 编译安装cd~/my_robot_ws colcon build --packages-select my_robot_descriptionsourceinstall/setup.bash7.2 一键启动# XML 版本推荐ros2 launch my_robot_description display.launch.xml# Python 版本ros2 launch my_robot_description display.launch.py7.3 验证清单启动后按此清单逐项确认检查项命令通过标准节点运行ros2 node list看到robot_state_publisher、joint_state_publisher、rviz2TF 发布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/userPackage joint_state_publisher_gui not found未安装sudo apt install ros-$ROS_DISTRO-joint-state-publisher-guiFrame [map] does not existRViz Fixed Frame 错误改为 URDF 根坐标系名如base_linkFailed 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 nameMY_PI value3.14159/九、附录核心知识点速查问题答案谁负责发布 TFrobot_state_publisher节点它需要哪些输入①robot_description参数URDF②/joint_states话题没有真机时如何模拟关节启动joint_state_publisher_gui如何在 launch 中解析 XacroXML:$(command xacro $(var path))Python:Command([xacro , path])资源文件如何被其他包找到通过CMakeLists.txt的install(DIRECTORY ...)安装到share/目录RViz 配置如何复用保存为.rviz文件启动时通过-d参数加载核心记住三点robot_state_publisher发布 TF、需要 URDF joint_states、用 Launch 文件一键启动。该包my_robot_description是后续Gazebo 仿真、Navigation2 导航、MoveIt2 运动规划的基础所有功能包都将依赖此处定义的机器人模型与 TF 结构。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价