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 知识体系总览

下面这张图帮你理清整个坐标系转换的逻辑链条:

机体坐标系 Body Frame X: 机头方向 Y: 右翼方向 旋转矩阵 R 地理坐标系 Navigation Frame X: 正北 Y: 正东 输入数据 加速度计 / 陀螺仪 输出数据 地理坐标系下的加速度 姿态角 横滚 φ 俯仰 θ 偏航 ψ 核心逻辑:机体数据 × 旋转矩阵(姿态角) = 地理数据 旋转矩阵由横滚、俯仰、偏航三个姿态角共同决定

2.7 常见问题与避坑

问题 原因 解决方法
转换后加速度方向反了 Z 轴方向定义不一致 统一使用 NED 标准
横滚控制反向 Y 轴方向定义反了 检查机体坐标系定义
数据剧烈抖动 旋转顺序错误 确认 Z-Y-X 顺序
偏航角漂移 磁力计未校准 做磁力计校准流程

一句话总结:坐标系转换就是“把飞机自己的感觉,翻译成地面能理解的语言”。旋转矩阵就是这本翻译词典。

我的经验:调试时先在仿真环境里验证转换逻辑。我习惯用 MATLAB 的 Robotics Toolbox 做可视化,一眼就能看出转换对不对。别直接上真机试,炸机成本太高。

好了,坐标系定义和转换就讲到这里。记住:定义要统一,顺序不能乱,验证要到位。这三点做到了,坐标系这块你就稳了。


专注资料整理