ROS學(xué)習(xí)筆記(十二)- 創(chuàng)建一個(gè)ROS msg 和 srv

1 介紹msg和srv

  • msg:描述ROS message的簡(jiǎn)單文本,用來生成不同語(yǔ)言的消息源代碼。
  • srv:一個(gè)srv描述一個(gè)service。它有請(qǐng)求和回復(fù)兩部分組成。
    msg文件存儲(chǔ)在msg目錄下,srv文件存儲(chǔ)在srv目錄下。
    msg只是一種字段類型的簡(jiǎn)單文本和每行一個(gè)字段名,可以用的字段是:
  • 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包含一個(gè)時(shí)間戳和一個(gè)坐標(biāo)框架信息,通常只在ROS里用。你會(huì)頻繁地在msg的第一行看到 Header header。
    下面是一個(gè)msg例子,包含一個(gè)Header,一個(gè)字符串和兩條其他msg。
  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

srv跟msg差不多,不過它包含兩部分,一部分是請(qǐng)求,一部分是應(yīng)答,用"-----"分隔開:

int64 A
int64 B
---
int64 Sum

2 使用msg

2.1 建立一個(gè)msg

在之前的包里面建立一個(gè)新的msg.

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

進(jìn)不去就輸入:
export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH

source ~/catkin_ws/devel/setup.bash
現(xiàn)在msg就有一行了,我們可以寫的更復(fù)雜一些,一個(gè)占一行:

string first_name
string last_name
uint8 age
uint32 score

還有一步,這一步確保其可以轉(zhuǎn)成C++,Python或者其他語(yǔ)言:
打開package.xml,確保里面有以下兩行:

<build_depend>message_generation</build_depend>
 <run_depend>message_runtime</run_depend>

我們現(xiàn)在要編譯,所以我們需要message_generation,運(yùn)行的時(shí)候需要message_runtime。
打開 CMakeLists.txt,在find_package 里面加入*message_generation *:

# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

其實(shí)即使你沒有配置,有時(shí)候也能正常編譯,這是因?yàn)閏atkin會(huì)自動(dòng)用以前的項(xiàng)目的配置,不過如果隔離編譯就不行了。
確保運(yùn)行時(shí)出口的依賴關(guān)系:

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES beginner_tutorials
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

找到下列代碼:

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

去掉注釋,改成:

add_message_files(
   FILES
   Num.msg
 )

現(xiàn)在我們需要確保CMake知道我們添加了.msg文件。
找到下面的代碼:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

去掉“#”號(hào)。
后面要做的內(nèi)容下個(gè)教程再說。

3 使用rosmsg:

使用rosmsg show確保ROS能夠看見它。
用法:
$ rosmsg show [message type]
例如:
$ rosmsg show beginner_tutorials/Num
我們將會(huì)看到:
int64 num
在前面的例子里,消息由兩部分構(gòu)成:

  • beginner_tutorials -- 消息定義的地方
  • Num--消息的名稱
    如果你忘了包里有什么msg:
    $ rosmsg show Num
    你可以看到:
[beginner_tutorials/Num]:
int64 num

4 使用srv

4.1 創(chuàng)建一個(gè)srv

使用剛剛創(chuàng)建的package創(chuàng)建一個(gè)srv

$ roscd beginner_tutorials
$ mkdir srv

我們將會(huì)從另一個(gè)package里面拷一個(gè)而不是完全的手工創(chuàng)建,使用roscp指令。
用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
現(xiàn)在我們從小海龜那里拷一個(gè):
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
接下來一步,我們要確保把srv文件轉(zhuǎn)化成C++源代碼或者其他程序源碼。
打開CMakeLists.txt,去除以下程序的井號(hào):

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

然后替換成自己的srv文件:

add_service_files(
  FILES
  AddTwoInts.srv
)

現(xiàn)在,就做好了從我們服務(wù)定義生成源文件的準(zhǔn)備。具體的做法在后面的教程里有。

4.2 使用rossrv

使用rossrv show確保ROS能夠看到它。
用法:
$ rossrv show <service type>
例如:
$ rossrv show beginner_tutorials/AddTwoInts
你會(huì)看到:

int64 a
int64 b
---
int64 sum

其實(shí)可以不寫包名,它會(huì)自動(dòng)顯示所以此名稱的srv.

5 msg和srv的共同步驟

這一節(jié)和上一節(jié)都省略了一些前面做過的內(nèi)容,如果需要查看可以參考官網(wǎng)。官網(wǎng)本節(jié)鏈接
首先,改變CMakelists.txt的內(nèi)容:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

解除注釋,添加包含著你依賴的.msg文件的包:

generate_messages(
  DEPENDENCIES
  std_msgs
)

現(xiàn)在我們的包里已經(jīng)有了一些新消息,我們需要重新make我們的包:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make install
$ cd -

.msg生成的不同語(yǔ)言的源碼存放位置如下,懶得翻譯了:
Any .msg file in the msg directory will generate code for use in all supported languages. The C++ message header file will be generated in *~/catkin_ws/devel/include/beginner_tutorials/. *The Python script will be created in ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg. The lisp file appears in ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/.
與此相似的是,.srv文件的源碼,C++就在和message相同的文件夾,別的在在msg文件夾旁邊的srv文件夾。
message的完整設(shè)計(jì)說明 Message Description Language .

如果你變異的C++node要用你的新消息, 你需要聲明一個(gè)新的依賴 catkin msg/srv build documentation.

6 獲取幫助

我們很難記住每個(gè)命令的使用要求,我們可以使用幫助功能來獲知,即在命令后面加上-h即可。

7 復(fù)習(xí)

我們現(xiàn)在列舉一些我們用過的命令:

  • rospack=ros+pack:提供有關(guān)ROS package的信息。
  • roscd=ros+cd:changes directory 改變路徑到一個(gè)ROS package或stack
  • rosls=ros+ls:lists 列舉ROS package中的文件
  • roscp=ros+cp:copies 從一個(gè)ROS package復(fù)制文件到另一個(gè)
  • rosmsg=ros+msg:提供關(guān)于ROS message定義的信息
  • rossrv=ros+srv:提供關(guān)于ROS service定義的信息
  • catskin_make:makes(compiles)一個(gè)ROS package
  • rosmake=ros+make:在沒有使用一個(gè)catkin工作空間的情況下makes(compiles)一個(gè)ROS package
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容