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
验证通过条件:
- RViz窗口打开,显示Panda机械臂的完整3D模型,无红色报错或缺失link。
- 左侧Displays面板中,
MotionPlanning插件正常显示,Planning Group下拉框中可选择panda_arm。 - 在RViz中点击
Interact按钮(或使用MoveIt插件中的拖拽模式),机械臂末端出现可拖拽的彩色箭头/圆环标记,拖动时机械臂模型跟随运动。 - 关节状态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节点)。