(3)PX4架构等关键概念
接上篇(2)PX4开发指南飞行模式/操控
2.2架构概述
PX4由主要的两层组成:PX4飞行栈,自动驾驶软件和PX4中间件,这是一种通用的机器人中间件,可以支持任何类型的自主机器人。
所有的飞机类型,实际上所有机器人系统包括船,都共享一个代码库。整个系统的设计是反应型的,这一意味着:
(1)所有的功能被分为可以交换的组件。
(2)通过异步消息传递通信。
(3)系统可以处理各种任务载荷。
除了考虑这些的运行外,它的模块化最大限度提高可重用性。
上层软件结构
下面的每个板块是一个独立的模块,它在代码,依赖关系和甚至运行是独立的。每个箭头都是通过uORB发布/订阅实现连接。
tip:PX4架构可以非常快速、方便地交换这些单一的模块,甚至在运行时。
控制器/混频器由特定的飞机类型指定(比如直升机,垂直升降机或飞机),但是在更高层的任务管理模块,比如指令和导航器是在平台间是共享的。
与地面站的通信架构
飞机与地面站的交互通过“业务逻辑”应用,包括指令(通用指令和控制,比如arming),导航器(接收任务,把任务转给下一层导航原语)和mavlik应用程序接收MAVLink数据包并转化为板上的uORB数据结构。架构采用这种分离明确地减少了MAVLink对系统的深度依赖。MAVLink应用程序也使用大量的传感器数据和状态估计,并传送给地面控制站。
2.3 PX4飞行栈
PX4飞行栈是自主无人的一个引导集合,导航和控制算法。包括固定翼、多旋翼和垂直起降飞机,以及姿态和位置估测器。
估算和控制架构
下图表示了一个典型模块的简单实现。根据飞机,其中一些可以组合成一个简单的应用程序(特定想要一个特定飞机模型预测控制器)。
2.4 PX4中间件
PX4中间件组成嵌入式传感器和发布/订阅基本中间件的重要的设备驱动,这些驱动连接传感器和应用程序,运行飞行控制。
使用发布/订阅方案的意思是:
(1)系统是反应型的:担忧新数据可用时,它会不断更新。
(2)它是完全并行运行的。
(3)系统部件可以使用来自任何安全线程方式的数据
2.5 混合驱动器
PX4的架构保证了不同机身布局,核心控制器不需要进行特定情况的处理。
混合器意味着采取强制命令(比如右转),把它们转化为控制电机或者伺服驱动器的指令。
对于带有一个伺服/副翼,这意味着它们一个高,另一个就低。同样,对于直升机:俯仰向前需要改变所有电机的转速。
混合器逻辑从实际姿态控制器中分离开来,极大提高了可重用性。
关键概念
PX4使用控制组(输入)和输出组。概念上非常简单:一个控制组是对于核心飞行控制说的,比如姿态,或者对于有效载荷来说,是万向节。一个输出组是一个物理总线,比如前8个伺服器PWM输出。每个组有8个标准化(-1…+1)命令端口,通过混合器可以映射和缩放。一个混合器定义了8个控制信号如何连接到8个输出端。
对于一个简单飞机控制0(roll)直接连接到输出0(elevator)。对于一个直升机,情况会有所不同:控制0(roll)连接到所有四个电机和油门。
映射
因为这里多种控制组(比如飞行控制、有效载荷等)和多种输出组(前8个PWM输出、UAVCAN等)。一个控制组可以给多个输出组发送指令。
PX4混合器的定义
在目录ROMFS/px4fmu_common/mixersimplement mixers的文件用来预定义机身类型。
它们可以用作为定制或者一般测试目的的基础。
语法
混频器的定义是一个文本文件:每行以一个简单的大写字母开头,后面跟着一个重要的冒号。其他的所有行都被忽略,意味着解释性文本可以*地与定义混合。
每个文件可能定义不止一个混频器。混频器给执行器的分配就是指定读取混频器定义的设备
一个混频器以下面这样一行的形式开始
<tag>: <mixer arguments>
标签选择了混频器的类型,‘M’表示一个简单的加法混频器,‘R’表示多旋翼混频器等。
空混频器
一个空混频器不会使用控制信号,也不会产生简单的驱动输出,它的值一直是0。在混频器的集合里,典型的空混频器作为一个占位符来取得特定驱动器的输出模式。
空混频器的定义形式是
Z:
简单的混频器
一个简单的混频器把0或者跟多输入结合成一个简单的驱动器输出。输入被缩放,混频函数在使用输出因子前累加结果。
一个简单的混频器可以这样开始定义
M: <control count>
O: <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
比如打开quad_v.main.mix的内容如下
如果<control count>
是
0
,累加的和肯定是
0
,混合器会输出一个固定的值,这个值是
<offset>,在
<lower limit>
和<upper limit>
的约束的范围。
第二行定义输出缩放因子和缩放参数,和上面讨论的一样。虽然计算进行浮点运算,但是存储在定义文件里以10000的因子进行了缩放,比如-0.5编码成-5000。
定义在<control count>入口继续描述控制输入和他们的缩放,形式为
S: <group> <index> <-ve scale> <+ve scale> <offset> <lower limit> <upper limit>
其中<group>
的值确定控制组会读取哪个缩放因子,
<index>
值是在组内进行偏置。这些值指定读取混合器定义的设备。
当使用混频器飞行器,混频器组的0是飞行器姿态控制组,索引值0到3通常分别是滚转、俯仰和油门。
剩下其他地方使用参数在线配置控制缩放因子如上文所述。虽然进行的是浮点运算,但是存储在定义文件的值是通过一个10000的因子进行缩放的,比如-0.5编码成-5000.
多旋翼混频器
多旋翼混频器把4个控制输入(滚转、俯仰、偏航和油门)结合成一组用于用于控制电机速度的执行器输出。
该混频器的定义形式是简单的一行:
R: <geometry> <roll scale> <pitch scale> <yaw scale> <deadband>
支持的几何形状包括:
- 4x - quadrotor in X configuration
- 4+ - quadrotor in + configuration
- 6x - hexcopter in X configuration
- 6+ - hexcopter in + configuration
- 8x - octocopter in X configuration
- 8+ - octocopter in + configuration
滚转、俯仰和偏航缩放数值是由滚转、俯仰和偏航相对于控制油门的控制来决定的。虽然进行浮点运算,但是存储在定义文件的值是通过一个10000的因子进行缩放的,比如-0.5编码成-5000.
滚转、俯仰和偏航输入希望在-1.0到1.0的范围,但是油门输入范围是0到1,每个执行器输出是-1.0到1.0
在一个执行器饱和的情况下,所有的执行器的值被重新缩放,这样使得饱和执行器被限制在1.0。
PWM状态机
PWM状态机作为控制解锁前和解锁输入的函数。提供一个确认“解锁”和确认解锁信号时油门斜坡上升之间的延迟。
概述
输入
1)解锁:确认允许危险动作,如螺旋桨旋转。
2)预解锁:确认允许开始危险动作如移动控制表面
该输入会覆盖当前状态;
确认预解锁立即强制ON行为,不管预解锁对当前状态**的认定的反应。
状态
1)INIT和OFF
pwm输出设置为锁定值。
2)RAMP
pwm输出从锁定值斜坡变化到最小值
3)ON
pwm输出设置根据控制值。
状态装换图
对于这个状态有点难理解,需要结合图像和说明文字理解。