.msg
文件是描述ROS消息的字段的文件,其本質上是簡單的.txt
格式的文件,其目的是用來生成基於不同編程語言的承載消息的源代碼。
.srv
文件描述了一種服務,它由兩個部分組成:分別是請求和應答(或者響應)
.msg
格式的文件是存儲在名為msg
的目錄下,而.srv
格式的文件存儲在名為srv
的目錄下。
消息文件中的每一行包含兩個字段,分別是字段類型和字段名。
可用的字段類型有:
int8
int16
int32
int64
float32
float64
string
time
duration
other msg files
可變長度的數組array[]和固定長度的數組array[C]
當然了,也有ROS中的特殊類型:Header,頭包含了ROS中常用的時間戳和坐標系信息,你將會經常看到一個.msg文件的第一行有Header header
。
下面是一個具體的.msg文件的例子:
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
說完了.msg
文件,現在,我們來講一講.srv
文件,.srv
文件很像.msg
文件,只是.srv
文件包含兩個部分:請求部分和響應部分,這兩部分之間由'---'三條破折線隔開。
下面是.srv
文件的一個具體的例子:
int64 A
int64 B
---
int64 Sum
講完了.msg
文件和.srv
文件的基本功能之后,我們來試着使用它們。
創建一個.msg
文件:
cd catkin_ws
source devel/setup.bash
roscd beginner_tutorials
mkdir msg
echo "int64 num" > msg/Num.msg
上面的例子中,我們僅僅加入了一行,當然了,你也可以添加個元素,每行一個元素來創建一個復雜的消息文件。
就像這樣的:
string first_name
string last_name
uint8 age
uint32 score
你以為這樣就可以了嗎?不急,我們還有一個關鍵的步驟需要做,否則是無法實現我們的功能的。因為我們需要確保我們上面創建的消息文件被准確地翻譯成了基於比如C++、Python或者其他編程語言的源代碼。
為了達到這個目的,我們需要做如下的工作:
首先,我們需要打開beginner_tutorials
功能包的package.xml文件,然后用鼠標把滾動條拉到最底下,最后是添加如下的兩行標簽:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
注意:我們在構建功能包的時候,需要message_generation
,而當我們運行功能包的節點的時候,需要message_runtime
修改了package.xml文件,我們是不是還需要修改CMakeLists.txt文件呢?想想我們的所有的功能包的構建和運行,是不是都是通過package.xml和CMakeLists.txt文件進行配置和管理的?是的,我們還需要修改CMakeLists.txt文件!
你可以用你最喜歡的純文本編輯器打開CMakeLists.txt文件並進行如下的編輯:
在CMakeLists.txt文件的find_package項添加message_generation依賴包,這樣你就可以在構建的時候生成消息。
具體的添加方法如下:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
注意:或許,有時候,你會發現即使你的CMakeLists.txt文件里面沒有調用find_package()里面的所有依賴項,這是因為catkin會把你所有的項目結合在一起,所以如果你之前的一個項目里面調用了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
)
通過手動添加Num.msg文件,我們還確保了讓Cmake知道什么時候它需要重新配置當前這個項目,當你還添加了其他的.msg文件的時候。
最后,我們還需要確保generate_messages()函數被調用了。
為此,我們需要取消掉如下的注釋:
# generate_messages(
# DEPENDENCIES
# std_msgs
# )
使其變成:
generate_messages(
DEPENDENCIES
std_msgs
)
好了,現在你已經為.msg
文件生成源文件准備好了准備。
使用rosmsg
我們可以通過rosmsg show
命令來查看消息的內容,以確保ROS能夠看到它。
該命令的調用格式如下:
rosmsg show [message type]
例如:
rosmsg show beginner_tutorials/Num
輸出的結果為:
liuqiang@liuqiang-pc:~$ rosmsg show beginner_tutorials/Num
int64 num
從上面的例子可以看出,消息類型名是由兩部分組成的:
1、beginner_tutorials
是定義了消息的功能包的名稱
2、Num
是消息文件的名稱Num
如果你不記得具體是那個功能包里面包含了Num消息,可以使用如下的方法:
rosmsg show Num
輸出的結果為;
liuqiang@liuqiang-pc:~$ rosmsg show Num
[beginner_tutorials/Num]:
int64 num
使用rossrv
創建一個srv
roscd beginner_tutorials
mkdir srv
這里,我們不准備直接創建一個.srv
文件,我們准備直接從另一個功能包里面復制過來:
roscp [package_name] [file_to_copy_path] [copy_path]
現在,我們准備從rospy_tutorials功能包里面復制service:
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
同樣的,我們需要在package.xml里面添加如下的內容,如果之前添加過,那么就不需要添加了:
<buid_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
在CMakeLists.txt文件里面更改和添加如下的內容:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
將如下的內容:
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
修改成:
add_service_files(
FILES
AddTwoInts.srv
)
使用rossrv
我們可以使用rossrv show
來查看服務文件的內容:
liuqiang@liuqiang-pc:~$ rossrv show beginner_tutorials/AddTwoInts
int64 a
int64 b
---
int64 sum
同樣的,我們也可以使用下面的方法來實現上面的功能,而不需要給出功能包的名稱:
rossrv show AddTwoInts
輸出的結果為:
liuqiang@liuqiang-pc:~$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
除非你前面已經做過了如下的內容,否則需要修改功能包的CMakeLists.txt文件。
我們需要將下面的內容:
# generate_messages(
# DEPENDENCIES
# # std_msgs # Or other packages containing msgs
# )
去掉注釋:
generate_messages(
DEPENDENCIES
std_msgs
)
現在,我們可以通過如下的命令進行功能包的編譯了:
roscd beginner_tutorials
cd ../.. # 即進入父目錄的父目錄
catkin_make
注意:任何msg目錄下的.msg
文件將會為用戶生成以所有支持的編程語言的代碼。C++的消息頭文件將在~/catkin_ws/devel/include/beginner_tutorials/
生成,而Python的腳本將在如下的目錄下生成:
~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg
同樣的,任何srv目錄下的.srv
文件將會為用戶生成以所有支持的編程語言的代碼。對於C++,服務的頭文件跟消息的頭文件存儲在同一個目錄下,對於Python來說,msg目錄的旁邊會生成一個srv目錄,而Python的腳本就在里面。
獲取有關rosmsg
的幫助:
rosmsg -h
輸出結果為:
liuqiang@liuqiang-pc:~$ rosmsg -h
rosmsg is a command-line tool for displaying information about ROS Message types.
Commands:
rosmsg show Show message description
rosmsg list List all messages
rosmsg md5 Display message md5sum
rosmsg package List messages in a package
rosmsg packages List packages that contain messages
Type rosmsg <command> -h for more detailed usage
根據輸出的提示,我們還可以使用如下的命令獲取更加詳細的提示:
rosmsg show -h
輸出結果為:
liuqiang@liuqiang-pc:~$ rosmsg show -h
Usage: rosmsg show [options] <message type>
Options:
-h, --help show this help message and exit
-r, --raw show raw message text, including comments
-b BAGFILE, --bag=BAGFILE
show message from .bag file