1. 程式人生 > >ROS的學習(十一)ROS的msg和srv

ROS的學習(十一)ROS的msg和srv

     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/