news 2026/9/4 5:34:59

Ros2 学习九:Rviz2 可视化urdf

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ros2 学习九:Rviz2 可视化urdf

目录

1 urdf

1.1 创建urdf文件

1.2 配置setup.py文件

2 urdf模型发布

2.1 手动状态发布

2.1.1 安装 joint_state_publisher

2.1.2 状态发布

​编辑

2.2 基于手动命令封装launch文件启动

2.2.1 创建文件

2.2.2 添加到setup.py

2.2.3 编辑launch文件

3 Rviz2

3.1 rviz2 的坐标系

3.2 robotModel组件

4 rqt展示

4.1 流程

4.2 话题格式


1 urdf

urdf采用xml的格式进行编写,可使用ai辅助创建一个urdf的demo,看着学。

1.1 创建urdf文件

1)在包目录下创建urdf文件夹,用于管理urdf文件

2)在urdf文件夹下创建urdf文件,以.urdf后缀名结尾

3)编写urdf文件

我这里是python的包

urdf demo:用大模型生成的一个具有一个万向轮,两个动力轮的小车

<?xml version="1.0"?> <robot name="my_first_robot"> <!-- ================= 材质定义 ================= --> <material name="blue"> <color rgba="0 0 0.8 1"/> </material> <material name="white"> <color rgba="1 1 1 1"/> </material> <material name="black"> <color rgba="0 0 0 1"/> </material> <!-- ================= 链接 (Links) ================= --> <!-- 1. 底盘 (Base Link) --> <link name="base_link"> <visual> <geometry> <box size="0.6 0.4 0.2"/> <!-- 长0.6m, 宽0.4m, 高0.2m --> </geometry> <origin xyz="0 0 0.1" rpy="0 0 0"/> <!-- 几何中心向上偏移,使坐标原点在底部中心 --> <material name="blue"/> </visual> <collision> <geometry> <box size="0.6 0.4 0.2"/> </geometry> <origin xyz="0 0 0.1"/> </collision> <!-- <inertial> <mass value="5.0"/> <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/> </inertial> --> </link> <!-- 2. 左轮 (Left Wheel) --> <link name="left_wheel"> <visual> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> <origin xyz="0 0 0" rpy="1.5707 0 0"/> <!-- 旋转90度使圆柱体变为轮子形状 --> <material name="black"/> </visual> <collision> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> <origin xyz="0 0 0" rpy="1.5707 0 0"/> </collision> <inertial> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01"/> </inertial> </link> <!-- 3. 右轮 (Right Wheel) --> <link name="right_wheel"> <visual> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> <origin xyz="0 0 0" rpy="1.5707 0 0"/> <material name="black"/> </visual> <collision> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> <origin xyz="0 0 0" rpy="1.5707 0 0"/> </collision> <inertial> <mass value="1.0"/> <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.01" iyz="0.0" izz="0.01"/> </inertial> </link> <!-- 4. 万向轮 (Caster Wheel) --> <link name="caster_wheel"> <visual> <geometry> <sphere radius="0.05"/> </geometry> <material name="white"/> </visual> <collision> <geometry> <sphere radius="0.05"/> </geometry> </collision> <inertial> <mass value="0.5"/> <inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/> </inertial> </link> <!-- ================= 关节 (Joints) ================= --> <!-- 连接左轮 --> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel"/> <origin xyz="-0.2 0.225 0.05" rpy="0 0 0"/> <!-- 位置:后方左侧 --> <axis xyz="0 1 0"/> <!-- 绕Y轴旋转 --> </joint> <!-- 连接右轮 --> <joint name="right_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="right_wheel"/> <origin xyz="-0.2 -0.225 0.05" rpy="0 0 0"/> <!-- 位置:后方右侧 --> <axis xyz="0 1 0"/> </joint> <!-- 连接万向轮 --> <joint name="caster_joint" type="fixed"> <parent link="base_link"/> <child link="caster_wheel"/> <origin xyz="0.25 0 0.0" rpy="0 0 0"/> <!-- 位置:前方中心 --> </joint> </robot>

1.2 配置setup.py文件

python的包和cpp的包不同,python的包设置setup.py,cpp的包设置cmake文件

python版本:新增一条拷贝命令

data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), # 将 urdf 文件夹安装到 share 目录下 ('share/' + package_name + '/urdf', glob('urdf/*')), ],

编译完成后,在install目录下具有urdf文件

2 urdf模型发布

2.1 手动状态发布

使用robot_state_publisher和joint_state_publisher_gui/joint_state_publisher进行状态发布

默认robot_state_publisher已经安装,joint_state_publisher没有安装。

2.1.1 安装 joint_state_publisher

安装joint_state_publisher,安装gui版本时,robot_state_publish会一起被安装。

joint_state_publisher_gui:具有图形化,可进行手动调整关节角度

joint_state_publisher:不具有图形化

#ubuntu apt install ros-<distro>-joint-state-publisher-gui # apt install ros-humble-joint-state-publisher-gui #conda环境 conda install ros-humble-joint-state-publisher-gui

2.1.2 状态发布

# 发布机器人模型,通过-p设置cat读取的urdf robot_description参数 ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat ./install/pkg_image/share/pkg_image/urdf/demo_urdf.urdf)" # 发布关节运动状态,不发布的话,机器人的运动状态无法监听 ros2 run joint_state_publisher_gui joint_state_publisher_gui

2.2 基于手动命令封装launch文件启动

2.2.1 创建文件

2.2.2 添加到setup.py

data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), # 将 urdf 文件夹安装到 share 目录下 ('share/' + package_name + '/urdf', glob('urdf/*')), ('share/' + package_name + '/launch', glob('launch/*')), ('share/' + package_name + '/rviz2', glob('rviz2/*')), ],

2.2.3 编辑launch文件

from launch import LaunchDescription from launch_ros.actions import Node as LaunchNode #命令替换 from launch.substitutions import Command #python索引,获取包的share目录 from ament_index_python.packages import get_package_share_directory def generate_launch_description(): # 1 robot_state_publisher ## 读取urdf文件 robot_description = Command("cat " + get_package_share_directory("pkg_image") + "/urdf/demo_urdf.urdf") robot_state_publisher = LaunchNode( package='robot_state_publisher', executable='robot_state_publisher', name='robot_state_publisher', parameters=[{ 'robot_description': robot_description, }], ) # 2 joint_state_publisher_gui joint_state_publisher = LaunchNode( package='joint_state_publisher_gui', executable='joint_state_publisher_gui', name='joint_state_publisher_gui', ) # 3 rviz2 文件通过rviz2另存 rviz2_config = get_package_share_directory("pkg_image") + "/rviz2/demo.rviz" rviz2 = LaunchNode( package='rviz2', executable='rviz2', name='rviz2', arguments=['-d', rviz2_config], ) return LaunchDescription([robot_state_publisher,joint_state_publisher,rviz2])

3 Rviz2

3.1 rviz2 的坐标系

采用右手坐标系

x:正向指向前 红:前后

y:正向指向左 绿:左右

z:正向指向上 蓝:上下

3.2 robotModel组件

只有robot_state_publisher和joint_state_publisher/joint_state_publisher_gui进行了发布才可以。

如果joint_state_publisher不进行发布,无法获取动态数据,左右轮由于在urdf中设置格式为可持续旋转,因此这个两个关节会解析报错。

4 rqt展示

4.1 流程

1 robot_state_publisher 发布/robot_description话题

2 joint_state_publisher订阅/robot_description,并获取关节信息。可通过驱动或gui设置关节状态

3 joint_state_publisher 发布joint_states信息

4 robot_state_publisher 计算实时/tf信息

5 robot_state_publisher 发布实时/tf信息

6 rviz2 robotModel:订阅/robot_description显示静态模型信息,订阅/tf显示动态运动信息。

4.2 话题格式

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

博睿BR-VP2000A拼接控制器软件全解析:从部署到调试实战指南

简介&#xff1a;本资源为博睿BR-VP2000A系列拼接控制器配套专用软件及完整使用文档&#xff0c;面向安防监控中心、指挥调度室、展览展示等场景下的系统集成工程师、运维技术人员及大屏显示项目实施人员&#xff0c;解决多屏拼接配置复杂、信号源管理低效、画面不同步等实际部…

作者头像 李华
网站建设 2026/9/4 5:33:45

JDK 8 到 24 全版本深度盘点:每个版本的功能、优点、坑与升级建议

JDK 8 到 24 全版本深度盘点&#xff1a;每个版本的功能、优点、坑与升级建议java -version 打出来的那个数字&#xff0c;决定了你能用什么语法、你的 GC 有多快、你的服务能扛多少并发。但绝大多数 Java 程序员的状态是&#xff1a;用着 JDK 8&#xff0c;听说 17 不错&#…

作者头像 李华
网站建设 2026/9/4 5:33:41

解决ArcGIS不可以计算面积和面积选项禁用

如何使用ArcGIS计算面积 直接建立的Shapefile在未定义空间参考的情况下&#xff0c;绘制完图形是无法直接计算面积的&#xff08;数据没有坐标系&#xff0c;显示Unknow)。解决方法&#xff1a;在ArcToolbox中&#xff0c;选择【数据管理工具】&#xff0c;找到【投影和变换】下…

作者头像 李华
网站建设 2026/9/4 5:29:39

C#开发USB HID上位机:避开UART思维陷阱的工程实践

简介&#xff1a;本资源是一套基于C#开发的USB HID通信上位机完整源码工程&#xff0c;面向嵌入式软硬件开发者、工控系统工程师及C#进阶学习者&#xff0c;解决HID类设备&#xff08;如自定义传感器、游戏手柄、工业采集模块&#xff09;与PC端稳定双向通讯的实践难题。压缩包…

作者头像 李华
网站建设 2026/9/4 5:29:05

本地离线知识库部署记:从 GPT4All 翻车到 Ollama + AnythingLLM

本地离线知识库部署记&#xff1a;从 GPT4All 翻车到 Ollama AnythingLLM 目标&#xff1a;在本地搭一个可以完全脱网运行的知识库。 硬件&#xff1a;32GB 内存、16GB 显存的 RTX 5060 Ti、1TB SSD。 写在前面&#xff1a;一段失败经历&#xff08;可跳过&#xff09; 第一次…

作者头像 李华
网站建设 2026/9/4 5:27:58

AI辅助单体仓库规划:Claude Code在工程架构重构中的实战指南

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

作者头像 李华