ROS通訊機制(二) 話題通訊自定義msg

2021-10-19 14:20:07 字數 3334 閱讀 3298

在 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資料夾,在裡面編...