码农知识堂 - 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

  • 相关阅读:
    不允许你还不会OSS文件操作,看完一篇就够了
    MAC一体机密码修改或者重新创建账户?
    3分钟认识Vue3的v-model
    ArcGIS制作横向图例
    侯捷 - C++ Startup 揭密:C++ 程序的生前和死后 (一)
    分析Spring-ApplicationListener监听器
    技术分享 | 如何确保API 的稳定性与正确性?你只需要这一招
    LambdaQueryWapper与QueryWapper的一些特殊用法
    JavaScript中事件绑定和DOM事件流(冒泡和捕获)-案例详解
    选择最佳的项目管理工具:推荐哪一个?
  • 原文地址:https://blog.csdn.net/lida2003/article/details/126744058
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号