引言
2016年阿尔法围棋战胜人类棋手时,业内讨论最多的是它背后的强化学习框架,但很少人关注另一个细节:无论算法计算多么准确,最终执行操作的机械臂、移动底盘,依然需要一条一条精确到关节角度的运动指令。到了今天,具身智能成为资本与技术双热门词,各类机器狗、人形机器人、柔性抓取系统频繁亮相,真正决定这些设备能不能稳定完成任务的,恰恰是常被挂在嘴边、又很少被讲透的“运动规划”层。
我在这行摸爬滚打了差不多十年,从早期做传统工业机械臂的轨迹规划,到后来转入移动机器人与具身智能方向,最大的感受是:大家看Demo时都觉得算法神乎其神,真正自己上手调参时才发现,运动规划才是那个让千亿参数大模型落到物理世界的“最后一公里”。这篇内容不打算做概念轰炸,而是把具身智能运动规划这棵树的枝干完整梳理一遍:它解决的问题是什么、常用的方法流派有哪些区别、从模型到实机我踩过哪些坑、产业里真实落地又是怎么解构的。无论你是刚入门的研究生、想转行的工程师,还是只看技术方向的投资人,这篇都能帮你把脑子里模糊的概念拼图拼完整。
1. 具身智能运动规划到底在解决什么问题
1.1 三层结构里的中间枢纽
具身智能系统如果从上往下拆,大致可以分三层:最上层是认知决策层,负责处理传感器数据、理解环境、做长程任务规划,相当于人的大脑额叶;最下层是执行控制层,直接驱动电机、液压伺服系统,相当于人的肌肉与脊髓反射弧;夹在中间的,就是运动规划层,相当于大脑顶叶的意图编码区加小脑的运动协调机制。运动规划层接收上层下达的任务目标,比如“把这杯水端到对面桌子”,把它转换成一条从当前状态到目标状态的、满足物理约束的无碰撞路径,再交给下层去跟踪执行。
举个更具体的例子,一个双臂协作机器人要完成“从料框A抓取金属件,放到机床夹具B”的任务,它内部的决策层可能通过大模型规划出“抓取→搬运→放料”的步骤序列,但每一步怎么走——五关节或七关节在每一毫秒应该处于什么角度,臂架在三维空间里沿什么轨迹运动才不撞到料框边缘,速度和加速度控制在多少以内——这就是运动规划层要回答的问题。
1.2 三个核心问题的纠缠
运动规划在数学上通常被建模为:在配置空间(Configuration Space, C-Space)中,找到一条从起点位形到目标位形的连续路径,且该路径完全位于无碰撞区域。听起来很简洁,但实际落到具身智能场景,里面嵌套了三个彼此纠缠的问题:
第一是维度灾难。一个七自由度机械臂的配置空间本质是七维的,移动机器人的状态空间要叠加位置、朝向、速度甚至轮子打滑的不确定性,把三维空间里“找一条路”的直觉直接推广到高维空间,搜索复杂度会指数级暴涨。具身智能系统往往还要考虑抓取姿态、操作过程中的接触约束,状态空间维度只会更高。
第二是物理可行性。几何路径只保证不撞墙,但机器人执行时还要受关节力矩极限、速度极限、加速度极限、动力学约束的制约,一条几何上完美、却要求机械臂瞬移或急停的轨迹,在现实中根本走不通。这里衍生出运动规划另一个分支:轨迹规划与时间缩放。
第三是动态不确定性。环境不是静止的,人工操作时人被要求配合机器人,机器人如果原地“思考”太久,悬停的机械臂本身就可能成为安全隐患。感知延迟、模型误差、执行偏差这些噪声叠加,导致纯开环规划出来的路径往往跑不通,必须实时重规划。
1.3 市场开源方案与学术方法的断裂
行业内一个很尴尬的现状是:学术界顶会论文里的先进运动规划算法,和工业界能稳定运行的开源框架之间,有明显代沟。机器人操作系统(ROS)里最常用的运动规划库,核心还是十多年前的经典算法,配合一些改进的采样策略。一些新研究的算法在仿真基准测试里表现优秀,碰到实机环境的不确定性和零散标定误差,就很容易失效。
这种断裂恰恰说明,运动规划不是一个“算法越高级越好”的领域,而是一个必须理解底层约束、权衡计算资源与时延的系统工程问题。这部分心得,后面我会结合实机调试经历展开。
2. 主流技术流派:采样、搜索与优化的三条技术路线
2.1 基于采样的方法:用随机性对抗维度灾难
提到运动规划,绕不开快速探索随机树(RRT)家族和概率路图(PRM)。这类算法解决维度灾难的思路很直接:不在高维空间里做穷举,而是用随机采样点来近似描述自由空间。RRT的思想是从起点树往外随机生长,尝试延伸分支去连接目标;PRM则在自由空间预采样一批点,连接成图,再在上面跑图搜索。PRM面对静态已知环境效率高,适合多次查询;RRT适合单次快速规划,是机械臂在线规划的常客。
但基础RRT的输出结果通常很粗糙,路径曲折、转折生硬,直接给机器人执行会产生剧烈抖动。工程上通常会做两层改进:第一层是改用RRT-Connect或RRTStar这类双树或带优化的变种,RRTStar保留了“重新布线”机制,能在迭代中渐进优化路径代价;第二层是对规划结果做后处理,用捷径剪枝或者B样条平滑,把锯齿状路径修正为可执行的平滑轨迹。我实测下来的经验是,在机械臂七维空间里,RRT-Connect的规划速度是基础RRT的数倍到数十倍,RRTStar在维度较高时迭代成本不低,但如果只做一次粗略RESET再平滑,性价比很高。
这里要特别提一句“配置空间”的计算问题。机械臂的碰撞检测通常需要把连杆扫掠体转成包围盒,再用分层检测:先做球体或轴对齐包围盒(AABB)粗检测,再做精确网格相交。做不好这一步,采样算法再好也白搭,因为每次采样后查询“这个位形是否安全”才是计算开销的大头。
2.2 基于搜索的方法:在离散图中找最优
与采样法不同,基于搜索的方法,如A*、Dijkstra、混合A*,是在预先构造的离散栅格或拓扑图上做图搜索。栅格法的特点是把空间均匀切成格子,在格子之间寻路,精度受栅格分辨率影响很大:分辨率太粗,路径穿过缝隙时容易误判无碰撞;分辨率太细,内存和计算开销迅速上升,高维下基本不可用。
混合A是自动驾驶领域很经典的方案,它在栅格基础上做了扩展——每个节点不仅记录位置,还记录航向、曲率等连续状态量,扩展子节点时使用满足车辆运动学的“Reeds-Shepp曲线”或“Dubins曲线”连接,从而保证搜索路径天然满足非完整约束。这个思路在具身移动机器人上同样适用,比如差速驱动机器人在狭窄走廊掉头,纯几何A规划出来的路径可能要求机器人原地旋转,而混合A*能给出带弧度的实际可行路线。
2.3 基于优化的方法:把问题交给数值求解器
第三类思路最接近“最优控制”:把运动规划建模成带约束的优化问题,目标函数可以是路径长度、能量消耗、关节冲击,约束包括避障、关节极限、动力学方程。求解这类问题,常见的工具包括序列二次规划、内点法,以及专门针对轨迹优化的求解器。
轨迹优化在具身智能里应用特别火,前段时间各类全身控制的演示,底层几乎都有它的影子:把机器人建模为刚体动力学系统,把任务约束和接触约束写进优化目标,实时求解出全身关节力矩。这类方法的优点是生成的轨迹非常平滑、自然、节能,缺点是高度依赖初值,初始化不好或者求解器收敛慢,就会导致机器人卡死或者乱摆。所以实际系统里很少“只用优化”,常见做法是先走一个采样算法拿到粗略路径,再用优化算法精修,也就是业内常说的“先搜索后优化”双层架构。
2.4 强化学习与学习方法的补充视角
这波具身智能浪潮里,强化学习出镜率极高,从机器人后空翻到灵巧手转魔方,看上去运动规划问题被端到端解决了。但怎么说呢,端到端策略网络做的事情严格来说更像“运动生成”而不是“运动规划”——它学的是从感知状态到动作指令的映射,中间没有显式的路径搜索与约束校验过程。
工程上,纯粹靠端到端策略跑实机,最大的痛点是安全性和可解释性,你没法预判它在没见过的状态下会输出什么动作,也很难在部署时静态验证。所以当前更常见的组合是:用强化学习做高层技能生成,或者做底层跟踪器的自适应补偿,但显式的避障路径规划、关节极限保护仍然交给传统规划器。这种“古典+学习”的混合架构,在我接触的多个落地项目里都被验证更稳妥。
3. 实操篇:从零搭建一个带避障的机械臂运动规划Demo
3.1 场景设定与硬件约束
我们做一个非常简单但完整的Demo:一台六轴机械臂,工作台上有一个圆柱障碍物,目标是让机械臂末端从A点移动到B点,全程不碰障碍物。硬件上无需真实机械臂,完全可以在仿真环境(如带物理引擎的机器人仿真器)里验证,之后再迁移思路到实机。
第一步是建模。在仿真环境里导入机械臂的URDF文件,URDF里定义了每个关节的轴位置、连杆长度、质量、碰撞几何体。碰撞几何体太精细会导致后续碰撞检测特别慢,我习惯把每段连杆用一个或几个圆柱体/球体包裹起来,这是显式碰撞检测加速的关键。
3.2 编写规划节点:RRT-Connect加轨迹平滑
在机器人操作系统框架下,标准做法是用运动规划库提供的接口。为了讲清楚原理,这里给一段简化版Python示例,展示RRT-Connect的核心结构:
import numpy as np from dataclasses import dataclass @dataclass class Node: config: np.ndarray parent: int def rrt_connect(start, goal, sample_fn, steer_fn, collision_fn, max_iter=500): tree_a = [Node(np.array(start), -1)] tree_b = [Node(np.array(goal), -1)] for i in range(max_iter): rand_conf = sample_fn() node_a = nearest(tree_a, rand_conf) new_a = steer_fn(tree_a[node_a].config, rand_conf) if collision_fn(new_a): continue tree_a.append(Node(new_a, node_a)) node_b = nearest(tree_b, new_a) new_b = steer_fn(tree_b[node_b].config, new_a) if collision_fn(new_b): continue tree_b.append(Node(new_b, node_b)) # 双树最近距离小于阈值则连接成功 if np.linalg.norm(new_a - new_b) < 0.05: return build_path(tree_a, tree_b) return None这段代码省略了采样分布、碰撞检测的具体实现,但把双树扩展的核心思想表达清楚了:交替扩展两棵树,不断往对方方向生长,比单树扩展快很多。
实际工程中我不会真去重造轮子,而是直接调用运动规划库里的RRTConnect算法,它内部封装了采样、扩展、碰撞检测和路径后处理,使用方式大致是:定义好机器人模型和规划场景,设置起始关节角度和目标关节角度,调用规划接口获取路径,再把路径插值为平滑轨迹。核心参数有三个:规划超时时间(设为0.1到0.5秒比较合理)、目标偏置概率(设为0.1左右,太高容易陷入局部)、路径平滑的迭代次数。
3.3 轨迹插值与时间缩放
规划出来的路径是一连串关节角度点列,还需要把它们转成带时间戳的轨迹,才能送给底层控制器执行。最基础的插值方法是梯形速度规划或S型速度规划:对路径长度做归一化,用最大速度和最大加速度约束生成时间分配。
设某段路径在关节空间的长度为L,最大关节速度为v_max,最大加速度为a_max,分三段:匀加速段、匀速段、匀减速段,加速段时间t_ac=\frac{v_max}{a_max},加速段距离s_ac=\frac{1}{2}a_max t_ac^2。如果2 s_ac >= L,说明达不到最大速度,实际最大速度v_act=\sqrt{a_max L},总时间T=2\sqrt{L/a_max};否则T = \frac{L}{v_max} + \frac{v_max}{a_max}。
这段逻辑我最早在工业控制器里就写过,后来发现在仿真里很多人直接插值然后开环发指令,不加速度规划也可以,但一旦上实机,电机力矩限幅就会暴露问题。轨迹平滑和速度规划,是我反复坚持的两个步骤。
3.4 与感知模块的接口设计
运动规划不能脱离感知存在。简单Demo里,障碍物位置是手动标定的,但真实系统里障碍物来自相机。这里要特别注意坐标变换链路:相机检测到物体,得到的是相机坐标系下的坐标,要经过相机到机械臂基座的外参变换,才能用于规划。外参标定不准,是运动规划实机跑不通的第一大原因。
建议在代码里统一用变换树(TF)管理所有坐标系,每一步变换都打日志,确保障碍物坐标落在机械臂基座系下的误差在可接受范围。我见过太多团队在仿真里一切正常,实机一上就撞——最后查出来是外参差了那几十毫米。
4. 仿真实机迁移:那些文档不会告诉你的坑
4.1 仿真与实机的“非等价性”
所有人都知道仿真和实机有差距,但差距具体在哪,很多人其实是模糊的。第一层差距是几何模型误差:URDF里的连杆尺寸跟实际加工件有公差,碰撞网格简化导致“仿真里擦着过、实机里直接撞”。第二层是动力学参数误差:质量、质心、惯性张量在仿真里是精确值,实机上可能是重心偏置、额外负载,导致同样轨迹跟踪时力矩不同。第三层是控制延迟:仿真中指令即刻执行,实机中通信周期、伺服驱动器响应、滤波延时叠加,很容易产生相位滞后。
4.2 一个典型问题:路径抖动
我在一次抓取任务中遇到过非常典型的场景:机械臂沿着规划好的路径末端接近目标,定位精度始终差了2毫米,怎么调控制器都补不回来。后来逐帧检查关节角度跟踪误差,发现中间有个关节在规划轨迹的微小拐点处反复抖动,误差峰值为其它关节的三倍。根源是路径平滑参数设置过大,关节在小幅运动时速度规划低于其最低稳定速度,驱动器在摩擦力和指令之间产生极限环振荡。
解决方式很简单但容易忽略:对每个关节设置最小速度阈值,当规划速度低于该阈值时,直接用位置保持模式代替速度跟踪。这个坑后来被我整理进了团队的标准作业流程:上实机前,先离线回放轨迹,检查每个关节速度曲线是否连续、是否在驱动器稳定范围内。
4.3 重规划频率与延迟的取舍
动态环境中,运动规划必须是连续进行的。常见架构是“感知→预测→重规划→执行”以固定频率循环,频率设多高是核心权衡。频率太高,规划器来不及收敛,容易输出抖动路径;频率太低,反应迟钝,动态障碍物逼近时可能来不及避开。
我建议的起步参数是:规划频率5到10赫兹,碰撞检测缓存上一帧结果,感知延迟补偿用恒定速度外推模型。这样在大多数半结构化环境下,既能保证安全,也不会让CPU过载。实测中如果发现频繁规划失败,优先检查感知是否给出了稳定的障碍物位姿,而不是优化规划器本身——规划器背了太多感知锅。
4.4 安全机制:不要把所有信任交给规划器
规划器再聪明,也必须有底层的硬保护。实机部署时,我坚持三层安全机制:第一层是关节位置/速度/力矩硬限位,由伺服驱动器层面直接拦截;第二层是实时碰撞检测,哪怕规划器没更新,只要有异常受力就触发急停;第三层才是规划器的避障逻辑。这是顺序不能反,曾经见过团队为了追求“智能感”,取消了第二层硬保护,结果调试时唯一一次误判差点打坏夹具,教训很深。
5. 常见问题与排查思路速查表
5.1 规划器经常报“找不到路径”怎么办
这是新手最常遇到的问题。先别急着换算法,按这个顺序排查:第一,确认起始点和目标点本身不在障碍物内部,该问题经常出现在从示教器手动拖拽后记录的姿态,关节角合法但末端在夹爪闭合状态下陷入工件模型;第二,检查碰撞检测的几何模型与可视化模型是否一致,有时模型文件更新了可视化但碰撞体没同步更新;第三,增加规划超时时间,采样类算法是非完备的,较短超时找不到完全正常,可以把0.05秒放宽到0.5秒试验一下。
5.2 仿真中路径正常但实机撞障碍物
这类问题的“锅”九成不在规划器,而在于感知标定或执行精度。按概率排序的排查顺序是:外参标定误差、障碍物模型尺寸与实际不符、机械臂连杆末端实际姿态与规划姿态偏差、底层控制器跟踪误差过大。一个特别容易被忽略的点是,轴承间隙和连杆柔性在重载时会被放大,仿真里视为刚体的机器人在实机高速运动时末端下沉,走过的路径和规划几何路径是两个形状。
5.3 生成的轨迹过于曲折或抖动
解决方案路径有三条:一是增加路径平滑,对关节角度序列做低通滤波或样条拟合,但注意不要让平滑后的路径重新穿入障碍物,最好以平滑后的曲线做一次碰撞校验;二是在规划阶段就使用带优化变体的算法,让路径本身更干净;三是调低最大速度和加速度上限,给底层控制器更多跟踪裕度。很多时候轨迹抖动不是规划的问题,而是上层给得过快、底层跟踪不及。
5.4 实时性不够,CPU占用过高
运动规划最耗时的模块通常是碰撞检测。我在项目里启用多层碰撞检测后,规划耗时下降了约70%。具体来说:先做球体包围粗检测,再做凸包精确检测;另外可以采用增量碰撞检测,机械臂每次运动只有局部连杆位置变化,不用全模型重新计算。还有一个容易被忽略的点是采样空间的有效范围,很多时候你随机采样的点里可能有相当比例落在关节限位之外,可以直接在采样前用关节映射过滤掉,这比采样后再碰撞检测便宜得多。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 优先排查项 |
|---|---|---|
| 规划失败频繁 | 超时太短、碰撞模型过严 | 增加规划时长,检查模型一致性 |
| 实机撞障碍物 | 外参标定误差 | 验证相机到基坐标的变换手眼标定精度 |
| 轨迹抖振明显 | 跟踪带宽不足、轨迹过密 | 加大时间缩放,降低速度上限 |
| 关节超限报警 | 目标位姿不可达 | 调整任务位姿或在规划中加关节限位约束 |
| 运动过程异响 | 奇异点邻域关节速度突变 | 判断是否进入奇异区域,规划中禁止奇异附近路径 |
6. 产业落地:运动规划在具身智能体系中的位置
6.1 国产整机架构里的层级拆解
当前市场上的具身智能整机,无论是轮式底盘加机械臂的复合机器人,还人形机器人,其软件架构大体都可以拆成四层:基础驱动层、运动规划层、任务决策层、云端训练层。运动规划层处在驱动与决策之间,承担的职责是“保证任务决策在物理世界可执行且安全”。
这一层做得好不好,直接决定了整机的“好用程度”。决策层再聪明,如果规划层给不出平滑无碰撞的路径,机器人的体验就是“卡顿、犹豫、各种碰壁”。反过来,规划层特别扎实,哪怕决策层只是写死的有限状态机,整机看起来也已经挺智能了。当前很多团队为了技术叙事好看,把大量研发资源投在决策大模型上,运动规划团队只有一两个人维护开源库,这种配置在演示时看不出问题,一旦进入客户现场部署,短板暴露得很快。
6.2 场景碎片化与平台化之间的张力
运动规划算法本身的数学框架相对统一,但真正落地到不同场景,大量工作都在做场景定制。仓储场景的移动机器人运动规划,核心是解决窄通道与高密度货架下的交通管制,规划是全局的、拓扑图中的多机协同;工业机械臂的抓取场景,核心是快速求解逆解与避障,规划是局部的、高频的;服务机器人的家庭场景,核心是动态行人预测与社交距离约束,规划要融合预测模型。
这种碎片化带来的行业问题是,运动规划很难像上层大模型那样形成“通吃一切”的底座,每个场景都需要一定量定制开发。这也是为什么当下产业里运动规划方向的人才需求一直很旺盛,但培养路径又很难标准化——它需要大量的实机调试经验积累。
6.3 新技术带来的变革方向
虽然传统方法仍是产业主力,但确实能看到一些趋势正在发生。第一个趋势是“模块化分层+局部学习化”,用传统规划器保证全局安全走廊,用学习策略在走廊内生成灵巧运动。第二个趋势是“GPU并行加速采样”,把数千个RRT树的探索并行跑在显卡上,硬生生把规划耗时压到毫秒级,极大拓展了在线重规划的使用空间。第三个趋势是“仿真到实机迁移”工具链日趋成熟,在可控仿真环境里大规模随机化参数训练,再让规划器适应残差模型,这比纯端到端更稳,比纯手工调参更高效。
6.4 对从业者的一些建议
如果你要入行具身智能运动规划,我给的最诚恳建议是:别只盯论文上的新算法,先把手底下的机器人操作系统、运动学、动力学、经典规划算法这些基本功打牢。真正决定你水平的,不是你会多少个花哨算法,而是当规划器在实机上出现莫名其妙的问题时,你能不能快速定位问题是出在模型、标定、控制器还是算法参数上。这种“玄学问题”的排查能力,是靠大量实机时间堆出来的,没有任何捷径。我自己带人时,更喜欢招那种在仿真里折腾过几百小时、又亲手拆装过机器人的人——他们解决问题时的直觉,比只刷论文的人靠谱太多。
另外,围绕运动规划有一个特别值得投入的方向:规划与控制联合优化。传统思路是先规划轨迹再跟踪控制,是开环的、串行的;但如果把轨迹优化和模型预测控制结合起来,在滚动时域内做统一求解,系统响应速度和鲁棒性会明显更好。这个方向既有理论深度,又有非常直接的产业价值,而且目前国内做的人不算多,竞争压力相对小。
7. 我的一些真实体会与扩展想法
写了这么多,其实最想说的还是那句老话:纸上得来终觉浅,绝知此事要躬行。具身智能运动规划这个领域,读了再多的论文、看了再多的演示视频,都不如自己在一个仿真环境里把机械臂的规划节点跑通一遍,然后在实机上亲眼看着它磕磕绊绊地完成一次抓取来得真实。那些仿真里不会出现、论文里不会提到的细节——关节驱动器最低稳定速度、运动规划与底层PID控制器的周期配比、不同减速机背隙带来的末端误差——才是真正区分一个合格工程师和顶级工程师的分水岭。
如果你刚接触这个领域,我建议从最简单的“平面两连杆机械臂避障规划”入手,用Python自己实现一遍RRT和A*,再把障碍物改成圆形、把时间戳加进去做轨迹插值。这听起来很简单,但完整做下来,你对配置空间、碰撞检测、轨迹平滑的理解会完全不一样。然后再上开源机器人仿真器,用真实的机械臂模型复现一遍,你会发现之前抽象的概念全部落地了。
最后分享一个最近在尝试的方向:把大语言模型用在运动规划的“热启动”上。具体做法是,让大模型根据任务描述和场景文字,推理出可能的路径走廊作为先验,再用传统规划器在这个走廊内部精修。这比完全端到端生成关节指令要安全得多,也比纯靠随机采样高效得多。目前这个方向还在很早期,但我觉得它可能成为传统运动规划与具身智能决策之间一个很自然的桥接层。如果你也在关注这个方向,欢迎多交流,这行值得我们投入的时间还有很多。