第1章:坐标系与时间系统
各位同学好,我是老张。搞组合导航这么多年,我最大的体会就是——坐标系和时间系统是定位的根基。根基不稳,后面算法再漂亮也是白搭。今天咱们就把这块硬骨头啃下来。
核心观点:坐标系是定位的“语言”,时间系统是定位的“节拍器”。两者缺一不可。
1.1 地心地固坐标系(ECEF)
ECEF坐标系,说白了就是一个固定在地球上的三维直角坐标系。原点在地球质心,Z轴指向北极,X轴指向本初子午线与赤道的交点,Y轴按右手定则确定。
我在做车载导航项目时,经常需要把GPS输出的ECEF坐标转成经纬度。这里有个坑——ECEF坐标的单位是米,但数值通常很大(地球半径约6371km),计算时要注意数值稳定性。
ECEF坐标定义:
- 原点:地球质心
- Z轴:指向地球北极(CIO)
- X轴:指向本初子午线与赤道交点
- Y轴:按右手定则确定(东经90度方向)
我的经验:ECEF坐标在卫星导航解算中非常常用,因为卫星位置和接收机位置都在这个坐标系下,计算距离直接做差就行,不用考虑地球曲率。
1.2 地理坐标系(LLA)
地理坐标系就是我们常说的经纬度+海拔高度。纬度(Latitude)范围-90°到90°,经度(Longitude)范围-180°到180°,高度(Altitude)是相对于参考椭球面的高度。
这里要注意,GPS输出的高度是椭球高,不是海拔高。我曾经有个项目,用户非要看海拔高度,结果发现差了十几米——因为椭球面和大地水准面不重合。
LLA与ECEF的转换公式:
// 经纬度转ECEF
x = (N + h) * cos(lat) * cos(lon)
y = (N + h) * cos(lat) * sin(lon)
z = (N * (1 - e^2) + h) * sin(lat)
// 其中N为卯酉圈曲率半径
N = a / sqrt(1 - e^2 * sin(lat)^2)
// a为椭球长半轴,e为第一偏心率
注意:WGS-84椭球参数:a = 6378137.0 m,e^2 = 0.00669437999014。不同椭球参数会导致几十米的差异,做高精度定位时一定要确认用的是哪个椭球。
1.3 导航坐标系(n系)
导航坐标系,也叫“东北天”坐标系。原点在载体所在位置,X轴指向东,Y轴指向北,Z轴指向天顶。这个坐标系在惯性导航中特别常用。
为什么叫n系?因为导航计算通常在这个坐标系下进行。你想想看,在ECEF下算姿态多麻烦,但在n系下,重力方向就是Z轴负方向,直观多了。
n系的特点:
- 原点随载体移动
- 坐标轴指向固定(东、北、天)
- 重力方向明确(Z轴负方向)
- 适合姿态解算和导航计算
我记得有一次做无人机飞控,姿态解算在n系下做,结果发现偏航角漂移得厉害。后来查了半天,原来是n系下的地球自转角速度补偿没做好。嗯,这个细节很容易被忽略。
1.4 载体坐标系(b系)
载体坐标系是固定在运动载体上的坐标系。通常定义:X轴指向载体前进方向(前),Y轴指向载体右侧(右),Z轴指向载体下方(下)。这就是我们常说的“前右下”坐标系。
IMU(惯性测量单元)输出的加速度和角速度,默认就是在b系下的。所以要把IMU数据用到导航计算中,必须先做坐标系转换。
b系与n系的转换:
// 姿态矩阵(方向余弦矩阵)
C_b^n = [
[cos(θ)cos(ψ), sin(φ)sin(θ)cos(ψ)-cos(φ)sin(ψ), cos(φ)sin(θ)cos(ψ)+sin(φ)sin(ψ)],
[cos(θ)sin(ψ), sin(φ)sin(θ)sin(ψ)+cos(φ)cos(ψ), cos(φ)sin(θ)sin(ψ)-sin(φ)cos(ψ)],
[-sin(θ), sin(φ)cos(θ), cos(φ)cos(θ)]
]
// φ:横滚角, θ:俯仰角, ψ:航向角
避坑指南:我曾经在车载项目里,IMU安装方向搞反了,结果车往左拐,导航显示往右转。后来我养成了习惯——每次装完IMU,先手动转一下载体,看看输出对不对。
1.5 坐标系转换关系
搞清楚了各个坐标系,接下来就是它们之间的转换。我画了一张图,把核心逻辑串起来:
这张图展示了四个坐标系之间的核心转换关系。ECEF和LLA之间是经纬度与直角坐标的互转;ECEF到n系需要位置矩阵;n系和b系之间靠姿态矩阵联系。
1.6 GPS时间系统与UTC时间
时间系统这块,很多初学者容易搞混。GPS时间系统是一个连续的时间系统,从1980年1月6日0时开始计数,单位是周+秒。而UTC时间有闰秒调整,所以两者会差一个整数秒。
GPS时间特点:
- 起点:1980年1月6日0时(UTC)
- 计数方式:GPS周 + 周内秒
- 无闰秒调整,连续递增
- 与UTC的偏差:目前约18秒(2024年)
时间转换公式:
// GPS时间转UTC
UTC = GPS时间 - 闰秒偏差
// 例如:GPS周=2321,周内秒=345600
// 对应UTC时间 = 2024年1月1日 00:00:00 - 18秒
// = 2023年12月31日 23:59:42
重要提醒:GPS接收机输出的时间默认是GPS时间。如果你需要UTC时间,一定要做闰秒修正。我见过有人直接把GPS时间当UTC用,结果时间戳差了18秒,整个数据对齐全乱了。
为什么会差这么多?因为地球自转在变慢,UTC需要不定期加闰秒来保持与天文时间同步。GPS时间不管这些,只管自己往前走。嗯,这个设计其实挺聪明的——导航计算需要连续时间,闰秒跳变会搞乱计算。
我的习惯:在组合导航系统中,内部统一用GPS时间。只在数据输出给用户时,才转成UTC。这样避免了时间跳变带来的麻烦。
1.7 本章小结
这一章我们讲了四个坐标系和一个时间系统。说白了,坐标系就是给位置和姿态找个参考基准,时间系统就是给数据打上时间戳。搞组合导航,这两样东西必须烂熟于心。
我个人建议,初学者先把ECEF和LLA的互转代码写一遍,再手动算几个点验证一下。等这个搞熟了,再去看n系和b系的姿态转换。一步一步来,别着急。
最后说一句——坐标系转换的代码,一定要做单元测试。我当年就是偷懒没测,结果一个符号错误让整个系统跑偏了三天。血的教训啊。
公众号:蓝海资料掘金营,微信deep3321