4. 执行器冗余设计:舵机/电机冗余与控制分配策略
执行器冗余,说白了就是给飞机多装几套“手脚”。
我在做物流无人机项目时,遇到过最头疼的问题就是舵机卡死。那次试飞,飞机刚离地3米,副翼舵机突然卡在15度位置。幸好我们提前做了冗余设计,另一套舵机立刻接管,飞机才没翻过去。从那以后,我对执行器冗余这块就特别上心。
4.1 舵机冗余:双套备份
舵机冗余最常见的方式就是双舵机并联。两个舵机通过连杆同时驱动同一个舵面。
你想想看,如果一个舵机坏了,另一个还能继续工作。但这里有个坑——两个舵机如果较劲,反而会互相消耗。
我曾经在项目里吃过亏:两个舵机型号不同,响应速度不一致。结果一个舵机拼命往前推,另一个拼命往后拉,舵面纹丝不动,电流却飙升到3A。最后舵机烧了,飞机也炸了。
教训:冗余舵机必须型号一致,且做同步校准。
舵机冗余的典型架构:
- 热备份:两个舵机同时通电,同时接收指令。一个失效,另一个无缝切换。
- 冷备份:主舵机工作,备舵机断电。主舵机故障时,备舵机才上电启动。
- 表决模式:三个舵机同时工作,取两个相同的结果执行。这是最可靠的,但成本也最高。
我个人习惯用热备份。虽然功耗大一点,但切换时间几乎为零。冷备份有个问题——备舵机上电瞬间会有冲击,搞不好会带偏舵面。
4.2 电机冗余:双绕组电机
电机冗余,最经典的就是双绕组电机。说白了,就是一台电机里绕了两套线圈。
正常工作时,两套绕组同时出力。如果一套绕组烧了,另一套还能继续转。只不过功率会下降一半。
双绕组电机的关键参数:
| 参数 | 正常模式 | 单绕组故障 |
|---|---|---|
| 最大功率 | 100% | 50% |
| 最大扭矩 | 100% | 50% |
| 效率 | 85% | 78% |
| 温升 | 正常 | 偏高(需降额使用) |
双绕组电机不是简单的“1+1=2”。两套绕组之间有互感,设计不好会互相干扰。我建议两套绕组采用不同的PWM频率,比如一套用8kHz,另一套用10kHz。这样能避免拍频干扰。
4.3 控制分配策略
有了冗余的执行器,接下来就是怎么分配控制指令了。这里我重点讲两种方法:伪逆法和加权分配法。
4.3.1 伪逆法
伪逆法,说白了就是解一个超定方程组。
假设你有4个舵机,但只需要控制3个轴(滚转、俯仰、偏航)。那就有4个未知数,3个方程。解不唯一,怎么办?用伪逆求最小范数解。
数学上,控制分配可以写成:
v = B * u
其中v是期望的控制力矩(3x1),B是控制效率矩阵(3xn),u是执行器输出(nx1)。
伪逆解为:
u = B^T * (B * B^T)^(-1) * v
代码实现:
// 伪逆法控制分配
// 输入:期望力矩 v[3],控制效率矩阵 B[3][n]
// 输出:执行器指令 u[n]
void pseudo_inverse_allocation(float v[3], float B[3][MAX_ACTUATORS], float u[MAX_ACTUATORS], int n) {
// 计算 B * B^T
float BBT[3][3] = {0};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < n; k++) {
BBT[i][j] += B[i][k] * B[j][k];
}
}
}
// 求逆(3x3矩阵求逆,这里简化处理)
float inv_BBT[3][3];
matrix_inverse_3x3(BBT, inv_BBT);
// 计算 u = B^T * inv(B*B^T) * v
float temp[3] = {0};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
temp[i] += inv_BBT[i][j] * v[j];
}
}
for (int i = 0; i < n; i++) {
u[i] = 0;
for (int j = 0; j < 3; j++) {
u[i] += B[j][i] * temp[j];
}
}
}
伪逆法有个问题:它不考虑执行器的物理限制。比如舵机只能转±30度,但伪逆算出来可能要求转45度。所以一定要加限幅处理。我一般会在伪逆后面再加一层“限幅-重分配”的迭代。
4.3.2 加权分配法
加权分配法,就是给不同的执行器分配不同的“权重”。
比如,主舵机权重0.8,备舵机权重0.2。正常情况下,主舵机出力多。如果主舵机故障,就把它的权重降到0,备舵机权重升到1。
加权分配的数学形式:
u = W * B^T * (B * W * B^T)^(-1) * v
其中W是对角权重矩阵,对角线元素就是每个执行器的权重。
权重怎么设?我分享一个经验:
- 健康执行器:权重设为1.0
- 部分故障:权重设为0.3~0.7(根据故障程度)
- 完全失效:权重设为0.001(不要设为0,防止矩阵奇异)
权重不能突变!我曾经试过故障瞬间把权重从1降到0,结果控制力矩突变,飞机猛地抖了一下。正确的做法是:用一阶低通滤波平滑过渡,时间常数设0.1~0.3秒。
4.4 控制分配流程图
下面这张图展示了整个控制分配的流程:
4.5 实际项目中的取舍
说了这么多,最后聊聊实际项目怎么选。
我做过一个农业植保机,成本敏感,用了双舵机热备份+伪逆法。因为植保机飞行速度慢,对控制精度要求不高,伪逆法够用了。
另一个是测绘无人机,要求高可靠性。我用了三余度舵机+加权分配法。虽然成本翻倍,但故障率降低了两个数量级。
- 低成本项目:双舵机热备份 + 伪逆法
- 高可靠项目:三余度舵机 + 加权分配法
- 电机冗余:双绕组电机,两套绕组用不同PWM频率
- 权重切换:一定要加平滑过渡,别让飞机“打哆嗦”
嗯,执行器冗余这块就讲这么多。记住一点:冗余不是简单的堆硬件,而是系统性的设计。从舵机选型到控制分配,每一步都要想清楚。
公众号:蓝海资料掘金营,微信deep3321