概述篇:二.多旋翼飞控技术综述

[深入浅出多旋翼飞控开发]概述篇][二][多旋翼飞控技术综述]

Github
作者:Sky

要学习多旋翼飞控,第一步得先弄清楚飞控的整体框架和大致工作流程,对飞控有了一个整体的认识之后,我们再逐步去学习各个技术细节。现代社会趋向于分工明确,对于多数人来说,可能没有那么多时间去深入学习了解每一个模块,毕竟个人时间精力有限,什么都学的结果就是什么都学不好。所以看完本章节,在对各个部分有了初步的认知和理解之后,可以再去选择自己感兴趣的方向进行深入研究。

如图1,一个小型高集成度的多旋翼飞控可以分为四大部分:硬件层、软件驱动层、飞行状态感知与控制层、飞行任务层

![图1 多旋翼飞控基本构成](https://img-blog.csdnimg.cn/img_convert/f65205b51358432b0b75d312d5885161.jpeg) 图1 多旋翼飞控基本构成
  • **硬件层:**指飞控的实体部分,其中包含主控制器,陀螺仪、加速度和磁力计等各类传感器,信号输入与输出接口等;

  • **软件驱动层:**指主控制器正常运行所需要的软件程序,以及在上面运行的实时操作系统(RTOS),还有各类传感器的驱动程序;

  • **飞行感知与控制层:**多旋翼要实现飞行功能,首先需要正确感知自身的飞行状态,包括三维姿态、速度和位置,得到飞行状态后,再通过控制算法,实现对姿态、速度和位置的闭环反馈控制;

  • **飞行任务层:**通常来讲,我们的最终目的并不只是让飞机飞起来,停在空中就完了。而是要让飞机去执行各种任务,常见的有航拍、编队、测绘、植保等,这个过程中,需要我们人为地给飞机发送飞行指令或者预先编写好任务程序。

一.硬件层

如果不是电子信息类专业的同学,可能对于飞控的硬件构成不会太感兴趣,但是在学习飞控之前,我们必须要了解我们所选择的硬件方案和选择它的理由,为下一步学习打好基础。

首先是飞控的大脑:主控制器,好比电脑的CPU,基本上所有计算工作都在这上面进行。根据最终产品的体积大小及成本,还有飞控程序所需运算能力的综合评判,通常我们会选择一款合适的单片机(MCU)作为飞控主控。

回顾开源飞控的发展历史,可以看到,飞控主控从8位的Atmel AVR单片机发展到了32位的ARM-Cortex-M核单片机,从Cortex-M3到M4,最后到了M7,综合性能愈发强大,从M4内核开始增加的浮点运算单元,极大地提升了单片机的运算能力,使其基本能满足飞控的高频率计算需求。而早期基于8位机的飞控,运算频率和控制频率不到100Hz,而现在基本达到500Hz或更高。

![图2 飞控主控芯片发展方向](https://img-blog.csdnimg.cn/img_convert/9c4cd7c3d6474ed6a228a028f49fa919.jpeg) 图2 飞控主控芯片发展方向

目前综合成本及性能来看,Cortex-M4的单片机最适合做飞控主控,其中使用最广泛的,便是意法半导体的STM32F4系列。如果追求高性能,如DJI在最新几款新产品上面,均使用了Atmel的Cortex-M7核的单片机。在ST单片机中,M4内核的F3系列及F41X系列在追求小体积和低成本的情况下也不失为一个好选择。

其次则是各类传感器,飞控上常用的有陀螺仪、加速度计、磁力计、气压计、GPS及视觉传感器,它们好比人类的眼睛、耳朵、鼻子、皮肤,给人提供了视觉、听觉、嗅觉、触觉,如果失去了这些感觉,我们无从感知自身的状态位置以及外界环境信息,从而失去了最基本的行动能力。飞控上的众多传感器正是起到这些作用,其中陀螺仪测量角速度,加速度计测量加速度(包括了重力加速度和运动加速度),磁力计可以测量地球磁场强度,从而求出飞机航向,而气压计测量气压强度,根据特定公式转换成相对高度,最后GPS及视觉传感器可以测量出飞机绝对和相对速度/位置信息。

![图3 飞控上所使用的部分传感器](https://img-blog.csdnimg.cn/img_convert/bdae29ad337add52ececb4158785a86c.jpeg) 图3 飞控上所使用的部分传感器

传感器的选型相对于主控而言,则要丰富得多。在低成本的多旋翼飞控上面,通常我们选择使用的是小体积低成本的MEMS传感器。

首先是最重要的核心传感器陀螺仪与加速度计,为了缩小体积和减少陀螺仪与加速度计安装时产生的轴间误差(两者不在同一个坐标系上),IC厂商们选择了把陀螺仪和加速度计封装在一个芯片上,也就是俗称的六轴传感器(三轴陀螺仪+三轴加速度计),从早期及其流行的应美盛的MPU6050到后来的MPU6500,再发展到ICM系列如ICM20608,ICM20602等,不过从实际测试来看,后续的传感器在某些性能上均没有多大提升,反而有所降低。同类产品还有ST、博世等厂商的,但在实际多旋翼飞控产品上应用较少。这一类六轴传感器性能一般,但价格非常便宜,IC的淘宝零售价不含税基本都在10元以内。而更高端的有ADI公司的ADIS系列陀螺仪,售价从几百到上万不等,大多数市面上可见的所谓工业级飞控均使用此类陀螺仪。

![图4 六轴传感器(三轴陀螺仪+三轴加速度计)的内部构造图](https://img-blog.csdnimg.cn/img_convert/4b4322fd10215e07894c4bc0a0f43cb5.jpeg) 图4 六轴传感器(三轴陀螺仪+三轴加速度计

磁力计是一类非常敏感的元器件,用于测量地磁场,但地磁场本身强度较小,很容易被环境干扰噪声所覆盖,所以在实际飞行过程中,我们总是很容易见到因磁场干扰而导致的飞行事故。由于安培效应的存在,各种电源走线都可能产生磁场干扰,所以通常我们会把磁力传感器单独做成一个模块,放在飞机内部磁场干扰最小的地方。早期开源飞控硬件方案最流行的一款磁力计是HMC5883,停产后,基本使用更高测量频率和采样精度的QMC5883来代替。

气压计主要用于测量大气压强,从而感知高度(大气压随着海拔高度的上升而下降)。不了解的人可能觉得这种测量方式不准确,实际上,现在民用的最高精度气压计,在24bit的采样精度下,可以做到10cm的高度分辨率。但是这种方式的确有很多缺点,首先由于大气压一直在变化,所以气压计的高度测量值的随机噪声非常大,最好的也在15-30cm左右,其次是在同一个高度下的高度测量均值会一直随着气压变化而变化,同一地点不同时间由于环境和气候变化都会带来很大的误差。好在我们在飞行中使用气压计,只关心一定时间内它得到的相对高度,绝对高度误差并没有那么重要。目前在多旋翼飞控上,我们能使用的最好气压传感器,还是MS系列的MS5611。其它公司也有许多小体积的气压传感器IC,如博世的BMP180、280,ST的LPS22HB,台湾沛喆的FBM320等,虽然性能不及,但价格上有一定优势,也被许多产品所采用。

GPS可以输出经纬度位置信息,并计算出在地理坐标系下的运动速度,为多旋翼的室外自主定位飞行提供基础,缺点是数据更新频率较慢(10Hz)及GPS信号容易受遮挡。最常使用的是u-blox的GPS芯片做成的模块,当前最常用的是ublox-M8N,双频搜星,定位精度和速度都比前代高很多。

![图5 用于飞控上的M8N GPS模块 ](https://img-blog.csdnimg.cn/img_convert/4482e2547f0afcbdb3e78d7d32cc4857.jpeg) 图5 用于飞控上的M8N GPS模块

而视觉传感器并不是某种特定的IC,而是一个原理非常复杂的模块,功能各异,这里统称使用了基于图像处理技术的模块为视觉传感器,实际上这个可以另开一门课程了。不同种类的视觉传感器可以为多旋翼提供飞行速度,飞行高度,甚至障碍物距离,相对飞行距离等信息。比如最简单的光流传感器,便是视觉传感器的一种,有知名的开源光流模块PX4Flow,使用STM32F4连接一个朝向地面的摄像头,通过块匹配算法计算分析每一帧之间的像素移动距离,再结合帧间隔时间,转换成为飞行器的运动速度。在没有GPS信号的室内,使用光流传感器可以为多旋翼提供自主定位所需的速度数据,但是对于飞行环境有特定要求,比如一定光照(没有光线便无法曝光成像),地面有一定纹理(纯色地面没有图像上的特征,便无法计算移动差异)。稍微复杂一点的还有双目视觉测距,提供前方障碍距离信息或者相对地面高度。视觉传感器的共性是均需要强大的图像运算性能,这些是传统单片机不具备的,因而需要使用更高性能的平台或者专用视觉处理器,如DJI使用的Myriad 2。

![图6 开源的PX4Flow光流](https://img-blog.csdnimg.cn/img_convert/69d75533947b00b996733440a4a3450b.jpeg) 图6 开源的PX4Flow光流

二.软件驱动层

飞控硬件平台搭建好后,我们首先要让他正常工作起来,指的是,让单片机运转,读取各个传感器数据,与外界进行数据交互等。

要让单片机工作,需要和最底层的寄存器打交道,传统的做法便是根据单片机手册去正确配置各个寄存器,使其能够按照指定频率工作并驱动各个外设。这个步骤非常复杂繁琐,特别是在寄存器更为复杂的32位单片机上,因此单片机厂商们如ST推出了便于使用的库函数,要实现特定功能不再需要去仔细研究手册上的寄存器配置,从此单片机编程变成了一件较为轻松的事情。

在单片机上运行用户程序,可以写个简单的while循环,或者基于定时器中断写个状态机,实现固定时间间隔的程序执行。而对于飞控来说,代码量大任务模块也很多,为了保证各个模块之间实现有条理的调度,并保证一些重要模块优先运行,通常我们会选择使用某个实时操作系统(RTOS)来实现这个目的。市面上有各种不同的RTOS可以选择,比如ucos,freertos,PX4所使用的Nuttx,APM后续使用的chibios,autoquad使用的coos,以及知名的国产RTOS:RT-Thread等。不过,RTOS只是一个工具,并不会最终影响到我们程序的计算结果,但是它保证了程序能够稳定有效地运行。

如果是在各类移动设备上编写应用程序,那调用传感器数据是一件轻松的事情,只要使用SDK提供的API接口,我们便能得到经过单位转换后的传感器数据。而在直接和硬件打交道的单片机上并不会这么轻松,我们需要熟读传感器手册,在单片机上使用IIC或SPI总线与传感器进行通信,对每一个控制寄存器进行配置,设置好传感器量程、采样时间、滤波频率等各类设置,如气压计之类的还要读出OTP存储器中保存的工厂校准参数,之后就要以固定时间间隔去读取传感器数据了,读出的数据相当于原始ADC值,可能还要转换成我们所需要的单位。这些其实都属于重复造轮子的工作,实际意义并不大,但是我们总是需要去做,因为嵌入式平台通用性较差,传感器更新换代也快,很少存在着一个通用的传感器驱动,如果某款传感器使用比较广泛或者运气比较好,那可以直接在网上找到开源的驱动程序,减少开发时间。

除此之外,飞控还需要和外界进行数据交互,比如解析接收机的PWM/PPM/SBUS信号,输出PWM信号给电调,发送数据给地面站/APP,接收地面站的数据与指令。飞控上常用的数据通信接口有串口和CAN等。

三.飞行感知与控制层

这里要解决的是机器人技术中的三大核心要点中的两点:环境感知运动控制。并且其中环境感知还只是做到了对于自身状态的感知,而不能感知周边环境。

飞行状态感知,第一步是计算飞机在三维空间中的姿态,首先要从陀螺仪说起,在现代航空航天产业中,陀螺仪无疑是最重要的元件,高精度陀螺仪甚至成为了国家的战略物资。我们将陀螺仪直接安装在飞机上,使它们处于同一坐标系,测量飞机的旋转角速度,再通过离散化数值积分计算,便能得到某段时间内物体的旋转角度。优点在于陀螺仪数据精度较高,不会受到外界环境干扰,不依赖任何外部信号,对震动(线性加速度)不敏感,而缺点是,只依靠陀螺仪无法确定初始姿态,其次由于各种误差的存在(传感器自身误差,积分计算误差等),积分得到角度值会存在累积误差,且随着时间的增加而变大。尤其是我们当前使用的低成本MEMS陀螺仪,其自身的随机噪声误差就已经远大于数值计算误差了。

为了解决只依靠陀螺仪计算姿态而导致的累积误差和初始状态确定的问题,我们引进了三轴加速度传感器。顾名思义,加速度计主要用于测量加速度,当它静止时,输出重力加速度,而根据三个轴上的重力加速度分量,我们便能计算出当前飞机相对于地球的姿态角。既然可以直接用加速度计计算出飞机姿态,那为何不干脆只用加速度计,抛弃陀螺仪呢?问题没有这么简单,首先由于工作原理及制造工艺的影响,通常加速度计传感器的噪声比较大,其次加速度计对震动非常敏感,轻微的抖动便会引入大量的噪声,最后也是最重要的,实际上,飞机并不是静止的,在飞行的过程中不断变化的运动加速度,均会被加速度计测量到,和重力加速度混合到一起,使得我们无法分辨出准确的重力加速度数值。换句话说,虽然我们可以直接使用加速度计的数据计算出飞机的姿态,但大部分时间内加速度计的数据可信度都很低。

综上所述,陀螺仪的数据短期精度很高,长期存在累积误差,而加速度计对于姿态的测量短期精度很低,但长期趋势准确。我们结合这两个传感器的特性,进行数据融合,最终计算得到一个相对精确的姿态值。

![图7 二战末期德国生产的V2导弹,首次应用了陀螺仪+加速度计的惯导系统](https://img-blog.csdnimg.cn/img_convert/44384a92421325f13afd76398826840f.jpeg) 图7 二战末期德国生产的V2导弹,首次应用了陀螺仪+加速度计的惯导系统

得到飞机姿态后,下面便是计算速度与位置,其原理简单来讲,便是结合姿态,运动加速度积分值,GPS和气压计的数据等,融合计算得到,具体实现方式将会在后面的具体章节中讲述。

当我们计算得到飞机状态信息后,便可以对飞机进行控制了。所谓控制,便是让飞机按照接收到的指令,往前飞、往后飞、往下飞、往上飞,或悬停在某个地方不动等等。多旋翼飞行器的发展比传统单旋翼(直升机)在时间上落后很多,并不是原先人们没有设计出这种类型的飞行器,而是出现了控制上等多方面的瓶颈。多旋翼是一种不稳定的飞行系统,极其依赖电子化的自动控制,要以很高的频率不断调整多个电机的转速,才能稳定飞行器的姿态,而这是单靠人力很难完成的工作。举个例子,一个训练有素的飞手,可以纯手动操控一个航模直升机,却不可能飞起一个没有电子系统辅助的多旋翼。如今在小型多旋翼飞行器上,依靠单片机精确的高速运算,配合电子调速器及高性能无刷动力电机,极大地降低了多旋翼的控制难度和成本。

在运行过程中,把计算得到的飞机状态量作为控制器的输入量,从而实现飞机的自动闭环控制。其中包括角速度控制、角度控制、速度控制、位置控制,这几个控制环节使用串联的方式有机结合起来,实时计算得到当前所需的控制量,根据多旋翼的实际控制模型(四轴、六轴或八轴等),转换成每一个电机的转动速度,最终以PWM信号的形式发送给电调,各个控制环节所需频率,从一秒调整数百次到几十次不等。

![图8 对多旋翼物理模型进行分析,得到电机动力分配方程](https://img-blog.csdnimg.cn/img_convert/8f789bf25967a48d4a8cab2cfb7af4d7.jpeg) 图8 对多旋翼物理模型进行分析,得到电机动力分配方程

不过在今天,也流行着一部分只使用了角速度闭环控制的多旋翼,俗称穿越机。穿越机飞手通过飞机上前置摄像头实时传回来的图像,进行基于生物视觉的人脑闭环反馈控制,以很快的速度不断手动调整多旋翼的旋转角速度,最终能够完成各种特技动作及低空高速障碍穿越飞行。

四.飞行任务层

多旋翼的飞行任务大概可以分为三类:手动遥控,自动控制,第三方控制。

1.手动遥控

对于普通的消费类多旋翼飞行器来说,可能大部分时间都工作在这个模式下:飞控接收地面遥控器发过来的指令,根据控制指令来执行飞行动作。

而大部分遥控器都有两个全向控制摇杆,分别对应着四个基本控制量:横滚、俯仰、偏航、油门。在自稳模式下,它们对应了多旋翼的俯仰角、横滚角、偏航角以及电机动力输出均值的控制量,用户可以自由控制飞机的飞行并根据飞机的实时飞行状态来不断调整摇杆,但对于新手而言,这无疑是很高难度的任务。在没有经过训练的情况下,同时控制多个状态会让用户手忙脚乱,飞机忽高忽低,到处乱飘,无法让飞机悬停在某个位置上或准确控制飞机到达某个位置。

![图9 某款遥控器示意图](https://img-blog.csdnimg.cn/img_convert/3aa0b45627ecb16c0c59b9d5fd323196.jpeg) 图9 某款遥控器示意图

于是在后来的消费类多旋翼飞行器中,其用户操控模式基本以半自动为主。当没有操作遥控器时,摇杆自动回中,此时飞机自动保持在悬停状态,而摇杆的4个控制量也变为了:X轴飞行速度,Y轴飞行速度,偏航角,Z轴飞行速度,即俯仰摇杆往前打时,飞机以固定的速度往前飞,横向速度为0,当只操控油门摇杆时,飞机以固定速度垂直上下飞行,水平位置保持不变,于是这样极大地降低了多旋翼的操作难度。

2.自动控制

在飞行过程中有一些时候可能没有遥控指令的参与,这时便需要飞机自主完成飞行动作,如自动起飞,自动降落,以及遥控器信号失联后的自动返航等。还有许多飞行任务是无法手动完成的,需要预先编写好任务程序,全自动执行。以最常见的测绘为例,通常需要在地面站软件上设置好测绘区域和参数,软件将自动生成飞行航线,其中包含了飞行路径、飞行速度、飞行高度和拍照间隔等信息,之后这些航线信息将会发送给飞控,然后飞控进入自动飞行模式,按照航线数据自主飞行,同时控制相机拍照。

![图10 自动航测功能](https://img-blog.csdnimg.cn/img_convert/ac9782504e47f36338ff914f68e3d3ca.jpeg) 图10 自动航测功能

3.第三方控制

还有一种情况,比如某个飞机上除了飞控之外,还装有高性能计算机,并连接多个摄像头,其中主摄像头用于识别特定目标,分析出该目标相对于飞机的距离和方位之后,需要控制飞机飞到指定位置。这时候要求飞控上预留出第三方控制接口,接收其它单元发送的控制指令并进行处理,如开源飞控PX4中便有offboard模式,DJI的大部分产品也提供了SDK以便他人开发自己的APP控制其飞机飞行。

你可能感兴趣的:(深入浅出多旋翼飞控开发,单片机,嵌入式硬件)