Pixhawk-信息流浅解析

2023-05-16

     根深方能叶茂 在等待的日子里,刻苦读书,谦卑做人,养得深根,日后才能枝叶茂盛。 --Better(根爷)


前我们已经谈到系统框架,之前谈到了定制自己功能的两部:添加模块和修改信息流。


鉴于信息流的重要性,我们在这里重新复习整理一下:看完之后你应该做到三点:

1、掌握uorb基本函数的使用

2、能够添加自己的uorb

3、尝试去探究一下uorb和mavlink



    下面开始先复习第一部分,uorb的基本函数:


    uORB(Micro Object Request Broker,微对象请求代理器)是PX4/Pixhawk系统中非常重要且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS、PPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。实际上uORB是一套跨「进程」 的IPC通讯模块。在Pixhawk中, 所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。 
  Pixhawk使用的是NuttX实时ARM系统,uORB实际上是多个进程打开同一个设备文件,进程间通过此文件节点进行数据交互和共享。进程通过命名的「总线」交换的消息称之为「主题」(topic),在Pixhawk 中,一个主题仅包含一种消息类型,通俗点就是数据类型。每个进程可以「订阅」或者「发布」主题,可以存在多个发布者,或者一个进程可以订阅多个主题,但是一条总线上始终只有一条消息。(注意一条总线上始终只有一条消息,后来的信息总会覆盖掉前面的消息


应用层中操作基础飞行的应用之间都是隔离的,这样提供了一种安保模式,以确保基础操作独立的高级别系统状态的稳定性。而沟通它们的就是uORB。


    下面是一些常用函数:

int orb_subscribe(const struct orb_metadata *meta)
功能:订阅主题(topic);
说明:即使订阅的主题没有被公告,但是也能订阅成功;但是在这种情况下,却得不到数据,直到主题被公告;
这就是为什么发布数据之前需要先公告,公告相当于注册吧。在消息主题中,句柄用的很多,都是对句柄直接操作的。句柄的初始化是放在进程的初始化部分的。

参数:
meta:uORB元对象,可以认为是主题id;
返回值:
正确返回一个句柄,句柄是你自己定义的,初始化为-1,如int my_topic_sub=-1;

int my_topic_sub = orb_subscribe(ORB_ID(my_topic));

注意:订阅的句柄常常起名为_sub指的就是subscribe,看到不要以为是sub副的意思;而发布的主题,后缀常常是_pub是publish的意思。


int orb_set_interval(int handle, unsigned interval)
功能:设置订阅的最小时间间隔;
说明:如果设置了,则在这间隔内发布的数据将订阅不到;需要注意的是,设置后,第一次的数据订阅还是由起初设置的频率来获取。handle句柄,订阅主题返回的句柄,interval间隔时间,系统常设置的是33ms,就是30hz的更新频率。

    订阅了消息主题,如何检查数据更新了吗?下面就是两种方式,区别自己比较吧,之前我提到过。

int poll(struct pollfd fds[], nfds_t nfds, int timeout)

功能:监控文件描述符(多个);
说明:timeout就是最大阻塞这么长时间等待你的数据,因为我不可能一直等你,那样岂不是什么也干不了,所以限制一个时间,就等这么常时间。返回为0那就是时间都用完了也没等到数据,>0就是时间内拿到了数据,<0那就是出错了,看到没有返回的是拿到你数据时我还剩多少阻塞时间。

输入: 

fds:struct pollfd结构类型的数组,进程可以同时等待很多个主题数据,当有数据更新时,判断一下是谁
nfds:用于标记数组fds中的结构体元素的总数量;
timeout:是poll函数调用阻塞的时间,单位:毫秒;
返回值:
>0:阻塞时间内拿到了数据;
==0:抱歉时间都用完了,也没能拿到数据;
-1:poll函数调用失败;


int orb_check(int handle, bool *updated)
功能:检查一个主题数据有没有更新,更新了updated会被设置为true。但一旦调用ob_copy来接收、处理过后,updated会被自动设置为false,所以这种方式数据只能被第一个人检测到,后面人再检测到时updated已经是fals。


    两种方式检查到数据已经更新了,怎么取出,怎么使用?

int orb_copy(const struct orb_metadata *meta, int handle, void *buffer)
功能:从订阅的主题中获取数据并将数据保存到buffer中。meta消息的ID,handle句柄,哪个句柄,你订阅时返回的句柄,从消息中拷贝数据放到buffer中。buffer是自己消息的数据结构类型自己定义的。例:sensor_combined_s raw ;orb_copy(ORB_ID(sensor_combined), sensor_sub_fd, &raw);


    前面说的都是订阅,那么怎么发布?

orb_advert_t orb_advertise(const struct orb_metadata *meta, const void *data)
功能:先公告主题,相当于注册,只要一次就行了。meta公告的消息ID,data公告的原始数据。
说明:在发布主题之前是必须的;否则订阅者虽然能订阅,但是得不到数据;

int orb_publish(const struct orb_metadata *meta, orb_advert_t handle, const void *data)
功能:公告之后就可以发布主题数据。meta公告的消息ID,handle公告返回的句柄,这个句柄初始化为null,data发布的数据,要发布什么数据,自己填充。


      至于使用例程自己去官网看吧,例程很多。



2、能够添加自己的uorb

   下面讲第二个问题,如何添加自己的主题。

1)在msg/下仿照其他文件,写自己的主题内容,msg的名字就是你消息主题的名字

2)在cmakelist中添加你的msg文件名

之后再编译,就会在build/src/moudle/uorb/topic中有你自定义的主题.h文件。看看里面的内容是不是和你自定义的msg内容一样,还给你生成了主题的数据结构。当使用这个主题时,#include你的主题就可以使用它了。



3、探究一下uorb和mavlink


   Mavlink是目前最常见的无人机飞控协议之一。PX4对Mavlink协议提供了良好的原生支持。该协议既可以用于地面站(GCS)对无人机(UAV)的控制,也可用于UAV对GCS的信息反馈。其飞控场景一般是这样的:
a) 手工飞控:GCS -> (MavLink) -> UAV
b) 信息采集:GCS <- (Mavlink) <- UAV
c) 自治飞控:User App -> (MavLink) -> UAV


   也就是说,如果你想实现地面站控制飞行,那么由你的地面站使用Mavlink协议,通过射频信道(或 wifi etc.)给无人机发送控制指令就可以了。如果你想实现无人机自主飞行,那么就由你自己写的应用(运行在无人机系统上)使用Mavlink协议给无人机发送本地的控制指令就可以了。

    然而,为实现飞控架构的灵活性,避免对底层实现细节的依赖,在PX4中,并不鼓励开发者在自定义飞控程序中直接使用Mavlink,而是鼓励开发者使用一种名为uORB((Micro Object Request Broker,微对象请求代理)的消息机制。其实uORB在概念上等同于posix里面的命名管道(named pipe),它本质上是一种进程间通信机制。由于PX4实际使用的是NuttX实时ARM系统,因此uORB实际上相当于是多个进程(驱动级模块)打开同一个设备文件,多个进程(驱动级模块)通过此文件节点进行数据交互和共享。

    在uORB机制中,交换的消息被称之为topic,一个topic仅包含一种message类型(即数据结构)。每个进程(或驱动模块)均可“订阅”或“发布”多个topic,一个topic可以存在多个发布者,而且一个订阅者可也订阅多个topic。而正因为有了uORB机制的存在,上述飞控场景变成了:

a) 手工飞控:GCS -> (MavLink) -> (uORB topic) -> UAV
b) 信息采集:GCS <- (Mavlink) <- (uORB topic) <- UAV
c) 自治飞控:User App -> (uORB topic) -> (MavLink) -> UAV

    有了以上背景基础,便可以自写飞控逻辑了,仅需在PX4源码中,添加一个自定义module,然后使用uORB订阅相关信息(如传感器消息等),并发布相关控制信息(如飞行模式控制消息等)即可。

    最后值得一提的是,在PX4系统中,还提供了一个名为mavlink的专用module,源码在firmware的src/modules/mavlink中,这货与linux的控制台命令工具集相当相似,其既可以作为ntt控制台下的命令使用,又可作为系统模块加载后台运行。其所实现的功能包括:1)uORB消息解析,将uORB消息实际翻译为具体的Mavlink底层指令,或反之。2)通过serial/射频通信接口获取或发送Mavlink消息,既考虑到了用户自写程序的开发模式,也适用于类似linux的脚本工具链开发模式,使用起来很灵活。


4、还可以通过mavlink修改信息流,地面站就是走这个,这个有时间再整理。


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

Pixhawk-信息流浅解析 的相关文章

  • 【Pixhawk】PX4添加麦克纳姆轮车架

    PX4中提供了很多机架 xff0c 但要开发PX4不支持的机架类型 xff0c 需要我们自定义 比如麦克纳姆轮 1 在ROMFS px4fmu common init d airframes 下添加 hil机架文件 参考其他 命名为7000
  • PX4/Pixhawk---uORB深入理解和应用(最新版)

    1 简介 ps 第1章简介是参考 uORB深入理解和应用 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c 这可以让我们更好的理解PX4 Pixhawk的软件架构和运作 xff
  • pixhawk无人机避障

    本人最近用树莓派结合PX4做无人机避障 xff0c 使用激光雷达 xff0c 有没有一起的小伙伴 xff0c 我们一起交流 xff01 私信我 xff0c
  • APM、PIXHAWK、PX4的关系

  • 自己组装pixhawk的一些感受

    现在你叫我设置遥控器我会了 xff0c 我也清楚电调怎么接线的了 xff0c 也清楚怎么供电的了 xff0c 其实飞控的接线就四个电调的接线 xff0c 加上接收机的接线其他都是一些传感器的接线罢了 xff0c 我现在回过头看无名的无人机就
  • Pixhawk无人机教程-8.1 在Mission Planner中下载与分析日志(转载)

    摘自 xff1a https www ncnynl com archives 201608 491 html Pixhawk无人机教程 8 1 在Mission Planner中下载与分析日志 闪存日志 目录 闪存日志日志类型 闪存 VS
  • 在PX4下更换pixhawk的IMU

    写在前面 出于一些原因 xff0c 这篇文章不给出具体的源码 xff0c 因此博主试着将这篇写成了一篇科普性质的文章 xff0c 如果你认真读的话 xff0c 应该会有收获的 为什么要更换pixhawk的传感器 xff1f 大多数的玩家拿到
  • pixhawk日志ulg格式转matlab数据csv格式

    1 windows下打开Anconda Prompt xff0c 执行pip install pyulog安装pyulog包 2 在日志文件所在文件夹下执行ulog2csv 文件名 ulg即可生成相关的csv文件
  • Pixhawk-开篇

    Pixhawk 开篇 互联网上关于介绍Pixhawk的文章特别多 有心人自己去网上查看吧 本篇文章未完 可能会有更新 不足请指出 QQ 4862879 说重点 Pixhawk指的是一款开源的硬件 下图的那个 是把原来的PX4FMU 43 P
  • PX4/PixHawk无人机飞控应用开发

    最近做的一个国防背景的field UAV项目 xff0c 细节不能多谈 xff0c 简单写点技术体会 1 PX4 Pixhawk飞控软件架构简介 PX4是目前最流行的开源飞控板之一 PX4的软件系统实际上就是一个firmware xff0c
  • 使用者——初见Pixhawk

    是什么 Pixhawk简单介绍 直接使用二次开发 Pixhawk总体概述怎么用 Pixhawk初次使用 搭建调试环境初始化配置测试试飞调整参数提高性能 xff08 是什么 Pixhawk简单介绍 PixHawk是著名飞控厂商3DR推出的新一
  • Pixhawk飞行模式的讨论

    手动模式 offboard 地面站 操控的区别 使用遥控操纵的模式 Simple and Super Simple 选项 加了这个选项之后 xff0c 它的磁力计会记录飞机解锁时 xff0c 朝向就是无人机的前方 每个飞行模式的旁边都有一个
  • pixhawk position_estimator_inav.cpp思路整理及数据流

    写在前面 xff1a 这篇blog主要参考pixhawk的高度解算算法解读 xff0c 并且加以扩展 xff0c 扩展到其他传感器 xff0c 其实里面处理好多只是记录了流程 xff0c 至于里面实际物理意义并不是很清楚 xff0c 也希望
  • 【Pixhawk】注册一个字符型驱动设备

    最近学习Pixhawk的SPI xff0c 本以为PX4是STM32单片机而已 xff0c 写个SPI驱动应该很简单 但是当我看到mpu9250的那些cpp文件 xff0c 我一下就蒙了 由于PX4用的NUTTX系统 xff0c 类似Lin
  • 搭建pixhawk飞控无人小车--替换自带遥控器

    因为小车原装遥控器接收机和电调版整合在一个小板子上 xff0c 且没有相关资料 xff0c 无法接入飞控 因此单独购买遥控器 在某宝上购买富斯遥控器i6 xff0c 总共六个通道 三个双向开关 一个三向开关 遥控器简单入门视频如下 xff0
  • Pixhawk-串级pid介绍

    根深方能叶茂 在等待的日子里 xff0c 刻苦读书 xff0c 谦卑做人 xff0c 养得深根 xff0c 日后才能枝叶茂盛 Better 根爷 鉴于串级PID在pixhawk系统中的重要性 xff0c 无论是误差的补偿 xff0c 如姿态
  • APM与Pixhawk间的关系

    1 APM 本文APM指代 xff1a https github com ArduPilot ardupilot 2 Pixhawk 本文Pixhawk指代 xff1a https github com PX4 Firmware 3 关系
  • Pixhawk WIFI模块Station模式配置

    Pixhawk WIFI模块配置 最近在鼓捣Pixhawk的飞控 xff0c 用来控制双桨的无人船 xff0c 固件刷的最新的ArduRover4 0 0 xff0c 经过扒论坛 xff0c 现场调试 xff0c 终于能让一艘船按照航点前行
  • 步骤五:PIXHAWK遥控器的使用

    采用福斯i6s遥控 1 连接飞控 打开遥控器 xff0c 接收机插上飞控 xff0c 再插上送的短接线 xff0c 进行匹配对码RX 2 遥控器长按两秒锁 xff0c system output mode Output mode按照图片这样
  • mission planner SITL仿真系统配置

    背景 主要参考ArduPilot的官网 作者还拥有个人公众号 会写一些感悟文章 知圈 二维码如下 欢迎扫描关注 关注后有作者微信 欢迎添加交流 链路图 图源 Cygwin 下载 去官网下载Cygwin 作者电脑windows 10 64位

随机推荐

  • strchr、strrchr、memchr函数详解及模拟实现

    strchr 函数介绍 函数原型 xff1a span class hljs keyword char span span class hljs built in strchr span span class hljs keyword co
  • 【排序算法】:基数排序

    定义 基数排序 xff08 radix sort xff09 属于 分配式排序 xff08 distribution sort xff09 xff0c 又称 桶子法 xff08 bucket sort xff09 或bin sort xff
  • 【排序算法】:九大排序算法总结

    直接插入排序 参考博客 xff1a 排序算法 xff1a 直接插入排序 时间复杂度 xff1a 平均情况 xff1a O N 2 最好情况 xff1a O N 最坏情况 xff1a O N 2 空间复杂度 xff1a O 1 稳定性 xff
  • 使用Marlin1.1.x固件进行多电机控制(4轴联动+5个挤出机)

    有必要发一个博客 xff0c 这几天做实验没啥进展 xff0c 烦 写东西清理思路 xff0c 整理思维 这篇博文为了交流 xff0c 为两种读者 xff0c 第一种是做3d打印机想要给机器增加5个挤出机的人 xff0c 第二种是遇到运动控
  • 单下划线和双下划线(私有变量和公有变量)

    单下划线 开始的成员变量叫做保护变量 xff0c 意思是只有类对象和子类对象自己能访问到这些变量 xff1b 双下划线 开始的是私有成员 xff0c 意思是只有类对象自己能访问 xff0c 连子类对象也不能访问到这个数据 以单下划线开头 x
  • STM32寄存器的简介、地址查找,与直接操作寄存器

    什么是寄存器 提到单片机 xff0c 就不得不提到寄存器 根据百度百科介绍 xff0c 寄存器是中央处理器内的组成部分 寄存器是有限存贮容量的高速存贮部件 xff0c 它们可用来暂存指令 数据和地址 简单来说 xff0c 寄存器就是存放东西
  • 卡尔曼滤波五个公式推导

    一 两个方程 1 xff0c 系统的状态方程 xff08 预测方程 xff09 x k 61 A k
  • 实时操作系统RTOS(一)——资源整理

    文章目录 1 COS2 FreeRTOS3 NuttX参考资料 1 COS Micrium官网 C全家桶的githubMicrium书籍 xff08 C OS III C OS II C TCP IP C USB xff09 Micrium
  • 路由器设置之后不能连网,动态ip显示为0

    刚从学习毕业 xff0c 那么独居的日子里 xff0c 网络自然是不可或缺的 xff0c 于是博主在等到安装人员上门之后 xff0c 他竟然提出无耻的要求 配置路由器要收费 xff0c 于是乎作为一名计算机从业者 xff0c 自然不能让他把
  • 链表的倒序

    1 用函数实现 xff1a 定义3个临时变量 xff0c p1储存当前节点 xff0c p2储存后一个节点 xff0c p3储存重新指向的那个节点 步骤 xff1a 1 p1指向当前节点 xff0c p2指向后一个节点 xff0c 将p2的
  • Python入门:使用PyCharm调试Python程序

    Python入门 xff1a 使用PyCharm调试Python程序 面向Python初学者 PyCharm集成运行环境 在了解Python编程之前 xff0c 我们需要先弄明白如何编写运行代码 所以非常有必要先讲解一下Python的集成开
  • Debian9.5安装g++

    看了网上很多文章 gcc安装很轻松 xff0c 但是g 43 43 的安装过程就曲折多了 写此博客记录一下Debian9 5操作系统下g 43 43 安装过程 首先替换apt源为阿里云的源 xff1a debian 配置 debian 7
  • CMakeLists.txt文件中添加OpenCV库依赖项

    CMakeLists txt文件中添加OpenCV库依赖项 cmake needs this line cmake minimum required VERSION 2 8 Define project name project openc
  • 物理地址和逻辑地址

    1 物理地址和逻辑地址 物理地址 xff1a 加载到内存地址寄存器中的地址 xff0c 内存单元的真正地址 在前端总线上传输的内存地址都是物理内存地址 xff0c 编号从0开始一直到可用物理内存的最高端 这些数字被北桥 Nortbridge
  • 树莓派无opencv时进行视频实时处理

    用树莓派 xff0c 想要进行图像处理 xff0c 但网上的很多教程都用opencv xff0c opencv在树莓派上安装很麻烦 xff0c 那怎样进行图像处理呢 xff1f 代码如下 xff1a from picamera array
  • make: warning: Clock skew detected. Your build may be incomplete.

    问题现象 xff1a make warning Clock skew detected Your build may be incomplete 问题分析 xff1a 根据报警提示 xff0c 应该问题出现时钟问题 问题原因 xff1a 当
  • 关于Java之IO流音乐拼接小项目

    需求 xff1a 做一个音乐串烧 分析 xff1a 1 有n个音乐 xff0c 找到高潮部分 xff0c 2 获取高潮部分的流对象 3 把这部分对象保存成一个mp3 4 把它们拼接起来 以下为源码供大家分享 xff1a 方法一 xff1a
  • pixhawk源码下载与编译

    今天和同学在一起讨论发现自己还在看的pixhawk源码的版本好低啊 xff0c 就下个最新的吧 想起有些人还不会下载源码 xff0c 以及用什么工具查看 源码的下载我用的是git shell工具下的 xff0c px4的github网址是h
  • pixhawk开发环境

    Windows 7 64bit 软件安装 首先 xff0c 需要安装一些软件 xff0c CMake 32位的Java jdk以及PX4 Toolchain Installer CMake的话笔者使用的是CMake 3 3 2 win32
  • Pixhawk-信息流浅解析

    根深方能叶茂 在等待的日子里 xff0c 刻苦读书 xff0c 谦卑做人 xff0c 养得深根 xff0c 日后才能枝叶茂盛 Better 根爷 之前我们已经谈到系统框架 xff0c 之前谈到了定制自己功能的两部 xff1a 添加模块和修改