动力学基础:牛顿-欧拉法、拉格朗日法、足端力分配
各位同学,欢迎来到动力学这一章。说实话,很多做四足机器人的朋友,一开始都把精力放在运动学上——毕竟能走起来就挺有成就感了。但做到后面你会发现,真正决定机器人能不能在碎石路、斜坡、草地上站稳的,是动力学。
动力学说白了就是研究「力与运动的关系」。你给电机发多大的扭矩,腿会怎么动?地面会给腿多大的反作用力?这些力怎么分配才能让机身不翻?嗯,这就是本章要聊的核心。
1. 牛顿-欧拉法:从受力出发
这个方法最直观。牛顿第二定律 F = ma,加上旋转的欧拉方程 τ = I·α + ω × Iω,把机身和每条腿当成刚体,列平衡方程。
我个人习惯把四足机器人拆成两部分来算:
- 机身(躯干):受重力、四条腿通过髋关节传递的力、力矩。
- 每条腿:受髋关节力、地面反作用力、各关节驱动力矩。
从足端开始,由下往上递推。先算足端与地面的接触力,然后算小腿、大腿,最后算到机身。这个过程叫「逆动力学」——已知运动轨迹,反推需要多大的关节力矩。
2. 拉格朗日法:从能量出发
拉格朗日法走的是另一条路。它不直接列力平衡,而是算系统的动能 T 和势能 V,然后构造拉格朗日量 L = T - V,再代入拉格朗日方程:
d/dt(∂L/∂q̇) - ∂L/∂q = τ
这里的 q 是广义坐标,比如关节角度。τ 是对应的广义力,也就是关节力矩。
你想想看,当机器人有 12 个关节(每条腿 3 个),再加上机身 6 个自由度,总共 18 个自由度。用牛顿-欧拉法列方程,光是画受力图就能画到崩溃。但拉格朗日法只需要写出能量表达式,然后求偏导——虽然计算量也不小,但至少不容易漏项。
| 对比项 | 牛顿-欧拉法 | 拉格朗日法 |
|---|---|---|
| 核心思想 | 力与力矩平衡 | 能量守恒与变分 |
| 建模对象 | 每个刚体单独分析 | 整个系统统一建模 |
| 约束处理 | 需要显式写出约束力 | 自然包含完整约束 |
| 计算效率 | 递推形式,适合实时 | 矩阵形式,适合离线 |
| 我的推荐场景 | 单腿控制、力矩前馈 | 全身动力学、仿真验证 |
3. 足端力分配:让四条腿协同工作
好,现在我们已经知道每条腿需要多大的关节力矩了。但还有一个关键问题:四条腿同时着地时,地面反作用力怎么分?
机身受到重力、惯性力、外力(比如被人推一把)。这些力需要由四条腿的足端力来平衡。但足端力有 3 个方向分量(Fx, Fy, Fz),四条腿就是 12 个未知数,而机身只有 6 个平衡方程(3 个力 + 3 个力矩)。
说白了,这是一个欠定问题——解不唯一。我们需要加一些优化目标来找到「最好」的那组力。
常用的分配策略
- 伪逆法:最小化足端力的二范数。计算快,但可能违反摩擦锥约束。
- QP 优化(二次规划):把摩擦锥、关节力矩限幅写成不等式约束,求解带约束的最小二乘问题。这是目前主流方案。
- 加权分配:给支撑腿更大的权重,摆动腿权重设为零。我在实际项目中常用这个思路做简化。
一个简单的分配流程
输入:机身期望加速度 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 优化是首选,但如果算力有限,伪逆法加摩擦锥投影也能凑合。