ROS學習總結(10)

創建ROS消息和ROS服務

創建並編譯ROS消息和服務,以及rosmsg,rossrv和roscp命令行工具的使用。

消息(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
  • 其中A和B是請求, 而Sum是響應。

使用 msg

創建一個 msg

  • 下面,我們將在之前創建的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文件(可以參考前邊的教程rosed).

  • 在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()

  • 增加Num.msg文件

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
  • 上面是最簡單的例子——在.msg文件中只有一行數據。
  • 當然,你可以仿造上面的形式多增加幾行以得到更爲複雜的消息:
string first_name
string last_name
uint8 age
uint32 score
  • 接下來,還有關鍵的一步:我們要確保msg文件被轉換成爲C++,Python和其他語言的源代碼:
  • 在你最喜愛的編輯器中打開CMakeLists.txt文件(可以參考前邊的教程rosed),併爲下邊這行代碼去掉#:
# rosbuild_genmsg()
  • 現在,你可以生成自己的消息源代碼了。
  • 如果你想立即實現,那麼就跳過以下部分,到Common step for msg and srv.

使用 rosmsg

  • 以上就是你創建消息的所有步驟。

  • 下面通過rosmsg show命令,檢查ROS是否能夠識消息。

  • 使用方法:

$ rosmsg show [message type]
  • 樣例:
$ rosmsg show beginner_tutorials/Num
  • 你將會看到:
int64 num
  • 在上邊的樣例中,消息類型包含兩部分: beginner_tutorials

    • 消息所在的package Num
    • 消息名Num.
  • 如果你忘記了消息所在的package,你也可以省略掉package名。

  • 輸入:

$ rosmsg show Num 
  • 你將會看到:
[beginner_tutorials/Num]:
int64 num

使用 srv

創建一個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
)
  • 再次打開CMakeLists.txt文件,刪掉#,去除對如下語句的註釋:
# rosbuild_gensrv()
  • 現在,你可以生成自己的服務源代碼了。
  • 如果你想立即實現,那麼就跳過以下部分,到Common step for msg and srv.

使用 rossrv

  • 以上就是創建一個服務所需的所有步驟。
  • 下面通過rossrv show命令,檢查ROS是否能夠識該服務。
  • 使用方法: $ rossrv show 例子:
$ 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

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
)
  • catkin版本,由於增加了新的消息,所以我們需要重新編譯我們的package:
# In your catkin workspace
$ cd ../..
$ catkin_make
$ cd -
  • rosbuild版本,由於增加了新的消息,所以我們需要重新編譯我們的package:

    $ rosmake beginner_tutorials

  • 所有在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/路徑下.

  • 詳盡的消息格式請參考Message Description Language 頁面.

獲得幫助

  • 我們已經接觸到不少的ROS工具了。
  • 有時候很難記住他們所需要的參數。
  • 還好大多數ROS工具都提供了幫助。
  • 輸入:
$ rosmsg -h
  • 你可以看到一系列的rosmsg子命令.
  • 命令列表:
rosmsg show 顯示信息的描述
rosmsg users  Find files that use message
rosmsg md5  顯示信息的md5sum
rosmsg package  列出信息所在的包
rosmsg packages 列出包含信息的包
  • 同樣你也可以獲得子命令的幫助:
$ rosmsg show -h
  • 這會現實rosmsg show 所需的參數:
  • Usage:
rosmsg show [options] <message type>
  • 選項Options:
  -h, --help  show this help message and exit
  -r, --raw   show raw message text, including comments

回顧

  • 總結一下到目前爲止我們接觸過的一些命令:
rospack = ros+pack(age) : 提供ROS package相關的信息 
rosstack = ros+stack  : 提供stacks 相關的信息 
roscd = ros+cd  : changes directory to a ROS package or stack 
rosls = ros+ls  : lists files in a ROS package 
roscp = ros+cp  : copies files from/to a ROS package 
rosmsg = ros+msg : provides information related to ROS message definitions 
rossrv = ros+srv : provides information related to ROS service definitions 
rosmake = ros+make : makes (compiles) a ROS package 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章