PIXHAWK源码分析之二—Hello Sky(PIXHAWK读取姿态数据并且显示)

2023-05-16

阿木社区玩也要玩的专业,转载请注明出处!http://www.amovauto.com/?p=905 QQ群:526221258

   我们先放开那些复杂的数学算法,向卡尔曼滤波,四元函数什么的,对于PX4构架我们先有个直观的认识。知道整个工程怎么组织构建,留有什么修改接口,我们编译出一个Demo运行下,就会对整个PX4的框架有直观的了解。对框架了解之后,我们再去尝试分析飞控算法,或者在PX4的算法之上,添加自己的功能,毕竟不建议重复造轮子的事情发生。个人感觉PX4的构架,有望成为无人机领域,标准系统之一,我们也可以为这个框架做些事情,去完善和发展他。   上一篇文章是讲述PX4的工程构架,怎么用Cmake组织起来的,并且修改了构建,添加了一个应用程序。我们把这个程序运行起来看看效果

我下面讲述的都是基于Ubuntu14.04系统。
首先make upload px4fmu-v2_default 把我们修改好的固件下载到PIX里面。

然后拔掉SD卡(如果不拔SD卡,无法进入NUttx的终端),给PIX上电用,任何一款串口调试助手都可以。波特率56700。

0431   我们点击回车键可以看到 nsh> 输入help 我们会看到很多命令列表。其中就有我们编译得到的px4_simple_app这个程序。我们输入px4_simple_app这个命令。15我们会发现打印出了加速度数据。也就是读出了板子系统的加速度数据。哈哈 我们已经可以操作板子的传感器接口啊。我们写一个什么脚本,就可以自动执行这句话。来达到我们的目的。下面我们就分析下这个程序是怎么读出板子的加速度计的,如果我们的程序要怎么使用PX4提供的接口函数。我们知道我们是修改了nuttx_px4fmu-v2_default.cmake这个文件来实现编译出px4_simple_app,同理我们也可以写一个程序,来实现我们想要的功能。但是具体怎么写,调用什么接口可以实现对板子的控制呢。我们就来分析下这个px4_simple_app读取加速度计的例程。这个例子在源码的\Firmware-master\src\examples文件夹下面。 源码分析


  
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#include 
#include 
#include 

__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 */
	int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_combined));//订阅传感器数据
	orb_set_interval(sensor_sub_fd, 1000);//功能:设置订阅的最小时间间隔;如果订阅时间过于频繁,系统运行将会变慢 注意!!

	/* 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;

	for (int i = 0; i < 5; i++) {
		/* wait for sensor update of 1 file descriptor for 1000 ms (1 second) */
		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("[px4_simple_app] 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("[px4_simple_app] 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_WARN("[px4_simple_app] 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 */
				att.roll = raw.accelerometer_m_s2[0];//姿态数据
				att.pitch = raw.accelerometer_m_s2[1];
				att.yaw = raw.accelerometer_m_s2[2];
				orb_publish(ORB_ID(vehicle_attitude), att_pub, &att);//发布数据,可以用mavlink发布到地面站
			}

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

	PX4_INFO("exiting");

	return 0;
}

  

     为了做有用的事情,应用需要订阅subscribe输入并发布publish输出 (e.g. 电机 或伺服指令). PX4平台真正的硬件抽象(true hardware abstraction )开始有用——不需要与传感器驱动以任何方式相互作用,并且电路板或者传感器升级后不需要升级。
     PX4中应用间独立的消息通道被称作topics. 在这里,感兴趣的是 sensor_combined topic, 其调用整个系统的同步传感器数据。 订阅到topic非常快和干净:int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_combined)); sensor_sub_fd 是一个文件描述符,非常高效的执行一块等待新的数据的数据块。当前的进程进入休眠,当有新的数据可用时,由调度程序自动地唤醒,在等待的时候,不占用任何CPU周期。为实现这点,使用poll(),调用 POSIX system 。
     uORB为PX4系统的数据集散中心,应用程序间的数据共享全部要通过uORB来传递, 而数据传递的载体被称为 topic. 其实,一个topic就是一个事先已经定义好的结构体,用来反映该topic的数据构成. 数据传递的方法是通过几个uORB数据管理中心提供的几个接口函数,这些接口中最重要的4个是:
orb_subscribe(...) ,订阅消息
orb_copy(...),读取消息
orb_advertise(...),申明消息
orb_publish(...).发布消息
topic是一个被生产和被消费的过程.
某个APP要消费一个topic,它首先要使用函数orb_subscribe来订阅该topic,然后才能用rb_copy函数来获取被订阅的数据;
某个APP要发布一个topic,它首先要使用函数orb_advertise来广告这个topic给uORB,然后用orb_publish函数来发布这个topic的数据.
    uORB全称为micro object request broker (uORB),即 微对象请求代理器,实际上uORB是一套跨进程的IPC通讯模块。在Pixhawk中, 所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。 Pixhawk 使用NuttX实时ARM系统, 而uORB对于NuttX而言,它仅仅是一个普通的文件设备对象,这个设备支持Open、Close、Read、Write、Ioctl以及Poll机制。 通过这些接口的实现,uORB提供了一套“点对多”的跨进程广播通讯机制, “点”指的是通讯消息的“源”,“多”指的是一个源可以有多个用户来接收、处理。而“源”与“用户”的关系在于,源不需要去考虑用户是否可以收到某条被广播的消息或什么时候收到这条消息。它只需要单纯的把要广播的数据推送到uORB的消息“总线”上。对于用户而言,源推送了多少次的消息也不重要,重要的是取回最新的这条消息。 下面是uORB示意图:
598887_1460093281hl22这个oURB有点像生产者消费者模型,内部实现了进程间数据的同步,方便我们在PIX上读取数据。    所以我们的读取传感器数据也很简单,第一我们订阅数据,第二数据有更新我们读取数据显示即可。我们已经知道订阅数据用什么。 前期对于框架的理解,要难些,如果我们理解了,这个Nuttx构建,我们在PIX上很容易做二次开发了。要得到传感器数据就先订阅,监听订阅文件描述符变化,有变化就标示可以读取数据,读取数据!就这个Demo还是很好理解的,确实PIX很好 很强大....节省了我们很多开发时间

阿木社区 玩也要玩的专业 

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

PIXHAWK源码分析之二—Hello Sky(PIXHAWK读取姿态数据并且显示) 的相关文章

  • 技术分享 | GPS无人机集群位置自主纠偏功能升级

    新的一年 xff0c 又是新的开始 xff0c 在这里 xff0c 祝大家在新的一年有更多的收获 xff0c 有更好的发展 过新年 xff0c 大家都会买新衣服穿 xff0c 我们的GPS无人机集群套件同样也要上新功能 近期 xff0c 我
  • 技术分享 | 遥控器控制(Joystick)

    一 遥控器控制 在真实飞行过程中 xff0c 我们使用真实的遥控器作为控制无人机的主要操作来源 xff0c 遥控器始终拥有最高的权限 xff0c 精湛的遥控器操作手法可以保证无人机安稳着陆 xff0c 但对于很多非专业人士来说 xff0c
  • 技术分享 | Airsim初探-用游戏引擎做仿真

    谈到无人机 无人车仿真 xff0c 首先想到的大概就是gazebo xff0c 但现在都快进入元宇宙时代了 xff08 手动狗头 xff09 xff0c 还再继续使用gazebo这种上个时代的产品就显得不够hack xff0c 是时候了解和
  • 技术分享 | Airsim和PX4远程配置连接教程

    前言 xff1a 远程配置是指一台计算机上安装windows版airsim xff0c 作为服务器 xff0c 另一台计算机上安装ubuntu的px4 xff0c 作为客户端 没有采用ubuntu的airsim是因为windows版的air
  • 调试达人 | 史上最全PX4固件无人机无法解锁问题合集

    很多同学在到手一台或者根据网上教程组装了一台PX4固件的无人机后 xff0c 最迫切的一件事是否是让无人机解锁飞上蓝天 xff1f 但就是在这一步却遇到各种各样的问题导致无法解锁而四处查找资料 xff1f 本文由阿木实验室有多年无人机调试经
  • 常见激光雷达分类

    一 激光雷达的原理 激光雷达的原理类似于声呐 xff0c 只不过这里我们用光代替声音 xff0c 来衡量激光雷达与障碍物之间的距离 主要工作原理是向目标发射激光束 xff08 单线 多线 xff09 xff0c 然后将反射信号与发射信号比较
  • Mini Homer——几百块钱也能搞到一台远距离图数传链路?

    在一些远程操控的场景中 xff0c 图数传链路的选择一直是比较重要的问题 传统的WIFI方式 xff0c 传输距离近50到100米 xff0c 不能满足测试要求 xff0c 更不能在工业现场使用 即便是一些专用的图数传方案 xff0c 传输
  • F200——搭载基于模型设计的国产开源飞控系统无人机

    一 F200简介 F200是目前基于FMT开源自驾仪项目开发的第一款无人机产品 xff0c 旨在为广大无人机爱好者和科研工作者提供一个理想的无人机研发与测试平台 支持室外定高 定点 xff0c 一键起飞 xff0c 一键降落 xff0c 一
  • Prometheus-v2新增地面站,助力高效研发!

    Prometheus地面站是基于Prometheus系统的人机交互界面 xff0c 地面站采用TCP UDP通信进行发送和接收数据 xff0c 而在机载端中则采用ROS MSG消息进行通信 xff0c 该地面站可以更快地让用户复现Prome
  • 赛前指导:第二届未来飞行器挑战赛实践赛道之技术详解

    2022 xff08 第二届 xff09 四川省大学生未来飞行器挑战赛正在火热进行中 xff0c 本次挑战赛中的实践类赛道将面向全省高校大学生个人或团队征集未来先进侦察打一体化无人机的实地竞赛 xff0c 主要考察路劲规划 视觉目标搜索 舵
  • 四元数乘法计算

    关于两个四元数的乘法 xff0c 网上查了一大堆 xff0c 没一个说明白的 我就想知道给我两个四元数 xff0c 我该怎么算出来它们的乘积 这么简单的需求都没法找到答案 xff0c 实在对不起四元数的江湖地位 要想计算四元数的乘法 xff
  • Prometheus-v2控制子模块教学例程demo演示

    在Prometheus v2中 xff0c 我们将代码模块化 xff0c 将功能拆分为子模块 xff0c 具体包含控制子模块 目标检测子模块 路径规划子模块 集群子模块以及matlab子模块等 其中 xff0c 控制子模块作为最基础的子模块
  • 机器人开发新思路——强化学习

    众所周知 xff0c 机器人 xff08 Robot xff09 是一种能够半自主或全自主工作的智能机器 机器人能够通过编程和自动控制来执行诸如作业或移动等任务 xff0c 而在执行过程中 xff0c 最常用的就是判断命令或逻辑 换句话来说
  • Swarm-Formation无人机分布式集群算法浅析与仿真测试

    无人机集群一直是当今研究的热点与难点 然而 xff0c 目前相关的集群规划策略通常缺乏在杂乱环境中避开障碍的能力 为了解决无人机在密集复杂环境下的编队避障飞行这一难题 xff0c 浙江大学 Fast Lab 实验室提出了一种分布式无人机集群
  • 无人机集群编队解决方案,适应多种飞行场景

    针对集群研究人员的痛点 xff0c 阿木实验室设计了无人机集群编队的开发平台 xff0c 让开发者们无需再为了验证自己的集群算法或代码而发愁 xff0c 只需关心集群相关的研究 无人机集群编队开发平台基于开源无人机项目Prometheus
  • 做机器人开发,你一定绕不开的模块!

    Allspark 机载电脑 Allspark 是阿木实验室为广大AI智能硬件开发者打造的一款微型边缘计算机 在设计之初就定义了尺寸小巧 重量轻 算力强 可靠 扩展性高的特点 Allspark机身采用铝合金新材料外壳设计 xff0c 内置静音
  • 常用的路径规划算法浅析

    路径规划 所谓路径规划 xff0c 也就是在起点和终点之间找到一条连续的运动轨迹 xff0c 在尽可能优化路径的同时避开环境中的障碍物 常用的路径规划算法有传统的基于图搜索算法 基于采样的路径规划算法 xff0c 以及考虑动力学的路径规划算
  • TGK-Planner无人机运动规划算法解读

    高速移动无人机的在线路径规划一直是学界当前研究的难点 xff0c 引起了大量机器人行业的研究人员与工程师的关注 然而无人机的计算资源有限 xff0c 要在短时间内规划出一条安全可执行的路径 xff0c 这就要求无人机的运动规划算法必须轻型而
  • 超实用的日志分析工具——Flightplot,你不会还没用过吧

    在上一篇文章中已经为大家介绍过Flight Review分析日志工具的具体使用 xff0c 但是该工具在使用过程中难免存在一些问题 xff0c 例如 xff1a Flight Review工具需要在线浏览 xff0c 很多时候受制于电脑网络
  • 行业级开源无人机目标追踪,高空助力抓贼!

    活久见 xff01 成都一高楼惊险无人机抓小偷 视频中危险动作 xff0c 请勿模仿 xff01 本次实验中我们使用的是Prometheus 600 xff08 P600 xff09 行业级无人机研发平台 xff08 此平台适用于无人机行业

随机推荐