PX4模块设计之三十二:AttitudeEstimatorQ模块

2023-05-16

PX4模块设计之三十二:AttitudeEstimatorQ模块

  • 1. AttitudeEstimatorQ模块简介
  • 2. 模块入口函数
    • 2.1 主入口attitude_estimator_q_main
    • 2.2 自定义子命令custom_command
  • 3. AttitudeEstimatorQ模块重要函数
    • 3.1 task_spawn
    • 3.2 instantiate
    • 3.3 init
    • 3.4 Run
  • 4. 总结
  • 5. 参考资料

1. AttitudeEstimatorQ模块简介

### Description
Attitude estimator q.

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

   stop

   status        print status info

注:print_usage函数是具体对应实现。

class AttitudeEstimatorQ : public ModuleBase<AttitudeEstimatorQ>, public ModuleParams, public px4::WorkItem

注:AttitudeEstimatorQ模块采用了ModuleBase和WorkQueue设计。

2. 模块入口函数

2.1 主入口attitude_estimator_q_main

同样继承了ModuleBase,由ModuleBase的main来完成模块入口。

attitude_estimator_q_main
 └──> return AttitudeEstimatorQ::main(argc, argv)

2.2 自定义子命令custom_command

模块仅支持start/stop/status命令,不支持其他自定义命令。

AttitudeEstimatorQ::custom_command
 └──> return print_usage("unknown command");

3. AttitudeEstimatorQ模块重要函数

3.1 task_spawn

这里主要初始化了AttitudeEstimatorQ对象,后续通过WorkQueue来完成进行轮询。

AttitudeEstimatorQ::task_spawn
 ├──> AttitudeEstimatorQ *instance = new AttitudeEstimatorQ()
 ├──> <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.2 instantiate

注:鉴于该模块不采用任务(线程),所以ModuleBase::run_trampoline无需执行,所以可以不实现。

3.3 init

在task_spawn中使用,对_sensors_sub成员变量进行事件回调注册(当有_sensors_sub消息时,会调用SubscriptionCallbackWorkItem::ScheduleNow,再触发AttitudeEstimatorQ::Run过程)。

AttitudeEstimatorQ::init
 ├──> <!_sensors_sub.registerCallback()>
 │   ├──> PX4_ERR("callback registration failed")
 │   └──> return false;
 └──> return true;
uORB::SubscriptionCallbackWorkItem _sensors_sub{this, ORB_ID(sensor_combined)};

3.4 Run

将输入消息处理后,更新发布最新计算的vehicle_attitude消息。

AttitudeEstimatorQ::Run
 ├──> [优雅退出处理]
 └──> <_sensors_sub.updated()>
     ├──> _data_good = true;
     ├──> _ext_hdg_good = false;
     ├──> update_parameters();
     ├──> update_sensors();
     ├──> update_magnetometer();
     ├──> update_visual_odometry();
     ├──> update_motion_capture_odometry();
     ├──> update_gps_position();
     ├──> update_vehicle_local_position();
     └──> update_vehicle_attitude();  // 发布vehicle_attitude消息

4. 总结

深入姿态计算需要进一步研读内部逻辑和算法(后续有时间我们再进行深入),从模块代码角度:

  • 输入
	uORB::SubscriptionCallbackWorkItem _sensors_sub{this, ORB_ID(sensor_combined)};

	uORB::SubscriptionInterval _parameter_update_sub{ORB_ID(parameter_update), 1_s};

	uORB::Subscription _vehicle_attitude_sub{ORB_ID(vehicle_attitude)};
	uORB::Subscription _vehicle_gps_position_sub{ORB_ID(vehicle_gps_position)};
	uORB::Subscription _vehicle_local_position_sub{ORB_ID(vehicle_local_position)};
	uORB::Subscription _vehicle_magnetometer_sub{ORB_ID(vehicle_magnetometer)};
	uORB::Subscription _vehicle_mocap_odometry_sub{ORB_ID(vehicle_mocap_odometry)};
	uORB::Subscription _vehicle_visual_odometry_sub{ORB_ID(vehicle_visual_odometry)};
  • 输出
	uORB::Publication<vehicle_attitude_s> _vehicle_attitude_pub{ORB_ID(vehicle_attitude)};
struct vehicle_attitude_s {

	uint64_t timestamp;
	uint64_t timestamp_sample;
	float q[4];
	float delta_q_reset[4];
	uint8_t quat_reset_counter;
	uint8_t _padding0[7]; // required for logger
};

5. 参考资料

【1】PX4开源软件框架简明简介
【2】PX4模块设计之十一:Built-In框架
【3】PX4模块设计之十二:High Resolution Timer设计
【4】PX4模块设计之十三:WorkQueue设计
【5】PX4模块设计之十七:ModuleBase模块
【6】PX4模块设计之三十:Hysteresis类
【7】PX4 modules_main

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

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

  • 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
  • PX4模块设计之二十三:自定义FlightTask

    PX4模块设计之二十三 xff1a 自定义FlightTask Step1 创建飞行模式文件夹Step2 创建飞行模式源代码和CMakeLists txt文件Step3 更新CMakeLists txt文件Step4 更新FlightTas
  • PX4模块设计之二十四:内部ADC模块

    PX4模块设计之二十四 xff1a 内部ADC模块 1 内部ADC模块简介2 模块入口函数2 1 主入口board adc main2 2 自定义子命令custom command 3 内部ADC模块重要函数3 1 task spawn3
  • PX4模块设计之二十五:DShot模块

    PX4模块设计之二十五 xff1a DShot模块 1 DShot模块简介2 DShot类继承关系3 模块入口函数3 1 主入口dshot main3 2 自定义子命令custom command 4 DShot模块重要函数4 1 task
  • PX4模块设计之二十六:BatteryStatus模块

    PX4模块设计之二十六 xff1a BatteryStatus模块 1 BatteryStatus模块简介2 模块入口函数2 1 主入口battery status main2 2 自定义子命令custom command 3 Batter
  • PX4模块设计之二十七:LandDetector模块

    PX4模块设计之二十七 xff1a LandDetector模块 1 LandDetector模块简介2 模块入口函数2 1 主入口land detector main2 2 自定义子命令custom command 3 LandDetec
  • CentOS-7 中安装VS Code 并启动

    VSCode安装 安装平台 xff1a CentOS7 安装方法 xff1a 1 在官网上下载64位 xff08 或者32位 xff09 的rpm包 xff08 官网地址 xff1a https code visualstudio com
  • PX4模块设计之二十八:RCInput模块

    PX4模块设计之二十八 xff1a RCInput模块 1 RCInput模块简介2 模块入口函数2 1 主入口rc input main2 2 自定义子命令custom command2 3 模块状态print status 重载 3 R
  • PX4模块设计之二十九:RCUpdate模块

    PX4模块设计之二十九 xff1a RCUpdate模块 1 RCUpdate模块简介2 模块入口函数2 1 主入口rc update main2 2 自定义子命令custom command2 3 模块状态print status 重载
  • PX4模块设计之三十:Hysteresis类

    PX4模块设计之三十 xff1a Hysteresis类 1 Hysteresis类简介2 Hysteresis类成员变量介绍3 Hysteresis类迟滞逻辑4 Hysteresis类重要方法4 1 Hysteresis bool ini
  • PX4模块设计之三十一:ManualControl模块

    PX4模块设计之三十一 xff1a ManualControl模块 1 ManualControl模块简介2 模块入口函数2 1 主入口manual control main2 2 自定义子命令custom command 3 Manual
  • PX4模块设计之三十二:AttitudeEstimatorQ模块

    PX4模块设计之三十二 xff1a AttitudeEstimatorQ模块 1 AttitudeEstimatorQ模块简介2 模块入口函数2 1 主入口attitude estimator q main2 2 自定义子命令custom