第 8 章 MoveIt 运动规划
学习目标
- 理解 MoveIt 是什么、解决什么问题
- 认识 move_group、规划场景、运动学、碰撞检测等核心概念
- 安装 MoveIt 2 并用官方 Panda 机械臂演示完成一次"规划→执行"
- 理解 MoveIt 规划出的轨迹如何与仿真/真机衔接
1. MoveIt 是什么
MoveIt 是 ROS 里最主流的机械臂运动规划框架 。它解决的问题是:给机械臂一个目标(比如"把末端放到桌面上方 30 厘米处"),MoveIt 自动算出一条无碰撞、关节运动平滑的轨迹,并交给控制器执行。
典型的 MoveIt 任务链:
text
目标位姿 ──► 运动学求解 ──► 路径搜索(OMPL)──► 碰撞检测/轨迹优化
──► 轨迹(JointTrajectory)──► 控制器(ros2_control)──► 机器人/仿真
2. 核心概念
| 概念 | 说明 |
|---|---|
| move_group | MoveIt 的中枢节点,所有规划请求都发给它 |
| 规划组(Planning Group) | 一组关节的组合,如"panda_arm"(7 个关节)、"hand"(手爪) |
| 规划场景(Planning Scene) | 机器人及其周围环境的实时状态:障碍物、碰撞体 |
| 运动学(Kinematics) | 关节角度 ↔ 末端位姿的换算(正运动学/逆运动学 IK) |
| 碰撞检测 | 检查轨迹上的每个点是否与自身或环境碰撞 |
| OMPL | 内置的路径规划算法库(RRT、RRTConnect 等) |
| MotionPlanning 面板 | RViz 里的插件,交互式拖拽目标、规划、执行 |
MoveIt 只是规划:它输出关节轨迹,本身不直接驱动电机。执行轨迹的是控制器(ros2_control + 驱动插件),MoveIt 通过话题把轨迹发给控制器。这正好可以和 Gazebo 衔接(见第 5 节)。
3. 安装 MoveIt 2
在容器里安装(依赖较多,约几百 MB,耐心等待):
bash
sudo apt update
sudo apt install -y ros-jazzy-moveit
验证:
bash
ros2 pkg list | grep moveit | head
4. 启动 Panda 机械臂演示
MoveIt 官方演示自带 Franka Panda 机械臂配置:
bash
ros2 launch moveit_resources_panda_moveit_config demo.launch.py
会弹出 RViz 窗口,中间是 Panda 机械臂,左侧是 MotionPlanning 面板。这个演示只做运动规划(没有物理仿真),机械臂的关节状态由 MoveIt 自己管理。
先看看系统里多了什么:
bash
ros2 node list # 应该能看到 move_group
ros2 topic list | grep -E 'planning|display'
/display_planned_path 用于在 RViz 中显示规划出的轨迹,/planning_scene 是规划场景数据。
第一次规划与执行
在 RViz 的 MotionPlanning 面板里操作:
- 左侧面板 Planning Group 选择
panda_arm - 在 3D 视图里,机械臂末端(夹爪)附近会出现坐标轴/拖动标记(Interact 模式)
- 用鼠标拖动末端的目标位置,或者用面板里的 Set Goal 微调
- 点击 Plan:MoveIt 计算一条无碰撞轨迹,绿色轨迹预览出现
- 点击 Execute:机械臂按轨迹移动
面板里还有这些常用功能:
- Goal State :从预设的目标关节状态里选(如
ready、extended) - Add/Remove 障碍物:在场景里放障碍物,观察规划如何避障
- 拖拽末端:开启 Interact 模式后,按住坐标轴的箭头/圆环拖动
如果面板不在:菜单 Panels → Add New Panel → MotionPlanning。
尝试避障
在 RViz 的 MotionPlanning 面板场景区添加一个障碍物(如一个 box),把它放在机械臂运动路径中间,再次 Plan------观察 MoveIt 绕开障碍物的轨迹。这就是"无碰撞规划"最直观的演示。
5. MoveIt 与 Gazebo 如何衔接
演示里机械臂是"悬浮"的,轨迹只让 RViz 里的模型动了。在真实开发中,MoveIt 的输出要经过:
text
MoveIt(规划轨迹)
│ 发布到控制器对应的轨迹话题(如 /panda_arm_controller/joint_trajectory)
▼
ros2_control(控制器管理器)
│ 驱动硬件接口
▼
机器人硬件 或 Gazebo 仿真中的模型
在 Gazebo 里跑 MoveIt 需要额外配置:机械臂的 URDF/SDF、ros2_control 的控制器配置(joint_state_broadcaster、joint_trajectory_controller)、以及把传感器数据(关节状态)反馈给 MoveIt。这套"MoveIt + Gazebo + ros2_control"完整链路属于进阶内容,第 10 章会给出学习路线。
常见问题
| 现象 | 原因与解决办法 |
|---|---|
package 'moveit_resources_panda_moveit_config' not found |
MoveIt 未装完或终端没 source;重新执行安装命令并 source /opt/ros/jazzy/setup.bash |
| RViz 里没有机械臂模型 | 等待几秒;确认 launch 没有报错;必要时重启 RViz |
| 找不到 MotionPlanning 面板 | Panels → Add New Panel → MotionPlanning |
| 规划失败(红字) | 目标姿态超出关节范围,或与自身/障碍物碰撞;把目标拖回安全位置再试 |
| 点击 Execute 后机械臂不动 | 演示中执行依赖 MoveIt 的仿真控制器,确认 ros2 node list 里有控制器相关节点;若仍未解决,重启 launch |
| 机械臂抖动/穿模 | 规划场景与显示模型不同步,重启演示即可(演示环境本身用于教学) |
练习题
- 用 Interact 模式把 Panda 末端拖到不同位置,分别规划并执行 5 次,观察轨迹形态差异。
- 添加一个障碍物 box 挡住机械臂,规划并执行,观察避障效果;然后把障碍物移除再规划,对比轨迹。
- 在 MotionPlanning 面板的 Goal State 里选择不同的预设状态,执行后观察关节角度的变化(先
ros2 topic list | grep joint找到关节状态话题,通常是/joint_states,再ros2 topic echo查看)。 - 思考:MoveIt 在 Gazebo 仿真和真机上执行时,各需要哪些额外组件?(提示:控制器、反馈传感器)