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

资讯详情

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

机械臂避障规划实战:从RRT采样到轨迹平滑的MATLAB实现

机械臂避障规划实战:从RRT采样到轨迹平滑的MATLAB实现 机械臂避障规划这件事刚入门的时候我也觉得挺玄乎——明明在RViz里看着末端走直线走得好好的一上真机就撞桌子仿真里规划出来的路径像蚯蚓爬关节抖得跟筛糠一样。后来啃了不少论文、翻了不少开源代码才慢慢把从RRT采样到轨迹平滑这一整条链路摸清楚。这篇就把我踩过的坑、调过的参数、验证过的流程完整梳理一遍围绕RRT、机械臂、避障规划、轨迹平滑、MATLAB这几个核心点展开适合刚接触机械臂运动规划的学生、做毕业设计的同学以及想把仿真流程跑通的工程师参考。全文以MATLAB为主要工具但思路对Python、ROS环境同样适用。1. 为什么机械臂避障不能只靠逆运动学1.1 逆运动学的天真假设在高维空间里会失效很多人第一次做机械臂规划思路特别直接给定起点和终点用逆运动学IK解出关节角然后关节空间插值走一条直线。这个做法在无障碍、短距离、构型简单的情况下确实能用但只要环境里多一个障碍物问题立刻暴露。原因在于逆运动学只关心末端能不能到它完全不关心中间过程会不会撞。机械臂是个高维系统一个6自由度机械臂的构型空间是6维的末端在笛卡尔空间走一条直线映射回关节空间可能是一条极其扭曲的曲线。这条曲线在关节空间里绕来绕去很可能让某个连杆扫过障碍物。你在笛卡尔空间看末端轨迹是干净的直线但肘部、腕部早就穿模了。更麻烦的是逆运动学本身可能无解或者多解。工作空间边缘、奇异位形附近IK要么解不出来要么解出来的关节角跳变巨大。我见过一个案例末端只移动了5厘米某个关节角从30度直接跳到150度真机上这一下足以把线缆扯断。1.2 构型空间与工作空间的本质区别这里必须把两个概念掰开讲清楚因为后面所有算法都建立在这个认知上。工作空间Cartesian Space是末端执行器能到达的三维位置集合我们平时画图、看轨迹都在这个空间里。构型空间Configuration Space简称C-space是机械臂所有关节角的组合空间维度等于自由度数。避障规划真正发生的地方是构型空间不是工作空间。障碍物在构型空间里的投影叫C-obstacle机械臂的当前构型是一个点。规划的本质是在C-space里找一个从起点构型到终点构型的连续路径且这个路径上的每个点都不落在任何C-obstacle里。听起来简单但C-obstacle的形状极其复杂通常是非凸、甚至不连通的没法用解析式表达只能通过碰撞检测函数隐式判断。这就是为什么基于采样的方法RRT系列会成为主流——它们不需要显式构造C-obstacle只需要一个能回答这个构型是否碰撞的黑盒函数就够了。1.3 采样规划与优化规划的分工机械臂规划算法大致分两派类别代表算法优点缺点采样规划RRT、RRT*、PRM、Bi-RRT高维空间可行、概率完备路径随机、不平滑、非最优优化规划CHOMP、STOMP、TrajOpt路径平滑、可加约束易陷局部最优、依赖初值实际工程里最稳的组合是先用采样规划找到一条可行路径再用优化或后处理把它平滑。这也是本文的主线——RRT负责找到路轨迹平滑负责走得好看、走得稳。两者缺一不可只做RRT你会得到一条锯齿状的、关节速度不连续的路径直接下发到控制器会让电机频繁急加减速寿命和精度都受影响。2. RRT算法在机械臂上的落地细节2.1 RRT的核心逻辑用一句话说清RRTRapidly-exploring Random Tree快速扩展随机树的思路非常朴素从起点开始长一棵树每次随机在C-space里撒一个点找到树上离它最近的节点朝那个方向走一小步如果这一步不碰撞就加进树里。重复这个过程直到树长到终点附近。它的优势是概率完备——只要路径存在采样次数足够多一定能找到。缺点是路径质量差因为随机采样导致路径歪歪扭扭而且不保证最优。用生活化的类比你在一个漆黑的迷宫里找出口手里只有一支粉笔。你随机朝一个方向走几步画条线撞墙了就退回来换个方向。走得多了总能摸到出口但走过的路线肯定不是最短最顺的。2.2 机械臂场景下RRT的关键参数在MATLAB里实现或调用RRT有几个参数直接决定成败我逐个说。步长Step Size每次朝随机点扩展的距离。太小树长得慢采样次数爆炸太大容易跨过狭窄通道或者直接撞进障碍物。经验值是关节空间范围的5%到10%。比如关节范围是±180度步长取10到20度比较合适。我一般先用15度试看规划时间和成功率再调。目标偏置概率Goal Bias每次采样时有一定概率直接朝终点采样而不是纯随机。这个值通常取0.05到0.2。太小树长得漫无目的太大容易在障碍物前反复撞墙。0.1是个不错的起点。最大迭代次数防止死循环。一般设5000到20000次取决于场景复杂度。如果超过这个次数还没找到路径要么是场景真的无解要么是参数需要调。碰撞检测分辨率从当前节点到新节点这一步中间要插值检查多少个点。机械臂的连杆是刚体两个构型之间如果只检查端点可能中间穿过了障碍物却没发现。分辨率要保证相邻检查点之间的关节角变化足够小通常让末端移动不超过1到2厘米。2.3 双向RRT为什么比单向快单向RRT从起点长一棵树要一直长到终点附近采样效率低。双向RRTBi-RRT从起点和终点各长一棵树交替扩展只要两棵树连上就成功。实测下来在同样的场景里双向RRT的规划时间通常能降到单向的30%到50%。原理也直观两棵树相向生长覆盖空间的效率翻倍尤其在起点终点距离远、中间障碍多的情况下优势明显。MATLAB的Navigation Toolbox里plannerRRT支持双向模式自己写的话就是在每次迭代后尝试连接两棵树的最近节点。不过双向RRT也有个坑两棵树连接的那一刻连接点附近的路径可能特别扭曲因为两棵树的生长方向不一定对齐。这个后面平滑阶段要重点处理。2.4 碰撞检测整个流程的性能瓶颈说句实话RRT跑得慢90%的时间花在碰撞检测上。每次扩展都要判断新构型是否碰撞而碰撞检测本身要算连杆的几何位置、和障碍物做相交测试。在MATLAB里如果用的是checkCollision这类函数配合rigidBodyTree底层是解析几何计算速度还行。但如果障碍物是复杂的网格模型或者你自己写包围盒检测那性能会急剧下降。几个提速技巧用包围盒做粗筛先用AABB轴对齐包围盒快速排除明显不碰撞的情况只有粗筛通过才做精确检测。缓存碰撞结果同一个构型可能被多次查询用哈希表缓存起来。降低检测频率不是每一步都全量检测可以先用大步长粗检发现可疑再细分。并行化MATLAB的parfor可以把多个候选构型的检测并行跑多核机器上提速明显。我做过一个对比6自由度机械臂、20个球形障碍物的场景优化前单次规划要8秒加上包围盒粗筛和缓存后降到1.2秒效果非常明显。3. 从锯齿路径到平滑轨迹的完整处理链3.1 RRT原始路径为什么不能直接用RRT规划出来的路径本质是一串离散的构型点。相邻点之间的关节角变化是随机的可能这一步关节1动20度下一步关节1不动但关节3动30度。如果你直接把这些点做线性插值下发关节速度会剧烈波动加速度更是接近脉冲。真机上的表现就是电机发出咔咔的异响末端抖动定位精度下降严重时触发过流保护。仿真里可能看不出来但一旦上真机问题全暴露。所以从RRT路径到可执行轨迹中间必须经过几步处理路径剪枝 → 路径平滑 → 时间参数化 → 速度/加速度约束。下面逐个拆。3.2 路径剪枝先去掉冗余点RRT路径里大量点是绕路产生的。剪枝的思路很简单从起点开始尝试直接连到尽可能远的后续点如果这条直线段不碰撞就把中间的点全删掉。具体做法是贪心设当前点为p_i从最远的p_jj从末尾往前开始试如果p_i到p_j的直线段碰撞检测通过就保留p_j把i到j之间的点删掉然后以p_j为新起点继续。这样一轮下来路径点数量通常能减少60%到80%。剪枝后的路径还是折线但拐点少了很多为后续平滑打好基础。注意剪枝时的碰撞检测分辨率要调高因为现在检查的是长直线段中间穿模的风险更大。3.3 轨迹平滑的三条主流路线平滑这一步方法很多我按实用程度排序讲。第一条路B样条/多项式插值。把剪枝后的路径点当作控制点用三次或五次B样条拟合。B样条的好处是曲线天然光滑C2连续而且有局部支撑性——改一个控制点只影响附近一段。五次B样条还能保证加速度连续对机械臂特别友好。MATLAB里用spapi或bspline系列函数就能做。第二条路短路径平滑Shortcut Smoothing。随机选路径上的两个点尝试用直线或曲线替换中间段如果新段不碰撞且更短就接受。反复迭代路径会越来越短越来越顺。这个方法简单粗暴但有效缺点是随机性强需要跑很多次。第三条路优化方法CHOMP/STOMP。把平滑建模成一个优化问题目标函数包含平滑项惩罚加速度、加加速度和障碍项惩罚靠近障碍物用梯度下降求解。效果好但调参麻烦容易陷局部最优通常需要好的初值——正好可以用前面RRT剪枝的结果当初值。我的建议是B样条做基础平滑shortcut做补充优化优化方法在要求极高时再上。大部分项目B样条就够了。3.4 时间参数化让轨迹带上速度信息平滑完的几何路径还只是形状没有时间概念。时间参数化就是给路径上的每个点分配一个时间戳同时满足关节速度和加速度限制。最常用的是梯形速度规划加速段、匀速段、减速段。给定最大速度和最大加速度算出每段的时间。但机械臂是多关节耦合的每个关节的限制不同要取所有关节里最保守的那个作为整体限制。更精细的做法是S型速度规划也叫七段式加速度本身也平滑过渡避免加速度突变。这对高精度场景很重要因为加速度突变会引起机械臂振动。MATLAB里可以用trapveltraj或quinticpolytraj快速生成带时间信息的轨迹前者是梯形后者是五次多项式。我一般用quinticpolytraj因为它保证位置、速度、加速度都连续省心。3.5 一个完整的处理链示例把上面的步骤串起来一个典型的处理流程是RRT规划得到原始路径约200到500个构型点碰撞检测剪枝压缩到20到50个关键点三次B样条拟合生成光滑几何路径沿路径密集采样比如1000个点做碰撞复检五次多项式时间参数化生成位置、速度、加速度轨迹下发到仿真或控制器验证这套流程我在多个项目里用过从6自由度到7自由度机械臂都适用。关键是第4步的复检不能省——B样条拟合后曲线可能偏离原始路径有撞上障碍物的风险。4. MATLAB仿真实操与常见坑4.1 环境搭建与工具箱选择MATLAB做机械臂规划核心工具箱是Robotics System Toolbox和Navigation Toolbox。前者提供rigidBodyTree建模、逆运动学、碰撞检测后者提供RRT、PRM等规划器。如果做轨迹优化可能还需要Optimization Toolbox。安装时注意版本匹配R2021b之后的版本对机械臂规划支持比较完善。老版本可能缺少某些函数比如manipulatorRRT就是较新版本才有的。装好后用ver命令确认工具箱都在。建模方面可以用URDF导入现成模型比如UR5、Panda也可以自己用rigidBody和joint搭。导入URDF最省事importrobot(ur5.urdf)一行搞定但要注意URDF里的关节限制和实际是否一致。4.2 一个可复现的RRT规划脚本骨架下面是我常用的脚本结构去掉具体模型细节保留核心逻辑% 1. 加载机械臂模型 robot importrobot(your_robot.urdf); robot.DataFormat column; % 2. 设置环境障碍物 env collisionBox(0.5, 0.5, 0.5); env.Pose trvec2tform([0.4, 0, 0.3]); % 3. 创建RRT规划器 planner manipulatorRRT(robot, {env}); planner.StepSize deg2rad(15); planner.GoalBias 0.1; planner.MaxConnectionDistance deg2rad(20); planner.ValidationDistance 0.01; % 4. 设置起止构型 startConfig homeConfiguration(robot); goalConfig [-0.5, 0.3, 0.2, -1.0, 0.5, 0.8]; % 5. 规划 [path, solnInfo] plan(planner, startConfig, goalConfig); % 6. 剪枝与插值 path interpolate(planner, path, 50); % 7. 平滑用B样条 t linspace(0, 1, size(path, 1)); tt linspace(0, 1, 500); smoothPath spline(t, path, tt);这段代码跑通后smoothPath就是平滑后的轨迹。注意interpolate这一步很关键它把稀疏的路径点加密避免后续平滑时曲线偏离太远。4.3 可视化别只看末端要看整个机械臂新手最容易犯的错是只画末端轨迹看着挺顺就以为没问题。实际上碰撞可能发生在连杆中段。MATLAB里用show(robot, config, Collisions, on)可以把碰撞的连杆高亮显示规划过程中一定要开着这个选项。另外建议把C-space里的路径也画出来。虽然6维没法直接可视化但可以画关节角随时间的变化曲线看有没有突变。如果某个关节角曲线出现尖峰说明那里有奇异或碰撞风险。4.4 踩坑实录那些让我debug到凌晨的问题坑一URDF单位和MATLAB不一致。有些URDF用米有些用毫米导入后机械臂尺寸差1000倍碰撞检测全乱套。导入后第一件事是用show看一眼确认尺寸正常。坑二关节限制没设对。URDF里的关节限制可能和实际机械臂不符导致规划出的构型真机根本到不了。一定要对照实际参数核对。坑三碰撞检测的ValidationDistance太大。默认值可能让检测跳过中间点导致路径穿模。我一般设成0.01单位取决于模型宁可慢一点也要准。坑四平滑后没复检。B样条拟合后曲线会偏离原始路径我遇到过一次平滑后末端撞上障碍物的情况。后来养成习惯平滑后一定重新做碰撞检测。坑五时间参数化时速度限制取错。多关节机械臂每个关节的速度限制不同要取最小值。我有次只看了关节1的限制结果关节4超速仿真里电机直接报错。坑六RRT的随机性导致结果不可复现。每次跑结果都不一样调试很痛苦。解决办法是固定随机种子rng(42)这样每次结果一致方便对比参数。4.5 性能调优的几个实用手段规划慢的时候按这个顺序排查碰撞检测是不是瓶颈用tic/toc包住碰撞检测函数看占比。如果超过70%优化碰撞检测。步长是不是太小步长翻倍试试规划时间通常能降一半。场景是不是过于复杂障碍物太多会拖慢检测考虑用凸包简化障碍物。能不能用双向RRT换成双向模式时间通常减半。能不能并行多起点同时规划取最快的结果。我做过一组对比数据同一个6自由度机械臂场景配置规划时间路径点数平滑后最大加速度单向RRT步长10度6.8s312高单向RRT步长20度3.2s156高双向RRT步长20度1.5s98中双向RRT剪枝B样条1.8s45低可以看到双向RRT加后处理总时间反而比纯单向RRT短而且轨迹质量高得多。这个账要算总账不能只看规划那一步。5. 动态避障与进阶方向5.1 静态规划够用吗前面讲的都是静态场景——障碍物不动规划一次就行。但实际应用中障碍物可能是移动的比如传送带上的工件、协作场景里的人这时候静态规划就不够了。动态避障有两条路重规划和局部调整。重规划是检测到障碍物移动后重新跑一遍RRT简单但计算量大高频重规划扛不住。局部调整是在原轨迹基础上做微调比如用速度障碍法VO或者模型预测控制MPC计算量小但可能陷局部最优。工程上常用的是混合策略低频重规划比如每秒1次 高频局部调整每秒10次以上。5.2 RRT* 值不值得上RRT* 是RRT的渐近最优版本通过重连操作不断优化路径。理论上采样次数趋于无穷时路径收敛到最优。但实际中RRT* 的计算量比RRT大不少而且收敛慢很多时候跑几千次迭代路径质量提升有限。我的建议是如果对路径长度有硬性要求用RRT否则RRT剪枝平滑的性价比更高*。RRT* 的重连操作在高维空间里开销很大6自由度以上优势不明显。5.3 从仿真到真机还差什么仿真跑通只是第一步上真机还有几道坎标定误差仿真里的模型和真机总有偏差DH参数、连杆长度、关节零点都可能不准。上真机前要做手眼标定和关节零点校准。控制器差异仿真里下发位置指令就行真机可能要下发速度或力矩控制模式不同轨迹要重新适配。通信延迟真机的指令下发有延迟轨迹要留够缓冲或者做时间缩放。安全边界真机要留比仿真更大的安全距离因为标定误差和动态变形都会吃掉余量。我一般建议先在仿真里把安全距离放大20%跑通后再逐步缩小到实际值。5.4 几个值得深入的方向如果这个项目做完了想继续深入几个方向可以参考基于学习的规划用强化学习或模仿学习直接学规划策略避开传统采样的随机性。缺点是训练成本高、泛化性待验证。多机械臂协同规划多个机械臂共享工作空间规划时要考虑互相避让C-space维度翻倍难度陡增。人机协作人进入工作空间后机械臂要实时避让对响应速度要求极高通常需要结合视觉感知。轨迹优化与控制的联合设计把规划和控制放在一个框架里优化而不是分开做能进一步提升性能。这些方向门槛都不低建议先把本文这条基础链路吃透再往上叠。最后分享一个我自己的习惯每次调完参数把规划时间、路径长度、最大关节速度、最大加速度这几个指标记下来做成表格对比。参数调优是个反复试错的过程没有记录根本记不住哪个组合效果好。我现在的项目里这套记录表已经积累了几十组数据新场景来了直接查表找相近的配置能省大量时间。RRT这类采样算法理论归理论实际效果全靠参数和场景的匹配多试多记才是正道。
返回列表