ROS2学习笔记五
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 结构。

相关新闻

小白程序员轻松入门大模型,AI Agent学习路线全解析

小白程序员轻松入门大模型,AI Agent学习路线全解析

本文为想要进入AI Agent领域的程序员提供了一份完整的学习路线图。文章首先建议选择合适的后端语言,然后深入探讨了提示词工程和大语言模型的基础知识,接着介绍了LangChain和LangGraph两大核心框架,最后阐述了RAG、Skill技能包封装和MCP模型上…

2026/10/26 1:51:16 阅读更多 →
owasys命令

owasys命令

一、压缩文件处理 1.解压到当前文件夹 tar -xzf DrillJumboControl-V3.0.tar.gz直接解压到当前目录 unzip "DrillJumboControl-V3.0.zip"2…创建压缩文件 rootA177QK:/data/project/vscode# tar -czf DrillJumboControl-V3.0.tar.gz DrillJumboControl-V3.0/ 3.编译并…

2026/10/25 16:49:14 阅读更多 →
052、BLC的“温度漂移陷阱“——sensor温度从25°C升到60°C时黑电平偏移0.5LSB如何影响暗部信噪比及动态补偿策略

052、BLC的“温度漂移陷阱“——sensor温度从25°C升到60°C时黑电平偏移0.5LSB如何影响暗部信噪比及动态补偿策略

052、BLC的"温度漂移陷阱"——sensor温度从25C升到60C时黑电平偏移0.5LSB如何影响暗部信噪比及动态补偿策略 去年夏天在产线上调一款车规级前视摄像头,夜测暗房温度压到28C,图像干净得能数星星。结果同一批模组装车,下午三点暴晒两小时,客户反馈暗部出现一层灰蒙…

2026/10/24 1:22:25 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →