PX4官方examples 发布与订阅 分析

2023-05-16

功能:实现 订阅 sensor_combined 消息,将订阅的消息数据 通过发布主题( vehicle_attitude)发布出去
/****************************************************************************
*

  • Copyright © 2012-2019 PX4 Development Team. All rights reserved.
  • Redistribution and use in source and binary forms, with or without
  • modification, are permitted provided that the following conditions
  • are met:
    1. Redistributions of source code must retain the above copyright
  • notice, this list of conditions and the following disclaimer.
    1. Redistributions in binary form must reproduce the above copyright
  • notice, this list of conditions and the following disclaimer in
  • the documentation and/or other materials provided with the
  • distribution.
    1. Neither the name PX4 nor the names of its contributors may be
  • used to endorse or promote products derived from this software
  • without specific prior written permission.
  • THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  • “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  • LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  • FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  • COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  • INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  • BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  • OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  • AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  • LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  • ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  • POSSIBILITY OF SUCH DAMAGE.

****************************************************************************/

/**

  • @file px4_simple_app.c
  • Minimal application example for PX4 autopilot
  • @author Example User mail@example.com
    */

#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/sensor_combined.h> //引入 需要订阅sensor_combined 消息头文件
#include <uORB/topics/vehicle_attitude.h> //引入 需要发布vehicle_attitude 消息头文件

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

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

/* subscribe to sensor_combined topic */ 
//功能:订阅主题(topic)
//说明:通过实例的ID索引来确定是主题的哪个实例;
//可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_combined));

/* limit the update rate to 5 Hz */
//int orb_set_interval(int handle, unsigned interval)
//功能:设置订阅的最小时间间隔;订阅消息间隔200ms一次
//说明:如果设置了,则在这间隔内发布的数据将订阅不到;需要注意的是,设置后,第一次的数据订阅还是由起初设	 //  	置的频率来获取
//参数:handle:orb_subscribe函数返回的句柄;interval:间隔时间,单位ms;
orb_set_interval(sensor_sub_fd, 200);

/* advertise attitude topic */
//生成一个来自vehicle_attitude.h的vehicle_attitude_s类型的结构体
struct vehicle_attitude_s att;
memset(&att, 0, sizeof(att));
//功能:公告发布者的主题;
//说明:在发布主题之前是必须的;否则订阅者虽然能订阅,但是得不到数据;
//参数:uORB元对象,可以认为是主题id,一般是通过ORB_ID(主题名)来赋值;
//	   指向一个已被初始化,发布者要发布的数据存储变量的指针;
//返回值:错误则返回ERROR;成功则返回一个可以发布主题的句柄;如果待发布的主题没有定义或声明则会返回-1,然后会将errno赋值为ENOENT;
orb_advert_t att_pub = orb_advertise(ORB_ID(vehicle_attitude), &att);

/* one could wait for multiple topics with this technique, just using one here */
//添加订阅消息的进程,如果订阅多个消息,①将在结构体中{ }添加订阅主题的返回值
px4_pollfd_struct_t fds[] = {
	{ .fd = sensor_sub_fd,   .events = POLLIN },
	/* there could be more file descriptors here, in the form like:
	 * { .fd = other_sub_fd,   .events = POLLIN },
	 */
};

int error_counter = 0;

for (int i = 0; i < 5; i++) {
	/* wait for sensor update of 1 file descriptor for 1000 ms (1 second) */
	//添加等待订阅消息的时间,非阻塞,如果订阅n个消息,②将修改第二个参数n
	int poll_ret = px4_poll(fds, 1, 1000);

	/* handle the poll result */
	if (poll_ret == 0) {
		/* this means none of our providers is giving us data */
		PX4_ERR("Got no data within a second");

	} else if (poll_ret < 0) {
		/* this is seriously bad - should be an emergency */
		if (error_counter < 10 || error_counter % 50 == 0) {
			/* use a counter to prevent flooding (and slowing us down) */
			PX4_ERR("ERROR return value from poll(): %d", poll_ret);
		}

		error_counter++;

	} else {
		//读取订阅的消息进程中有无数据,如果订阅多个消息,③将继续在添加if语句fd[n]...
		if (fds[0].revents & POLLIN) {
		
			/* obtained data for the first file descriptor */
			//创建来自sensor_combined.h的sensor_combined_s结构体实例;注意结构体 *_s
			struct sensor_combined_s raw;
			
			/* copy sensors raw data into local buffer */
			//读取sensor_sub_fd的数据到raw中
			orb_copy(ORB_ID(sensor_combined), sensor_sub_fd, &raw);
			//在终端中输出
			PX4_INFO("Accelerometer:\t%8.4f\t%8.4f\t%8.4f",
				 (double)raw.accelerometer_m_s2[0],
				 (double)raw.accelerometer_m_s2[1],
				 (double)raw.accelerometer_m_s2[2]);

			/* set att and publish this information for other apps
			 the following does not have any meaning, it's just an example
			*/
			//只是试验例程,无功能意义;raw数组中的数据赋值给att数组
			att.q[0] = raw.accelerometer_m_s2[0];
			att.q[1] = raw.accelerometer_m_s2[1];
			att.q[2] = raw.accelerometer_m_s2[2];
			
			//实现向vehicle_attitude消息中发布数据
			orb_publish(ORB_ID(vehicle_attitude), att_pub, &att);
		}

		/* there could be more file descriptors here, in the form like:
		 * if (fds[1..n].revents & POLLIN) {}
		 */
	}
}

PX4_INFO("exiting");

return 0;

}

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

PX4官方examples 发布与订阅 分析 的相关文章

  • 程序员成长路线

    回顾过去 xff0c 我们会清晰地看见走过来的路线 xff0c 但面向未来我们又该如何走下去 xff1f 但凡过往 xff0c 皆为序章 xff0c 过去不可变 xff0c 未来才是希望 xff0c 而如何去规划并管理好未来的成长进化之路
  • 消息队列、信号量、事件组、任务通知之间的区别

    消息队列 信号量 事件组 任务通知之间的区别 消息队列 xff08 需要传递消息时使用 xff09 在任务与任务间 中断和任务间传递信息 xff0c 可以数据传输 事件标志组 xff08 多个事件同步 xff0c 不需要传递消息时使用 xf
  • 包含癞子的麻将胡牌算法

    记录一下麻将的通用胡牌算法实现 xff0c 只要满足M x ABC 43 N x DDD 43 EE 即可胡牌 在这里先分析一下最简单的胡牌思路 xff1a 先找出所有可能的将牌 xff0c 若除去两张将牌之外的所有牌都能成扑 xff0c
  • 麻将胡牌算法

    用数字代替麻将中的所有牌 xff1a 一万 九万 1 9 一筒 九筒 11 19 一条 九条 21 29 东 南 西 北 中 发 白 31 37 胡牌的种类 xff1a 对对胡 十三幺和33332 判断胡牌的过程 xff08 以下所说的规则
  • 麻将胡牌万能公式:

    基本胡牌类型 M AAA 43 N ABC 43 DD xff08 AAA 是三个刻字 xff0c ABC 是顺子 xff0c DD 是将牌 xff09 麻将总共14张 xff0c m和n系数 xff0c AAA代表一样的三个 xff0c
  • 麻将

    来自百度百科https baike baidu com item E9 BA BB E5 B0 86 215 fr 61 aladdin 一副完整的麻将牌共152张 包括字牌 花牌 序数牌 百搭牌 流行的是精简版麻将 xff0c 不含百搭和
  • 使用etcdctl 获取 kubernetes etcd内容

    kubernetes排错过程中可能需要连接到etcd库核对数据 通过etcdctl命令可以连接到库 xff0c 查看etcd库中的key value 创建一个etcdctl的别名 证书的位置可以通过查看kubelet 运行参数获取到 etc
  • Jenkins 部署jar包到服务器并启动后的乱码问题

    在java命令中加 参数 Dfile encoding 61 UTF 8 export LANG 61 zh CN UTF 8 是为了解决应用输出的日志中有乱码的问题 export LANG 61 zh CN UTF 8 nohup jav
  • VS CODE 页面没暂存/提交就放弃更改了怎么还原

    如图所示 xff0c 不小心手滑将还没有暂存的页面点了放弃更改 xff0c 过了两天才发现搞错了 xff0c 这时候怎么办呢 xff1f 不用担心 xff0c 找到这个页面 xff0c 直接ctrl 43 z可以还原回来 亲测有效
  • idea通过maven使用docker插件生成镜像并推送到harbor仓库

    windows有2种方式获取docker环境 xff0c 使用VM构建linux环境并安装docker xff0c 另一种是安装dockertoolbox xff0c 再通过bash的方式创建虚拟的docker环境 xff08 本文使用后者
  • linux 将for 循环写在命令行

    for p in kubectl get pods namespace 61 kube system l k8s app 61 kube dns o name do kubectl logs namespace 61 kube system
  • iptables -j MARK --set-xmark 解析

    查看man和命令帮助 xff0c 还有网上搜到的解释不是很清晰 xff0c 所以验证了一下 xff0c 并尽量将其解释的通俗易懂 MARK的作用 MARK标记用于将特定的数据包打上标签 xff0c 供Iptables配合TC做QOS流量限制
  • kubernetes调试pod网络故障方法之一

    使用故障pod的network namespace运行一个容器来调试调试pod网络 有时候我们要排查pod的网络问题 xff0c 但是生产容器内一般不会有调试命令 xff0c 另外容器可能处于CrashLoopBackOff或其它不可用的状
  • iptables icmp-host-prohibited引起的No route to host

    如果数据包匹配到下边这条iptables规则 xff0c 访问端则会报No route to host xff0c 抓包中可能会看到 unreachable admin prohibited j REJECT reject with icm
  • kubernetes自动补全命令

    root 64 master01 apt y install bash completion root 64 master01 source usr share bash completion bash completion root 64
  • ubuntu server 20.04使用kubeadm安装k8s v1.23.5

    这篇文章也不错 xff1a https blog csdn net hefashion0190 article details 122635188 两台服务器配置hosts vim etc hosts 192 168 199 116 mas
  • 使用kubeadm 在Centos7.9 上安装k8s集群

    停止并禁用firewalld systemctl stop firewalld amp amp systemctl disable firewalld 关闭selinux sed i s 34 SELINUX 61 enforcing 34
  • Linux bash命令根据历史记录补全

    比如 xff0c 想找 docker run 开头的历史命令 xff0c 只需要键入 docker run 然后按 进行选择 但是在用服务器的bash时没有这个功能 xff0c 每次按 都会把敲入一半的命令清除掉 ctrl r 也不是很好用
  • Docker优化参数

    cat gt etc docker daemon json lt lt EOF 34 oom score adjust 34 1000 34 log driver 34 34 json file 34 34 log opts 34 34 m
  • Rancher 监控组件 Grafana 数据持久化

    以下配置是基于在 Rancher Cluster Manager 中启用监控 xff0c 而非在 Cluster Explorer 应用程序和市场中启用的新版监控 场景描述 xff1a 首先确保你的pv 回收策略是Retain 可以参照此文

随机推荐

  • MATLAB设置使用语言为中文

    因为每次自己都会忘记如何操作 xff0c 所以记录在自己的博客里 xff0c 避免忘记 在MATLAB主页 预设 帮助 右侧选取语言为简体中文 xff0c 具体操作可以见图片
  • kubernetes cordon原理

    cordon 节点可以使节点不接受调度pod 那么原理是什么呢 其实很简单 xff0c 就是给节点增加了一个污点 kubectl describe node NODE NAME 能看到这个污点配置 xff1a Taints node kub
  • 解决win10 win11 蓝牙音箱可以连接无法播放声音/蓝牙音箱无法选择使用

    这个靠谱 xff0c 记录一下 1 快捷键win 43 r xff0c 输入regedit xff0c 打开注册表 2 进入目录 xff1a 计算机 HKEY LOCAL MACHINE SYSTEM ControlSet001 Contr
  • journalctl 日志保留时间及持久化存储日志

    Systemd Journald基础 默认情况下 xff0c Systemd将系统日志存储在 run log journal目录中 xff0c 正如我们在了解Linux文件系统层次结构中所说的 参考 xff1a 介绍Red Hat Ente
  • Linux之/etc/fstab文件详解及实践

    转 https blog csdn net carefree2005 article details 125632867
  • Jenkins 上传文件到工作目录

    使用插件 xff1a File Parameter Plugin 之前写过一篇关于Jenkins 用户上传文件到工作目录的文章 xff0c 那时候还需要使用sharedlibraries 现在使用这个插件可以非常简单的上传文件 话不多说 x
  • Jenkins 在不同的agent之间传递文件/上传文件

    有时jenkins pipeline需要在不同的agent上执行不同的操作 xff0c 同时需要在不同的agent之间传递文件 方法如下 xff1a stage 39 上传文件 39 agent 39 label A 39 steps sc
  • 解决vscode编写go代码时提示过慢

    vscode的自动代码提示 xff0c 发现太慢了 xff0c 隔3 xff0c 4秒才会出提示 xff0c 所以换为Google推荐的 gopls来代替 下载过程 方案一 打开 VS Code 的setting 搜索 go useLang
  • windows server安装OpenSSH server

    右键powershell 选择以管理员运行 powershell 查看可安装的OpenSSH server版本 xff0c 在PowerShell中执行命令如下所示 Get WindowsCapability Online Name Ope
  • 表白密码:I Love you的42种密码表白方式

    字母表白数字密码 xff1a 9121522521 表白解密 xff1a 从1开始到26 xff0c 分别表示从A到Z xff0c 即 xff1a A xff08 1 xff09 B xff08 2 xff09 C xff08 3 xff0
  • C语言字符串结束标志

    为了测定字符串的实际长度 xff0c C语言规定了一个字符串结束标志 0 作为标志 xff0c 如果一个字符串为9个 xff0c 前面九个都不为空字符 xff0c 那么第十个字符为 0 xff0c 也就是说在遇到字符 0 时 xff0c 表
  • 用体光栅作角度滤波器

    体光栅由于其高光谱灵敏性和角度灵敏度 xff0c 可以设计成光谱滤波器或角度滤波器 根据K Bang等人的工作 xff0c 我们在VirtualLab Fusion中构造了这样的体光栅 xff0c 并分析了它们的角度响应 与传统的采用4 f
  • linux网络编程(完整版)

    之间在网上看到很多网络编程都是一个一个demo xff0c 今天我把之前学到的汇总起来 xff0c 希望大家可以进行补充 我理解的网络通信分为4种 1 xff0c udp客户端 2 xff0c udp服务端 3 xff0c tcp客户端 4
  • 一阶线性微分方程

    1 一阶线性微分方程概念 2 一阶线性齐次微分方程解法 例题 xff1a 例题 xff1a 3 一阶线性非齐次微分方程解法 例题 xff1a 4 伯努利方程 例题 xff1a
  • 集成学习(Bagging和Boosting)

    一 概念 集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型 xff0c 集成学习潜在的思想是即便某一个弱分类器得到了错误的预测 xff0c 其他的弱分类器也可以将错误纠正回来 Baggging 和Boosting都是模
  • 传感器数据异常预测-实战篇

    好久没更新了 xff0c 记录一下近两年研究的一套算法吧 xff0c 只讲讲方法部分 xff0c 细节再更新吧 时序数据的异常检测我一般分成两类 xff0c 单信号和多信号 单信号 对于一条数据的异常检测 xff0c 我划分成两类 xff0
  • 天线基础知识(四)接收灵敏度

    1 接收灵敏度 接收灵敏度是指无线设备正常工作所需的天线口最小信号接收功率 系统间的干扰会导致无线设备灵敏度的下降 xff0c 影响信号的正常接收 xff0c 因此通常以无线设备灵敏度准则作为被干扰系统的保护准则 无线传输的接收灵敏度类似于
  • px4讲解(一)历史起源

    第一节 对于初次接触无人机行业的人来说一些无人机行业课外知识还是需要了解的 xff0c ardupilot和px4是目前无人机行业最受欢迎 也是最为先进的飞控软件 xff0c 他们又是如何诞生并一路走来的呢 xff0c 他们跟Droneco
  • px4讲解(二)软件硬件

    无人机 xff08 飞控 xff09 软硬件介绍 无人机 xff08 简称 飞控 xff09 的软件和硬件都是开源的 xff0c 飞控的硬件也是是 开源的 xff0c 硬件 xff1a PIXHAWK 其硬件可以根据自己的需要修改硬件 xf
  • PX4官方examples 发布与订阅 分析

    功能 xff1a 实现 订阅 sensor combined 消息 xff0c 将订阅的消息数据 通过发布主题 xff08 vehicle attitude xff09 发布出去 Copyright 2012 2019 PX4 Develo