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
在上面的例子中,A和B是請求,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適用於msg和srv。)
此外,您需要對消息的服務的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中的內容必須填寫,否則編譯有錯誤