Ubuntu20.04下Px4使用UORB發布消息

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;方…