码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • PX4模块设计之三十二:AttitudeEstimatorQ模块


    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  [arguments...]
     Commands:
       start
    
       stop
    
       status        print status info
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    class AttitudeEstimatorQ : public ModuleBase, public ModuleParams, public px4::WorkItem
    
    • 1

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

    2. 模块入口函数

    2.1 主入口attitude_estimator_q_main

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

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

    2.2 自定义子命令custom_command

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

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

    3. AttitudeEstimatorQ模块重要函数

    3.1 task_spawn

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

    AttitudeEstimatorQ::task_spawn
     ├──> AttitudeEstimatorQ *instance = new AttitudeEstimatorQ()
     ├──> 
     │   ├──> _object.store(instance);
     │   ├──> _task_id = task_id_is_work_queue
     │   └──> init()>
     │       └──> return PX4_OK
     ├──> 
     │   └──> PX4_ERR("alloc failed")
     ├──> delete instance
     ├──> _object.store(nullptr)
     ├──> _task_id = -1
     └──> return PX4_ERROR
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.2 instantiate

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

    3.3 init

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

    AttitudeEstimatorQ::init
     ├──> 
     │   ├──> PX4_ERR("callback registration failed")
     │   └──> return false;
     └──> return true;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    uORB::SubscriptionCallbackWorkItem _sensors_sub{this, ORB_ID(sensor_combined)};
    
    • 1

    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消息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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)};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 输出
    	uORB::Publication _vehicle_attitude_pub{ORB_ID(vehicle_attitude)};
    
    • 1
    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
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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

  • 相关阅读:
    含文档+PPT+源码等]精品微信小程序ssm社区心理健康服务平台+后台管理系统|前后分离VUE[包运行成功]微信小程序项目源码Java毕业设计
    如何给selenium.chrome写扩展拦截或转发请求
    1024程序员节主题征文 | 35种语言输出1024
    论文笔记:E(n) Equivariant Graph Neural Networks
    python第三方库pygame的使用
    Java数据结构——认识二叉树
    牛蛙!GoFrame2.7正式版的监控组件真是及时雨
    三年之约!亚马逊联手哈佛大学倾力打造量子互联网
    服务器数据恢复—异常断电导致ESXi虚拟机无法启动的数据恢复案例
    OpenDataV低代码平台增加自定义属性编辑
  • 原文地址:https://blog.csdn.net/lida2003/article/details/126744058
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号