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 形式返回数据。…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
