首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于牛顿-欧拉算法,实现机械臂的逆动力学

基于牛顿-欧拉算法,实现机械臂的逆动力学

作者头像
索旭东
发布2026-07-27 13:45:41
发布2026-07-27 13:45:41
80
举报
文章被收录于专栏:具身小站具身小站

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

一、问题定义与基本约定

已知:当前时刻关节位置 q、速度 q˙、加速度 q¨。

求解:为产生这一运动,每个关节需要提供的驱动力矩 τ(逆动力学)。

约定

  • 机械臂有 N 个关节(默认6个:J1~J6),从基座到末端编号为 1,2,...,N。
  • 第 i 个关节连接连杆 i−1 和连杆 i,连杆 i 的惯性参数:
    • m_i:质量
    • c_i:该连杆质心在连杆坐标系 {i} 中的位置向量
    • I_i:绕质心的惯性张量(在 {i} 中表达)
  • 关节 i 的运动轴为 z_i(旋转关节或平移关节)。
  • 末端连杆(N)直接与外界环境接触,会受到外力/力矩 f_ext,μ_ext, 这个外力正是六维力传感器测得的纯净接触力。

二、正向递推:从基座到末端的运动传递

目的:计算出每个连杆的角速度 ω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. 提取关节驱动力矩

  • 旋转关节:τ_i=μ_i⋅z_i
  • 平移关节:τ_i=f_i⋅z_i

在反向递推过程中,为了便于计算,通常会把 fi,μi从连杆 i 的坐标系转换到父连杆 i−1 的坐标系,传递下去


四、核心递归伪代码

代码语言:javascript
复制
算法: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]

五、注意事项

  1. 基座加速度初始化a[0] = -g,如果基座坐标系Z轴向上,则 a[0] = [0, 0, -9.81]。这将重力自动纳入所有计算,无需单独的重力补偿项。
  2. 末端外力 Fext,Mext:来自六维力传感器的输出(经过静态偏置、重力、惯性补偿后的纯净接触力/力矩),需要变换到末端连杆的坐标系。例如,传感器坐标系与末端连杆可能有一个固定的变换 T_sensor_to_linkN,将力/力矩旋转到连杆N坐标系。
  3. 工具惯性参数:清洁模组作为连杆N(或附加在最后一个俯仰关节后的虚拟连杆),其质量 m_N、质心 c_N、惯性张量 I_N 正是通过负载辨识获得的 m, r_com, I_sensor
  4. 不需要为关节摩擦建模:牛顿-欧拉给出的是刚体动力学所需的“净力矩”。若需要力矩前馈,需额外叠加摩擦项

  1. 实时性:该算法复杂度 O(N),6 轴臂仅需几十微秒,完全适合 1kHz 控制循环。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 具身小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题定义与基本约定
  • 二、正向递推:从基座到末端的运动传递
  • 三、反向递推:从末端到基座的力/力矩传递
  • 四、核心递归伪代码
  • 五、注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档