ArduPilot开源代码之OpticalFlow_backend

ArduPilot开源代码之OpticalFlow_backend

  • 1. 源由
  • 2. Library设计
  • 3. 重要例程
    • 3.1 OpticalFlow_backend::_update_frontend
    • 3.2 OpticalFlow_backend::_applyYaw
  • 4. 总结
  • 5. 参考资料

1. 源由

光流计是一种低成本定位传感器,所有的光流计设备传感驱动代码抽象公共部分统一由OpticalFlow_backend实现。设计的核心思想是将光流传感器的具体实现与其前端接口分离开来,通过纯虚函数和友元类的机制,实现了灵活且可扩展的架构。

2. Library设计

OpticalFlow_backend类是一个抽象基类,用于表示光流传感器的后端实现。它包含了一些基本的接口函数,如初始化、更新和消息处理函数。

  1. 公共部分使用虚函数,根据不同硬件传感设备进行实现;
  • init函数是一个虚函数,允许子类在必要时重写初始化过程。
  • update函数是一个纯虚函数,强制所有子类必须实现自己的更新逻辑。
  • handle_msghandle_msp函数用于处理不同类型的消息,提供了默认的空实现,子类可以根据需要进行重写。
  1. 保护部分直接抽象的公共部分的函数实现,如访问前端对象、更新前端状态、获取缩放参数、计算偏航角等。
  2. AP_OpticalFlow类被声明为友元类,允许它访问OpticalFlow_backend的私有和保护成员。这表示AP_OpticalFlow可能是该后端类的管理类或控制类。
  3. **CLASS_NO_COPY(OpticalFlow_backend)**是一个宏,用于禁止该类的拷贝构造和赋值操作,确保每个对象都是唯一的。
class OpticalFlow_backend
{// 将AP_OpticalFlow类声明为友元类,允许其访问OpticalFlow_backend的私有成员friend class AP_OpticalFlow;public:// 构造函数,接受一个AP_OpticalFlow对象的引用OpticalFlow_backend(AP_OpticalFlow &_frontend);// 虚析构函数,允许子类重写virtual ~OpticalFlow_backend(void);// 禁止拷贝构造和拷贝赋值操作CLASS_NO_COPY(OpticalFlow_backend);// 初始化传感器的函数,默认实现为空virtual void init() {}// 从传感器读取最新的值并填充x, y和totals的纯虚函数,必须在子类中实现virtual void update() = 0;// 处理光流的mavlink消息的虚函数,默认实现为空virtual void handle_msg(const mavlink_message_t &msg) {}#if HAL_MSP_OPTICALFLOW_ENABLED// 处理光流的msp消息的虚函数,默认实现为空virtual void handle_msp(const MSP::msp_opflow_data_message_t &pkt) {}
#endifprotected:// 前端对象的引用AP_OpticalFlow &frontend;// 更新前端状态的函数void _update_frontend(const struct AP_OpticalFlow::OpticalFlow_state &state);// 获取光流缩放参数的函数,返回一个包含X和Y轴缩放因子的向量Vector2f _flowScaler(void) const { return Vector2f(frontend._flowScalerX, frontend._flowScalerY); }// 获取以弧度表示的偏航角的函数float _yawAngleRad(void) const { return radians(float(frontend._yawAngle_cd) * 0.01f); }// 应用偏航角到一个向量上的函数void _applyYaw(Vector2f &v);// 获取ADDR参数值的函数uint8_t get_address(void) const { return frontend._address; }// 用于访问共享前端数据的信号量HAL_Semaphore _sem;
};

3. 重要例程

3.1 OpticalFlow_backend::_update_frontend

// update the frontend
void OpticalFlow_backend::_update_frontend(const struct AP_OpticalFlow::OpticalFlow_state &state)
{frontend.update_state(state);
}

3.2 OpticalFlow_backend::_applyYaw

// apply yaw angle to a vector
void OpticalFlow_backend::_applyYaw(Vector2f &v)
{float yawAngleRad = _yawAngleRad();if (is_zero(yawAngleRad)) {return;}v.rotate(yawAngleRad);
}

4. 总结

OpticalFlow_backend继承出来的硬件传感设备在Ardupilot上,目前有以下几类设备:

  • AP_OpticalFlow_CXOF
  • AP_OpticalFlow_HereFlow
  • AP_OpticalFlow_MAV
  • AP_OpticalFlow_MSP
  • AP_OpticalFlow_Onboard
  • AP_OpticalFlow_Pixart
  • AP_OpticalFlow_PX4Flow
  • AP_OpticalFlow_SITL
  • AP_OpticalFlow_UPFLOW

MATEKSYS Optical Flow & LIDAR 3901-L0X是其中的一种。

  • 传感模块:MATEKSYS Optical Flow & LIDAR 3901-L0X
  • [ArduPilot开源代码之MatekSys Optical Flow 3901-L0X](ArduPilot开源代码之MatekSys Optical Flow 3901-L0X)
  • ArduPilot开源飞控之AP_OpticalFlow

5. 参考资料

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

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

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

相关文章

[计网初识1] TCP/UDP

学习内容 1.TCP建立链接的3次握手,断开连接的4次挥手 2.TCP报文段组成 内容 1.TCP 建立连接的3次握手? 假设主动方是客户端,被动方是服务端。 第一次 客户端给服务端发送 “hello,我是客户端” (TCP段中 SYN1) 第二次 服务端给客户端发送"我接…

从零开始的python学习生活2

接上封装 class Phone:__volt0.5def __keepsinglecore(self):print("让cpu以单核运行")def if5G(self):if self.__volt>1:print("5G通话已开启")else:self.__keepsinglecore()print("电量不足,无法使用5G通话,已经设置为单…

Django项目创建的准备工作【 2 】

【 一 】调整后端目录 #1 目录结构 """ ├── luffy_api├── logs/ # 项目运行时/开发时日志目录 - 包├── manage.py # 脚本文件├── luffy_api/ # 项目主应用,开发时的代码保存 - 包├── apps/ …

【Git基本操作】添加文件 | 修改文件 | 及其各场景下.git目录树的变化

目录 1. 添加文件&add操作和commit操作 2. .git树状目录的变化 3. git其他操作 4. 修改文件 4.1 git status 4.2 git diff 1. 添加文件&add操作和commit操作 add操作:将工作区中所有文件的修改内容 添加进版本库的暂存区中。commit操作:…

云端编码:将您的技术API文档安全存储在iCloud的最佳实践

云端编码:将您的技术API文档安全存储在iCloud的最佳实践 作为一名技术专业人士,管理不断增长的API文档库是一项挑战。iCloud提供了一个无缝的解决方案,允许您在所有设备上存储、同步和访问您的个人技术API文档。本文将指导您如何在iCloud中高…

系统服务综合实验(dns服务,nfs服务)

题目:现有主机 node01 和 node02,完成如下需求: 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4…

three-tile: 1. 第一个three-tile程序

上篇介绍了:three-tile: 一个开源的轻量级三维瓦片库-CSDN博客 three-tile 是一个开源的轻量级三维瓦片库,它基于threejs使用typescript开发,提供一个三维地形模型,能轻松给你的应用增加三维瓦片地图。 项目地址&…

C#知识|账号管理系统:UI层-添加账号窗体设计思路及流程。

哈喽,你好啊,我是雷工! 前边练习过详情页窗体的设计思路及流程: 《C#知识|上位机UI设计-详情窗体设计思路及流程(实例)》 本节练习添加账号窗体的UI设计,以下为学习笔记。 01 效果展示 02 添加窗体 在UI层添加Windows窗体,设置名称为:FrmAddAcount.cs 设置窗体属…

Nginx七层(应用层)反向代理:UWSGI代理uwsgi_pass篇

Nginx七层(应用层)反向代理 UWSGI代理uwsgi_pass篇 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this a…

数据结构模板2

Trie树&#xff1a;用来高效存储和查找字符串集合的数据结构&#xff1a; 模板题&#xff1a;https://www.acwing.com/problem/content/837/ AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int son[100010][26],cnt[100010],idx; char str[100010]; …

数据的洞察力:SQL Server Analysis Services在数据分析中的卓越应用

数据的洞察力&#xff1a;SQL Server Analysis Services在数据分析中的卓越应用 在商业智能和数据分析领域&#xff0c;SQL Server Analysis Services (SSAS) 是一款强大的工具&#xff0c;它提供了多维数据和数据挖掘模型的创建、部署和管理功能。本文将深入探讨如何在SQL Se…

云端生活,智能管理:在iCloud中打造您的个人购物清单与预算计划

云端生活&#xff0c;智能管理&#xff1a;在iCloud中打造您的个人购物清单与预算计划 在快节奏的现代生活中&#xff0c;个人财务管理和购物规划变得尤为重要。iCloud提供了一个强大的平台&#xff0c;让我们能够存储、同步和共享个人购物清单与预算计划。本文将详细介绍如何…

代码随想录算法训练营第二十九天

452. 用最少数量的箭引爆气球 这道题目我原本的想法是只要当前的气球半径范围在已有的箭头能够击穿的气球半径内就可以实现 但是 箭射出去的地方是一个值 而不是一个范围 因此有相同的重叠范围的许多气球并一定都有相同的值&#xff0c;因此这种方法不可取 这题的主要局部最…

最短路径算法(算法篇)

算法之最短路径算法 最短路径算法 概念&#xff1a; 考查最短路径问题&#xff0c;可能会输入一个赋权图(也就是边带有权的图)&#xff0c;则一条路径的v1v2…vN的值就是对路径的边的权求和&#xff0c;这叫做赋权路径长&#xff0c;如果是无权路径长就是单纯的路径上的边数。…

mac安装配置cmake

本机是2015 macbook pro mid&#xff0c;已经有点老了&#xff0c;用homebrew下cmake老出问题 其实cmake官网安装也不麻烦 一、官网下载对应安装包 Download CMake 和所有dmg文件一样安装 二、改成命令行使用 一般来说 tutorial 给的都是命令行build 命令行的设置如下&am…

手机下载APP (uniapp/vue)

一、uniapp <template><view class"content"><view class"appName">{{ formData.appName }}</view><view class"appInfo">{{ formData.appInfo }}</view><image class"logo" :src"formDa…

批量修改Git历史commit信息中的username

之前很长一段时间GitHub上的提交都在使用工作账户, 导致私人仓库中的提交者比较混乱. 在StackOver里面找到了一个bash脚本可以批量修改username, 在这里记录一下. 修改的步骤一共两步: 执行修改脚本将本地修改同步到Git服务器 首先我们来看脚本: #!/bin/shgit filter-branch…

SFUZZ模糊测试平台全新升级,从标准到实践助力车企安全出海

开源网安模糊测试平台SFuzz全新升级&#xff0c;参照各国相关标准要求进行针对性建设&#xff0c;可为智能网联汽车信息安全测试提供更为强大的工具支持。SFuzz向被测系统输入大量随机数据&#xff0c;模拟各种异常情况&#xff0c;可以发现被测系统内潜在的缺陷和漏洞&#xf…

Spring中如何操作Redis

Spring毕竟是Java中的一个主流框架&#xff0c;如何在这个框架中使用Redis呢&#xff1f; 创建项目并引入相关依赖 然后进行创建。 至此就将Redis的相关依赖引入进来了。 编写Redis配置 将application.properties修改成application.yml 然后编写如下配置&#xff1a; spr…

usbserver工程师手记(二)设置定时任务

概述 部分银行ukey 长时间不使用后会导致休眠&#xff0c;出现虽然有连接&#xff0c;但是读不到证书&#xff0c;可以用定时重置端口的办法&#xff0c;调用接口 http://ip/usb_server/reset_port,参数为 {"port":"B5-1-2","vid_pid":"09…