无人机项目

串讲流程

Posted by mkk on January 11, 2025

项目介绍

这个四轴无人机,是上家公司接的一个儿童玩具项目。

整个项目分为两部分,分别是飞机部分和遥控部分,两部分采用2.4g无线通信。 飞机部分的结构比较简单,主要就是一个机架+4个电机+一个飞控板,飞控板通过4路PWM信号控制4个电机的转速。 遥控部分呢,有两个摇杆,用于控制飞机的运动,包括上升下降、前进后退、左右移动、以及水平转向,摇杆信号通过4个ADC通道进行采集。除此之外,还有几个功能按键,用于远程关机、校准摇杆等。最后还有一块OLED屏幕,用于显示油门大小和控制信息。

下面我分别详细的介绍一下这两个部分 首先是飞机部分,飞机部分的核心就是控制飞行姿态,首先无人机的飞行姿态,一般用欧拉角来描述,所谓欧拉角,就是三个角度,分别是俯仰角、横滚角和偏航角(可以配合手势加以说明),所以飞行姿态的控制,主要就是控制这三个角度。比如我想让飞机保持稳定,那我们只需令这三个角度都为0即可,如果想令飞机前后运动,只需令俯仰角维持在一个特定的角度即可(也可以配合手势)。

当然想要控制这三个角度,首先需要得到这三个角度,这三个角度我们是使用MPU6050这个六轴传感器测的,它内部集成了三个加速度计和三个陀螺仪,加速度可以测量沿x y z三个方向的直线运动的加速度,陀螺仪可以测量绕x y z三个方向旋转的角速度。由于它不能直接得到欧拉角的三个角度,所以需要对MPU6050的数据进行进一步的计算。首先MPU6050这个传感器非常灵敏,所以测得的原数数据,尤其是加速度,有很大的波动,所以我们首先对原数数据做了一个滤波处理,加速度采用的卡尔曼滤波,角速度采用的是比较简单的低通滤波。之后我们又使用四元数对滤波后的数据进行解算,最终得到了这三个角度。

这三个角度的控制,我们分别使用了一个PID控制器,PID控制器,是一个典型的反馈控制系统。核心的控制思路就是,我们给这三个角度分别设置一个期望值,然后再实时测量这三个角度,之后将期望值和测量值之间的误差传入PID控制器,PID控制器就会根据误差值计算出一个输出值,之后我们再将输出值作用到4个电机的转速上。怎么作用,这里需要解释一下,假如现在俯仰角存在一个误差,比如机头偏低,那么前两个电机就要加上PID的输出,后两个电机就要减去PID的输出,这样就能减少俯仰角的误差。这个过程,需要循环不断的执行,PID会一直动态的调整电机转速,使三个角度尽量维持在我们设置的期望值。

PID的输出值由3部分组成,分别是比例部分、积分部分和微分部分,比例部分就是一个系数P误差值,积分部分是一个系数I误差的积分,微分部分是一个系数D乘以误差的变化率,三个部分的比重,可以通过各自系数进行调整。 比例部分就相当于是一个与误差成正比的回复力,一般占最大比重,微分部分相当于一个与回复力相反的阻尼力,让被控量回复的更平稳,防止因惯性纠正过头,导致来回震荡。积分部分通常用于解决稳态误差。

我们项目中用于控制欧拉角的这三个PID,全都采用了串级PID方案。外环PID控制的是角度,内环PID控制的是与之对应的角速度,串级PID的好处就是能另整个控制系统的响应更加迅速。例如,当干扰发生时,首先影响的是角速度,进而才能影响角度,因此内环也就是角速度环能够在更短的时间内做出反应,将角度变化快速控制在一个较小范围内。

这就是飞行姿态控制的核心思路。

除此之外,关于电机转速的设置,还需要补充一点: 我们定义了一个飞行状态的状态机,一共有这么几个状态,分别是空闲状态、飞行状态和故障状态,在不同的状态下,电机转速的设置逻辑是不同的。 初始状态为空闲状态,此时遥控油门无效,电机转速恒为0。 需要进行油门解锁操作才能进入飞行状态,我们规定的解锁操作是,油门拉到最高,保持1秒钟再拉到最低,解锁成功后就会进入飞行状态,此时遥控油门就生效了,这时候,电机的转速等于油门值+PID的计算结果,这里油门占80%,PID结果占20%。 如果出现遥控失联等问题,就会进入故障状态,这时电机的转速会逐渐降低为0。

飞机端的应用层逻辑差不多就是这些,然后这个项目是基于FreeRTOS开发的,我们一共划分了这么几个任务,分别是 通信任务、飞控任务、灯控任务和电源任务。 通信任务的职责就是通过2.4g通信芯片接收遥控数据,然后根据收到的数据,维护飞行状态机 飞控任务的职责就是根据当前的飞行状态,将遥控数据和PID计算结果作用到电机上,控制电机转速 灯控任务的作用就是用不同的闪烁频率,指示当前所处的飞行状态 电源任务的作用就是控制电源芯片,实现遥控关机的功能

下面我再介绍一下遥控端 遥控端的核心逻辑就是实时采集两个摇杆以及功能按键的信号,然后将数据通过2.4g无线通信芯片发送到飞机端,同时将油门和其他控制信息显示到OLED屏幕上。

摇杆一共有两个,分为4个方向,左边2个、右边2个,所以需要用到4个ADC采集通道,ADC采集到数据后,我们直接使用DMA将数据写到了内存中。然后又对摇杆数据做了一系列的处理,首先是做了一个滤波处理,采用的是滑动窗口滤波,所谓的滑动窗口滤波,就是每采集到一个新的数据,就是取最近10次的值,求平均值作为结果,这样做的目的,就是保证摇杆数据的变化更加平滑,除此之外,还对摇杆数据做了限幅、中点校准处理。

做完上述处理后,就是数据的发送了,这里我们自己定义了一个简单的数据包格式,包括帧头、摇杆和按键数据、以及一个校验和,飞机端收到数据后,会先对帧头和校验和进行校验,校验通过后才会根据数据执行响应操作,这样能更好的保证通信的安全。

最后呢,遥控端也是基于FreeRTOS开发的,我们一共定义了这么几个任务,分别是: 摇杆扫描任务 按键扫描任务 通信任务 OLED显示任务

摇杆扫描任务的职责就是通过ADC实时采集两个摇杆的数据 按键扫描任务的职责就是扫描功能按键 通信任务的职责就是将摇杆和按键数据发送到飞机端 OLED通信任务的职责就是显示摇杆数据

架构图

image.png

image.png

问题

2.5.2项目用的哪个单片机?RAM多大,最高主频多少?

用的STM32F103C8T6,RAM是20KB,最高主频72M。 考虑到功能需求和成本,所以选择这款芯片。

2.5.3无人机选择电机类型需要考虑什么因素

无刷:贵,寿命长、噪音小 有刷:便宜,寿命短、抖动、线性控制

2.5.4项目做了分层,是怎么规划的? 目的是提高系统的课维护性、可扩展性和可重用性。 分层包括:

  • 驱动层:主要是片内外设的驱动,与芯片直接交互的代码;
  • 硬件接口层:主要是外部硬件的驱动,提供统一接口给上层应用;
  • 公共层:主要是一些特定算法、工具函数;
  • 应用层:主要的业务逻辑;
  • 中间层:在项目中主要是FreeRTOS的移植文件和配置;

2.5.5项目主要分为哪些功能模块?
1)实时操作系统
移植FreeRTOS实现多任务调度和管理。
2)数据采集
姿态数据:MPU6050获取三轴加速度、三轴角速度;
摇杆数据:通过ADC采集2个摇杆4个方向的大小;
电池电压:通过ADC采集电池的电压;
3)姿态计算
对获取到的MPU6050原始数据进行滤波、四元数解算,得到欧拉角。
4)姿态控制
串级PID:三个欧拉角都是内环角速度环、外环角度环辅助;
电机控制:根据PID得到的结果,输出PWM到4个螺旋桨电机;
5)遥控控制
通过2.4G无线通信模块,实现遥控四轴无人机上升下降、前进后退、左右移动。
6)数据显示
通过OLED展示2个摇杆4个控制的幅度、信道。

2.5.6驱动层用到哪些驱动?
(1)IIC:用于MPU6050
(2)SPI:用于2.4G模块和OLED
(3)ADC:采集4个摇杆和电池电压
(4)定时器:PWM输出控制螺旋桨电机
(5)USART:方便打印调试
(6)GPIO:按键

2.5.7硬件接口层有哪些硬件?
(1)MPU6050:获取三轴角速度、加速度
(2)8520空心杯电机:有刷、直流,4个螺旋桨X型布局。
(3)Si24R1:2.4G无线通信模块
(4)摇杆、按键

2.5.8应用层做了哪些事?
1)姿态计算
(1)MPU6050原始数据处理转换。
(2)零偏校准。
(3)三轴加速度简易卡尔曼滤波。
(4)三轴角速度一阶低通滤波。
(5)四元数解算得到欧拉角。
2)串级PID
(1)内环:角速度环
(2)外环:角度环
三个欧拉角都进行串级PID处理,根据螺旋桨控制的方向,叠加在4个螺旋桨的PWM。
3)摇杆和按键处理
(1)ADC读取4个摇杆数据,转换、滑动窗口滤波、限幅。
(2)左按键中点校准:长按按键,进行摇杆中点值校准。
4)无线遥控
(1)根据自定义通信协议,封装遥控数据成数据帧。
(2)遥控板通过2.4G发送,飞控板通过2.4G接收。
(3)飞控板解析数据,进行校验、指令判断。
(4)添加失联处理:2.4G失联自动缓慢落地、尝试重连。
5)数据显示逻辑
(1)显示信道号。
(2)显示4个摇杆的幅度大小。

2.5.9FreeRTOS怎么划分任务、优先级?
1)飞控板任务划分:
(1)2ms周期任务(优先级4)
获取陀螺仪数据
计算欧拉角
摇杆位移控制
姿态pid控制
电机控制
(2)4ms周期(优先级3)
接收遥控数据
解析遥控数据
遥控指令处理
(3)50ms周期(优先级2)
LED灯控
2)遥控板任务划分
(1)4ms周期(优先级3)
读取摇杆数据
封装通信协议
发送数据给飞控
(2)20ms周期(优先级2)
微调按键数据
OLED显示

2.5.10PID参数怎么调试?
1)调整偏航或横滚
(1)内环P:
①确定极性:正确的话,缓慢往下掉。
②确定大小:找到平滑缓慢下掉的参数值,没有明显顿挫
(2)加入外环P:
①确定极性:给一个初始偏差角,稳住一会(让角速度为0),松手观察是回复还是加大偏差
正确的话,会恢复平衡角度
②确定大小:恢复很快,但是可能伴随低频震荡
(3)加入内环D:
①确定极性:恢复平衡位置后,明显震荡变小或消失
给一个初始角速度,如果偏差越来越大,且速度越来越快,就是极性错的
②确定大小:恢复平衡位置后,无震荡
(4)做完3之后,发现回复过程变慢,甚至出现顿挫
===》只靠外环P回复力不够(内环的P被内环的D抑制了)
===》增大外环P ====》 回复平衡变快,且无震荡
2)调整横滚或偏航(做完1,调另一个姿态)
(1)绝对值大小跟1保持一致
(2)内外环的P、内环的D重新确认极性
按照1的顺序做
3)调整偏航
(1)内环P
①确定极性:给一个水平旋转的角速度,角速度会变0,极性正确
②确定大小:快速恢复到角速度0(注意:不是角度)
(2)外环P
①确定极性:给一个水平的旋转角度,静止一会(让角速度为0),松手会恢复角度则极性正确
②确定大小:恢复角度足够迅速(不影响俯仰和横滚的前提下)
4)确定位移控制系数的极性
试飞:摇杆控制

2.5.11任务间怎么传递数据的?
这里简单使用了全局变量。
主要是不存在竞态条件,一个变量同时只有一个任务会写入。

2.5.12项目开发周期多长?
大概6个月。

2.5.13代码量多少?
大概接近一万行,不包括启动文件、FreeRTOS移植文件。

2.5.14什么时间上线?
半年前。

2.5.15项目难点在哪?
1)MPU6050原始数据的处理、角度的计算。
(1)原始数据的处理
MPU6050原始数据需要经过移位转换、方向处理,再根据量程进行换算。
零偏校准功能。
采样频率与计算频率相同。
加速度进行卡尔曼滤波、角速度进行一阶低通滤波。
(2)角速的计算
通过四元数来解算欧拉角。
2)2.4G无线通信
(1)考虑收发的频率(项目中保持一致),保持通信的稳定、不丢数据。
(2)通信协议的定义、封装、解析。
(3)失联逻辑判断、处理。

2.5.16技术亮点在哪?
(1)使用FreeRTOS进行多任务的调度与管理。
(2)使用滤波平滑摇杆数据、传感器数据。
(3)自定义实现传感器的零偏校准功能。
(4)串级PID控制平衡,三个欧拉角对应计算结果对4个电机的作用。
(5)2.4G稳定通信、解锁指令、失联处理。
2.5.17商业价值在哪?
儿童玩具(外包项目)

2.5.18您在项目中扮演的角色以及您的具体工作内容是什么?
主要负责软件功能开发;
(1)参与产品需求分析、功能设计;
(2)与硬件部门沟通对接;
(3)负责单片机片内外设驱动、硬件外设驱动的编码、调试;
(4)负责业务逻辑实现编码、调试;
(5)负责FreeRTOS移植、功能裁剪、多任务调度、任务间同步及数据传输;
(6)负责软件相关问题的分析、定位、解决;
(7)负责软件开发相关设计、开发、测试等规范编写;
(8)负责产品的维护、升级;

2.5.19是否上市量产
小批量:1000台左右
零售价:300元左右