如前所述commander的作用主要处理各种事件,调度控制系统的运行,事件包括遥控输入、用户指令、状态变更等。调度的作用主要设置控制系统运行的变量和模式,以使控制系统按照用户期望的模式运行,实现不同的控制功能。控制系统主要由navigator,pos_control,att_control构成。这里引用的是PX4略早期的一个版本,不同版本的PX4处理流程略有不同,整体框架大致上应该是一样的。
commander的处理在commander.cpp中的Commander::run()函数中实现
在进行一系列的初始化程序之后,进入一个while循环,这个while循环为commander的工作流程。按照一定频率运行,每一个循环依次检查各种事件和信息,进行处理。每一个循环的主要处理流程如下所示。其中右边文字备注了对应的处理以及相关的状态和标志位。
进行的顺序为
1 参数更新(param update),检查已有的参数更新,如有更新则进行相应的处理
2 检查电源按钮状态(power button check),如果检测到按下状态,则执行关闭系统(shutdown)
3 更新手动输入(manual input),主要是用户通过遥控器(Radio Controller)的输入
4 离线控制检查(offboard control check),离线控制指通过上位机发送到飞控板的控制指令
5 数据通道检测(telemetry status check),检查所有的数据链通道
6 飞行检查(flight check),主要检查传感器(加速度计、陀螺仪、气压计等)的状态,设置对应的标志位(flag)
7 系统供电检查(system power check),这里主要是飞控板的供电检查
8 安全检查,这里主要检查ekf的输出安全性,如果通过则把arming state切换到standby
9 更新位置信息(position update)
10 位置准确性检查(position accuracy check)
11 着陆检查(land detect check)
12 CPU载荷检查(cpuload check)
13 电池状态检查(battery status check)
14 子系统检查(subsystem check),子系统包括传感器等
15 电机状态(arming state)从init切换到standby,standy状态允许电机启动
16 任务结果处理(mission result handle)
17 地理栅栏更新与处理(geofence update & handle)
18 摇杆拨动处理(stick move handle)
19 任务飞行结束检查(mission flight termination check)
20 遥控输入处理(rc input check & handle)
21 数据链检查(datalink check)
22 电机故障检查(actuator failure detect)
23 起飞完成处理(takeoff complete handle),起飞完成后切换到auto mission或auto loiter状态
24 遥控失联处理(rc signal lost handle),飞行状态切换到loiter
25 命令检查和处理(command check&handle),处理用户指令
26 故障检查(failure check)
27 返航位置检查和更新(home position check & update)
28 设置导航模式(set nav_state)
29 设置控制模式(set control_state)
30 播放音调(play tunes),根据状态、发生的事件播放对应的音调
31 闪烁指示灯(blink LEDs),根据飞行器状态按对应模式闪烁指示灯
其中主要的处理任务用黄色的方框进行表示。