Crazepony开源四轴飞行器

Crazepony软件开发经验总结

作者:CamelGo

关于Z轴负反馈的调试

虽然我们已经努力将机身参数设计成没有个体差异,但是还是避免不了一些电阻电容上有误差。直接体现在MPU6050输出的姿态AD值上有个体差异,下面谈一谈用户拿到飞机以后,怎样保证飞机起飞降落过程具有粘滞性的问题

什么叫粘滞性?就是说,飞机上升的时候,不会因为油门突然加大而突然猛升,也不会因为油门不小心拉低过快导致飞机快速跌落到地面,那么怎样才能达到这样的效果呢?

我们都知道,飞机在空中的任何一个动作或者姿态,都会被姿态传感器采集到,那么飞机上升和下降这个动作,对应的是哪个物理量在变化呢?Z轴的速度?还是飞机的高度? 这两者都在变化,但是姿态传感器都不能直接给出,然而,Z轴的加速度是姿态传感器可以直接给出的

下面我们来理一下这个过程Z轴加速度是怎么变化的。

中学毕业的人都知道这样一件事情就是关于失重和超重,飞机加速上升这个过程,Z轴的加速度会大于静止时的加速度9.8m/s2,飞机加速下降这个过程,Z轴加速会小于9.8m/s2 ,这个物理量,可以由传感器直接得到,而这个物理量的变化,恰恰就能得到飞机是正在上升还是正在下降,那么上升的时候,程序控制它油门增加量不要变化那么快,下降的时候,程序控制它油门减少量不要减那么快。So…

学过大学相关控制理论的人都知道,这种控制方式叫做负反馈。

对应到程序就是这样的:

Thr是一个油门的全局变量,在Thr被遥控数据赋值以后,再对Thr进行一次减操作,减去一个误差量DIF_ACC.Z,DIF_ACC.Z是Z轴的当前加速度减去静止时的加速的差值。当飞机上升时,DIF_ACC.Z是一个正数,Thr减去一个正数,Thr就会比遥控实际赋值要小,体现出来的效果就是上升不会那么冲;同理,下降时DIF_ACC.Z为一个负数,Thr减去一个负数,相当于加上一个正数,Thr就比遥控实际赋值要大,体现出的效果就是下降不会很急。

于是,综上的描述,飞机的飞行体现出粘滞的效果,便于操控,也安全了许多

所以,在用户拿到手后,如果感觉操作起来不是那么方便,可以打开串口助手看看这里:

将Crazepony水平静止放置,然后看看这里打印的Z轴加速度值是多少,将源代码的静止重力加速度值g,修改成串口助手里看到的那个值就好了,这是属于一个初始人工校准过程,我们后续会考虑实现一个学习算法来替代这个过程,它将不会再需要用户介入,你只需要开一个电源开关,学习算法会自我学习,将学习得到的最优参数存放在内部的EEPROM中。

关于油门曲线

在Crazepony最初的几个版本中,我并没有油门曲线这个概念,遥控给多少,就直接给PWM输出,根本不做任何可能的处理。在后来的飞行体验中,慢慢发现。油门摇杆的前半程,很容易突然推很多,导致飞机一下冲很高。于是,在跟大家的交流中发现,将遥控送给的油门值曲线化以后再给PWM输出,这样的话。就能避免这个问题了。

很显然,我将油门曲线做成了一个下凹的抛物线。抛物线方程为: y=0.001X2,即Thr=0.001( RC_DATA.THROTTLE)2 ,RC_DATA.THROTTLE的取值范围是0-999,Thr的取值范围也是0-999,这样一来,将遥控的油门摇杆取值范围,跟飞机实际得到的油门量做了一个一一映射。最大值和最小值都是一样的,但是处理后的油门曲线是一条下凹的曲线,和原来线性对应相比,优势大家自己实际体会吧