Hello Sky! pixhawk第一个例程学习解读

2023-05-16

学习px4的第一个程序,这个例子作为官方给出解释的例程,对于新手上手来说,是很好的范例。
接下来我对照程序源码(已经经过自己的修改和添加注释)进行讲解

1.PX4_INFO是标准的LOG函数,相当于C语言中的printf,你直接使用C语言也是可以的,但是更加推荐使用LOG函数,LOG函数主要包括PX4_INFO, PX4_WARE,PX4_ERR,PX4_DEBUG,也就是我们平时遇到的输入,警告,错误和调试。他们代表不同级别日志,错误和警告会写入飞控的日志中去,养成习惯方便以后阅读日志。

2.UORD是PX4的核心,具体解释很容易理解,相当于两个人无法直接沟通,只能依靠一个媒介来交流,topic相当于决定这个媒介的使用限制,只有这个主题下的信息可以留在这个媒介上,媒介对某个具体信息有固定的存放位置,你需要修改它就必须删除之前的信息,两个人拿到信息怎么处理我们不管,我们只需要了解这两个人时如何互通有无的,这就是UORD机制了。
(topic可以在Firmware/msg里查看到所有的可使用的,如果你想自定义,需要在Firmware/msg的CMakeLists里进行注册,具体格式仿照已有的主题就可以啦)

3 用UORD具体详细细节:

a :发送信息:公告(advertise)+发布(publish)
   注意点:公告只能有一次,毕竟货多不值钱,你一件事说个无数次,大家反而嫌你啰嗦,系统也会报错哦,所以最好把公告写入构造函数
b :接受信息:订阅(subscribe)+发布(publish)
   接受消息的主要点在于你怎么知道消息更新了?毕竟老是看过时报纸是很瓜的行为。。。
   这里给出两种方式:1.PX4_poll(阻塞等待)意思是我什么都不做,就盯着你,你变了我立刻就能知道并进行处理,就好比人家欠了你钱你好不容易堵到他,还不得死死盯着?但是电脑等的时候不需要占用CPU
                    2.check(检查)意思就是我想起来了我就去看一下更新没有,想不起来就算了。。。佛系检测法,一般用做优先级不高的事

4.例程里还用到了限制读取数据频率的函数,平时我们不会用,如果你不想他更新那么快或者资源有限的时候用

orb_set_interval(sensor_sub_fd, 200);
//限制每200ms内只复制一次

5.看到一个大佬的博客。建议我们平时new一个例子,最后delete,是一个好习惯,把公告订阅写在构造函数,取消写在析构函数,建议学习

最后贴出我的代码,自己修改了一下风格,加了一些注释

/****************************************************************************
 *
 *   Copyright (c) 2012-2016 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.
 * 2. 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.
 * 3. 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_config.h>
#include <px4_tasks.h>
#include <px4_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>
#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");
        /*××××××××××××××××××××××××××××××××××××××××××××××××××××××A  topic+频率××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××*/
	/* subscribe to sensor_combined topic */
	//topic是sensor_combined  订阅  topic目录在Firmware/msg中查看
        int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_combined));
	/* limit the update rate to 5 Hz */
	//限制数据读取频率
        orb_set_interval(sensor_sub_fd,200);

 	/*×××××××××××××××××××××××××××××××××××××××××××××××××××××××B  公告××××××××××××××××××××××××××××发送=adverse(公告)+publish(发布)××××××××××××××××××××××××××××××××××*/
	/* advertise attitude topic */
	//定义结构体表示 公告   	       
	struct vehicle_attitude_s att;
        memset(&att,0,sizeof(att));//清零
        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;
	/*×××××××××××××××××××××××××××××××××××××××××××××××××××××××C 检测更新 阻塞等待poll××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××*/
        for(int i=0; i<5; i++ )
        {
                int poll_ret = px4_poll(fds,1,1000);//检测时间de间隔
                if(poll_ret==0)
                {
                        PX4_ERR("Get no data whinin 1s");
                }
                else if(poll_ret<0)
                {
                        if(error_counter<10||error_counter%50==0)
                        {
                                PX4_ERR("ERROR return value from poll(): %d",poll_ret);
                        }
                        error_counter++;
                }

                else
                {
                        if(fds[0].revents & POLLIN)
                        {
				/* obtained data for the first file descriptor */
                                struct sensor_combined_s raw;
				/* copy sensors raw data into local buffer */
                                orb_copy(ORB_ID(sensor_combined),sensor_sub_fd,&raw);//复制×××××××××××××××××××××××××××××××读取=订阅+复制×××××××××××××××××××××××××××××××××/
                                PX4_INFO("Acclerometer:\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
					*/
					att.q[0] = raw.accelerometer_m_s2[0];
					att.q[1] = raw.accelerometer_m_s2[1];
					att.q[2] = raw.accelerometer_m_s2[2];
					/* there could be more file descriptors here, in the form like:
			 		* if (fds[1..n].revents & POLLIN) {}
					 */
				orb_publish(ORB_ID(vehicle_attitude), att_pub, &att);
                        }
                }
        }
                                                                                                                                                      
        PX4_INFO("exiting"); 
        return 0;
}



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

Hello Sky! pixhawk第一个例程学习解读 的相关文章

  • UART、RS232、RS485 串行通信详解

    一 UART通信 UART是Universal Asynchronous Receiver Transmitter的缩写 xff0c 意即通用异步串行通信接口 xff0c 是最常用的通信技术之一 xff0c 广泛用于设备与电脑之间 设备与设
  • I2C总线基础知识及操作详解

    I2C总线是一种简单的双向两线式同步串行总线 xff0c 最初由Philips公司开发 xff0c 后又经过几次发展和完善 xff0c 目前已被业界厂商广泛采用 xff0c 成为最常用的板级通信总线之一 xff0c 大量应用于处理器与外围设
  • 对AI的理解及应用的思考

    1 概述 1 1 常用术语 1 2 AI学习方式及地位 序号 学习方法 地位 1 强化学习 Reinforcement Learning 犹如蛋糕上的一颗樱桃 2 监督学习 Supervised Learning 犹如蛋糕外的一层糖霜 3
  • (65)如何根据句柄从二级、三级结构句柄表中找到内核对象

    一 回顾 上一篇博客介绍了如何遍历一级句柄表 一级句柄表非常简单 xff0c 就是一个4KB页 xff0c 最多存储512个句柄表项 如果句柄数量在 512 1024 512 之间 xff0c 句柄表就是二级结构 xff1b 如果句柄数量大
  • BW:BW与第三方BI接口设计与实现:APD、Open Hub、RFM

    最近公司新上了国内某 CRM系统 xff0c SAP的 CRM也光荣下线了 但是紧接着就出现了一些需求 xff0c CRM自带一款小型 BI xff0c 需要一些 SD的数据 xff0c 但是把 R3的数据给他们进行计算的话 xff0c 不
  • Ubuntu下查看CPU、内存和硬盘详细信息的几个命令

    转载自https www cnblogs com shixiangwan p 7066085 html CPU xff1a 型号 xff1a grep 34 model name 34 proc cpuinfo awk F 39 39 39
  • python 小点心---execvp

    execvp会用即将运行的进程的内存替换掉调用进程的内存 xff0c 更进一步讲 xff0c 就是把当前进程的机器指令都清空 xff0c 然后载入被execvp运行起来的进程的机器指令 coding 61 utf 8 import os i
  • jenkins + gitlab + docker + harbor 实现自动触发更新

    当使用微服务方案后 xff0c 面临在大量的项目构建和部署工作 xff0c 借助于jenkins的持续集成 xff0c 可以快速把应用打包成docker镜像 xff0c 实现自动部署 xff0c 加快项目的迭代 一 环境部署 系统IP主机名
  • C++ -- STL文件解析

    1 STL文件格式 STL文件是一种用许多空间小三角形面片逼近三维实体表面的3D模型 STL模型给出了组成三角形法向量的3个分量 用于确定三角面片的正反方向 及三角形的3个顶点坐标 一个完整的STL文件记录了组成实体模型的所有三角形面片的法
  • Ubuntu 查看CPU信息

    Ubuntu 查看cpu个数及核心数 总核数 span class token operator 61 span 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 span class token operator 61 span
  • 韩顺平老师Java基础听课笔记(一)

    Java运行机制 xff1a 1 javac 编译 java文件 生成 class文件 javac Hello java 2 java运行编译后的 class文件 xff08 java Hello xff09 编译后可在Windows Li
  • 韩顺平老师 Java基础听课笔记(二)

    变量 xff1a xff08 先声明后使用 xff09 定义变量 xff1a 1 int a 61 1 2 int b b 61 2 变量在同一个作用域 xff08 同一个方法 xff09 内不能重名 变量三要素 xff1a 变量名 变量值
  • VScode上传到git仓库详细教程

    文章有点啰嗦 坚持看完 xff01 xff01 xff01 首先下载git https git scm com downloads 下载成功之后 xff0c 一直点击next直到安装成功 xff0c 在桌面上点击鼠标右键出现 点击Git B
  • [视觉测距]单目视觉定位测距的两种方式(1)

    单目定位和双目定位的选择 xff0c 我觉得主要还是成本和时间的考虑 之前也尝试过双目定位 xff0c 感觉要更精准些 xff0c 但双目测距需要对两幅图像进行图像变换和极线匹配 xff0c 稍微耗时了一些 这几天尝试了一下单摄像头进行测距
  • [学习SLAM]Quaternion 插值/ 用四元数插值来对齐IMU和图像帧

    小白 xff1a 师兄 xff0c 好久没见到你了啊 xff0c 我最近在看IMU xff08 Inertial Measurement Unit xff0c 惯性导航单元 xff09 相关的东西 xff0c 正好有问题求助啊 师兄 xff
  • 【学习SLAM】vins笔记

    VINS ROS source catkin ws devel setup bash 3 1 1 Open three terminals launch the vins estimator rviz and play the bag fi
  • CSDN 还是不能改头像!!!

    都好几个月了 xff0c 技术问题么 xff0c 还是爬梯开大会 xff0c 连这个都不让改了 真不爽
  • 【计算机视觉】opencv姿态解算6 理论算法调研 PNP问题 5种算法

    关于PnP xff08 pespective n point xff09 的一些方法 最小PnP问题 P3P问题中假设没有噪声 xff0c 使用几何约束 xff0c 可以解得相机的位姿 不具有唯一解 P4P问题中分为线性方法和基于P3P的方
  • 【计算机视觉】 相机姿态估计之标记检测-相机标定ArUco和ChArUco 5

    相机标定ArUco和ChArUco 原文来源 opencv http docs opencv org master da d13 tutorial aruco calibration html ArUco模块也可以用来相机标定 相机标定是获
  • 【泡泡机器人公开课】公开课链接 机器人俱乐部

    1 工业相机选型及介绍 刘富强 链接 https pan baidu com s 1nuGw4Vv 密码 tjag 2 深度学习及应用 颜沁睿 链接 https pan baidu com s 1c31ZcE 密码 r42j 3 SVO a

随机推荐

  • VINS简介与代码结构

    VINS Mono和VINS Mobile是香港科技大学沈劭劼团队开源的单目视觉惯导SLAM方案 是基于优化和滑动窗口的VIO xff0c 使用IMU预积分构建紧耦合框架 并且具备自动初始化 xff0c 在线外参标定 xff0c 重定位 x
  • 【学习SLAM】c++时间戳 获取与转换

    https tool lu timestamp c 43 43 时间戳 自 1970 年 1 月 1 日以来经过的秒数 time t time1 61 time 0 这里获取到的其实就是一个long类型的时间戳 xff0c 是秒级别 的 1
  • 简单行编辑程序

    实验题目 xff1a 简单行编辑程序 问题描述 文本编辑程序是利用计算机进行文字加工的基本软件工具 xff0c 实现对文本文件的插入 删除等修改操作 限制这些操作以行为单位进行的编辑程序称为行编辑程序 被编辑的文本文件可能很大 xff0c
  • 要求循环队列不损失一个空间全部都得到利用,设置一个标志域tag,以0和1来区分当队头与队尾指针相同时队列状态的空和满,试编写与此结构相对应的入队和出队操作。

    用标志域表示队空队满状态的循环队列的综合操作 描述 xff1a 在这里插入代码片 要求循环队列不损失一个空间全部都得到利用 xff0c 设置一个标志域tag xff0c 以0和1来区分当队头与队尾指针相同时队列状态的空和满 xff0c 试编
  • C语言_字符串转数字

    C语言 字符串转数字 程序实现基础算法与思想 xff1a 1 0 gt 1 字符1减字符0得到数字1 2 0 gt 2 9 0 gt 9 即 xff1a 数字字符 0 gt 对应的数字 xff08 注意 xff1a 只能得到1 9 xff0
  • linux复习2 -- 文件权限、修改文件权限(用chmod)、常用命令

    1 文件权限 对于一个文件而言 xff0c 操作它 的用户可分为三类 xff1a 所有者 同组用户 其他用户 xff1b u user 表示文件属主的访问权限 xff1b g group xff1a 表示文件同组用户的访问权限 xff1b
  • C++1-C语言和C++的区别

    一 C语言与C 43 43 的区别 1 头文件 xff1a C 43 43 xff1a span class token macro property span class token directive hash span span cl
  • BW:LO数据源初始化步骤(精简版)

    首先在r3上删除 setup table xff0c 然后再填充 setup table xff08 锁定凭证 xff09 xff0c 同时 xff0c 在bw做无数据的初始化 xff0c 最后在bw做full load
  • C++3--构造函数、冒号语法

    一 构造函数 1 为什么要有这个概念 xff1a 例如下面的代码 xff0c 对于Table类 xff0c 可以通过t Set公有的方法给对象设置内容 xff0c 但是如果每次创建对象都调用该方法设置信息 xff0c 就会有点麻烦 xff0
  • c/c++语言面试题目整理

    1 static有什么用途 xff1f 在C语言中 xff0c static主要定义全局静态变量 xff0c 定义局部静态变量 xff0c 定义静态函数 限制变量的作用域 xff0c 设置变量的存储域 static 关键字主要有两种作用 x
  • c语言宏定义一个MAX函数

    1 span class token macro property span class token directive hash span span class token directive keyword define span sp
  • C++ -- 异常:try、throw、catch

    异常 申请内存的时候 xff0c 内存不够用 空间配置器申请失败 xff0c 不做处理 拷贝时内存错误 除数分母不能为0 等情况 会抛出异常 try throw catch 1 使用示例 1 xff09 除数为零 xff0c 情况 未处理情
  • C++ -- 笔试题

    1 下列对派生类的描述中错误的说法是 D A 派生类至少有一个基类 B 派生类可作为另一个派生类的基类 C 派生类除了包含它直接定义的成员外 xff0c 还包含其基类的成员 D 派生类所继承的基类成员的访问权限保持不变 2 当派生类中有和基
  • Linux 用户切换、修改用户名、修改密码

    一 用户切换 34 34 xff1a 普通用户提示符 34 34 xff1a root用户提示符 1 普通用户到root 方式一 xff1a 命令 xff1a su 然后输入root密码 此种方式只是切换了root身份 xff0c 但She
  • C++中的.和::和:和->的区别

    在学习C 43 43 的过程中我们经常会用到 和 和 xff1a 和 gt xff0c 在此整理一下这些常用符号的区别 1 A B则A为对象或者结构体 xff1b 2 A gt B则A为指针 xff0c gt 是成员提取 xff0c A g
  • AirSim学习日志 5-LQR实现无人机轨迹跟踪

    1 LQR控制器算法原理推导 1 1 状态反馈控制 连续线性系统的状态空间表示为 x
  • 英语常用短语

    1 xff0e 经济的快速发展 the rapid development of economy 2 xff0e 人民生活水平的显著提高 稳步增长 the remarkable improvement steady growth of pe
  • PX4进入系统控制台以及运行程序

    这里提供进入控制台两种办法 1 运行 Tools mavlink shell py dev ttyACM0 是我进入Px4系统控制台的命令 xff0c 进入之后应该是这样 Pixhawk src Firmware Tools mavlink
  • 哈哈,终于知道CSDN怎么改头像了

    话说之前一直郁闷 xff0c 说改头像的功能还没修好 xff0c 一直说服务器错误 今天偶尔发现 xff0c 右上角有个设置 xff0c 原来在这里可以改 我还发了几封邮件给CSDN的admin xff0c 居然只知道道歉 xff0c 不告
  • Hello Sky! pixhawk第一个例程学习解读

    学习px4的第一个程序 xff0c 这个例子作为官方给出解释的例程 xff0c 对于新手上手来说 xff0c 是很好的范例 接下来我对照程序源码 xff08 已经经过自己的修改和添加注释 xff09 进行讲解 1 PX4 INFO是标准的L