机器人
返回首页

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



进入机器人查看更多内容>>
相关视频
  • 直播回放: 如何使用MPLAB® Mindi™软件进行模拟电路仿真

  • 直播回放: 开启 SDV 的未来:集成 TI 的远程控制边缘节点解决方案

  • 直播回放: 2026 是德科技XR8新品发布: 一段跨越70年的示波器创新之旅

  • 直播回放: 使用RUHMI模型转换器部署BYOM模型并进行MINST模型部署

  • 直播回放: 使用Reality AI Tools 基于数据创建微小型AI模型以及进行拉弧检测开发实践

  • 直播回放: MPS 赋能人形机器人 - 因为没有运动,机器人只是一尊雕塑

精选电路图
  • 锂离子/锂聚合物USB电池充电器

  • 6晶体管H桥

  • AVR LCD温度计—LM35

  • AVR PC步进电机驱动器

  • AVR温度计TCN75

  • JDM2 PIC 18F 编程器

    相关电子头条文章