4. 加载机械臂到RViz

任务目标

本案例将完成ROS 2 + MoveIt 2环境下的第一个核心闭环:将机械臂URDF模型加载到RViz中,并通过MoveIt 2的Setup Assistant生成的运动规划配置,在RViz中显示机械臂模型、规划组(Planning Group)以及可交互的拖拽标记(InteractiveMarker)。完成本案例后,你将拥有一个可进行后续运动规划与控制的仿真基础环境。

环境与依赖

  • Ubuntu 22.04 + ROS 2 Humble(或更高版本)
  • 已安装 moveit 核心包:sudo apt install ros-humble-moveit
  • 已安装 joint-state-publisher-gui:sudo apt install ros-humble-joint-state-publisher-gui
  • 机械臂URDF文件(本案例使用panda机械臂示例,也可替换为自定义URDF)

实现步骤

本案例的核心是使用MoveIt 2 Setup Assistant生成机械臂的SRDF(语义机器人描述格式)和配置文件,然后通过launch文件将URDF、SRDF和MoveIt配置加载到RViz中。整个过程分为三个部分:准备URDF、生成MoveIt配置、编写并运行launch文件。

1. 准备URDF模型

使用Franka Emika Panda机械臂的公开URDF作为示例。创建ROS 2工作空间并下载模型:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
git clone https://github.com/ros-planning/panda_moveit_config.git -b humble
cd ~/ros2_ws
colcon build --packages-select panda_moveit_config
source install/setup.bash

2. 生成MoveIt配置(SRDF)

MoveIt Setup Assistant会读取URDF并生成SRDF文件,其中定义了规划组、预设位姿和碰撞免检对。对于Panda机械臂,panda_moveit_config包中已包含现成的SRDF,可直接使用。若使用自定义URDF,需运行以下命令启动Setup Assistant:

ros2 launch moveit_setup_assistant setup_assistant.launch.py

在GUI中加载URDF,创建规划组(如panda_arm包含从panda_link1到panda_link8的关节链),然后生成配置文件。

3. 编写launch文件并加载到RViz

以下launch文件是加载机械臂到RViz的最小完整实现。它启动机器人状态发布器、关节状态GUI、MoveIt规划场景和RViz:

# panda_display.launch.py
import os
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument, ExecuteProcess
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
    panda_moveit_config = get_package_share_directory('panda_moveit_config')

    # 加载URDF和SRDF
    robot_description = {'robot_description': os.path.join(panda_moveit_config, 'urdf', 'panda.urdf')}
    robot_description_semantic = {'robot_description_semantic': os.path.join(panda_moveit_config, 'srdf', 'panda.srdf')}

    # 机器人状态发布器:从joint_states话题计算TF
    robot_state_publisher = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        output='screen',
        parameters=[robot_description]
    )

    # 关节状态GUI:手动拖动滑块控制关节
    joint_state_publisher_gui = Node(
        package='joint_state_publisher_gui',
        executable='joint_state_publisher_gui',
        output='screen',
        parameters=[{'robot_description': robot_description['robot_description']}]
    )

    # MoveIt规划场景:加载SRDF并维护碰撞环境
    moveit_planning_scene = Node(
        package='moveit_ros_planning',
        executable='move_group',
        output='screen',
        parameters=[robot_description, robot_description_semantic,
                    {'use_sim_time': False}]
    )

    # RViz加载MoveIt配置
    rviz_config = os.path.join(panda_moveit_config, 'config', 'moveit.rviz')
    rviz = Node(
        package='rviz2',
        executable='rviz2',
        name='rviz2',
        output='screen',
        arguments=['-d', rviz_config],
        parameters=[robot_description, robot_description_semantic]
    )

    return LaunchDescription([
        DeclareLaunchArgument('use_sim_time', default_value='false'),
        robot_state_publisher,
        joint_state_publisher_gui,
        moveit_planning_scene,
        rviz
    ])

运行与验证

cd ~/ros2_ws
source install/setup.bash
ros2 launch panda_moveit_config panda_display.launch.py

验证通过条件:

  1. RViz窗口打开,显示Panda机械臂的完整3D模型,无红色报错或缺失link。
  2. 左侧Displays面板中,MotionPlanning插件正常显示,Planning Group下拉框中可选择panda_arm。
  3. 在RViz中点击Interact按钮(或使用MoveIt插件中的拖拽模式),机械臂末端出现可拖拽的彩色箭头/圆环标记,拖动时机械臂模型跟随运动。
  4. 关节状态GUI窗口弹出,拖动滑块可看到机械臂各关节实时转动。

若以上条件均满足,说明机械臂已成功加载到RViz,且MoveIt规划场景正常工作,可进入下一案例(运动规划)。

常见问题

  • RViz中模型显示为灰色或缺失:检查终端是否有TF树错误,运行ros2 run tf2_tools view_frames查看TF树是否完整。
  • 拖拽标记不出现:确认move_group节点已启动,且RViz中MotionPlanning插件的Planning Group已正确选择。
  • 关节GUI无法控制:确保joint_state_publisher_gui与robot_state_publisher同时运行,且URDF中未设置transmission(否则需额外启动ros2_control节点)。