ROS中msg和srv文件的區別


1、msg和srv究竟有什么區別??

msg只是單向的發送和接受。

srv包含兩個部分:請求和響應。

2、msg和srv簡介

  • msg:msg文件是描述ROS消息字段的簡單文本文件。它們用於為不同語言(c++或者python等)的消息生成源代碼。
  • srv:srv文件用來描述服務。它由兩部分組成:請求(request)和響應(response)。

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

msg和srv文件的定義格式:

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

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

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

1 int64 A
2 int64 B
3 ---
4 int64 Sum

在上面的例子中,A和B是請求,Sum是響應。

在ROS中還有一種特殊類型:Header,它包含在ROS中常用的時間戳和坐標系信息。你會經常看到一個msg文件中的第一行有Header header。
下面是一個使用Header,字符串基元和另外兩個msg的msg示例:

1 Header header
2 string child_frame_id
3 geometry_msgs/PoseWithCovariance pose
4 geometry_msgs/TwistWithCovariance twist

3、使用msg

  • 定義一個新的msg。
  • 打開package.xml,並確保這兩行都在其中並取消注釋:
1 <build_depend> message_generation </ build_depend>
2 <run_depend> message_runtime </ run_depend>

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

  • CMakeLists.txt中添加message_generation依賴於find_package中,這樣就可以生成消息,使得它看起來是這樣的:
1 find_package(catkin REQUIRED COMPONENTS
2 roscpp
3 rospy
4 std_msgs
5 message_generation
6 )
  • 還要確保導出消息運行時依賴關系。
1 catkin_package(
2 ...
3 CATKIN_DEPENDS message_runtime ...
4 ...)
  • 找到以下代碼塊:
1 # add_message_files(
2 # FILES
3 # Message1.msg
4 # Message2.msg
5 # )
  • 通過刪除取消它#符號,替換為你的消息文件,使得它看起來是這樣的:
1 add_message_files(
2 FILES
3 Num.msg
4 )
  • 對於ROS Hydro及更高版本(也就是從 Ubuntu 12.04 LTS 之后都需要),您需要取消注釋以下行:
1 # generate_messages(
2 # DEPENDENCIES
3 # std_msgs
4 # )
  • 所以它看起來像:
1 generate_messages(
2 DEPENDENCIES
3 std_msgs
4 

4、使用rosmsg

用法:
$ rosmsg show [message type]
例如:
$ rosmsg show beginner_tutorials/Num
如果你不記得msg所在的包,你可以省略包名。嘗試:
$ rosmsg show Num

5、使用srv

在使用srv之前我們介紹一個命令:roscp,roscp是一個有用的命令行工具,用於將文件從一個包復制到另一個。
用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]

  • 現在我們可以從rospy_tutorials包復制一個服務:
    • $ roscp rospy_tutorials AddTwoInts.srv srv / AddTwoInts.srv
    • //roscp [包名] [復制的服務名字] [復制的地址]
  • 還有一步。我們需要確保srv文件轉換為C ++,Python和其他語言的源代碼。
    • 打開package.xml,並確保這兩行在其中並取消注釋:
1 <build_depend> message_generation </ build_depend>
2 <run_depend> message_runtime </ run_depend>
  • 添加message_generation依賴關系以在CMakeLists.txt中生成消息:
1 find_package(catkin REQUIRED COMPONENTS
2 roscpp
3 rospy
4 std_msgs
5 message_generation
6 )

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

  • 此外,您需要對消息的服務的package.xml進行相同的更改,因此請查看上面所需的其他依賴項。
    • 替換您的服務文件的占位符Service * .srv文件:
1 add_service_files(
2 FILES
3 AddTwoInts.srv
4 

6、使用rossrv

用法:
$ rossrv show <service type>
例:
$ rossrv show beginner_tutorials / AddTwoInts
類似於rosmsg,你可以找到像這樣的服務文件,而不指定包名:
$ rossrv show AddTwoInts

7、總結 

1. 創建消息(一共5步):

  • 包中建立msg文件夾,在文件夾中創建*.msg
  • 編輯.msg,定義類型和域名
  • package.xml中添加
1 <build_depend>message_generation</build_depend>
2 <run_depend>message_runtime</run_depend>
  • CMakeLists.txt中添加
 1 find_package(catkin REQUIRED COMPONENTS
 2 roscpp
 3 rospy
 4 std_msgs
 5 message_generation
 6 )
 7 //---------------------------------------
 8 add_message_files(
 9 FILES
10 Num.msg
11 ) 
  • 編譯

2. 創建服務(一共5步):

  • 創建srv文件夾,創建.srv文件
  • 編輯.srv文件
  • .xml文件
1 <build_depend>message_generation</build_depend>
2 <run_depend>message_runtime</run_depend>
  • CMakeLists.txt中添加
 1 find_package(catkin REQUIRED COMPONENTS
 2 roscpp
 3 rospy
 4 std_msgs
 5 message_generation
 6 )
 7 //---------------------------------------
 8 add_service_files(
 9 FILES
10 AddTwoInts.srv
11 )    
  • 編譯


免責聲明!

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



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