在 ros 通訊協議中,資料載體是乙個較為重要組成部分,ros 中通過 std_msgs 封裝了一些原生的資料型別,但這些資料一般只包含乙個 data 字段,當傳輸一些複雜的資料,可以使用自定義的訊息型別
建立自定義msg
功能包下新建msg目錄,新增person.msg
string name
int32 age
float32 height
編譯配置檔案(包括package.xml和cmakelist.txt)
package.xml中新增編譯與執行依賴
message_generation<
/build_depend>
message_runtime<
/exec_depend>
cmakelist.txt中相關配置
find_package
(catkin required components
roscpp
rospy
std_msgs
message_generation
)
## 配置 msg 原始檔
add_message_files
( files
person.msg
)
# 生成訊息時依賴std_msgs
generate_messages
( dependencies
std_msgs
)
#執行時依賴
catkin_package
(# include_dirs include
# libraries demo02_talker_listener
catkin_depends roscpp rospy std_msgs message_runtime
# depends system_lib
)
配置完成後ctrl +shift +b編譯,會生成一些中間檔案(person.h/_person.py)
話題自定義msg的發布與訂閱
4.0 vscode配置
將前面生成的 head檔案路徑配置進 c_cpp_properties.json 的 includepath屬性;將前面生成的 python 檔案路徑配置進 settings.json
4.1 c++實現
(1)發布方實現:
#include
"ros/ros.h"
#include
"plumbing_pub_sub/person.h"
/* 發布方:發布人的訊息
1.包含標頭檔案
2.初始化ros節點
3.建立節點控制代碼
4.建立發布者物件
5.編寫發布邏輯,發布資料
*/int
main
(int argc,
char
*ar**)
return0;
}
(2)訂閱方實現:
#include
"ros/ros.h"
#include
"plumbing_pub_sub/person.h"
/* 訂閱方:訂閱訊息
1.包含標頭檔案
2.初始化ros節點
3.建立節點控制代碼
4.建立訂閱者物件
5.處理訂閱的資料
6.呼叫spin()函式
*/void
doperson
(const plumbing_pub_sub::person::constptr& person)
intmain
(int argc,
char
*ar**)
(3)配置cmakelist.txt檔案 (略)
(4)執行
4.2 python實現
(1)發布方實現:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from plumbing_pub_sub.msg import person
if __name__ ==
"__main__"
: rospy.init_node(
"dama"
)#建立發布者物件
pub=rospy.publisher(
"guangchangwu"
,person,queue_size=10)
#組織訊息
p = person(
) p.name =
"lili"
p.age =
18 p.height =
1.73
#編寫發布邏輯並發布資料
rate = rospy.rate(1)
while
not rospy.is_shutdown():
#發布資料
pub.publish(p)
rospy.loginfo(
"name:%s, age:%d, height:%.2f"
,p.name,p.age,p.height)
rate.sleep(
)
(2)訂閱方實現:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from plumbing_pub_sub.msg import person
defdoperson
(p):
rospy.loginfo(
"發布的資料: %s,%d,%.2f"
,p.name,p.age,p.height)
if __name__ ==
"__main__"
:#初始化ros節點
rospy.init_node(
"daye"
)#建立訂閱物件
sub=rospy.subscriber(
"guangchangwu"
,person,doperson,queue_size=10)
#迴圈 rospy.spin(
)
(3)新增可執行許可權:
chmod +x *py
ll
(4)編譯執行 ROS通訊程式設計 話題程式設計 自定義話題訊息
系統環境 ubuntu16.04 定義msg檔案 在功能包目錄下新建msg資料夾。在msg資料夾下新建person.msg檔案。在檔案person.msg中輸入以下內容並儲存。string name uint8 uint8 age uint8 unknown 0 uint8 male 1 uint8...
2 1 4 話題通訊自定義msg
在 ros 通訊協議中,資料載體是乙個較為重要組成部分,ros 中通過 std msgs 封裝了一些原生的資料型別,比如 string int32 int64 char bool empty 但是,這些資料一般只包含乙個 data 字段,結構的單一意味著功能上的侷限性,當傳輸一些複雜的資料,比如 雷...
ROS自定義話題(發布與接收)
1.建立乙個自己的工作空間 catkin ws 2.在工作空間內建立乙個src資料夾 3.運用指令catkin create pkg 包名 依賴關係roscpp rospy std msgs 4.在建立的功能包裡面的src檔案中編寫自己的檔案 若自定義訊息,則在功能包內新建乙個msg資料夾,在裡面編...