当前位置: 首页 > news >正文

ArduPilot开源飞控之AP_OpticalFlow

ArduPilot开源飞控之AP_OpticalFlow

  • 1. 源由
  • 2. 框架设计
    • 2.1 启动代码
    • 2.2 任务代码 update
    • 2.3 任务代码 handle_msg
    • 2.4 任务代码 handle_msp
    • 2.5 任务代码 do_aux_function
  • 3. 重要例程
    • 3.1 AP_OpticalFlow
    • 3.2 init
    • 3.3 update
    • 3.4 handle_msg
    • 3.5 handle_msp
    • 3.6 start_calibration
    • 3.7 stop_calibration
  • 4. 总结
  • 5. 参考资料

1. 源由

光流传感器是使用地面纹理和可见特征来确定飞机地面速度的相机模块。

主要应用于室内定位,这里将光流传感应用的代码框架做一个整理。

2. 框架设计

2.1 启动代码

init_ardupilot└──> AP_OpticalFlow::init

2.2 任务代码 update

SCHED_TASK_CLASS(AP_OpticalFlow,          &copter.optflow,             update,         200, 160,  12),└──> AP_OpticalFlow::update

2.3 任务代码 handle_msg

SCHED_TASK_CLASS(GCS,                  (GCS*)&copter._gcs,          update_receive, 400, 180, 102)└──> GCS::update_receive└──> GCS_MAVLINK::update_receive└──> GCS_MAVLINK_Copter::packetReceived└──> GCS_MAVLINK_Copter::handleMessage└──> GCS_MAVLINK::handle_common_message└──> GCS_MAVLINK::handle_optical_flow└──> AP_OpticalFlow::handle_msg

2.4 任务代码 handle_msp

AP_Vehicle::setup└──> AP_MSP::init└──> AP_MSP::loop  //thread_create└──> AP_MSP_Telem_Backend::process_incoming_data└──> AP_MSP_Telem_Backend::msp_process_received_command└──> AP_MSP_Telem_Backend::msp_process_command└──> AP_MSP_Telem_Backend::msp_process_sensor_command└──> AP_MSP_Telem_Backend::msp_handle_opflow└──> AP_OpticalFlow::handle_msp

2.5 任务代码 do_aux_function

Copter::init_ardupilot└──> RC_Channels::init└──> RC_Channels::init_aux_all└──> RC_Channel::init_aux└──> RC_Channel_Copter::init_aux_function└──> RC_Channel::run_aux_function└──> RC_Channel_Copter::do_aux_function└──> RC_Channel::do_aux_function├──> AP_OpticalFlow::start_calibration└──> AP_OpticalFlow::stop_calibration

3. 重要例程

3.1 AP_OpticalFlow

根据变量表进行初始化赋值。

AP_OpticalFlow::AP_OpticalFlow├──> _singleton = this└──> AP_Param::setup_object_defaults(this, var_info)

3.2 init

支持以下协议的光流传感器:

  1. AP_OpticalFlow_PX4Flow
  2. AP_OpticalFlow_Pixart
  3. AP_OpticalFlow_Onboard
  4. AP_OpticalFlow_CXOF
  5. AP_OpticalFlow_MAV
  6. AP_OpticalFlow_HereFlow
  7. AP_OpticalFlow_MSP
  8. AP_OpticalFlow_UPFLOW
  9. AP_OpticalFlow_SITL
AP_OpticalFlow::init├──> _log_bit = log_bit││  /********************************************************************************│   * Pre-check                                                                    *│   ********************************************************************************/│   // return immediately if not enabled or backend already created├──> <(_type == Type::NONE) || (backend != nullptr)>│   └──> return││  /********************************************************************************│   * Sensor detect or configure                                                   *│   ********************************************************************************/├──> <case Type::PX4FLOW> <AP_OPTICALFLOW_PX4FLOW_ENABLED>│   └──> backend = AP_OpticalFlow_PX4Flow::detect(*this)├──> <case Type::PIXART> <AP_OPTICALFLOW_PIXART_ENABLED>│   ├──> backend = AP_OpticalFlow_Pixart::detect("pixartflow", *this)│   └──> <backend == nullptr>│       └──> backend = AP_OpticalFlow_Pixart::detect("pixartPC15", *this)├──> <case Type::BEBOP> <CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_BEBOP>│   └──> backend = new AP_OpticalFlow_Onboard(*this)├──> <case Type::CXOF> <AP_OPTICALFLOW_CXOF_ENABLED>│   └──> backend = AP_OpticalFlow_CXOF::detect(*this)├──> <case Type::MAVLINK> <AP_OPTICALFLOW_MAV_ENABLED>│   └──> backend = AP_OpticalFlow_MAV::detect(*this)├──> <case Type::UAVCAN> <AP_OPTICALFLOW_HEREFLOW_ENABLED>│   └──> backend = new AP_OpticalFlow_HereFlow(*this)├──> <case Type::MSP> <HAL_MSP_OPTICALFLOW_ENABLED>│   └──> backend = AP_OpticalFlow_MSP::detect(*this)├──> <case Type::UPFLOW> <AP_OPTICALFLOW_UPFLOW_ENABLED>│   └──> backend = AP_OpticalFlow_UPFLOW::detect(*this)├──> <case Type::SITL> <AP_OPTICALFLOW_SITL_ENABLED>│   └──> backend = new AP_OpticalFlow_SITL(*this)││  /********************************************************************************│   * Driver init                                                                  *│   ********************************************************************************/└──> <backend != nullptr>└──> backend->init()

3.3 update

光流数据更新及校准。

AP_OpticalFlow::update││  /********************************************************************************│   * Pre-check, exit immediately if not enabled                                   *│   ********************************************************************************/├──> <!enabled()>│   └──> return││  /********************************************************************************│   * Driver update                                                                *│   ********************************************************************************/├──> <backend != nullptr>│   └──> backend->update()││   // only healthy if the data is less than 0.5s old├──> _flags.healthy = (AP_HAL::millis() - _last_update_ms < 500)││  /********************************************************************************│   * Driver calibration                                                           *│   ********************************************************************************/└──> <AP_OPTICALFLOW_CALIBRATOR_ENABLED>│   // update calibrator and save resulting scaling└──> <_calibrator != nullptr> <calibrator->update()>│   // apply new calibration values├──> const Vector2f new_scaling = _calibrator->get_scalars()├──> const float flow_scalerx_as_multiplier = (1.0 + (_flowScalerX * 0.001)) * new_scaling.x├──> const float flow_scalery_as_multiplier = (1.0 + (_flowScalerY * 0.001)) * new_scaling.y├──> _flowScalerX.set_and_save_ifchanged((flow_scalerx_as_multiplier - 1.0) * 1000.0)├──> _flowScalerY.set_and_save_ifchanged((flow_scalery_as_multiplier - 1.0) * 1000.0)├──> _flowScalerX.notify()├──> _flowScalerY.notify()└──> GCS_SEND_TEXT(MAV_SEVERITY_INFO, "FlowCal: FLOW_FXSCALER=%d, FLOW_FYSCALER=%d", (int)_flowScalerX, (int)_flowScalerY)

3.4 handle_msg

处理MAVLink消息。

AP_OpticalFlow::handle_msg││  /********************************************************************************│   * Pre-check, exit immediately if not enabled                                   *│   ********************************************************************************/├──> <!enabled()>│   └──> return││  /********************************************************************************│   * Handle mavlink message                                                       *│   ********************************************************************************/└──> <backend != nullptr>└──> backend->handle_msg(msg)

3.5 handle_msp

处理MSP消息。

AP_OpticalFlow::handle_msp││  /********************************************************************************│   * Pre-check, exit immediately if not enabled                                   *│   ********************************************************************************/├──> <!enabled()>│   └──> return││  /********************************************************************************│   * Handle msp message                                                           *│   ********************************************************************************/└──> <backend != nullptr>└──> backend->handle_msp(pkt)

3.6 start_calibration

开始校准。

void AP_OpticalFlow::start_calibration├──> <_calibrator == nullptr>│   ├──> _calibrator = new AP_OpticalFlow_Calibrator()│   └──> <_calibrator == nullptr>│       ├──> GCS_SEND_TEXT(MAV_SEVERITY_CRITICAL, "FlowCal: failed to start")│       └──> return└──> <_calibrator != nullptr>└──> _calibrator->start()

3.7 stop_calibration

停止校准。

AP_OpticalFlow::stop_calibration└──> <_calibrator != nullptr>└──> _calibrator->stop()

4. 总结

支持9种光流传感器:

enum class Type {NONE = 0,PX4FLOW = 1,PIXART = 2,BEBOP = 3,CXOF = 4,MAVLINK = 5,UAVCAN = 6,MSP = 7,UPFLOW = 8,SITL = 10,
};

具体实现,详见以下对应驱动类:

  1. AP_OpticalFlow_PX4Flow
  2. AP_OpticalFlow_Pixart
  3. AP_OpticalFlow_Onboard
  4. AP_OpticalFlow_CXOF
  5. AP_OpticalFlow_MAV
  6. AP_OpticalFlow_HereFlow
  7. AP_OpticalFlow_MSP
  8. AP_OpticalFlow_UPFLOW
  9. AP_OpticalFlow_SITL

5. 参考资料

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

相关文章:

ArduPilot开源飞控之AP_OpticalFlow

ArduPilot开源飞控之AP_OpticalFlow 1. 源由2. 框架设计2.1 启动代码2.2 任务代码 update2.3 任务代码 handle_msg2.4 任务代码 handle_msp2.5 任务代码 do_aux_function 3. 重要例程3.1 AP_OpticalFlow3.2 init3.3 update3.4 handle_msg3.5 handle_msp3.6 start_calibration3.…...

RHCE8 资料整理(二)

RHCE8 资料整理 第二篇 用户及权限管理第8章 用户管理8.1 基本概念8.2 管理用户8.2.1 创建用户8.2.2 修改用户属性 8.3 用户的密码策略8.4 用户授权8.5 重置root密码 第9章 权限管理9.1 所有者和所属组9.2 查看及修改权限9.3 数字权限9.4 默认权限9.5 特殊权限9.6 隐藏权限 第1…...

pytest合集(11)— conftest.py文件

1、conftest.py文件 conftest.py文件是pytest框架中的一个特殊文件&#xff0c;用于定义共享的设置、夹具(fixture)和钩子函数&#xff08;hook&#xff09;。 在pytest中&#xff0c;conftest.py文件可以用于在整个测试项目中共享夹具、配置和钩子函数。通过在conftest.py文…...

completablefuture的使用

CompletableFuture使用详解 【Java异常】Variable used in lambda expression should be final or effectively final CompletableFuture原理与实践-外卖商家端API的异步化 项目描述 项目接口需要从下游多个接口获取数据&#xff0c;并且下游的网络不稳定还会涉及到循环调用…...

51单片机的时钟系统

1.简介 51内置的时钟系统可以用来计时&#xff0c;与主程序分割开来&#xff0c;在计时过程中不会终端主程序&#xff0c;还可以通过开启时钟中断来执行相应的操作。 2.单片机工作方式 单片机内部有两个十六位的定时器T0和T1。每个定时器有两种工作方式选择&#xff0c;分别…...

神经网络的问题总结

神经网络目前可以分为以下几类问题&#xff0c;每类问题都有其特点和不断取得的进展&#xff1a; 分类问题&#xff1a; 特点&#xff1a;在给定一组数据点的情况下&#xff0c;将它们分为不同的类别。进展&#xff1a;神经网络在图像分类、文本分类、音频分类等方面取得了显著…...

树莓派图像处理基础知识

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、基本函数1. cvtColor(src,tmp,COLOR_BGR2RGB);2.在OpenCV和Qt中&#xff0c;转换cv::Mat到QImage3.Canny(tmp,dst,30,255);4.dst matframe.clone();5.video…...

Kotlin中的Lambda表达式基本定义和使用

在Kotlin中&#xff0c;Lambda表达式是一种简洁的方式来定义匿名函数。Lambda表达式可以作为函数的实际参数或者返回值&#xff0c;使得函数成为高阶函数。本篇博客将介绍Lambda表达式的基本概念以及使用方法&#xff0c;并提供相关的示例代码。 Lambda表达式的基本概念 Lamb…...

递福巴士是不是骗局呢?

递福巴士的背景介绍 递福巴士是社区服务机构软件。递福巴士是一家提供公益服务的平台&#xff0c;为社区居民提供各种服务和支持的软件。多年来&#xff0c;递福巴士一直致力于社区服务和社会公益&#xff0c;积极推动社区的发展&#xff0c;改善社区居民的生活质量。 递福巴士…...

torch.Size([])与torch.Size([0])的区别

在PyTorch中&#xff0c;torch.Size([])和torch.Size([0])都表示一个空的维度&#xff08;dimension&#xff09;。然而&#xff0c;它们之间有微妙的区别。 torch.Size([])&#xff1a; 表示一个标量&#xff08;scalar&#xff09;&#xff0c;即一个没有维度的张量。这个张量…...

DP基础相关笔记

基础 DP LIS LIS&#xff08;Longest Increasing Subsequence&#xff09;&#xff0c;顾名思义&#xff0c;就是最长上升子序列问题。 在这里我们要区分一下子串和子序列的区别&#xff0c;很简单&#xff0c;子串连续&#xff0c;子序列可以不连续。然而就在几小时之前本蒟…...

配置公网和私网用户通过非公网口的IP地址访问内部服务器和Internet示例

组网需求 如配置公网和私网用户通过非公网口的IP地址访问内部服务器和Internet示例所示&#xff0c;某小型企业内网部署了一台路由器、一台FTP服务器和一台Web服务器。路由器作为接入网关&#xff0c;为下挂的内网用户提供上网服务&#xff0c;主要包括浏览网页、使用即时通信…...

相机镜头选择与机器视觉控制

相机镜头选择与机器视觉控制 在机器视觉领域&#xff0c;除了图像处理和算法&#xff0c;还需要关注硬件方面的选型和控制。相机镜头的选择是其中重要的一部分&#xff0c;需要考虑像素大小、镜头焦距等因素以满足项目需求。此外&#xff0c;编程技能也包括相机的调用和使用&a…...

Git 为文件添加执行权限

背景 当你是一台Linux&#xff0c;想要给文件加权限很简单&#xff0c;只需要执行以下命令 chmod x filename就可以给文件添加执行权限&#xff0c;但是如果你是Windows那就很麻烦了 解决方案 假设这里有一个名为 file.sh 的文件&#xff0c;内容如下&#xff1a; #!/bin/…...

问题记录:GPU显卡提高后,代码总体运行效率没有提高

问题&#xff1a;GPU显卡提高后&#xff0c;代码总体运行效率没有提高 原先显卡NIVIDA T400换成NVIDIA RTX A4000&#xff0c;CUDA核心&#xff08;物理GPU线程单位&#xff09;从三百多提升到了六千多&#xff0c;但是程序总体运行的时间没有变化。 原因分析 显卡没用上或者…...

Reparameterization trick(重参数化技巧)

“Reparameterization trick”&#xff08;重参数化技巧&#xff09;是一种在训练生成模型中处理随机性潜在变量的方法&#xff0c;特别常见于变分自动编码器&#xff08;VAE&#xff09;等模型中。这个技巧的目的是使模型可微分&#xff08;differentiable&#xff09;&#x…...

Kotlin中的可空类型

在 Kotlin 中&#xff0c;可空类型是一项重要的特性&#xff0c;它允许我们声明变量可以为空。在本篇博客中&#xff0c;我们将介绍 Kotlin 中的可空类型&#xff0c;并提供示例代码演示如何处理可空变量、使用安全调用操作符&#xff08;?.&#xff09;、Elvis 运算符&#x…...

数学建模——最大流问题(配合例子说明)

目录 一、最大流有关的概念 例1 1、容量网络的定义 2、符号设置 3、建立模型 3.1 每条边的容量限制 3.2 平衡条件 3.3 网络的总流量 4、网络最大流数学模型 5、计算 二、最小费用流 例2 【符号说明】 【建立模型】 &#xff08;1&#xff09;各条边的流量限制 &a…...

AAOS CarMediaService 服务框架

文章目录 前言MediaSessionCarMediaService作用是什么&#xff1f;提供了哪些接口&#xff1f;如何使用&#xff1f;CarMediaService的实现总结 前言 CarMediaService 是AAOS中统一管理媒体播放控制、信息显示和用户交互等功能的服务。这一服务依赖于android MediaSession框架…...

gRPC之gRPC转换HTTP

1、gRPC转换HTTP 我们通常把RPC用作内部通信&#xff0c;而使用Restful Api进行外部通信。为了避免写两套应用&#xff0c;我们使用grpc- gateway 把gRPC转成HTTP。服务接收到HTTP请求后&#xff0c;grpc-gateway把它转成gRPC进行处理&#xff0c;然后以JSON 形式返回数据。…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…...