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之学习杂谈

    一 开篇 距离上一篇博文已经很久了 xff0c 最近主要就是参加了几家公司的电话面试 xff0c 思考了一些问题 xff0c 本身就是半路杀进无人机领域的门外汉 对整个飞行控制部分理解的也是皮毛的皮毛 xff0c 经过几家面试之后 xff0
  • pixhawk飞控接口含义

    官方文档 xff1a https docs px4 io v1 9 0 en flight controller pixhawk html 1 spektrum DSM receiver2 xff0c 3 远程通信口 xff0c 接数传4
  • pixhawk学习

    原文转载至https blog csdn net u013181595 article details 80976610 1硬件架构分析 Pixhawk是一款基于ARM芯片的32位开源飞控 xff0c 由ETH的computer visio
  • pixhawk飞控板添加额外pwm输出通道控制开伞或舵机转动实现功能

    学习大佬的文章 xff0c 贴图来用 https blog csdn net dai93 article details 89852241 这是输出流的大致示意 如果在飞控需要控制单独的舵机 xff0c 可以自定义一个pwm通道输出 xff
  • Pixhawk无人机飞行模式详解 (PX4源码)

    我帮大家把飞行模式控制量与特点总结一下 xff0c 方便看代码 xff0c 如下所示 xff1a 辅助模式 Position Mode 位置模式 xff08 定点模式 xff09 横滚俯仰控制角度 xff0c 油门控制上下速度 xff0c
  • PIXHAWK 4 中文资料 文档 PCB

    最先进的PX4自动驾驶仪开发工具包 PixHawk 4是PixHawk飞行控制器家族中最新最成功的产品 它是由Holybro 和 Auterion合作开发 xff0c 优化PX4 它预装了最新的PX4原生固件 它采用了目前最先进的STMic
  • pixhawk似乎也是用的四环串级

    pixhawk似乎也是用的四环串级 https blog csdn net sinat 16643223 article details 106973618 阿木社区的pixhawk的课里 https bbs amovlab com plu
  • PIXHAWK机架类型的的设置选择与电机通道顺序设置

    1 共轴直升机 main1 左侧斜盘电机 xff0c 控制俯仰 main2 xff1a 左侧斜盘电机 xff0c 控制滚转 main3 xff1a 上面旋翼 xff0c 逆时针旋转 main4 xff1a 下面旋翼 xff0c 顺时针旋转
  • Pixhawk学习7——位置解算

    Pixhawk的位置解算分为两部分 xff0c 第一部分主要为传感器的数据获取 xff0c 而该部分最主要的就是GPS数据的提取 第二部分为与惯性器件之间的组合导航 组合导航的好处我就不用多说了 Pixhawk代码中目前主要有两处组合导航的
  • 转载:Pixhawk源码笔记八:添加新的参数

    转载 xff1a 新浪 64 WalkAnt 第九部分 添加新的参数 英文参考 xff1a http dev ardupilot com wiki code overview adding a new parameter 本节源自 xff1
  • Pixhawk飞行模式的讨论

    手动模式 offboard 地面站 操控的区别 使用遥控操纵的模式 Simple and Super Simple 选项 加了这个选项之后 xff0c 它的磁力计会记录飞机解锁时 xff0c 朝向就是无人机的前方 每个飞行模式的旁边都有一个
  • Pixhawk之姿态控制篇

    一 开篇 姿态控制篇终于来了 来了 来了 心情爽不爽 xff1f 愉悦不愉悦 xff1f 开心不开心 xff1f 喜欢的话就请我吃顿饭吧 xff0c 哈哈 其实这篇blog一周前就应该写的 xff0c 可惜被上一篇blog霸占了 但是也不算
  • pixhawk make文件分析

    由于笔者没学过Linux等系统 xff0c 对make文件所知甚少 xff0c 本节分析可能有大量错误 xff0c 只提供参考 xff0c 随着技术积累 xff0c 以后会回过头改正错误的地方 xff0c 也非常欢迎提出指导意见 其中分析大
  • pixhawk接口图以及引脚说明

    pixhawk接口图和引脚如下 pixhawk可以同时使用2个GPS xff0c 这只能使用其中一个罗盘 xff0c 实际中飞控挑选其中信号好的一个GPS进行定位 硬件部分 xff1a 第二个GPS插在serial 4 5接口上 xff0c
  • APM与Pixhawk间的关系

    1 APM 本文APM指代 xff1a https github com ArduPilot ardupilot 2 Pixhawk 本文Pixhawk指代 xff1a https github com PX4 Firmware 3 关系
  • 树莓派结合PIXHAWK飞控实现四轴双目视觉避障

    树莓派结合Pixhawk飞控实现四轴双目视觉避障 灰信网 xff08 软件开发博客聚合 xff09 无人机双目视觉避障的实现 本文将介绍如何使用树莓派结合PIX飞控实现无人机双目视觉避障的功能 主要硬件 我们以双目摄像头 43 树莓派 43
  • Pixhawk指示灯和安全开关含义

    Pixhawk指示灯的含义 红灯和蓝灯闪 xff1a 初始化中 请稍等 黄灯双闪 xff1a 错误 系统拒绝解锁 蓝灯闪 xff1a 已加锁 xff0c GPS搜星中 自动导航 xff0c 悬停 xff0c 还有返回出发点模式需要GPS锁定
  • 自己组装Pixhawk F450无人机的一些细节

    首先参考文档为 xff1a 1 https mp weixin qq com s VXKU kIB v i0AX3zgtLig 2 https mp weixin qq com s Qzzl dQ6Tz2pXNp7Oj0lTg 3 http
  • pixhawk 整体架构的认识

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • Pixhawk WIFI模块Station模式配置

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

随机推荐

  • 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 添加模块和修改