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
支持以下协议的光流传感器:
- AP_OpticalFlow_PX4Flow
- AP_OpticalFlow_Pixart
- AP_OpticalFlow_Onboard
- AP_OpticalFlow_CXOF
- AP_OpticalFlow_MAV
- AP_OpticalFlow_HereFlow
- AP_OpticalFlow_MSP
- AP_OpticalFlow_UPFLOW
- 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,
};
具体实现,详见以下对应驱动类:
- AP_OpticalFlow_PX4Flow
- AP_OpticalFlow_Pixart
- AP_OpticalFlow_Onboard
- AP_OpticalFlow_CXOF
- AP_OpticalFlow_MAV
- AP_OpticalFlow_HereFlow
- AP_OpticalFlow_MSP
- AP_OpticalFlow_UPFLOW
- 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框架中的一个特殊文件,用于定义共享的设置、夹具(fixture)和钩子函数(hook)。 在pytest中,conftest.py文件可以用于在整个测试项目中共享夹具、配置和钩子函数。通过在conftest.py文…...
completablefuture的使用
CompletableFuture使用详解 【Java异常】Variable used in lambda expression should be final or effectively final CompletableFuture原理与实践-外卖商家端API的异步化 项目描述 项目接口需要从下游多个接口获取数据,并且下游的网络不稳定还会涉及到循环调用…...
51单片机的时钟系统
1.简介 51内置的时钟系统可以用来计时,与主程序分割开来,在计时过程中不会终端主程序,还可以通过开启时钟中断来执行相应的操作。 2.单片机工作方式 单片机内部有两个十六位的定时器T0和T1。每个定时器有两种工作方式选择,分别…...
神经网络的问题总结
神经网络目前可以分为以下几类问题,每类问题都有其特点和不断取得的进展: 分类问题: 特点:在给定一组数据点的情况下,将它们分为不同的类别。进展:神经网络在图像分类、文本分类、音频分类等方面取得了显著…...
树莓派图像处理基础知识
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、基本函数1. cvtColor(src,tmp,COLOR_BGR2RGB);2.在OpenCV和Qt中,转换cv::Mat到QImage3.Canny(tmp,dst,30,255);4.dst matframe.clone();5.video…...
Kotlin中的Lambda表达式基本定义和使用
在Kotlin中,Lambda表达式是一种简洁的方式来定义匿名函数。Lambda表达式可以作为函数的实际参数或者返回值,使得函数成为高阶函数。本篇博客将介绍Lambda表达式的基本概念以及使用方法,并提供相关的示例代码。 Lambda表达式的基本概念 Lamb…...
递福巴士是不是骗局呢?
递福巴士的背景介绍 递福巴士是社区服务机构软件。递福巴士是一家提供公益服务的平台,为社区居民提供各种服务和支持的软件。多年来,递福巴士一直致力于社区服务和社会公益,积极推动社区的发展,改善社区居民的生活质量。 递福巴士…...
torch.Size([])与torch.Size([0])的区别
在PyTorch中,torch.Size([])和torch.Size([0])都表示一个空的维度(dimension)。然而,它们之间有微妙的区别。 torch.Size([]): 表示一个标量(scalar),即一个没有维度的张量。这个张量…...
DP基础相关笔记
基础 DP LIS LIS(Longest Increasing Subsequence),顾名思义,就是最长上升子序列问题。 在这里我们要区分一下子串和子序列的区别,很简单,子串连续,子序列可以不连续。然而就在几小时之前本蒟…...
配置公网和私网用户通过非公网口的IP地址访问内部服务器和Internet示例
组网需求 如配置公网和私网用户通过非公网口的IP地址访问内部服务器和Internet示例所示,某小型企业内网部署了一台路由器、一台FTP服务器和一台Web服务器。路由器作为接入网关,为下挂的内网用户提供上网服务,主要包括浏览网页、使用即时通信…...
相机镜头选择与机器视觉控制
相机镜头选择与机器视觉控制 在机器视觉领域,除了图像处理和算法,还需要关注硬件方面的选型和控制。相机镜头的选择是其中重要的一部分,需要考虑像素大小、镜头焦距等因素以满足项目需求。此外,编程技能也包括相机的调用和使用&a…...
Git 为文件添加执行权限
背景 当你是一台Linux,想要给文件加权限很简单,只需要执行以下命令 chmod x filename就可以给文件添加执行权限,但是如果你是Windows那就很麻烦了 解决方案 假设这里有一个名为 file.sh 的文件,内容如下: #!/bin/…...
问题记录:GPU显卡提高后,代码总体运行效率没有提高
问题:GPU显卡提高后,代码总体运行效率没有提高 原先显卡NIVIDA T400换成NVIDIA RTX A4000,CUDA核心(物理GPU线程单位)从三百多提升到了六千多,但是程序总体运行的时间没有变化。 原因分析 显卡没用上或者…...
Reparameterization trick(重参数化技巧)
“Reparameterization trick”(重参数化技巧)是一种在训练生成模型中处理随机性潜在变量的方法,特别常见于变分自动编码器(VAE)等模型中。这个技巧的目的是使模型可微分(differentiable)&#x…...
Kotlin中的可空类型
在 Kotlin 中,可空类型是一项重要的特性,它允许我们声明变量可以为空。在本篇博客中,我们将介绍 Kotlin 中的可空类型,并提供示例代码演示如何处理可空变量、使用安全调用操作符(?.)、Elvis 运算符&#x…...
数学建模——最大流问题(配合例子说明)
目录 一、最大流有关的概念 例1 1、容量网络的定义 2、符号设置 3、建立模型 3.1 每条边的容量限制 3.2 平衡条件 3.3 网络的总流量 4、网络最大流数学模型 5、计算 二、最小费用流 例2 【符号说明】 【建立模型】 (1)各条边的流量限制 &a…...
AAOS CarMediaService 服务框架
文章目录 前言MediaSessionCarMediaService作用是什么?提供了哪些接口?如何使用?CarMediaService的实现总结 前言 CarMediaService 是AAOS中统一管理媒体播放控制、信息显示和用户交互等功能的服务。这一服务依赖于android MediaSession框架…...
gRPC之gRPC转换HTTP
1、gRPC转换HTTP 我们通常把RPC用作内部通信,而使用Restful Api进行外部通信。为了避免写两套应用,我们使用grpc- gateway 把gRPC转成HTTP。服务接收到HTTP请求后,grpc-gateway把它转成gRPC进行处理,然后以JSON 形式返回数据。…...
PyTorch模型部署提速33%:手把手教你合并Conv与BN层(附完整代码)
PyTorch模型部署提速33%:手把手教你合并Conv与BN层(附完整代码) 在移动端和边缘计算场景中,AI模型的推理速度直接影响用户体验。当ResNet50在GTX 1080Ti上的推理时间从11.03ms降到7.3ms时,这33%的性能提升可能意味着实…...
FPGA开发者必看:手把手教你用Verilog实现HDMI 1.4视频输出(基于Zynq 7020)
FPGA实战:基于Zynq 7020的HDMI 1.4发送器全流程开发指南 当我们需要在Zynq 7020的PL端实现HDMI输出时,面临的第一个挑战是如何将协议文档中的理论转化为可综合的RTL代码。本文将带你从TMDS编码器设计开始,逐步构建完整的HDMI发送系统…...
揭秘微软内部文档未披露的EF Core 10向量扩展架构:IL织入机制、Span<T>向量化查询优化与HNSW索引绑定原理
第一章:Entity Framework Core 10 向量搜索扩展 插件下载与安装Entity Framework Core 10 向量搜索扩展(EFCore.VectorSearch)是一个开源插件,专为在 EF Core 应用中无缝集成向量相似性检索能力而设计,支持 PostgreSQL…...
如何在Windows上运行iOS应用:ipasim模拟器完整使用指南
如何在Windows上运行iOS应用:ipasim模拟器完整使用指南 【免费下载链接】ipasim iOS emulator for Windows 项目地址: https://gitcode.com/gh_mirrors/ip/ipasim 你是否曾经想过在Windows电脑上直接运行iOS应用?ipasim作为一款专为Windows平台设…...
2026年版|Java开发者转型大模型开发:从入门到实践(小白必收藏)
在2026年AI技术全面爆发的当下,大模型开发早已从“前沿热点”变成“行业刚需”,无论是互联网大厂还是中小企业,都在疯狂布局大模型相关业务。作为一名深耕Java后端多年的开发者,我每天都会收到同行和小白的提问:传统Ja…...
DbVisualizer Pro永久激活指南:从JRE配置到license生成(Linux版)
DbVisualizer Pro在Linux系统下的高效配置与授权管理指南 引言 对于数据库开发人员和管理员来说,DbVisualizer Pro无疑是一款功能强大的跨平台数据库工具。它支持几乎所有主流数据库系统,提供了直观的图形界面和丰富的功能集。然而,在Linux…...
告别模式困惑:深入解读Mellanox VPI网卡的LINK_TYPE_P1参数与网络协议栈选择
告别模式困惑:深入解读Mellanox VPI网卡的LINK_TYPE_P1参数与网络协议栈选择 在数据中心和云计算环境中,网络性能往往是决定整体系统效率的关键因素。Mellanox的VPI(Virtual Protocol Interconnect)网卡以其独特的双模设计&#x…...
不到百元捡漏乐视Astra Pro深度摄像头,手把手教你用Python+OpenCV玩转深度图与彩色图
不到百元捡漏乐视Astra Pro深度摄像头,手把手教你用PythonOpenCV玩转深度图与彩色图 去年在二手平台淘到一台乐视Astra Pro深度摄像头时,我完全没想到这个不到百元的小设备能带来这么多可能性。作为一款曾经售价数千元的专业设备,它现在以极…...
从Courant-Fischer到Weyl不等式:用Python可视化理解Hermite矩阵特征值扰动
从Courant-Fischer到Weyl不等式:用Python可视化理解Hermite矩阵特征值扰动 在数值计算和机器学习领域,矩阵特征值的稳定性分析是一个常被忽视却至关重要的课题。想象你正在训练一个深度神经网络,权重矩阵的微小扰动会导致模型性能的剧烈波动吗…...
Windows 11任务栏歌词终极解决方案:免打扰沉浸式听歌体验
Windows 11任务栏歌词终极解决方案:免打扰沉浸式听歌体验 【免费下载链接】Taskbar-Lyrics BetterNCM插件,在任务栏上嵌入歌词,目前仅建议Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar-Lyrics 还在为听歌时频繁切…...
