第 1 步:启动机器人(或仿真)

核心作用

加载机器人 URDF/SRDF 模型、启动关节状态发布、拉起 ros2_control 控制器,给 MoveIt2 提供机器人本体 + 硬件状态基础

必须就绪的条件

  1. 机器人 URDF、碰撞模型、连杆坐标系全部加载
  2. 持续发布 /joint_states 关节状态话题
  3. 轨迹控制器 follow_joint_trajectory 正常就绪
  4. TF 坐标树完整(base_link → 各关节 → end_effector)

两种场景

  • 仿真:启动 (Gazebo  + 机器人描述文件)         + ros2_control控制器
  • 实物:启动(电机驱动 + ros2_control 硬件接口)+ ros2_control控制器

典型启动命令

bash

运行

ros2 launch 机器人包 robot_bringup.launch.py

为什么必须先做这一步?

MoveIt2 不能凭空规划,必须实时读取机器人当前关节状态、TF 坐标,没有机器人本体就无法做 IK、碰撞检测、运动规划。


第 2 步:启动 MoveGroup

核心作用

拉起 MoveIt2 核心服务节点:运动规划、IK 逆解、3D 碰撞检测、规划场景管理、轨迹处理、与控制器通信,是整个 MoveIt2 的中枢大脑

启动内容

运行 moveit_config 包自带启动文件,自动加载:

  • 规划组配置(机械臂组、末端组)
  • 规划器插件(OMPL 默认)
  • 碰撞检测库 FCL
  • RViz 可视化插件 MotionPlanning

典型启动命令

bash

运行

ros2 launch 机器人_moveit_config moveit.launch.py

内部就绪服务

后台自动开启:

  • 运动规划服务
  • 逆运动学求解服务
  • 规划场景修改服务
  • 轨迹执行服务

为什么要单独启动 MoveGroup?

MoveIt2 是服务端 - 客户端架构MoveGroup 是服务端,你的业务代码是客户端,客户端必须连服务端才能规划。


第 3 步:设置目标位姿

核心作用

给机械臂指定末端执行器要到达的目标,有两种目标类型:

  1. 任务空间目标:末端 (x,y,z) + 姿态四元数
  2. 关节空间目标:直接给各关节目标角度

设置方式

  1. 代码设置(程序自动控制)

cpp

运行

geometry_msgs::msg::Pose target_pose;
target_pose.position.x = 0.3;
target_pose.position.y = 0.0;
target_pose.position.z = 0.4;
target_pose.orientation.w = 1.0;

move_group.setPoseTarget(target_pose);
  1. RViz 手动拖拽(调试用)MotionPlanning 面板 → 拖拽末端箭头设置目标位姿

内部动作

MoveGroup 接收目标后,先做初步可达性预判,等待规划指令。


第 4 步:调用 plan () 规划

核心作用

当前机器人姿态为起点设置的目标为终点,自动完成整套运算:

  1. 求解逆运动学 IK
  2. 在高维关节空间搜索路径
  3. 做 3D 碰撞检测(自身碰撞 / 环境障碍物)
  4. 生成平滑、带速度加速度约束的关节轨迹
  5. 输出一条可执行的运动轨迹 Plan

代码调用

cpp

运行

moveit::planning_interface::MoveGroupInterface::Plan my_plan;
// 规划:只算轨迹,不运动
bool ok = (move_group.plan(my_plan) == moveit::core::MoveItErrorCode::SUCCESS);

规划成功 / 失败原因

  • 成功:无碰撞、位姿可达、无奇点
  • 失败:被障碍物挡住、超出工作空间、奇异点、规划时间不足

关键特点

plan 只计算轨迹,不控制机器人运动,只是纯离线规划。


第 5 步:调用 execute () 执行

核心作用

plan() 生成好的关节轨迹下发ros2_control 轨迹控制器驱动机械臂真实运动实时跟踪轨迹直到到达目标。

代码调用

cpp

运行

if(ok)
{
  // 执行:下发轨迹,机械臂开始动
  move_group.execute(my_plan);
}

内部执行流程

  1. MoveIt2 发送 JointTrajectory 轨迹
  2. follow_joint_trajectory 控制器逐点插值跟踪
  3. 闭环控制每个关节角度、速度
  4. 走完整条轨迹后自动停止

补充

也可以用 move_group.move() 一键封装 = plan + execute 合并,但标准工程推荐分开写 plan /execute,方便加逻辑、容错、避障重试。


五步极简总口诀

  1. 启机器人:加载模型、关节状态、控制器
  2. 启 MoveGroup:拉起规划、IK、碰撞检测服务
  3. 设目标位姿:告诉机械臂要去哪
  4. plan 做规划:算无碰撞平滑轨迹,不动
  5. execute 来执行:下发轨迹,机械臂真实运动

常见机械臂有几个 MoveIt Group?

核心结论

绝大多数标准机械臂,固定就 2 个 Group;复杂移动操作臂最多 3 个。


一、最标准:普通 6 轴机械臂(台式 / 工业臂)

一共 2 个 Group

  1. manipulator(机械臂主体组)基座 → 1 轴~6 轴 全部关节连杆负责:运动规划、IK、避障、走到目标位姿

  2. gripper(夹爪组 / 末端执行器组)夹爪开合关节负责:单独控制张开 / 闭合,不参与机械臂运动规划

99% 六轴协作臂、工业臂、桌面机械臂:manipulator + gripper 两组


二、4 轴 / 5 轴 桌面机械臂

同样 2 个 Group

  • manipulator:4/5 个旋转关节
  • gripper:夹爪组

三、7 轴冗余机械臂(协作臂常见)

还是 2 个 Group

  • manipulator:7 个关节整组规划
  • gripper:夹爪组

只是关节多分组逻辑不变


四、移动操作机器人(底盘 + 机械臂)

一共 3 个 Group

  1. base 移动底盘组(差分 / 全向底盘)
  2. manipulator 机械臂主体
  3. gripper 夹爪

五、特殊多臂机器人(双臂)

每侧手臂各一套:

  • left_manipulator + left_gripper
  • right_manipulator + right_gripper总共 4 个 Group

极简总结

  1. 普通单机械臂:固定 2 个 Group
    • manipulator 机械臂主体
    • gripper 夹爪
  2. 带移动底盘:加 1 个 base 组,共 3 个
  3. 双臂机器人:左右各两组,共 4 个

一句话记忆

手臂一组、夹爪一组;带底盘就再加一组。

需要我给你一份 SRDF 里标准 group 配置样例 吗?可以直接套用。

Logo

电影级数字人,免显卡端渲染SDK,十行代码即可调用,工业级demo免费开源下载!

更多推荐