PX4架构保证了核心控制器中不需要针对机身布局做特别处理。混控指的是把输入指令(例如:遥控器打右转)分配到电机以及舵机的执行器(如电调或舵机PWM)指令。对于固定翼的副翼控制而言,每个副翼由一个舵机控制,那么混控的意义就是控制其中一个副翼抬起而另一个副翼落下。同样的,对多旋翼而言,俯仰操作需要改变所有电机的转速。将混控逻辑从实际姿态控制器中分离出来可以大大提高复用性。 1 控制流程一个特定的控制器(如姿态控制器)发送特定的归一化(-1.. 1)的命令到给混合(mixing),然后混合后输出独立的PWM到执行器(电调,舵机等).在经过输出驱动如(串口,UAVCAN,PWM)等将归一化的值再转回特性的值(如输出1300的PWM等)。如图1所示。 2 控制组PX4 有输入组和输出组的概念,顾名思义:控制输入组(如: attitude),就是用于核心的飞行姿态控制,(如: gimbal )就是用于挂载控制.一个输出组就是一个物理总线,如前8个PWM组成的总线用于舵机控制,组内带8个归一化(-1.. 1)值,一个混合就是用于输入和输出连接方式(如:对于四轴来说,输入组有俯仰,翻滚,偏航等,对于于向前打俯仰操作,就需要改变输出组中的4个电调的PWM输出值,前俩个降低转速,后两个增加转速,飞机就向前)。对于简单的固定翼来说,输入0(roll),就直接连接到输出的0(副翼)。对于多旋翼来说就不同了,输入0(roll)需要连接到所有的4个电机。
3 混控文件的定义ROMFS/px4fmu_common/mixers中的文件实现了预定义机架所使用的混控器。它们可以用于自定义机架或者一般的测试。 3.1 语法mixer通过文本文件定义;以单个大写字母加一个冒号开始的行是有效的。其它的行则会被忽略,这意味着注释可以自由地在定义中穿插使用。 3.2 空混控器空混控器不接受控制输入并产生单个作动器输出,其输出值恒为零。空混控器的典型用法是在一组定义作动器特定输出模式的混控器组中占位。空混控器定义形式如下: 3.3 简单混控器简单混控器将0个或多个控制输入混合为单个作动器输出。所有输入被缩放后,经过混合函数得到混合后的输入,最后再经过输出缩放产生输出信号。简单混控器定义如下: 4 固定翼混控的简单分析分析一下固定翼Wing Wing Z-84的混控器设计,机型如图2所示。它的混控文件为wingwing.main.mix。这个机型只有左右副翼和一个电机。 其中左右副翼的链接输出通道的0和1,电机链接输出通道3,对于输出通道2则闲置。输入通道来源于通道0(飞机姿态),通道0中,Roll、Pitch、thrust分别对于0,1,3(这里好像不支持Yaw的控制)。混控器的设置由图3所示。由于左右两个舵机在物理上是反向的,所以对于Pitch的输入也需要做反向处理。 混控文件是这样的 混控器中第一行M:2表示输出0需要对下面两个通道的的输入做简单的加法混控。O: 10000 10000 0 -10000 10000代表负值正值的缩放比例都为1000,偏置为0,最大最小输出范围为-10000到10000。后面两行S开头的代表需要做混控的输入,第一行是对输入Roll的处理,第二行是对输入Pitch的处理。同理第二个M:2是混控得到输出1。 举个简单的例子,Roll的输入为0,加入当前Pitch的输入为0.1。执行前两个混控后,得到的输出为,通道0的输出为650,通道1的输出为-650,按理说对Pitch的控制,两个副翼的角度应该是一样的,但是因为两个舵机在以上的安放位置相反,所以输出也相反。 5 多旋翼混控的简单分析多旋翼的的混控那最简单的四轴X模式来分析,先分析混控文件,如图4所示。四周的混控文件非常简单,R: 4x 10000 10000 10000 0表示的意思为,R:旋翼混控器,4x:四轴X模式,后面的3个10000是Roll、Pitch、Yaw的缩放比例,0为死区范围。而后面的两个混控器是准备别的辅助通道混控,Roll、Pitch、Yaw的混控并不在这个混控文件里面,因为四轴一个电机的输出和Roll、Pitch、Yaw、thrust都有关系,所以四轴的混控在mixer_multirotor.cpp中完成。 对于不同的旋翼机型会定义不同的混控数组,四轴X模式的数组如图5所示。其中每一行对应一个电机的输出,每一列对于Roll、Pitch、Yaw、Thrust的输入。 在mixer_multirotor.cpp文件中会先计算先根据Roll、Pitch的输入计算出混控器的输出,然后根据电机是否饱和缩放后,再次加入Yaw叫输入的混控,最后加入油门的混控。 6 饱和的处理处理的代码如下图 1 根据混控矩阵计算得到out,这一步已经包含油门,同时记录下最大输出和最小输出,outputs保存四个电机的输出值。 2 第一种情况,min小于0,max大于0,min,max之差小于1,可以通过偏移解决。加油油门增加幅度大于|min|,可以通过增加油门的方式解决,boost = -min_out;如果油门增加幅度太小,需要把roll和pitch的缩小后再计算。 举个例子,当前thrust为0.2,计算得到新的输出值之后,min为-0.2,max为0.6,roll和pitch带来转速上的变化是0.4,由于只计算了Roll和Pitch,所以在旋翼里面,min和max到thrust的距离一定是一样的。这种情况就是第一种情况,并且油门增大幅度为0.2*0.5=0.1,不足以平衡min的大小。需要对Roll和Pitch进行缩放。计算得到boost=0.1,roll_pitch_scale=0.75,然后再计算下面的代码。可以知道min=0,max=0.6,没有饱和。 |
|