3. 刚体运动学建模:位置、速度、加速度与角速度的关系

各位同学,欢迎来到动力学建模的核心环节。今天我们要聊的,是无人机飞控算法里最基础、也最容易出错的一块——刚体运动学建模

说白了,就是搞清楚无人机在三维空间里怎么动。位置怎么变?速度怎么算?角速度又是什么鬼?这些搞不清楚,后面PID调得再好,飞机也飞不稳。

我个人习惯,先把坐标系定下来。没有坐标系,一切免谈。

3.1 坐标系:世界坐标系与机体坐标系

无人机运动学建模,至少需要两套坐标系:

  • 世界坐标系(惯性系):固定在地面,通常取北-东-地(NED)或东-北-天(ENU)。我习惯用NED,因为和大多数开源飞控一致。
  • 机体坐标系:固定在无人机上,原点在质心,x轴指向机头,y轴指向右翼,z轴指向下(右手定则)。

嗯,这里要注意:两个坐标系之间的转换,全靠旋转矩阵。你想想看,无人机在空中翻滚,机头指向变了,但地面的北方向没变。怎么把机体上的传感器读数换算到地面?靠的就是旋转矩阵。

核心公式:

位置向量 p 在世界坐标系中表示,速度 v 也是。但角速度 ω 通常在机体坐标系中测量(陀螺仪输出)。

3.2 位置、速度、加速度:线运动学

先讲线运动学。这个相对简单,就是牛顿第二定律在三维空间的推广。

设无人机在世界坐标系中的位置为 p = [x, y, z]^T,那么:

  • 速度:v = dp/dt = [ẋ, ẏ, ż]^T
  • 加速度:a = dv/dt = [ẍ, ÿ, z̈]^T

看起来很简单对吧?但我在项目中遇到过一个问题:加速度计测量的加速度,是机体坐标系下的。而我们要的是世界坐标系下的加速度,用来做位置控制。

所以,必须把加速度计读数通过旋转矩阵转换到世界坐标系。这个转换,我建议写成函数,别每次都手算,容易出错。

我的小技巧:

写代码时,把旋转矩阵 R 定义为从机体到世界的变换。这样,机体坐标系下的向量 v_body,转换到世界就是 v_world = R * v_body。

3.3 角速度与姿态:角运动学

角运动学比线运动学复杂一点。为什么?因为角速度不是姿态的简单导数。

无人机的姿态通常用欧拉角(滚转φ、俯仰θ、偏航ψ)或四元数表示。而陀螺仪直接测量的是机体角速度 ω = [p, q, r]^T。

那么,欧拉角的变化率和机体角速度之间是什么关系?

公式如下:

[φ̇]   [1  sinφ tanθ  cosφ tanθ] [p]
[θ̇] = [0  cosφ        -sinφ    ] [q]
[ψ̇]   [0  sinφ/cosθ  cosφ/cosθ] [r]

这个矩阵,我称之为欧拉角运动学矩阵。注意看,当俯仰角 θ 接近 ±90° 时,tanθ 和 1/cosθ 会趋于无穷大。这就是所谓的万向锁问题。

避坑指南:

我曾经在项目中直接用欧拉角做姿态解算,结果飞机做大俯仰机动时,姿态直接炸了。后来换成四元数,才彻底解决这个问题。

所以,我建议:内部运算用四元数,只在人机交互时转成欧拉角

3.4 四元数运动学方程

四元数没有奇异性,是飞控算法的首选。四元数 q = [q0, q1, q2, q3]^T 的更新方程如下:

q̇ = 0.5 * q ⊗ ω_body

其中 ⊗ 表示四元数乘法,ω_body = [0, p, q, r]^T 是扩展后的角速度向量。

写成矩阵形式:

[q̇0]   [ 0  -p  -q  -r] [q0]
[q̇1] = [ p   0   r  -q] [q1]
[q̇2]   [ q  -r   0   p] [q2]
[q̇3]   [ r   q  -p   0] [q3]

这个方程,每次飞控循环都要跑一遍。我习惯用定点数或单精度浮点,计算量不大,但要注意归一化——四元数必须保持单位长度,否则姿态会漂移。

3.5 完整运动学方程汇总

把线运动和角运动合在一起,就是刚体运动学的完整模型:

物理量 方程 说明
位置 ṗ = v 世界坐标系
速度 v̇ = a_world 加速度需转换坐标系
姿态(四元数) q̇ = 0.5 * q ⊗ ω_body 无奇异性
角速度 ω_body 由陀螺仪测量 机体坐标系

这个表格,我建议你贴在工位上。每次写代码前看一眼,确认自己用的是哪个坐标系。

3.6 知识体系结构图

下面这张图,是我自己梳理的刚体运动学知识结构。你可以把它当作思维导图来用。

刚体运动学建模 坐标系定义 世界坐标系(NED/ENU) 机体坐标系(右手定则) 旋转矩阵 R 线运动学 位置 p = [x, y, z] 速度 v = dp/dt 加速度 a = dv/dt 角运动学 欧拉角 (φ, θ, ψ) 四元数 q = [q0,q1,q2,q3] 角速度 ω = [p, q, r] 线运动方程 角运动方程 ṗ = v, v̇ = a q̇ = 0.5 * q ⊗ ω

这张图把整个运动学模型分成了四个模块:坐标系、线运动、角运动、关键方程。你写代码时,按这个结构来组织函数,逻辑会清晰很多。

3.7 实际项目中的注意事项

最后,分享几个我在实际项目中踩过的坑:

  • 坐标系搞反:旋转矩阵的方向搞错,飞机往反方向飞。我建议每次写完旋转函数,先用单位向量测试一下。
  • 四元数忘记归一化:姿态慢慢漂移,最后失控。归一化要放在每个控制循环里,别偷懒。
  • 欧拉角微分方程用错:特别是俯仰角接近90度时,数值不稳定。我后来全部改用四元数,世界清净了。

我的习惯:

每次写完运动学代码,我都会做一个简单的仿真:给一个恒定的角速度,看姿态是否按预期变化。这个小测试,能帮你发现90%的bug。

好了,刚体运动学建模就讲到这里。记住,坐标系是基础,四元数是核心,归一化是关键。把这些搞明白,后面的动力学和控制学才能站得住脚。


专注资料整理