PX4应用examples[1]:px4_simple_app解析与自己的功能模块构建

2023-05-16

PX4应用examples[1]:px4_simple_app解析与自己的应用构建

  • px4_simple_app源代码学习
    • 代码分析
      • 第一部分 PX4简单打印消息的发布
      • 第二部分 传感器信息的获取
        • 关于sensor_combined的介绍:
    • 第三部分 消息的发布
  • 创建自己的应用
  • 测试自己的应用是否创建成功

px4_simple_app源代码学习

代码位置位于PX4-Autopilot/src/examples/px4_simple_app文件夹下:
代码主要完成了对于sensor_combined传感器信息的订阅以及关于加速度计accelerometer_m_s2信息的发布

代码分析

我们可以将程序剥离为三个部分来看,关于PX4_INFO试探信息的发布、传感器消息的订阅、以及传感器消息的发布

第一部分 PX4简单打印消息的发布

#include<px4_config.h>
__EXPORT int px4_simple_app_main(int argc,char *argv[]);
int px4_simple_app_main(int argc,char *argv[])
{
	PX4_INFO("Hello Sky!");
	return 0;
}

main函数必须命名为<module_name>_main并从模块中导出(__EXPORT)
PX4_INFO()在PX4 shell中的作用相当于c语言中的printf(),与PX4_INFO()相关的分析日志函数有:PX4_WARN
()
PX4_ERR()PX4_DEBUG()

第二部分 传感器信息的获取

该代码获取的是sensor_combined传感器消息,该消息的定义是一个结构体,我们需要包含它的定义头文件==#include <uORB/topics/sensor_combined.h>==

关于sensor_combined的介绍:

sensor_combined是一个冗余的传感器集合的信息,通过订阅多个传感器的数据,将冗余的数据经过VoteSensorsUpdate投票机制,筛选出较为可靠的一组数据,用于状态估计模块的姿态解算和位置解算。
陀螺仪的英文名称是Gyro
加速度计的英文名称是Accelerometer

#ifdef __cplusplus
struct __EXPORT sensor_combined_s {
#else
struct sensor_combined_s {
#endif
	uint64_t timestamp; // required for logger
	float gyro_rad[3];//上一采样周期内,陀螺仪在body系下xyz的测量平均值(rad/s)
	uint32_t gyro_integral_dt;//陀螺仪测量采样周期(us)
	int32_t accelerometer_timestamp_relative;
	float accelerometer_m_s2[3];//上一采样周期内,加速度计在body系下xyz的测量平均值(m/s2)
	uint32_t accelerometer_integral_dt;//加速度计测量采用周期(us)
	uint8_t _padding0[4]; // required for logger
#ifdef __cplusplus
	static constexpr int32_t RELATIVE_TIMESTAMP_INVALID = 2147483647;

#endif
};

话题订阅代码

#include<uORB/topics/sensor_combined.h>
#include<px4_tasks.h>
#include<poll.h>
__EXPORT int px4_simple_app_main(int argc,char *argv[])

int px4_simple_app_main(int argc,char *argv[])
{
	//获取主题的fd
	int sensor_sub_fd=orb_subscribe(ORB_ID(sensor_combined));
		/* limit the update rate to 5 Hz */
	orb_set_interval(sensor_sub_fd, 200);
		/* one could wait for multiple topics with this technique, just using one here */
 
 	//把订阅主题的fd添加到检测列表中
	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 },
		 */
	};
	
//阻塞等待传感器信息的更新,最多等待1000,如果1s后还没有数据poll_ret返回0,1s内有数据返回1
	int poll_ret = px4_poll(fds, 1, 1000);
	if(poll_ret>0)
	{
		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把数据放在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]);
			}
			}
}

我们创造了一个话题订阅句柄,可用于非常有效地执行阻塞等待新数据。当前线程进入睡眠状态,一旦有新数据可用,调度程序就会自动唤醒该线程,在等待时不消耗任何CPU周期。为此,我们使用poll() POSIX系统调用。,在代码中,我们只进行一次传感器信息的获取。

第三部分 消息的发布

通过某种方式获得消息后将消息发布出去。我们选择发布attitude话题

#include<uORB/topics/vehicle_attitude.h>
//先定义一个用于存放数据的结构并申请内存,根据事件的id,得到发布数据需要的fd
struct vehicle_attitude_s att;
memset(&att,0,sizeof(att));
orb_advert_t att_pub=orb_advertise(ORB_ID(vehicle_attitude),&att);

//把需要更新的数据放入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];
orb_publish(ORB_ID(vehicle_attitude), att_pub, &att);

创建自己的应用

  1. 我们可以在examples(或者modules)下面建立自己的应用,可以命名为my_example_app,在相应的examples目录下建立my_example_app文件夹
  2. 撰写my_example_app.c文件,设计自己想要实现的功能,在定义的文件中一定要有一个my_example_app_main的函数,否则编译的时候会找不到这个函数,导致nuttx无法创建app应用程序。为了能够使得其他模块使用这个主函数,需要__EXPORT 这个函数。
    __EXPORT int px4_simple_app_main(int argc, char *argv[]); //.c文件
    

extern “C” __EXPORT int px4_simple_app_main(int argc, char *argv[]);//.cpp文件
```
4. 撰写CmakeLists.txt内容(用于编译,不可缺少)添加如下代码

PX4_add_module(
MODULE examples__my_example_app
MAIN my_example_app
STACK_MAIN 2000
SRCS
	my_example_app.c
DEPENDS
	platform__common
)
  1. 源文件和CMake文件编写好之后需要在编译配置中加入我们的样例, 然后在Firmware\cmake\configs\nuttx_px4fmu-v2_default.cmake(如果是在仿真环境中的话Firmware\cmake\configs\posix_sitl_default.cmake:的配置文件中加上需要编译的文件夹,比如examples/my_example_app

测试自己的应用是否创建成功

1.软件在环测试:记住在make的时候(如果是软件在环仿真,一定要加gazebo/jmavsim这样的仿真器),不然没有窗口提示符让你运行自己的应用程序

make  posix_sitl_default gazebo

2.硬件在环测试:如果我们需要在飞控板中运行,比如是上面指定的px4fmu-v2_default固件版本
*

make px4_fmu-v2_default upload
  • 编译并下载代码到飞控板子上,连接飞控计算机
  • 打开QGC,进入Analyse->Mavlink Console,这个 Console就是前面说的控制台,在控制台下先输入help, 可以看到可以启动的模块,然后再输入指令my_example_app。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4应用examples[1]:px4_simple_app解析与自己的功能模块构建 的相关文章

  • Android开源项目

    一 一个类似微信的时光轴效果 项目地址 https github com ljtyzhr TimeLine 二 安卓选择器类库 包括日期 时间 单项 双项选择器 城市地址选择器 项目地址 https github com gzu liyuj
  • Android(Java)开发之获取BLE广播包(扫描后获取:广播数据+扫描应答数据+RSSI)

    一 安卓BLE的广播包数据从哪获取 通常 安卓APP读写BLE设备的数据都是建立连接后通过GATT获取或修改 但是 BLE设备向外广播时本身会携带一部分有用信息 如将传感数据存放到广播包的自定义数据段 最近接触的一个iBeacon Eddy
  • 使用HBuilderX将vue或H5项目打包app

    好久没有搞过将vue项目打包成app了 这两天刚好项目需要将vue开发的H5项目打包成APP 那就简单记录一次呗 之前也写过一篇打包app 是将项目使用hbuilder打开 转为webapp什么的 就可以直接打包了 现在不一样了 现在使用H
  • android sdk配置图文教程

    首先配置 java sdk 下载java sdk java sdk也有很多版本 问清项目版本 下载相对应的 然后配置环境变量 下图是我电脑下载的版本 下载好就就是配置环境变量了 配置java sdk 环境变量 右击我的电脑 属性 高级系统设
  • 如何申请安卓证书,申请安卓证书的流程是什么?

    用HBuilderX打包安卓正式app时 我们需要使用自有证书 安卓证书是免费申请的 虽然HBuilderX有申请教程 为了自己后期使用方便 今天给大家分享下详细的申请教程 HBuilderX的文档 https ask dcloud net
  • Android App软件框架搭建

    1 App软件框架搭建 1 0软件基本架构 1 1创建MainActivity并设置布局文件 布局文件如下
  • vue-cordova修改app图标+文字以及启动图

    前言 在使用 vue cordova 打包成apk的时候 我们一定会根据项目改把app的图标还有显示文字 加载图片也有可能改动 这里来说一说这个 1 修改显示文字 地址 D cordova app config xml 修改name里面的文
  • android 浅探打包安装APK

    打包安装过程 Run as Android Application 1 生成apk文件 1 生成 dex文件 DVM java gt javac gt class gt dx bat gt dex 架构 寄存器 cpu上一块高速的缓存 2
  • IAP与APP(一):两个固件使用Keil5默认设置编译后,利用J-Flash偏移APP的地址然后合并IAP烧写,运行时出现在跳转APP时无限重启的现象

    最近做了个在线升级 并没有使用系统 芯片 STM32F103C8T6 环境 Keil 5 STM32CubeMX 5 2 1 跳转和写FLASH在网上一搜其实不少 主要注意要重定向中断向量表和跳转前要关闭所有中断 在写好IAP和APP两个固
  • hbuilder打包ios所需的IDP/IEP证书创建流程

    在uniapp开发进行云打包的时候 打包Ios应用需要IDP IEP证书和证书profile文件 无论使用windows电脑 还是mac电脑 生成ios证书 需要苹果开发者账号 假如你还没有苹果开发者账号 你可以参考下文先到苹果开发者中心开
  • HBuilder云打包ios证书申请流程

    我们在hbuilderx打ios正式包的时候 需要私钥证书p12文件 和描述文件mobileprovision文件 但是生成这两个工具需要使用mac电脑 这对于我们使用windows电脑的同学们望而却步 幸好 我们中国有在线的生成ios证书
  • Poppuwindow的简单使用

    继 DialogFragment的简单使用 之后 我们再来试试 Poppuwindow 的简单使用 切记 本篇博客只能保证你入门哦 适合小白学习 效果展示 1 几个常用的构造方法 public PopupWindow Context con
  • uniapp自定义tabbar,中间凸起(支持H5、微信小程序)

    最近公司需要做一款app 需要中间按钮凸起 在网上找了一些 参考文献 做了一个demo H5效果图如下 小程序效果图如下 目录结构如下 page json的配置如下 pages path pages index index style na
  • 上架发布应用市场资料填写规则限制

    应用名称填写时 名字长度有没有限制呢 1 名称 1 字数限制 iOS 30 Android 64 2 应用市场显示的名称 2 副标题 1 字数限制 iOS 30 2 应用市场显示的副标题 宣传文本填写时 可以编写多少个字 1 字数限制 iO
  • 【基础教程】Appium自动化测试,太详细了!

    Appium简介 Appium是一款开源的Appium自动化工具 基于Webdriver协议 主要有以下3个特点 全能 支持iOS Andorid H5 混合App WinApp 通用 支持Win Linux Mac 支持Java Pyth
  • iOS App打包上架详细流程

    一 前言 作为一名iOS开发者 把辛辛苦苦开发出来的App上传到App Store是件必要的事 但是很多人还是不知道该怎么上传到App Store上 下面就来详细讲解一下具体流程步骤 二 准备 一个已付费的开发者账号 可分为 账号类型分为个
  • 如何以编程方式获取 mac os x 上已安装应用程序的列表[重复]

    这个问题在这里已经有答案了 如何通过 C 代码或 Objective C 代码以编程方式在 mac os x 中获取已安装的应用程序 可以使用聚光灯 API 获取所有应用程序文件 具体来说 NSMetadataQuery 类 void do
  • 在 iOS 8 模拟器中运行 .app 文件

    我有一个开发人员共享的 app 文件 我想在 iOS 8 模拟器中运行 我见过类似的问题 其中有针对旧版本 iOS 的解决方案 该版本不再适用于 iOS 8 有人可以指出需要做什么才能在 iOS 8 模拟器中运行 app 文件而不使用 xc
  • 如何通过安装 .app(二进制)文件在设备上测试应用程序? (不使用Xcode进行测试)

    我创建了一个应用程序 我想将其发送给另一个人进行测试 他有一部 iPhone 和一台 Mac 但他的 Mac 上没有 xcode 他不是 iPhone 程序员 所以 如果我发送 app 文件 他可以在他的 iPhone 上测试吗 如果没有
  • iOS:无法启动 .app 文件

    我不知道为什么它在我的 app 文件中寻找目录 每次我运行应用程序时 它都会在 iPhone 上安装应用程序 但不会运行并给出以下错误 谁能告诉我这个设置存储在哪里 谢谢 error failed to launch Users xxx L

随机推荐