第一章:课程导论与坐标系基础
各位同学,欢迎来到《飞行器轨迹规划与跟踪控制实战》。我是这门课的主讲,一个在飞行器控制领域摸爬滚打了十来年的工程师。今天咱们先不急着上代码,把坐标系这个基本功打扎实了,后面才能飞得稳。
说实话,我见过太多新手,一上来就盯着轨迹规划算法看,结果仿真时飞机乱飞,最后发现是坐标系搞反了。嗯,这种坑我自己也踩过,所以咱们第一章就把地基夯实。
1.1 飞行器轨迹规划概述
轨迹规划,说白了就是回答三个问题:
- 从哪出发?(初始状态)
- 要去哪?(目标状态)
- 怎么走?(路径与时间序列)
你想想看,无人机送快递、汽车自动驾驶、甚至火箭回收,核心都是这个逻辑。我个人习惯把轨迹规划分成两层:
- 路径规划:只关心空间几何路径,不管速度。比如A点到B点怎么绕开障碍物。
- 轨迹规划:在路径基础上加上时间约束。比如什么时候加速、什么时候减速。
我在项目中遇到过最头疼的事,就是路径规划明明没问题,但一加上动力学约束,飞机就抖得像筛子。后来发现,是坐标系转换时少乘了一个旋转矩阵。所以,坐标系这东西,再怎么强调都不为过。
核心观点:轨迹规划的本质 = 几何路径 + 时间律 + 动力学可行性。坐标系是这一切的数学基础。
1.2 常用坐标系
飞行器控制里常用的坐标系,其实就三大类。我刚开始学的时候也觉得多,但用熟了就会发现,每个坐标系都有自己的「主场」。
1.2.1 地心地固坐标系(ECEF)
这个坐标系的原点在地球质心。Z轴指向北极,X轴指向本初子午线与赤道的交点,Y轴按右手定则确定。说白了,它是一个跟着地球一起转的坐标系。
- 用途:GPS定位、卫星轨道计算。
- 特点:全球统一,但在地表附近用起来不直观。
1.2.2 北东地坐标系(NED)
这个坐标系的原点通常选在飞行器起飞点或地面站。X轴指向北,Y轴指向东,Z轴指向地心(也就是「向下」)。
- 用途:地面站显示、航点规划。
- 特点:直观!你站在地面上,北就是北,东就是东。
我的小技巧:做地面站软件时,我习惯用NED坐标系来显示飞行器位置。因为操作员一看「北偏东30度」,脑子里马上就有画面了。如果用ECEF,一堆大数字,谁看得懂?
1.2.3 机体坐标系(Body Frame)
原点在飞行器质心。X轴指向机头,Y轴指向右翼,Z轴指向下(符合右手定则)。
- 用途:IMU传感器数据、姿态控制。
- 特点:跟着飞机动,传感器读出来的数据天然就是机体坐标系下的。
为什么会这样设计?你想想看,飞机上的加速度计测的是「相对于飞机本身的加速度」,而不是相对于地面的。所以机体坐标系是传感器数据的「母语」。
1.3 坐标系转换
坐标系转换,说白了就是「翻译」。把传感器数据从机体坐标系翻译到NED,或者把GPS坐标从ECEF翻译到NED。翻译的工具就是旋转矩阵。
1.3.1 从ECEF到NED
这个转换需要知道当前位置的经纬度。公式如下:
R_ecef2ned = [
[-sin(lat)*cos(lon), -sin(lat)*sin(lon), cos(lat)],
[-sin(lon), cos(lon), 0 ],
[-cos(lat)*cos(lon), -cos(lat)*sin(lon), -sin(lat)]
]
嗯,这个矩阵看着有点吓人,但别怕。我在项目中一般直接调用库函数,比如Python的pyproj或者C++的GeographicLib。手写的话,经纬度符号搞反一次,飞机就往地底下钻了。
我曾经踩过的坑:有一次做无人机编队,两架飞机的ECEF坐标转换到NED时,我忘了把经纬度从度转成弧度。结果两架飞机在仿真里相距100公里,实际只隔了10米。查了三天bug,最后发现是单位问题。所以,弧度!弧度!弧度!
1.3.2 从NED到机体坐标系
这个转换依赖飞行器的姿态,也就是欧拉角或四元数。先看欧拉角版本:
R_ned2body = R(roll) * R(pitch) * R(yaw)
其中:
R(roll) = [1, 0, 0; 0, cos(φ), -sin(φ); 0, sin(φ), cos(φ)]
R(pitch) = [cos(θ), 0, sin(θ); 0, 1, 0; -sin(θ), 0, cos(θ)]
R(yaw) = [cos(ψ), -sin(ψ), 0; sin(ψ), cos(ψ), 0; 0, 0, 1]
注意旋转顺序!我习惯用Z-Y-X(偏航-俯仰-横滚),这是航空航天领域的标准。如果你顺序搞反了,飞机姿态会完全乱套。
1.4 欧拉角与四元数
说到姿态表示,就绕不开欧拉角和四元数。这两个东西,我当年学的时候也是一头雾水。现在给你讲清楚。
1.4.1 欧拉角
欧拉角就是三个角度:偏航角(Yaw)、俯仰角(Pitch)、横滚角(Roll)。直观!一看就懂。
- 优点:物理意义明确,人脑容易理解。
- 缺点:有万向锁问题。当俯仰角接近±90度时,偏航和横滚会耦合,丢失一个自由度。
避坑指南:如果你做的是固定翼飞机或者赛车,俯仰角很少超过±30度,用欧拉角完全没问题。但如果你做的是特技无人机或者全向飞行器,俯仰角可能到90度甚至更大,这时候必须用四元数。
1.4.2 四元数
四元数是一个四维向量:q = [w, x, y, z],其中w是实部,x,y,z是虚部。它没有万向锁问题,而且插值平滑。
// 四元数乘法(C++风格)
Quaternion q1, q2;
Quaternion q_result;
q_result.w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z;
q_result.x = q1.w*q2.x + q1.x*q2.w + q1.y*q2.z - q1.z*q2.y;
q_result.y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x;
q_result.z = q1.w*q2.z + q1.x*q2.y - q1.y*q2.x + q1.z*q2.w;
看着复杂?其实你只需要记住:四元数乘法对应旋转的复合。两个旋转叠加,就是四元数相乘。
我的建议:代码里统一用四元数做姿态运算,只在显示和调试时转成欧拉角。这样既避免了万向锁,又保留了可读性。我在PX4飞控里就是这么干的。
1.5 本章知识体系
下面这张图,是我自己画的本章知识结构。你看一眼,心里就有谱了。
这张图把本章的核心逻辑串起来了:三个坐标系是基础,通过旋转矩阵和姿态表示相互转换,最终服务于轨迹规划和控制的各个环节。
1.6 小结
这一章我们聊了:
- 轨迹规划的本质是「路径+时间+动力学」
- 三大坐标系:ECEF(全球定位)、NED(地面操作)、Body(传感器)
- 坐标系转换靠旋转矩阵,注意单位(弧度!)和旋转顺序
- 欧拉角直观但有万向锁,四元数稳定但抽象
我个人觉得,坐标系这东西,光看理论是不够的。你最好打开一个仿真环境,把一架虚拟飞机放在不同坐标系下,看看它的位置和姿态是怎么变的。动手试一次,比看十遍书都管用。
好,这一章就到这里。记住,坐标系是飞行器控制的「语言」,语言不通,后面寸步难行。