尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

第137篇 MoveIt2入门——机械臂运动规划的ROS2方案

第137篇 MoveIt2入门——机械臂运动规划的ROS2方案 面试翻车现场面试一家做机械臂的公司面试官问MoveIt2用过吗运动规划的基本流程是什么我说用过就是配置好机械臂模型然后调用规划接口。他追问MoveIt2里Planning Scene是什么运动规划算法有哪些可以选怎么自定义约束条件这几个问题我答得比较笼统。面试官说MoveIt2是机械臂开发的标准工具面试做机械臂方向的基本都会问到。MoveIt2是什么MoveIt2是ROS2生态中机械臂运动规划的标准框架。它整合了运动规划、碰撞检测、逆运动学求解、轨迹执行等功能提供了一套完整的机械臂控制解决方案。MoveIt2的核心思想是你只需要描述机械臂的结构通过MoveIt配置助手生成SRDF文件和环境Planning Scene剩下的规划、求解、执行都由框架来处理。它的主要组件包括MoveGroup核心规划节点、MoveIt Setup Assistant配置工具、Rviz插件可视化交互、Motion Planners各种规划算法插件。MoveIt配置助手使用MoveIt2的第一步是用MoveIt Setup Assistant配置你的机械臂。这个工具会引导你完成一系列设置加载URDF、定义规划组Planning Group、设置末端执行器、定义允许碰撞矩阵、生成SRDF和配置文件。规划组是一组需要一起规划的关节。比如一个6轴机械臂你可以把所有6个关节定义为一个规划组。如果机械臂末端还有一个夹爪夹爪的关节可以定义成另一个规划组。允许碰撞矩阵ACM定义了哪些link之间可以忽略碰撞检测。比如相邻的两个link永远不会碰撞就可以加入ACM。这能显著减少碰撞检测的计算量。配置完成后Setup Assistant会生成一个MoveIt配置包包含SRDF文件、kinematics配置、Joint limits配置、各种YAML参数文件。这些文件就是你后续使用MoveIt的基础。Planning ScenePlanning Scene是MoveIt2中描述环境的核心概念。它包含了当前世界中所有物体的信息——机械臂自身的位置、障碍物的位置和形状、允许抓取的对象等。Planning Scene是动态的。你可以随时添加或删除物体。比如你通过视觉检测到一个新的障碍物可以把它添加到Planning Scene中MoveIt在规划时就会自动避开它。添加物体通常是通过PlanningSceneInterface这个C或Python API来操作。你可以添加立方体、圆柱体、网格模型等作为碰撞体。也可以添加附着物体Attached Object比如夹爪夹住的工件它会跟着末端一起运动。Planning Scene的维护是MoveIt使用中容易被忽视但很重要的环节。如果场景描述不准确比如漏掉了实际存在的障碍物规划出来的轨迹就可能和真实环境发生碰撞。运动规划算法MoveIt2支持多种运动规划算法通过插件机制加载。OMPLOpen Motion Planning Library最常用的采样规划库。支持RRT、RRT、PRM、EST等十几种算法。默认用RRTConnect适合大多数场景。对于高维空间7轴以上机械臂可以试试RRT或BIT*它们能找到更优的解。Pilz Industrial Motion Planner工业场景常用的规划器。它不做随机采样而是生成确定性的轨迹——直线运动LIN、圆弧运动CIRC、点到点运动PTP。工业应用中对轨迹可预测性要求高这种确定性规划器更合适。STOMPStochastic Trajectory Optimization基于优化的规划器。它先随机生成一批轨迹然后通过优化迭代找到代价最小的那条。适合需要平滑轨迹的场景。CHOMPCovariant Hamiltonian Optimization也是基于优化的方法用梯度下降来优化轨迹避开障碍物。和STOMP类似但优化策略不同。选择规划器要根据场景工业场景用Pilz通用场景用OMPL的RRTConnect需要优化轨迹用STOMP或CHOMP。基本规划流程在代码中调用MoveIt2规划的流程是这样的。首先创建一个MoveGroupInterface对象指定你要控制的规划组名称比如arm。然后通过它设置目标——可以是末端位姿setPoseTarget也可以是关节角度setJointValueTarget。设置好目标后调用plan()或move()。plan()只规划不执行返回一个轨迹对象供你检查。move()规划并直接执行。建议先用plan()检查轨迹是否合理再决定是否执行。规划结果包含轨迹一系列关节角度、执行时间、规划耗时等信息。如果规划失败返回FAILURE通常是因为目标不可达、有碰撞、或者规划时间超时。move_group MoveGroupInterface(arm, node) move_group.set_pose_target(target_pose) success, plan, planning_time, error_code move_group.plan() if success: move_group.execute(plan, waitTrue)Python和C的API基本一致Python更适合快速开发C适合对性能有要求的场景。逆运动学求解MoveIt2的逆运动学IK求解也是面试常问的点。默认情况下MoveIt用KDLKinematics and Dynamics Library做IK求解。KDL是数值解法能处理任意构型的机械臂但可能找不到解或者找到局部最优解。对于6轴工业机械臂通常有解析解封闭解。MoveIt支持通过插件使用解析IK求解器比如为UR机械臂配置的ur_kinematics为FANUC配置的fANUC_kinematics。解析解速度快、精度高但每种机械臂需要单独实现。IK求解的一个关键参数是kinematics_solver_timeout。数值解法有超时限制如果在这个时间内找不到解就返回失败。对于复杂构型或者目标位姿在奇异点附近时可能需要增大超时时间。另一个重要的配置是kinematics_solver_attempts。它会尝试多次求解每次从不同的初始猜测开始。增大这个值可以提高找到解的概率但会增加计算时间。配置MoveIt时还有一个容易忽略的点SRDF中的disable_collisions标签要和实际机械结构匹配。如果相邻link之间漏配了允许碰撞规划器会花大量时间做不必要的碰撞检测导致规划速度明显变慢。再聊聊我在实际项目中使用MoveIt2的一些经验。当时我们做的是一个桌面级6轴机械臂的抓取系统用OMPL的RRTConnect做规划。一开始规划成功率只有70%左右排查后发现是Planning Scene里的碰撞体设得太大了——为了安全起见我们把每个障碍物都膨胀了一圈结果导致很多本来可达的目标位姿被判定为不可达。后来我们把碰撞体的膨胀量从5cm减小到2cm同时在障碍物和机械臂之间加了一层虚拟的安全壳用set_workspace和set_workspace_bounds配合规划成功率提升到了95%以上。这个经验告诉我MoveIt2的参数调优需要在安全性和可达性之间找平衡不能一味求安全。另外规划时间也是一个需要权衡的参数——默认5秒对实时系统来说太长了我们设成1.5秒配合多次重试最多3次大部分情况都能在可接受时间内找到解。面试时如果你能讲出这种参数权衡的实际案例会比只说API调用流程有说服力得多。面试中怎么聊面试官问MoveIt2你可以说MoveIt2是ROS2中机械臂运动规划的标准框架。使用流程是先用Setup Assistant配置SRDF然后维护Planning Scene描述环境再调用规划算法生成轨迹。支持OMPL采样类、Pilz确定性工业规划、STOMP/CHOMP优化类等多种算法。Planning Scene的准确性直接影响规划质量实际项目中要通过视觉或手动输入保持场景更新。上一篇第136篇 ros2_controllers——关节控制器、差速控制器的使用下一篇预告第138篇 MoveIt2进阶——场景配置、约束规划和拾取放置
返回列表