1. 四旋翼无人机的组成
——通信链路
——客户端地面站
——PPM编码器:PPM编码器接RC接口,把接收机输出的多个通道PWM信号编码成PPM复合信号。
——GPS/罗盘
——飞控
——动力系统
飞控系统主要由微控制器、传感器、存储模块、驱动模块、外部接口构成。
2. 四旋翼飞行原理
对四个电机转速的控制可以产生飞机升力及姿态变化的力矩。
四旋翼在三维空间具有六个自由度,即分别沿三个坐标轴作平移和旋转运动,但是只有四个电机作为输入。更改其中一个电机的转速将会导致两个姿态的变化,因此四旋翼是一个欠驱动系统。
四旋翼的基本运动可归纳为以下几种基本的运动模式。
2.1 垂直运动: 垂直方向主要有垂直升、垂直降、悬停三个状态。
2.2 俯仰运动:两个桨速度增加,两个桨速度减小,最终导致Y轴上产生扭矩。
2.3 横滚运动:两个桨速度增加,两个桨速度减小,最终导致X轴上产生扭矩。
2.4 偏航运动:对角桨速度增加、另一对对角桨速度减小,最终导致在飞行轴方向产生扭矩。
3. 四旋翼软件开发平台
飞行控制栈:主要完成飞控各项功能的实现。
中间件(UORB):完成系统各个部分之间的通信工作。
实时操作系统(nuttx):操作系统作为系统运行的基础软件平台,提供任务调度和文件操作功能,与底层驱动层相连接,降低系统的耦合度,提高系统平台可移植性。底层驱动是直接和硬件打交道的,主要完成具体硬件平台的控制功能。
PX4飞控系统是由一系列节点组织的,这些节点在一个广播通讯网络中使用像“姿态” 或“位置”这样的语义通道来交流系统目前的状态。
4. 多旋翼飞行器进一步思考
——多旋翼飞行器在空中飞行的时候,是通过调自己的“姿态”来产生某个方向的推力的。
——为了能够调整自己的姿态,就必须有办法测量自己的姿态。姿态用三个角度表示,因此也是三维的。
——与三维位置、三维角度相对应的是三维速度、三维加速度和三维角速度,十五个需要测量的状态。
——三轴数字罗盘用于确认航向,气压计用于测量高度,GPS用来测量飞机的绝对位置,陀螺仪用于测量旋转速度。
5. 飞控软件系统
——每一个框图都是一个单独的模块,以代码的形式自我包含、依赖并运行。
——每一个箭头都是一种通过UORB进行发布/订阅调用的连接。
——控制器/混控都是针对一种特殊的机型而言,需要适配机型。但是顶层任务管理模块如导航等是可以在不同平台共享的。
6. 地面站通信架构
——commander制导:用于接收地面站的一般命令,例如解锁
——navigator导航:接受任务并将其转为底层导航的原始数据。
——mavlink应用:用于接受MAVLink数据包并将其转换为板载uORB数据结构。
7. NUTTX实时操作系统
NuttX 具有一系列优秀的品质,其具有标准兼容的特性,进行核心任务管理,采用模块化设计,完全可抢占,天然可扩展,高度可配置。同时NuttX 容易扩展到新的处理器架构、SoC 架构或板级架构,可以构建为开放的、平面的嵌入式RTOS ,或单独构建为系统调用接口的微内核,NuttX 支持类POSIX/ANSI 的任务控制、命名消息队列、计数信号量、时钟/定时器、信号、pthread 、环境变量、文件系统,支持ROMFS文件系统,确保能够实时的、确定性的支持优先级继承。并且NuttX 是在BSD 许可证下发布的,适合于进行二次开发。
NuttX 是一个flat addresss 的操作系统,也就是说它不提供像Linux 那样的进程(processes) 。NuttX 只支持简单的运行在同一地址空间的线程。但是,它的程序模型使得task (任务)与pthread (线程) 间有一定区别。
——tasks:有一定独立性的线程
——pthreads:共享某些资源的线程。
PX4 有一个虚拟的文件系统,被保存到2 到3 个不同的器件中:
1 ) 只读文件系统(Read Only Memory File System, ROMFS) ,作用为保存启动脚本,这个文件系统保存在MCU(STM32) 的内部Flash 中( 编译时直接编译到程序中了) 。这个文件被挂载在/etc 下。
2 ) 可写microSD 卡文件系统( 通常为FAT32 格式) 。作用是存储log 文件,被挂载在/fs/microsd 下。
3 ) 可写FRAM 文件系统( 被映射到FRAM 中的单个文件) , 挂载在/fs/mtd params 和/fs/mtd waypoints( 这个都在Flash 中) 下。用来存储参数(parameters)和航点(waypoints) 。
8. PX4中间件
PX4 中间件运行于操作系统之上,主要由内置传感器的驱动和一个基于发布-订阅( publish-subscribe ) 的中间件uORB ( Micro Object Request Broker, 微对象请求代理器) 组成,其中uORB 用于将这些传感器与飞行控制运行的应用程序进行通讯连接。
使用发布-订阅计划意味着:
� 系统是响应式的,即当有新的有效数据时系统能够立即更新
� 系统是完全并行运行的
� 系统组件能够在线程安全的方式下从任何地方使用数据
uORB 是Pixhwak 系统中非常重要的且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS 、PPM 信号等都要从芯片获取后通过uORB 进行传输到各个模块进行计算处理,是一种用于进程间进行异步发布和订阅的消息机制API。
———UORB架构概述:
uORB 实际是一套跨进程的IPC(Inter-Process Communication, 进程间通信) 通讯模块,就是多个进程打开同一个设备文件,进程间通过此文件节点进行数据交互和共享。在Pixhawk 中,所有的功能被独立以进程模块为单位行实现并工作。而进程间的数据交互就变得尤为重要,必须要能够符合实时有序的特点。
Pixhawk 使用了NuttX 实时ARM 系统,而uORB 对于NuttX 而言,它仅仅是一个普通的文件设备对象,这个设备支持Open 、Close 、Read 、Write 、Ioctl 以及Poll 机制。通过这些接口的实现,uORB 提供了一套“点对多”的跨进程广播通讯机制,“点”指的是通讯消息的“源”,“多”指的是一个源可以有多个用户来接收、处理。而“源”与“用户”的关系在于,“源”不需要去考虑用户是否可以收到某条被广播的消息或什么时候收到这条消息。它只需要单纯的把要广播的数据推送到uORB 的消息“总线”上。对于用户而言,“源”推送了多少次的消息也不重要,重要的是取回最新的这条消息。
———UORB的系统实现:
uORB 的实现位于固件源码的Firmware/src/modules/uORB/uORB 目录下。它通过重载CDev 基类来组织一个uORB 的设备实例。并且完成Read/Write 等功能的重载。
uORB 的入口点是uorb main 函数,在这里它检查uORB 的启动参数来完成对应的功能,uORB 支持start/test/status 这3 条启动参数,在Pixhawk 的rcS 启动脚本中,使用start 参数来进行初始化,其他2 个参数分别用来进行uORB 功能的自检和列出uORB 的当前状态。
在rcS 中使用start 参数启动uORB 后,uORB 会创建并初始化它的设备实例,其中的实现大部分都在CDev 基类完成。这个过程类似于Linux 设备驱动中的Probe 函数,或者Windows 内核的DriverEntry ,通过init 初始化调用完成设备的创建,节点注册以及派遣例程的设置等。
———UORB的使用:
进程( process )/应用程序(application) 间通信( 如将传感器信息从传感器app 传送到姿态滤波app ) 是PX4 飞控程序结构的核心部分。进程( 在此处被称作节点(node))通过命名的总线(buses ) 交换的消息称之为主题(topic) 。在PX4 软件系统中,一个主题只包含一种信息类型(即数据结构),比如飞行器姿态(vehicle attitude) 这个主题将一个包含姿态结构体( 横滚、俯仰、偏航) 的信息传送出去。节点可以在主题上发布(publish) 一个信息( 即发送数据) ,也可以向一个主题订阅(subscribe ) 信息( 即接收数据) 。节点并不知道它们在跟谁通信。一个主题可以面向多个发布者(publishers) 和多个订阅者(subscribers) 。这种方式可以避免死锁问题,在机器人中很常见。为达到有效率,在一条总线中,永远只有一条信息被传送,没有保持队列之说,这也就是说新来的信息会覆盖之前的信息,不存在有一串信息排队的情况。应用层中操作基础飞行的应用之间都是隔离的,这样提供了一种安保模式,以确保基础操作独立的高级别系统状态的稳定性。在PX4 中,飞控所有的功能被独立以进程模块为单位进行实现并工作。因此进程间的数据交互就显得尤为重要,必须要能够符合实时、有序的特点。在PX4 中是使用uORB 来完成这项任务的:
9. PX4飞行控制栈
飞行控制栈是各种自主无人机的导航与制导、控制算法的集合,包括固定翼、多旋翼以及垂直起降机型的控制器以及飞行器姿态和位置的估计算法。遵循BSD 协议,可实现多旋翼和固定翼完全自主的航路点飞行。采用了一套通用的基础代码和通用的飞行管理代码,提供了一种灵活的、结构化的方法
飞行控制栈可分为如下四部分:
1. 决策导航部分:根据飞行器自身安全状态和接收到的命令,决定工作于什么模式,下一步该怎么做。
2. 位置姿态估计部分:根据传感器得到的自身位置和姿态信息,此部分主要涉及相关算法。
3. 位置姿态控制部分:根据期望位置和姿态设计控制结构,尽可能快、稳的达到期望位置和姿态。
4. 控制器输出部分:混控输出和执行器,PWM限幅。
要对一架四旋翼进行控制,首先要知道四旋翼当前的姿态与位置,PX4用到了姿态解算与位置估计算法,在获得了四旋翼当前的姿态与位置之后就可以利用姿态控制算法与位置控制算法对飞行器进行精确控制了。其中还包括了混控输出与导航控制,由此构成了四旋翼无人机的基本控制思路。