PX4开发基本概念解读

进行PX4开发,必先了解PX4体系结构及相关概念。下面及简要介绍PX4开发的相关知识。

PX4体系结构

PX4由两个层次组成:一是飞行控制栈(flight stack),即自驾仪的软件解决方案,二是中间件,一种可以支持任意类型自主机器人的通用机器人中间件。

所有的无人机机型,事实上所有的包括船舶在内的机器人系统,都具有同一代码库。整个系统设计是反应式(reactive)的,这意味着:

  • 所有的功能被划分为可替换部件
  • 通过异步消息传递进行通信
  • 该系统可以应对不同的工作负载

除了这些运行时考虑之外,其模块化最大限度地提高了系统的可重用性。

PX4体系结构

图1 PX4体系结构

飞行控制栈

飞行控制栈是自主无人机的引导、导航和控制算法的集合。它包括用于固定翼,多旋翼和垂直起降机身的控制器以及用于姿态和位置的估计器。

图2显示了飞行控制栈的构建块的预览。 它包含从传感器,RC输入和自主飞行控制(导航器)到电机或伺服控制(执行器)的完整管道。

PX4飞行控制栈结构图

图2 PX4飞行控制栈结构图

估计器采用一个或多个传感器输入,组合它们,并计算无人机状态(例如来自IMU传感器数据的姿态)。

控制器是将设定值和测量或估计状态(过程变量)作为输入的组件。 其目标是调整过程变量的值,使其与设定值匹配。 输出是最终达到该设定点的校正。 例如,位置控制器将位置设定点作为输入,过程变量是当前估计的位置,输出是将车辆移向期望位置的姿态和推力设定点。

混合器接受强制命令(例如向右转)并将它们转换为单独的电机命令,同时确保不超过某些限制。 该平移特定于无人机类型并且取决于各种因素,例如关于重心的马达布置或无人机的转动惯量。

中间件

中间件主要包括嵌入式传感器的设备驱动程序,与外部世界的通信(协同计算机,地面控制站等)和uORB发布 - 订阅消息总线。

此外,中间件包括一个模拟层,允许PX4飞行代码在桌面操作系统上运行,并在模拟的“世界”中控制计算机建模的无人机。

更新速率

由于模块等待消息更新,因此驱动程序通常会定义模块更新的速度。 大多数IMU驱动器以1kHz采样数据,将其集成并以250Hz发布。 系统的其他部分,例如导航器,不需要如此高的更新速率,因此运行速度相当慢。

可以通过运行uorb top在系统上实时检查消息更新率。

运行时环境

PX4可在各种提供POSIX-API的操作系统上运行(例如Linux,macOS,NuttX或QuRT)。 它还应该具有某种形式的实时调度(例如FIFO)。

模块间通信(使用uORB)基于共享内存。 整个PX4中间件在单个地址空间中运行,即在所有模块之间共享存储器。

有两种不同的方式可以执行模块:

  • 任务:模块在自己的任务中运行,具有自己的堆栈和进程优先级(这是更常见的方式)。

  • 工作队列:模块在共享任务上运行,这意味着它不拥有堆栈。 多个任务在同一堆栈上运行,每个工作队列具有一个优先级。

    通过指定将来的固定时间来安排任务。 优点是它使用较少的RAM,但不允许任务在消息上休眠或轮询。

    工作队列用于周期性任务,例如传感器驱动器或陆地探测器。

操作系统相关信息

NuttX

NuttX是在飞行控制板上运行PX4的主要RTOS。 它是开源(BSD许可证),重量轻,高效且非常稳定。

模块作为任务执行:它们有自己的文件描述符列表,但它们共享一个地址空间。 任务仍然可以启动共享文件描述符列表的一个或多个线程。

每个任务/线程都有一个固定大小的堆栈,并且有一个周期性任务,它检查所有堆栈是否有足够的可用空间(基于堆栈着色)。

Linux / MacOS

在Linux或macOS上,PX4在单个进程中运行,并且模块在它们自己的线程中运行(NuttX上的任务和线程之间没有区别)。

PX4飞行模式

飞行模式定义了系统在任何给定时间的状态。用户可以使用远程遥控器或者QGroundControl地面站来进行飞行模式切换。

PX4飞行模式控制流程图

图3 PX4飞行模式控制流程图

Dronecode平台软硬件架构

Dronecode是开源的无人机平台,其软硬件体系结构如图4所示。图4左侧显示了一种可能的硬件配置,其中飞行控制器(浅蓝色)通过RTPS连接到感知计算机(深蓝色)。 感知计算机使用相机传感器阵列提供视觉控制和物体避免,并且具有单独的有效载荷相机。

图的右侧显示了端到端软件堆栈。 堆栈“近似”水平对齐图表的硬件部分,并进行颜色编码,以显示飞行控制器上运行的软件以及配套计算机上的软件。

Dronecode平台软硬件架构

图4 Dronecode平台软硬件架构

PX4位姿控制

多旋翼位置控制

PX4多旋翼位置控制

图5 PX4多旋翼位置控制

混合和执行器

PX4架构保证了核心控制器中不需要针对机身布局做特别处理。

混控指的是把输入指令(例如:遥控器打右转)分配到电机以及舵机的执行器(如电调或舵机PWM)指令。对于固定翼的副翼控制而言,每个副翼由一个舵机控制,那么混控的意义就是控制其中一个副翼抬起而另一个副翼落下。同样的,对多旋翼而言,俯仰操作需要改变所有电机的转速。

将混控逻辑从实际姿态控制器中分离出来可以大大提高复用性。

控制管线

一个特定的控制器(如姿态控制器)发送特定的归一化(-1..+1)的命令到给混合(mixing),然后混合后输出独立的PWM到执行器(电调,舵机等).在经过输出驱动如(串口,UAVCAN,PWM)等将归一化的值再转回特性的值(如输出1300的PWM等)。

PX4控制管线

图6 PX4控制管线

控制组

PX4 有输入组和输出组的概念,顾名思义:控制输入组(如: attitude),就是用于核心的飞行姿态控制,(如: gimbal )就是用于挂载控制. 一个输出组就是一个物理总线,如前8个PWM组成的总线用于舵机控制,组内带8个归一化(-1..+1)值,一个混合就是用于输入和输出连接方式(如:对于四轴来说,输入组有俯仰,翻滚,偏航等,对于于向前打俯仰操作,就需要改变输出组中的4个电调的PWM输出值,前俩个降低转速,后两个增加转速,飞机就向前)。

对于简单的固定翼来说,输入0(roll),就直接连接到输出的0(副翼)。对于多旋翼来说就不同了,输入0(roll)需要连接到所有的4个电机。

参考链接

  1. PX4 Development Guide (STABLE - v1.8.2),by Dronecode.
  2. PX4开发指南, by Dronecode.