建立ROS自定義訊息和服務型別

2021-09-14 02:38:56 字數 4080 閱讀 9420

首先切換到功能包底下:

$cd catkin_ws/src/scan

$mkdir msg

在msg資料夾下建立 乙個名為laserscan.msg的檔案,輸入如下內容:

header header

float32 angle_min # start angle of the scan [rad]

float32 angle_max # end angle of the scan [rad]

float32 angle_increment # angular distance between measurements [rad]

float32 time_increment # time between measurements [seconds]

float32 scan_time # time between scans [seconds]

float32 range_min # minimum range value [m]

float32 range_max # maximum range value [m]

float32 ranges # range data [m] (note: values < range_min or > range_max should be discarded)

float32 intensities # intensity data [device-specific units]

接下來,還有關鍵的一步:我們要確保msg檔案被轉換成為c++,python和其他語言的源**:

檢視package.xml, 確保它包含一下兩條語句:

message_generation

message_runtime

然後開啟cmakelists.txt檔案,利用find_packag函式,增加對message_generation的依賴,這樣就可以生成訊息了:

# do not just add this line to your cmakelists.txt, modify the existing line

find_package(catkin required components roscpp rospy std_msgs message_generation)

同樣,你需要確保你設定了執行依賴,這塊兒要放在generate_message()之後

catkin_package(

catkin_depends

message_runtime

)

找到如下**塊:

# add_message_files(

# files

# message1.msg

# message2.msg

# )

去掉注釋符號#,用你的.msg檔案替代message*.msg,就像下邊這樣:

add_message_files(

files

laserscan.msg

)

手動新增.msg檔案後,我們要確保cmake知道在什麼時候重新配置我們的project。 確保新增了如下**:

generate_message(

dependencies

std_msgs

)

現在,你可以編譯工作空間生成自己的訊息源**了。

然後在工作空間的devel/include/scan資料夾下出現乙個laserscan.**件,這樣就生成了自定義訊息型別,就可在程式中include引用

以上就是你建立訊息的所有步驟。下面通過rosmsg show命令,檢查ros是否能夠識別訊息。

使用方法:

rosmsg show [message type]
樣例:

rosmsg show /scan/laserscan.msg
你將會看到:

[scan/laserscan]:

std_msgs/header header

uint32 seq

time stamp

string frame_id

float32 angle_min

float32 angle_max

float32 angle_increment

float32 time_increment

float32 scan_time

float32 range_min

float32 range_max

float32 ranges

float32 intensities

在上邊的樣例中,訊息型別包含兩部分:

如果你忘記了訊息所在的package,你也可以省略掉package名。輸入:

rosmsg show laserscan
你將會看到:

[scan/laserscan]:

std_msgs/header header

uint32 seq

time stamp

string frame_id

float32 angle_min

float32 angle_max

float32 angle_increment

float32 time_increment

float32 scan_time

float32 range_min

float32 range_max

float32 ranges

float32 intensities

如果在程式中用的話應該這樣:

scan::laserscan msg;//scan是訊息所在包的名字,laserscan為訊息資料夾名字去掉.msg,msg為自定義的乙個變數,然後

msg.header.stamp = ros::time::now();

msg.header.frame_id = "laser_frame";

msg.angle_min = -1.57;

msg.angle_max = 1.57;

在上面的包中建立srv資料夾,在srv資料夾下再建立addtwoints.srv檔案,在檔案中貼上如下訊息

#本srv檔案是對兩個整數求和,虛線前是輸入量,後是返回量

int32 a

int32 b

---int32 sum

下面就是修改package.xml和cmakelists.txt兩個檔案,告訴ros如何編譯,以及編譯什麼

首先package.xml加上

message_generation

message_runtime

再是cmakelists.txt分別加上

catkin_package(

catkin_depends message_runtime

)

find_package(catkin required components 

std_msgs

message_generation

)

add_service_files(directory srv

files

addtwoints.srv

)

generate_messages(dependencies 

std_srvs

)

然後編譯,編譯通過後檢視服務型別

rossrv show package_name/srv_name
如果和你建立的相同,那麼你就成功了。

建立ROS訊息和服務

1.建立乙個msg 在package msg下面 新增自定義的訊息檔案 msg。在ros中有乙個特殊的資料型別 header,它含有時間戳和座標系資訊。在msg檔案的第一行經常可以看到header header的宣告.header header string child frame id geome...

ROS 自定義訊息型別方法

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

ROS 自定義訊息型別 c

一 msg 用於發布 訂閱的通訊方式中。在包的src同級目錄下建立msg資料夾。在 sg資料夾中,建立.msg檔案 例 my msg.msg 編輯my msg.msg檔案 int32 data1 string data2 編輯package.xml 新增依賴 message generation m...