ROS中自定義訊息的發布和訂閱

2021-09-05 09:58:11 字數 2758 閱讀 3301

因為需要傳輸目標跟蹤的結果,因此需要進行自定義訊息的發布和訂閱。

首先,如果我們需要傳輸自定義訊息的話,需要建立一系列的準備檔案。我是直接修改的經典教程中的beginner_tutorials中的talker.cpp和listen.cpp檔案,因此,均是在beginner_tutorials這個package的資料夾下進行的。

建立msg資料夾

cd catkin_ws/src/beginner_tutorials/

mkdir msg

在msg資料夾中新建乙個t_d_m.msg檔案,這個檔案就是用來傳輸訊息的。官方一點說,msg檔案是ros中定義訊息型別的檔案,一般放置在功能包根目錄下的msg資料夾中,在功能包編譯的過程中,可以使用msg檔案生成不同程式語言使用的**檔案。

直接開啟t_d_m.msg檔案,複製貼上

std_msgs/header header

string name

int32 ***

int32 age

修改這兩個東西,是為了我們能夠順利地編譯,比如要傳遞訊息的話,就應該把訊息的包包括進去,還有說明一下你的訊息檔案是什麼等。

具體而言,對於package.xml,新增

message_generation

message_generation

message_runtime

對於cmakelist.txt需要修改的地方較多,分別為:

find_package(catkin required components

roscpp

rospy

std_msgs

message_generation

)

## generate messages in the 'msg' folder

add_message_files(

files

t_d_m.msg

)

generate_messages(

dependencies

std_msgs

)

catkin_package(

# include_dirs include

# libraries beginner_tutorials

# catkin_depends roscpp rospy std_msgs

# depends system_lib

catkin_depends message_runtime

)

talker.cpp

#include"ros/ros.h"

#include"std_msgs/string.h"

#include"beginner_tutorials/t_d_m.h"

#include#includeint main(int argc, char** argv)

return 0;

}

listener.cpp

#include "ros/ros.h"

#include "std_msgs/string.h"

void chattercalllback(const beginner_tutorials::t_d_m msg)

int main(int argc, char** argv)

解釋一下,

1: 我們並沒有建立beginner_tutorials/t_d_m.h檔案,卻仍然可以將它包含進來,這個檔案是在編譯過程中由cmakelist自行生成的,不包含會報錯的。

2:對於下面這句話

ros::publisher chatter_pub = n.advertise("chatter", 1000);
兩個<>中間填寫的就是我們的自定義訊息型別了,即為beginner_tutorials::t_d_m,簡單理解為乙個自己定義的結構體

3:在編寫程式的過程中,可能會出現莫名其妙的紅線報錯,但是最終可以編譯通過,我也搞不懂,程式寫的有沒有問題,至少還是編譯一下看看吧

cd catkin_ws/

catkin_make

roscore

rosrun beginner_tutorials talker
可以看到在發布訊息

在talker執行的同時,再開啟乙個終端,執行

rosrun beginner_tutorials listener
可以看到程式收到了我們發布的自定義訊息

注意一定要同時開啟,否則接受者是接受不到訊息的,因為沒有人發布訊息,我在這裡卡了好久,還是自己太笨了。

1:ros 發布和訂閱自定義訊息陣列

2:ros訊息傳遞——自定義訊息

3:package資料夾的解讀

4:ros中訂閱(subscribe)最新訊息以及對訊息佇列的**

CRMEB新增自定義訂閱訊息

crmeb dashboard新增上述訂閱訊息 crmeb後端新增訂閱訊息定義 crmeb dashboard上為自提訂單新增備貨按鈕 新增商品到貨訂閱訊息的觸發函式 測試本部落格的示例是 目的是新增乙個訂閱訊息,當訂單為自提訂單時,商家在備好貨後可以給使用者傳送一條訂單到貨領取通知。const o...

ROS 自定義訊息型別方法

1 在package中新建資料夾名為msg 2 在msg資料夾中建立訊息 此處以my msg.msg 為例,注意的是要以msg為字尾名 內容舉例如下 int32 data1 float64 data2關於訊息內容,需要注意的是如果型別錯誤,那麼將不能生成標頭檔案。例如float64寫成了float,...

自定義srv訊息之ros

在ros中,如果沒有現成的訊息型別來描述要去傳遞的訊息時,我們會自定義訊息。我們會新建乙個package來去自定義訊息,通常這個package寫任何的業務邏輯,只是用來宣告自定義的訊息型別,可以只定義一種訊息型別,也可以定義多種訊息型別,根據業務需求來定。所以,首先我們單獨的建立乙個package,...