实例教程: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,一经查实,立即删除!

相关文章

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

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

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

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

Socket编程-tcp

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

15分钟训练数字人MimicTalk

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

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

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

在 MacOS 上为 LM Studio 更换镜像源

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

vue中.sync修饰符的用法

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

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

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

SHELL----正则表达式

一、文本搜索工具——grep grep -参数 条件 文件名 其中参数有以下: -i 忽略大小写 -c 统计匹配的行数 -v 取反,不显示匹配的行 -w 匹配单词 -E 等价于 egrep ,即启用扩展正则表达式 -n 显示行号 -rl 将指定目录内的文件打…

Can‘t find variable: token(token is not defined)

文章目录 例子 1:使用 var例子 2:使用 let 或 const例子 3:异步操作你的代码中的情况 Cant find variable: tokentoken is not defined源代码 // index.jsPage({data: {products:[],cardLayout: grid, // 默认卡片布局为网格模式isGrid: tr…

【AI系统】GhostNet 系列

GhostNet 系列 本文主要会介绍 GhostNet 系列网络,在本文中会给大家带来卷积结构的改进方面的轻量化,以及与注意力(self-attention)模块的进行结合,部署更高效,更适合移动计算的 GhostNetV2。让读者更清楚的区别 V2 与 V1 之间的…

YOLOv8改进,YOLOv8引入CARAFE轻量级通用上采样算子,助力模型涨点

摘要 CARAFE模块的设计目的是在不增加计算复杂度的情况下,提升特征图的质量,特别是在视频超分辨率任务中,提升图像质量和细节。CARAFE结合了上下文感知机制和聚合特征的能力,通过动态的上下文注意力机制来提升细节恢复的效果。 理论介绍 传统的卷积操作通常依赖于局部区域…

大型制造企业IT蓝图、信息化系统技术架构规划与实施路线方案

关注 获取ppt​​​​​​全文,请关注作者

HTTP 长连接(HTTP Persistent Connection)简介

HTTP长连接怎么看? HTTP 长连接(HTTP Persistent Connection)简介 HTTP 长连接(Persistent Connection)是 HTTP/1.1 的一个重要特性,它允许在一个 TCP 连接上发送多个 HTTP 请求和响应,而无需为…

001集—— 创建一个WPF项目 ——WPF应用程序入门 C#

本例为一个WPF应用&#xff08;.NET FrameWork&#xff09;。 首先创建一个项目 双击xaml文件 双击xaml文件进入如下界面&#xff0c;开始编写代码。 效果如下&#xff1a; 付代码&#xff1a; <Window x:Class"WpfDemoFW.MainWindow"xmlns"http://schema…

微信小程序配置less并使用

1.在VScode中下载Less插件 2.在微信小程序中依次点击如下按钮 选择 从已解压的扩展文件夹安装… 3.选中刚在vscode中下载安装的插件文件 如果没有修改过插件的安装目录&#xff0c;一般是在c盘下C:\用户\用户名.vscode\extensions\mrcrowl.easy-less-2.0.2 我的路径是&#xf…

Vue网页屏保

Vue网页屏保 在vue项目中&#xff0c;如果项目长时间未操作需要弹出屏幕保护程序&#xff0c;以下为网页屏保效果&#xff0c;看板内容为连接的资源。 屏保组件 <template><div v-if"isActive" class"screensaver" click"disableScreens…

【SpringBoot】使用IDEA创建SpringBoot项目

1、使用SpringBoot脚手架创建 我们使用SpringBoot的脚手架Spring Initializr创建&#xff0c;如图所示&#xff1a; 2、选择SpringBoot版本 最开始做项目时候&#xff0c;组长说创建一个 springboot 2.5.4 的项目&#xff0c;mysql使用 5.6.X &#xff0c;maven使用是3.6.X…

如何在鸿蒙API9和x86模拟器中使用MQTT

目录 引言 安装MQTT软件包 避免MQTT软件包自动升级 程序的编写 运行测试 结语 引言 虽然我的课主要是OpenHarmony南向开发的&#xff0c;但是结课时有个同学说他在写鸿蒙APP时无法将MQTT库加入到设备中&#xff0c;希望我帮忙看看。由于他没有鸿蒙的真机&#xff0c;只能…

保姆级教程用vite创建vue3项目并初始化添加PrimeVue UI踩坑实录

文章目录 一、什么是PrimeVue二、详细教程1.添加PrimeVue2.配置main.js3.添加自动引入4.配置vite.config.js5.创建测试页面 一、什么是PrimeVue PrimeVue 是一个用于 Vue.js 3.x 开发的一款高质量、广受欢迎的 Web UI 组件库。 官网地址&#xff1a;https://primevue.org/ 二、…