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解析与自己的功能模块构建 的相关文章

  • 小程序、微信H5、APP,移动端跨端相互跳转相关规则,2020/11最新总结

    这里只做总结与解释 细则可以去相应官方文档查看 前情提要 其他小程序的appid可以在它的资料里直接查看 所以不是问题 H5 gt 小程序 gt 随便跳 通过微信jssdk openTagList wx open launch weapp
  • windows电脑生成ios证书的方法

    在uniapp开发进行云打包的时候 打包Ios应用需要p12格式的私钥证书和证书profile文件 无论使用windows电脑 还是mac电脑 生成ios证书 需要苹果开发者账号 假如你还没有苹果开发者账号 你可以参考下文先到苹果开发者中心
  • HBuilder 打包 H5 APP 进行认证登录

    H5 Mui App 统一身份认证登录过程的记录 在 h5 app 开发的过程中 用到到统一认证登录的功能 统一身份认证登接口 来进行登录验证 在开发 h5 app 的时候 一般会提供 app 网页版的 这时候会发现 网页版和打包的APP几
  • Android开发过程中遇到的错误汇总及其解决方法

    2016 11 24 16 31 22 问题一 Cannot solve Android Error Execution failed for task app compileDebugJavaWithJavac 解决方法一 http st
  • android 浅探打包安装APK

    打包安装过程 Run as Android Application 1 生成apk文件 1 生成 dex文件 DVM java gt javac gt class gt dx bat gt dex 架构 寄存器 cpu上一块高速的缓存 2
  • emoji表情大全

    emoji表情 emoji人物 emoji手势 emoji日常 emoji手机 emoji公共 emoji动物
  • 【CSS】背景图定位问题适配不同机型

    需求 如图 实现一个带有飘带的渐变背景 其中头像必须显示飘带凹下去那里 需要适配不同的机型 一不下心容易错位 实现 因为飘带背景是版本迭代中更新的 所以飘带和渐变背景实则两个div 飘带切图如下 圆形部分需要契合头像
  • 【uniapp关联unicloud,阿里云云服务空间】unicloud本地调试服务启动失败:当前项目未关联unicloud服务空间,请调整后重新运行,已解决

    最近开发app项目 很多都是第一次上手 1 在Hbuider中运行项目 出现如下提示 2 项目根目录下已有uniCloud文件夹 3 如果云开发环境未创建 可以右击项目 选择创建uniCloud云开发环境 4 创建好的目录如下 index
  • 我这里有一款情侣之间用来记录生活的app Android端和web端的

    我这里有一款情侣之间用来记录生活的app app下载地址 复制链接到网页下载即可 web网页端地址 当今社会 情侣之间的交流方式越来越多样化 而一款专门为情侣设计的数据共享应用程序也应运而生 这款应用程序可以帮助情侣们更好地分享彼此的生活
  • 【uni-app】uniapp 实现一键登录 超详细记录~

    uniapp 实现一键登录 一 前置条件 开通uniCloud 开通一键登录功能 二 一键登录代码 云函数代码 三 其他条件 四 遇到过什么问题 如何处理 本地函数同个局域网 错误码 五 官网给出的错误码 参考的文档 官网 一键登录unia
  • 飞行姿态解算(三)

    继之前研究了一些飞行姿态理论方面的问题后 又找到了之前很流行的一段外国大神写的代码 来分析分析 第二篇文章的最后 讲到了文章中的算法在实际使用中有重大缺陷 大家都知道 分析算法理论的时候很多情况下我们没有考虑太多外界干扰的情况 原因是很多情
  • Android 开发中ScrollView无法上下滚动

    本节目录 问题 解决办法 问题 因项目需要做一个App出来 所以最近在学Android Studio开发 但是我在利用ScrollView实现内容上下滚动的时候出现了一个问题 就是无法将超出页面的内容进行上下滑动 设计UI界面如下 这里的T
  • 记录一次iPhone5s的iCloud bypass经历

    之前成功过一次 使用的是checkra1n v0 9 5 越狱成功后 使用ssh连接手机 执行以下几个命令 正在挂载根目录文件系统为读写 bash 3 2 mount o rw union update bash 3 2 echo gt g
  • Flutter项目打包成安卓apk详解来了(解决安装没网络问题)

    Flutter项目打包成安卓apk步骤 cmd使用keytool创建 keystore 创建一个名为key properties的文件 编辑 android app build gradle文件配置签名 替换android app src
  • git 解决冲突之 theirs & ours

    git merge 从feature分支合并到master分支 git checkout master git merge feature Auto merging Document CONFLICT content Merge confl
  • App登录状态维持

    转载地址 http www jianshu com p 4b6b04244773 目前APP大都支持长登录 就是用户登录一次后 如果用户没有主动注销 清除APP缓存数据或卸载APP 就在一段时间内或一直保持登录状态 一般情况下 有以下三种方
  • APP、软件版本号的命名规范与原则

    APP 软件版本号的命名规范与原则 为了在软件产品生命周期中更好的沟通和标记 我们应该对APP 软件的版本号命名的规范和原则有一定的了解 1 APP 软件的版本阶段 Alpha版 也叫 版 此版本主要是以实现软件功能为主 通常只在软件开发者
  • 如何以编程方式获取 mac os x 上已安装应用程序的列表[重复]

    这个问题在这里已经有答案了 如何通过 C 代码或 Objective C 代码以编程方式在 mac os x 中获取已安装的应用程序 可以使用聚光灯 API 获取所有应用程序文件 具体来说 NSMetadataQuery 类 void do
  • [2024]基于springboot的租房(房屋租赁)小程序设计

    目录 一 整体目录 示范 文档含项目技术介绍 E R图 数据字典 项目功能介绍与截图等 二 运行截图 三 代码部分 示范 四 数据库表 示范 数据库表有注释 可以导出数据字典及更新数据库时间 欢迎交流学习 五 主要技术介绍 六 项目调试学习
  • 如何在 iOS 设备上运行 .app [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有应用程序的 app 文件 我有 mac 和 iPhone 但没有安装 Xcode 如何在没有 Xcode 的情况下在 iPhone 上

随机推荐