NuttX飞控系统
程序设计思路,首先我们不管里面操作系统是怎么样实现。在这个系统中我们学会用API就行了。
主处理器运行NuttX实时操作系统,所有功能都通过任务进程实现。主要的进程有传感器数据采集、姿态估算、姿态控制、飞行器状态识别与切换、协处理器控制、日志记录。进程间进行通信是程序结构的重要部分。 也就是说在飞机中就有几个主要进程控制飞机,每个进程负责些什么呢?
如图1所示,
传感器数据采集进程: 采集的所有传感器数据。
姿态估计进程:利用传感器数据估算出飞行器当前姿态。
协处理器通信进程:获取遥控数据。
状态识别进程:结合传感器数据、飞行器姿态和遥控数据识别出飞行器当前模式。
姿态控制进程:通过飞行器姿态、遥控数据、飞行器模式计算出当前所需的PID控制量并推送至uORB。
协处理器通信进程 :再将订阅的PID控制量通过高速串口发送至协处理器。
多个进程进行通信: uORB 订阅主题 ,发布主题。
协处理器和主处理器的关系:
主处理器通信部分采用DMA方式直接填充至PWM匹配输出寄存器,最大程度地减小CPU的干预。失联识别在定时器20 ms中断中实现,每次进中断会读取DMA传输计数器的值并记录,再与上次的记录值进行比较,如果两个值不相等,则说明数据连接正常;相反,如果连接断开,两个值将会相等,据此实时地判断出连接的通断状态。主循环中只需要判断通断标志位,如果检测到连接断开,协处理器则会启用失效保护功能:通过SPI总线读取MPU6000芯片的加速度和角速度数据,利用四元数姿态融合算法,得到姿态信息,转换成欧拉角之后,再用PID控制器保持飞行器的水平姿态,直到与主处理器的连接恢复正常,再将电机控制权交还给主处理器。用欧拉角表示刚体姿态方便几何推导,但是存在万向节死锁,即当刚体的3个万向节中两个的轴发生重合时,会出现失去一个自由度的情况。四元数法则不存在这个问题,并且运算步骤也相对简单,适合在本文控制系统的协处理器中运用。