Kerloud飞控系列教程(15):PX4飞控开发基础之Navigator导航模块

PX4飞控开发基础:Navigator导航模块

模块介绍

navigator模块是 PX4 自动驾驶仪中的一个module,它处理包括任务、起飞、返航(RTL)以及地理围栏检查等自主飞行模式。它通过不同的类来实现这些功能,这些类从一个共同的基类继承。此外,它负责发布位置参考点,这些位置参考点随后被位置控制器使用。代码还包括了加载地理围栏、处理测试用的假交通数据和响应与导航相关的命令的功能。navigator模块是飞控人机交互的关键部分。

navigator_main函数结构:

https://github.com/cloudkernel-tech/Firmware/blob/master_kerloud_v1.11.3/src/modules/navigator/navigator_main.cpp

  • Constructor & Destructor:初始化与销毁实例,设置导航模式,订阅必要数据。

  • params_update():参数更新。

  • run():主循环,处理导航逻辑,包括地理围栏检查和执行不同的飞行模式。

  • task_spawn()与instantiate():创建和管理导航任务实例。

  • print_status():输出导航状态。

  • publish_position_setpoint_triplet():发布当前位置设定点。

  • 获取导航参数的函数:检索当前导航设置。

  • reset_triplets()和reset_position_setpoint():重置导航设定点。

其中,代码有创意地将各种飞行模式设计成指针,然后根据任务模式启动相应的子模块,

(line 91)

/* Create a list of our possible navigation types */

_navigation_mode_array[0] = &_mission;

_navigation_mode_array[1] = &_loiter;

_navigation_mode_array[2] = &_rtl;

_navigation_mode_array[3] = &_engineFailure;

_navigation_mode_array[4] = &_gpsFailure;

_navigation_mode_array[5] = &_takeoff;

_navigation_mode_array[6] = &_land;

_navigation_mode_array[7] = &_precland;

_navigation_mode_array[8] = &_follow_target;

Mission航路点飞行函数结构

对于其中的Mission 子模块,函数结构解释如下:

https://github.com/cloudkernel-tech/Firmware/blob/master_kerloud_v1.11.3/src/modules/navigator/mission.cpp

  • Mission::Mission(Navigator *navigator): 构造函数,初始化任务模块,不接受任何输入并且没有输出。

  • Mission::on_inactive(): 当任务处于非活动状态时调用,负责检查任务更新和重置任务状态,没有输入和输出。

  • Mission::on_inactivation(): 当任务从活动状态转为非活动状态时调用,例如禁用相机触发,没有输入和输出。

  • Mission::on_activation(): 当任务被激活时调用,设置任务项和触发条件,没有输入和输出。

  • Mission::on_active(): 任务处于活动状态时持续调用,负责检查任务完成情况和更新任务进度,没有输入和输出。

  • Mission::set_current_mission_index(uint16_t index): 设置当前任务索引,输入是一个整数索引,输出是设置是否成功的布尔值。

每个函数都是根据飞行状态和任务状态来执行相应的操作,以确保任务按照预定计划安全执行。

回到教程目录:https://discourse.cloudkernel.cn/t/topic/116/4