[飞控] 手把手教你修改控制分配矩阵

以前我们简单聊过一下控制分配矩阵的作用和原理

控制分配的目标就是要得到类似于图中的系数,这样可以把所有控制器的输出叠加到电机上。

同时,在装机过程中,这个分配矩阵决定了动力系统的安装顺序

所以这个控制分配是非常重要的。

以APM的“x”型四轴为例:

libraries\AP_Motors\AP_MotorsMatrix.cpp 405

case MOTOR_FRAME_TYPE_X:
  add_motor(AP_MOTORS_MOT_1,   45, AP_MOTORS_MATRIX_YAW_FACTOR_CCW, 1);
  add_motor(AP_MOTORS_MOT_2, -135, AP_MOTORS_MATRIX_YAW_FACTOR_CCW, 3);
  add_motor(AP_MOTORS_MOT_3,  -45, AP_MOTORS_MATRIX_YAW_FACTOR_CW,  4);
  add_motor(AP_MOTORS_MOT_4,  135, AP_MOTORS_MATRIX_YAW_FACTOR_CW,  2);

libraries\AP_Motors\AP_MotorsMatrix.cpp

void AP_MotorsMatrix::add_motor(int8_t motor_num, float angle_degrees, float yaw_factor, uint8_t testing_order)
{
    add_motor(motor_num, angle_degrees, angle_degrees, yaw_factor, testing_order);
}

libraries\AP_Motors\AP_MotorsMatrix.cpp

void AP_MotorsMatrix::add_motor(int8_t motor_num, float roll_factor_in_degrees, float pitch_factor_in_degrees, float yaw_factor, uint8_t testing_order)
{
    add_motor_raw(
        motor_num,                                  //电机序号
        cosf(radians(roll_factor_in_degrees + 90)), //电机在roll方向的系数 
        cosf(radians(pitch_factor_in_degrees)),     //电机在pitch方向的系数 
        yaw_factor,                                 //电机在yaw方向的系数
        testing_order);                             //测试序号 不用管 
}

可以看到在程序中控制分配其实非常简单就是根据电机的位置,计算出三个系数

roll_factor,pitch_factor,yaw_factor。

最后在计算每个电机该输出多少时会用到,至于怎么用暂时先不分析,先看分析怎么计算这个系数。

写一个控制分配需要那几个关键参数呢?

0.飞机的坐标系(隐藏条件)

飞机的坐标系决定了电机顺序。

1.飞机类型

飞机类型决定了电机位置。

2.螺旋桨的旋转方向

为什么我写的是螺旋桨的旋转方向,而不是电机的旋转方向?因为电机是为了配合螺旋桨的,也就是说根本原因是你在这个位置放了正桨,所以这个位置的电机要正转,所以说这个位置怎么转是取决于你在这个位置装什么桨。(这点很重要)

ok,让我们手把手开始吧。

1.定义机体坐标系

那就定个“前右下”坐标系吧,这样电机的顺序就是按顺时针递增了。

2.定义飞机的机型

那就定义一个"x"型吧,这样电机的位置也确定了。

3.定义螺旋桨的旋转方向

我比较喜欢1号螺旋桨为反桨,那么2号就是正桨,3号反桨,4号正桨。

ok我们的飞机就设计完了,长这样。

ok,让我们把这些关键系数填进函数

case 我的飞机:
  add_motor(1号电机,   45, 反桨CCW, 没什么用的序号1);
  add_motor(2号电机,  135, 正桨CW,  没什么用的序号2);
  add_motor(3号电机, -135, 反桨CCW, 没什么用的序号3);
  add_motor(4号电机,  -45, 正桨CW,  没什么用的序号4);
//add_motor(AP_MOTORS_MOT_1,   45, AP_MOTORS_MATRIX_YAW_FACTOR_CCW, 1);
//add_motor(AP_MOTORS_MOT_2,  135, AP_MOTORS_MATRIX_YAW_FACTOR_CCW, 2);
//add_motor(AP_MOTORS_MOT_3, -135, AP_MOTORS_MATRIX_YAW_FACTOR_CW,  3);
//add_motor(AP_MOTORS_MOT_4,  -45, AP_MOTORS_MATRIX_YAW_FACTOR_CW,  4);

写完了,是不是非常简单。恭喜你又学会了一个小技巧。

什么?我还没教你,仔细看图,在你设计分配矩阵的时候,只要你像我一样,把图画出来,然后根据图把系数填进函数,电机分配矩阵就已经完成了,是不是很爽。

对了这里的电机顺序指的是,你装机的时候,需要把一号电机,接在一号PWM输出对应的电调上

你可以开心的装机去了,美滋滋。

顺便给你提个问题,你能根据电机分配矩阵确定对应的飞机安装方式吗?

举个栗子:

APM的“x”型四轴:

case MOTOR_FRAME_TYPE_X:
    add_motor(AP_MOTORS_MOT_1,   45, AP_MOTORS_MATRIX_YAW_FACTOR_CCW, 1);
    add_motor(AP_MOTORS_MOT_2, -135, AP_MOTORS_MATRIX_YAW_FACTOR_CCW, 3);
    add_motor(AP_MOTORS_MOT_3,  -45, AP_MOTORS_MATRIX_YAW_FACTOR_CW,  4);
    add_motor(AP_MOTORS_MOT_4,  135, AP_MOTORS_MATRIX_YAW_FACTOR_CW,  2);

对应的装机结构图为:

快去试试分析一下其他机型的电机分配吧。