[具身智能-738]:MoveIt2 标准使用步骤(官方标准流程)
普通单机械臂:固定2 个 Groupmanipulator 机械臂主体gripper 夹爪带移动底盘:加 1 个 base 组,共3 个双臂机器人:左右各两组,共4 个。
第 1 步:启动机器人(或仿真)
核心作用
加载机器人 URDF/SRDF 模型、启动关节状态发布、拉起 ros2_control 控制器,给 MoveIt2 提供机器人本体 + 硬件状态基础。
必须就绪的条件
- 机器人 URDF、碰撞模型、连杆坐标系全部加载
- 持续发布
/joint_states关节状态话题 - 轨迹控制器
follow_joint_trajectory正常就绪 - 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 步:设置目标位姿
核心作用
给机械臂指定末端执行器要到达的目标,有两种目标类型:
- 任务空间目标:末端
(x,y,z) + 姿态四元数 - 关节空间目标:直接给各关节目标角度
设置方式
- 代码设置(程序自动控制)
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);
- RViz 手动拖拽(调试用)MotionPlanning 面板 → 拖拽末端箭头设置目标位姿
内部动作
MoveGroup 接收目标后,先做初步可达性预判,等待规划指令。
第 4 步:调用 plan () 规划
核心作用
以当前机器人姿态为起点、设置的目标为终点,自动完成整套运算:
- 求解逆运动学 IK
- 在高维关节空间搜索路径
- 做 3D 碰撞检测(自身碰撞 / 环境障碍物)
- 生成平滑、带速度加速度约束的关节轨迹
- 输出一条可执行的运动轨迹 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);
}
内部执行流程
- MoveIt2 发送
JointTrajectory轨迹 follow_joint_trajectory控制器逐点插值跟踪- 闭环控制每个关节角度、速度
- 走完整条轨迹后自动停止
补充
也可以用 move_group.move() 一键封装 = plan + execute 合并,但标准工程推荐分开写 plan /execute,方便加逻辑、容错、避障重试。
五步极简总口诀
- 启机器人:加载模型、关节状态、控制器
- 启 MoveGroup:拉起规划、IK、碰撞检测服务
- 设目标位姿:告诉机械臂要去哪
- plan 做规划:算无碰撞平滑轨迹,不动
- execute 来执行:下发轨迹,机械臂真实运动
常见机械臂有几个 MoveIt Group?
核心结论
绝大多数标准机械臂,固定就 2 个 Group;复杂移动操作臂最多 3 个。
一、最标准:普通 6 轴机械臂(台式 / 工业臂)
一共 2 个 Group
manipulator(机械臂主体组)基座 → 1 轴~6 轴 全部关节连杆负责:运动规划、IK、避障、走到目标位姿
gripper(夹爪组 / 末端执行器组)夹爪开合关节负责:单独控制张开 / 闭合,不参与机械臂运动规划
99% 六轴协作臂、工业臂、桌面机械臂:manipulator + gripper 两组
二、4 轴 / 5 轴 桌面机械臂
同样 2 个 Group
- manipulator:4/5 个旋转关节
- gripper:夹爪组
三、7 轴冗余机械臂(协作臂常见)
还是 2 个 Group
- manipulator:7 个关节整组规划
- gripper:夹爪组
只是关节多,分组逻辑不变。
四、移动操作机器人(底盘 + 机械臂)
一共 3 个 Group
- base 移动底盘组(差分 / 全向底盘)
- manipulator 机械臂主体
- gripper 夹爪
五、特殊多臂机器人(双臂)
每侧手臂各一套:
- left_manipulator + left_gripper
- right_manipulator + right_gripper总共 4 个 Group
极简总结
- 普通单机械臂:固定 2 个 Group
- manipulator 机械臂主体
- gripper 夹爪
- 带移动底盘:加 1 个 base 组,共 3 个
- 双臂机器人:左右各两组,共 4 个
一句话记忆
手臂一组、夹爪一组;带底盘就再加一组。
需要我给你一份 SRDF 里标准 group 配置样例 吗?可以直接套用。
更多推荐


所有评论(0)