1.mixer在系统中的地位与作用
PX4从核心控制器获取所需的扭矩和推力指令,并将它们转换为控制电机或驱动器的驱动指令。例如,“向右转”需要给出一个扭矩指令:
- 对于每个副翼都有一个舵机的飞机来说,该指令将会控制一个舵机向高处偏转,另一个向低处偏转。
- 多旋翼将会通过改变所有电机的转速来向右偏航。
混控器又称为mixer。混控的作用是把输入指令分配到电机、舵机的执行器指令。 将姿态控制的结果结合机型、尺寸进行PWM的输出,进而使得各个电机实现各自需要的转速。
下图为PX4运行过程中比较核心的进程:
红色框表示的是由导航与解算过程,得到飞机当前的位置属性和姿态属性。
蓝色框表示的控制命令,由用户发出commander命令进行模式选择,navigator进行路径规划,最终通过姿态控制产生控制量,控制量通过mixer分配到每个电机上。
2.mixer启动的两个阶段
2.1第一阶段
第一部分:机型选择背后所进行的一系列启动和配置过程
主要过程如下图虚线框所示:
在地面站进行机型选择时触发,代码部分在飞控源码rcs中进行,rcs为总的启动脚本,在该脚本中依次递归调用其他的启动脚本。图中所有以数字代表的即为机型参数。
假设我们在地面站配置时已经选择了Dji_f450,那么system_params.c文件中就会将SYS_AUTOSTART这个参数设置为4011,4011就是Dji_f450在程序中的代号。
配置好后会在rcs脚本中进行判断
这时就会递归调用第二个脚本rc.autostart。
在第二个脚本中会继续进行判断,如果参数被设置为4011,就会继续调用4011_dji_f450第三个脚本
之后我们来到第三个脚本, 在这个脚本中设定了一组默认的PID参数,设定了PWM的最小值,这些都是根据你的机型和尺寸进行设定的,不同机型的这组默认参数是不同的。除了设定这些参数外,在这个脚本中也调用了第四个脚本4001_quad_x。
quad_x意思为x型旋翼,dji450也属于x型旋翼,在这个脚本中,初始化PWM输出为1234,代表对于该机型有4路PWM输出,并且设定了×型旋翼 mixer脚本,递归调用第五个启动脚本rc.mc_defaults。
在这个脚本中配置了一组PWM参数,例如PWM的输出最大、最小值、频率等。
以上就是mixer启动的第一部分,递归调用五个脚本,总结来说在mixer启动的第一阶段主要做的就是对mixer进行配置,配置了PID参数,配置了mixer输出通道,配置了PWM输出的最小值最大值以及输出频率,配置了使用什么脚本。
2.2第二阶段
第二部分:脚本的加载,脚本的解析,PWM的计算,PWM的解析,这些都在rc.interface脚本中完成。
主要过程如下图虚线框所示:
下面通过源码对第二阶段进行解读:
我们在第一阶段已经将mixer配置成了quad_x,‘$’代表读取变量,即这里的mixer就等于quad_x,下面这行代码代表选中脚本,准备进行解析。
加载脚本:
配置PWM输出:
3.控制量的传递过程
姿态控制产生的控制量在att_control_main.cpp文件这,[0][1][2][3]即代表横滚、俯仰、偏航以及油门合力产生的4路控制量。
这四路的控制量会以一个消息ID进行发布:
PIXHAWK飞控板有主处理器FMU(运算)和协处理器IO(输出),在进行PWM的计算时,需要两个输入,一个是姿态控制的控制量(在FMU上产生),一个是脚本(脚本的解析也在FMU上解析),而PWM又是通过协处理器输出,所以主处理器和协处理器之间需要通过串口通信,将主处理器上产生的控制量传递到协处理器上。
4.mixer脚本的认识
mixer脚本中只有特定大写字母后的内容会被加载进内存中, 以x型旋翼垂直起降脚本为例,如下图。
4.1 R类型
R类型即旋翼类型,R型旋翼的PWM通过混控器的逆矩阵和控制量矩阵相乘得到。
第一个参数 4X 代表X型四旋翼,也代表4路PWM输出。
第二个参数10000本质为1,放大10000倍是为了方便计算,代表pitch的控制量是否缩放。
第三个参数代表roll的控制量是否缩放。
第四个参数代表yaw的控制量是否缩放。
第五个参数为起始油门为0。
4.2 Z类型
Z 类型即代表 zero,表示第五路PWM输出恒为0,在此只起占位符的作用。
4.3 M类型
M 类型代表simple 简单求和类型,也代表一路PWM输出。M之后的参数2代表有两路source参与计算。
两个S代表source,S之后的第一个参数为1代表1号控制组,第二个参数0代表0号控制量
第三个参数5000代表负缩放0.5,第四个参数5000代表正缩放0.5。
第五个参数0代表偏移量为0,第七、八个参数表示限幅在[-1,1]。
O代表输出output,即两路S求和的结果。
5.PWM的计算
在上一步计算得到的PWM是一个被限幅在[-1,1]之间的原始值,还需要将这个原始值转变成真实有效的在[1000,2000]us,即PWM输出周期内高电平的时间,将这个输出交给定时器,定时器产生方波,进而驱动电机转动。上述过程可以在mixer.cpp文件中通过三句源码来进行解释。
第一句:其背后所做的工作就是控制量的获取,脚本的解析,以及将原始的PWM波输出到outputs[0]中。
mixer_group是一个链表类型,可以存储我们之前提到的每一种类型的脚本,通过调用其对应的计算方法,得到原始控制量。
第二句:将原始的PWM输出转换为在[1000,2000]之间的真实有效的PWM。
第三句:将产生的真实有效PWM进行输出,写入到定时器,产生方波。