通过牛顿-欧拉(Newton-Euler)算法,可以为复合机械臂(SCARA + 双俯仰 + 清洁模组)构建一个高效、精确的逆动力学模型,下面给出从原理到实现的完整推导。

已知:当前时刻关节位置 q、速度 q˙、加速度 q¨。
求解:为产生这一运动,每个关节需要提供的驱动力矩 τ(逆动力学)。
约定:

目的:计算出每个连杆的角速度 ωi、角加速度 αi、线加速度 ai 和质心加速度 aci。
初始化(基座):底盘在清洁时锁死,视为固定基座,为了将重力效应自然地纳入动力学方程,将基座的加速度设置为重力加速度的反向:a0=−g,其中 g 是重力矢量(通常 [0,0,9.81] 在基座坐标系中Z轴向上)。同时,ω0=0,α0=0。
对于每个连杆 i=1 到 N,根据关节类型:以旋转关节为例(Scara对应J1,J2,J4,J5,J6):

平移关节的公式类似但更简单,角速度/角加速度不变(ωi=ωi−1,αi=αi−1),线加速度需要加上相对线加速度项。
这样递推到末端,我们就得到了所有连杆的运动学量。
目的:根据各连杆的运动加速度,以及末端外力,计算每个关节所需的驱动力矩。
初始化:对于末端连杆 N,它受到来自环境的力f_N+1=f_ext和力矩
μ_N+1=μ_ext(均表达在连杆 N的坐标系中),这就是六维力传感器测量并补偿后的净接触力/力矩,转换到末端连杆坐标系。
对于每个连杆 i=N向下递归到 1:
1. 连杆运动所需的惯性力和力矩(在质心处):

2. 连杆的受力:子连杆 i+1 受到力 fi+1 和力矩 μi+1,自身需要 Fi,Mi,父连杆 i−1必须通过关节 i 对它施加力 fi和力矩 μi以维持动态平衡。平衡方程(所有向量统一在连杆 i 坐标系中):

3. 提取关节驱动力矩
在反向递推过程中,为了便于计算,通常会把 fi,μi从连杆 i 的坐标系转换到父连杆 i−1 的坐标系,传递下去

算法:NE逆动力学 (q, dq, ddq, F_ext, M_ext)
输入:
q[1..N], dq[1..N], ddq[1..N] // 关节位置、速度、加速度
F_ext, M_ext // 末端外力、力矩(在连杆N坐标系)
输出:
tau[1..N] // 关节力矩
// ===== 正向递推 =====
v[0] = 0, a[0] = [0, 0, g] // g为重力加速度(若Z向上,则g = -9.81 * z_unit)
for i = 1 to N:
获取坐标系变换: R[i-1][i], p[i-1][i] // 从{i-1}到{i}的旋转矩阵和位移
if 关节i是旋转关节:
w[i] = R[i-1][i]^T * w[i-1] + dq[i] * z_axis
alpha[i] = R[i-1][i]^T * alpha[i-1] + ddq[i] * z_axis + cross(w[i-1], dq[i] * z_axis)
a[i] = R[i-1][i]^T * (a[i-1] + cross(alpha[i-1], p[i-1][i]) + cross(w[i-1], cross(w[i-1], p[i-1][i])))
else if 关节i是平移关节:
// 类似,线加速度需叠加平移项
// 计算质心加速度
a_c[i] = a[i] + cross(alpha[i], c[i]) + cross(w[i], cross(w[i], c[i]))
// ===== 反向递推 =====
f[N+1] = F_ext, mu[N+1] = M_ext // 末端外力
for i = N down to 1:
// 该连杆惯性力/力矩 (在质心)
F[i] = m[i] * a_c[i]
M[i] = I[i] * alpha[i] + cross(w[i], I[i] * w[i])
// 关节i对连杆i的作用力/力矩 (在连杆i原点)
// 注意:f[i+1], mu[i+1] 目前处于连杆i+1坐标系,需先变换到连杆i坐标系
f_i_plus1 = R[i][i+1] * f[i+1]
mu_i_plus1 = R[i][i+1] * mu[i+1]
// 平衡方程
f[i] = F[i] + f_i_plus1
// 力矩平衡:对连杆i原点取矩,r_ci是质心位置,r_i_iplus1是到下一个关节原点的向量
mu[i] = M[i] + mu_i_plus1 + cross(c[i], F[i]) + cross(r_i_iplus1, f_i_plus1)
// 提取关节力矩
if 关节i是旋转关节:
tau[i] = dot(mu[i], z_axis)
else if 平移关节:
tau[i] = dot(f[i], z_axis)
// 为传给父连杆做准备,将f[i], mu[i]转换到父连杆坐标系(i-1),用于下一次循环
// 在循环内调用时,直接使用变换后的值进行下一次迭代即可
返回 tau[1..N]a[0] = -g,如果基座坐标系Z轴向上,则 a[0] = [0, 0, -9.81]。这将重力自动纳入所有计算,无需单独的重力补偿项。T_sensor_to_linkN,将力/力矩旋转到连杆N坐标系。m_N、质心 c_N、惯性张量 I_N 正是通过负载辨识获得的 m, r_com, I_sensor。
。