初段:
实验6 ROS2 Lyrical MoveIt Task Constructor(MTC) 机械臂抓取放置仿真实验
全程不手写一行代码,仅使用moveit_task_constructor_demo官方原生示例,仅执行终端命令,观察RViz可视化
执行命令:ros2 launch moveit_task_constructor_demo demo.launch.py ros2 launch moveit_task_constructor_demo run.launch.py exe:=pick_place_demo
实验平台:Ubuntu 26.04 + ROS2 Lyrical + MoveIt2 + MoveIt Task Constructor
实验学时:2学时
一、实验目的
- 认识MoveIt Task Constructor(MTC),理解任务分阶段规划思想,对比传统MoveGroup的一体化Pick/Place。
- 掌握MTC官方示例的启动流程,学会使用RViz的MTC可视化面板观察任务执行。
- 直观观察完整抓取放置任务的全过程:场景添加物体→预抓取→生成抓取位姿→抓取→搬运→放置释放。
- 理解MTC的Stage(阶段)机制,能识别任务在哪一阶段成功/失败,掌握基础故障定位。
- 理解规划场景、碰撞检测、物体附着(attach/detach)在抓取任务中的作用。
二、实验原理
MoveIt Task Constructor(MTC)是MoveIt2官方推荐的复合任务规划框架,把机器人复杂任务拆成多个独立Stage(阶段)串行执行。
本实验直接使用官方预编译好的pick_place_demo,无需编写C++/Python代码。
任务内置阶段(源码已经写好,我们只看运行效果):
- ModifyPlanningSceneStage:在规划场景中添加待抓取方块物体
- MoveToStage:机械臂移动到预抓取安全关节位姿
- GenerateGraspStage:自动生成多组候选抓取姿态
- MoveRelativeStage:笛卡尔直线逼近物体
- AllowCollisionStage:临时允许夹爪与目标物体接触碰撞
- ModifyPlanningSceneStage(attach):将方块绑定到夹爪末端连杆,抓取后物体跟随机械臂运动
- MoveToStage:抬起物体,移动至放置目标位置
- MoveRelativeStage:下降到放置高度
- ModifyPlanningSceneStage(detach):解除物体绑定,释放方块
- MoveToStage:机械臂退回安全位姿
核心特点:某一阶段规划失败时,MTC会自动尝试下一个候选抓取姿态;所有阶段都做碰撞检测,MTC RViz面板实时展示每个stage的状态(绿色成功/红色失败)。
三、实验环境
- 操作系统:Ubuntu 26.04
- ROS版本:ROS2 Lyrical
- 依赖软件包(一次性安装)
sudoaptinstallros-lyrical-moveit-task-constructor ros-lyrical-moveit-task-constructor-demo- 工具:RViz2 + MoveIt Task Constructor RViz插件
- 机器人模型:demo内置Panda(Franka)七自由度机械臂+二指夹爪(官方自带模型,无需额外下载URDF)
四、实验步骤(全程不编写任何代码,只敲终端命令)
说明:所有程序、任务逻辑、机器人模型、配置文件均来自moveit_task_constructor_demo官方包,已经预编译完成。
步骤1:安装依赖包(只执行一次)
sudoaptinstallros-lyrical-moveit-task-constructor ros-lyrical-moveit-task-constructor-demo步骤2:启动MTC Demo环境【终端1,保持打开】
ros2 launch moveit_task_constructor_demo demo.launch.py执行后自动完成:
- 加载Panda机械臂URDF、SRDF、MoveIt配置
- 启动move_group节点、TF、joint_states
- 自动打开RViz2
✅ RViz操作:添加MoveItTaskConstructorPanel面板(如未自动加载,顶部Panel→Add New Panel选择),用于查看任务各个Stage状态。
ros2@ros2-cslg:~$ ros2 launch moveit_task_constructor_demo demo.launch.py package.xml panda_config.yaml run.launch.py ros2@ros2-cslg:~$ ros2 launch moveit_task_constructor_demo步骤3:运行pick_place抓取放置任务【新开终端2】
ros2 launch moveit_task_constructor_demo run.launch.py exe:=pick_place_demoros2@ros2-cslg:~$ ros2 launch moveit_task_constructor_demo run.launch.py[INFO][launch]: All log files can be found below /home/ros2/.ros/log/2026-09-27-09-46-22-524335-ros2-cslg-8743[INFO][launch]: Default logging verbosity issetto INFO[ERROR][launch]: Caught exceptioninlaunch(see debugfortraceback): Included launch description missing required argument'exe'(description:'no description given'), given:[]观察现象(重点记录)
- RViz场景出现红色方块(待抓取物体);
- MTC面板依次显示各个Stage,成功阶段变为绿色;
- 机械臂动作顺序:
- 机械臂回到home安全位姿
- 移动到物体上方预抓取位置
- 末端沿直线向下逼近方块
- 夹爪闭合,抓住方块,方块绑定到夹爪
- 抬升方块,运动到放置位置上方
- 向下移动,夹爪打开,方块脱离夹爪落到放置点
- 机械臂抬起,回到安全姿态
- 终端打印日志,最终输出
Task finished successfully。
步骤4:重复执行,观察任务重试机制(可选)
在终端2,重复多次执行同一条启动命令:
ros2 launch moveit_task_constructor_demo run.launch.py exe:=pick_place_demo观察:MTC每次会生成不同候选抓取姿态;个别抓取姿态碰撞失败时,MTC自动切换下一组抓取方案,直到找到可行轨迹。
步骤5:人为制造任务失败(拓展选做,观察报错)
无需改代码,直接在RViz手动添加障碍物,观察MTC阶段变红。
- 在RViz MotionPlanning面板 → Scene Objects,添加立方体障碍物,放在机械臂运动路径中间;
- 再次执行pick_place_demo任务;
- 观察:MTC面板某Stage变红,终端提示规划失败,识别是哪个阶段发生碰撞。
五、实验现象记录(写进实验报告)
- RViz初始画面:Panda机械臂、MTC任务面板、场景红色方块;
- 抓取过程截图:预抓取位姿、夹爪夹持方块、搬运途中、放置释放后的画面;
- MTC面板截图:各Stage状态(绿色成功);
- 终端日志截图:任务成功提示;
- 【拓展】添加障碍物后的失败现象:某Stage变红,任务规划失败。
六、思考题
- MTC将抓取任务拆分为多个Stage,相比传统MoveGroup的Pickup Action,有什么优势?
- 抓取阶段
attach物体、放置阶段detach物体的作用是什么? AllowCollisionStage为什么只临时允许夹爪和物体碰撞,而不是全局关闭碰撞检测?- MTC任务执行中,如果其中一个Stage规划失败,MTC会如何处理?
- 在本实验中,没有编写任何代码,任务逻辑来自哪里?
七、实验报告要求
- 实验目的、实验原理;
- 写出两条核心启动命令;
- 插入RViz截图(MTC面板、机械臂抓取不同阶段);
- 描述完整抓取放置实验现象;
- 回答思考题;
- 记录实验中遇到的问题与解决办法。
八、常见故障排查
- RViz看不到MTC面板:在RViz顶部菜单
Panels -> Add New Panel,选择MoveItTaskConstructorPanel - 启动提示包找不到:确认包安装成功,
ros2 pkg list | grep moveit_task_constructor_demo检查包存在 - 任务规划超时失败:可在RViz调整MoveIt规划时间,或者观察物体位置是否超出工作空间
- RViz机械臂不显示:检查demo.launch是否正常启动,TF、robot_state_publisher是否正常
思考题参考答案(可直接粘贴报告)
- MTC把任务拆成独立Stage,可视化每个阶段的成功/失败,方便定位故障;支持候选方案自动重试,可灵活增删任务步骤,适合工业复杂抓取装配任务;传统Pickup是封装好的黑盒,很难调试内部过程。
attach:抓取时将目标物体绑定到夹爪连杆,让MTC规划场景认为物体属于夹爪,机械臂移动时物体跟随夹爪一起运动;detach放置完成后解除绑定,物体独立留在场景中。- 只临时局部允许碰撞:仅允许夹爪与被抓物体接触,其余连杆仍然保持碰撞检测。如果全局关闭碰撞,机械臂会和环境障碍物相撞,存在安全风险。
- MTC会尝试当前Stage下其他候选方案(如其他抓取姿态),如果全部候选方案都失败,则整个任务终止,该Stage标记红色失败。
- 任务逻辑全部写在
moveit_task_constructor_demo官方源码中,已经提前编译成可执行文件,我们只通过launch命令直接运行,不需要手动编写代码。
中段:
实验6 ROS2‑Lyrical MoveIt Task Constructor机械臂抓取放置实验
基于官方
moveit_task_constructor_demo案例,启动命令:ros2 launch moveit_task_constructor_demo demo.launch.pyros2 launch moveit_task_constructor_demo run.launch.py exe:=pick_place_demo
实验环境:Ubuntu26.04 + ROS2‑Lyrical + MoveIt2 + MoveIt Task Constructor(MTC) + RViz2
学时:2学时
一、实验目的
- 理解MoveIt Task Constructor(MTC)框架思想:任务由多个阶段(stage)组合而成,替代传统单一Pickup/Place Action。
- 掌握MTC基本组件:
Task、Stage、Property、MoveToStage、GenerateGraspStage、ModifyPlanningSceneStage等。 - 运行官方
pick_place_demo示例,观察完整抓取‑放置任务的规划、碰撞检测、场景更新。 - 读懂MTC C++源码,理解抓取任务拆解:移动到预抓取→生成抓取姿态→接近物体→闭合夹爪→搬运→放置→释放。
- 学会修改参数(抓取距离、规划时间、目标位置),观察任务成功/失败现象,掌握简单调试方法。
二、实验原理
1.MTC简介
MoveIt Task Constructor(MTC)把复杂机器人任务拆分为一系列可配置的阶段(Stage),阶段可以串行、并行、支持失败回退,适合抓取、装配等复合任务。
Task:顶层容器,管理全部stage,执行整体规划。MoveToStage:关节空间/笛卡尔空间运动。GenerateGraspStage:自动生成多组抓取姿态。ModifyPlanningSceneStage:附加/分离物体(抓取时把物体绑定到夹爪)。AllowCollisionStage:临时允许部分碰撞(夹爪接触物体)。
传统MoveGroupInterface的Pick‑Place Action封装度高,黑盒;MTC显式定义每一步任务,方便调试、修改流程,是ROS2工业抓取主流方案。
2.pick_place_demo任务流程
- 规划场景添加待抓取方块物体;
- 机械臂运动到预抓取安全位置;
- 自动生成一组候选抓取姿态;
- 笛卡尔逼近运动到物体上方;
- 允许夹爪与物体碰撞,闭合夹爪;
- 将物体附加到末端夹爪连杆;
- 抬升物体,运动到放置目标点;
- 下降,打开夹爪,物体从夹爪分离;
- 机械臂退回安全姿态,任务结束。
全部阶段会做碰撞检测;某一stage失败会自动尝试下一个候选抓取姿态。
三、实验环境
- OS:Ubuntu26.04
- ROS2:Lyrical
- 依赖包:
moveit-task-constructor、moveit-full - 示例包:
moveit_task_constructor_demo,内置pick_place_demo可执行文件 - 可视化工具:RViz2(MTC插件用于观察任务阶段、轨迹、规划失败原因)
环境安装
sudo apt install ros-lyrical-moveit-task-constructor ros-lyrical-moveit-task-constructor-demo四、实验步骤
步骤1:启动MTC Demo可视化环境
终端1,启动demo环境(加载机器人模型、MoveGroup、RViz2、MTC可视化插件)
ros2 launch moveit_task_constructor_demo demo.launch.pyRViz配置:确认加载MoveItTaskConstructorPanel面板,可以看到各个任务阶段、成功/失败状态。
步骤2:运行pick_place_demo抓取放置任务
新开终端2,运行官方pick‑place示例:
ros2 launch moveit_task_constructor_demo run.launch.py exe:=pick_place_demo观察现象:
- RViz规划场景中出现红色方块待抓取物体;
- MTC面板看到各个stage依次变为绿色(成功);
- 机械臂运动:预抓取→接近→闭合夹爪抓取→搬运到放置点→释放物体;
- 终端输出任务规划耗时、抓取姿态尝试次数、任务结果
Task finished successfully。
如果任务失败,MTC面板可以看到哪一个stage变红,定位失败环节。
步骤3:研读pick_place_demo核心源码
源码路径:/opt/ros/lyrical/src/moveit_task_constructor/moveit_task_constructor_demo/src/pick_place_demo.cpp
关键代码片段:
// 创建任务对象 mtc::Task task; task.setProperty("name", "pick_place_task"); // 1.添加物体到规划场景 auto add_object = std::make_unique<mtc::ModifyPlanningSceneStage>("add object"); // 2.移动到预抓取位姿 auto move_pre_pick = std::make_unique<mtc::MoveToStage>("move pre pick"); // 3.生成抓取姿态 auto generate_grasp = std::make_unique<mtc::GenerateGraspStage>("generate grasps"); // 4.笛卡尔逼近,靠近物体 auto approach = std::make_unique<mtc::MoveRelativeStage>("approach"); // 5.允许夹爪与物体碰撞,闭合夹爪 auto allow_collision = std::make_unique<mtc::AllowCollisionStage>("allow gripper collision"); // 6.把物体附加到夹爪连杆 auto attach_object = std::make_unique<mtc::ModifyPlanningSceneStage>("attach object"); // 7.抬升物体,搬运到放置位置 auto move_to_place = std::make_unique<mtc::MoveToStage>("move to place"); // 8.释放物体,打开夹爪,分离物体 auto detach_object = std::make_unique<mtc::ModifyPlanningSceneStage>("detach object"); // 将stage依次加入task task.add(std::move(add_object)); task.add(std::move(move_pre_pick)); //……加入其余stage // 执行任务规划 task.plan(); if (task.execute()) RCLCPP_INFO(rclcpp::get_logger("mtc_demo"),"任务执行成功");步骤4:修改参数,对比实验(选做)
复制demo源码到自己工作空间,修改参数重新编译,观察任务结果。
- 修改
GenerateGraspStage抓取距离; - 修改物体放置目标pose;
- 缩短
planning_time规划时间,制造规划失败场景; - 在场景添加障碍物,观察MTC碰撞检测与候选姿态重试。
重新编译后运行:
colcon build --packages-select my_mtc_demo source install/setup.bash ros2 run my_mtc_demo pick_place_demo步骤5:故障观察
人为制造失败场景,记录现象:
- 目标物体位置超出机械臂工作空间;
- 没有可用抓取姿态;
- 路径存在碰撞。>
在MTC面板观察哪个stage变红,理解失败属于哪一类问题。
五、实验记录
- 记录任务正常执行完整现象:RViz截图,MTC面板各stage状态截图;
- 记录终端输出:规划时间、尝试抓取姿态数量、任务返回结果;
- 修改参数后的现象对比(成功/失败);
- 记录1次任务失败案例:失败stage、报错信息,分析原因。
六、思考题
- MTC中
Stage和Task是什么关系?对比传统MoveGroup Pickup Action,MTC有什么优势? ModifyPlanningSceneStage在抓取、释放时分别做了什么操作?为什么抓取时要attach物体?AllowCollisionStage作用是什么,为什么抓取物体时需要允许夹爪和物体发生碰撞?- 如果任务某一个stage失败,MTC会如何处理?
- 结合本次实验,简单描述一个工业抓取任务如何拆分为MTC多个stage。
七、实验报告要求
- 实验目的、原理;
- 关键启动命令,摘抄核心MTC代码片段;
- RViz截图(MTC面板、机械臂抓取各阶段画面);
- 实验现象记录,回答思考题;
- 故障分析:记录遇到的问题、原因、解决方法。
八、常见问题排查
- RViz看不到MTC面板:确认
moveit_task_constructor_rviz_plugin已安装,在面板中手动添加MoveItTaskConstructorPanel。 - 任务一直规划不结束:增大规划时间,检查物体是否超出机械臂工作范围。
- 抓取阶段失败:
GenerateGraspStage没有生成有效抓取姿态,调整物体位置、抓取深度。 - 物体不会跟随夹爪运动:确认
attach_objectstage执行成功。
高段:
实验6 ROS2‑Lyrical工业机械臂MoveIt2运动规划与抓取放置仿真实验
参考文档:ROS2 Lyrical第7章 MoveIt2机械臂运动规划与抓取仿真实操(CSDN‑ZhangRelay)
实验环境:Ubuntu26.04 + ROS2‑Lyrical + MoveIt2 + Gazebo Garden + ros2_control
实验类型:综合验证实验,2学时
一、实验目的
- 理解MoveIt2三层架构(用户接口层、核心算法层、硬件适配层),掌握
move_group节点工作原理与数据流。 - 掌握MoveIt Setup Assistant配置助手,完成机械臂MoveIt全套配置包生成(SRDF、规划群组、控制器、启动文件)。
- 使用RViz2 MotionPlanning插件完成可视化交互规划:拖拽目标、轨迹规划、碰撞检测可视化。
- 理解ros2_control+JointTrajectoryController,实现MoveIt2与Gazebo物理仿真闭环对接。
- 掌握MoveGroupInterface C++ API实现点位运动;掌握PlanningSceneInterface添加障碍物实现避障。
- 完成Pick‑Place抓取放置完整任务仿真,理解抓取任务流程:场景建模→抓取位姿→接近‑抓取‑抬起‑移动‑放置‑退回。
二、实验原理
1.MoveIt2三层架构
1)用户接口层:C++ MoveGroupInterface、Python moveit_commander、RViz2插件、Pickup/Place Action;
2)核心算法层(move_group):OMPL运动规划器、KDL逆运动学求解、FCL碰撞检测、规划场景管理;
3)硬件适配层:ros2_control、JointTrajectoryController、TF2、joint_states关节状态反馈。
数据流:用户下发目标位姿→运动学校验→碰撞检测→无碰轨迹规划→时间参数化→下发轨迹控制器→Gazebo/硬件执行→关节状态回传更新规划场景。
2.MoveIt Setup Assistant
图形化工具导入URDF/Xacro,生成SRDF语义机器人描述、规划群组、自碰撞矩阵、控制器yaml、Python launch全套文件,共7步配置流程。
3.规划场景与避障
PlanningSceneInterface可以编程添加立方体、球体等碰撞物体;Octomap插件将RGBD点云转为三维占用网格,实现动态障碍物避障。
4.Pick&Place任务流程
场景建模(桌子+待抓取物体)→生成多组候选抓取姿态→接近物体→闭合夹爪→抬升物体→运动至放置点→下降、张开夹爪→机械臂退回安全位置。MoveIt2通过Pickup、PlaceAction封装整套逻辑。
三、实验设备与软件
- 软件环境:Ubuntu26.04,ROS2 Lyrical,MoveIt‑full,Gazebo Garden,ros2_control
- 仿真对象:
rosbook_arm六自由度机械臂+二指夹爪 - 功能包集合:| 功能包 | 功能说明 |
| — | — |
| rosbook_arm_description | URDF/Xacro机器人模型 |
| rosbook_arm_moveit_config | Setup Assistant生成MoveIt配置包 |
| rosbook_arm_controllers | ros2_control控制器配置yaml |
| rosbook_arm_gazebo | Gazebo世界与仿真启动脚本 |
| rosbook_arm_pick_and_place | 用户编写运动规划、抓取放置代码 |
四、实验步骤
步骤1:环境安装与工作空间准备
1.安装MoveIt2完整包
sudo apt install ros‑lyrical‑moveit‑full ros‑lyrical‑moveit‑setup‑assistant2.创建colcon工作空间,下载机械臂源码,安装全部依赖
mkdir -p ~/ws_arm/src # 将机械臂源码放置src目录 cd ~/ws_arm rosdep install --from-paths src --ignore-src -r -y colcon build source install/setup.bash步骤2:MoveIt Setup Assistant生成配置包(7步配置)
启动配置助手:
ros2 launch moveit_setup_assistant setup_assistant.launch.py1.新建配置包Create New MoveIt Configuration Package,导入rosbook_arm_base.urdf.xacro;
2.Self‑Collisions自碰撞矩阵:采样10000次,自动生成连杆禁用碰撞对,输出SRDF;
3.Virtual Joints虚拟关节:固定底座机械臂无需配置;移动底盘才添加;
4.Planning Groups规划群组,创建2个群组:
arm:机械臂本体关节,运动学求解器KDL;gripper:夹爪开合关节;
5.Robot Poses预定义位姿:添加home(回零)、grasp_prepare抓取预备位姿;
6.End Effectors末端执行器:指定gripper群组,父连杆tool_link;
7.生成输出配置包,得到config、launch目录、package.xml。
输出内容:SRDF、OMPL规划参数、控制器配置、demo.launch.py等全套启动脚本。
步骤3:RViz2可视化交互规划(Demo演示模式,无物理仿真)
启动demo演示,使用内置虚拟控制器:
ros2 launch rosbook_arm_moveit_config demo.launch.py1.在RViz2打开MotionPlanning面板;
2.Query标签:拖拽6D交互标记设置末端目标位姿;
3.点击Plan仅规划轨迹;Plan and Execute规划+执行;
4.观察颜色状态:白色=当前状态,橙色=目标位姿,绿色=规划轨迹,红色=碰撞/越界;
5.Scene Objects选项卡手动添加立方体障碍物,再次规划观察避障效果。
步骤4:Gazebo+ros2_control物理仿真集成
1.关键配置说明
- URDF/Xacro中嵌入
gazebo_ros2_control插件,加载controllers.yaml; JointTrajectoryController分别配置arm_controller、gripper_controller;
2.启动Gazebo完整仿真环境
ros2 launch rosbook_arm_gazebo rosbook_arm_empty_world.launch.py自动拉起Gazebo、controller_manager、move_group节点、RViz2;此时MoveIt轨迹下发到Gazebo物理引擎执行,实现闭环仿真。
步骤5:C++ MoveGroupInterface API编程实验
编写节点,实现:①回home预定义位姿;②指定末端目标位姿规划运动;③编程添加碰撞障碍物。
核心代码片段:
#include <rclcpp/rclcpp.hpp> #include <moveit/move_group_interface/move_group_interface.h> #include <moveit/planning_scene_interface/planning_scene_interface.h> int main(int argc,char** argv) { rclcpp::init(argc,argv); auto node = std::make_shared<rclcpp::Node>("moveit_api_demo"); moveit::planning_interface::MoveGroupInterface arm_group(node,"arm"); arm_group.setPlanningTime(5.0); //1.回到预定义home位姿 arm_group.setNamedTarget("home"); arm_group.move(); //2.设置末端目标位姿规划 geometry_msgs::msg::Pose target_pose; target_pose.position.x=0.776; target_pose.position.y=0.432; target_pose.position.z=2.718; target_pose.orientation.w=0.9993; arm_group.setPoseTarget(target_pose); moveit::planning_interface::MoveGroupInterface::Plan plan; bool ok = (arm_group.plan(plan)==moveit::core::MoveItErrorCode::SUCCESS); if(ok) arm_group.execute(plan); //3.PlanningSceneInterface添加立方体障碍物 moveit::planning_interface::PlanningSceneInterface scene; moveit_msgs::msg::CollisionObject box; box.id="obstacle_box"; box.header.frame_id="base_link"; shape_msgs::msg::SolidPrimitive prim; prim.type=prim.BOX; prim.dimensions={0.2,0.2,0.2}; geometry_msgs::msg::Pose box_pose; box_pose.orientation.w=1.0; box_pose.position.x=0.7;box_pose.position.y=-0.5;box_pose.position.z=1.0; box.primitives.push_back(prim); box.primitive_poses.push_back(box_pose); box.operation=box.ADD; std::vector<moveit_msgs::msg::CollisionObject> objs{box}; scene.addCollisionObjects(objs); rclcpp::shutdown(); return 0; }CMakeLists.txt关键配置:
find_package(moveit_ros_planning_interface REQUIRED) ament_target_dependencies(demo_node rclcpp moveit_ros_planning_interface geometry_msgs)编译运行:
colcon build && source install/setup.bash ros2 run rosbook_arm_pick_and_place demo_node观察RViz2,机械臂运动,场景出现障碍物,再次规划,观察避障。
步骤6:Pick‑Place抓取放置全流程仿真
两种模式:demo虚拟模式 / Gazebo物理仿真模式
1)演示模式(仅运动学可视化)
终端1:
ros2 launch rosbook_arm_moveit_config demo.launch.py终端2运行pick_and_place程序:
ros2 run rosbook_arm_pick_and_place pick_and_place.py2)Gazebo物理仿真模式
终端1启动Gazebo抓取世界:
ros2 launch rosbook_arm_gazebo rosbook_arm_grasping_world.launch.py终端2运行抓取程序:
ros2 run rosbook_arm_pick_and_place pick_and_place.py任务现象:程序自动添加桌子、待抓取方块物体;机械臂运动至预抓取点,接近物体,夹爪闭合,抬起物体;运动至放置位置,下降,夹爪打开,退回安全位姿。
原理:使用
Pickup、PlaceAction,多候选抓取姿态,碰撞检测,抓取时物体附加到夹爪连杆上。
拓展选做:Octomap点云避障
配置sensors_rgbd.yaml,订阅深度相机点云话题/rgbd_camera/depth/points,PointCloudOctomapUpdater插件生成八叉树碰撞地图,实现动态未知障碍物避障。
五、实验现象记录
1.记录Setup Assistant生成的SRDF中自碰撞矩阵;
2.记录RViz交互规划截图:目标位姿、绿色无碰轨迹、红色碰撞提示;
3.记录C++ API运行输出,障碍物添加后规划路径变化;
4.记录Pick‑Place仿真全过程:预抓取→闭合夹爪→抬升→放置退回;
5.记录规划失败现象:目标不可达、路径发生碰撞,思考失败原因。
六、思考题
- 简述MoveIt2的move_group三层架构与完整数据流。
- Setup Assistant中Self‑Collision采样的作用是什么?采样次数对规划效率的影响?
- demo.launch.py与Gazebo仿真启动区别?虚拟控制器与真实ros2_control控制器差异。
- Pick任务时,物体如何跟随夹爪运动?规划场景发生什么变化?
- 规划时出现红色碰撞,有哪些排查思路?
七、实验报告要求
- 写出实验目的、原理;
- 关键命令、关键代码片段,附上RViz/Gazebo截图;
- 记录实验现象,回答思考题;
- 分析遇到问题:如规划失败、轨迹抖动、夹爪不动作,写出原因与解决方法。
八、常见故障排查
- move_group启动失败:检查SRDF、规划群组关节名称是否和URDF一致;
- Gazebo中机械臂不运动:确认controller_manager正常加载JointTrajectoryController,joint_states话题有输出;
- Pick抓取失败:抓取姿态不合适,物体与夹爪碰撞,需要调整pre‑grasp预备距离。