(5)传感器驱动程序

2023-05-16

文章目录

前言

1 支持的协议

1.1 I2C

1.2 SPI

1.3 Serial / UART

1.4 带有UAVCAN的CAN总线

2 前端/后端分离

3 如何以及何时运行驱动程序代码

4 无人机代码和前端示例

5 UART / Serial后端示例

6 I2C后端示例

7 SPI后端示例

8 附加建议


前言

ArduPilot 支持来自许多不同制造商的各种传感器。这方面的一个明显的例子可以在测距仪( list of range finders)(又称声纳、激光雷达)的列表中看到。本页试图解释传感器驱动程序是如何编写和集成到飞行器代码中的。


1 支持的协议

支持 I2CSPIUART(aka SerialCANBUS(特别是 UAVCAN/DRoneCAN)协议。如果你打算编写一个新的驱动程序,你可能需要参考传感器的数据手册,以确定它使用的协议。

1.1 I2C

  • 一个主机,可能有许多从设备;
  • 一种相对简单的协议,适用于短距离通信(即小于1米);
  • 总线以 100kHz400kHz 的速度运行,但与其他协议相比,数据速率相对较低;
  • 只需要4个引脚(VCCGNDSDASCL)。

1.2 SPI

  • 一个主机,一个从机;
  • 20Mhz+ 的速度意味着它非常快,特别是与 I2C 相比;
  • 只适用于短距离内工作(10厘米);
  • 需要至少5个引脚(VCCGNDSCLK、主-出-从-入、主-入-从-出)+ 每个从机的一个从机选择引脚。

 

1.3 Serial / UART

  • 一个主机,一个从机;
  • 基于字符的协议,与 I2CSPI 相比,适合长距离通信(如1米);
  • 速度相对较快,57Kbps ~ 1.5Mbps(Bps (Bytes per second),即字节每秒,因为一字节对应八比特,所以1Bps = 8bps)
  • 至少需要4个引脚(VCCGNDTXRX),加上2个可选的引脚(清除发送,清除接收)。

1.4 带有UAVCAN的CAN总线

  • 多主机总线,任何节点都可以在需要时启动数据传输;
  • 基于数据包的协议,适用于非常长的距离;
  • 高速,通常为1Mb(然而,只有50%的总线比特率可以在没有重大冲突的情况下真正使用);
  • 至少需要3个引脚(GNDCAN HICAN LO)。可选择使用 VCC 为节点供电;
  • 点对点拓扑结构。不建议使用星形或树枝形拓扑结构;
  • 总线的每一端都需要终端。

2 前端/后端分离

传感器驱动程序架构中的一个重要概念是前端/后端分离。

飞行器代码只会调用库(又称传感器驱动程序)的前端。

在启动时,前端根据传感器的自动检测(即探测已知 I2C 地址上的响应)或使用用户定义的 _TYPE 参数(即 RNGFND_TYPERNGFND_TYPE2)创建一个或多个后端。前端维护指向每个后端的指针,这些指针通常保存在一个名为 _drivers[] 的数组中。

用户可设置的参数总是被保存在前端。

3 如何以及何时运行驱动程序代码

上图显示了 ardupilot 架构的放大视图。左上角的蓝框说明了传感器驱动程序的后端是如何在后台线程中运行的。收集来自传感器的原始数据,转换为标准单位,然后保存在驱动程序的缓冲区内。

无人机代码的主线程定期运行(如 400hz 的旋翼),并通过驱动程序前端的方法访问可用的最新数据。例如,为了计算最新的姿态估计,AHRS/EKF 将从传感器驱动程序的前端获取最新的加速度计、陀螺仪和罗盘信息。

图片是一个小小的概括,对于使用 I2CSPI 的驱动程序,它们必须在后台线程中运行,这样与传感器的高速通信就不会影响主循环的性能,但对于使用串行(又称 UART)接口的驱动程序,在主线程中运行是安全的,因为底层串行驱动程序本身在后台收集数据并包括一个缓冲区。

4 无人机代码和前端示例

下面的例子显示了 Copter 无人机代码如何从测距仪(又称声纳、激光雷达)驱动程序中获取数据。旋翼代码的调度程序(scheduler)以 20Hz 的频率调用无人机的 read_rangefinder() 方法。下面是这个方法的图片,可以在 sensors.cpp 文件中看到最新版本。rangefinder.update() 方法是对驱动程序前端的一个调用。

下面是测距仪驱动程序的前端更新方法( update method)。这给了驱动程序一个机会在主线程中做任何它可能想要的一般处理。每个后端的更新方法被依次调用。

5 UART / Serial后端示例

接下来是 LightWare 后端(LightWare back-end)使用串行协议的更新方法。如用户维基上(user wiki)所述,串行测距仪可以连接到飞行控制器的任何一个串行端口,但用户必须通过设置SERIALX_BAUDSERIALX_PROTOCOL 参数来指定哪个串行端口,以及使用什么波特率。

在串行驱动程序的后端代码(backend code)中,它首先通过 serial_manager 类找到用户要使用的 UART,该类将查找上述的参数设置。

每次调用驱动程序的后端 update() 方法时,它都会调用 get_reading 方法,检查是否有新的字符从传感器到达,然后对其进行解码。

如上所述,由于串行协议实现了自己的缓冲,来自传感器的任何数据(见 get_reading 方法)的处理都在主线程中运行。也就是说,没有像你在 I2CSPI 驱动中看到的 "register_periodic_callback"。

6 I2C后端示例

这个例子显示了 Lightware I2C 驱动程序的后端。在这种情况下,前端获得 I2C 总线,并在初始化时将其传递给后端。

然后后端的 init 方法注册其“timer”方法,以 20hz 的频率调用。在 timer 方法中(未显示),get_reading() 方法被调用,它从传感器中读取字节并将距离转换为厘米。

7 SPI后端示例

这个例子显示了 MPU9250 IMU 的后端,它包括一个陀螺仪、加速度计和罗盘。前端获得 SPI 总线,并在初始化时将其传递给后端。

在初始化期间将调用 start() 方法并配置传感器。它使用信号量来确保不干扰同一总线上的其他 SPI 设备。

注册 _read_sample 方法,以便以 1000hz 调用它。请注意,在 _read_sample 方法中不需要获取/释放信号量,因为这是作为定期回调代码的一部分完成的。

_block_read 方法显示如何从传感器的寄存器中读取数据。

8 附加建议

在编写传感器驱动程序时,千万不要包含任何等待或睡眠代码,因为这将延迟主线程或正在使用的与总线相关的后台线程。

如果编写了一个新的库,它必须被添加到飞行器目录下的 wscript 文件中(即/ardupilot/ArduCopter/wscript),以便将其链接到最终的二进制文件中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(5)传感器驱动程序 的相关文章

  • RK3308 按键Key与LED灯

    硬件原理图 LED指示灯 麦克风阵列子板上使用12颗RGB灯作为效果指示灯 用户可以通过I2C总线配置LED灯驱动IC来是实现不同场景下的灯效 按键Key 麦克风阵列子板上集成五个控制按键 xff0c 分别为 xff1a 控制音量增减的VO
  • if选择结构

    if单选择结构 if双选择结构 if多选择结构 span class token keyword if span span class token punctuation span score span class token operat
  • Windows10下Eclipse+Python环境配置与新项目创建

    最近心血来潮 xff0c 突然想学一下python xff0c 按理说应该不用Eclipse xff0c 但是一想以后还可能会用Java xff0c 那还是装这个 xff0c 然后配置一下环境吧 xff0c 其中也有很多坑 xff0c 希望
  • 理解地址空间和逻辑地址生成

    1 1 地址空间 物理地址 xff1a 硬件 例如内存条 所支持地址空间 xff0c 地址空间的管理由硬件完成 逻辑地址 虚拟地址 xff1a 运行地址所看到的地址空间 xff0c 地址空间是一维的 xff0c 应用程序更加容易访问和管理
  • QT DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x800c000d ()

    使用QT播放音频的时候出现如下错误 DirectShowPlayerService doSetUrlSource Unresolved error code 0x800c000d 原因是url错误
  • 3种蓝牙架构实现方案(蓝牙协议栈方案)

    导言 不同的蓝牙架构可以用在不同的场景中 从而协议帧的架构方案也会不同 转载自 xff1a https www cnblogs com schips p 12293141 html 三种蓝牙架构实现方案 xff08 蓝牙协议栈方案 xff0
  • 驱动遍历句柄表

    xfeff xfeff 驱动遍历句柄表附加第二个方法的反汇编代码 其中还有对其拦截的方式的一些需要HOOK处比如伪造句柄表 因为大量使用硬编码所以此份代码通用性不强一切均在虚拟机XP3下操作 include 34 ntddk h 34 ty
  • Javascript案例:猜数字游戏

    要求 程序随机生成一个1 10之间的数字 xff0c 并让用户输入一个数字 如果大于该数字 xff0c 就提示 xff0c 数字大了 xff0c 继续猜如果小于该数字 xff0c 就提示 xff0c 数字小了 xff0c 继续猜如果等于该数
  • 操作系统之进程 (五) --- 进程、进程实体、PCB...

    文章目录 进程什么叫进程什么叫进程实体进程与进程实体的关系PCB的存储信息与分类 进程的组织方式链接方式索引方式 进程的特征总结感谢 进程 什么叫进程 进程和程序差不多 xff0c 他们有所联系也有所区别 我们以我们熟悉的程序入手 xff0
  • 如何让树莓派默认启动进入图形界面

    设置Raspbian图形启动 当你第一次安装Raspbian系统时 xff0c 确实有一些选项需要你来配置 xff0c 由于匆忙 xff0c 我没有注意到这些 xff0c 只是快速完成屏幕上的选项 如果你遇到了和我一样的情况 xff0c 最
  • ROS与stm32通信

    0 概述 ros和stm32等嵌入式单片机的最大区别在于ros主要用于处理slam 机器视觉 人工智能这种对于算力要求高 xff0c 算法复杂的问题 xff1b 而stm32和arduino等主要用来处理一些边缘事件 xff0c 比如亮个L
  • 硬件仪器的使用

    示波器的使用 用于红外捕捉 xff0c 一开始可以把探头扣在探头补偿的位置 xff0c 显示出一个正常的方波信号5V 1KHz 按下CH1的菜单 xff0c 能够弹出右边的选项 xff0c 注意设置为直流和10X电压 按下触发处的Menu菜
  • pytorch显存越来越多的一个潜在原因-- 这个函数还没有在torch.cuda.Tensor中定义

    最近在用pytorch跑实验 xff0c 有如下操作需要用到 xff08 pytorch版本为0 3 1 xff09 class SpatialFilter nn Module def init self mode 61 True sf r
  • KPI异常检测【一】- 时间序列分解算法

    目录 1 相关概念 2 常见的时间序列 3 时间序列分解 3 1 方法介绍 3 2 经典方法 3 3 Holt Winter 指数平滑 3 4 STL分解 4 异常准则 5 异常检测算法 1 相关概念 1 1 异常 时序异常检测通常形式化为
  • KPI异常检测【三】- 机器学习算法

    目录 1 相关概念 1 1 异常类型 1 2 检测方法 2 点异常检测算法 2 1 基于统计 2 2 基于相似度 2 2 1 基于距离 2 2 2 基于密度 2 2 3 基于聚类 2 2 4 基于树 2 3 基于谱 spectral 3 上
  • 手把手教你如何安装ROS+Gazebo+PX4开发环境(ubuntu18.04 + Melodic)

    参考PX4官网 xff0c 做如下总结 xff1a 1 安装 Ubuntu 43 ROS 步骤省略 xff0c 提前配置好梯子 xff0c 很多安装问题都是网络原因引起的 2 下载并安装PX4源码 git clone https githu
  • ROS+Gazebo+PX4仿真步骤

    本文参考链接 xff1a 入门教程 PX4 Gazebo仿真 知乎 zhihu com 1 参照上一个帖子 手把手教你如何安装ROS 43 Gazebo 43 PX4开发环境 xff08 ubuntu18 04 43 Melodic xff
  • ROS+Gazabo+PX4仿真学习常用网站记录

    1 PX4官网 xff1a PX4 User Guide 中文网站 xff1a https docs px4 io master zh ros mavros custom messages html 2 ROS Wiki xff1a cn
  • 如何订阅(Subscribe)现有功能包节点的话题,介绍实现思路

    我们从github或其他途径获取到的ROS功能包 xff0c 如何快速的加入到自己的工程里边 xff0c 下边介绍一下我实现的思路 1 首先运行功能包 xff0c 利用 rqt graph 命令查看 节点图 xff0c 对功能包的节点和话题

随机推荐

  • PX4仿真时,如何在Gazebo下添加物理环境

    1 安装Gazebo xff0c 步骤略 2 下载安装Gazebo需要的世界模型 xff0c 否则自动安装速度很慢 3 在Ubuntu终端里输入 gazebo xff0c 打开一个空的 Gazebo 界面 4 点击左上方的 insert x
  • 树莓派如何使用串口,树莓派连接pixhawk

    参考链接 xff1a xff08 写的非常详细 xff0c 下述方法亲测有效 xff09 pi 3 How do I make serial work on the Raspberry Pi3 PiZeroW Pi4 or later mo
  • 树莓派备份系统

    使用 rpi backup 脚本进行备份 首先下载该脚本 xff1a git clone https github com nanhantianyi rpi backup git cd rpi backup 用法 xff1a sudo ba
  • Linux和Windows可执行文件的区分

    一些后缀区分 现在PC平台流行的可执行文件格式 xff08 Executable xff09 xff0c 主要有以下两种格式 xff08 COFF xff08 Common file format xff09 格式的变种 xff09 xff
  • 树莓派+ubuntu18.04+ROS-melodic+MAVROS+librealsense+vio+realsense_ros

    目录 一 树莓派安装ubuntu18 04 1 下载ubuntu系统文件 2 将系统文件烧入SD卡 3 强制修改HDMI输出分辨率 xff08 此步骤可忽略 xff09 4 设置wifi xff08 此步骤也可忽略 xff0c 后续连接网线
  • APM+Gazebo 垂起固定翼VTOL软件在环仿真

    APM 43 Gazebo 垂起固定翼VTOL软件在环仿真 1 APM软件环境下载并安装APM固件加入环境变量 2 运行APM仿真3 Gazebo环境安装4 增加VTOL模型5 多机仿真6 使用mavros 1 APM软件环境 参考官网链接
  • 进程间通信的五种方式

    进程间通信的意思就是在不同进程之间传递信息 它是一组编程接口 xff0c 让程序员协调不同进程 xff0c 使能够相互传递消息 IPC目的 1 xff09 数据传输 xff1a 一个进程需要将它的数据发送给另一个进程 xff0c 发送的数据
  • Arduino采集Microzone遥控器信号(ROSMicrozoneBridge)

    关注微信公众号 混沌无形 xff0c 后台回复 xff1a 13462F6 免费获取完整工程源码 xff01 本文采用Arduino mega2560的6个外部中断来采集Microzone接收机的6个通道的PPM信号 xff0c 主要是测量
  • 路径规划之基于优化的规划算法

    关注同名微信公众号 混沌无形 xff0c 阅读更多有趣好文 xff01 原文链接 xff1a 机器人曲线插值拟合算法研究现状简述 xff08 包含原文PDF百度云下载链接 xff09 第三类算法是主要是将多目标多变量多约束耦合的规划模型转化
  • 常见移动机器人多角度对比分析

    混沌无形 混沌系统是世界本质 xff0c 无形之中存在规律 机器人智能化发展从线性过渡到混沌 xff0c 本号将分享机器人全栈技术 xff08 感知 规划 控制 xff1b 软件 机械 硬件等 xff09 43篇原创内容 公众号 文末提供原
  • 麦克纳姆轮运动特性分析

    混沌无形 混沌系统是世界本质 xff0c 无形之中存在规律 机器人智能化发展从线性过渡到混沌 xff0c 本号将分享机器人全栈技术 xff08 感知 规划 控制 xff1b 软件 机械 硬件等 xff09 43篇原创内容 公众号 文末提供原
  • 全向轮运动特性分析

    文末提供原文PDF免费下载 期刊论文版式 混沌无形 混沌系统是世界本质 xff0c 无形之中存在规律 机器人智能化发展从线性过渡到混沌 xff0c 本号将分享机器人全栈技术 xff08 感知 规划 控制 xff1b 软件 机械 硬件等 xf
  • matlab稳态和时变卡尔曼滤波器Kalman filter的设计和仿真植物动力学模型案例研究

    最近我们被客户要求撰写关于卡尔曼滤波器的研究报告 xff0c 包括一些图形和统计输出 本案例研究说明了卡尔曼滤波器的设计和仿真 考虑稳态和时变卡尔曼滤波器 植物动力学 考虑一个在输入u n 上有加性高斯噪声w n 此外 xff0c 让 yv
  • 正点原子-操作系统

    正点原子另一个学习网站 http www openedv com docs book videos zdyzshipin 4free zdyz freertos book html
  • 基于stm32的减速直流电机PID算法控制

    本例程采用了HAL库进行项目开发 xff08 主要使用软件CubexMX和keil5 xff09 xff0c 文章末尾会有代码开源 xff0c 欢迎各位对文章进行指正和探讨 基于PID的减速电机控制 一 硬件模块与原理图 1 硬件组成 硬件
  • 记录一次在VM上搭建k8s集群

    安装私有镜像仓库Harbor xff1a https blog csdn net a595077052 article details 119893070 配置k8s的dashboard xff1a https blog csdn net
  • ubuntu 上 docker 安装以及配置VNCserver

    1 install Docker 安装过程 根据docker官网安装过程 根据docker官网 lt a data cke saved href 61 34 https docs docker com install linux docke
  • 【论文阅读笔记】VNect: Real-time 3D human Pose Estimation with a Single RGB

    论文总结 xff1a 文中方法比较简单 xff0c 通过全卷积CNN预测一个heatmap及location map location map实际上就是X Y Z三个方向的坐标图 xff0c 找到关键点的过程为heatmap 中寻找照最大值
  • C++ 曲线平滑

    最近需要将数据通过图表展示出来 xff0c 以便观察其变化趋势 直接展示出来的效果不是很好 xff0c 故在网上查找了很久曲线平滑的方法 xff0c 最终找到了了一套比较适合的方法 xff0c 思路比较简单 xff0c 对于现在的项目来说效
  • (5)传感器驱动程序

    文章目录 前言 1 支持的协议 1 1 I2C 1 2 SPI 1 3 Serial UART 1 4 带有UAVCAN的CAN总线 2 前端 后端分离 3 如何以及何时运行驱动程序代码 4 无人机代码和前端示例 5 UART Serial