实例教程:BBDB为AHRS算法开发提供完善的支撑环境(下)

4. BBDB基础上为算法实现提供支撑方式二:算法层实现

第2节内容当中讲述在应用层实现AHRS的步骤,这种方法优点在于实现方法比较简单明了。但是缺点在于程序代码的组织算不上很好,AHRS算法代码与PH47框架代码间存在一定的耦合度,会对将来算法代码移植或复用造成一些麻烦。同时也容易对将来在应用层实现其他控制逻辑产生混淆。故不太推荐在应用层实现AHRS算法,而是建议采用本节即将讲述的在算法层实现只有的AHRS算法。

算法层实现AHRS算法的基本方法是将算法实现封装成一个类,一个从姿态解算抽象类基类当中派生子类。这样做的好处在于对算法的封装比较完善,同时基于抽象类多态机制,可以方便的将BBDB固件中预置的姿态解算模块进行替换;或者与其并行运行。以下就实现步骤进行具体讲述:

4.1. 创建姿态解算抽象类的派生子类CAttiCore_Extend

在\DevStudio\Algorithms\文件夹中分别创建派生类CAttiCore_Extend的.h及.cpp文件实现派生类,我们即将在该类当中实现自己的AHRS解算算法。

AttiCore_Extend.h文件:

#ifndef __ATTI_CORE_EXTEND_H__
#define __ATTI_CORE_EXTEND_H__//
// AttiCore_Extend.h
// 一般用户代码所必须包含的头文件
#include "../CommonDef.h"
#include "../Frame/GlobalFun.h"	#include "AttitudeCore_Port.h"		// 姿态解算抽象类头文件class CAttiCore_Extend : public CAttitudeCore_Port
{
public:CAttiCore_Extend();virtual ~CAttiCore_Extend() {};virtual void FstRunInit();					// AHRS 初始化函数virtual void Update(const float fDt_ms);	// AHRS 算法实现函数private:};#endif

AttiCore_Extend.cpp文件:

//
// AttiCore_Extend.cpp#include "AttiCore_Extend.h"CAttiCore_Extend::CAttiCore_Extend()
{
}void CAttiCore_Extend::FstRunInit() 
{
// AHRS 初始化函数
// ……
}void CAttiCore_Extend::Update(const float fDt_ms)
{// AHRS 算法实现函数// ……
}
4.2. 应用层实现自己的AHRS算法(并行运行)

使用C++抽象类多态机制可以将自己AHRS算法封装成类,从而实现功能模块化。更重要的是,使用多态机制不仅可以用自己的AHRS计算模块替换掉PH47框架的置模块,还可以将自己的计算模块与预制模块并行运行。以下就首先讲述预置模块与自有模块并行运行的实现步骤:

4.2.1 在应用层加入对CAttiCore_Extend的文件包含

在文件DevStudio\Algorithms\Algorithms.h中加入文件包含:

    #include "./AttiCore_Extend.h"

4.2.2 声明指向抽象类基类的指针_pAttitudeCoreExtend

在文件Algorithms.h声明抽象类指针_pAttitudeCoreExtend:

   CAttitudeCore_Port *_pAttitudeCoreExtend;

4.2.3 实例化指针_pAttitudeCoreExtend

在文件Algorithms.cpp的CAlgorithms.Init()函数中将指向CAttiCore_Extend派生类子类对象的指针赋值给抽象类基类指针_pAttitudeCoreExtend。之后通过该指针来调用CAttiCore_Extend子类成员函数。

   _pAttitudeCoreExtend = new CAttiCore_Extend();ASSERT(_pAttitudeCoreExtend);

4.2.4 通过_pAttitudeCoreExtend进行AHRS算法的初始化及调用运行

在算法层CAlgorithms.Init()函数,或是在应用层CAppBBDB.Init() 函数中对AHRS算法类进行初始化;

void CAppBBDB::Init()
{// 本函数为PH7 框架完全启动后的的初始化函数,可安全使用 ASSERT, TRACEalgo._pAttitudeCoreExtend->FstRunInit();
}

在应用层CAppBBDB.FastThread_1000Hz()函数,或NormalThread_250Hz()函数中对AHRS算法类计算函数进行调用。

void CAppBBDB::FastThread_1000Hz()
{// fRawGyrDt为总线被设置的时间差float fRawGyrDt_ms = bus.sImu.GyrRaw.GetDt2Prev_us()/1000.0f;	algo._pAttitudeCoreExtend->Update(fRawGyrDt_ms);
}

 

同样,算法层初始化函数CAlgorithms.Init()运行早于FastThread_1000Hz()ANormalThread_250Hz()函数。上述工作完成后,自有的AHRS解算类CAttiCore_Extend即可与框架预设姿态解算类CAttiCore_Ecf并行运行。

4.3. 使用自己的AHRS模块替换框架已有的预置模块

替换已有预置模块方法与4.2节高度类似,都是应用了C++抽象类的多态机制,只是替换预置模块在实现上更为简单,步骤如下:

将指向姿态解算抽象类基类的指针,从原有预置指向CAttiCore_Ecf姿态解算类对象指针,更改为指向自有AHRS解算类CAttiCore_Extend的对象指针即可,其余相关函数调用工作框架已经完成无需自己事项。

// _pAttitudeCore = new CAttiCore_Ecf();	// 更改前
_pAttitudeCore= new CAttiCore_Extend();	// 替换为自有解算模块
ASSERT(__pAttitudeCore);


更多内容见CSDN博客专栏:无人机飞控icon-default.png?t=O83Ahttps://blog.csdn.net/ss15/category_9690939.html?spm=1001.2014.3001.5482

 相关资源:PH47: PH47运动控制代码框架.icon-default.png?t=O83Ahttps://gitee.com/ss15/ph47

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/888706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字证书实现oauth2.0与token去中心化的解耦

鉴权服务oauth2.0的既要还要的痛点 鉴权服务手撸?不可能,上spring security! 感觉还不够?再叠加oauth2.0! 鉴权太重?换用分布式token! 既然分布式了,是不是可以不用鉴权中心&#xf…

鸿蒙Next学习-监听指定页面显示/页面生命周期

自定义组件监听页面生命周期 使用无感监听页面路由的能力,能够实现在自定义组件中监听页面的生命周期。 // Index.ets import { uiObserver, router, UIObserver } from kit.ArkUI;Entry Component struct Index {listener: (info: uiObserver.RouterPageInfo) &g…

wordpress收录好好的换了个模板就突然不收录了

wordpress收录好好的换了个模板就突然不收录了,而且原来收录的也给删除了,是模板的问题吗? 一般来说,不是模板的问题,是突然换模板,或添加大量内容、导致数据结构等方面变化,被搜索引擎当作弊的处罚了。要…

solon 集成 kafka-clients

使用 kafka-clients 原本是比较简单的事情。但有些同学习惯了 spring-kafka 后&#xff0c;对原始 java 接口会陌生些。会希望有个集成的示例。 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><ve…

Android开发,使用ViewPager2实现自动轮播图

文章目录 1. build.gradle添加依赖&#xff1a;2. AndroidManifest.xml中添加网络访问权限3. 编写 布局文件4. 编写Banner适配器5. 自定义Banner视图6. 定义圆点指示器的drawable资源7. 在需要使用轮播图中的Activity中使用8. 运行效果图9. 视频教程 在Android项目程序设计中&a…

Oracle DataGuard启动与关闭顺序

在Oracle Data Guard环境中&#xff0c;启动和关闭数据库的顺序非常重要&#xff0c;以确保数据的一致性和最小化服务中断。以下是针对主库&#xff08;Primary Database&#xff09;和备库&#xff08;Standby Database&#xff09;启动与关闭的标准步骤。 启动顺序 1. 启动…

JavaScript 中基元类型与引用类型的解析

文章目录 基元类型Undefined 类型Null 类型Boolean 类型Number 类型String 类型Symbol 类型 类型详解对象&#xff08;Object&#xff09;数组&#xff08;Array&#xff09;函数&#xff08;Function&#xff09;日期&#xff08;Date&#xff09;、正则表达式&#xff08;Reg…

切比雪夫不等式:方差约束下的概率估计

切比雪夫不等式&#xff1a;方差约束下的概率估计 背景 在概率分析中&#xff0c;切比雪夫不等式是一个常用的工具&#xff0c;它通过引入随机变量的 方差信息&#xff0c;给出了偏离均值的概率界限。这一不等式是对 马尔科夫不等式 的自然扩展&#xff0c;结合了更丰富的分布…

企业网双核心交换机实现冗余和负载均衡(MSTP+VRRP)

MSTP&#xff08;多生成树协议&#xff09; 通过创建多个VLAN实例&#xff0c;将原有的STP、RSTP升级&#xff0c;避免单一VLAN阻塞后导致带宽的浪费&#xff0c;通过将VLAN数据与实例绑定&#xff0c;有效提升网络速率。 VRRP&#xff08;虚拟路由冗余协议&#xff09; 用…

Socket编程-tcp

1. 前言 在tcp套接字编程这里&#xff0c;我们将完成两份代码&#xff0c;一份是基于tcp实现普通的对话&#xff0c;另一份加上业务&#xff0c;client输入要执行的命令&#xff0c;server将执行结果返回给client 2. tcp_echo_server 与udp类似&#xff0c;前两步&#xff1…

深入浅出云计算 ---笔记

这是博主工作闲时的一些日常学习记录&#xff0c;有些之前很熟悉的&#xff0c;但工作中不常用&#xff0c;慢慢就遗忘了&#xff0c;在这里记录&#xff0c;也是为了激励自己坚持复习&#xff0c;如果有能帮到你&#xff0c;那我将感到非常的荣幸~ 快速到达↓↓↓ IaaS篇>&…

14 设计模式值观察者模式(书籍发布通知案例)

一、观察者模式定义 在日常开发中&#xff0c;我们经常会遇到一种场景&#xff1a;某个对象的状态发生变化时&#xff0c;需要通知并更新其他相关对象。这时&#xff0c;观察者模式便成为了解决问题的有效方案。观察者模式是一种常见的设计模式&#xff0c;它允许一个对象的状态…

15分钟训练数字人MimicTalk

只需15分钟&#xff0c;就能训练高质量&#xff0c;个性化数字人大模型。由浙江大学与字节跳动联合推出MimicTalk算法&#xff0c;目前已开源。 在外表和说话风格上和真人相似。将通用3D数字人大模型适应到单个目标人&#xff0c;采用动静结合的高效微调方案&#xff0…

c++高级篇(四) ——Linux下IO多路复用之epoll模型

IO多路复用 —— epoll 前言 在之前我们就已经介绍过了select和poll,在作为io多路复用的最后一个的epoll,我们来总结一下它们之间的区别: a select 实现原理 select 通过一个文件描述符集合&#xff08;fd_set&#xff09;来工作&#xff0c;该集合可以包含需要监控的文件…

【kettle】mysql数据抽取至kafka/消费kafka数据存入mysql

目录 一、mysql数据抽取至kafka1、表输入2、json output3、kafka producer4、启动转换&#xff0c;查看是否可以消费 二、消费kafka数据存入mysql1、Kafka consumer2、Get records from stream3、字段选择4、JSON input5、表输出 一、mysql数据抽取至kafka 1、表输入 点击新建…

docker-compose部署skywalking 8.1.0

一、下载镜像 #注意 skywalking-oap-server和skywalking java agent版本强关联&#xff0c;版本需要保持一致性 docker pull elasticsearch:7.9.0 docker pull apache/skywalking-oap-server:8.1.0-es7 docker pull apache/skywalking-ui:8.1.0二、部署文件docker-compose.yam…

用Python开发一个经典贪吃蛇小游戏

Python 是开发小游戏的绝佳工具,借助第三方库,如 pygame,我们可以快速开发一个经典的贪吃蛇游戏。本篇将介绍如何用 Python 实现一个完整的贪吃蛇小游戏。 一、游戏设计 1.1 游戏规则 玩家通过方向键控制贪吃蛇移动。贪吃蛇吃到食物后会变长,同时得分增加。如果贪吃蛇撞到…

在 MacOS 上为 LM Studio 更换镜像源

在 MacOS 之中使用 LM Studio 部署本地 LLM时&#xff0c;用户可能会遇到无法下载模型的问题。 一般的解决方法是在 huggingface.co 或者国内的镜像站 hf-mirror.com 的项目介绍卡页面下载模型后拖入 LM Studio 的模型文件夹。这样无法利用 LM Studio 本身的搜索功能。 本文将…

vue中.sync修饰符的用法

一、什么是.sync修饰符 在Vue.js中&#xff0c;.sync 修饰符用于创建一个双向绑定的 prop。它使子组件能够更新父组件的 prop 值&#xff0c;实现父子组件之间的双向数据同步。具体来说&#xff0c;.sync 修饰符主要有以下几个功能&#xff1a; 简化双向绑定&#xff1a; 使用…

【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo

项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo&#xff0c;完全适配HarmonyOS NEXT系统&#xff0c;实现了发送消息&#xff0c;添加好友等基础功能。代码开源&#xff0c;功能简洁&#xff0c;如果您有类似开发需求可以参考。 源码地址&#xff1a;https://github.c…