首先感谢各位提供帮助的大神们,我也只是把人的心得总结一下,加上自己的一点感悟:
混控步骤:
一、忽略偏航进行融合处理
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,没有饱和。
二、添加偏航后进行处理
首先分析out<0的情况,通过第一步的处理可知out在0到1范围内,假设此时out=0.2;当加上偏航后,out=-0.1,因此偏航就占用了-0.3,但是出现了下溢出,为了防止溢出yaw只能占用-out也即是-0.2,因此对-out进行除以_rotors[i].yaw_scale处理,得到处理后的yaw值,从而有效抑制下溢出;
然后是out>1的情况,通过第一步的处理可知out在0到1范围内,假设此时out=0.8;当加上偏航后,out=1.1,因此偏航就占用了0.3,但是出现了上溢出,为了防止溢出yaw只能占用1-out也即是1-0.8=0.2,因此对1-out进行除以_rotors[i].yaw_scale处理,得到处理后的yaw值,从而有效抑制上溢出;yaw处理也到此结束战斗。
三、融合怠速处理
这个相对比较容易理解就不说了,一般会把_idle_speed赋0;
四、对整体输出的处理(专业说法叫slew rate limiting)
其实这个地方感觉有点像滤波处理,当当前时刻比上一时刻的变化大与最大阈值时,就要省掉当前的值,用上一刻的值加上最大阈值进行代替,当当前时刻比上一时刻的变化小于最小阈值时,就要省掉当前的值,用上一刻的值加上最小阈值进行代替,我感觉就是为了是控制更平稳,增加一定的抗干扰能力,但响应有可能会变慢。
接下来就是细节分析了
在文件Firmware-master\ROMFS\px4fmu_common\mixers中预定机身的类型,打开quad_+.main如下: