commander一点理解

Commmander应用主要负责控制飞行器的模式控制。 
下图解释了commander应用的整体架构: 

Command和subsystem_info是一个缓存值。 
这个commander应用有几个循序组成,并且每个循环作为一个独立的线程执行。 
1. command_handling_loop:在这个循环里,主要完成将mavlink应用中的mavlink命令转发给commander应用中。飞行器的状态是根据这个命令改变的。 
2. subsystem info loop:监听来自子系统的信息(比如传感器)。但是并不管信号的质量,这个跟新可能是现在,也可能不是,可能是正确的也可能是不正确的,使能非使能。 
3. monitoring loop(主循环)定期做以下的检查: 
  3.1传感器的质量(误差) 
  3.2解锁和锁的ppm输入信号(遥控输入) 
  3.3电池电量 
State machine handling 
所有的飞行模式的切换具体在commander/state_machine_helper.c文件里面实现。 
为了大家更好的理解代码,给出典型的状态转化图: 

具体代码介绍

主要的上层控制代码在src/modules/commander文件下的commander.cpp和state_machine_helper.cpp两个文件夹内。下面是具体流程:我们先进入到commander.cpp里。

这个函数主要是后台应用程序,根据传入的相应参数,进行相应的判断和操作,比如说校准传感器,具体校准程序在commander文件夹下的其他文件夹里。还有一些错误提示信息,开辟新线程。

主循环

下面是int commander_thread_main(int argc, char *argv[])函数,控制应用部分的主循环commander主应用代码都在这里面。下面开始介绍主循环,这个主循环有点类似于c代码里的main函数,在里面调用commander.cpp和state_machine_helper.cpp文件里的其他函数,完成从接收——>完成模式切换。首先设置参数:

然后进行初始化首先是led,buzzer,battery的初始化,这三个函数在commander_helper.cpp里

然后是一系列的初始化,由于太多就不一一列举了。 
紧接开始monitoring loop主要对应上面框图里monitoring loop完成一系列主题的订阅

接着初始化完成,标志位为true

起飞前检查

检查相应的变化,清除标志位

创建低优先级线程

完成一系列的主题更新。

更新子系统信息。对应框图中的subsystem info loop循环。

RC输入检查,从下图开始。

根据遥控输入设置主状态

对于set_main_state_rc函数我们可以跟进去看,在这里。

模式切换的一些代码。

在主循环中还频繁调用了state_machine_helper中的arming_state_transition,解锁状态改变函数。

还有main_state_transition,对应上面框图中的State machine handling部分。这是模式切换的具体实现代码。

还有一个函数是handle_command()这个函数主要对应上面框图中的command_handling_loop。这个函数出现主循环的处理命令处 

总 结

最后借鉴来自此博客的一张图,说明整个流程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章