在本节我们来学习Commander中的3种状态切换过程,其中包括无人机的解锁状态处理、主状态处理和导航状态处理。这3种状态是无人机中非常重要的状态,直接影响飞机的控制导航逻辑和控制逻辑,进而影响飞机的实际飞行效果。下面我们就来分别对这3种飞行状态的处理过程进行分析:
一、arming_state解锁/锁定状态
解锁状态在PX4飞控程序中的定义名称为Arming state表示飞机当前的解锁和锁定状态,它被定义成vehicle_status.msg这个uORB中的uint8 arming_state属性,实际上arming_state并不仅仅用于表示“锁定”和“解锁”这两个状态,它一共有6个状态也定义在vehicle_status.msg这个UORB当中,其内容如下:
实际上,Arming state是为了表示无人机在整个飞行过程中可能出现的基本状态,其中只有Arming state为ARMING_STATE_ARMED时,才表示飞控解锁,也就是电机解锁。用于表示飞控实际对电机“锁定”和“解锁”状态的变量并非Arming state,而是actuator_armed.msg这个uORB的bool armed属性。注意这个变量是一个布尔型变量,它只表示无人机系统“解锁”和“锁定”这两个状态。
上述的6个状态切换图如下:
在PX4程序中使用了一个二位数组来表示此状态机的切换关系,如下:
在这个表示Arming state的二位数组中,每一行表示无人机需要切换的新的状态,每一列表示当前状态。从当前状态切换到新状态时的限制条件就是arming_transitions这个二位数组的值,如果为true表示允许切换,如果为false表示不允许切换。
二、main_state主状态
主状态就是我们之前所介绍的无人机的飞行模式。切换主状态就是切换飞行模式,使无人机进入不同的飞行控制逻辑当中。当然,飞控的主状态不可以任意切换,切换到不同的主状态需要不同的前提条件。每一种状态的条件前提我们可以按下表进行判断:
用于表示主状态的变量被定义为commander_state.msg这个uORB中的uint8 main_state属性。其实际值与所表示的状态对应关系如下:
在主状态切换函数main_state_transition()处理了主状态的切换逻辑,具体代码如下:
以上代码中所处理的逻辑与上述表格中的内容一致,不再赘述。
三、导航状态
导航状态被定义在vehicle_status.msg这个uORB的uint8 nav_state属性,其实际值与导航状态的对应关系如下:
与主状态切换不同,无人机会根据当前状态与不同的条件对导航状态进行降级评估,也就是说如果当前飞行模式的必要条件如果不满足,则会切入到一个较为安全的导航状态。在正常情况下,导航状态值会被保持与主状态一致。
但是,在实际飞行中,会遇到很多异常情况,飞控程序会根据预先对相关保护参数的设定值修改导航状态,例如,当数传信号丢失后的处理方法如下: