PX4模块设计之二十二:FlightModeManager模块

2023-05-16

PX4模块设计之二十二:FlightModeManager模块

  • 1. FlightModeManager简介
  • 2. FlightModeManager启动
  • 3. FlightModeManager模块重要实现
    • 3.1 custom_command
    • 3.2 print_usage
    • 3.3 instantiate
    • 3.4 task_spawn
    • 3.4 init
    • 3.5 Run
    • 3.6 start_flight_task
  • 4. FlightModeManager飞行模式继承关系
  • 5. FlightModeManager模块工程结构
  • 6. holybro_kakutef7支持的飞行模式
  • 7. 参考资料

1. FlightModeManager简介

FlightModeManager主要就是控制飞行模式的。

### Description
This implements the setpoint generation for all modes. It takes the current mode state of the vehicle as input
and outputs setpoints for controllers.

flight_mode_manager <command> [arguments...]
 Commands:
   start

   stop

   status        print status info

2. FlightModeManager启动

参考PX4模块设计之十:PX4启动过程,执行rcS启动脚本:

  • Step1:ROMFS/px4fmu_common/init.d/rcS:407: . ${R}etc/init.d/rc.vehicle_setup
  • Step2:ROMFS/px4fmu_common/init.d/rc.vehicle_setup:39: . ${R}etc/init.d/rc.mc_apps
  • Step3:ROMFS/px4fmu_common/init.d/rc.mc_apps:78:flight_mode_manager start

3. FlightModeManager模块重要实现

3.1 custom_command

无额外具体实现子命令。

int FlightModeManager::custom_command(int argc, char *argv[])
{
	return print_usage("unknown command");
}

3.2 print_usage

略,详见命令打印简介。

3.3 instantiate

不使用任务实现,采用PX4 WorkQueue。

3.4 task_spawn

启动FlightModeManager模块任务(采用WorkQueue;不直接使用任务,创建线程)。

FlightModeManager::task_spawn
 ├──> FlightModeManager *instance = new FlightModeManager();
 ├──> <instance>
 │   ├──> _object.store(instance);
 │   ├──> _task_id = task_id_is_work_queue;
 │   └──> <instance->init()>
 │       └──>return PX4_OK;
 ├──> <else>
 │   └──> PX4_ERR("alloc failed");
 ├──> delete instance;
 ├──> _object.store(nullptr);
 ├──> _task_id = -1;
 └──> return PX4_ERROR;

3.4 init

初始化FlightModeManager,注册SubscriptionCallbackWorkItem _vehicle_local_position_sub钩子(call),最终触发px4::WorkItem,进而WorkQueue创建任务,调用FlightModeManager::Run。

FlightModeManager::init
 ├──> !_vehicle_local_position_sub.registerCallback()
 ├──> _vehicle_local_position_sub.set_interval_us(20_ms);
 └──> _vehicle_local_position_sub.set_interval_us(20_ms);

3.5 Run

每次WorkQueue调用,都会执行到该函数,对飞行姿态进行调整。

FlightModeManager::Run
 ├──> <should_exit()>
 │   ├──> _vehicle_local_position_sub.unregisterCallback()
 │   ├──> exit_and_cleanup()
 │   └──> return
 ├──> perf_begin(_loop_perf)
 ├──> <_parameter_update_sub.updated()>
 │   ├──> _parameter_update_sub.copy(&param_update)
 │   └──> updateParams()
 ├──> <_vehicle_local_position_sub.update(&vehicle_local_position)>
 │   ├──> const hrt_abstime time_stamp_now = vehicle_local_position.timestamp_sample
 │   ├──> const float dt = math::constrain(((time_stamp_now - _time_stamp_last_loop) / 1e6f), 0.0002f, 0.1f)
 │   ├──> _time_stamp_last_loop = time_stamp_now
 │   ├──> _home_position_sub.update()
 │   ├──> _vehicle_control_mode_sub.update()
 │   ├──> _vehicle_land_detected_sub.update()
 │   ├──> _vehicle_status_sub.update()
 │   ├──> start_flight_task()
 │   ├──> <_vehicle_command_sub.updated()>
 │   │   └──> handleCommand()
 │   └──> <isAnyTaskActive()>
 │       └──> generateTrajectorySetpoint(dt, vehicle_local_position)
 └──> perf_end(_loop_perf)

3.6 start_flight_task

FlightModeManager::start_flight_task
 ├──> <_vehicle_status_sub.get().vehicle_type == vehicle_status_s::VEHICLE_TYPE_FIXED_WING>
 │   ├──> switchTask(FlightTaskIndex::None) // Do not run any flight task for VTOLs in fixed-wing mode
 │   └──> return 
 │
 │    // 飞行模式切换
 ├──> <_vehicle_status_sub.get().in_transition_mode && _vehicle_control_mode_sub.get().flag_control_altitude_enabled>
 │   └──> [Only run transition flight task if altitude control is enabled (e.g. in Altitdue, Position, Auto flight mode)]
 ├──> <_vehicle_status_sub.get().nav_state == vehicle_status_s::NAVIGATION_STATE_AUTO_FOLLOW_TARGET>
 │   └──> [Auto-follow me]
 ├──> <_vehicle_status_sub.get().nav_state == vehicle_status_s::NAVIGATION_STATE_DESCEND>
 │   └──> [Emergency descend]
 ├──> <_vehicle_control_mode_sub.get().flag_control_auto_enabled>
 │   └──> [Auto related maneuvers]
 ├──> <_vehicle_status_sub.get().nav_state == vehicle_status_s::NAVIGATION_STATE_POSCTL || task_failure>
 │   └──> [manual position control]
 ├──> <_vehicle_status_sub.get().nav_state == vehicle_status_s::NAVIGATION_STATE_ALTCTL || task_failure>
 │   └──> [manual altitude control]
 ├──> <_vehicle_status_sub.get().nav_state == vehicle_status_s::NAVIGATION_STATE_ORBIT>
 │   └──> should_disable_task = false;
 │
 ├──> <task_failure>
 │   ├──> FlightTaskError error = switchTask(FlightTaskIndex::Failsafe);
 │   └──> <error != FlightTaskError::NoError>
 │       └──> switchTask(FlightTaskIndex::None)
 ├──> <should_disable_task && !task_failure>
 │   └──> switchTask(FlightTaskIndex::None)
 └──> _last_vehicle_nav_state = _vehicle_status_sub.get().nav_state

4. FlightModeManager飞行模式继承关系

根据类继承关系,分析如下:

ListNode
 └──> ModuleParams
     └──> FlightTask
         ├──> 【HK1】FlightTaskAuto
         ├──> FlightTaskAutoFollowTarget
         ├──> 【HK2】FlightTaskDescend
         ├──> 【HK3】FlightTaskFailsafe
         ├──> 【HK9】FlightTaskTransition
         └──> 【HK5】FlightTaskManualAltitude
             ├──> 【HK6】FlightTaskManualAltitudeSmoothVel
             |   ├──> 【HK4】FlightTaskManualAcceleration
             |   └──> FlightTaskOrbit
             └──> 【HK7】FlightTaskManualPosition
                 └──> 【HK8】FlightTaskManualPositionSmoothVel 

注:HKn:holybro_kakutef7使用,n表示第几种。

5. FlightModeManager模块工程结构

FlightModeManager模块工程结构如下图所示:

.
├── CMakeLists.txt
├── FlightModeManager.cpp
├── FlightModeManager.hpp
└── tasks
    ├── CMakeLists.txt
    ├── Auto                                            // 【HK1】
    │   ├── CMakeLists.txt
    │   ├── FlightTaskAuto.cpp
    │   └── FlightTaskAuto.hpp
    ├── AutoFollowTarget
    │   ├── CMakeLists.txt
    │   ├── FlightTaskAutoFollowTarget.cpp
    │   ├── FlightTaskAutoFollowTarget.hpp
    │   ├── follow_target_estimator
    │   └── follow_target_params.c
    ├── Descend                                         // 【HK2】
    │   ├── CMakeLists.txt
    │   ├── FlightTaskDescend.cpp
    │   └── FlightTaskDescend.hpp
    ├── Failsafe                                         // 【HK3】
    │   ├── CMakeLists.txt
    │   ├── FlightTaskFailsafe.cpp
    │   └── FlightTaskFailsafe.hpp
    ├── FlightTask
    │   ├── CMakeLists.txt
    │   ├── FlightTask.cpp
    │   └── FlightTask.hpp
    ├── ManualAcceleration                                // 【HK4】
    │   ├── CMakeLists.txt
    │   ├── FlightTaskManualAcceleration.cpp
    │   └── FlightTaskManualAcceleration.hpp
    ├── ManualAltitude                                    // 【HK5】
    │   ├── CMakeLists.txt
    │   ├── FlightTaskManualAltitude.cpp
    │   └── FlightTaskManualAltitude.hpp
    ├── ManualAltitudeSmoothVel                            // 【HK6】
    │   ├── CMakeLists.txt
    │   ├── FlightTaskManualAltitudeSmoothVel.cpp
    │   └── FlightTaskManualAltitudeSmoothVel.hpp
    ├── ManualPosition                                     // 【HK7】
    │   ├── CMakeLists.txt
    │   ├── FlightTaskManualPosition.cpp
    │   └── FlightTaskManualPosition.hpp 
    ├── ManualPositionSmoothVel                            // 【HK8】
    │   ├── CMakeLists.txt
    │   ├── FlightTaskManualPositionSmoothVel.cpp
    │   └── FlightTaskManualPositionSmoothVel.hpp
    ├── Orbit
    │   ├── CMakeLists.txt
    │   ├── FlightTaskOrbit.cpp
    │   └── FlightTaskOrbit.hpp
    └── Transition                                         // 【HK9】
        ├── CMakeLists.txt
        ├── FlightTaskTransition.cpp
        └── FlightTaskTransition.hpp

注:HKn:holybro_kakutef7使用,n表示第几种。

6. holybro_kakutef7支持的飞行模式

当前holybro_kakutef7代码中,使用如下飞行模式:
【HK1】Auto
【HK2】Descend
【HK3】Failsafe
【HK4】ManualAcceleration
【HK5】ManualAltitude
【HK6】ManualAltitudeSmoothVel
【HK7】ManualPosition
【HK8】ManualPositionSmoothVel
【HK9】Transition

7. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十七:ModuleBase模块
【3】PX4模块设计之十三:WorkQueue设计
【4】PX4模块设计之十:PX4启动过程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4模块设计之二十二:FlightModeManager模块 的相关文章

  • OpenCV如何获取视频当前的一帧图像

    xff08 OpenCV读取视频 OpenCV提取视频每一帧 每一帧图片合成新的AVI视频 xff09 CvCapture 是视频获取结构 被用来作为视频获取函数的一个参数 比如 CvCapture cap IplImage cvQuery
  • iptables raw表

    1 什么是raw表 xff1f 做什么用的 xff1f iptables有5个链 PREROUTING INPUT FORWARD OUTPUT POSTROUTING 4个表 filter nat mangle raw 4个表的优先级由高
  • NSMutableParagraphStyle & NSAttributedString 文本样式设置

    今天做工作时 xff0c 用到了 NSMutableParagraphStyle amp NSAttributedString xff0c 由于用C 语言 写 xff0c 一开始比较生疏 xff0c 有些语法和oc语言还是有点区别的 xff
  • 【计算机毕业设计】医院管理系统源码

    一 系统截图 xff08 需要演示视频可以私聊 xff09 一 xff0e 摘要 目前各医疗机构中 xff0c 绝大部分中小型医疗机构内部没有实现任何信息化管理 xff0c 医院临床信息 xff0c 业务流程的数据依然采取纸质记录 xff0
  • 【计算机毕业设计】88.人事工资管理系统源码

    一 系统截图 xff08 需要演示视频可以私聊 xff09 摘 要 本论文主要论述了如何使用 JAVA 语言开发一个 人事管理系统 xff0c 本系统将严格按照软件开发流程进行各个阶段的工作 xff0c 采用 B S 架构 xff0c 面向
  • 【计算机毕业设计】012基于springboot的社区团购系统设计

    一 系统截图 xff08 需要演示视频可以私聊 xff09 摘 要 本课题是根据用户的需要以及网络的优势建立的一个社区团购系统 xff0c 来满足用户 团购 的需求 本社区团购系统应用 Java 技术 xff0c MY SQL数据库存储数据
  • 四轴飞控DIY调试起飞简明步骤

    四轴飞控DIY调试起飞简明步骤 调试起飞简明步骤Step1 xff1a 飞控配置Step2 xff1a 试飞目标测试内容坐标系 Step3 xff1a 试飞方法1 升降 xff08 Throttle xff09 2 偏航 xff08 yaw
  • BetaFlight开源工程结构简明介绍

    BetaFlight开源工程结构简明介绍 Step1 获取开源代码开源代码版本克隆开源代码 Step2 了解工程情况支持模型类型 xff1a 多旋翼 amp 固定翼支持特性 amp 功能安装 amp 文档链接配置工具下载其他介绍 xff08
  • 四轴FPV无人机手动操作简明介绍

    四轴FPV无人机手动操作简明介绍 通常航拍机都是有自稳算法 43 GPS导航 43 辅助功能 避障 的支持 xff0c 从而保证飞手能够相对容易且稳定的操作模型飞机 xff0c 通常通过阅读说明书都能很快上手 xff0c 这里就不在赘述 本
  • BetaFlight开源代码框架简介

    BetaFlight开源代码框架简介 1 框架设计分析考量2 框架分析前提条件3 主程序框架4 调度框架5 模块方法6 典型任务 amp 模块6 1 典型任务6 2 典型模块6 3 传感模块 7 回顾 amp 分析8 分析模板 1 框架设计
  • 四轴飞控DIY集成FPV功能

    四轴飞控DIY集成FPV功能 1 功能需求2 概念介绍2 1 制式2 2 显示分辨率2 3 摄像头线数高于700线低于700线 3 需求分析4 组件选择5 接线组装5 1 摄像头接线5 2 图传接线 6 组装位置7 FPV功能调试7 1 摄
  • MFC拷贝文件及进度条显示

    参考 xff1a 封装CopyFileEx函数 xff0c 实现文件复制中的暂停 xff0c 控速 xff0c 获取进度 http blog csdn net career2011 article details 6844513 实例讲解C
  • BetaFlight模块设计之三十二:MSP协议模块分析

    BetaFlight模块设计之三十二 xff1a MSP协议模块分析 1 MSP协议模块1 1 MSP描述1 2 MSP版本优缺点1 3 MSP代码资源 2 MSP报文解析2 1 MSP收包状态机2 2 MSP报文格式 3 MSP报文处理3
  • BetaFlight模块设计之三十三:Pid模块分析

    BetaFlight模块设计之三十三 xff1a Pid模块分析 Pid模块1 Pid audio子模块2 Pid init子模块3 Pid算法子模块3 1 TPA模式3 2 飞行模式3 3 Launch模式3 4 AcroTrainer模
  • BetaFlight模块设计之三十四:OSD模块分析

    BetaFlight模块设计之三十四 xff1a OSD模块分析 1 OSD模块1 1 osd状态机子模块1 2 osd warnings检查子模块1 3 osd elements子模块 2 OSD设备 驱动及适配框架2 1 OSD设备2
  • ssh无法远程登陆问题汇总

    ssh无法远程登陆问题汇总 1 ssh服务是否已经启动1 1 sshd服务是否已经安装1 2 sshd是否已经启动 2 检查sshd配置3 检查路由情况4 检查hosts许可文件5 检查防火墙问题5 1 检查防火墙是否启动5 2 修改防火墙
  • traceroute命令结果分析

    traceroute命令结果分析 1 基本原理2 IP地址种类2 1 A类IP地址2 2 B类IP地址2 3 C类IP地址2 4 D类地址用于多点广播 Multicast 2 5 E类IP地址 3 测试3 1 第一次3 2 第二次 4 总结
  • bash脚本返回值应用

    bash脚本返回值应用 应该说bash脚本对于linux系统来说具有举足轻重的意义 这里不做展开 xff0c 也不做bash脚本介绍 更多的是做一个例子 xff0c 应用了bash脚本的以下特性 xff1a 输入参数函数定义调用可执行命令脚
  • 如何理解printf变参函数的实现

    如何理解printf变参函数的实现 1 printf函数变参的问题2 printf函数定义和解释2 1 printf函数定义2 2 Linux Man page解释 https man7 org linux man pages man3 s
  • BetaFlight模块设计之三十五:RSSI信号强度&链路稳定性分析

    BetaFlight模块设计之三十五 xff1a RSSI信号强度 amp 链路稳定性分析 1 RSSI信号强度1 1 RSSI Value1 2 RSSI dBm Value 2 链路稳定性3 RSSI amp LinkQuality来源

随机推荐

  • Linux的so组件设计框架及逻辑

    Linux的so组件设计框架及逻辑 1 组件关注点1 1 组件定义关注点1 2 组件业务关注点 2 so特性3 so组件设计逻辑4 so组件设计框架4 1 so组件范例4 2 so隐式调用范例4 3 so显式调用范例 5 so组件设计建议
  • PX4模块设计之八:Ubuntu 20.04搭建FlightGear模拟器

    PX4模块设计之八 xff1a Ubuntu 20 04搭建FlightGear模拟器 1 使用FlightGear的源由2 FlightGear模拟器简介3 Ubuntu 20 04搭建FlightGear步骤3 1 设置flightge
  • 封装CopyFileEx函数,实现文件复制中的暂停,控速,获取进度

    封装CopyFileEx函数 xff0c 实现文件复制中的暂停 xff0c 控速 xff0c 获取进度等 前段时间无意间想到如何控制文件复制过程的复制速度 xff0c 并且能实时获得复制进度 对于一个几兆甚至更小的文件 xff0c 调用AP
  • PX4模块设计之九:PX4飞行模式简介

    PX4模块设计之九 xff1a PX4飞行模式简介 关于模式的探讨1 需求角度1 1 多旋翼 MC multi copter 1 1 1 RC控制模式1 1 1 1 Position Mode1 1 1 2 Altitude Mode1 1
  • PX4模块设计之十:PX4启动过程

    PX4模块设计之十 xff1a PX4启动过程 1 硬件 飞控硬件上电2 硬件 飞控硬件初始化3 硬件 43 软件 飞控bootloader初始化4 硬件 43 软件 飞控系统初始化5 软件 飞控应用初始化6 配置 SD卡配置文件6 1 e
  • PX4模块设计之十一:Built-In框架

    PX4模块设计之十一 xff1a Built In框架 1 Nuttx Built In框架2 PX4 Built In框架2 1 NSH Built In关联文件2 2 NSH Built In关联文件生成2 3 NSH Built In
  • PX4模块设计之十二:High Resolution Timer设计

    PX4模块设计之十二 xff1a High Resolution Timer设计 1 HRT模块特性2 HRT模块基本功能2 1 循环触发接口2 2 延迟触发接口2 3 定时触发接口2 4 其他功能 3 HRT模块精度3 1 精度粒度3 2
  • PX4模块设计之十三:WorkQueue设计

    PX4模块设计之十三 xff1a WorkQueue设计 1 WorkQueue启动2 WorkQueue接口2 1 基本接口2 2 辅助接口2 3 WorkQueue任务函数2 3 1 Flat Build2 3 2 Protected
  • PX4模块设计之十四:Event设计

    PX4模块设计之十四 xff1a Event设计 1 Event主要接口1 1 字符串消息接口1 2 参数消息接口1 3 内部uORB实现 2 PX4 Events框架2 1 配置文件2 2 内嵌代码 3 使用方法3 1 Step 1 xf
  • PX4模块设计之十五:PX4 Log设计

    PX4模块设计之十五 xff1a PX4 Log设计 1 PX4 Log介绍2 ULog文件格式2 1 ULog文件结构2 2 ULog文件头结构2 3 ULog消息结构定义2 3 1 B Flag Bits 消息2 3 2 F Forma
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之十七:ModuleBase模块

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之十八:Logger模块

    PX4模块设计之十八 xff1a Logger模块 1 Logger模块简介2 模块入口函数2 1 主入口logger main2 2 自定义子命令Logger custom command2 3 日志主题uORB注册 3 重要实现函数3
  • MFC鼠标响应、鼠标画线

    鼠标响应关键就是对两个函数进行操作 xff1a OnLButtonDown和OnLButtonUp xff1b 1 使用MFC AppWizard exe xff09 建立一个单文档MFC工程 2 首先要在CxxxView类的定义里加上后续
  • 查理·芒格:让自己配得上想要的东西

    巴菲特说他一生遇人无数 xff0c 从来没有遇到过像查理这样的人 94岁的查理 芒格毕业于哈佛大学法学院 xff0c 是沃伦 巴菲特的黄金搭档 xff0c 伯克夏 哈撒韦公司的副主席 xff0c 芒格的头脑是原创性的 xff0c 从来不受任
  • PX4模块设计之十九:Replay模块

    PX4模块设计之十九 xff1a Replay模块 1 Replay模块简介2 模块入口函数2 1 主入口replay main2 2 自定义子命令Replay custom command 3 重要实现函数3 1 Replay task
  • TX12 + ExpressLRS 915MHz RC控制链路配置及问题汇总

    TX12 43 ExpressLRS 915MHz RC控制链路配置及问题汇总 1 硬件配置1 1 TX12遥控器1 2 发射 接受机 2 问题汇总2 1 ELRS接收机无法点亮 第一次 2 2 ELRS接收机无法点亮 第二次 2 3 触发
  • PX4模块设计之二十:PX4应用平台初始化

    PX4模块设计之二十 xff1a PX4应用平台初始化 1 PX4应用平台介绍2 PX4应用平台初始化实现3 讨论和思考4 参考资料 在PX4启动过程章节的基础上 xff0c 可以深入分析下PX4应用平台 xff08 框架 xff09 的实
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3
  • PX4模块设计之二十二:FlightModeManager模块

    PX4模块设计之二十二 xff1a FlightModeManager模块 1 FlightModeManager简介2 FlightModeManager启动3 FlightModeManager模块重要实现3 1 custom comm