ArduPilot开源代码之AP_OpticalFlow_CXOF

ArduPilot开源代码之AP_OpticalFlow_CXOF

  • 1. 源由
  • 2. Library设计
  • 3. 重要例程
    • 3.1 AP_OpticalFlow_CXOF::init
    • 3.2 AP_OpticalFlow_CXOF::update
    • 3.3 AP_OpticalFlow_CXOF::detect
  • 4. 总结
  • 5. 参考资料

1. 源由

AP_OpticalFlow_CXOF是就是一个光流计,与前面传感模块:MATEKSYS Optical Flow & LIDAR 3901-L0X不一样。

MATEKSYS Optical Flow & LIDAR 3901-L0X不仅仅只有一个光流计,还有一个Lidar高度计。而本次研读的是基于CXOF串口协议的光流传感器。

2. Library设计

设备相关的重要函数:

  • init
  • update
  • detect
class AP_OpticalFlow_CXOF : public OpticalFlow_backend
{
public:/// 构造函数AP_OpticalFlow_CXOF(AP_OpticalFlow &_frontend, AP_HAL::UARTDriver *uart);// 初始化传感器void init() override;// 从传感器读取最新值并填充 x, y 和 totalsvoid update(void) override;// 检测传感器是否可用static AP_OpticalFlow_CXOF *detect(AP_OpticalFlow &_frontend);private:AP_HAL::UARTDriver *uart;           // 连接到光流传感器的 UARTuint64_t last_frame_us;             // 上次从光流传感器接收到消息的系统时间uint8_t buf[10];                    // 从光流传感器接收到的字符缓冲区uint8_t buf_len;                    // 缓冲区中的字符数Vector2f gyro_sum;                  // 自上次从光流传感器接收到消息以来的陀螺仪传感器值的总和uint16_t gyro_sum_count;            // 陀螺仪传感器值总和中的数量
};

3. 重要例程

3.1 AP_OpticalFlow_CXOF::init

模块默认波特率19200 bps。

// initialise the sensor
void AP_OpticalFlow_CXOF::init()
{// sanity check uartif (uart == nullptr) {return;}// open serial port with baud rate of 19200uart->begin(19200);last_frame_us = AP_HAL::micros();
}

3.2 AP_OpticalFlow_CXOF::update

串口数据采用pull的方式读取,相对来说更占用CPU资源。

[AP_OpticalFlow_MSP](https://blog.csdn.net/lida2003/article/details/140328944)采用Interrupt方式比较节省资源,并且Matek光流计采用了115200 bps的波特率,速度更快,暂用CPU的时间更短。

AP_OpticalFlow_CXOF::update(void)
|
|-- 检查 UART
|   |-- if (uart == nullptr) { return; }
|
|-- 记录陀螺仪值
|   |-- if (gyro_sum_count < 1000)
|       |-- 获取陀螺仪值
|       |-- 累加到 gyro_sum
|       |-- gyro_sum_count++
|
|-- 初始化传感器值
|   |-- int32_t x_sum = 0
|   |-- int32_t y_sum = 0
|   |-- uint16_t qual_sum = 0
|   |-- uint16_t count = 0
|
|-- 读取串口缓冲区的可用字符
|   |-- int16_t nbytes = uart->available()
|   |-- while (nbytes-- > 0)
|       |-- 读取字符
|       |-- if (buf_len == 0)
|       |   |-- 检查是否为帧头
|       |-- else
|           |-- 添加字符到缓冲区
|           |-- if (buf_len >= CXOF_FRAME_LENGTH)
|               |-- 检查帧尾
|               |-- 解码数据包
|               |-- 累加 x_sum, y_sum, qual_sum 和 count
|               |-- 清空缓冲区
|
|-- 无读数则返回
|   |-- if (count == 0) { return; }
|
|-- 计算状态
|   |-- 创建 state 结构体
|   |-- 计算表面质量
|   |-- 计算 dt
|   |-- if (is_positive(dt) && (dt < CXOF_TIMEOUT_SEC))
|       |-- 计算流量值
|       |-- 复制到 state 结构体
|       |-- 复制机体速率到 state 结构体
|       |-- 调用 _applyYaw(state.flowRate)
|   |-- else
|       |-- 将流量值和机体速率置零
|
|-- 调用 _update_frontend(state)
|
|-- 重置陀螺仪和计数器
|   |-- gyro_sum.zero()
|   |-- gyro_sum_count = 0

3.3 AP_OpticalFlow_CXOF::detect

AP_OpticalFlow初始化的内容直接放到了detect函数实现。

// detect the device
AP_OpticalFlow_CXOF *AP_OpticalFlow_CXOF::detect(AP_OpticalFlow &_frontend)
{AP_SerialManager *serial_manager = AP::serialmanager().get_singleton();if (serial_manager == nullptr) {return nullptr;}// look for first serial driver with protocol defined as OpticalFlowAP_HAL::UARTDriver *uart = serial_manager->find_serial(AP_SerialManager::SerialProtocol_OpticalFlow, 0);if (uart == nullptr) {return nullptr;}// we have found a serial port so use itAP_OpticalFlow_CXOF *sensor = new AP_OpticalFlow_CXOF(_frontend, uart);return sensor;
}

4. 总结

CXOF是一种光流计协议,但是协议使用的方式来看,效率偏低,并不推荐。

5. 参考资料

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

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

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

相关文章

【网络】为什么SCTP四次握手可以抵御SYN攻击

深入理解SCTP的安全性&#xff1a;从四次握手到抵御SYN攻击 引言 在网络通信的世界中&#xff0c;安全性和可靠性是至关重要的。传统的TCP&#xff08;传输控制协议&#xff09;在建立连接时使用三次握手&#xff0c;但这种机制存在一些安全漏洞&#xff0c;比如SYN攻击。而S…

解决IDEA每次新建项目都需要重新配置maven的问题

每次打开IDEA都要重新配置maven&#xff0c;这是因为在DEA中分为项目设置和全局设置&#xff0c;这个时候我们就需要去到全局中设置maven了。我用的是IntelliJ IDEA 2023.3.4 (Ultimate Edition)&#xff0c;以此为例。 第一步&#xff1a;打开一个空的IDEA&#xff0c;选择左…

数据结构day6链式队列

主程序 #include "fun.h" int main(int argc, const char *argv[]) { que_p Qcreate(); enqueue(Q,10); enqueue(Q,20); enqueue(Q,30); enqueue(Q,40); enqueue(Q,50); show_que(Q); dequeue(Q); show_que(Q); printf(&qu…

stm32按键设置闹钟数进退位不正常?如何解决

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

A63 STM32_HAL库函数 之 Uart通用驱动 -- B -- 所有函数的介绍及使用

A63 STM32_HAL库函数 之 Uart通用驱动 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.15 HAL_UART_DMAResume1.16 HAL_UART_DMAStop1.17 HAL_UART_Abort1.18 HAL_UART_AbortTransmit1.19 HAL_UART_AbortReceive1.20 HAL_UART_Abort_IT1.21 HAL_UART_AbortTransmit_IT1.22 HA…

【Zoom安全解析】深入Zoom的端到端加密机制

标题&#xff1a;【Zoom安全解析】深入Zoom的端到端加密机制 在远程工作和在线会议变得越来越普及的今天&#xff0c;视频会议平台的安全性成为了用户关注的焦点。Zoom作为全球领先的视频会议软件&#xff0c;其端到端加密&#xff08;E2EE&#xff09;功能保证了通话的安全性…

李彦宏: 开源模型是智商税|马斯克: OpenAI 闭源不如叫 CloseAI

在 2024 年世界人工智能大会&#xff08;WAIC 2024&#xff09;上&#xff0c;百度创始人、董事长兼首席执行官李彦宏发表对开源模型的评价。 李彦宏认为&#xff1a;开源模型实际上是一种智商税&#xff0c;而闭源模型才是人工智能&#xff08;AI&#xff09;行业的未来。 马…

python库 - sentencepiece

SentencePiece 是一个开源的文本处理库&#xff0c;由 Google 开发&#xff0c;专门用于处理和生成无监督的文本符号化&#xff08;tokenization&#xff09;模型。它支持字节对编码&#xff08;BPE&#xff09;和 Unigram 语言模型两种主要的符号化算法&#xff0c;广泛应用于…

关于es中的kibana中的一些常用操作命令语句

1、查询某个索引的文档数据 get /index_name/_search2、根据某个索引下的具体某个字段的值来查询数据&#xff0c;这里比如说是&#xff1a;根据就modelId 1787774412315766785来查询数据 GET /index_name/_search {"query": {"term": {"modelId&q…

如何批量更改很多个文件夹里的文件名中包含文件夹名?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【学术会议征稿】第五届大数据、人工智能与物联网工程国际会议

第五届大数据、人工智能与物联网工程国际会议 2024 5th International Conference on Big Data, Artificial Intelligence and Internet of Things 第五届大数据、人工智能与物联网工程国际会议&#xff08;ICBAIE 2024&#xff09;定于2024年10月25-27号在中国深圳隆重举行。…

SIFT代码,MATLAB

SIFT特征详解 - Brook_icv - 博客园 (cnblogs.com) 这一篇文章写的挺好的&#xff0c;个人觉得&#xff0c;大家感兴趣的话可以看一下&#xff0c;但是有一些地方个人觉得还是没有讲的很清楚。 代码下载路径&#xff1a; https://pan.baidu.com/s/1c_NULsDrF3nH6xTmC1cY2Q 提…

【系统架构设计师】计算机组成与体系结构 ⑪ ( 数据传输控制方式 | 程序直接控制方式 | 中断控制方式 | 直接内存访问方式 )

文章目录 一、数据传输控制方式1、IO 设备数据传输2、数据传输控制方式 二、程序直接控制方式 ( 重点考点 )1、无条件传送 和 程序查询方式2、程序查询方式3、程序直接控制方式 的 优缺点 三、程序中断方式1、程序中断方式 流程2、程序中断方式 优缺点 四、DMA 方式1、DMA 简介…

好用的声音分析的软件和网站

有许多软件和网站可以帮助进行声音分析&#xff0c;从专业级的音频处理软件到在线工具&#xff0c;以下是一些推荐&#xff1a; 专业音频分析软件 Audacity 开源且免费的音频编辑和分析工具。提供基本的音频录制、编辑和分析功能。支持多种插件&#xff0c;扩展其功能。 Adob…

项目实战--Spring Boot 3整合Flink实现大数据文件处理

一、应用背景 公司大数据项目中&#xff0c;需要构建和开发高效、可靠的数据处理子系统&#xff0c;实现大数据文件处理、整库迁移、延迟与乱序处理、数据清洗与过滤、实时数据聚合、增量同步&#xff08;CDC&#xff09;、状态管理与恢复、反压问题处理、数据分库分表、跨数据…

把 .py 文件编译成 .pyd 文件

将 .py 文件编译成 .pyd 文件&#xff08;在Windows上&#xff09;或 .so 文件&#xff08;在Linux或macOS上&#xff09;&#xff0c;实际上是将Python代码编译成一种可以被Python解释器直接加载的二进制模块。这种编译过程通常使用cython、pyinstaller的钩子&#xff08;hook…

JRT打印药敏报告

最近没写jrt系列博客&#xff0c;不是中途而废了。而是在写微生物系统。今天终于把微生物大体完成了&#xff0c;伴随着业务的实现&#xff0c;框架趋于完善和稳定。构建一套完美而强大的打印体系一直是我的理想&#xff0c;从最开始C#的winform打印控件到刚接触bs时候用js打印…

day11:文件处理

一、文件与文件模式介绍 1、什么是文件 文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口 用户/应用程序(open()) 操作系统&#xff08;文件&#xff09; 计算机硬件&#xff08;硬盘&#xff09;2、为何要用文件 ①用户/应用程序可以通过文件将数据永久保存…

【最强八股文 -- 计算机网络】【快速版】DNS 解析过程

步骤一&#xff1a;查询浏览器及计算机本地 HOST 文件中是否有对应的 缓存 步骤二&#xff1a;请求本地 DNS 服务器 (无则请求 根级 获取能提供信息的权威 DNS 服务器 ) 步骤三&#xff1a;逐级返回对应的 IP 至浏览器 步骤四&#xff1a;浏览器发起连接并缓存 参考资料&#x…

通过Arcgis从逐月平均气温数据中提取并计算年平均气温

通过Arcgis快速将逐月平均气温数据生成年平均气温数据。本次用2020年逐月平均气温数据操作说明。 一、准备工作 &#xff08;1&#xff09;准备Arcmap桌面软件&#xff1b; &#xff08;2&#xff09;准备2020年逐月平均气温数据&#xff08;NC格式&#xff09;、范围图层数据&…