ArduPilot开源飞控之AP_AHRS

2023-10-14 10:52
文章标签 开源 ardupilot ap 飞控 ahrs

本文主要是介绍ArduPilot开源飞控之AP_AHRS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ArduPilot开源飞控之AP_AHRS

  • 1. 源由
  • 2. 框架设计
    • 2.1 启动代码
    • 2.2 任务代码
  • 3. 重要例程
    • 3.1 init
    • 3.2 update
  • 4. 外部AHRS传感模块
    • 4.1 init
    • 4.2 update
  • 5. 参考资料

1. 源由

AHRS(Attitude Heading Reference System): 飞控最为重要的一个任务就是姿态、位置、方向计算。

本章节,将从代码层面研读下AP_AHRS的整体框架和设计逻辑。

其中AHRS可以分成两块内容:

  1. 依赖内部sensor的AHRS,详见ArduPilot开源代码之AP_InertialSensor
  2. 外部AHRS传感器

但是最终汇聚到数据算法处理的是AP_AHRS

2. 框架设计

2.1 启动代码

Copter::init_ardupilot└──> Copter::startup_INS_ground└──> AP_AHRS::init

2.2 任务代码

FAST_TASK(read_AHRS)└──> Copter::read_AHRS└──> AP_AHRS::update

3. 重要例程

3.1 init

模块初始化例程:

  1. EKF算法类型选择(目前不再支持EKF1);
  2. DCM & EXTERNAL_AHRS初始化;
  3. 自定义板子方向初始化;
// init sets up INS board orientation
void AP_AHRS::init()││  /********************************************************************************│   * EKF1 is no longer supported - handle case where it is selected               *│   ********************************************************************************/├──> <_ekf_type.get() == 1>│   └──> AP_BoardConfig::config_error("EKF1 not available")├──> <_ekf_type.get() == 2>  //!HAL_NAVEKF2_AVAILABLE && HAL_NAVEKF3_AVAILABLE│   ├──> _ekf_type.set(3)│   └──> EKF3.set_enable(true)├──> <_ekf_type.get() == 3>  //!HAL_NAVEKF3_AVAILABLE && HAL_NAVEKF2_AVAILABLE│   ├──> _ekf_type.set(2)│   └──> EKF2.set_enable(true)├──> <HAL_NAVEKF2_AVAILABLE && HAL_NAVEKF3_AVAILABLE> <_ekf_type.get() == 2 && !EKF2.get_enable() && EKF3.get_enable()>│  // a special case to catch users who had AHRS_EKF_TYPE=2 saved and│  // updated to a version where EK2_ENABLE=0│   └──> _ekf_type.set(3)││  /********************************************************************************│   * DCM & external AHRS init                                                     *│   ********************************************************************************/├──> last_active_ekf_type = (EKFType)_ekf_type.get()├──> <AP_AHRS_DCM_ENABLED>│   └──> _dcm.init() // init backends├──> <HAL_EXTERNAL_AHRS_ENABLED>│   └──> external.init()││  /********************************************************************************│   * convert to new custom rotaton, PARAMETER_CONVERSION - Added: Nov-2021        *│   ********************************************************************************/└──> <!APM_BUILD_TYPE(APM_BUILD_AP_Periph><_board_orientation == ROTATION_CUSTOM_OLD>├──> _board_orientation.set_and_save(ROTATION_CUSTOM_1)├──> AP_Param::ConversionInfo info├──> <AP_Param::find_top_level_key_by_pointer(this, info.old_key)>│   ├──> info.type = AP_PARAM_FLOAT│   └──> <for (info.old_group_element=15 info.old_group_element<=17 info.old_group_element++)> <AP_Param::find_old_parameter(&info, &rpy_param)>│        └──> rpy[info.old_group_element-15] = rpy_param.get()└──> AP::custom_rotations().convert(ROTATION_CUSTOM_1, rpy[0], rpy[1], rpy[2])

3.2 update

AHRS更新过程:

  1. 配置及传感数据更新;
  2. EKF算法运算更新;
AP_AHRS::update││  // periodically checks to see if we should update the AHRS│  // orientation (e.g. based on the AHRS_ORIENTATION parameter)│  // allow for runtime change of orientation│  // this makes initial config easier│  /********************************************************************************│   * Configuration and sensor update                                              *│   ********************************************************************************/├──> update_orientation()├──> <!skip_ins_update>│   └──> AP::ins().update()  // tell the IMU to grab some data├──> WITH_SEMAPHORE(_rsem) // support locked access functions to AHRS data├──> <!_checked_watchdog_home>│   ├──> load_watchdog_home()  // see if we have to restore home after a watchdog reset:│   └──> _checked_watchdog_home = true││  // drop back to normal priority if we were boosted by the INS│  // calling delay_microseconds_boost()├──> hal.scheduler->boost_end()││  // update autopilot-body-to-vehicle-body from _trim parameters:├──> update_trim_rotation_matrices()│├──> <AP_AHRS_DCM_ENABLED>│   └──> update_DCM()││  // update takeoff/touchdown flags├──> update_flags()│├──> <AP_AHRS_SIM_ENABLED>│   └──> update_SITL()│├──> <HAL_EXTERNAL_AHRS_ENABLED>│   └──> update_external()││  /********************************************************************************│   * EKFx update                                                                  *│   ********************************************************************************/├──> <_ekf_type == 2>  // if EK2 is primary then run EKF2 first to give it CPU priority│   ├──> <HAL_NAVEKF2_AVAILABLE> update_EKF2()│   └──> <HAL_NAVEKF3_AVAILABLE> update_EKF3()├──> < else > // otherwise run EKF3 first│   ├──> HAL_NAVEKF3_AVAILABLE> update_EKF3()│   └──> <HAL_NAVEKF2_AVAILABLE> update_EKF2()├──> <AP_MODULE_SUPPORTED> // call AHRS_update hook if any│   └──> AP_Module::call_hook_AHRS_update(*this)│├──> <hal.opticalflow> // push gyros if optical flow present│   ├──> const Vector3f &exported_gyro_bias = get_gyro_drift()│   └──> hal.opticalflow->push_gyro_bias(exported_gyro_bias.x, exported_gyro_bias.y)│├──> <_view != nullptr> // update optional alternative attitude view│   └──> _view->update()│├──> update_AOA_SSA()  // update AOA and SSA││  /********************************************************************************│   * GCS notification                                                             *│   ********************************************************************************/├──> <HAL_GCS_ENABLED>│   ├──> state.active_EKF = _active_EKF_type()│   ├──> <state.active_EKF != last_active_ekf_type>│   │   ├──> last_active_ekf_type = state.active_EKF│   │   ├──> const char *shortname = "???"│   │   ├──> <case EKFType::DCM> <AP_AHRS_DCM_ENABLED>│   │   │   └──> shortname = "DCM"│   │   ├──> <case EKFType::SIM> <AP_AHRS_SIM_ENABLED>│   │   │   └──> shortname = "SIM"│   │   ├──> <case EKFType::EXTERNAL> <HAL_EXTERNAL_AHRS_ENABLED>│   │   │   └──> shortname = "External"│   │   ├──> <case EKFType::THREE> <HAL_NAVEKF3_AVAILABLE>│   │   │   └──> shortname = "EKF3"│   │   └──> <case EKFType::TWO> <HAL_NAVEKF2_AVAILABLE>│   │       └──> shortname = "EKF2"│   └──> GCS_SEND_TEXT(MAV_SEVERITY_INFO, "AHRS: %s active", shortname)│├──> update_state()  // update published state││  /********************************************************************************│   * add timing jitter to simulate slow EKF response                              *│   ********************************************************************************/└──> <CONFIG_HAL_BOARD == HAL_BOARD_SITL> //├──> const auto *sitl = AP::sitl()└──> <sitl->loop_time_jitter_us > 0>└──> hal.scheduler->delay_microseconds(random() % sitl->loop_time_jitter_us)

4. 外部AHRS传感模块

启动调用关系:

Copter::init_ardupilot└──> Copter::startup_INS_ground└──> AP_AHRS::init└──> AP_ExternalAHRS::init

循环更新关系

FAST_TASK(read_AHRS)└──> Copter::read_AHRS└──> AP_AHRS::update└──> AP_ExternalAHRS::update

4.1 init

支持以下两种类型:

  • AP_ExternalAHRS_VectorNav
  • AP_ExternalAHRS_MicroStrain5
AP_ExternalAHRS::init├──> <rate.get() < 50>│   └──> rate.set(50)  // min 50Hz├──> <case DevType::None>│   └──> return  // nothing to do├──> <case DevType::VecNav> <AP_EXTERNAL_AHRS_VECTORNAV_ENABLED>│   ├──> backend = new AP_ExternalAHRS_VectorNav(this, state)│   └──> return├──> <case DevType::MicroStrain5> <AP_EXTERNAL_AHRS_MICROSTRAIN5_ENABLED>│   ├──> backend = new AP_ExternalAHRS_MicroStrain5(this, state)│   └──> return└──> GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Unsupported ExternalAHRS type %u", unsigned(devtype))

4.2 update

接下去又是front-end / back-end分层设计,本章节不再展开。

void AP_ExternalAHRS::update(void)└──> <backend>└──> backend->update()

5. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码Task介绍
【3】ArduPilot飞控启动&运行过程简介
【4】ArduPilot之开源代码Library&Sketches设计
【5】ArduPilot之开源代码Sensor Drivers设计

这篇关于ArduPilot开源飞控之AP_AHRS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210033

相关文章

无需邀请码!Manus复刻开源版OpenManus下载安装与体验

《无需邀请码!Manus复刻开源版OpenManus下载安装与体验》Manus的完美复刻开源版OpenManus安装与体验,无需邀请码,手把手教你如何在本地安装与配置Manus的开源版OpenManu... Manus是什么?Manus 是 Monica 团队推出的全球首款通用型 AI Agent。Man

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank&nbsp;正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端

LLM系列 | 38:解读阿里开源语音多模态模型Qwen2-Audio

引言 模型概述 模型架构 训练方法 性能评估 实战演示 总结 引言 金山挂月窥禅径,沙鸟听经恋法门。 小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩,今天这篇小作文主要是介绍阿里巴巴的语音多模态大模型Qwen2-Audio。近日,阿里巴巴Qwen团队发布了最新的大规模音频-语言模型Qwen2-Audio及其技术报告。该模型在音频理解和多模态交互

开源Apache服务器安全防护技术精要及实战

Apache 服务简介   Web服务器也称为WWW服务器或HTTP服务器(HTTPServer),它是Internet上最常见也是使用最频繁的服务器之一,Web服务器能够为用户提供网页浏览、论坛访问等等服务。   由于用户在通过Web浏览器访问信息资源的过程中,无须再关心一些技术性的细节,而且界面非常友好,因而Web在Internet上一推出就得到了爆炸性的发展。现在Web服务器已