ArduPilot之开源代码Sensor Drivers设计

news2024/11/29 8:48:04

ArduPilot之开源代码Sensor Drivers设计

  • 1. 源由
  • 2. Sensor Drivers设计
    • 2.1 front-end / back-end分层
    • 2.2 设计思想分析
  • 3 实例理解
    • 3.1 驱动初始化
    • 3.2 业务应用代码
    • 3.3 frond-end代码
    • 3.3 back-end代码
      • 3.3.1 UART
      • 3.3.2 I2C
      • 3.3.3 SPI
  • 4. 参考资料

1. 源由

飞控代码除了最为基础的姿态控制以外,还要处理很多传感器或者控制单元,比如:雷达/光流计,GPS,起落架,云台等。

这些机载设备是如何整合到飞控应用中就是本章讨论的重点Sensor Drivers设计。

2. Sensor Drivers设计

2.1 front-end / back-end分层

Sensor Drivers设计的重要概念:front-end / back-end分层

  • front-end:面向应用
  • back-end:设备实例

注:ArduPilot的参数配置,主要应用在front-end层;而就setup系统初始化逻辑是一次性的。因此关于Sensor Driver参数调整,需要重启飞控才能起到真正的效果。
在这里插入图片描述

2.2 设计思想分析

基于上述Sensor Driver架构,back-end层在后台通过硬件总线与硬件传感器通信,不管更新缓存数据(并做好更新数据时间戳记录);应用通过front-end接口获取缓存的最新传感器数据;

该分层结构设计主要为了解决多传感器/多硬件总线/低速通信等待/异常容错与高频飞控应用之间的异步和效率问题。

换个角度,通过分层结构设计可以解决:

  1. 设备轮询耗时等待
  2. 合理分配轮询/中断,高效利用CPU
  3. 优化低速传感数据与应用的匹配度(应用频度/任务优先级等)
  4. 飞控业务解耦硬件驱动API(驱动主要在back-end完成)

3 实例理解

rangefinder传感器种类还是比较多的,目前代码支持大约有30种,市面上应该有更多的硬件,我们围绕这个驱动,作为一个例子。

3.1 驱动初始化

根据前面ArduPilot之开源代码Library&Sketches设计了解到AP_HAL_MAIN_CALLBACKS(&copter)会将初始化部分关联,调用到AP_Vehicle::setup,接下去的驱动初始化流程如下:

AP_Vehicle::setup
   └──> init_ardupilot
       └──> Copter::init_rangefinder
           └──> rangefinder.init
               └──> detect_instance // _add_backend

如果有多个传感器,配置正确的情况,将会有多个instance或者说多个back-end。

3.2 业务应用代码

通过rangefinder.update进行业务数据更新。

在这里插入图片描述

3.3 frond-end代码

frond-end不关心具体back-end实现是通过哪条总线进来,怎么进来。只负责更新最终获取的缓存中的数据。

在这里插入图片描述

3.3 back-end代码

rangefinder传感器实际上是通过UART/I2C/SPI总线中的一种进行通信,这些就需要back-end处理。

3.3.1 UART

根据Param设置SERIALX_BAUD/SERIALX_PROTOCOL获取串口总线。
在这里插入图片描述数据更新记录时间戳,以防脏数据。

在这里插入图片描述
鉴于串行总线有内部buffer,所以无需注册回调,直接串口字节流解析处理逻辑。

在这里插入图片描述

3.3.2 I2C

通过宏定义或者参数配置I2C地址,注册timer回调函数与设备进行通信。

在这里插入图片描述

3.3.3 SPI

自动检测SPI总线,枚举设备,添加到back-end,注册timer回调函数,从而进行SPi通信。

在这里插入图片描述在这里插入图片描述

4. 参考资料

【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码框架
【3】ArduPilot飞控之ubuntu22.04-SITL安装
【4】ArduPilot飞控之ubuntu22.04-Gazebo模拟
【5】ArduPilot飞控之Mission Planner模拟
【6】ArduPilot飞控AOCODARC-H7DUAL固件编译
【7】ArduPilot之开源代码Library&Sketches设计

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

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

相关文章

《美团机器学习实践》读后感和一点思考

前言:最近拜读了美团算法团队出品的《美团机器学习实践》,这本书写于2018年,一个大模型还没有标配的时代。这本书侧重于工业界的实践,能清楚地让我们了解到工业界和学术界对机器学习的关注方向上的差异,值得一读。因为…

文件系统和软硬链接

文章目录 一.文件系统1.了解磁盘的物理结构2.磁盘的存储结构a.磁盘读取 3.磁盘的逻辑结构a.为什么操作系统不直接使用CHS地址?b.实际IO一次的大小 4.磁盘的分区管理4.1.ext文件系统a.文件查找b.文件删除 4.2目录的属性和数据 二.软硬链接软链接的建立和删除软链接的…

【VM服务管家】VM4.0软件使用_1.4 通讯类

目录 1.4.1 通讯管理:ModBus通信发送非整型数据的方法1.4.2 通讯管理:使用Modbus TCP通讯协议与流程交互 1.4.1 通讯管理:ModBus通信发送非整型数据的方法 描述 环境:VM4.0.0 现象:Modbus通信发送数据只能为Int类型&a…

快速搭建Electron+Vite3+Vue3+TypeScript5脚手架 (无需梯子,快速安装Electron)

一、介绍 😆 😁 😉 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需…

【网课平台】Day13.订单支付模式:生成支付二维码与查询支付

文章目录 一、需求:生成支付二维码1、需求分析2、表设计3、接口定义4、接口实现5、完善controller 二、需求:查询支付结果1、需求分析2、表设计与模型类3、接口定义4、接口实现步骤一:查询支付结果步骤二:保存支付结果&#xff08…

如何写出一份大厂都不会拒绝的简历?

你好,我是宋光璠,今天我以过来人的身份教你写出一份惊艳面试官的简历。 简历算是我们过去经历的一个缩影,虽然只有短短一两页,但也能让人从中发现你的优点,一份优质的简历更是如此,所以今天我就带你从头到…

PLC模糊PID(梯形图实现)

博途PLC的模糊PID控制详细内容请查看下面的博客文章: Matlab仿真+博途PLC模糊PID控制完整SCL源代码参考(带模糊和普通PID切换功能)_博途怎么实现模糊pid_RXXW_Dor的博客-CSDN博客模糊PID的其它相关数学基础,理论知识大家可以参看专栏的其它文章,这里不再赘述,本文就双容…

网络安全常用术语

肉鸡 肉鸡指的就是被黑客成功入侵并取得控制权限的电脑。黑客们可以随意的控制肉鸡,就像在使用自己的电脑一样,很形象的比喻,就像是养的肉鸡,任黑客宰杀和利用。关键的是,在成为肉鸡后,只要黑客不对电脑进…

【VM服务管家】VM4.x算子SDK开发_3.4 控件嵌入类

目录 3.4.1 图片存储:图片保存的方法3.4.2 辅助十字线:给图像添加辅助十字线的方法3.4.3 控件调用:在WPF中使用Winform控件的方法3.4.4 图形改变事件:渲染控件上图形改变事件的实现方法3.4.5 鼠标事件:渲染控件上鼠标事…

Hive的基本操作和查询语法以及案例(大数据查询)

1、 13-Hive的基本操作和查询语法以及案例_hive分区表查询语句_大数据下的画像人的博客-CSDN博客 2、SQL 中多个 and or 的组合运算 SQL 中多个 and or 的组合运算_weixin_30611509的博客-CSDN博客sql关系型运算符优先级高到低为:not >and> orAND、OR运算符…

零基础想成为黑客,只需要四步

前言 首先要明白,该篇文章说的黑客不是那种窃取别人信息、攻击别人系统的黑客,说的是调试和分析计算机安全系统的网络安全工程师。 黑客技术的核心之一就是渗透攻防技术,是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模…

语音处理加窗分帧

语音处理加窗分帧 一、分帧 语音数据和视频数据不同,本没有帧的概念,但是为了传输与存储,我们采集的音频数据都是一段一段 的。为了程序能够进行批量处理,会根据指定的长度(时间段或者采样数)进行分段,结构化为我们编程…

从FPGA说起的深度学习(八)-数据并行性

这是新的系列教程,在本教程中,我们将介绍使用 FPGA 实现深度学习的技术,深度学习是近年来人工智能领域的热门话题。 在本教程中,旨在加深对深度学习和 FPGA 的理解。 用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为…

11款专家级渗透测试工具

导语:在本文中,我们将深入研究渗透测试员用来挫败客户防御系统的工具。 渗透测试员,有时也称“道德黑客”,他们本质上是安全专家,负责对客户的网络或系统发起模拟攻击,以寻找潜在漏洞。他们的目标是展示恶意…

电脑技巧:Windows系统原版纯净软件必备的两个网站

目录 一、MSDN我告诉你 二、helloWindows 三、总结 Windows系统是个人电脑使用最广泛的操作系统,大家可能会遇到下载Windows镜像、SQLServer、Office等官方软件,会遇到各种各样捆绑、广告软件,甚至还有可能电脑被植入病毒的风险。该如何避…

代码随想录算法训练营第四十五天|70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

文章目录 70. 爬楼梯 (进阶)322. 零钱兑换279.完全平方数 今天的题一道是求装满背包的可能情况;另两道都是求装满背包的所需的最小物品数目,不用考虑是组合还是排序问题 70. 爬楼梯 (进阶) 背包问题,求装满…

设置苹果电脑vsode在新窗口中打开文件

0、前言 最近切换到mac电脑工作,又得重新安装一些工具软件并设置。虽然这些设置并表示啥复杂的设置,但是久了不设置还是会忘记。于是记录之,也希望给能帮助到需要的人。 我们使用vscode阅读或者编辑文件时,有时候希望同时打开多…

RabbitMQ 01 概述

什么是消息队列 进行大量的远程调用时,传统的Http方式容易造成阻塞,所以引入了消息队列的概念,即让消息排队,按照队列进行消费。 它能够将发送方发送的信息放入队列中,当新的消息入队时,会通知接收方进行处…

MySQL的JSON 数据类型

概述: MySQL提供了一个专门用于存储JSON数据的数据类型:JSON。JSON数据类型允许您在MySQL数据库中存储和操作JSON格式的数据。 以下是关于JSON数据类型的一些基本操作和函数: 创建表: 要在表中创建一个JSON类型的列&#xff0…

C/C++每日一练(20230429)

目录 1. 螺旋矩阵 🌟🌟 2. 戳气球 🌟🌟🌟 3. 实现五则运算 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1…