138、动力学基础:拉格朗日与牛顿欧拉方程
兄弟们,今天这篇咱们不聊策略网络,也不聊扩散模型,聊点“硬”的——机器人动力学。为啥突然写这个?因为前两天我在调试一个机械臂的力控接口,用的是某国产协作臂,官方SDK里给的力矩前馈模型,在低速空载的时候跑得挺顺,结果一加上负载、速度稍微提起来,末端轨迹直接开始画龙,电机嗡嗡作响,跟得了帕金森似的。查了半天,最后发现是动力学模型里惯性矩阵的耦合项算错了,科氏力和离心力那一坨压根没更新。那一刻我深刻意识到,不管上层VLA模型多花哨,你最后输出的是关节力矩指令,底层物理不对,全是白搭。
所以今天这篇,咱们就把机器人动力学里最核心的两套推导框架——拉格朗日方程和牛顿-欧拉递推,掰开了揉碎了讲清楚。这不是纯理论课,我会结合我实际调参、写代码时踩过的坑来讲。看完这篇,你至少能看懂URDF里那些<inertial>标签是怎么转化成矩阵的,也能明白为什么有些论文里的动力学辨识实验要做那么久。
先说说拉格朗日法。这个方法的核心思路是“能量视角”,你不需要去分析每个关节内部复杂的约束力,只需要写出系统的动能和势能。拉格朗日量L = T - V,然后代入欧拉-拉格朗日方程:d/dt(∂L/∂q̇) - ∂L/∂q = τ。这里的q是广义坐标,对于咱们常见的旋转关节,就是关节角度。
听起来很优雅对吧?但实际写代码的时候,你会发现一个致命问题:当你把动能T = 1/2 q̇ᵀ M(q) q̇展开,然后去求∂L/∂q和d/dt(∂L/∂q̇)的时候,那个符号推导的复杂度是指数级上升的。我当年用Matlab的Symbolic Toolbox推导一个6轴机械臂的完整动力学方程,整整跑了三个小时,最后生成的表达式有十几