1 介紹msg和srv
- msg:描述ROS message的簡(jiǎn)單文本斋攀,用來(lái)生成不同語(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差不多,不過(guò)它包含兩部分猜憎,一部分是請(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)目的配置颖系,不過(guò)如果隔離編譯就不行了。
確保運(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è)教程再說(shuō)黔攒。
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
接下來(lái)一步莲绰,我們要確保把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é)都省略了一些前面做過(guò)的內(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ì)說(shuō)明 Message Description Language .
如果你變異的C++node要用你的新消息, 你需要聲明一個(gè)新的依賴 catkin msg/srv build documentation.
6 獲取幫助
我們很難記住每個(gè)命令的使用要求侈询,我們可以使用幫助功能來(lái)獲知,即在命令后面加上-h即可糯耍。
7 復(fù)習(xí)
我們現(xiàn)在列舉一些我們用過(guò)的命令:
- 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