ROS2 Rviz同时显示多个独立URDF模型教程:双机械臂与底盘场景实例
2026-03-27 来源:EEWorld 论坛
在机器人开发中,经常需要同时显示多个独立的URDF模型,例如双机械臂、机械臂加底盘或机械臂加双足等场景。本文以ROS2为例,通过球体和方块两个URDF模型,详细介绍如何在Rviz中配置并显示多个独立URDF。以下是完整实现步骤。
一、创建ROS2包
首先,新建一个ROS2包,依赖rclcpp、robot_state_publisher和tf2_ros:
ros2 pkg create --build-type ament_cmake multi_urdf_display --dependencies rclcpp robot_state_publisher tf2_ros二、编写URDF文件
在包内创建urdf文件夹,并添加两个URDF文件。
cube.urdf:定义一个蓝色立方体。
<?xml version="1.0"?>
<robot name="cube">
<link name="base_link">
<visual>
<geometry>
<box size="1 1 1"/>
</geometry>
<material name="blue">
<color rgba="0 0 1 1"/>
</material>
</visual>
<collision>
<geometry>
<box size="1 1 1"/>
</geometry>
</collision>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="1" ixy="0" ixz="0" iyy="1" iyz="0" izz="1"/>
</inertial>
</link>
</robot>sphere.urdf:定义一个红色球体。
<?xml version="1.0"?>
<robot name="sphere">
<link name="base_link">
<visual>
<geometry>
<sphere radius="0.5"/>
</geometry>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
<collision>
<geometry>
<sphere radius="0.5"/>
</geometry>
</collision>
<inertial>
<origin xyz="0 0 0" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/>
</inertial>
</link>
</robot>三、创建Launch文件
在launch文件夹中创建display_multi_urdf.launch.py,用于启动机器人状态发布器、静态变换发布器和Rviz。
import os
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
def load_urdf(pkg_name, urdf_file):
pkg_path = get_package_share_directory(pkg_name)
urdf_path = os.path.join(pkg_path, 'urdf', urdf_file)
with open(urdf_path, 'r') as f:
return f.read()
def generate_launch_description():
robot_desc1 = load_urdf('multi_urdf_display', 'cube.urdf')
robot_desc2 = load_urdf('multi_urdf_display', 'sphere.urdf')
return LaunchDescription([
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
name='cube_state_pub',
namespace='cube',
parameters=[{'robot_description': robot_desc1}],
),
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
name='sphere_state_pub',
namespace='sphere',
parameters=[{'robot_description': robot_desc2}],
),
Node(
package='tf2_ros',
executable='static_transform_publisher',
namespace='cube',
arguments=['0', '0', '0', '0', '0', '0', 'world', 'cube/base_link'],
),
Node(
package='tf2_ros',
executable='static_transform_publisher',
namespace='sphere',
arguments=['2', '0', '0', '0', '0', '0', 'world', 'sphere/base_link'],
),
Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', os.path.join(
get_package_share_directory('multi_urdf_display'),
'rviz','display_multi_urdf.rviz')]
)
])四、配置RViz文件
在rviz文件夹中创建display_multi_urdf.rviz,设置固定坐标系为world,并添加两个RobotModel显示,分别对应立方体和球体。
<?xml version="1.0" ?>
<rviz config_version="1.12">
<VisualizationManager>
<GlobalOptions>
<FixedFrame value="world"/>
<FrameRate value="30"/>
</GlobalOptions>
<Display>
<Class value="rviz/RobotModel"/>
<Name value="Cube"/>
<Enabled value="true"/>
<RobotDescriptionTopic value="/cube/robot_description"/>
<TFPrefix value="cube"/>
</Display>
<Display>
<Class value="rviz/RobotModel"/>
<Name value="Sphere"/>
<Enabled value="true"/>
<RobotDescriptionTopic value="/sphere/robot_description"/>
<TFPrefix value="sphere"/>
</Display>
</VisualizationManager>
</rviz>五、安装与运行
在CMakeLists.txt中添加安装指令,然后编译并运行。
install(DIRECTORY launch urdf rviz
DESTINATION share/${PROJECT_NAME})编译包:
colcon build --packages-select multi_urdf_display
source install/setup.bash
ros2 launch multi_urdf_display display_multi_urdf.launch.py启动后,在Rviz中添加两个RobotModel显示,分别配置Topic为/cube/robot_description和/sphere/robot_description,TF Prefix为cube和sphere,即可同时显示两个模型。
六、总结
本文介绍了在ROS2中通过命名空间隔离和RViz配置实现多个独立URDF模型同时显示的方法。该方法适用于双机械臂、机械臂加底盘等复杂机器人场景。如需查看详细步骤、代码解释或视频演示,请阅读Rviz 同时显示多个独立 URDF!解决双机械臂+底盘等场景(球体+方块实例演示)。
原帖子内容来源:https://bbs.eeworld.com.cn/thread-1310347-1-1.html




