Pixhawk的飞行模式,控制模式解读(原生固件)

来源:互联网 发布:node express -e 编辑:程序博客网 时间:2024/05/17 12:07

版权声明

  • 博  主:thunder_fan
  • 声  明:喝水不忘挖井人,转载请注明出处。
  • 联系方式:cllshxz#163 DOT com(请自行改为正确格式)

说 明

  • 代码工具:eclipse
  • 固 件:下载地址
  • 代码位置:Firmware/src/modules/commander(主应用的代码都在src/modules文件下)

代码讲解

框架介绍

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

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文件里面实现。
为了大家更好的理解代码,给出典型的状态转化图:
mark

具体代码介绍

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

mark

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

主循环

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

mark

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

mark

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

mark

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

mark

起飞前检查

mark

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

mark

创建低优先级线程

mark

完成一系列的主题更新。

mark

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

mark

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

mark

根据遥控输入设置主状态

mark

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

mark

模式切换的一些代码。

mark

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

mark

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

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

总 结

mark

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

mark

补充

作为初学者,水平有限,如有错误欢迎指出。

0 0