第2章:多旋翼飞行器基础

各位同学,欢迎来到第二讲。今天咱们聊聊多旋翼飞行器的基础知识。说实话,这部分内容看着有点枯燥,但它是后面所有视觉定位和自主降落算法的基石。我自己带项目时,发现很多问题都出在坐标系搞混、姿态理解不透上。所以,咱们把这部分啃扎实了,后面会顺很多。

2.1 飞行原理:它凭什么能飞起来?

多旋翼能飞,核心就四个字:力的平衡。你想想看,四个电机带着螺旋桨转,产生向上的拉力。当总拉力等于重力时,它就悬停;大于重力,它就上升;小于重力,它就下降。

但光有上下还不够,它怎么前后左右移动呢?这就靠差速控制了。比如,我想让飞机往前飞,那就让后面的两个电机转得快一点,前面的转得慢一点。这样机身就会前倾,拉力产生一个水平分量,飞机就往前走了。

我个人习惯把这种控制逻辑记成一句话:「要动哪里,就减哪里的力」。想往右飞,就减右边电机的转速,让机身往右倾斜。嗯,这里要注意,实际飞控里用的是更复杂的PID控制,但底层逻辑就是这个。

核心要点:

  • 垂直运动:总拉力 vs 重力
  • 水平运动:机身倾斜产生水平分力
  • 偏航运动:正反桨扭矩差实现旋转

避坑指南:我曾经在调试一架大轴距四旋翼时,发现它总是往一个方向飘。查了半天,发现是四个电机的安装平面不在一个水平面上。说白了,就是机架本身有扭曲。所以,装机时一定要确保电机座水平,否则飞控再怎么调参都救不回来。

2.2 坐标系定义:别把方向搞反了

做视觉SLAM和自主降落,坐标系是头等大事。我见过太多新手把机体坐标系和世界坐标系搞混,结果算法跑出来飞机直接往地里钻。咱们把这两个坐标系说清楚。

2.2.1 世界坐标系(World Frame)

世界坐标系是固定在地面上的,不随飞机运动而改变。通常我们取起飞点为原点,X轴指向北(或东),Y轴指向东(或北),Z轴指向天。这个坐标系是绝对的,用来描述飞机在空间中的位置。

在视觉SLAM中,我们通常把第一帧相机的位置作为世界坐标系的原点。这样方便,但要注意,这个原点跟GPS的经纬度原点不是一回事。

2.2.2 机体坐标系(Body Frame)

机体坐标系是固定在飞机上的。原点在飞机的重心,X轴指向机头Y轴指向飞机右侧Z轴指向下方(符合右手定则)。这个坐标系是相对的,用来描述飞机的姿态和角速度。

为什么要有机体坐标系?因为飞机上的传感器(IMU、相机、激光雷达)都是跟着飞机一起动的。它们测量的数据,天然就是在机体坐标系下的。我们需要把这些数据转换到世界坐标系下,才能做定位和导航。

重要提醒:不同飞控或算法对坐标轴的定义可能不同。比如,有的把Z轴定义为向上,有的定义为向下。做数据融合时,一定要先确认坐标系定义,否则一个符号错误就能让你的算法崩掉。我习惯在代码开头用注释把坐标系定义写清楚,避免后期踩坑。

2.3 姿态表示:欧拉角 vs 四元数

姿态,说白了就是飞机相对于世界坐标系转了多少。描述这个「转了多少」,主要有两种方式:欧拉角和四元数。咱们一个一个说。

2.3.1 欧拉角(Euler Angles)

欧拉角用三个角度来描述姿态:横滚角(Roll)俯仰角(Pitch)偏航角(Yaw)。你可以想象成:先绕Z轴转Yaw,再绕Y轴转Pitch,最后绕X轴转Roll。这个顺序很重要,不同的旋转顺序会得到不同的结果。

欧拉角的优点是直观,人脑容易理解。但它的致命缺点是万向锁(Gimbal Lock)。当Pitch接近±90度时,Roll和Yaw会变得无法区分,导致姿态解算失效。你想想看,飞机在做特技飞行时,俯仰角很容易接近90度,这时候用欧拉角就非常危险。

欧拉角转换公式(ZYX顺序):

// 从机体坐标系到世界坐标系的旋转矩阵
R = Rz(yaw) * Ry(pitch) * Rx(roll)

// 其中:
Rz(yaw)   = [cos(yaw)  -sin(yaw)  0;
             sin(yaw)   cos(yaw)  0;
             0          0         1]

Ry(pitch)  = [cos(pitch)  0  sin(pitch);
              0           1  0;
             -sin(pitch)  0  cos(pitch)]

Rx(roll)   = [1  0          0;
              0  cos(roll)  -sin(roll);
              0  sin(roll)  cos(roll)]

2.3.2 四元数(Quaternion)

四元数用四个数来表示旋转:q = [w, x, y, z]。其中w是实部,x、y、z是虚部。它没有万向锁问题,而且插值平滑,非常适合用于姿态估计和控制。

我个人习惯在飞控和视觉SLAM算法中全部使用四元数,只在显示给用户看时,才转成欧拉角。为什么呢?因为四元数做姿态融合(比如卡尔曼滤波)非常方便,而且不会出现奇点。

实用技巧:四元数转欧拉角的代码,我建议直接复用成熟的库(如Eigen、ROS的tf库)。自己手写容易出错,尤其是符号处理。我曾经因为一个符号写反,导致飞机在仿真里疯狂自旋,查了两天才发现是四元数转欧拉角的公式用错了。

2.4 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图。它把飞行原理、坐标系、姿态表示串在了一起,方便你建立整体认知。

多旋翼飞行器基础 - 知识体系 飞行原理 力的平衡 差速控制 垂直/水平/偏航 坐标系定义 世界坐标系 机体坐标系 坐标转换 姿态表示 欧拉角 四元数 旋转矩阵 应用:自主降落与视觉定位 姿态估计 → 位置控制 → 视觉引导 → 精准降落 图2-1:本章知识体系结构图

2.5 实战中的坐标系转换

理论说完了,咱们来点实际的。在视觉SLAM中,我们经常需要做这样的转换:

  1. 相机坐标系 → 机体坐标系:相机安装在飞机上,有固定的安装角度和位置偏移。这个转换是固定的,标定一次就能用。
  2. 机体坐标系 → 世界坐标系:这个转换是动态的,取决于飞机当前的姿态和位置。我们用四元数或旋转矩阵来描述这个转换。

举个例子,相机检测到一个降落标志,它在相机坐标系下的坐标是 (0.5, 0.3, 2.0)。我们需要先把它转到机体坐标系,再转到世界坐标系,才能知道这个标志相对于起飞点的真实位置。

代码示例:坐标系转换(伪代码)

// 输入:相机坐标系下的点 P_cam
// 输出:世界坐标系下的点 P_world

// 1. 相机到机体的转换(固定标定)
P_body = R_cam_to_body * P_cam + T_cam_to_body

// 2. 机体到世界的转换(动态)
P_world = R_body_to_world * P_body + T_body_to_world

// 其中 R_body_to_world 由四元数 q 计算得到

常见错误:很多新手在做坐标转换时,忘了加平移向量 T。如果相机安装位置离飞机重心很远(比如装在机臂上),这个平移量就不能忽略。我曾经在项目里因为忘了加这个平移,导致降落时总是偏了20厘米,后来加上就准了。

好了,这一章的内容就到这里。飞行原理、坐标系、姿态表示,这三块是后面所有算法的基础。你可以在脑子里过一遍:飞机怎么飞?数据在哪个坐标系下?姿态用什么表示?把这些想清楚了,后面学视觉SLAM和自主降落就会轻松很多。


专注资料整理