2. 坐标系定义:机体坐标系、地理坐标系、如何转换?
做飞控这么多年,我见过太多新手在坐标系转换上栽跟头。说实话,坐标系这东西,你理解透了,后面所有控制逻辑都顺了。理解不透,调试的时候就像在迷宫里打转。
今天咱们就把这两个坐标系掰开揉碎讲清楚。
2.1 地理坐标系:你的“绝对参考”
地理坐标系,也叫导航坐标系。说白了,就是地面上的一个固定坐标系。我习惯用 NED 标准——北东地。
- X轴:指向正北
- Y轴:指向正东
- Z轴:指向地心(向下)
为什么 Z 轴向下?嗯,这里有个小故事。早期惯性导航系统装在飞机上,飞行员更关心“离地面有多远”,而不是“离天空有多远”。所以 Z 轴向下就成了行业惯例。
关键点:地理坐标系是惯性测量单元的“基准”。你的加速度计、陀螺仪测出来的数据,最终都要转换到这个坐标系下才有意义。
2.2 机体坐标系:跟着飞机走的坐标系
机体坐标系就简单了——它绑在飞机上,飞机怎么动,它就怎么动。
- X轴:沿机头方向
- Y轴:指向右翼
- Z轴:指向机腹(向下)
我在项目中遇到过一个问题:有个同事把机体坐标系的 Y 轴定义反了,结果横滚控制一直反着来。飞机往左打舵,它往右滚。查了两天才发现是坐标系定义的问题。所以,定义坐标系时一定要统一标准。
2.3 为什么要转换?
你想想看,加速度计装在飞机上,它测到的是“相对于飞机本身的加速度”。但你要控制飞机飞向正北,你需要知道的是“相对于地面的加速度”。
这两个坐标系之间差了飞机的姿态角——横滚、俯仰、偏航。不转换,你拿到的数据就是错的。
2.4 转换方法:旋转矩阵
转换的核心就是旋转矩阵。我习惯用 Z-Y-X 顺序(偏航→俯仰→横滚)来做。
从机体坐标系到地理坐标系的旋转矩阵长这样:
R = Rz(ψ) * Ry(θ) * Rx(φ)
其中:
φ = 横滚角 (Roll)
θ = 俯仰角 (Pitch)
ψ = 偏航角 (Yaw)
Rz(ψ) = [cosψ -sinψ 0]
[sinψ cosψ 0]
[0 0 1]
Ry(θ) = [cosθ 0 sinθ]
[0 1 0 ]
[-sinθ 0 cosθ]
Rx(φ) = [1 0 0 ]
[0 cosφ -sinφ]
[0 sinφ cosφ]
我的小技巧:写代码时别手算这个矩阵,直接用库函数。我早期手算错过一次符号,炸了一架机。从那以后,矩阵运算全交给库了。
2.5 实际应用:加速度转换
假设你从加速度计读到了机体坐标系下的加速度 a_body = [ax, ay, az]ᵀ,想转换到地理坐标系:
a_nav = R * a_body
// 伪代码示例
float R[3][3] = computeRotationMatrix(roll, pitch, yaw);
float a_nav[3] = {0};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
a_nav[i] += R[i][j] * a_body[j];
}
}
避坑指南:我曾经在转换时搞反了旋转顺序,结果加速度数据完全不对。记住:先偏航,再俯仰,最后横滚。顺序错了,结果全错。
2.6 知识体系总览
下面这张图帮你理清整个坐标系转换的逻辑链条:
2.7 常见问题与避坑
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 转换后加速度方向反了 | Z 轴方向定义不一致 | 统一使用 NED 标准 |
| 横滚控制反向 | Y 轴方向定义反了 | 检查机体坐标系定义 |
| 数据剧烈抖动 | 旋转顺序错误 | 确认 Z-Y-X 顺序 |
| 偏航角漂移 | 磁力计未校准 | 做磁力计校准流程 |
一句话总结:坐标系转换就是“把飞机自己的感觉,翻译成地面能理解的语言”。旋转矩阵就是这本翻译词典。
我的经验:调试时先在仿真环境里验证转换逻辑。我习惯用 MATLAB 的 Robotics Toolbox 做可视化,一眼就能看出转换对不对。别直接上真机试,炸机成本太高。
好了,坐标系定义和转换就讲到这里。记住:定义要统一,顺序不能乱,验证要到位。这三点做到了,坐标系这块你就稳了。