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 )
- 編譯