摘 要
世界的航空业的大门被20世纪莱特兄弟制造的“飞行者一号”开启,直至今日处于飞速发展的阶段。随着时代的进步,各种微电子、微传感、通信技术的飞速发展,让无人机在时代内成为一种新型的空中力量。除了军用方面的多种用途,无人机在在过去一年的疫情防控中也大放异彩。在疫情期间被用来进行无人安全巡查、无人防控宣传、消毒喷雾、传递物资、热感测温等等。在无人机的研究中,以对四旋翼飞行器的研究最为火热。所以本次对四旋翼无人机试验系统的设计与实现,在发展方面有相当可观的未来。
本次将会使用无人机元件组装无人机。将飞控板连接在支架后,在飞控板上连接四个电机和螺旋桨。通过遥控器来改变四个电机转速,让螺旋桨旋转导致升力的改变,从而对无人机的起飞升降俯仰侧翻进行操作。而调试飞控程序是本次的重点。
在系统设计中,采用keil C语言编程,卡尔曼滤波和串级PID作为控制算法。硬件方面,飞控主板搭载STM32F103C8T6核心,并且集成2.4G的无线通信以及6轴陀螺仪,配有电机、电池和led灯。遥控器的主控芯片也采用STM32F106C8T6和2.4G通讯模块,额外配有油门摇杆和方向摇杆,led灯和蜂鸣器。
关键词
多旋翼无人机;飞控;电子通信;KEIL
目 录
选题由指导教师指定。
1.2 研究背景
世界航空业自20世纪初莱特兄弟制造的“飞行者一号”开始,至今处于飞速发展阶段。近年来,随着微电子技术、微传感技术、通信技术、新型材料以及飞行控制技术的开苏发展,无人机凭借各种优势,逐渐成为新科技下的一种新型空中力量。在临近尾声的疫情中也大放异彩。无人机能凭借灵活、机动性强等多种性能,无人机作为空中平台非常强大,但是如果无法灵活操纵、难以控制,很容易造成无人机损坏甚至炸机。将飞控程序随着使用途径的不同来调整,可以减少实践中的经费浪费。
1.3 行业发展现状及研究价值
除了军事用途外,市面上的多旋翼无人机面向两个方向:民用消费级和民用应用级。在消费级方面,大多用于航拍和作为玩具上。轻质复合材料以及通信工程的飞快发展,为消费级的应用方面提供了基础条件,同时由于无人机飞控技术的成熟,对操纵多旋翼无人机提供更多轻便。由于产业链的成熟,使得无人机组装的配件的成本减少,这类消费级无人机价格大幅降低,发展方面持续高速增长。这方面的市场大多被大疆公司占据,其余的公司大部分选择民用应用级的植保方面,但是在无人机的续航、载重等技术有大规模的突破前,很难实现更为广泛的应用。
同时,在对无人机现状、行业现状进行考察后,我发现无人机行业被大企业占据的原因是人才缺乏,这正是由于多旋翼的发展迅速,但教材和课程的开展赶不上发展速度。所以即使多所职业学校开了这门学科,也面临重重困难。
无人机从技术上来看,飞起来并不难,但如何飞、如何控制,性能的稳定及通过传感器的信号接收,这是需要研究的难点。我选择将侧重点安放在对飞控程序进行的设计和调试上。从长远来看,无人机的未来非常可观。
1.4 全文流程
本文以四旋翼无人机设计分析、无人机硬件设计、无人机软件设计、总结和展望。这种设计顺序作为全文的流程。
第2章 无人机总体设计分析
2.1 基本组成分析
四旋翼无人机试验平台用来搭载无人机的各种外设,作为算法研究与飞行实验的基础,需要保证稳定。整个系统采用方便增添新设计及的模块化设计,方便算法改进。
机架采用PCB材质四轴支架,选择PCB,是因为它有如下优点:可高密度化、高可靠性、可设计性、可维护性。选择此机架在电子设备中有可以达到提供电子元器件固定,实现集成电路中的布局绝缘,让各种元器件提供所需要的电气特性。且符合无人机机架对质量和强度的要求。
动力系统是其中最重要的地方,它决定了多旋翼包括续航能力、载重能力、飞行能力等的性能。在选择无人机动力系统时,我考虑到电机效率会随着输出转矩的变化而变化,而输出转矩取决于螺旋桨的尺寸、型号等。本设计采用8520空心杯电机,和传统无刷直流电机相比,因为空心,所以转动惯量小,精度大,具备突出的节能特性,更符合无人机高续航低载重的需求。通过对高速电机8520的选择后,选择配有效率更高的轻、薄、螺距较小的塑料二叶桨。和刚性高、更笨重的碳纤维螺旋桨和木质螺旋桨相比,塑料二叶桨质量轻、耐冲击、价格低廉、不容易损坏。在坠机时,它的桨叶不会像碳纤维一样对周围人造成大威胁。
电源系统中的电池为整个系统提供电源。无人机最常见的问题是续航能力,要求高续航就需要更重的电池、会提高负载,对飞行的稳定性造成影响。要求稳定性,就要在续航方面进行取舍。我对无人机的负载能力进行设计后,选择了性能优越价格低廉、密度大、质量小、容量大的锂电池。
本次设计的指挥控制系统只使用遥控器,
所实现的实物如图2.1所示,全机重59g,重心在其几何中心上。
图2.1 四旋翼无人机实物图
2.2 硬件系统分析
无人机的硬件系统选择是无人机系统中的关键部分。在主要控制芯片的选择上,选择了搭载STM32F103C8T6作为核心。飞行控制系统是用来完成对无人机的飞行控制,STM32F103系列主频最大为72MHz,已经可以满足本次设计的需求。同时,飞控主板中含有包含安全防护以及飞行姿态控制的功能。该芯片具有64KB FLASH、20KB RAM、2个12bitADC、36个通用I/O口、4个16bit定时器、以及2个IIC,能支持各种传感器接口、2个SPI、1个CAN等。
除了核心外,本次设计的系统还包括通信模块和六轴陀螺仪。还外引出接口,方便以后可以外接其他的传感器或者其他的功能拓展升级。本系统完全满足无人机被遥控信号的采集和控制信号输出要求。
飞控主板的配置如下:STM32F103C8T6核心、MPU6050六轴陀螺仪、上位机演示通信接口、单片机外部晶振8MHz、ST_LINK仿真器接口、无线电通信晶振16MHz、24L01无线电通信芯片、板载天线、四个LED闪灯、电池接口、原装绕线电感、电机驱动管。
背面的接口如下:点击接口、PWM1234无刷电机扩展接口、SPI通信扩展接口、IIC通信扩展接口、航拍摄像头扩展接口、串口1通信扩展接口。
2.3 软件系统分析
在无人机的软件设计方面,主要进行飞控程序的设计。多旋翼无人机在行业应用中得以高速发展,与开源飞控的支持分不开的。本次设计并不是全自主开发,而是部分借助开源来做好设计。软件系统的系统构架从硬件层开始到硬件抽象层、实时操作系统RTOS、应用层。
硬件层负责实现硬件部分的驱动程序,硬件抽象层负责将硬件层的驱动程序兼容进使用的核心中,应用层负责进行飞行控制程序,实现多旋翼的飞行控制。而飞行控制又分为四个层次,分别是控制位置、控制姿态、控制分配和控制电机。
这样设计的优点是使结构清晰,模块化更能方便飞行器的设计和更改。
2.4 飞行原理分析
四旋翼无人机是通过改变各个旋翼的转速,即改变四个电机的转速来对飞行器进行控制。通过改变转速,可以改变无人机的姿态、悬停状态、倾斜状态等。与传统的直升机依靠改变矩角状态起飞、用小垂直尾翼抵消反作用力矩不同,四旋翼利用两对旋翼旋转的相反配置,来让彼此力矩之和为0。即是相对旋翼旋转方向相同,相邻的旋翼旋转方向相反,两队旋翼的升力相同的时候,两对反转扭矩的作用就可以被抵消了,防止有害的自旋。同时,通过对旋翼的控制,改变他们的转速就可以改变无人机的飞行姿态。
四旋翼无人机的布局有十字型和X字型结构如下图2.2,相比之下X字型无人机较十字无人机的结构优势明显,一是有更多的旋翼可以参与四旋翼无人机的状态,使安全性和稳定性提升。二是X字型可以有效减少无人机旋翼和机臂对摄像视野的遮挡。三是和十字型相比,X型的受力更为平均。
下面将选择忽略一切外界干扰条件,利用本次设计的X型举例,对四旋翼的控制原理进行分析。
图2.2 四旋翼无人机布局
在图2-2中,可以看到X型布局中,旋翼1和旋翼3在绕着逆时针旋转,旋翼2和旋翼4在按照顺时针旋转。
规定沿着当前x轴方向运动是向前运动,箭头向上表明这旋翼的转速提高。
- 垂直运动
如图2.3,想达成此状态,同时增加旋翼下的电机的输出,让旋翼的转速增加,从而让四旋翼无人机的总升力增加,当旋翼提供的总升力大于无人机的重力时,四旋翼无人机垂直上升;反之,在旋翼已经提供稳定升力的情况下,同时减少旋翼下的电机的输出,让旋翼的转速减少,四旋翼无人机垂直下降,这样就实现了沿着Z轴的垂直运动。在忽略一切外界条件的标准情况下,当旋翼提供的总升力和飞行器的重力相同的时候,飞行器保持悬停状态。
图2.3 四旋翼无人机的垂直姿态图
- 俯仰运动
如图2.4,想达成此状态。让旋翼3和旋翼4下的电机转速保持不变,同时增大相对的旋翼1和旋翼2下的电机转速。当旋翼3和旋翼4提供的升力总和小于旋翼1和旋翼2提供的升力总和,无人机做向下的俯运动。与之相反,当旋翼1和旋翼2提供的升力总和小于旋翼3和旋翼4提供的升力总和,无人机做向上的仰运动。
图2.4 四旋翼无人机的俯仰姿态图
- 横滚运动
如图2.5,想达成此状态。可以让旋翼1和旋翼3下的电机转速保持不变,同时增大相对的旋翼2和旋翼4的电机转速。当旋翼2和旋翼4提供的升力总和小于旋翼1和旋翼3提供的升力总和,无人机做向左边的横滚运动。与之相反,当旋翼2和旋翼4提供的升力总和小于旋翼1和旋翼3提供的升力总和,无人机做向右的横滚运动。
图2.5 四旋翼无人机的横滚姿态图
- 偏航运动
如图2.6,想达成此状态。可以让旋翼2和旋翼3下的电机转速保持不变,同时增大相对的旋翼1和旋翼4的电机转速。当旋翼2和旋翼3提供的升力总和小于旋翼1和旋翼4提供的升力总和,无人机做逆时针的偏航运动。与之相反,当旋翼1和旋翼4提供的升力总和小于旋翼2和旋翼3提供的升力总和,无人机做顺时针的偏航运动。
图2.6 四旋翼无人机的偏航姿态图
整理后如下表2.1:
表2.1 四旋翼转速与飞行关系
飞机运动 | 旋翼1转速 | 旋翼2转速 | 旋翼3转速 | 旋翼4转速 |
右滚转 | 增大 | 减小 | 减小 | 增大 |
左滚转 | 减小 | 增大 | 增大 | 减小 |
仰运动 | 增大 | 增大 | 减小 | 减小 |
俯运动 | 减小 | 减小 | 增大 | 增大 |
右偏航 | 减小 | 增大 | 减小 | 增大 |
左偏航 | 增大 | 减小 | 增大 | 减小 |
第3章 无人机系统硬件设计
本章节主要对无人机硬件电路进行介绍和解释,考虑到适应无人机系统升级方面的需求,在进行总体硬件设计时,听过串口来进行数据的交换。由于只有一块控制芯片,并没有增加太多外设,避免增加系统负担。
3.1 STM32F103电路设计
选择STM32F103C8T6作为主要控制芯片,在芯片的基础上进行电路设计。设计思路如下:时钟电路、复位电路、编程下载电路、稳压电路。关于STM32F103的设计如下图。
图3.1 STM32原理图
主控芯片采用STM32F103C8T6,作为飞行控制系统,负责运行飞行控制算法。该处理器高达72MHz,对主要专注于控制部分的飞控系统来说足够。该系统需要完成的任务是对遥控器的指令进行接受处理、对无人机进行飞行控制的任务。
对遥控器的指令进行接受处理是通过STM32F103芯片定时器的捕获输入信号的功能来解读的。遥控器的接收信号格式有很多,常见的接收信号格式是PWM格式和PPM格式,STM32F103芯片需要处理的是将遥控器信号解析出来,并且利用输出比较的功能来产生和输入信号相关的PWM信号,在芯片运转后对电机进行驱动管理,从而按照飞行需要来改变电机的转速。
而无人机飞行控制的任务是决定四旋翼无人机能否稳定飞行最重要的任务。飞行控制的处理模块接受的信号,来自系统内配置的六轴陀螺仪。得到信息后可以使用遥控器来改变姿态。通过所设计的控制算法,来改变驱动电路来驱动电机,达到改变转速来改变姿态的结果。
如图,可以看到主控芯片外接8MHz的晶振电路,用来产生振荡,抗干扰,使电路工作在稳定的频率范围之内。还外接了可以使系统恢复最初始的状态的复位电路。程序下载电路使用的是JTAG,编程方式是在线编程。为了提高稳定性,还在每对连接一个滤波电容,提高电源供电的质量。
其他的引脚可以增添外设,提供更高的自由度。
3.2 电源电路设计
无人机为了提高飞行能力,并不采用固定电源来充电。为了提高续航能力、减轻无人机的总体重量,我采用可以充电的3.7V、600MA的锂电池为无人机提供输入电压,和提供同等电量的普通电池相比,锂电池的重量更轻,给无人机缓解载重压力。同时,可充电的特性可以让电池使用多次。
STM32F103的输入电压为3.3V,但其他的外设需要的输入电压为5V,因此需要对锂电池进行升压和降压的处理,靠3.7V的锂电池为需要输入电压5V的外设和需要输入电压为3.3V的外设提供能量。
为了增加续航能力并且减轻机体负担,我并不采用第二块电池,而是选择增加一块升压芯片来升压到5V。
电源-开关-升压-降压电路如下图3.2。
图3.2 电源-开关-升压-降压电路
为了便于无人机的使用,设计一个简单的电源开关,按下按键时,整个无人机开始运转。
开关闭合时,输入电压3.7V用过47uh的电感L1向升压芯片BL8530供电,BL8530芯片是一种国产的DC-DC升压芯片,和其他同类产品比较,它的价格更低廉。它的固定输出电压是5V,刚好适用于提供外设的输入电压。在升压芯片BL8530的作用下,输出电压增高到5V,向外设等供电。同时,也利用电池稳压芯片将5V的输入电压,降压到可供STM32使用的3.3V输出。
接电容是为了平滑输入和输出的电压,防止在升降压电路中供电系统的不稳定。
3.3 6轴陀螺仪控制电路设计
想了解无人机的具体状态,需要一个工具来获取无人机系统的信息,为无人机系统提供飞机姿态、PID参数等数据。
本设计选用MPU-6050六轴陀螺仪。这个6轴陀螺仪集成了一个可以增加东西的处理器DMP,还有一个三轴陀螺仪和三轴加速度计,含有的I2C接口连接其他的传感器。
图3.3 6轴陀螺仪控制电路
其中三轴陀螺仪感应的是左右倾斜、前后倾斜、左右摇摆的角度旋转和平衡这类全方位动态信息,而三轴加速器是感应XYZ三轴向上的加速,用来进行横向加速。
MPU-6050自带的数字运动处理的DMP硬件加速引擎,用来输出6轴的姿态,可以大大降低开发难度。集成可控制的程序,并且还自带1024字节的FIFO,同时超小的封装尺寸,都可以满足无人机低功耗、轻负担的需要。
如图3.3,将MPU6050的SCL和SDA引脚连接在STM32F105上,与主控芯片进行通讯。其中,陀螺仪的敏感度是 131 LSBs/° /sec ,感测范围为±250、±500、±1000 与±2000°/sec ,加速度计的精度为±2g、±4g、±8g 和±16g ,完全满足本设计对姿态数据采集精度的要求。
3.4 NRF24L01 2.4G通信模块设计
四旋翼无人机的飞行会与操控装置进行通信,遥控器发送信号,通过通信模块进行接收。选择功耗较低、数据传输较远的NRF24L01单片射频收发器件来达成通讯,数据传输率为1Mb/s~2Mb/s,尽管数据传输量不如WIFI,但其的低消耗可以提高本无人机的续航能力。
CE使能发射或接受,CSN、SCK、MOSI、MISO是该通信模块SPI的引脚端,STM32可以通过该引脚配置NRF24L01。
图3.4 2.4G通讯模块
3.5 扩展输出接口电路设计
为了未来增添新外设,更新系统设置,额外添加拓展用的输出接口如下:
- 扩展IIC接口
IIC是一种很简单的双向同步串行总线,可以和传感器相连接。他只需要两根线,一根是时钟线SCL、第二根是数据线SDA。六轴陀螺仪的IIC接口和STM32F103连接,本条拓展IIC接口可以跟陀螺仪共用,在未来添加磁力计等。如图3.5所示
图3.5 扩展IIC接口
- 扩展IO
增加扩展IO,避免日后增添外设I/O口不够的情况。如图3.6
图3.6 扩展IO口
- SWD烧录程序接口、串口数据输出
从1~4作为SWD烧录程序的接口,用来更新飞控程序和调试飞控程序。利用仿真器的在线编程利于程序的调试,SWD模式使用ARM的标准双向线的通信协议,方便在调试器和无人机之间进行较为高效的数据传输。见下图3.7
在5~8作为串口的数据输出扩展,可以连接匿名上位机,观看飞控调试后和飞行中的飞机状态。见下图3.7
图3.7 接口
3.6 电机控制电路
本次设计我选择的电机是转动惯量小,精度大,突破传统电机结构形式的8520空心杯电机,扭力大、重力轻。由于是四旋翼无人机,共配有四个8520空心杯电机,以及四片双叶螺旋桨。下图以其一为例,阐述设计理念。
通过处理器解析遥控信号后,通过核心STM32F103输入PWM格式的信号使电机改变转速,来调整无人机的飞行姿态。
图3.8 电机控制电路
3.7 指示灯电路设计
指示灯用来指示无人机工作状态。接通电源后,如果出现下面的两个红色LED灯开始闪烁,两秒后上面的两个蓝色LED灯开始闪烁,后两对灯间隔0.5S交替的情况,即为通电正常,无人机可正常运转。
图3.9 指示灯电路设计
在接收到遥控器的解锁信号后,灯不再闪烁,启动遥控器可以进行无人机飞行操纵。电路如图3.9
3.8 飞控板原理图清单表
本小节将无人机设计板上的元件清单一一展示。
名称 | 数值型号 | 封装 | 数量 | 丝印 |
贴片 | ||||
贴片开关 | MK12C02 7P-12608 | 7P-12608 | 1 | KG1 |
贴片电容 | 0.01UF | C_0603 | 1 | C7 |
贴片电容 | 0.1UF | C_0603 | 12 | C2, C3, C4, C5, C6, C8, C9, C10, C11, C13, C18, C19 |
贴片电容 | 2.2NF | C_0603 | 1 | C1 |
贴片电容 | 22PF | C_0603 | 2 | C12, C14 |
贴片电容 | 47UF | C_1206 | 3 | C15, C17,C24 |
贴片电阻 | 10K | R0603 | 7 | R2, R3, R4, R7, R11, R12, R13 |
贴片电阻 | 1K | R0603 | 4 | R1, R8, R9, R10 |
贴片降压芯片 | 662K | SOT23-PIN132 | 1 | U4 |
贴片晶振 | 8MHZ | Y3213 | 1 | Y1 |
贴片升压芯片 | BL8530 | SOT-89-3 | 1 | U3 |
贴片电感 | 470(47UH) | L_CD43 | 1 | L1 |
贴片6轴陀螺仪 | MPU6050 | QFN24 | 1 | U1 |
贴片发光二极管 | B_LED | LED0603 | 2 | LED1, LED2 |
贴片发光二极管 | R_LED | LED0603 | 2 | LED3, LED4 |
贴片二极管 | S4 | SOD-123 | 2 | D15, D16 |
贴片MOS管 | SI2302 | SOT23-123 | 4 | Q1, Q2, Q3, Q4 |
贴片主控芯片 | STM32F103C8T6_LQFP48 | LQFP48 | 1 | U2 |
插件 | ||||
插件排针直针 | 8P 2.54MM | HDR1X8 | 1 | J1 |
插件2.4G模块 | NRF24L01 | 24L01 | 1 | 24L01 |
2P排针 2.54MM 90度弯针 | DC4.2V | SIP2 | 1 | VBAT1 |
表3.1 元件清单
3.9 各模块连接示意图表
图3.10 连接图
第4章 无人机系统软件设计
无人机的程序是整个系统中的灵魂,因为各项任务都需要系统程序来实行,所以系统程序设计的好坏会影响无人机飞行系统的稳定性。因此,下面将分别讲述系统程序的设计。
4.1 多旋翼底层程序
较为常用的程序,作用是识别并且驱动STM32F103上的各个外设,来实现最基本的数据输入和输出功能。由于驱动程序在不同的嵌入式系统内的接口标准都是统一的,所以移植到不同的平台只需要对其进行一些修改。很大程度上节省了设计程序、检查程序、调试程序的时间。本文不会逐一展示与此相关的程序,简述移植和建立连接的方法。
移植的程序中,将每一个外设对象主要分成两个部分:参数文件和功能文件。
参数文件包括一些外设寄存器的信息,会和设计的电路匹配。功能文件完成具体的程序功能,包括初始化、寄存器配置和读写数据等功能。上层的程序只需要使用提供的程序接口就可以使用这些,提供简单便捷的交互。与此相关的基本设计如图4.1所示。
图4.1 系统程序底层设计结构
其中,通过修改和移植完成的底层程序包括如下,片上外设有:IIC构件、USART构件、定时器TIM构件、ADC构件、SPI构件等等。还包括板上的外设:六轴陀螺仪MPU6050构件、NRF24L01 2.4G通信模块、LED灯构件。其中板上外设的层次要高于片上外设,具体的层次结构实现,如下图4.2
图4.2 系统程序底层结构实现图
为了方便记录和讲述想法,我在此讲述片上外设六轴陀螺仪MPU6050的正常工作是如何实现的。
首先明确,通常情况下,MPU6050通过它的SCL和SDA接口和MCU的IIC接口连接。但STM32的IIC工作时可能会出现不稳定的情况,因此我调用已经写好的程序,采用通用I/O口来模拟STM32的IIC接口,连接MPU6050。
将程序根据需求和兼容性进行更改,操作如下:调用片上IIC构件,完成MPU6050的程序编写。使用时可以直接进行初始化函数,之后按照需求调整数值机可,上层的程序与下层的实现并不冲突。
具体操作见图4.3。其他的板上外设硬件LED灯和NRF24L01通信模块大致与MPU6050类似。
图4.3 MPU6050工作实现图
4.2 遥控交互、失效保护程序
无人机需要和操纵手交互,其中主要使用的工具是遥控器。编写的程序中,将摇杆值作为飞行角度的期望值,转入飞控程序中和位置、姿态相关的串级PID控制。遥控器将会通过匿名通信协议,调用NRF发射数据。无人机通过通信协议调用NRF接收数据。
失效保护是在无人机产生安全问题时对人和无人机进行保护。其中可能发生的安全问题如下:通信故障、传感器失效、动力系统失效。
其中通信故障在本设计中的产生原因是遥控器未校准,又可以说没有让无人机了解遥控器按键的用途等。对此,我设计通过遥控器的键位进行对无人机的解锁,设计中使用油门摇杆解锁。
从左下角锁定开始,到油门最低→油门最高→油门最低。开启遥控器对无人机的控制。
程序设计判读油门打到最低才开始贮存摇杆值。发送数据的频率是10ms。等到LED灯不再闪烁,即完成解锁。同时防止遥控开机时的初始化尚未完成的错误程序,最高油门情况需要保持200ms以上。
同时,对产生安全问题有统一的失效保护:
(a)意外情况发生时,可以用遥控器紧急上锁,飞控就可以在任何的情况下进行紧急的终止飞行。
(b)如果两秒没有收到遥控数据,则判断遥控信号丢失,飞控立刻停止飞行,锁定飞行器,退出PID控制,避免伤人。
(c)油门摇杆处于最低六秒时自动上锁。
4.3 飞行控制系统程序
图4.4 飞行控制流程
具体算法设计单独列出第五章,本小节讲述无人机飞行系统总体流程图。
4.4 飞控调试程序
飞行控制是整个飞控系统的核心,为了进行稳定的飞行控制,调试飞控程序是必不可少的一条。利用程序,使上位机可以对NRF2401进行飞控调试。
程序编写如下:接受上位机的PID组,接受上位机读取PID的请求。
开始:接收到上位机发来的PID数据,提取数据防止被下一组覆盖。将不同组的PID数据分别提供给速度环、角度环、高度环。上位机请求读取飞控PID数据,暂停发送数据给上位机,判断飞控。处理数据,发送数据,判断请求。
继续反复进行上位机请求读取数据-发送数据到上位机-接受到上位机的数据,进行处理-处理结束,继续发送数据-判断上位机的请求-接受上位机数据的流程。
图4.5 上位机数据调试界面
连入上位机,上位机端数据的接受使用匿名上位机程序,调试PID的系统及其界面如图4.5
图4.6上位机数据接收界面
输入数据对无人机进行调试,因为在程序中改写PID并不会保存数据,所以需要调试后直接在程序里更改,成需要首先经过控制参数初始化,最后输入在调试程序中数值的千分之一录入程序。改完之后,通过烧录器连接飞控模块。将新程序进行编译查询是否有误,将程序烧录到无人机中。
第5章 飞行控制系统设计
飞行控制作为无人机的灵魂,很大程度决定了能否正常、可靠、高效地对四旋翼进行控制。无人机的控制主是要控制电机的转速进行飞行。四旋翼的底层飞行控制流程如下:
图5.1 底层飞行控制框架
对期望的轨迹进行位置控制,对期望的俯仰和滚转角以及期望的偏航角进行姿态控制。对得到的期望力矩和期望拉力进行控制的分配,从而通过控制电机得到期望的螺旋桨转速,最后发出电机油门指令,就是飞行控制。见图5.1
实际飞行中的四旋翼和理想状态下的模型不同,需要考虑的变量很多,作为非线性系统的四旋翼无人机,它的设计和分析十分复杂。其中姿态控制系统更是控制的中心。见图5.2,接下来将会将PID控制方法应用在位置控制和姿态控制中,并编写程序。
图5.2 四旋翼飞行控制系统组成
5.1 位置控制
位置的信息包括二维的位置以及高度信息,对四旋翼的导航来说非常的重要。
精准的姿态通过六轴陀螺仪来作为测量用传感器,获取姿态的信息。六轴陀螺仪包括一个三轴陀螺仪和一个三轴的加速度计。三轴陀螺仪的动态响应快,但对角速度积分时会产生误差。三轴加速度计是一种惯性传感器,可以测量物体的比力,功耗低、也可以得到稳定的姿态角,但它受震动影响大。在位置控制的实际应用中,传感器的数据还会包含噪声,所以在得到数据后还会进行一个滤波处理,过滤对位置控制产生影响的噪声。同时利用卡尔曼滤波进行姿态角的估计,得到数据后以欧拉角、旋转矩阵或是四元数等形式表达。
位置控制的主要目的是为了让无人机按照预定的航机飞行,位置控制器在控制系统的最外环。在位置控制中加入期望的轨迹,得到期望的姿态角,再转入姿态控制。
5.2 姿态控制
多旋翼中采用串级PID控制结构,由内外环控制,外环的会为内环的控制器提供指令,结构如图所示。在串级PID中,先计算外环,再计算内环。
图5.3 PID控制环节
PID控制环节分为比例、积分、微分三个控制环节,各环节的作用如下:
比例环节,这是PID控制的基本环节。将一定比例获得的偏差信号发送,立刻产生控制作用。在系统出现了偏差后,比例调节会产生调节来减少偏差。比例越大,越可以加快调节,减少误差。相对的,如果比例过大,系统的稳定性会下降,甚至可能造成系统的不稳定。
积分环节,可以让系统消除稳态误差。只要有误差,积分调节会一直进行,直到没有误差,积分调节停止。强度和时间常数有关,时间常数Ti越小,积分的作用就会越强。反之如果Ti越大,积分的作用就会变弱。
微分环节,系统偏差信号的变化率,可以提前预见到偏差变化的趋势,产生超前的控制作用。如果输出没有变化,微分作用没有输出。同时,过强的微分环节可能会对系统的抗干扰有害。微分环节不能单独使用,需要和比例或积分环节结合。
刚体的姿态表示方法有两种,本次设计中采用的是欧拉角方法。它在俯仰角为90°时,存在很多的奇怪问题。同时它存在着大量的超越函数运算,函数复杂。还会造成覆盖一个轴旋转、失去一维自由度的万向节死锁的情况。但它的优点是没有多余的参数,物理意义明确,方便处理数据和进行编程。
通过得到IMU数据,进行串级的PID控制的结构如图5.4。
图5.4 PID控制示意图
5.3 控制分配和电机控制
控制分配的基本思想是将控制的指令按照某些优化的目标分配给执行的机构,并且要满足约束条件。算法研究经历了很久,由于多旋翼有多个动力单元,所以算法需要解决多种动力单元的组合有限程度。
通过PWM输出对电机进行控制。
第6章 总结与展望
多旋翼的未来可期,在未来可能发展的技术都为它的大放光彩打下基石。
本文完成的工作如下:
对X型无人机进行飞行原理的分析。
对无人机的硬件进行设计和组装。
对无人机的软件部分进行设计和调用程序。
对无人机的飞行控制算法进行设计。
对无人机的安全保护进行设计。
附录:
飞行控制程序
case PROCESS_31:
pidRateX.measured = MPU6050.gyroX * Gyro_G;
pidRateY.measured = MPU6050.gyroY * Gyro_G;
pidRateZ.measured = MPU6050.gyroZ * Gyro_G;
pidPitch.measured = Angle.pitch;
pidRoll.measured = Angle.roll;
pidYaw.measured = Angle.yaw;
pidUpdate(&pidRoll,dt);
pidRateX.desired = pidRoll.out;
pidUpdate(&pidRateX,dt);
pidUpdate(&pidPitch,dt);
pidRateY.desired = pidPitch.out;
pidUpdate(&pidRateY,dt);
CascadePID(&pidRateZ,&pidYaw,dt);
break;
case EXIT_255:
pidRest(pPidObject,8);
status = WAITING_1;
break;
default:
status = EXIT_255;
break;
PID算法
void pidUpdate(PidObject* pid,const float dt)
{
float error;
float deriv;
error = pid->desired - pid->measured;
pid->integ += error * dt;
deriv = (error - pid->prevError)/dt;
pid->out = pid->kp * error + pid->ki * pid->integ + pid->kd * deriv;
pid->prevError = error;
}
void CascadePID(PidObject* pidRate,PidObject* pidAngE,const float dt)
{
pidUpdate(pidAngE,dt);
pidRate->desired = pidAngE->out;
pidUpdate(pidRate,dt);
}
无人机PID调试
#include "ALL_DEFINE.h"
volatile uint32_t SysTick_count; //系统时间计数_st_Mpu MPU6050; //MPU6050原始数据_st_Mag AK8975;_st_AngE Angle; //当前角度姿态值_st_Remote Remote; //遥控通道值
_st_ALL_flag ALL_flag; /系统标志位
PidObject pidRateX; //内环PID数据
PidObject pidRateY;
PidObject pidRateZ;
PidObject pidPitch; /外环PID数据
PidObject pidRoll;
PidObject pidYaw;
PidObject pidHeightRate;
PidObject pidHeightHigh;
void pid_param_Init(void); //PID控制参数初始化
void ALL_Init(void)
{
IIC_Init(); //I2C初始化
pid_param_Init(); //PID参数初始化
LEDInit(); //LED闪灯初始化 MpuInit(); //MPU605初始化 USART3_Config(); //上位机串口初始化 NRF24L01_init(); //2.4G遥控通信初始化
TIM2_PWM_Config(); //四路PWM初始化
TIM3_Config(); //系统工作周期初始化
}
void pid_param_Init(void)
{
pidRateX.kp = 2.0f;
pidRateY.kp = 2.0f;
pidRateZ.kp = 4.0f;
pidRateX.ki = 0.0f;
pidRateY.ki = 0.0f;
pidRateZ.ki = 0.0f;
pidRateX.kd = 0.08f;
pidRateY.kd = 0.08f;
pidRateZ.kd = 0.5f;
pidPitch.kp = 7.0f;
pidRoll.kp = 7.0f;
pidYaw.kp = 7.0f;
}