企鹅带你飞:Linux飞控全解

1 Linux飞控概览

1.1 为何选择Linux

从硬件上来说,目前常见的飞控厂家,使用的基于cortex-M4内核的单片机(如STM32F4处理器,168MHz主频,带有单精度浮点运算单元),硬件性能已经完全满足稳定飞行的要求了。而我们如果想添加其他对处理器性能要求更高的上层业务,如图像识别处理,仅仅是f4处理器就捉襟见肘了,那么就需要更高性能的高主频多核处理器。
从软件来说,飞控可以裸奔,也可以上操作系统。比如早期的apm、mwc就是无操作系统,Pixhawk使用nuttx,Autoquad使用CoOS等等。
Linux飞控的计算资源一般都是GHz的ARM多核处理器、512M的内存,带有硬件浮点和单指令多数据DSP。不同厂家的SoC产品中,还带有GPU或RPU,分别可以完成图像编码、硬件PWM I/O控制等功能。目前常见的两款Linux单板机价格不超过500人民币,就可以获得接近PC的桌面电脑体验。

图1 树莓派3B

图2 BeagleBone black (BBB)
树莓派3B与BBB对比
BeagleBone Black Raspberry Pi
价格($) 48 40
尺寸 86.36 mm×54.61mm 85 x 56 x 17 mm
处理器 1GHz TI Sitara AM3358 ARM Cortex A8 1.2GHz四核Broadcom BCM2387芯片,ARM Cortex-A53处理器
内存 512 MB DDR3L 1GB LPDDR2 RAM内存
显卡 SGX530 graphics engine 双核VideoCore IV显卡
存储 4GB 8-bit eMMC on-board flash storage microSD
视频连接 1 Micro-HDMI 1 HDMI, 1 DSI, 1 RCA
操作系统 Angstrom (Default), Ubuntu, Android, ArchLinux, Gentoo, Minix, RISC OS, others… Raspbian (Recommended), Ubuntu, Android, ArchLinux, FreeBSD, Fedora, RISC OS, Win10 IoT others…
功耗 210-460 mA @ 5V under varying conditions 230~350 mA @ 5V under varying conditions
GPIO 4×32 Pins 40 Pins
外围设备 1 USB Host, 1 Mini-USB Client, 1 10/100 Mbps Ethernet 4 USB Hosts, 1 Micro-USB Power, 1 10/100 Mbps Ethernet, RPi camera connector
其他 802.11 b/g/n Wireless LAN和蓝牙4.1连接
(以上数据通过官网收集,如有错误敬请指正)
可以看到,目前流行的这两款linux单板机从硬件配置及设计上来说,性能都是很吸引人的,若能应用于飞控系统,会是一个更优的选择。
当然,SoC芯片的复杂程度与MCU相比,肯定是量级上的区别。如果企业对飞行控制的可靠性要求很高,同时飞控软件从基础构架到飞行任务控制都可以自己实现,那么就没有必要使用Linux系统。但是对广大中小厂商或者独立开发者来说,使用Linux作为飞控系统的基础架构,为功能为先的系统设计带来的便利和成本优势却是非常明显的:
 SoC芯片的价格并不比MCU贵很多
 USB接口可以简化与特定任务所需的设备进行通信,无需开发新的硬件就开始功能测试
 RF通信使用ubnt或者Mikrotik,可以建立稳定的超视距高带宽通信
 可以在UAV上直接使用Linux既有的软件,比如Web服务器,rtsp视频流传输等
 无缝结合ROS机器人系统,更强扩展性

1.2 解决Linux实时性
有一个大多数人都会质疑的问题是,Linux作为非实时系统如何来运行飞控程序、满足飞机的操控要求呢?标准的Linux内核只能满足软中断的要求,为用户控件提供简单的Posix操作,在spinlock、irq上下文方面无法抢占,因此高优先级任务被唤醒到得以执行的时间并不能完全确定;同时,Linux kernel本身也无法处理优先级反转。
由此我们可以引入Realtime Preemption patch(简称RT-preempt)这个补丁,RT-Preempt Patch是在Linux社区kernel的基础上,通过Ingo Molnar、Thomas Gleixner等主要开发者的贡献,使得内核获得了硬实时的能力。RT-Preempt patch在业界已经获得了广泛的关注,它简洁的设计和向主线整合的目标使得它成为硬实时应用程序的有趣选择,而Linux飞控的系统实时问题也就有了解决办法。
拥有了RT-Preempt patch的Linux,可以运用于有实时需求的产品,国外厂商EMLID对基于实时补丁的Raspbian系统做了测试,通过cycylictest测试工作,默认创建了1个SCHED_FIFO策略的realtime线程,跑100W个循环:
sudo cyclictest -l1000000 -m -n -a0 -t1 -p99 -i400 -h400 -q
得到的非实时内核的Raspbian系统与打了RT补丁后的Raspbian系统延时情况如下:
PREEMPT #Min: 00013uS #Avg: 00023uS #Max: 01153uS
PREEMPT_RT #Min: 00011uS #Avg: 00023uS #Max: 00066uS

图3 系统延时直方图