想象你是一位机械工匠,正在打造一具精密的人形机械臂。这具机械臂由七节“骨头”串联而成,每节骨头都有自己的质量、转动惯量和关节。你最大的困惑是:当机械臂快速挥舞时,每个关节到底需要施加多大的力?如果力太小,臂会瘫软;力太大,臂会发抖甚至损坏。你需要的不仅是一套静力学公式,而是一套随运动状态而变化的动态计算方法——它要能顺着机械臂“从肩膀到指尖”逐节推算速度与加速度,再“从指尖回肩膀”逐节反演力与力矩。这套方法,就是机器人动力学领域的牛顿‑欧拉递推(Newton‑Euler Recursion)。 牛顿‑欧拉递推听起来像高深的物理名词,但它背后的思想和你每天走路并无不同:你的大脑先告诉脚踝、膝盖、髋关节“下一步要动多快”(正向推算运动量),然后身体的感觉神经再把地面反力一路传回腰部(逆向推算受力)。机器人工程师把这一过程形式化为两个方向的递推循环,配上描述旋转的数学工具,就能在毫秒级完成全身关节力矩的计算。本文会用一座“机械工坊”的比喻,带你从零理解这个递推过程,并看到它如何支撑机器人控制、AI 仿真与实际工程。
对 AI 从业者而言,牛顿‑欧拉递推是“具身智能”的地基:无论做机器人控制、物理仿真还是强化学习环境搭建,你都需要在毫秒内算出真实物理世界对执行器的反馈。理解它,你才能真正训出能在物理世界站稳的智能体。
可视化演示
通过正反向递推流程、力矩传播链和科里奥利离心效应,直观展示机器人动力学求解的核心算法。
本节配有交互动效(进入视口后自动加载,约 3KB)。
正向递推(基座→末端) 从基座向末端传播速度和加速度 每步计算:ωᵢ, αᵢ, aᵢ ωi = Riωi-1 + θ̇ẑ 复杂度O(n),适合实时控制
动力学基本概念
机械工坊里,每一位匠人都知道:要让一柄铁锤抡得又快又准,先得了解铁锤本身——它的质量有多大、重心在哪、转动起来是否“顺手”?机器人动力学也一样,第一块基石是刚体的概念。刚体是“不会变形”的理想物体,机械臂的每一节连杆都被视为一个刚体。牛顿第二定律告诉我们,平动中的加速度正比于合外力;而欧拉方程则补充了转动的规律:角加速度不仅取决于力矩,还受转动惯量分布的影响。
把两个规律合起来,就得到描述刚体完整运动的牛顿‑欧拉方程。对机械臂而言,每个连杆都在三维空间中既有平动又有转动,所以我们需要六个数字描述它的位形——三个位置坐标加三个姿态角,这就是空间六维位形。惯性参数(质量、质心位置、转动惯量张量)则像铁锤的“体重、平衡点、手感”,决定了外力如何转化为运动。
想象铁匠抡锤:锤头质量决定你需要花多大力气让锤加速(牛顿项),锤柄的转动惯量决定你肩部需要承受多大的扭转(欧拉项),而当你快速转动手腕时,锤头还会产生一股“往外拽”的劲儿——那就是陀螺项。理解这三个来源,你才能为机械臂的每根“骨头”配好力的预算。
- 平动牛顿方程合外力等于质量乘以加速度,这是我们在初中就熟悉的 \(F=ma\),只不过这里用了矢量形式。
- 转动欧拉方程惯性项角加速度引起的力矩,等于转动惯量张量乘以角加速度。
- 转动欧拉方程陀螺项当刚体既有自转又有公转时,角速度 \(\omega\) 与角动量 \(I\omega\) 的外积会产生额外的“陀螺力矩”,这是三维转动与一维平动的本质区别。
递推算法原理
工坊里来了位老师傅,他不需要称每根连杆的详细受力,只需要在整条机械臂上“走两遍”:第一遍从肩膀走向指尖,一路记录每根骨头的速度和加速度;第二遍从指尖返回肩膀,一路把端点受到的力累加回每个关节。这就是牛顿‑欧拉递推的核心理念:正向递推算运动学,逆向递推算动力学。
具体来说,正向递推从基座开始,利用关节角速度递归计算每个连杆的角速度、角加速度和质心线加速度;逆向递推则从末端执行器开始,把外界作用力(如抓取的负载)反向传播,在每个关节处用牛顿方程和欧拉方程求解所需力矩。这套算法最大的优点是不需要建立整个机械臂的 n×n 质量矩阵,而是把问题拆成 O(n) 次迭代,效率和可解释性都远优于直接矩阵求逆。
老师傅的“两遍走”妙在把复杂问题拆成流水线:正向只关心“每块骨头怎么动”,逆向只关心“每个关节出多大力”。就像你走路时,大脑先规划腿各段的运动轨迹,再根据地面反力调整肌肉出力——方向相反,却天衣无缝地衔接。
- 正向递推的角速度传播第 \(i+1\) 根连杆的角速度 \(\omega_{i+1}\),由前一连杆角速度 \(\omega_i\) 叠加本关节的旋转速度得到。
- 逆向递推的力累加第 \(i\) 个关节承受的力 \(f_i\),等于传给下一连杆的力 \(f_{i+1}\) 加上本连杆运动所需的惯性力。
- 力矩的逆向累加每个关节的驱动力矩由两部分组成——承担下一连杆的力矩,以及驱动自身转动的欧拉力矩。
正向递推运动量
现在让我们聚焦正向递推的细节。假设机械臂基座固定在地面上,基座角速度和线速度都为零。从第一个关节开始,每当关节转动一个角度,末端连杆就获得一个附加角速度,这个角速度沿着转动轴指向。于是第 \(i+1\) 个连杆的角速度等于第 \(i\) 个连杆的角速度加上关节相对转速,用数学表达就是:
这个公式组看似吓人,其实就是工匠沿着机械臂“逐节传话”:每节骨头都告诉下一节“我现在转得多快、冲得多猛”。只要基座静止(地杆初始化为零),这些消息就能一路传到指尖,让每个关节都知道自己该以什么速度运动——这正是并联机器人与串行机械臂控制中最核心的运动学预判。
- 角速度累加第 \(i+1\) 连杆的角速度 = 第 \(i\) 连杆角速度 + 该关节角速度沿着关节轴方向的分量。
- 线加速度牵连项前一连杆的平动加速度,经过旋转矩阵变换到当前连杆坐标系。
- 切向加速度角速度 \(\omega_i\) 与从关节到质心的向量 \(\boldsymbol{r}\) 外积,产生垂直方向的切向加速度。
- 质心加速度连杆质心处的总加速度是关节处加速度加上相对转动的贡献。
科里奥利与离心
在旋转的转盘上向外走,你会感到一股“神秘的力”把你往侧面推——这就是科里奥利力。机械臂高速挥舞时,每个连杆都在相对于上一个旋转的坐标系中运动,于是同样会出现科里奥利项和离心项。这两项不是真实存在的力,而是因为我们选择了旋转参考系而产生的表观力,但对关节力矩计算却至关重要。
离心项与角速度的平方成正比:当机械臂末端快速旋转时,每个连杆都会受到沿臂指向外的“离心拉力”,迫使关节额外发力。科里奥利项则是转动与平动的耦合:当某个关节转动而相邻关节同时伸缩/摆动时,二者速度相乘会产生交叉力。在低速场景下它们很小,但在手术机器人或工业码垛机这种高速高动态设备中,忽略科里奥利项会导致轨迹偏移甚至抖动。
在机械工坊的比喻中,科里奥利项就像你端着满满一杯水在旋转木马上行走——你向前迈步,身体却被横向拽动。机械臂的每个关节都像“端着水的侍者”,必须预先补偿这种横向拽力。现代机器人控制器会在线计算这些项并叠加到前馈力矩上。
- 科里奥利力质量为 \(m\) 的物体在旋转系中以速度 \(v\) 运动时,受到垂直于 \(\omega\) 和 \(v\) 的表观力。
- 离心力物体随旋转系公转时,沿径向向外的表观力随角速度平方增长。
- 力矩中的耦合项在欧拉方程中,\(\omega \times (I\omega)\) 即陀螺项,是转动方向的“科里奥利效应”。
计算效率与并行
在机器人控制中,时间就是生命。若用传统的拉格朗日法建立 n 连杆机械臂的完整质量矩阵 \(M(q)\),再求解 \(M(q)\ddot q + C(q,\dot q) + G(q) = \tau\),需要对 n×n 矩阵求逆,复杂度达到 \(O(n^3)\)。而牛顿‑欧拉递推采用“正向两遍扫”,每遍递推只做常数次向量运算,整体复杂度仅 \(O(n)\)——这就是它能支撑 1kHz 以上实时控制频率的秘密。
然而,递推算法存在天然的串行依赖:第 \(i+1\) 个连杆的运动量必须等第 \(i\) 个连杆算完才能得到,力回传同理。这在多核 CPU 上并不容易直接并行。工程上的解法包括:对同一机械臂的多个运动轨迹做“批量并行”(GPU 同时仿真数百条轨迹),或将算法转化为稀疏线性系统后用并行求解器加速。
老师傅的智慧在于:与其每次把整套机械臂的运动方程揉成一张大网(拉格朗日法),不如沿臂走两遍,把网拆成一条链。对 6 轴工业机器人,递推只需约 600 次浮点运算,而矩阵求逆需要数千次——这就是牛顿‑欧拉递推成为实时控制“工业标准”的原因。
- 正逆两遍线性扫描正向一遍 \(n\) 次迭代,逆向一遍 \(n\) 次迭代,总迭代次数约 \(2n\)。
- 惯性矩阵求逆的立方增长建立 \(n \times n\) 质量矩阵后求逆,高斯消元约 \(n^3/3\) 次运算。
- 单步递推的常数开销每步只涉及固定次数的矢量乘加与旋转矩阵变换,与关节数无关。
关节空间与任务空间
机械臂的用户通常关心末端执行器在三维空间中的位置和姿态(即任务空间),但电机驱动的是关节角度(即关节空间)。这两个空间之间的桥梁是雅可比矩阵 \(J(q)\)。正向速度映射为:
在机械工坊的比喻中,关节空间像“手臂骨骼的角度”,任务空间像“手掌抵达的位置”。牛顿‑欧拉递推本身在关节空间中计算,但通过雅可比矩阵可以无缝转换到任务空间。现代阻抗控制正是利用力映射公式:机器人检测到末端与环境的接触力,立即通过 \(J^T\) 换算成各关节力矩指令,实现“柔顺地推门”或“安全地握手”。
- 雅可比速度映射末端执行器的六维速度(线速度+角速度)由关节速度经雅可比线性组合得到。
- 力映射的功率对偶由虚功原理,任务空间力 \(F\) 与关节力矩 \(\tau\) 之间的关系是雅可比的转置。
- 奇异构型分析当雅可比降秩时,某些方向失去运动能力,机械臂处于奇异位形。
AI 应用场景
工业机械臂实时力矩控制
阶段:机器人控制 / 物理仿真
解决的问题:传统控制依赖预先示教的固定轨迹,遇到负载变化或外部扰动时无法实时调整关节力矩。利用牛顿‑欧拉递推,控制器在每个控制周期(1ms)内完成正逆两遍递推,精准计算每个关节所需的实时补偿力矩,从而适应抓取不同重量物体的任务。
具体案例:某汽车工厂的 6 轴码垛机器人,需要抓取 5kg~30kg 不等的汽车零件。工程师在控制器中部署了基于递推算法的前馈力矩补偿模块:当末端负载变化时,根据负载质量和重心位置重新计算逆向递推的外力边界,使机械臂在高速搬运中保持轨迹误差小于 0.5mm。
双足机器人步态仿真
阶段:仿真环境构建 / 强化学习训练
解决的问题:训练双足机器人走路需要大量物理仿真数据,传统仿真器逐帧求解全身动力学速度慢。牛顿‑欧拉递推的 O(n) 复杂度使 MuJoCo、PyBullet 等物理引擎能够在单颗 GPU 上并行仿真数千条步态轨迹,大幅提升强化学习采样效率。
具体案例:某足式机器人实验室使用 Newton‑Euler 递推作为刚体动力学核心,将 12 自由度双足模型的单步仿真耗时从 8ms 降至 0.6ms,使 PPO 算法在 4 小时内完成了 2 亿步的步态探索,最终学得抗扰动行走策略。
人形机器人柔顺交互控制
阶段:感知决策 / 力控执行
解决的问题:人形机器人服务场景要求安全与人交互,需要实时感知接触力并做出顺应动作。通过逆向递推实时估计各关节驱动力矩,配合关节力矩传感器,实现“轻轻推开”而不是“硬碰硬”的柔顺控制。
具体案例:某养老院导览机器人安装了六维力传感器和基于牛顿‑欧拉递推的力控模块。当老人轻轻触碰机器人手臂时,系统在 2ms 内计算出反向驱动力矩,让机器人顺着推力方向移动,避免对老人造成伤害。
Python 演示
import numpy as npimport matplotlib.pyplot as plt class Link: def __init__(self, mass, length, r_com, inertia): self.m = mass self.L = length self.r = r_com self.I = inertia class PlanarAem: def __init__(self, links): self.links = links self.n = len(links) def ne_recursion(self, q, qd, qdd, f_ext): n = self.n omega = np.zeros(3) alpha = np.zeros(3) a = np.zeros(3) R = np.zeros((n, 2, 2)) p = np.zeros((n, 2)) v = np.zeros(3) f = np.zeros(3) tau = np.zeros(n) for i in range(n): th = q[i] R[i] = np.array([[np.cos(th), -np.sin(th)], [np.sin(th), np.cos(th)]]) p[i] = np.array([self.links[i].L, 0.0]) omega[2] = qd[i] alpha[2] = qdd[i] a[:2] = R[i].dot(np.array([0.0, 0.0])) if i > 0: a[:2] = R[i].dot(a[:2] + np.cross(omega, p[i-1])) else: a[:2] = R[i].dot(a[:2]) F = np.zeros(3) M = np.zeros(3) for i in reversed(range(n)): ri = self.links[i].r Ii = self.links[i].I F[:2] = self.links[i].m * a[:2] M[2] = Ii * alpha[2] r_vec = np.array([ri, 0.0, 0.0]) F[:2] = self.links[i].m * (a[:2] + np.cross(alpha, r_vec)[:2]) M[2] = Ii * alpha[2] + np.cross(omega, np.array([0.0, 0.0, Ii * omega[2]]))[2] f = F + f_ext tau[i] = M[2] + f[0] * ri f_ext = f return tau def main(): links = [ Link(mass=4.0, length=0.5, r_com=0.25, inertia=0.08), Link(mass=3.0, length=0.4, r_com=0.2, inertia=0.05), Link(mass=1.5, length=0.3, r_com=0.15, inertia=0.02) ] aem = PlanarAem(links) q = np.array([0.2, 0.5, -0.3]) qd = np.array([0.8, 0.6, -0.4]) qdd = np.array([0.5, 0.3, -0.2]) f_ext = np.array([2.0, 1.0, 0.0]) tau = aem.ne_recursion(q, qd, qdd, f_ext) names = ['shoulder', 'elbow', 'wrist'] for i, ti in enumerate(tau): print('{} torque: {:.3f} Nm'.format(names[i], ti)) plt.bar(names, tau, color=['#818CF8', '#10B981', '#F43F5E']) plt.ylabel('Joint torque (Nm)') plt.title('Newton-Euler recursion: joint torques') plt.grid(axis='y', alpha=0.3) plt.show() if __name__ == '__main__': main()
class Link:定义连杆的物理参数(质量、长度、质心位置、转动惯量),相当于工坊里每根“骨头”的规格书。class PlanarAem:封装机械臂模型和递推算法,构建 n 连杆链式结构。R[i] = np.array([[...],[...]])构造旋转矩阵,将向量从一个连杆坐标系变换到下一个坐标系。omega[2] = qd[i]角速度沿 Z 轴累加,平面机构中旋转轴统一指向 Z 方向。a[:2] = R[i].dot(a[:2] + np.cross(omega, p[i-1]))正向递推线加速度,包含角速度叉积产生的向心项。tau[i] = M[2] + f[0] * ri逆向递推计算关节力矩,等于欧拉转动项加上力臂叉乘产生的力矩。plt.bar(names, tau, color=[...])用柱状图可视化各关节所需力矩,直观对比不同关节的负载差异。
常见误区
误区“牛顿‑欧拉递推不是正向递推吗?那我把所有连杆的速度、加速度都算出来,是不是就能直接用 F=ma 得到每个关节的力?”
正解正向递推得到的只是运动学量(各连杆的速度、加速度、质心加速度),真正求解关节力矩必须进行逆向递推。原因在于每个连杆承受的力既包括自身的惯性力,也包括来自末端方向所有连杆的反作用力。就像你在前排拉一辆火车,你要用的力不是拉最后一个车厢的力,而是整列火车阻力的总和——必须先知道末端的力,再逐级累加回来。
为何常见:初学者看到“牛顿”这个名字就联想到 F=ma,误以为只要知道加速度和惯性就能立刻算出力,忽略了多连杆系统中力的“逐级传播”特性。
误区“机械臂慢慢动的时候,科里奥利力很小,工程上直接忽略没问题吧?反正误差不大。”
正解科里奥利项与角速度和线速度的乘积成正比。在低速时确实数值较小,但它是一个有方向性的“耦合力”——当一个关节转动带动另一个关节产生相对速度时,科里奥利力会让机械臂产生不可忽略的横向偏移。现代高速码垛机器人运动速度可达 4m/s,不考虑科里奥利项会使末端轨迹误差超过 3cm。正确的做法是始终在线计算该项并加入前馈,或至少根据速度阈值进行补偿。
为何常见:低速场景下科里奥利项数值小,人眼几乎看不出影响,“忽略它也能动”的经验让人觉得可以省略。
误区“求解动力学方程 \(\tau = M(q)\ddot q + C(q,\dot q) + G(q)\) 不是要解线性方程组吗?牛顿‑欧拉递推是不是每步都要做矩阵求逆?”
正解牛顿‑欧拉递推最大的优势就是不需要构造质量矩阵,更不需要求逆。它通过“正向算运动量、逆向算力”的两次扫描,直接把关节力矩以封闭迭代形式计算出来。矩阵求逆是拉格朗日法/广义坐标法的做法,复杂度 O(n³);递推法每步只做常数次向量运算,复杂度 O(n)。
为何常见:许多教材先讲拉格朗日动力学(涉及 n×n 质量矩阵求逆),再讲递推法,学生容易把两种方法的实现细节混在一起。
误区“正向递推每一步依赖上一步的结果,这是串行的,所以牛顿‑欧拉递推根本没法用 GPU 并行加速。”
正解单个机械臂的递推确实存在串行依赖,但工程上可以“批量并行”:同时仿真成百上千个机器人(如种群训练、多智能体仿真),每个机器人用独立的线程/流执行递推,GPU 天然适合这种大批量独立任务。除此之外,研究者还提出了重组递推算法,将正逆递推转成前缀和运算,在 GPU 上实现单机械臂的并行递推。
为何常见:人们看到“链式依赖”就认为无法并行,却忽略了“数据并行”这一更常见的并行维度。
误区“仿真时机械臂越动越夸张,最后飞掉了,一定是牛顿‑欧拉递推的公式写错了。”
正解大多数“仿真爆炸”不是递推公式错,而是数值积分步长太大导致的数值不稳定。牛顿‑欧拉递推是精确的解析递推,但把它嵌入仿真循环后,显式欧拉积分对步长极其敏感。步长超过系统最高频率的临界值时,离散误差会指数放大。解决方法是缩小步长、采用隐式积分(如半隐式欧拉、RK4)、或加入人工阻尼。
为何常见:初学者把“物理模型错误”和“数值算法不稳定”混为一谈,一看到发散就怀疑递推公式,忽略了积分器自身的稳定性边界。
面试题
Q1. 牛顿‑欧拉递推算法的两大主要步骤分别是?
- A.正向递推求力,逆向递推求运动量
- B.正向递推求运动量,逆向递推求力与力矩← 正确答案
- C.正向递推求力矩,逆向递推求速度
- D.正向递推求加速度,逆向递推求位置
答案:B。正向递推从基座到末端逐连杆计算角速度、角加速度和线加速度(运动量),逆向递推从末端到基座逐关节计算力与力矩。选项 B 精确描述了这两步的分工;A 颠倒了方向,C 和 D 均混淆了运动量与力的对应关系。
Q2. 牛顿‑欧拉递推中,正向递推需要计算的量包括哪些?
- A.连杆角速度← 正确答案
- B.连杆质心线加速度← 正确答案
- C.关节驱动力矩
- D.连杆角加速度← 正确答案
答案:ABD。正向递推的目的是为逆向递推准备运动学数据,包括角速度、角加速度和线加速度。关节驱动力矩(C)属于逆向递推的输出,不在正向阶段产生。
Q3. 牛顿‑欧拉递推求解 n 关节机械臂动力学的时间复杂度是?
- A.O(n)← 正确答案
- B.O(n²)
- C.O(n³)
- D.O(logn)
答案:A。牛顿‑欧拉递推只需正向和逆向各 n 次迭代,每步常数运算,总复杂度 O(n)。矩阵求逆法(拉格朗日法)才需要 O(n³)。
Q4. 科里奥利力的数值大小与哪些因素成正比?
- A.角速度的平方与质量
- B.角速度与相对速度的乘积← 正确答案
- C.质量与重力加速度
- D.线速度的平方与转动惯量
答案:B。科里奥利力 \(F_{\text{cor}} = -2m(\omega \times v)\) 正比于角速度 \(\omega\) 与相对速度 \(v\) 的乘积。离心力才正比于角速度的平方(A 描述的是离心项)。
Q5. 在牛顿‑欧拉逆向递推中,关于末端外力的初始化,正确的做法是?
- A.设为零向量,忽略负载
- B.设置为末端执行器受到的负载力← 正确答案
- C.设为重力加速度向量
- D.设为基座的反作用力
答案:B。逆向递推的边界条件是末端执行器所受外力,如抓取负载、接触力为零时应设为 0。若直接忽略负载(A),递推会错误地认为末端没有受力,导致关节力矩计算偏差。
Q6. 关于牛顿‑欧拉递推与拉格朗日法的比较,以下说法正确的有哪些?
- A.递推法无需构造质量矩阵← 正确答案
- B.拉格朗日法需要 n×n 矩阵求逆← 正确答案
- C.递推法计算复杂度为 O(n)← 正确答案
- D.拉格朗日法更适合实时控制
答案:ABC。牛顿‑欧拉递推的优点是不构造质量矩阵、O(n) 复杂度,适合实时控制。拉格朗日法需要构造并求逆 n×n 矩阵,复杂度 O(n³),实时性差(D 错误)。
Q7. 雅可比矩阵 \(J(q)\) 在关节空间与任务空间之间扮演的角色是?
- A.将关节力矩映射为末端力
- B.将关节速度映射为末端速度← 正确答案
- C.将末端位置映射为关节角度
- D.将关节加速度映射为末端加速度
答案:B。雅可比矩阵 \(J(q)\) 的核心定义是 \(\dot x = J(q)\dot q\),即关节速度到末端速度的线性映射。力映射是 \(J^T\),即 \(\tau = J^T F\),A 的表述错误;C 和 D 不是雅可比的定义。
Q8. 以下哪些项属于牛顿‑欧拉递推在计算效率方面的优势来源?
- A.避免 n×n 惯性矩阵求逆← 正确答案
- B.两步扫描复用中间结果← 正确答案
- C.每步只需常数次向量运算← 正确答案
- D.使用全局坐标系累计力矩
答案:ABC。递推法效率高源于三方面:不构造质量矩阵(A)、正逆两遍扫描复用运动量(B)、每步常数运算(C)。D 错误——递推法同样依赖局部坐标系的旋转矩阵变换,并非在全局坐标系简单累加。
Q9. 对于 n 连杆机械臂,牛顿‑欧拉递推比惯性矩阵求逆法在 12 关节时理论上快多少倍?
- A.约 12 倍
- B.约 36 倍
- C.约 144 倍← 正确答案
- D.约 1728 倍
答案:C。递推复杂度 O(n),矩阵求逆复杂度 O(n³)。比例为 n³/n = n²。n=12 时,12²=144,即递推法约为求逆法的 1/144 时间,快约 144 倍。
Q10. 欧拉方程中 \(\boldsymbol{\omega} \times (\boldsymbol{I}\boldsymbol{\omega})\) 这一项被称为?
- A.离心力项
- B.陀螺力矩项← 正确答案
- C.科里奥利力项
- D.重力补偿项
答案:B。该式描述刚体转动时角速度与角动量的叉积,产生使旋转轴“倾斜”的陀螺效应力矩。科里奥利力项通常是 \(-2m(\omega \times v)\),离心力项与旋转半径相关,重力补偿项是常量项。