坐标系基础:WGS84坐标系、地心地固坐标系、东北天坐标系、机体坐标系
做植保无人机航线规划,坐标系是绕不开的第一道坎。我刚开始接触这个领域时,也被这些坐标系搞得晕头转向。说白了,坐标系就是描述位置的「语言」,不同场景要用不同的语言。今天咱们就把这四种坐标系彻底讲明白。
1. WGS84坐标系——全球通用的「经纬度」语言
WGS84,全称World Geodetic System 1984。你手机里的GPS定位,用的就是它。它用经度、纬度和海拔高度来描述一个点。
举个例子:我家那块试验田的坐标是(116.397°E, 39.908°N, 50m)。这就是WGS84的表达方式。
核心要点:
- 经度范围:-180° ~ 180°(东经为正,西经为负)
- 纬度范围:-90° ~ 90°(北纬为正,南纬为负)
- 高度:椭球高,不是海拔高
⚠️ 注意:WGS84的高度是相对于参考椭球面的,不是真实海拔。我曾经在山区作业时,直接用WGS84高度做仿地飞行,结果飞机差点撞山。后来才意识到,山区需要EGM96或EGM2008大地水准面模型来修正。
2. 地心地固坐标系(ECEF)——从地球中心看世界
ECEF,Earth-Centered Earth-Fixed。它把地球中心作为原点,X轴指向本初子午线与赤道的交点,Z轴指向北极,Y轴按右手定则确定。
为什么要用ECEF?因为WGS84的经纬度计算距离很麻烦。你想想看,1度经度在赤道上是111km,到了北极就变成0了。而ECEF是直角坐标系,计算两点距离直接用勾股定理就行。
转换公式其实不复杂:
// WGS84转ECEF
double a = 6378137.0; // 地球长半轴
double f = 1/298.257223563; // 扁率
double e2 = 2*f - f*f; // 第一偏心率平方
double N = a / sqrt(1 - e2 * sin(lat) * sin(lat));
double x = (N + h) * cos(lat) * cos(lon);
double y = (N + h) * cos(lat) * sin(lon);
double z = (N * (1 - e2) + h) * sin(lat);
嗯,这里要注意:公式里的lat和lon要用弧度制。我见过不少新手直接拿度数往里套,结果算出来的坐标飞到太平洋去了。
3. 东北天坐标系(ENU)——局部导航的好帮手
ENU,East-North-Up。它以你当前的位置为原点,东为X轴,北为Y轴,天为Z轴。说白了,就是「以我为中心」的坐标系。
为什么植保无人机要用ENU?因为航线规划时,你关心的是「飞机相对于起飞点往东飞100米,往北飞200米」,而不是「飞机在哪个经纬度」。
我个人习惯的做法是:
- 把起飞点的WGS84坐标转成ECEF
- 以起飞点为原点建立ENU坐标系
- 所有航线点都用ENU坐标来表达
- 飞行时实时转回WGS84给GPS模块用
💡 经验之谈:ENU坐标系的范围不宜太大。我一般控制在10km以内,超过这个范围,地球曲率的影响就会显现,航线会偏。有一次我在一个5000亩的大农场作业,用ENU规划了整片区域,结果飞到远端时,实际位置和规划位置差了将近2米。从那以后,大田块我都会分块处理。
4. 机体坐标系(Body Frame)——飞机自己的坐标系
机体坐标系固定在飞机上。原点在飞机重心,X轴指向机头,Y轴指向右翼,Z轴指向下方(符合右手定则)。
这个坐标系主要用来描述飞机的姿态和传感器数据。比如:
- IMU测量的加速度和角速度,都是机体坐标系下的
- GPS的航向角,是相对于北方向的
- 磁力计测量的磁场,也是机体坐标系下的
航线规划时,机体坐标系用得不多。但有一个场景很关键——避障。当飞机检测到前方有障碍物时,这个「前方」就是机体坐标系下的前方。你需要把它转换到ENU坐标系,才能知道障碍物在地图上的实际位置。
坐标系转换关系总结:
| 从 | 到 | 转换方法 |
|---|---|---|
| WGS84 | ECEF | 公式转换(见上文代码) |
| ECEF | ENU | 旋转矩阵 + 平移 |
| ENU | 机体 | 根据航向角、俯仰角、横滚角旋转 |
⚠️ 避坑指南:我曾经在写飞控代码时,把机体坐标系的Z轴方向搞反了。按照航空惯例,Z轴向下为正。但我习惯性地认为「向上为正」,结果飞机一解锁就往地里钻。嗯,这个教训挺深刻的,花了半天才排查出来。
5. 实际应用中的坐标系选择
做航线规划时,我的建议是:
- 数据存储:用WGS84。这是行业标准,所有地图和GIS软件都支持。
- 航线计算:用ENU。简单直观,加减法就能搞定。
- 传感器融合:用ECEF。精度高,适合长距离。
- 姿态控制:用机体坐标系。这是飞控的底层语言。
你想想看,如果全程只用WGS84做航线计算,每次都要算球面距离、大圆航线,代码复杂度会高很多。而用ENU,就是简单的平面几何,小学生都能算明白。
最后说一句:坐标系转换的代码,一定要写单元测试。我见过太多因为转换参数写错导致的炸机事故。别问我怎么知道的——我自己的代码就炸过两次。