1. 程式人生 > >ROS總結——ROS訊息和ROS服務

ROS總結——ROS訊息和ROS服務

建立ROS訊息和ROS服務

本部落格是對http://wiki.ros.org/上ROS教程的學習總結,歡迎大家交流學習。本節詳細講解了如何建立並編譯ROS訊息和服務,以及rosmsg、rossrv和roscp命令列工具的使用。

1.訊息(msg)和服務(srv)介紹

  • 訊息(msg): msg檔案就是一個描述ROS中所使用訊息型別的簡單文字。它們會被用來生成不同語言的原始碼。
  • 服務(srv): 一個srv檔案描述一項服務。它包含兩個部分:請求和響應。

msg檔案存放在package的msg目錄下,srv檔案則存放在srv目錄下。msg檔案實際上就是每行宣告一個數據型別和變數名。可以使用的資料型別如下:

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]

在ROS中有一個特殊的資料型別:Header,它含有時間戳和座標系資訊。在msg檔案的第一行經常可以看到Header header的宣告。
下面是一個msg檔案的樣例,它使用了Header,string,和其他另外兩個訊息型別:

Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist

srv檔案分為請求和響應兩部分,由’—’分隔。下面是srv的一個樣例:

int64 A
int64 B
---
int64 Sum

2. 使用 msg

2.1下面,將在之前建立的package裡定義新的訊息

$  cd ~/catkin_ws/src/beginner_tutorials
$  mkdir msg
$  echo "int64 num" > msg/Num.msg

上面是最簡單的例子——在.msg檔案中只有一行資料。當然,可以仿造上面的形式多增加幾行以得到更為複雜的訊息:

string first_name
string last_name
uint8 age
uint32
score

接下來,還有關鍵的一步:要確保msg檔案被轉換成為C++,Python和其他語言的原始碼。檢視package.xml, 確保它包含一下兩條語句:

  <build_depend>message_generation</build_depend>
  <run_depend>message_runtime</run_depend>

如果沒有,新增進去。 注意,在構建的時候,只需要”message_generation”。然而,在執行的時候,只需要”message_runtime”。
在編輯器中開啟CMakeLists.txt檔案,在 CMakeLists.txt檔案中,利用find_packag函式,增加對message_generation的依賴,這樣就可以生成訊息了。 可以直接在COMPONENTS的列表裡增加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)

有時候,即使沒有呼叫find_package,也可以編譯通過。這是因為catkin把你所有的package都整合在一起,因此,如果有其他的package呼叫了find_package,此時package的依賴就會是同樣的配置。但是,在單獨編譯時,忘記呼叫find_package會很容易出錯。
同樣,需要確保設定了執行依賴:

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

找到如下程式碼塊:

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

去掉註釋符號#,用自己的.msg檔案替代Message*.msg,就像下邊這樣:

add_message_files(
  FILES
  Num.msg
)

手動新增.msg檔案後,要確保CMake知道在什麼時候重新配置自己的project。 確保添加了如下程式碼:

generate_messages()

現在,可以生成自己的訊息原始碼了。
2.2 使用 rosmsg
以上就是建立訊息的所有步驟。下面通過rosmsg show命令,檢查ROS是否能夠識訊息,基本用法:

rosmsg show [message type]

eg:

$  rosmsg show beginner_tutorials/Num

int64 num

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

  • beginner_tutorials – 訊息所在的package
  • Num – 訊息名Num.
    如果忘記了訊息所在的package,你也可以省略掉package名。輸入:
$  rosmsg show Num
[beginner_tutorials/Num]:
int64 num

3. 使用 srv
3.1 建立一個srv
在剛剛那個package中建立一個服務:

$  roscd beginner_tutorials
$  mkdir srv

這次不再手動建立服務,而是從其他的package中複製一個服務。 roscp是一個很實用的命令列工具,它實現了將檔案從一個package複製到另外一個package的功能,基本用法:

roscp [package_name] [file_to_copy_path] [copy_path]

現在可以從rospy_tutorials package中複製一個服務檔案了:

$  roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

還有很關鍵的一步:要確保srv檔案被轉換成C++,Python和其他語言的原始碼。
現在認為,已經如前邊所介紹的,在CMakeLists.txt檔案中增加了對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)

(message_generation 對msg和srv都起作用)
同樣,跟msg檔案類似,也需要在package.xml檔案中做一些修改。檢視上邊的說明,增加額外的依賴項。
刪掉#,去除對下邊語句的註釋:

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

用自己的srv檔名替換掉那些Service*.srv檔案:

add_service_files(
  FILES
  AddTwoInts.srv
)

現在,生成了自己的服務原始碼了。
3.2 使用 rossrv
以上就是建立一個服務所需的所有步驟。下面通過rosmsg show命令,檢查ROS是否能夠識該服務,基本用法:

rossrv show <service type>

eg:

$  rossrv show beginner_tutorials/AddTwoInts
int64 a
int64 b
---
int64 sum

跟rosmsg類似, 也可以不指定具體的package名來查詢服務檔案:

$  rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

4. msg和srv都需要的步驟
接下來,在CMakeLists.txt中找到如下部分:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

去掉註釋並附加上所有你訊息檔案所依賴的那些含有.msg檔案的package(這個例子是依賴std_msgs,不要新增roscpp,rospy),結果如下:

generate_messages(
  DEPENDENCIES
  std_msgs
)

由於增加了新的訊息,所以我們需要重新編譯我們的package:

# In your catkin workspace
$  cd ../..
$  catkin_make
$  cd -

所有在msg路徑下的.msg檔案都將轉換為ROS所支援語言的原始碼。生成C++標頭檔案將會放置在~/catkin_ws/devel/include/beginner_tutorials/。Python指令碼語言會在 ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg 目錄下建立。 lisp檔案會出現在 ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/ 路徑下。

5.獲得幫助
已經接觸到不少的ROS工具了。有時候很難記住他們所需要的引數。還好大多數ROS工具都提供了幫助。
輸入:

$  rosmsg -h
Commands:
  rosmsg show Show message description
  rosmsg users  Find files that use message
  rosmsg md5  Display message md5sum
  rosmsg package  List messages in a package
  rosmsg packages List packages that contain messages

同樣你也可以獲得子命令的幫助:

$  rosmsg show -h
Usage: rosmsg show [options] <message type>

Options:
  -h, --help  show this help message and exit
  -r, --raw   show raw message text, including comments

相關推薦

ROS總結——ROS訊息ROS服務

建立ROS訊息和ROS服務 本部落格是對http://wiki.ros.org/上ROS教程的學習總結,歡迎大家交流學習。本節詳細講解了如何建立並編譯ROS訊息和服務,以及rosmsg、rossrv和roscp命令列工具的使用。 1.訊息(msg)和服務(s

Ros學習——建立ROS訊息ROS服務

1.rosed rosed 是 rosbash 的一部分。利用它可以直接通過package名來獲取到待編輯的檔案而無需指定該檔案的儲存路徑了。 rosed預設的編輯器是vim。修改其他的,開啟~/.bashrc 檔案,增加: export EDITOR='emacs

ROS教程(十):建立ROS訊息ROS服務

建立ROS訊息和ROS服務 Description: 本教程詳細介紹如何建立並編譯ROS訊息和服務,以及rosmsg, rossrv和roscp命令列工具的使用。Tutorial Level: BEGINNERNext Tutorial: 寫一個簡單的訊息釋出器和訂

學習9:rosed命令的簡單介紹 + 建立ROS訊息ROS服務

肛了一波四級,希望這次能過把- -# 不想收集8張4級准考證啊…… 用處不知道是幹嘛,主要可以直接編輯某個包裡的檔案。 1 rosed 1.1 介紹 使用方法如下 $ rosed [package_name] <tab> 舉個例子,假設我們想要編輯ros

ROS Learning-012 beginner_Tutorials (程式設計) 建立自定義的ROS訊息ROS服務

ROS Indigo beginner_Tutorials-11 建立自定義的ROS訊息和ROS服務 我使用的虛擬機器軟體:VMware Workstation 11 使用的Ubuntu系統:Ubuntu 14.04.4 LTS ROS 版本:ROS In

ROS學習第四彈 (ROS編輯器及配置/ROS msg/srv 訊息服務

一.ROS專用編輯器rosed的使用 1.1 rosed使用 rosed是rosbash的一部分,這個工具可以通過包名直接編輯包中的一個檔案而不需要列印整個包的路徑,使用格式: rosed [package_name] [filename] 例:rosed roscpp L

ROS入門_1.13 建立ROS訊息ROS服務

1. 訊息(msg)和服務(srv)介紹 訊息(msg): msg檔案就是一個描述ROS中所使用訊息型別的簡單文字。它們會被用來生成不同語言的原始碼。 服務(srv): 一個srv檔案描述一項服務。它包含兩個部分:請求和響應。 msg檔案存放在package的msg目錄下,srv檔案則存放在s

ROS中的訊息服務

1、路徑視覺化釋出path_pub_=nh.advertise<nav_msgs::Path>("path_view",10);    nav_msgs::Pathpath;path.hea

ros訊息服務error:The manifest (with format version 2) must not contain the following tags: run_depend

在按ROS入門教程(點選開啟連結)行進過程中到了執行 rosmsg show beginner_tutorials/Num 命令時,出現提示 The manifest (with format version 2) must not contain the follow

ROS節點、訊息服務、主題的關係

1.ROS計算圖級 ROS 會建立一個連線到所有程序的網路。在系統中的任何節點都可以訪問此網路,並通過該網路與其他節點互動,獲取其他節點發布的資訊,並將自身資料釋出到網路上。 如圖 在這一層級中最基本的概念包括節點、節點管理器、引數伺服器、訊息、服務、主題和訊息記錄包,這些概念都以不同的

ROS總結——錄製回放資料

https://blog.csdn.net/u010510350/article/details/72457758 ROS錄製和回放資料 本部落格將總結如何通過rosbag將ROS系統執行過程中的資料錄製到一個.bag檔案中,然後通過回放資料來重現相似的執行過程。  1. 錄製資料&n

ROS 自定義訊息釋出器訂閱器測試 +程式碼詳解(入門級)

既對ros tutorial 上的例子有了一定的瞭解之後,今天對釋出器和訂閱器程式碼(http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSub

ROS 介面(訊息服務

int32[] unbounded_integer_array int32[5] five_integers_array int32[<=5] up_to_five_integers_array string string_of_unbounded_size string<=10 up_to_t

ROS總結——ROS伺服器客戶端

伺服器和客戶端 (C++) 上一個部落格總結了ROS訊息釋出和訂閱,本部落格將繼續總結ROS如何用 C++ 編寫伺服器節點和客戶端節點。請確保已經按照ROS訊息和ROS服務creating the AddTwoInts.srv的步驟建立了本節部落格所需要的sr

ROS 中對 ros::spin() ros::spinOnce() 的認識

pre 節點 我想 lB pan spa clas all llb ros::spin() 這句話的意思是循環且監聽反饋函數(callback)。循環就是指程序運行到這裏,就會一直在這裏循環了。監聽反饋函數的意思是,如果這個節點有callback函數,那寫一句ros::sp

PCL數據類型ROS數據類型的轉換

SM cloud int 數據 space 數據轉換 AR type spc 參考網址 http://wiki.ros.org/pcl/Overview ,重點參看第2和第3節。 1. Data types 介紹了三種點雲數據類型:sensor_msgs::PointClo

基於ROS獲取Android影象慣導資料

0  將手機與ROS連線 首先,通過區域網將手機與ROS相連線。我使用的是hitcm部落格的程式,具體可以參考他的部落格。到這一步已經可以在電腦端做進一步的計算了,但是如果還想記錄下來資料以便未來再次回放使用,則需要進一步處理。 1 記錄bag ROS與手機相連後,使用rosbag命令開始記錄資料:

ROS-4 : ROS節點主題 ROS-3 : Catkin工作空間ROS功能包

  依照<ROS-3 : Catkin工作空間和ROS功能包>,建立catkin工作空間,並在起src下建立功能包ros_demo_pkg,依賴項為roscpp、std_msgs、actionlib、actionlib_msgs,並構建該空功能包。ROS中節點間的基本通訊方式是topic,即pub

ROS-3 : Catkin工作空間ROS功能包

一、建立一個Catkin工作空間 步驟一:構建catkin工作空間   安裝完成ROS版本後,設定好環境變數:$ source /opt/ros/kinetic/setup.bash。然後即可建立一個catkin工作空間。 $ mkdir -p ~/catkin_ws/s

ROS】建立PublisherSubscriber過程中遇到的問題解決方案

Tutorial連結:http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29   1. 寫好並儲存好了talker.cpp和listener.cpp卻無法建立 檢查~/catkin