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设计

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

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

相关文章

代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II

LeetCode T491 递增子序列 题目链接:491. 递增子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 首先这里的测试用例很容易误导我们,这道题不能使用上次子集的思路对数组先排序,使用一个used数组来解决问题. 我们用[4,7,6,7]举例这道题的递增序列不存在[4,6,7,7]这个…

合同管理系统

合同管理系统 功能介绍&#xff1a; 功能特性&#xff1a; 根据对合同管理系统系统分析合同管理由以下模块组成&#xff0c;相对方管理、合同文本管理、合同审批管理、合同履行审批、风险事件管理、合同查询、合同统计、系统提醒、系统管理。 1、相对方管理 1.有“相对方…

SpringBoot环境搭建与初创程序

一&#xff1a;IDEA环境准备 IDEA社区版版本: 2021.1-2022.1.4 IDEA专业版版本: 无要求 &#x1f31f;如果个人电脑安装的IEDA不在这个范围&#xff0c;需要卸载重新安装&#xff1b;且⼀定要删除注册表 参考文章➜IDEA卸载和删除注册表 二&#xff1a; Maven (1)Maven的概念…

第六届“中国法研杯”司法人工智能挑战赛进行中!

第六届“中国法研杯”司法人工智能挑战赛 赛题上新&#xff01; 第六届“中国法研杯”司法人工智能挑战赛&#xff08;LAIC2023&#xff09;目前已发布司法大模型数据和服务集成调度 、证据推理、司法大数据征文比赛、案件要素识别四大任务。本届大赛中&#xff0c;“案件要素…

克隆的虚拟机,查不到IP号

文章目录 问题解决描述解决步骤重新生成MAC地址修改一修改二 相关操作查看当前所有网卡修改网络配置文件文件内容修改修改文件名 问题解决 描述 使用克隆的虚拟机&#xff0c;网卡和原虚拟机的相同&#xff0c;会导致克隆虚拟机的网卡不可用&#xff0c;从而使用ip addr查看不…

上新啦!请查收云原生虚拟数仓 PieCloudDB 十月动态

PieCloudDB Database 最新动态 PieCloudDB 压缩效率得到提升 为了节省存储空间&#xff0c;降低用户存储费用&#xff0c;PieCloudDB 在压缩率上不断优化&#xff0c;包括&#xff1a; 对 HLL&#xff08;HyperLogLog&#xff09;支持游程编码&#xff08;Run Length Encodi…

Visual Studio2019 与 MySQL连接 版本关系

Refer: VS 连接MySQL | mysql-for-visualstudio 的安装-CSDN博客 【精选】用VS2019&#xff08;C#&#xff09;连接MYSQL(从0入门&#xff0c;手把手教学&#xff09;_mysql-for-visualstudio-1.2.9.msi_Flying___rabbit的博客-CSDN博客 一、工具&#xff1a;VS2019需要连接M…

Qt 官方文档及阅读方法

文章目录 选择 All Qt Modules 查找模块选择 C Classes 查看该模块的所有的类当前类说明文档 QT 官方文档参考&#xff1a;https://doc.qt.io/qt-5 选择 All Qt Modules 查找模块 选择 C Classes 查看该模块的所有的类 当前类说明文档 包括 属性公共函数重新实现的公共功能公…

巡检管理系统哪一款简单实用?如何解决传统巡检难题,实现高效监管?

在电力、燃气、水务等公共服务领域&#xff0c;线路巡检工作是保障公众安全、避免事故发生的重要环节。然而&#xff0c;传统的巡检方式存在一些显著的问题&#xff0c;可能会对公共安全和稳定运行产生不利的影响。为了解决这些问题&#xff0c;需要一种能够实现高效、精准的线…

SystemVerilog学习(1)——验证导论

写在最前 选课不慎&#xff0c;选修课选了个SystemVerilog&#xff0c;事情比必修还多&#xff0c;上课老师讲的一点用没有&#xff0c;但是学分还得修&#xff0c;只能自学了&#xff0c;既来之则安之。 一、什么是SystemVerilog SystemVerilog简称为SV语言&#xff0c;是一种…

汇编的指令

减法类指令&#xff1a; 不带借位的减法&#xff1a; sub dest,src;dest(dest)-(src) 注意&#xff1a; 1、源操作数和目的操作数不能同时为段寄存器或存储单元 2、对标志位有影响&#xff0c;主要影响CF、ZF、OF、SF。 带借位的减法&#xff1a; sbb dest,src;dest(dest)-(…

react native 使用夜神模拟器开发调试 windows+android

执行adb devices, 提示List of devices attached 打开本地sdk目录中的platform-tools文件夹&#xff0c;复制下面3个文件 打开夜神模拟器安装目录中的bin目录&#xff0c;把复制出来的文件复制替换到bin目录中 在复制一份platform-tools目录中的adb.exe&#xff0c;重命名为…

python基础教程:递归函数教程

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 1.递归的定义&#xff1a; 在函数内部直接或者间接调用函数本身 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资…

深度解析网络代理技术及其在网络安全和爬虫应用中的关键作用

在当今数字化时代&#xff0c;网络代理技术在维护网络安全、保护隐私以及实现高效数据获取方面发挥着不可或缺的作用。本文将全面解析Socks5代理、IP代理等关键技术&#xff0c;并探讨其在网络安全和爬虫开发中的重要作用。 1. Socks5代理与SK5代理&#xff1a;多功能代理协议…

四川云汇优想:短视频矩阵运营方案

短视频矩阵运营方案是为了提高短视频平台的用户黏性和活跃度&#xff0c;从而增强用户粘性和平台的商业价值而制定的。下面四川百幕晟小编将对短视频矩阵运营方案进行详细的介绍和分析。 首先&#xff0c;短视频矩阵运营方案要注重用户精细化运营。通过用户画像和兴趣标签&…

Mysql 中的性能调优方法

Mysql 性能调优方法可以从四个方面来说&#xff0c;分别是&#xff1a; 表结构与索引 SQL 语句优化 Mysql 参数优化 硬件及系统配置 这四个方面的优化成本和优化效果是成反比的。 表结构和索引的优化 表结构和索引的优化&#xff0c;主要可以下面这些方面去优化&#xff1a; 分…

Python学习笔记—基本语法

1、一般代码第一行会有#&#xff01;/usr/bin/python3 这句注释是告诉操作系统执行该脚本时&#xff0c;调用/usr/bin目录下的Python 解释器。 在windows 下可以不写第一行注释 2、多行注释’’’和”””&#xff0c;用法类似verilog中的/**/ 如 ’’’ 第一行注释 第二行注释…

JVM第十六讲:调试排错 - Java 线程分析之线程Dump分析

调试排错 - Java 线程分析之线程Dump分析 本文是JVM第十六讲&#xff0c;Java 线程分析之线程Dump分析。Thread Dump是非常有用的诊断Java应用问题的工具。 文章目录 调试排错 - Java 线程分析之线程Dump分析1、Thread Dump介绍1.1、什么是Thread Dump1.2、Thread Dump特点1.3、…

【大模型AIGC系列课程 3-8】AI 代理的应用

1. 如果有一群角色(AI Agent)会发生什么? Generative Agents: Interactive Simulacra of Human Behavior Paper: https://arxiv.org/abs/2304.03442 Demo: https://reverie.herokuapp.com/arXiv_Demo/ 我们的生成式代理架构。代理感知(Perceive)其环境(Env),所有感知都…

2023年金九银十面经,假的今年没有金九银十

24岁的我选择了裸辞 前言 说实话选择裸辞后很迷茫&#xff0c;但是又不想在原本的公司上班&#xff0c;目前处于昏昏沉沉的状态&#xff0c;工作也是混一天是一天&#xff0c;没有了什么明确的目标&#xff0c;不知道屏幕前的你们有没有这种感觉,目前想着休息一段时间&#xff…