如何基于RT-Thread制作开源飞控StarryPilot?

 

背景描述

近年来无人机应用市场日趋火热,无人机开始被应用在多个领域之中,比如航拍,植保,运输,安防等。随着应用场景的增加,对于无人机的大脑一飞控,的性能和功能要求也变得越来越高。国内具有一大批优质的无人机企业,如DJI,零度,亿航,极飞等。可是这些企业的飞控系统并不开源,而开源飞控市场却基本被国外所垄断,比如APM, PX4, Autoquad等,国内目前还没有一款开源飞控可以与之抗衡,在国际上也没有令人熟知的“国产”开源飞控。 正是基于开发出一款世界知名的中国的开源飞控,我从2016年开始了StarryPilot这个项目。飞控的设计理念是一款轻量,功能强大的飞控,主要面向科研和无人机行业应用,使得无人机开发技术更加普及,也更容易将无人机技术应用到各个行业。

如何基于RT-Thread制作开源飞控StarryPilot?_第1张图片

无人机整机

如何基于RT-Thread制作开源飞控StarryPilot?_第2张图片

Pixhawk

如何基于RT-Thread制作开源飞控StarryPilot?_第3张图片

室外定高飞行

 如何基于RT-Thread制作开源飞控StarryPilot?_第4张图片

 

 

 

 

 

 

 

Gazebo HITL(硬件在环)仿真

如何基于RT-Thread制作开源飞控StarryPilot?_第5张图片

 Msh shell系统

开发环境

  • 主控:STM32F427 + STM32F100(从控制器)

  • 编译环境: Keil MDK5.23

  • RT-Thread版本: RTT-2.1.0

硬件设计

硬件采用国外开源的自驾仪Pixhawk(https://pixhawk.org/modules/pixhawk), 如下图所示。Pixhawk也是目前世界上应用最广,支持的飞控系统最多的开源飞控硬件。

如何基于RT-Thread制作开源飞控StarryPilot?_第6张图片

其主要性能参数如下:

  • 168MHz / 256 MIPS Cortex M4F

  • 14路 PWM/伺服 输出

  • 外扩总线接口 (I2C,CAN,UART)

  • 冗余电源输入

  • 外部安全开关

  • 多色LED指示灯

  • 外置microSD卡槽

传感器:

  • ST Micro L3GD20 16位陀螺仪

  • ST Micro LSM303D 16位加速度计/磁力计

  • Invensense MPU 6000 三轴加速度计/陀螺仪

  • MEAS MS5611 气压计

接口:

  • 5x UART, 2x CAN, I2C, SPI

  • DSM/DSM2/DSM-X 卫星兼容输入

  • PPWM, S-BUS

  • 3.3 和 6.6V ADC输入

  • microUSB

整个系统除了Pixhawk之外,还有一些外接的电子设备,如无刷电机,GPS,电调,数传,RC接收机,Lidar-Lite激光雷达等。整体的系统框架图如下图所示:

如何基于RT-Thread制作开源飞控StarryPilot?_第7张图片

软件设计

软件采用分层结构设计,如下图所示,从底层到上层分别是Driver层,RTOS(RTT + Fatfs),HAL硬件虚拟层,Framework层和应用层。

如何基于RT-Thread制作开源飞控StarryPilot?_第8张图片

一、Driver层

Driver层实现了Pixhawk板载的所有硬件设备的驱动,如传感器设备(陀螺仪,加速度计,磁力计,气压计等),总线设备(UART, I2C, SPI等),USB,电机驱动,SD卡驱动,GPS驱动,LED灯以及一些板载设备的驱动。 各个驱动以Device的形式向RTT进行注册,并且提供各自的init(), read(), write, ioctrl()函数供上层调用。这里仅以hmc5883磁力计的驱动举例说明驱动程序的一般设计步骤。

- 设备初始化函数

如下为hmc5883的初始化函数。首先对设备的功能函数进行函数指针赋值,这里定义了init(), read()和ioctrl()三个函数。然后向RTT注册名为hmc5883的驱动设备,上层可以通过查找设备名的方式来获取该驱动设备。接下来就是给hmc5883设置对应的总线设备。这里 hmc5883使用的是i2c通信,所以初始化中会为其查找对应的i2c设备。

如何基于RT-Thread制作开源飞控StarryPilot?_第9张图片

- init()函数

Init()函数主要做一些芯片的初始化的工作,包括寄存器配置等。

如何基于RT-Thread制作开源飞控StarryPilot?_第10张图片

- ioctrl()函数

Ioctrl()函数主要实现一些设备的配置功能,如设置测量磁场的范围,采样频率等

如何基于RT-Thread制作开源飞控StarryPilot?_第11张图片

二、RTOS层

RTOS采用RT-Thread嵌入式操作系统,它的功能强大,除了提供基本的线程调度,内存管理,同步等基本功能外,还提供了如msh的shell系统,device设备驱动系统,使得系统的整体架构更加清晰,功能也更加完善。

三、HAL层

HAL层主要是对底层驱动设备进行进一步封装,将具体的设备抽象为一个类别的设备。以串口设备为例,不同的硬件平台,串口的底层驱动会有差异,通过HAL层,将串口设备封装为统一的接口,这样当系统移植到不同平台的时候,上层代码不需要做任何改变,而只需要将对应底层驱动进行简单替换就行。这将大大降低系统移植的复杂程度。

四、Framework层

Framework层实现了飞控设备的主要功能,如姿态估计,位置估计,控制器,通信,日志管理等等。可以说,这一层是整个系统的核心,大部分的功能模块都在这一层来实现。

五、Application层

应用层是将飞控的各个大的功能进行分割,变成一个个小的功能。每个功能在系统中为一个单独的线程,每个线程负责执行自己的任务,并且跟其他线程通过IPC进行通信。Vehicle线程具有最高优先级,执行周期为1ms。其负责实现无人机飞行相关的所有功能,如状态估计和电机的控制。

启动流程

下面介绍一下系统的启动流程. 启动流程沿用RTT提供的原始结构。首先在rtthread_startup()函数中进行RTOS的一些初始化,然后进入到rt_application_init()中。 在这个函数中会建立一个init的初始线程,在这个线程中,会对飞控各个模块进行初始化的工作。在初始化完成之后,会根据Application层的定义,建立各个线程,并唤醒,最后将init线程自己给销毁掉,避免不必要的内存消耗。

演示视频

控制算法和飞行效果测试( ADRC vs PID ) 

因无法上传请关注 RT-Thread物联网操作系统公众号/联系我 获取

如何基于RT-Thread制作开源飞控StarryPilot?_第12张图片如何基于RT-Thread制作开源飞控StarryPilot?_第13张图片

项目特色

  • 使用RT-Thread嵌入式操作系统, Fatfs文件系统,完整的系统功能支持(如跨进程通信,文件管理,参数系统等)

  • 基于Pixhawk硬件平台开发,完美支持Pixhawk硬件

  • ADRC控制和PID(串级)控制

  • 支持Mavlink协议(QGC地面站)

  • 支持Gazebo硬件在环(HITL)仿真

  • Msh指令系统,提供丰富以及可扩展的系统指令

  • Log日志系统,方便抓取飞行日志信息,并提供相应的日志查看工具。

  • 基于最小二乘法的最优椭球拟合校准算法(可校准零偏误差,缩放误差,非正交误差),可用于磁力计和加速度计的校准

软件代码: https://github.com/JcZou/StarryPilot

 

Echo(邹佳池)参与RT-Thread应用作品征集赛作品原创。

 

 

你可能感兴趣的:(如何基于RT-Thread制作开源飞控StarryPilot?)