1. 惯性导航基础:从原理到实战

大家好,我是老张。做惯导这行十几年了,今天咱们聊聊惯性导航的基础。说实话,很多新人一上来就啃公式,结果越看越懵。我的建议是——先理解它「为什么能工作」,再去看「怎么算」。

1.1 惯性导航原理:说白了就是「猜」

惯性导航的原理,其实特别朴素。你想想看,一个人闭着眼睛走路,怎么知道自己在哪?靠的是感觉——迈一步、拐个弯,心里大概有个数。惯导系统也一样:它用加速度计测「走了多远」,用陀螺仪测「转了多少度」,然后从起点开始一步步推算当前位置。

这个过程叫「航位推算」(Dead Reckoning)。嗯,名字有点吓人,但本质就是积分。加速度积分得速度,速度积分得位置。陀螺仪积分得角度。

核心公式(心里有数就行):

  • 速度:v(t) = v(0) + ∫ a(t) dt
  • 位置:p(t) = p(0) + ∫ v(t) dt
  • 姿态:θ(t) = θ(0) + ∫ ω(t) dt

说白了,就是三个积分。但积分这东西,误差会越积越大。所以惯导系统必须配合其他手段(比如零速修正)来消除漂移。

我的经验: 我在做行人惯导项目时,最头疼的就是积分漂移。有一次测试,走了10分钟,位置误差飘了200多米。后来发现是加速度计零偏没校准好。所以啊,积分之前,先把传感器摸透。

1.2 常用坐标系:你得知道「你在哪」和「你朝哪」

做惯导,坐标系是绕不开的。我刚开始学的时候,被各种坐标系搞晕过。后来总结了一个笨办法:只记两个最常用的。

1.2.1 导航坐标系(n系)

导航系,说白了就是「大地参考系」。通常用东北天(ENU)或者北东地(NED)。我个人习惯用东北天,因为直观——东是x,北是y,天是z。你站在地上,往东走就是x正方向,往北走就是y正方向,往上跳就是z正方向。

1.2.2 载体系(b系)

载体系就是「设备自己的坐标系」。比如你手机平放,屏幕朝上,x轴向右,y轴向前,z轴向上。这个坐标系跟着设备转。陀螺仪和加速度计测出来的数据,都是在这个坐标系下的。

注意: 导航系和载体系之间的转换,是惯导的核心。我曾经见过一个同事,把坐标系搞反了,结果姿态解算出来全是反的。嗯,那天的测试数据直接废了。

1.3 姿态表示方法:欧拉角 vs 四元数

姿态表示,就是描述「设备现在朝哪」。常用的有两种:欧拉角和四元数。我建议你两个都掌握,因为各有各的用处。

1.3.1 欧拉角

欧拉角用三个角度表示:航向角(yaw)、俯仰角(pitch)、横滚角(roll)。直观,好理解。比如「航向30度,俯仰10度,横滚5度」,你脑子里能立刻想象出设备的姿态。

但欧拉角有个大坑——万向锁。当俯仰角接近±90度时,航向和横滚会耦合,解算会出问题。我在做无人机项目时遇到过,飞机垂直爬升时姿态突然跳变,吓出一身冷汗。

1.3.2 四元数

四元数用四个数表示姿态:q = [q0, q1, q2, q3]。它没有万向锁问题,计算也快。缺点是不直观——你看到四个数,完全想象不出设备朝哪。

实际项目中,我一般用四元数做解算,用欧拉角做显示。两者之间可以互相转换,代码也不复杂。

// 四元数转欧拉角(C语言示例)
void quat_to_euler(float q[4], float *yaw, float *pitch, float *roll) {
    *yaw   = atan2(2*(q[1]*q[2] + q[0]*q[3]), 
                   1 - 2*(q[2]*q[2] + q[3]*q[3]));
    *pitch = asin(2*(q[0]*q[2] - q[1]*q[3]));
    *roll  = atan2(2*(q[0]*q[1] + q[2]*q[3]), 
                   1 - 2*(q[1]*q[1] + q[2]*q[2]));
}

我的建议: 新手先用欧拉角理解概念,但实际写代码时一定要用四元数。我曾经在项目里偷懒用欧拉角做解算,结果在俯仰角85度时姿态直接崩了。从那以后,我再也不敢在核心算法里用欧拉角了。

1.4 捷联惯导基本方程:核心中的核心

捷联惯导,就是把传感器「绑」在设备上,没有机械平台。基本方程描述了姿态、速度、位置怎么更新。嗯,这里要稍微上点公式了,但别怕,我会用白话解释。

1.4.1 姿态更新方程

姿态更新,就是用陀螺仪测的角速度去更新四元数。公式长这样:

q_new = q_old + 0.5 * dt * q_old ⊗ ω

其中⊗表示四元数乘法,ω是角速度。说白了,就是每过一个dt时间,把角速度积分到姿态里。

1.4.2 速度更新方程

速度更新,就是把加速度计测的比力转换到导航系,然后减去重力,再积分:

v_new = v_old + dt * (C * f - g)

C是姿态矩阵(由四元数算出),f是加速度计测的比力,g是重力。这里要注意:加速度计测的是「比力」,不是真正的加速度。比力包含了重力,所以要先减去重力。

1.4.3 位置更新方程

位置更新最简单,就是速度积分:

p_new = p_old + dt * v_new

实战要点:

  • 姿态更新要快(通常100Hz以上),因为角速度变化快
  • 速度更新可以慢一点(50Hz左右)
  • 位置更新最慢(10-20Hz就够了)
  • 重力补偿一定要准,否则垂直方向会飘

避坑指南: 我曾经在项目里把重力补偿搞反了,结果解算出来的位置一直在往下掉。查了两天才发现,原来是坐标系定义搞混了。所以啊,做惯导之前,先把坐标系和符号约定写清楚,贴在工位上。

1.5 本章知识体系总览

下面这张图,是我自己画的惯导基础框架。你把它记在脑子里,后面学零速修正就轻松多了。

惯性导航基础 - 知识体系 惯性导航原理 常用坐标系 导航系(n系)- 东北天 载体系(b系)- 右前上 姿态表示方法 欧拉角(直观,有万向锁) 四元数(无奇点,计算快) 捷联惯导基本方程 姿态更新(陀螺仪积分) 速度更新(比力-重力) 位置更新(速度积分) 核心:积分推算 + 坐标系转换 + 重力补偿

这张图把本章的核心内容串起来了。你从「惯性导航原理」出发,往左学坐标系,往右学姿态表示,往下学基本方程。三者结合,就是惯导的完整基础。


专注资料整理