基础实验篇 | uORB消息读写与自定义实验(一)

news2024/11/27 13:42:07

导读

uORB是PX4/Pixhawk系统中非常重要且关键的模块之一,是用于无人机模块间通信的协议机制。本篇将详细介绍uORB并详细拆解uORB消息读写与自定义实验(一)。

基础实验篇 | uORB消息读写与自定义实验(一)

ect Request Broker,微对象请求代理器)是PX4/Pixhawk系统中非常重要且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS、PPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。实际上uORB是一套跨「进程」 的IPC通讯模块。在Pixhawk中, 所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。在PX4中,uORB是用于无人机模块间通信的协议机制。

01

uORB消息简介

uORB(Micro Object Request Broker,微对象请求代理器)是PX4/Pixhawk系统中非常重要且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS、PPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。实际上uORB是一套跨「进程」 的IPC通讯模块。在Pixhawk中, 所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。在PX4中,uORB是用于无人机模块间通信的协议机制。

02

uORB消息的运行机制

飞控内部使用NuttX实时ARM系统, 而uORB对于NuttX而言,它仅仅是一个普通的文件设备对象,这个设备支持Open、Close、Read、Write、Ioctl以及Poll机制。通过这些接口的实现,uORB提供了一套“点对多”的跨进程广播通讯机制, “点”指的是通讯消息的“源”,“多”指的是一个源可以有多个用户来接收、处理。而“源”与“用户”的关系在于,源不需要去考虑用户是否可以收到某条被广播的消息或什么时候收到这条消息。它只需要单纯的把要广播的数据推送到uORB的消息“总线”上。对于用户而言,源推送了多少次的消息也不重要,重要的是取回最新的这条消息。也就是说在通讯过程中发送者只负责发送数据,而并不关心数据由谁接收,也不关心接收者是否能将所有的数据都接收到;而对于接收者来说并不关心数据是由谁发送的,也不关心在接收过程中是否将所有数据都接收到。

uORB在数据发布与接收过程中并不保证发送者的所有数据都可以被接收者收到,而只保证接收者在想要接收时能收到最新的数据。而发送与接收的分离可以使飞行过程中各个模块相互独立,互不干扰。实际上一个uORB可以由多个发送者发布,也可以被多个接收者接收,也就是说他们之间是多对多的关系。发布者以一定频率更新发布数据到uORB平台上,不关心谁来接收。订阅者可以随时来获取数据。

PX4软件系统中提供有丰富的例程,其中“*\PX4PSP\Firmware\src\examples\px4_simple_app”为一个简单的uORB消息订阅读取的例程,本例程中通过订阅vehicle_acceleration话题,读取加速度计数据,并将其发布到vehicle_attitude话题上。具体代码解析如下:


#include <px4_platform_common/px4_config.h>
#include <px4_platform_common/tasks.h>
#include <px4_platform_common/posix.h>
#include <unistd.h>
#include <stdio.h>
#include <poll.h>
#include <string.h>
#include <math.h>

#include <uORB/uORB.h>
#include <uORB/topics/vehicle_acceleration.h>
#include <uORB/topics/vehicle_attitude.h>

__EXPORT int px4_simple_app_main(int argc, char *argv[]);

int px4_simple_app_main(int argc, char *argv[])
{
  PX4_INFO("Hello Sky!");

  /* 订阅 vehicle_acceleration 话题 */
  int sensor_sub_fd = orb_subscribe(ORB_ID(vehicle_acceleration));
  /* 限制更新速率为 5 Hz */
  orb_set_interval(sensor_sub_fd, 200);

  /* 广播 attitude 话题 */
  struct vehicle_attitude_s att;
  memset(&att, 0, sizeof(att));
  orb_advert_t att_pub = orb_advertise(ORB_ID(vehicle_attitude), &att);

  /* 创建一个数组fds,其中包含一个文件描述符sensor_sub_fd以及对应的事件设置为可读事件。*/
  px4_pollfd_struct_t fds[] = {
    { .fd = sensor_sub_fd,   .events = POLLIN },
    /* 这里还可以有更多的文件描述符,例如:
     * { .fd = other_sub_fd,   .events = POLLIN },
     */
  };

  int error_counter = 0;

  for (int i = 0; i < 5; i++) {
    /* 等待传感器更新,等待1个文件描述符的数据,超时时间为1000毫秒(1秒) */
    int poll_ret = px4_poll(fds, 1, 1000);

    /* 处理轮询结果 */
    if (poll_ret == 0) {
      /* 这意味着在一秒内没有数据提供者给我们数据 */
      PX4_ERR("在一秒内没有获取到数据");

    } else if (poll_ret < 0) {
      /* 这是一个严重的错误 - 应该是紧急情况 */
      if (error_counter < 10 || error_counter % 50 == 0) {
        /* 使用计数器来防止过多的错误消息(以免影响性能) */
        PX4_ERR("轮询返回值出现错误: %d", poll_ret);
      }

      error_counter++;

    } else {

      if (fds[0].revents & POLLIN) {
        /* 获取第一个文件描述符的数据 */
        struct vehicle_acceleration_s accel;
        /* 将传感器的原始数据复制到本地缓冲区 */
        orb_copy(ORB_ID(vehicle_acceleration), sensor_sub_fd, &accel);
        PX4_INFO("加速度计:\t%8.4f\t%8.4f\t%8.4f",
           (double)accel.xyz[0],
           (double)accel.xyz[1],
           (double)accel.xyz[2]);

        /* 设置 att 并将此信息发布给其他应用程序
         * 以下示例没有实际意义,仅供参考
        */
        att.q[0] = accel.xyz[0];
        att.q[1] = accel.xyz[1];
        att.q[2] = accel.xyz[2];

        orb_publish(ORB_ID(vehicle_attitude), att_pub, &att);
      }

      /* 这里还可以有更多的文件描述符,例如:
       * if (fds[1..n].revents & POLLIN) {}
       */
    }
  }

  PX4_INFO("程序退出");

  return 0;
}

上述例程所示PX4 软件中自带的例程,但是在进行编译时,本例程默认是不运行,若想运行本例程需要在对于飞控板载文件夹中修改“*\PX4PSP\Firmware\boards\droneyee\zyfc-h7\default.cmake”文件,注:本实验中所用的飞控硬件为卓翼H7,不同飞控硬件对应各自文件夹

 设置完成上述所有步骤之后,在RflySim软件桌面快捷方式文件夹中,双击运行Win10WSL子系统。运行:


# 此处编译命令应对应RflySim安装时的编译命令
make droneyee_zyfc-h7_default

等待编译成功之后,通过QGC上传该固件到飞控中,在QGC的Anslyze Tools->MAVLINK 控制台中,输入px4_simple_app即可看到本例程的运行效果如下:

 04

PX4软件自定义uORB消息

在PX4中创建自定义uORB消息的过程一般分为三个步骤:定义msg文件、uORB消息发布与订阅、修改飞控板载.cmake文件。且整个过程需要修改涉及的文件较多,具体步骤如下:

1、定义msg文件RflySim的暗转文件夹“*\PX4PSP\Firmware\msg”中,创建文件uorb_test.msg文件,文件内容如下:


uint64 timestamp  # time since system start (microseconds)
uint32 test1
uint32 test2
uint32 test3

同时,需要修改同级目录下的CMakeLists.txt文件,即新增定义的msg文件。

2、uORB消息发布和订阅与uORB消息的读取步骤相类似,我们只需在“*\PX4PSP\Firmware\src\examples”中 创建应用文件夹,新建“C:\PX4PSP\Firmware\src\examples\uORB_test”文件夹,其中,包含有CMakeLists.txt、uORB_test.c两个文件,文件具体内容如下:

CMakeLists.txt:


px4_add_module(
  MODULE examples__uORB_test
  MAIN uORB_test
  SRCS
    uORB_test.c
  DEPENDS
  )

uORB_test.c:


#include <px4_platform_common/px4_config.h>
#include <px4_platform_common/tasks.h>
#include <px4_platform_common/posix.h>
#include <unistd.h>
#include <stdio.h>
#include <poll.h>
#include <string.h>
#include <math.h>

#include <uORB/uORB.h>
#include <uORB/topics/uorb_test.h>

__EXPORT int uORB_test_main(int argc, char *argv[]);

int uORB_test_main(int argc, char *argv[])
{
  PX4_INFO("Hello Sky!");

  //发布消息
  struct uorb_test_s test_uorb_ad;
  memset(&test_uorb_ad, 0, sizeof(test_uorb_ad));
  orb_advert_t test_pub = orb_advertise(ORB_ID(uorb_test), &test_uorb_ad);

  test_uorb_ad.test1=1;
  test_uorb_ad.test2=2;
  test_uorb_ad.test3=3;
  orb_publish(ORB_ID(uorb_test),test_pub,&test_uorb_ad);


  // //订阅消息
  // struct uorb_test_s test_uorb_sub;
  // memset(&test_uorb_ad, 0, sizeof(test_uorb_sub));

  // int test_sub_fd=orb_subscribe(ORB_ID(uorb_test));

  // orb_copy(ORB_ID(uorb_test),test_sub_fd,&test_uorb_sub);


  // PX4_INFO("test:\t%8.4f\t%8.4f\t%8.4f",
  //      (double)test_uorb_sub.test1,
  //      (double)test_uorb_sub.test2,
  //      (double)test_uorb_sub.test3);


  PX4_INFO("exiting");

  return 0;
}

3、修改飞控.cmake文件在飞控板载文件夹中修改“*\PX4PSP\Firmware\boards\droneyee\zyfc-h7\default.cmake”文件,注:本实验中所用的飞控硬件为卓翼H7,不同飞控硬件对应各自文件夹。

设置完成上述所有步骤之后,在RflySim软件桌面快捷方式文件夹中,双击运行Win10WSL子系统。运行:


# 此处编译命令应对应RflySim安装时的编译命令
make droneyee_zyfc-h7_default

等待编译成功之后,通过QGC上传该固件到飞控中,在QGC的Anslyze Tools->MAVLINK 控制台中,输入px4_simple_app即可看到本例程的运行效果如下:

参考资料

[1]. https://blog.csdn.net/sinat_16643223/article/details/113872249 

[2]. https://blog.csdn.net/qq_32261101/article/details/109534659 

[3]. https://blog.csdn.net/qq_38768959/article/details/122587617

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

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

相关文章

7、动手学深度学习——卷积神经网络:基础部件+LeNet

1、图像卷积 1. 互相关运算 严格来说&#xff0c;卷积层是个错误的叫法&#xff0c;因为它所表达的运算其实是互相关运算&#xff08;cross-correlation&#xff09;&#xff0c;而不是卷积运算。在卷积层中&#xff0c;输入张量和核张量通过(互相关运算)产生输出张量。 首先…

python 中禁用 SettingWithCopyWarning

最近代码中出现了这个warn&#xff0c;但是我确信我已经把所有的df赋值都改成loc了&#xff0c;依旧会出现&#xff0c;只有把这个warn禁了。 import pandas as pd import warnings# 禁用 SettingWithCopyWarning 警告 warnings.filterwarnings("ignore", categorypd…

闲人闲谈PS之四十三——标准程序的陷阱

惯例闲话&#xff1a;7月&#xff0c;闲人家乡的水蜜桃成熟了&#xff0c;闲人很喜欢吃桃子&#xff0c;可惜经常出门在外&#xff0c;经常错过了水果最好的季节&#xff0c;这次委托家人邮寄了几箱&#xff0c;果然还是家乡的桃子好吃。回顾这几年&#xff0c;错过了不仅仅是水…

数据库sql 根据身份证计算年龄段mysql、oracle

数据库sql根据身份证计算年龄段 mysql: SELECTage,count(*) numFROM(SELECTCASEWHEN TIMESTAMPDIFF(YEAR,DATE(substring(id_card,7,8)),CURDATE())<35 THEN 35岁以下WHEN TIMESTAMPDIFF(YEAR,DATE(substring(id_card,7,8)),CURDATE()) > 35AND TIMESTAMPDIFF(YEAR,DATE…

deque容器语法

文章目录 deque容器deque容器基本概念功能&#xff1a;deque 的实现细节deque与vector底层区别&#xff1a; deque构造函数功能描述&#xff1a;函数原型&#xff1a; deque元素访问deque赋值操作功能描述&#xff1a;函数原型&#xff1a; deque大小操作功能描述&#xff1a;函…

哪些期货公司招居间人,期货居间人的红利期时代已过,该何去何从

2021年9月10日&#xff0c;中国期货业协会发布了关于发布《期货公司居间人管理办法 (试行)》的通知&#xff0c;《期货公司居间人管理办法(试行)》正式出台。 根据通知&#xff0c;期货公司仅能与经有关金融监管部门批准设立的证券公司等金融机构开展居间合作。现在的法人居间绝…

【stable-diffuision-webui】controlnet制作动漫二维码(丐版)

主要参考 原作者的博文&#xff1a;AI生成可扫码图像 — 新 ControlNet 模型展示 光照生成模型C站说明&#xff1a;https://civitai.com/models/80536/lighting-based-picture-control-controlnet 扩展阅读&#xff1a;https://aigc.ioclab.com/sd-showcase/light_controlnet.…

Sentieon | 每周文献-Agrigenomics-第四期

农业系列文章-1 标题&#xff08;英文&#xff09;&#xff1a;Genomic footprints of sorghum domestication and breeding selection for multiple end uses标题&#xff08;中文&#xff09;&#xff1a;高粱驯化的基因组足迹和多种最终用途的育种选择发表期刊&#xff1a;《…

vue3中使用jsx

一、使用vue-cli创建的项目中使用jsx语法 安装Vue 3&#xff1a;使用Vue CLI创建一个新项目或通过npm安装Vue。 配置Vue JSX插件&#xff1a;在创建的项目中&#xff0c;找到 babel.config.js 文件&#xff0c;添加以下插件配置&#xff1a; module.exports {presets: [vue…

CentOS Linux MySQL 数据库 的安装方法

一、简单了解MySQL数据库的体系结构 &#xff08;一&#xff09;MySQL架构图 &#xff08;二&#xff09;MySQL体系结构&#xff1a;连接层、服务层、引擎层、存储层 1、连接层--主要职责&#xff1a;身份认证&#xff0c;连接管理&#xff0c;获取权限信息 &#xff08;1&am…

No11.精选前端面试题,享受每天的挑战和学习

文章目录 JS数组去重的几个方法讲下es6新增symbol 数据类型v-model原理是什么vue响应式原理vue中的data 为什么是个函数&#xff1f;前端有几种缓存方式 JS数组去重的几个方法 在JavaScript中&#xff0c;可以使用几种方法对数组进行去重&#xff1a; 使用Set&#xff1a;Set…

每日汇评:美联储会议纪要是否能确认黄金的看涨楔形?

1、在美国独立日清淡的交易中&#xff0c;黄金价格创下了一周以来的新高&#xff1b; 2、在美联储会议纪要之前&#xff0c;美元利用了对经济衰退的担忧和中美科技之争&#xff1b; 3、黄金需要日线收在1922美元上方才能确认看涨楔形&#xff0c;但看跌的RSI值得谨慎&#xf…

png转svg图片免费

svg免费转换网站 https://vectr.com/design/editor/c232c8cb-5eb8-4bae-b302-25cb94a8f737 操作步骤 1.上传png或者其他格式图片 2.点击导出文件 3.选择导出格式为svg和其他配置参数 4.打开下载好的svg图片 5.在编辑器中看svg图片

短视频矩阵系统源码自研+开发技术文档

一、短视频矩阵系统源码自研&#xff08;站在开发者交付分析&#xff09; 目录 一、短视频矩阵系统源码自研&#xff08;站在开发者交付分析&#xff09; 二、 短视频矩阵系统需要开发的前提语言框架技巧&#xff1a;NGINX&#xff0c;PHP7.4&#xff0c;MySQL5.7&#xff0…

多个微信号如何管理?

很多公司都在发愁这几个问题&#xff1a; 1、拥有多个微信号&#xff0c;不想管理多台手机&#xff0c;想将所有微信号进行统一管理 2、想用软件来代替传统的营销体系&#xff0c;安全性上也要有保障 3、用人成本太大与公司的效益不成正比 4、多个账号发圈不方便&#xff0…

创作神器:探索ai智能绘画软件的魅力与功能

曾经有一个名叫小艾的年轻画家&#xff0c;她对绘画充满热情&#xff0c;并梦想创作出令人惊叹的艺术作品。然而&#xff0c;她发现自己在技术和创意方面遇到了一些困难。正当她感到沮丧时&#xff0c;她听说了一个关于智能ai绘画软件的故事&#xff0c;这个软件据说能够通过机…

Layui的table数据渲染不显示是怎么回事?

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;推荐系列&#xff1a;点击进入推荐系列…

Pycharm远程设置 DDP简单介绍

前言 最近接到一些改代码或者帮助debug的需求&#xff0c;大多数不是在本地而是autodl这种服务器上&#xff0c;有些人可能不太了解如何设置远程环境。通常在实验室一般都是在本地调好代码然后scp到服务器上去训练&#xff0c;不过这就需要本地有显卡能测试代码是否能跑通&…

【NX】NX二次开发设置对象高亮和颜色模板实现

在NX二次开发当中&#xff0c;我们经常需要高亮一个或者多个对象&#xff0c;或者设置对象的颜色方便实现&#xff0c;直接调用函数稍微显得麻烦&#xff0c;尤其是当我们需要处理的对象是容器的时候&#xff0c;于是我写了几个简单的模板实现&#xff0c;方便调试。 //author&…

Android Studio利用CMake生成.so文件并且可供其他项目引用

1、CMake工具 1.1、CMake是什么 CMake是一个主要用于CPP的构建工具。CMake语言是平台无关的中间编译工具。同一个CMake编译规则在不同系统平台构建出不同的可执行构建文件&#xff0c;所有操作都是通过编译CMakeLists.txt来完成的。在Linux产生MakeFile&#xff0c;在Windows…