因為需要傳輸目標跟蹤的結果,因此需要進行自定義訊息的發布和訂閱。
首先,如果我們需要傳輸自定義訊息的話,需要建立一系列的準備檔案。我是直接修改的經典教程中的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,...