ros學習之消息和服務


1 msg和srv簡介

  • msg:msg文件是描述ROS消息字段的簡單文本文件。它們用於為不同語言(c++或者python等)的消息生成源代碼。

  • srv:srv文件用來描述服務。它由兩部分組成:請求(request)和響應(response)。

msg文件存儲在msg目錄中,而srv文件存儲在srv目錄中。

msg只是簡單的文本文件,每行有一個字段類型和字段名稱。您可以使用的字段類型有(如同c++定義變量int x 中的int):

  • int8,int16,int32,int64(plus uint *)
  • float32,float64
  • string
  • time,duration
  • 其他msg文件
  • 可變長度數組array[]和固定長度數組array[C]

在ROS中還有一種特殊類型:Header,它包含在ROS中常用的時間戳和坐標系信息。你會經常看到一個msg文件中的第一行有Header header

下面是一個使用Header,字符串基元和另外兩個msg的msg示例:

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

srv文件和msg文件相似,除了它包含兩個部分:請求和響應。這兩部分用“---”線分隔。下面是一個srv文件的示例:

int64 A
int64 B
---
int64 Sum

在上面的例子中,AB是請求,Sum是響應。

2 使用msg

2.1創建msg

讓我們在上一個教程中創建的包中定義一個新的msg。

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

上面的.msg文件示例只包含1行。當然,您可以通過添加多個元素(每行一個)來創建更復雜的文件,如下所示:

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中添加message_generation依賴於find_package中,這樣就可以生成消息。您可以通過簡單地增加做message_generation到列表組件,使得它看起來是這樣的:

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

您可能會注意到,有時您的項目構建良好,即使您沒有調用find_package所有依賴項。這是因為catkin將所有的項目合並為一個,所以如果一個早期的項目調用find_package,你的配置使用相同的值。但是忘記調用意味着你的項目可以在孤立構建時輕松打破。

還要確保導出消息運行時依賴關系。

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

找到以下代碼塊:

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

通過刪除取消它符號,替換為你的消息文件,使得它看起來是這樣的:

add_message_files(
  FILES
  Num.msg
)

通過手動添加.msg文件,我們確保CMake知道在添加其他.msg文件后它必須重新配置項目。

現在我們必須確保generate_messages()函數被調用。

對於ROS Hydro及更高版本,您需要取消注釋以下行:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )
  • 所以它看起來像:
    generate_messages(
      DEPENDENCIES
      std_msgs
    )

在早期版本中,您可能只需要取消注釋一行:

generate_messages()

現在你可以從你的msg定義生成源文件。如果你現在想這樣做,跳過msg和srv的通用步驟的下一節

3 使用rosmsg

這是所有你需要做的創建一個msg。讓我們確保ROS可以使用rosmsg show命令看到它

用法:

$ rosmsg show [message type]

例如:

$ rosmsg show beginner_tutorials/Num

你會看見:

  • int64 num

在上一個示例中,消息類型由兩部分組成:

  • beginner_tutorials - 定義消息的包

  • Num - msg的名稱Num

如果你不記得msg所在的包,你可以省略包名。嘗試:

 $ rosmsg show Num

你會看見:

  • [beginner_tutorials / Num]: int64 num

4 使用srv

創建srv

讓我們使用剛創建的包來創建srv:

$ roscd beginner_tutorials
$ mkdir srv

我們不會手動創建新的srv定義,而是從另一個包中復制現有的srv定義。

為此,roscp是一個有用的命令行工具,用於將文件從一個包復制到另一個。

用法:

$ roscp [package_name] [file_to_copy_path] [copy_path]

現在我們可以從rospy_tutorials復制一個服務

$ roscp rospy_tutorials AddTwoInts.srv srv / AddTwoInts.srv

還有一步。我們需要確保srv文件轉換為C ++,Python和其他語言的源代碼。

除非你已經這樣做,打開package.xml,並確保這兩行在其中並取消注釋

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

和前面一樣,注意在構建時,我們需要“message_generation”,而在運行時,我們只需要“message_runtime”。

除非已對上一步中的消息執行此操作,否則添加message_generation依賴關系以在CMakeLists.txt中生成消息

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
 message_generation
)

(盡管它這樣的名字,但是message_generation適用於msgsrv。)

此外,您需要對消息的服務的package.xml進行相同的更改,因此請查看上面所需的其他依賴項。

移除以取消以下行的注釋:

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

並替換您的服務文件的占位符Service * .srv文件:

add_service_files(  FILES  AddTwoInts.srv 

現在,您可以從服務定義生成源文件。如果你現在想這樣做,跳過msg和srv的通用步驟的下一節

4.2 使用rossrv

這就是創建srv所需要做的。讓我們確保ROS可以使用rossrv show命令查看它

用法: 

$ rossrv show <service type>

例:

$ rossrv show beginner_tutorials / AddTwoInts

你會看見:

  • int64 a int64 b --- --- int64 sum

類似於rosmsg,你可以找到像這樣的服務文件,而不指定包名:

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

這里,示出了兩個服務。第一個是你剛剛在beginner_tutorials包中創建的,第二個是從rospy_tutorials包中預先存在的一個。

 

5 msg和srv的常見步驟 

除非您已在之前的步驟中完成此操作,請更改CMakeLists.txt

#generate_messages( #依賴 ##std_msgs#或其他包含msgs的軟件包 #)

取消注釋它並添加您依賴的任何包含您的消息使用的.msg文件(在本例中為std_msgs)的包,如下所示:

generate_messages(  相關性  std_msgs 

現在我們已經做了一些新的消息,我們需要再次使我們的包:

#在您的catkin工作區中 $ roscd beginner_tutorials $ cd ../ .. $ catkin_make install $ cd - 

msg目錄中的任何.msg文件將生成用於所有受支持語言的代碼。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 /中

類似地,srv目錄中的任何.srv文件都將生成支持的語言的代碼。對於C ++,這將生成與消息頭文件在同一目錄中的頭文件。對於Python和Lisp,在'msg'文件夾旁邊將有一個'srv'文件夾。

消息格式的完整規范在消息描述語言頁面提供。

如果您正在構建使用新消息的C ++節點,則還需要聲明節點和消息之間的依賴關系,如catkin msg / srv構建文檔中所述

 獲得幫助

我們已經看到了很多ROS工具。可能難以跟蹤每個命令需要的參數。幸運的是,大多數ROS工具提供自己的幫助。

嘗試:

$ rosmsg -h
  • 您應該看到不同的rosmsg 命令的列表

    命令:  rosmsg show顯示消息的描述  rosmsg list列出所有消息  rosmsg md5顯示消息md5sum  rosmsg package列出包中的消息  rosmsg軟件包列出包含消息的軟件包

您還可以獲取有關子命令的幫助

$ rosmsg show -h
  • 這顯示了rosmsg顯示所需的參數:
    用法:rosmsg show [options] <message type>  選項:  -h,--help顯示此幫助消息並退出  -r,--raw顯示原始消息文本,包括注釋

評論

讓我們只列出一些我們目前使用的命令:

  • rospack = ros + pack(age):提供與ROS包相關的信息
  • roscd = ROS + CD:Changes lirectory到ROS包或堆

  • rosls = ROS + LS:LIST 文件在ROS文件包

  • roscp = ROS + CP:copy文件從/到一個ROS包

  • rosmsg = ros + msg:提供與ROS消息定義相關的信息
  • rossrv = ros + srv:提供與ROS服務定義相關的信息
  • catkin_make:make(編譯)一個ROS包
    • rosmake = ros + make:make(編譯)一個ROS包(如果你不使用catkin工作區)

總結:

消息與服務

Header header
string child_frame_id geometry_msgs/PoseWithCovariance pose
geometry_msgs
/TwistWithCovariance twist
int64 A int64 B --- int64 Sum

創建消息:

1 包中建立msg文件夾,在文件夾中創建*.msg

2 編輯.msg,定義類型和域名

3 package.xml中添加

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

4 CMakeLists.txt中添加

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)
catkin_package(
  ...
 CATKIN_DEPENDS message_runtime ...  ...)
add_message_files(
  FILES
 Num.msg )
generate_messages(
  DEPENDENCIES
 std_msgs )

5 編譯

創建服務:

1 創建srv文件夾,創建.srv文件

2 編輯.srv文件

3 .xml文件

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

4  CMakeLists.txt中添加

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
 message_generation
)

add_service_files(
  FILES
  AddTwoInts.srv
)

5 編譯

注意:.xml中的內容必須填寫,否則編譯有錯誤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM