1、向量基础:三维空间向量定义、点积与叉积的物理意义、向量投影在飞控姿态解算中的应用
各位同学,咱们今天聊点实在的。
做飞控这么多年,我越来越觉得,向量这东西就是嵌入式算法的「基本功」。你想想看,无人机在天上飞,它怎么知道自己朝哪?怎么知道该往哪转?说白了,全靠向量在背后撑腰。今天这一章,我就带你把向量的底裤扒干净。
1.1 三维空间向量:不只是三个数
向量是什么?教科书上说是「既有大小又有方向的量」。嗯,没错,但我觉得更直白的理解是——向量就是一把尺子加一个箭头。
在三维空间里,我们通常用三个分量来表示一个向量:
// 三维向量结构体,我习惯这么写
typedef struct {
float x; // 沿X轴的分量
float y; // 沿Y轴的分量
float z; // 沿Z轴的分量
} Vector3f;
举个例子,无人机当前位置是 (1, 2, 3),目标点是 (4, 6, 8)。那从当前位置指向目标点的向量就是 (3, 4, 5)。这个向量告诉你两件事:距离多远(大小),往哪走(方向)。
核心要点:在飞控里,向量无处不在——加速度计测的是重力向量,陀螺仪测的是角速度向量,地磁计测的是磁场向量。你处理的每一个传感器数据,本质上都是向量。
1.2 点积:两个向量的「亲密程度」
点积,也叫内积。公式很简单:
a · b = |a| × |b| × cos(θ)
或者用分量形式:
a · b = a.x * b.x + a.y * b.y + a.z * b.z
但物理意义是什么?我个人理解,点积衡量的是两个向量「有多像」。
- 如果点积为正,说明它们方向大致相同(夹角小于90°)
- 如果点积为零,说明它们互相垂直(夹角90°)
- 如果点积为负,说明它们方向相反(夹角大于90°)
我在项目中遇到过这样一个场景:用加速度计判断无人机是否水平。理想情况下,重力向量是 (0, 0, -g)。如果无人机水平,加速度计测到的向量应该和重力向量方向一致。这时候点积最大。一旦无人机倾斜,点积就会变小。嗯,这就是一个非常实用的判据。
实用技巧:在代码里判断两个向量是否「几乎平行」,可以用点积除以模长乘积,结果接近1就对了。别用绝对相等,浮点数有精度问题。
1.3 叉积:旋转的「方向盘」
叉积就更有意思了。它的结果是一个新的向量,方向垂直于原来的两个向量。公式是:
a × b = |a| × |b| × sin(θ) × n
其中 n 是垂直于 a 和 b 的单位向量。分量形式:
a × b = (a.y*b.z - a.z*b.y,
a.z*b.x - a.x*b.z,
a.x*b.y - a.y*b.x)
叉积的物理意义,说白了就是「旋转的轴」。你想想看,两个向量张成一个平面,叉积就是垂直于这个平面的方向——这不就是旋转轴吗?
在飞控里,叉积最经典的应用就是姿态误差计算。我举个例子:
// 计算当前姿态与目标姿态之间的误差
Vector3f error = cross(current_attitude, target_attitude);
// 这个 error 向量就是我们要补偿的旋转轴和角度
为什么会这样?因为当两个单位向量夹角很小时,叉积的模长近似等于夹角的正弦值,而方向就是旋转轴。这就是为什么很多飞控算法里,直接用叉积代替复杂的三角函数计算——省时间啊!
注意:叉积不满足交换律!a × b = - (b × a)。我曾经在调试时搞反了顺序,结果无人机疯狂自旋……嗯,从那以后我再也不敢搞错叉积的顺序了。
1.4 向量投影:把向量「压」到另一个方向
投影这个概念,说白了就是「一个向量在另一个向量方向上的影子」。
公式:
proj_b(a) = (a · b̂) × b̂
其中 b̂ 是 b 方向的单位向量。
在飞控里,投影的应用太常见了。我挑一个最典型的——地磁计数据的水平分量提取。
地磁计测到的是三维磁场向量。但无人机姿态解算时,我们只关心水平方向的磁场分量(用来确定航向)。怎么做?把磁场向量投影到水平面上就行了。
// 提取磁场向量的水平分量
Vector3f gravity = (0, 0, 1); // 假设重力方向已知
Vector3f mag = read_magnetometer();
// 计算重力方向上的分量
float vertical_component = dot(mag, gravity);
Vector3f vertical_vector = gravity * vertical_component;
// 水平分量 = 原始向量 - 垂直分量
Vector3f horizontal = mag - vertical_vector;
你看,一个投影操作,就把三维问题降成了二维问题。这就是数学工具的威力。
1.5 综合应用:姿态解算中的向量三板斧
好了,咱们把前面三个工具串起来,看看在飞控姿态解算中它们是怎么配合的。
典型的互补滤波姿态解算流程:
- 陀螺仪积分得到初步姿态(四元数或旋转矩阵)
- 加速度计测量重力向量,与当前姿态预测的重力方向做叉积,得到俯仰和横滚的误差
- 地磁计测量磁场向量,与当前姿态预测的磁场方向做叉积,得到航向误差
- 用点积检查传感器数据是否可信(比如加速度计是否处于自由落体状态)
- 用投影提取有用分量,剔除干扰
总结一下:
- 点积:判断方向一致性,计算投影长度
- 叉积:计算旋转轴和误差角度
- 投影:提取特定方向的分量,降维处理
这三板斧用好了,飞控姿态解算的核心逻辑你就拿下了八成。
最后说一句,向量运算在嵌入式上要特别注意效率。我建议能用整数运算就别用浮点,能用查表就别实时计算。毕竟飞控是实时系统,每一微秒都很宝贵。
下一章咱们聊四元数,那玩意儿比欧拉角优雅多了。到时候你就知道,向量只是开胃菜,真正的硬菜还在后头。