ROS的學習(十一)ROS的msg和srv
阿新 • • 發佈:2019-02-09
msg是一個描述ROS中訊息的域的簡單的文字檔案,它用來為訊息產生不同語言的原始碼。
一個srv檔案描述一個服務,它由兩部分組成,請求和服務。
msg檔案被儲存在一個包的msg目錄下,srv檔案被儲存在srv目錄下。msg是簡單的文字檔案,它的每一行由一個與的型別和域的名字組成。你可以使用的域的型別有:
int8, int16, int32, int64 (plus uint*) float32, float64 string time, duration other msg files variable-length array[] and fixed-length array[C]
ROS中還有一個特殊的型別Header,header包括了一個時間戳和一個經產在ROS中使用的座標框架資訊。你經常會看到在msg檔案的第一行程式碼是:
Header header
下面是一個使用了Header的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是響應。
開啟之前,我們所建立的包:
cd ~/catkin_ws/src/beginner_tutorials
在裡面建立一個msg目錄:
mkdir msg
新建一個msg檔案,並寫入資料:
echo "int64 num" > msg/Num.msg
這是一個最簡單的例子,msg檔案只包括一行,當然也可以在檔案中寫入更多的資料,開啟package.xml:
vim package.xml
在裡面新增下面兩行:
<build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend>
之後儲存退出。開啟CMakeLists.txt:
vim CMakeLists.txt
新增message_generation到如下程式碼片,新增後結果如下:
# Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
新增CATKIN_DEPENDS message_runtime,如下:
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
找到下面的程式碼片:
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )
將它修改為:
add_message_files(
FILES
Num.msg
)
確保檔案中有如下程式碼:
generate_messages()
我們可以使用rosmsg show命令來檢視,訊息的詳細型別,rosmsg show的使用方法如下:
rosmsg show [message type]
檢視Num訊息型別如下:
rosmsg show Num
你將會看到:
[beginner_tutorials/Num]:
int64 num
下面介紹如何使用srv,開啟一個終端,在裡面輸入:
roscd beginner_tutorials
mkdir srv
除了可以手工建立一個srv包以外,我們還可以從其他的包中複製,這時候roscp是一個非常有用的命令,它的使用方法如下:
roscp [package_name] [file_to_copy_path] [copy_path]
我們從rospy_tutorials這個包中複製,命令如下:
roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
接下來就是配置CMakeLists.txt檔案,開啟CMakeLists.txt:
vim CMakeLists.txt
在裡面新增message_generation,我們之前已經新增過了,如下:
# Do not just add this line to your CMakeLists.txt, modify the existing line
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 show可以檢視我們剛剛建立的服務型別,它的使用方法和rosmsg show相似,用法如下:
rossrv show <service type>
例如:
rossrv show beginner_tutorials/AddTwoInts
你將會看到返回的結果如下:
int64 a
int64 b
---
int64 sum
接下來我們看一下如何將上述的檔案生成為ros支援的語言程式碼,開啟CMakeLists.txt:
vim CMakeLists.txt
找到下面這部分程式碼:
# generate_messages(
# DEPENDENCIES
# # std_msgs # Or other packages containing msgs
# )
將起修改為如下:
generate_messages(
DEPENDENCIES
std_msgs
)
將我們之前的generate_messages()去掉,儲存退出。
現在重新構建一下這個包:
cd ../..
catkin_make
cd -
所有在msg目錄下的.msg檔案都會產生ros所支援的語言的原始檔。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/