0 引言
相对于大型无人驾驶飞机(Unmanned Aerial Vehicle,UAV),多旋翼飞行器拥有体积小、成本低、行动敏捷、可悬停等优势,成为许多国家或机构的研究热点,是UAV发展的主要方向之一。归功于UAV技术近几年的迅速发展,多旋翼飞行器也从一开始的军事用途逐渐向商用和民用方向延伸,如今已经广泛用于高空拍摄、军事侦察、交通监测、植物保护、地形勘测等领域[1]。随着应用领域的扩展和深入,工程中对多旋翼飞行器的要求也越来越高,多任务处理能力和安全性能成为突出的问题。拥有一个简洁高效、安全稳定的开发平台显得至关重要。针对上述情况,本文提出一种基于NuttX实时操作系统的多旋翼控制系统设计,并对硬件布局和软件结构进行详细的论述。
1 控制系统总体设计
1.1 需求分析
为了达到安全、稳定、高效的目的,以下针对多旋翼飞行器的特点,对控制系统提出需求:
(1)系统在发生故障导致主处理器复位时,飞行器应保持在空中飞行等待系统复位,避免坠机造成人身安全和财产损失。
(2)处理器有较高的运算性能,以满足多任务和后续算法开发的需求。
(3)能高速且精确采集各个传感器的数据,并提供模拟信号采集接口,以便扩展模拟量传感器。
(4)具备与遥控接收机和地面站通信的能力,能识别联系中断的情况,并采取相应安全措施。
(5)拥有8路与主处理器硬件上独立的PWM输出,用于兼容旋翼数量不等的飞行器系统。
(6)可记录飞行中的所有姿态、位置数据和遥控操作数据,存于SD卡中,方便对系统进行调试。
(7)为方便开发,系统可通过更改SD卡中文件达到配置系统的目的。
(8)采用模块化软件结构,功能可简单地通过配置文件进行修改,避免频繁的更新程序。程序可通过USB接口用Bootloader更新[2]。
(9)预留外置UART、CAN、SPI、I2C等通信接口,给GPS、数传等其他扩展模块提供数据通道,方便后续应用开发。
1.2 总体设计
多旋翼旋翼飞行器的输出控制有6个自由度,分别为沿x、y、z坐标轴做旋转和平移动作,其控制都是通过调整跟旋翼相连的电机转速实现[3],故在实际飞行中,为了达到稳定的飞行,电机转速始终是在变化当中。由于电流的变化将引起强烈的电磁干扰,对模拟量传感器数据的采集非常不利。为了提高传感器数据采集的精度,同时兼顾采集速度,本文采用全数字量SPI接口传感器。另一方面,为了达到失效保护作用,同时减轻主处理器的负荷,系统额外采用一个协处理器。
控制系统对实时性要求较高,同时进行的处理内容也比较复杂,包括各个传感器数据的采集、姿态估计、姿态控制、遥控或地面站的命令分析、电机控制、日志记录等。对于这种任务比较多的程序结构,如果采用普通的前后台系统结构,势必造成开发难度大、程序实时性弱、系统可维护性差等结果。因此,本文率先引入功能强大的NuttX实时操作系统。NuttX注重标准兼容和小型封装,主要遵循ANSI和Posix标准,采用模块化设计,完全可抢占式内核,并且支持类Unix的Script控制和类Bash的NuttShell控制台,能为多旋翼飞行器控制系统的开发提供极大的方便。
2 控制系统硬件设计
2.1 硬件选型
(1)处理器:由于主处理器要负责采集各个传感器的数据进行搬运,并进行姿态估算和控制,所以至少需具备DMA功能和硬件浮点运算,才能保证控制系统的实时性和预留充足的资源给后续开发。经过筛选,本文采用ST公司的32位Cortex-M4内核处理器STM32F429VIT6,其最高主频能达到168 MHz,硬件接口丰富,并且支持FPU,处理能力能满足控制系统需求。相对主处理器,协处理器需要处理的内容比较简单,为了方便开发,选用和主处理器同一系列、功能稍弱一些的STM32F103C8T6芯片。
(2)传感器:主处理器上,角速度计采用ST公司的16位精度传感器L3GD20,三轴加速度计和三轴电子罗盘采用LGA-16超小封装的LSM303D,气压计采用由瑞士MEAS公司推出的MS5611,该模块包含一个高线性度压力传感器和一个超低功耗的24位Σ型AD转换器,分辨率可达到10 cm。为了在主处理器发生故障时保持最基本的自稳模式,协处理器上采用陀螺仪和加速度计一体的MPU6000传感器。上述所有传感器都具备高速SPI数字输出的特性,与主处理器连接的传感器可串接在同一SPI总线上,降低了PCB设计难度。
(3)无线模块:无线模块包括遥控接收模块和与地面站通信数传模块。为了方便布线、节省IO口资源,遥控接收模块采用脉冲位置调制(Pulse Position Modulation,PPM)形式输出,只需一根信号线即可传输8通道PWM。无线数传采用433 MHz超远距离无线通信模块,通信距离可达2 km,保证了高空飞行时数据连接的稳定。
2.2 硬件设计
图1为系统的硬件结构。由于系统中含有两个处理器,为了方便更新程序,将协处理器的UART1连接至主处理器串口,这样可以通过主处理器更新程序,减少开发过程中的冗余步骤。连接两个处理器之间的串口在系统正常运行时,还可以用于数据交换。使用高速串口交换数据相对于使用SPI交换数据,其优点是不用像SPI那样时刻去查询从设备是否有数据要发送,而是只要有数据即可立即发送,无需额外耗费资源轮询等待,提高了系统效率。
为了防止电机在运行时产生强电流烧毁处理器,在PWM输出与电调输入之间采用TI公司的TXS0108电平电压转换芯片,达到信号隔离和增强驱动的作用,电路如图2所示。
3 控制系统软件设计
3.1 主处理器软件设计
主处理器运行NuttX实时操作系统,所有功能都通过任务进程实现[4]。主要的进程有传感器数据采集、姿态估算、姿态控制、飞行器状态识别与切换、协处理器控制、日志记录。进程间进行通信是程序结构的重要部分。为了建立一个快速简洁的进程间通信机制,本文引入一种微型对象请求代理(micro Object Request Broker,uORB)机制[5],通过推送和订阅主题的方式进行通信,进程不用关注信息交换的对象,并且同时可以推送和订阅多个主题,只需简单的代码即可实现进程间数据的共享,提高了开发效率。
如图3所示,传感器数据采集进程采集的所有传感器数据,姿态估计进程利用传感器数据估算出飞行器当前姿态[6],协处理器通信进程获取遥控数据,状态识别进程结合传感器数据、飞行器姿态和遥控数据识别出飞行器当前模式,最后姿态控制进程通过飞行器姿态、遥控数据、飞行器模式计算出当前所需的PID控制量[7]并推送至uORB,协处理器通信进程再将订阅的PID控制量通过高速串口发送至协处理器。
3.2 协处理器软件设计
如图4所示,为了保证系统的实时性,协处理器的PPM脉冲输入部分采用中断方式进行捕获,与主处理器通信部分采用DMA方式直接填充至PWM匹配输出寄存器,最大程度地减小CPU的干预。失联识别在定时器20 ms中断中实现,每次进中断会读取DMA传输计数器的值并记录,再与上次的记录值进行比较,如果两个值不相等,则说明数据连接正常;相反,如果连接断开,两个值将会相等,据此实时地判断出连接的通断状态。主循环中只需要判断通断标志位,如果检测到连接断开,协处理器则会启用失效保护功能:通过SPI总线读取MPU6000芯片的加速度和角速度数据,利用四元数姿态融合算法[8]得到姿态信息,转换成欧拉角之后,再用PID控制器保持飞行器的水平姿态,直到与主处理器的连接恢复正常,再将电机控制权交还给主处理器。用欧拉角表示刚体姿态方便几何推导,但是存在万向节死锁,即当刚体的3个万向节中两个的轴发生重合时,会出现失去一个自由度的情况。四元数法则不存在这个问题,并且运算步骤也相对简单,适合在本文控制系统的协处理器中运用。
4 实验结果及分析
如图5所示,利用四旋翼飞行器作为实验平台,在室外进行飞行试验后,得到横滚、俯仰和偏航角的响应曲线。将日志导出到MATALB并绘制曲线,从图6可以看出飞行器的实测值能够快速、精确地追踪设定值。在人为软件复位主处理器后,飞行器能在空中保持机身大致水平,直至主处理器恢复工作,保证了系统的安全性。此外,在NuttShell中输入”top”指令,可得到主处理器的资源占用情况。如图7所示,主处理器的cpu空闲资源达到了51.73%。
实验结果表现出系统良好的控制性能,能够稳定地控制飞行器进行基本飞行,在主处理器发生故障时能够降低坠机的风险,减少了因开发过程中程序不稳定带来的损失和危险,缩短了开发周期,增强了安全性能,并且能满足各种运算及后续开发的需求,为多旋翼飞行器控制系统更深入的开发奠定了基础。