1 .msg文件夹定义数据类型及 变量名

文件位置如图,在PX4-Autopilot/msg文件夹下,笔者创建的文件名为gps_msg.msg

gps_msg.msg内容如下 

uint64 timestamp    # 时间戳
float32 latitude     
float32 longitude  

float32 altitude     

同时,在CMakeLists.txt中添加gps_msg.msg 

2 .编译
终端打开PX4-Autopilot,运行命令

make px4_fmu-v3_default

开始编译,用于生成.h头文件

编译结束

 

 一开始用的fmu-v3发现没有生成.h文件 

换成了

make px4_fmu-v4_default

生成的gps_msg.h位置和内容如图

3. 创建新模块

在PX4的src/modules目录下创建一个新文件夹,比如笔者此处命名为alxx 。

在alxx文件夹下创建CMakeList.txt文件,内容如下

px4_add_module(
#下面添加文件夹名字
MODULE examples__alxx
#下面添加线程名字
MAIN x

SRCS
#添加文件夹里面.cpp文件
01gps_msg.cpp

DEPENDS
)

将自己的模块名(笔者的是alxx)添加进default.cmake文件下,笔者使用的是fmu-v4编译的,所以到PX4-Autopilot/boards/px4/fmu-v4里面的default.cmake文件中进行添加

4.cpp文件内容的编写

#include <uORB/uORB.h>
#include <uORB/topics/gps_msg.h> // 引入想要发布的消息类型的头文件
#include <drivers/drv_hrt.h>//包含函数hrt_absolute_time()
#include <uORB/Publication.hpp> //用于创建一个 uORB 发布器
#include <systemlib/mavlink_log.h> //使用mavlink_log_critical()函数

using namespace std;


extern "C" __EXPORT int x_main(int argc, char *argv[]);//主函数  告诉编译器使用 C 语言的方式来处理特定的函数或代码块。
int x_thread(int argc, char *argv[]);//线程

static bool thread_running = false;//线程运行标志
static bool thread_should_exit = false;//线程结束标志
static orb_advert_t mavlink_log_pub = 0;  //使用 &mavlink_log_pub
static int daemon_task;

class main_task01//主函数命名
{
public:
void run();
private:

};



void main_task01::run()
{
// 创建一个 gps_msg_s 结构体并初始化消息数据
gps_msg_s gps_msg{};
gps_msg.timestamp = hrt_absolute_time();
gps_msg.latitude = 37.7749;
gps_msg.longitude = -122.4194;
gps_msg.altitude = 11.0f;

// 创建一个 uORB 发布器,发布 gps_msg 消息
uORB::Publication<gps_msg_s> gps_msg_pub{ORB_ID(gps_msg)};

PX4_INFO("alxx使用C++发布了Uorb消息");//终端打印消息
while (true) {
// 发布消息
gps_msg_pub.publish(gps_msg);
}

}


int x_main(int argc, char *argv[])
{
/*检查传递给程序的命令行参数数量,如果参数数量小于2,使用 mavlink_log_critical 函数向 mavlink_log_pub
发布一条关于“[lxx]mission command”的严重级别日志消息。*/
if (argc < 2) {
mavlink_log_critical(&mavlink_log_pub, "[lxx]mission command");
}
if (!strcmp(argv[1], "start")) {
if (thread_running) {
/*检查 thread_running 是否为真,如果是,它会发布一条关于 "[lxx]already running" 的严重级别日志消息。*/
mavlink_log_critical(&mavlink_log_pub, "[lxx]already running");
}
thread_should_exit = false; //表示线程不应该退出。
thread_running = true; //表示线程正在运行
daemon_task = px4_task_spawn_cmd("x",
SCHED_DEFAULT,
SCHED_PRIORITY_MAX - 5,
3000,
x_thread, //启动一个新任务(x_thread),可能是为了执行特定的线程函数,并传递其他参数。
&argv[2]);
return 0;
}
if (!strcmp(argv[1], "stop")) {
thread_should_exit = true;
}
mavlink_log_critical(&mavlink_log_pub, "unrecognized command");
return 0;
}


int x_thread(int argc, char *argv[])
{
main_task01 x;
x.run();
return 0;
}

 

终端打开PX4-Autopilot,再编译

make px4_fmu-v4_default

5.运行

运行仿真语句

make px4_sitl_default jmavsim

 报错,因为make前面多打了空格

重新输入后

可以打开仿真

 鼠标光标定位到终端最下方,输入“help”

 

还有PX4-Autopilot/boards/px4/sitl里面的default.cmake 也要添加alxx

再编译

make px4_fmu-v4_default 

启动仿真

make px4_sitl_default jmavsim

运行

help  

 笔者定义的线程是x,在最后

运行

x start 

输出.msg文件里定义的数据

listener gps_msg

6.添加自启动 

文件所在位置:PX4-Autopilot/ROMFS/px4fmu_common/init.d 

 

打开文件 rc.mc_apps

翻至最下方,在最下方添加  自己的线程名 start  ,笔者定义的线程是x,所以在最下方添加的内容如下

保存文件。终端打开px4源码,先清空之前编译的内容。

        在Linux中,make clean 是一个常用于管理源代码编译过程的命令。这个命令通常定义在Makefile文件中,是make工具的一个标准目标。make clean的主要作用是清除之前编译过程中产生的所有编译和链接产物,比如对象文件(.o文件)、编译生成的可执行文件以及其他中间文件。这样做的目的是为了确保下一次编译是从一个干净的状态开始,避免由于旧的编译产物导致的潜在问题。

        在进行源代码的编译时,尤其是在进行多次编译或者修改了源代码后,使用make clean可以保证新的编译不会受到之前编译产物的影响,从而减少编译错误和问题。然而,需要注意的是,执行make clean后,之前编译生成的所有文件都会被删除,所以在执行这个命令之前要确保不再需要这些文件。

make clean

编译

make px4_fmu-v4_defaulr

 

启动仿真

make px4_sitl_default jmavsim

 线程已经启动了,打印了消息

观察数据

listener gps_msg 

 

结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93430.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93430.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93430.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

three.js学习记录(第二节:鼠标控制相机移动)

效果展示&#xff1a; 鼠标控制一、鼠标控制 - 轨道控制器&#xff08;OrbitControls&#xff09; 1. 从nodeModules中导入OrbitControls&#xff0c;OrbitControls 是一个附加组件&#xff0c;必须显式导入 import { OrbitControls } from "three/examples/jsm/controls/…

Shortest Routes II(Floyd最短路)

题目描述There are n cities and m roads between them. Your task is to process q queries where you have to determine the length of the shortest route between two given cities.输入The first input line has three integers n, m and q: the number of cities, roads…

分享一个基于Hadoop的二手房销售签约数据分析与可视化系统,基于Python可视化的二手房销售数据分析平台

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

STM32的PWM

PWM作为硬件中几乎不可或缺的存在&#xff0c;学会 PWM&#xff0c;等于打通了 STM32 的“定时器体系”。学一次&#xff0c;STM32 全系列&#xff08;甚至 AVR、PIC、ESP32&#xff09;都能通用。硬件只要一个 I/O 就能驱动功率模块&#xff0c;非常省成本。不会 PWM&#xff…

OpenCompass傻瓜式入门教程

文章目录1 我也许不是傻瓜&#xff0c;却只想做个傻瓜2 环境要求3 安装3.1 下载源码3.2 创建虚拟环境3.3 安装4 下载数据5 查看支持的模型和数据集6 评测6.1 指定模型路径6.2 指定配置文件6.2.1 评测本地qwen2.5模型6.2.1.1 查看opencompass支持的qwen2.5模型6.2.1.2 创建配置文…

【软件测试】电商购物项目-各个测试点整理(三)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、优惠券的测试点…

流处理、实时分析与RAG驱动的Python ETL框架:构建智能数据管道(上)

> **2025年某电商大促,每秒20万订单涌入系统**——他们的风控团队仅用**47毫秒**就识别出欺诈交易。背后的秘密武器,正是融合流处理、实时分析与RAG的下一代Python ETL框架。 ### 一、范式革命:从批处理到AI增强的ETL 4.0 #### 1.1 数据处理演进史 ```mermaid graph LR …

开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

​​​​​​​中国工业企业专利及引用被引用数据说明

1319 中国工业企业专利及引用被引用数据说明数据简介专利近年发文趋势及主题分布今天数据皮皮侠团队为大家分享一份2023年12月25日最新更新的中国工业企业专利及引用被引用数据&#xff0c;供大家研究使用。数据来源原始数据来源于国家统计局&#xff0c;由皮皮侠团队整理计算。…

MySQL知识点(上)

MySQL知识点 一&#xff1a;MySQL概述 MySQL是一款开源的数据库软件&#xff0c;是一种关系型数据库管理系统&#xff08;ROBMS&#xff09;&#xff0c;也叫做表数据库管理系统 如果需要快速安全地处理大量的数据&#xff0c;则必须使用数据库管理系统&#xff1b;任何基于数据…

shell脚本实现sha256sum校验并拷贝校验通过的文件

#!/bin/bash# 目标目录 TARGET_DIR"/appdata/jn1m/versions/old/bin"# 校验文件 CHECKSUM_FILE"checksum.txt"# 检查目标目录是否存在 if [ ! -d "$TARGET_DIR" ]; thenecho "错误&#xff1a;目标目录 $TARGET_DIR 不存在"exit 1 fi#…

中小型泵站物联网智能控制系统解决方案:构建无人值守的自动化泵站体系

一、系统核心架构与功能设计1.物联网感知层设备互联&#xff1a;网关对接压力传感器、超声波液位计、智能电表、振动传感器等&#xff0c;实时采集水泵运行状态&#xff08;流量、压力、温度、振动&#xff09;、液位、水质&#xff08;pH值、浊度&#xff09;、能耗等关键参数…

网络通信---Axios

1、什么是 Axios&#xff1f; Axios​ 是一个基于 ​Promise​ 的 ​HTTP 客户端&#xff0c;用于浏览器和 Node.js 环境&#xff0c;用来发送 ​HTTP 请求&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;​。 它常用于&#xff1a; 向后台 API 发送请求获取数据提交表…

Ubuntu 软件源版本不匹配导致的依赖冲突问题及解决方法

在使用 Ubuntu 系统的过程中&#xff0c;软件包管理是日常操作的重要部分。但有时我们会遇到各种依赖冲突问题&#xff0c;其中软件源与系统版本不匹配是常见且棘手的一种。本文就来详细分享一次因软件源版本不匹配引发的依赖冲突问题&#xff0c;以及具体的解决思路和流程。一…

思考:高速场景的行星轮混动效率如何理解

行星轮混动 E-CVT&#xff08;电子无级变速器&#xff09;是一种专为混合动力汽车设计的动力分配系统&#xff0c;其核心原理是通过行星齿轮组和电机的协同工作&#xff0c;实现动力分流与无级变速。 一、核心结构与组成 E-CVT的核心部件包括 行星齿轮组 和 双电机&#xff08;…

跨域及解决方案

跨域&#xff08;Cross-Origin&#xff09;是指浏览器在执行 JavaScript 的时候&#xff0c;因为同源策略&#xff08;Same-Origin Policy&#xff09;的限制&#xff0c;阻止了一个网页去请求不同源&#xff08;域名、端口、协议有任意一个不同&#xff09;的资源。 1. 什么是…

PCA降维全解析:从原理到实战

一文读懂PCA降维&#xff1a;原理、实现与可视化全解析​本文6000字&#xff0c;涵盖PCA核心原理、数学推导、代码实战及高频面试题&#xff0c;建议收藏阅读​一、为什么需要降维&#xff1f;数据爆炸时代的生存法则当数据集的特征维度激增&#xff08;如基因数据、推荐系统用…

Kafka工作机制深度解析:Broker、Partition 与消费者组协作原理

&#x1f42f; Kafka工作机制深度解析&#xff1a;Broker、Partition 与消费者组协作原理 &#x1f3c1; 前言 Kafka 已成为互联网公司流式数据处理的事实标准&#xff0c;广泛应用于日志收集、实时计算、事件驱动架构等场景。 很多开发者会用 Kafka&#xff0c;但不了解它底…

深入解析live555:开源流媒体框架的技术原理与应用实践

引言&#xff1a;流媒体领域的"老兵"与技术基石 在实时音视频传输技术的发展历程中&#xff0c;live555作为一款诞生于1990年代末的开源项目&#xff0c;至今仍在流媒体服务器、嵌入式设备和安防监控等领域发挥着不可替代的作用。它由Live Networks公司开发并维护&a…

EN55014家用电器、电动工具和类似设备的电磁兼容

一、EN 55014标准定义与属性&#xff1f;EN 55014 是针对家用电器、电动工具及类似设备的电磁兼容&#xff08;EMC&#xff09;标准&#xff0c;主要规定了这类产品在电磁骚扰发射&#xff08;避免干扰其他设备&#xff09;和抗扰度&#xff08;抵抗其他设备干扰&#xff09;方…