ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ROS 2 Lyrical 第7章 MoveIt 2机械臂运动规划与抓取仿真实操

ROS 2 Lyrical 第7章 MoveIt 2机械臂运动规划与抓取仿真实操 ROS 2 Lyrical 第七章 MoveIt 2机械臂运动规划与抓取仿真实操前言本章完整迁移ROS1 MoveIt!机械臂运动规划体系全量适配ROS 2 Lyrical MoveIt 2 Gazebo Garden ros2_control替换ROS1专属catkin、XML launch、actionlib、ros_control统一使用colcon、Python Launch、rclcpp_action、ros2_control标准接口。内容严格遵循MoveIt 2官方规范覆盖体系架构、配置助手生成功能包、RViz2可视化交互、Gazebo物理仿真集成、C/Python运动规划API、碰撞场景管理、点云感知避障、抓取放置全流程任务所有代码、启动文件、命令均可在Ubuntu26.04Lyrical环境直接复现。本章学习目标理解MoveIt 2体系结构move_group核心、规划群组、规划场景、运动学与碰撞检测使用MoveIt Setup Assistant生成完整机械臂配置功能包RViz2 MotionPlanning插件交互目标位姿设置、轨迹规划、碰撞检测可视化集成Gazebo ros2_control JointTrajectoryController实现物理仿真掌握MoveGroupInterface C API单目标规划、随机位姿、预定义群组状态规划场景碰撞物体增删、点云Octomap实时避障配置完成抓取放置全任务场景建模、抓取位姿生成、Pick/Place动作执行7.1 MoveIt 2概述与体系结构MoveIt 2是ROS2原生机械臂运动规划框架集成逆运动学求解、轨迹规划、碰撞检测、3D感知、抓取操作能力广泛应用于工业机械臂、协作机器人、移动操作臂开发。7.1.1 安装命令sudo apt install ros-lyrical-moveit-full ros-lyrical-moveit-setup-assistant源码工作空间一键安装依赖rosdep install --from-paths src --ignore-src -r -y7.1.2 核心体系架构MoveIt 2核心为move_group节点通过插件化架构整合运动规划、碰撞检测、运动学求解对外提供统一Action/服务/话题接口。三层架构用户接口层Cmoveit::planning_interface::MoveGroupInterfacePythonmoveit_commanderRViz2 MotionPlanning可视化插件Action服务move_action、pickup_action、place_action核心算法层move_group内部运动规划器默认OMPL开放式运动规划库支持CHOMP、STOMP等扩展运动学求解默认KDL数值逆解支持IKFast解析解插件碰撞检测FCL弹性碰撞库支持网格、基本体、Octomap点云碰撞规划场景维护机器人状态、环境障碍物、点云地图硬件适配层JointTrajectoryController轨迹控制器ros2_control硬件抽象接口/joint_states关节状态反馈TF2坐标变换体系数据流逻辑用户下发目标位姿 → move_group校验运动学可行性 → 规划器在碰撞约束下搜索无碰轨迹 → 时间参数化生成带速度加速度的轨迹 → 下发轨迹控制器 → 硬件/Gazebo执行 → 关节状态回传更新规划场景。7.2 MoveIt Setup Assistant配置助手图形化向导工具导入机械臂URDF后自动生成全套MoveIt配置文件、启动脚本、SRDF语义机器人描述文件是新建机械臂配置的标准入口。7.2.1 启动命令ros2 launch moveit_setup_assistant setup_assistant.launch.py7.2.2 配置全流程7步步骤1新建配置包选择「Create New MoveIt Configuration Package」导入机械臂Xacro/URDF文件例如rosbook_arm_description/urdf/rosbook_arm_base.urdf.xacro。步骤2自碰撞矩阵生成自动采样上万组随机位姿计算连杆碰撞对禁用永远不碰撞、相邻连杆的碰撞检测大幅提升规划效率。采样密度越高越准确计算耗时越长默认10000次采样生成禁用碰撞对列表存储于SRDF文件步骤3虚拟关节用于连接世界坐标系与机械臂底座固定底座机械臂无需虚拟关节移动平台顶部机械臂添加虚拟关节父级odom子级base_link类型为浮动关节步骤4规划群组Planning Groups将一组关节定义为统一规划单元是MoveIt最小规划单位。标准机械臂至少创建两个群组arm机械臂本体所有旋转关节运动学求解器选KDLgripper夹持器开合关节控制夹爪张合步骤5预定义位姿Robot Poses保存常用关节角度组合一键调用home机械臂收纳初始位姿grasp_prepare抓取预备位姿fold折叠运输位姿步骤6末端执行器End Effectors指定夹持器群组、父连杆通常为腕部tool_linkMoveIt抓取规划会自动匹配末端坐标系。步骤7生成配置包指定输出路径自动生成config/SRDF文件、运动学配置、OMPL规划器参数、关节限位、控制器配置launch/move_group启动、demo演示、RViz2可视化全套Python launch文件package.xml、CMakeLists.txtament_cmake标准功能包结构7.3 RViz2 MotionPlanning可视化插件MoveIt 2原生RViz2插件支持交互式目标设置、轨迹预览、执行控制、场景物体管理是调试机械臂的核心工具。7.3.1 启动演示模式无需仿真/硬件ros2 launch rosbook_arm_moveit_config demo.launch.py内置虚拟控制器仅做运动学规划仿真快速验证机械臂可达空间。7.3.2 核心面板功能Planning规划选项卡Query目标设置拖拽交互式6D标记调整末端位姿输入关节角度数值选择预定义群组状态Commands操作Plan仅规划轨迹橙色半透明机械臂显示目标位姿Execute执行已规划轨迹Plan and Execute一键规划并执行Options参数规划时间上限、最大尝试次数、允许重规划、目标容差可视化状态说明白色当前机械臂真实状态橙色目标位姿预览红色连杆发生碰撞/目标越界不可达绿色规划成功的轨迹路径Scene Objects场景物体选项卡手动添加/删除立方体、球体、圆柱体障碍物测试避障规划效果。7.4 Gazebo物理仿真集成通过ros2_controlJointTrajectoryController实现MoveIt轨迹下发、Gazebo物理执行、关节状态回传闭环。7.4.1 必备功能包分层结构功能包作用rosbook_arm_descriptionURDF/Xacro模型、网格、传感器rosbook_arm_controllersros2_control控制器yaml配置rosbook_arm_gazeboGazebo世界文件、仿真启动脚本rosbook_arm_bringup一体化启动仿真控制器MoveItrosbook_arm_moveit_configMoveIt配置包助手生成7.4.2 关键配置1. URDF集成ros2_control插件Xacro中添加Gazebo ros2_control插件gazebo plugin namegazebo_ros2_control filenamelibgazebo_ros2_control.so parameters$(find rosbook_arm_controllers)/config/controllers.yaml/parameters /plugin /gazebo2. 控制器配置 controllers.yamlcontroller_manager: ros__parameters: update_rate: 100 arm_controller: type: joint_trajectory_controller/JointTrajectoryController gripper_controller: type: joint_trajectory_controller/JointTrajectoryController arm_controller: ros__parameters: joints: - shoulder_joint - upper_arm_joint - forearm_joint - tool_joint command_interfaces: position state_interfaces: position3. MoveIt控制器适配MoveIt通过FollowJointTrajectoryAction接口向控制器下发轨迹配置文件指定控制器名称与对应关节群组。7.4.3 启动全仿真MoveIt命令ros2 launch rosbook_arm_gazebo rosbook_arm_empty_world.launch.py自动启动Gazebo仿真、控制器管理器、move_group节点、RViz2插件。7.5 运动规划C API实操MoveGroupInterface是MoveIt 2核心编程接口支持所有RViz插件可实现的规划操作。7.5.1 基础头文件与节点初始化#include rclcpp/rclcpp.hpp #include moveit/move_group_interface/move_group_interface.h #include moveit/planning_scene_interface/planning_scene_interface.h using namespace std::chrono_literals; int main(int argc, char** argv) { rclcpp::init(argc, argv); auto node std::make_sharedrclcpp::Node(moveit_demo); // 声明规划群组为arm moveit::planning_interface::MoveGroupInterface arm_group(node, arm); arm_group.setPlanningTime(5.0); // 单次规划最长时间 arm_group.setGoalTolerance(0.02); // 目标位姿容差7.5.2 单目标位姿规划// 设置末端目标位姿 geometry_msgs::msg::Pose target_pose; target_pose.orientation.x -0.0007; target_pose.orientation.y 0.0366; target_pose.orientation.z 0.0092; target_pose.orientation.w 0.9993; target_pose.position.x 0.776; target_pose.position.y 0.432; target_pose.position.z 2.718; arm_group.setPoseTarget(target_pose); // 执行规划 moveit::planning_interface::MoveGroupInterface::Plan plan; bool success (arm_group.plan(plan) moveit::core::MoveItErrorCode::SUCCESS); if(success) arm_group.execute(plan);7.5.3 随机有效位姿规划// 获取当前机器人状态 auto current_state arm_group.getCurrentState(); const moveit::core::JointModelGroup* joint_group current_state-getJointModelGroup(arm); // 随机采样有效位姿 current_state-setToRandomPositions(joint_group); // 设为目标并规划 arm_group.setJointValueTarget(*current_state); arm_group.plan(plan);7.5.4 预定义群组状态规划// 一键回到home预定义位姿 arm_group.setNamedTarget(home); arm_group.move();7.5.5 轨迹可视化发布moveit_msgs::msg::DisplayTrajectory display_msg; display_msg.trajectory_start plan.start_state; display_msg.trajectory.push_back(plan.trajectory); auto display_pub node-create_publishermoveit_msgs::msg::DisplayTrajectory( /move_group/display_planned_path, 10); display_pub-publish(display_msg);编译配置CMakeLists.txtfind_package(moveit_ros_planning_interface REQUIRED) ament_target_dependencies(demo_node rclcpp moveit_ros_planning_interface geometry_msgs)7.6 碰撞场景与避障规划7.6.1 编程添加/移除碰撞物体使用PlanningSceneInterface向规划场景注入障碍物MoveIt规划时自动避障。moveit::planning_interface::PlanningSceneInterface scene; // 创建立方体障碍物 moveit_msgs::msg::CollisionObject box; box.id obstacle_box; box.header.frame_id base_link; shape_msgs::msg::SolidPrimitive primitive; primitive.type primitive.BOX; primitive.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(primitive); box.primitive_poses.push_back(box_pose); box.operation box.ADD; std::vectormoveit_msgs::msg::CollisionObject objects{box}; scene.addCollisionObjects(objects);移除物体std::vectorstd::string remove_ids{obstacle_box}; scene.removeCollisionObjects(remove_ids);7.6.2 点云Octomap实时避障深度相机/RGBD传感器输出点云MoveIt通过Octomap八叉树地图构建三维碰撞环境实现动态障碍物避障。配置文件 sensors_rgbd.yamlsensors: - sensor_plugin: occupancy_map_monitor/PointCloudOctomapUpdater point_cloud_topic: /rgbd_camera/depth/points max_range: 10.0 point_subsample: 1 padding_offset: 0.01 padding_scale: 1.0在move_group启动文件中加载该配置点云数据自动更新规划场景碰撞体规划路径自动绕开点云检测到的障碍物。7.7 抓取与放置全任务实操典型工业Pick Place任务流程场景建模 → 生成抓取位姿 → 接近抓取 → 闭合夹爪 → 抬起 → 移动到放置点 → 张开夹爪 → 退回。7.7.1 规划场景初始化编程添加支撑桌面与目标物体# Python MoveIt Commander示例 from moveit_commander import PlanningSceneInterface, RobotCommander scene PlanningSceneInterface() # 添加桌子 scene.add_box(table, pose_stamped, (1.5, 0.8, 0.03)) # 添加可乐罐目标物体 scene.add_box(coke_can, coke_pose, (0.15, 0.15, 0.3))7.7.2 抓取位姿生成使用moveit_grasps功能包生成多组候选抓取位姿从不同角度接近物体提升抓取成功率。配置夹持器参数预张开口径、闭合口径、接近方向、接近距离。7.7.3 Pick抓取动作执行MoveIt 2提供PickupAction接口自动完成接近、抓取、抬起三步序列from moveit_msgs.action import Pickup from rclpy.action import ActionClient pick_client ActionClient(node, Pickup, /pickup) goal Pickup.Goal() goal.target_name coke_can goal.group_name arm goal.possible_grasps generated_grasps抓取成功后物体自动附加到夹持器随机械臂同步运动碰撞检测同步更新。7.7.4 Place放置动作执行PlaceAction接口自动完成下降、张开夹爪、退回序列from moveit_msgs.action import Place place_client ActionClient(node, Place, /place) goal Place.Goal() goal.attached_object_name coke_can goal.place_locations place_poses7.7.5 两种运行模式演示模式虚拟控制器仅运动学可视化快速验证抓取逻辑ros2 launch rosbook_arm_moveit_config demo.launch.py ros2 run rosbook_arm_pick_and_place pick_and_place.pyGazebo仿真模式物理引擎真实模拟夹持、物体搬运ros2 launch rosbook_arm_gazebo rosbook_arm_grasping_world.launch.py ros2 run rosbook_arm_pick_and_place pick_and_place.py本章小结1 MoveIt 2以move_group为核心插件化整合运动规划、碰撞检测、运动学求解对外提供统一C/Python/可视化接口2 Setup Assistant图形化向导一键生成标准配置包涵盖SRDF、规划器、控制器、启动脚本大幅降低机械臂适配门槛3 RViz2 MotionPlanning插件支持交互式目标拖拽、轨迹预览、碰撞状态可视化是调试首选工具4 ros2_control JointTrajectoryController实现MoveIt与Gazebo/真实硬件的标准化对接软硬件接口一致5 MoveGroupInterface API覆盖单目标、随机位姿、预定义状态等全场景规划编程逻辑简洁清晰6 规划场景支持手动添加障碍物与点云Octomap两种模式满足结构化环境与动态未知环境避障需求7 Pick/Place Action接口标准化抓取放置任务支持多候选位姿重试可直接扩展到工业分拣、物料搬运场景。下一章预告ROS2传感器驱动与硬件集成涵盖激光雷达、深度相机、IMU、编码器等常用传感器的ROS2驱动部署与数据可视化。
返回列表