动力学基础:牛顿-欧拉法、拉格朗日法、足端力分配

各位同学,欢迎来到动力学这一章。说实话,很多做四足机器人的朋友,一开始都把精力放在运动学上——毕竟能走起来就挺有成就感了。但做到后面你会发现,真正决定机器人能不能在碎石路、斜坡、草地上站稳的,是动力学。

动力学说白了就是研究「力与运动的关系」。你给电机发多大的扭矩,腿会怎么动?地面会给腿多大的反作用力?这些力怎么分配才能让机身不翻?嗯,这就是本章要聊的核心。

本章核心脉络: 牛顿-欧拉法(力的平衡)→ 拉格朗日法(能量的视角)→ 足端力分配(落地实操)
四足机器人动力学知识体系 牛顿-欧拉法 力的平衡 + 力矩平衡 拉格朗日法 能量守恒 + 广义坐标 关节力矩 τ 逆动力学:由运动求力 足端力 F 地面反作用力向量 足端力分配 QP优化 / 伪逆分配 / 摩擦锥约束 三种方法层层递进:先建模,再算力,最后分配

1. 牛顿-欧拉法:从受力出发

这个方法最直观。牛顿第二定律 F = ma,加上旋转的欧拉方程 τ = I·α + ω × Iω,把机身和每条腿当成刚体,列平衡方程。

我个人习惯把四足机器人拆成两部分来算:

  • 机身(躯干):受重力、四条腿通过髋关节传递的力、力矩。
  • 每条腿:受髋关节力、地面反作用力、各关节驱动力矩。

从足端开始,由下往上递推。先算足端与地面的接触力,然后算小腿、大腿,最后算到机身。这个过程叫「逆动力学」——已知运动轨迹,反推需要多大的关节力矩。

我的经验: 牛顿-欧拉法在单腿支撑相特别好用。我曾经在调试一条腿的摆动轨迹时,用这个方法快速定位到是膝关节力矩饱和导致抬腿高度不够。如果你只需要算某一条腿的力矩,用牛顿-欧拉法最快。

2. 拉格朗日法:从能量出发

拉格朗日法走的是另一条路。它不直接列力平衡,而是算系统的动能 T 和势能 V,然后构造拉格朗日量 L = T - V,再代入拉格朗日方程:

d/dt(∂L/∂q̇) - ∂L/∂q = τ

这里的 q 是广义坐标,比如关节角度。τ 是对应的广义力,也就是关节力矩。

你想想看,当机器人有 12 个关节(每条腿 3 个),再加上机身 6 个自由度,总共 18 个自由度。用牛顿-欧拉法列方程,光是画受力图就能画到崩溃。但拉格朗日法只需要写出能量表达式,然后求偏导——虽然计算量也不小,但至少不容易漏项。

对比项 牛顿-欧拉法 拉格朗日法
核心思想 力与力矩平衡 能量守恒与变分
建模对象 每个刚体单独分析 整个系统统一建模
约束处理 需要显式写出约束力 自然包含完整约束
计算效率 递推形式,适合实时 矩阵形式,适合离线
我的推荐场景 单腿控制、力矩前馈 全身动力学、仿真验证
注意: 拉格朗日法推导出的质量矩阵 M(q) 是正定对称的,但如果你在代码里直接求逆,当机器人处于奇异位形时,M(q) 会接近奇异。我曾经在仿真里遇到过数值爆炸,后来加了阻尼项才稳住。

3. 足端力分配:让四条腿协同工作

好,现在我们已经知道每条腿需要多大的关节力矩了。但还有一个关键问题:四条腿同时着地时,地面反作用力怎么分?

机身受到重力、惯性力、外力(比如被人推一把)。这些力需要由四条腿的足端力来平衡。但足端力有 3 个方向分量(Fx, Fy, Fz),四条腿就是 12 个未知数,而机身只有 6 个平衡方程(3 个力 + 3 个力矩)。

说白了,这是一个欠定问题——解不唯一。我们需要加一些优化目标来找到「最好」的那组力。

常用的分配策略

  1. 伪逆法:最小化足端力的二范数。计算快,但可能违反摩擦锥约束。
  2. QP 优化(二次规划):把摩擦锥、关节力矩限幅写成不等式约束,求解带约束的最小二乘问题。这是目前主流方案。
  3. 加权分配:给支撑腿更大的权重,摆动腿权重设为零。我在实际项目中常用这个思路做简化。
摩擦锥约束: 足端与地面之间的切向力不能超过法向力乘以摩擦系数。写成公式就是: √(Fx² + Fy²) ≤ μ · Fz 如果不加这个约束,优化出来的力可能让足端打滑——我在水泥地上吃过这个亏,机器人原地转圈,足端在地上滑得吱吱响。

一个简单的分配流程

输入:机身期望加速度 a_des, 角加速度 α_des
     各足端位置 p_i, 接触状态 c_i (0或1)

1. 计算机身所需的合力 F_body = m·(a_des - g)
2. 计算机身所需的合力矩 τ_body = I·α_des
3. 构造等式约束:
   Σ(c_i · f_i) = F_body
   Σ(c_i · p_i × f_i) = τ_body
4. 构造不等式约束(摩擦锥、力限幅)
5. 求解 QP 得到最优足端力 f_i*
6. 通过雅可比矩阵将 f_i* 映射为关节力矩 τ_joint
避坑指南: 我曾经在足端力分配里忘了考虑摆动腿的惯性力补偿,结果摆动腿落地瞬间冲击力特别大,机身直接弹起来了。后来我在分配前先算一遍摆动腿的「虚拟力」,加到等式约束的右侧,才把这个问题解决。

4. 三种方法怎么选?

我个人的建议是这样的:

  • 做实时控制(嵌入式):用牛顿-欧拉法的递推形式,计算量小,适合在 STM32 或主控芯片上跑。
  • 做离线仿真或轨迹优化:用拉格朗日法,推导一次,后面直接调用质量矩阵和科氏力项。
  • 做足端力分配:QP 优化是首选,但如果算力有限,伪逆法加摩擦锥投影也能凑合。