【飞控】从零开始建模(三) - 控制分配浅析

根据之前的文章,我们的模型其实已经完成了,模型的输入是四个电机的转速,输出是我们需要的状态(位置,速度,加速度,角加速度,角速度,角度),所以接下来我们希望模型能动起来,就需要建立控制器帮助我们使电机转动。

0.如何得到电机转速

我们知道电机产生的力是

$$f=C_Tw^2$$

但是转速w如何得到呢?
实际中我们是使用电调来控制电机的转速的,而电调是通过PWM控制的所以电机的转速是跟PWM占空比相关的。

占空比是个0~1的数,你可以认为输出0电机就不转,输出1电机就最大转速。

所以你需要去查你的电机性能,通常你去到你电机品牌的官网,可以查到类似的性能表。

你可以看见非常详细的信息,配合不同的桨会有不同的性能,通常情况你在选电机的时候就应该查阅这个表格,根据电机的情况选择桨的大小,和电调的规格。所以根据你的实际情况你可以得到你的占空比和转速(RPM)的关系。(当然我们通常可以认为是线性的)。

同样你也可以去北航可靠飞行控制研究组飞行测评软件中选择你的电机。

可以直接得到你的电机的与油门(占空比)的关系,非常方便,建议新手使用。

1.控制器输出如何分配

这个问题,可能是最困扰新手的问题之一了。
通过看论文查资料你应该已经知道,使用PID控制飞行器通常会分成几个不同的通道。
你是不是想控制飞行器高度?那就期望高度与实际高度做差,通过控制器得到高度通道的输出(thrust)。是不是还想控制前进后退?那是不是要有pitch和roll通道的输出?是不是还要转向?那就需要yaw通道。

仔细一算,好像有四个通道的控制器要输出呀,电机该听谁的呢?

是不是四个电机正好每个控制器控制一个电机呀?(不是的千万别这样干!)

让我们思考一下,电机与通道之间的关系,这个又和我们的机型有关了哦。

我们之前是按「+」型建模的,那么在我们的模型中如果需要实现向前飞行与哪几个电机有关呢?是不是与M1,M3有关,那同理向左飞与M2,M4有关,旋转和高度通道都需要四个电机参与。

所以我们有关最简单的思路,如果四个控制器通道输出为
[roll,pitch,yaw,thrust],那么电机应该有把与之相关的控制都叠加起来,所以

M1 = 0 - pitch + yaw + thrust
M2 = roll + 0 - yaw + thrust
M3 = 0 + pitch + yaw + thrust
M4 = - roll + 0 - yaw + thrust

关于符号,如果我们假设「前向」和「右向」为正方向,那么M1电机减小转速,M3电机增加转速就可以向正方向运动,同理如果我们以顺时针旋转为正,那么增加M1,M3的转速,同时减小M2,M4的转速就可以使飞机实现顺时针的旋转了。

如果你能理解这个思路那么你已经初步里了解控制器的输出是如何分配到电机上的了。

这么做有什么好处呢,你会发现不管是四旋翼,六旋转,八旋翼,控制器的通道是一样的,只是分配给电机的方式不同,通过控制分配的形式可以使控制部分和电机驱动部分相互独立。

如果你自己设计了机型就需要在控制分配过程重新考虑哦。

2.更好的控制分配

之前的方法以及可以有效果了,但是它是不是最好的效果呢?
想一个问题,那个通道占用的能量最多?在旋翼机中电机的一大部分能量都用来抵消重力了,也就是说即使什么也不干,只是悬停在空中,就需要50%左右的占空比才能实现。

如果这时候你还需要向上加速,同时向前飞行,很容易产生限幅,因为电机需要的是0~1,如果你每个通道输出加起来超过1,那也只能是1的效果,因为电机只能转这么快了。飞行过程中油门推到最大,4个电机都来响应油门通道了都输出1,那么不管你输出什么姿态都没法实现了。

所以有些开源代码会把油门通道限制一下。

M1 = 0 - pitch + yaw + 0.8 thrust
M2 = roll + 0 - yaw + 0.8
thrust
M3 = 0 + pitch + yaw + 0.8 thrust
M4 = - roll + 0 - yaw + 0.8
thrust

这样油门最多只能占用80%电机的能量,这样可以使得飞机有剩余的20%能量去实现倾斜或者旋转。

这样是不是完美了呢?但是这样使你的姿态能用的范围很小,可能你的控制器输出说我现在需要一个30度的pitch角,但是你最多只能输出M1=1,M3=0.6,依然达不到这个角度,所以你这个油门系数也需要结合实际考虑。

其实好的控制分配是一个非常复杂的问题,跟你的实际情况有很大的关系,而且推广到跟多旋翼的情况更加需要好的控制分配,感兴趣的同学可以深入研究一下。

3.x型的控制分配系数

虽然我们模型为了简单使用的是「+」型,但是实际中我们跟多使用的是「x」型。

在「x」型中不论是pitch,还是roll都需要四个电机同时作用。
如果希望向前运动,就需要M1,M2减速,M3,M4加速。
但是呢因为有两个电机,每个电机出一半的力就够了,根据勾股定理个点击出0.707即可。
所以「x」型的飞机简单的控制分配
M1 = - 0.707 roll - 0.707 pitch + yaw + 0.8 thrust
M2 = 0.707
roll - 0.707 pitch - yaw + 0.8 thrust
M3 = 0.707 roll + 0.707 pitch + yaw + 0.8 thrust
M4 = - 0.707
roll + 0.707 pitch - yaw + 0.8 thrust

4.APM源码

APM的相关源码在
libraries\AP_Motors\AP_Motors6DOF.cpp
libraries\AP_Motors\AP_MotorsMatrix.cpp
AP_MotorsMatrix::add_motor

5.背后的理论

有了感性认知,我们来看看这背后的理论。
以「+」型结构的四旋翼来说。
通过之前的模型我们知道,高度通道(thrust)的受力为:

$$f=c_T(w_1^{2}+w_2^{2}+w_3^{2}+w_4^{2})$$

roll,pitch,yaw三个通道分别对应x,y,z三轴的扭矩。(开源飞行器通常使用逆时针的顺序排列电机,可能会与书中不一样)

$$\begin{matrix} \tau_x=dc_T(w_2^{2}-w_4^{2})\\ \tau_y=dc_T(-w_1^{2}+w_3^{2})\\ \tau_z=c_M(w_1^{2}-w_2^{2}+w_3^{2}-w_4^{2})\\ \end{matrix}$$

c_T为升力系数,c_M为扭力系数,d为机体中心到电机的距离,w为电机转速。
平移以前右为正,旋转以顺时针为正。通过模型我们可以得到力与转速的关系,写成矩阵形式。

$$\left[\begin{matrix} f \\\tau_x \\ \tau_y \\ \tau_z \end{matrix}\right]=\left[\begin{matrix} c_T & c_T & c_T &c_T\\ 0 & dc_T & 0 & -dc_T \\ -dc_T & 0 & dc_T & 0 \\ c_M & -c_M & c_M & -c_M \\ \end{matrix}\right]\left[\begin{matrix} w_1^{2} \\ w_2^{2} \\ w_3^{2} \\ w_4^{2} \end{matrix}\right]$$

$$\left[\begin{matrix} f \\\tau_x \\ \tau_y \\ \tau_z \end{matrix}\right]=M_4\left[\begin{matrix} w_1^{2} \\ w_2^{2} \\ w_3^{2} \\ w_4^{2} \end{matrix}\right]$$

所以

$$M_4^{-1}\left[\begin{matrix} f \\\tau_x \\ \tau_y \\ \tau_z \end{matrix}\right]=\left[\begin{matrix} w_1^{2} \\ w_2^{2} \\ w_3^{2} \\ w_4^{2} \end{matrix}\right]$$

所以,控制分配矩阵为

$$P_4=M_4^{-1}$$

在实际中这些为PID控制器不同通道的输出。

$$\left[\begin{matrix} f \\\tau_x \\ \tau_y \\ \tau_z \end{matrix}\right]$$

可以通过调节PID的参数来补偿未知的量c_T,c_M,d。

理论分析的解结果与我们直观分析的结果一致。

6.参考资料

多于四轴的旋翼如何进行控制分配?
动力系统出现故障如何重新分配?
作者也只是简单的了解了一点控制分配的内容,如果有兴趣深入研究的朋友可以继续查阅相关资料。

多旋翼飞行器的控制分配
全权《多旋翼飞行器设计与控制》

欢迎加我的个人微信交流,听说加我的人不用建模也有对象哦^_^

关注微信公众号【zinghd的思考】,回复【姿态】为您提供本文的全部参考资料。