0.msg和srv的介绍
- msg:msg文件三一个描述ROS消息区域的简单文本文件。我们使用各种语言利用它形成来形成源码。
- srv : 一个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包含一个时间戳(timestamp)和相应的框架信息,这些都是在ROS里面常用的。你将会频繁的在一个msg文件里面看到第一行有Header header。
这里有一个msg,里面包含了一个Header,一个字符的基元(string primitive)和两个其他的msgs:
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是响应。
1.使用msg
1.1 创建一个msg
让我们在之前的包(package)里面里定义新的msg。
这个.msg文件之包含一行。你也可以通过加一些多个元素创建一个更加复杂的文件,像下面这样:
string first_name
string last_name
uint8 age
uint32 score
这里还有一步,我们需要确认这个msg文件能被转化成C++,Python和其他语言的源码:
打开package.xml,确定有一下三行:
在build的时候,我们需要“message_generation”,在runtime的时候,我们只需要"message_runtime"。
用你的文本编辑器打开CMakeList.txt。在find_package里面添加message_generation,这样你就能形成一个消息(message)。你能通过添加message_generation到COMPONENTS像下图一样:
你也可能注意到有时候你的工程不用find_package调用所有的依赖。这是因为catkin将你的工程结合成了一块。如果是早期的工程调用find_package,你的配置也是一样的值。但是忘记调用意味着你的工程在隔离的时候(build in isolation)会更容易崩溃。
同时你也要确信导出消息runtime 依赖(the message runtime dependency)
catkin_package(
…
CATKIN_DEPENDS message_runtime …
…)
找到在源码里面的下面模块:
去掉#来取消注释,将Message*.msg文件用你的.msg文件代替,比如像以下:
通过手动添加.msg文件,我们确信CMake知道当你添加其他.msg文件后必须识别到工程里面去。
现在我们必须确信generate_messages()函数被调用。
对于ROS Hydro和之后的版本,你需要取消一下行的注释:
现在你已经准备好了,可以从你的msg 定义里面形成源文件了。
2.使用rosmsg
现在我们来创建一个msg,让我们确信ROS能看到它并在使用rosmsg时显示命令。
使用方法(Usage):
$ rosmsg show [message type]
例子:
(
这个地方如果出现错误,证明你的beginner_tutorials不在你的库里面可以试着运行以下
$cd ~/catkin_ws
$source devel/setup.bash
$roscd beginner_tutorials
)
在上面那个例子里,这个消息的类型包括两个部分:
- beginner_tutorials--消息被定义的包(package)
- Num--msg的名字
3.使用srv
3.1.创建一个srv
让我们用之前创建的那个包(package)来创建一个srv:
我们将使用从另外一个package里面复制一个srv,而不是用手工创建。为了做这个,roscp是一个及其有用的命令。
用法(Usage):
$roscp [package_name] [file_to_copy_path] [copy_path]
现在我们能复制一个服务(service)从rospy_tutorials包里:
下面还有一个步骤,我们需要确定srv文件被转化成C++,Python和其他语言的源码。除非你之前已经做过,否则打开openage.xml确保下面两行在里面没有注释掉:
在之前,记得我们在build的时候需要message_generation,在runtime的时候,我们仅仅需要“message_runtime”。除非你之前已经做过,否则需要在CMakeList.txt添加message_generation依赖库来形成message。
(不要管它的名字,message_generation同时作用于msg和srv)
同时你也要像message一样改变package.xml,这样可以寻找以上需要的额外的依赖库。
移除下列几行的#:
用你的service来代替Service*.srv
现在你已经准备好用你的service定义来形成源文件了。
3.2 使用 rossrv
这需要使用你创建的srv文件。让我们确保ROS能看到它并使用rossrv来现实命令。
用法:
$rossrv show <service type>
例子:
4.对于msg和srv的通用步骤
除非你已经进行了下面步骤,否则在CMakeList.txt里面改变:
# generate_messages(
# DEPENDENCIES
# # std_msgs # Or other package containing msgs
#)
取消它的注释,并添加你在.msg文件里面包含的任何packages,这个.msg文件你在messages里面用过,像下面的:
现在我们意见完成了许多心的消息,所以我们需要重新对我们的package进行make:
# In your catkin workspace
$cd ../..
$cdtkin_make install
$cd -
任何在msg文件夹里面的.msg文件将会形成所有支持能用的代码。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/里面。
同样的,任何在srv文件夹里的.srv文件将会形成所有支持能用的代码。对于C++,它会在与上面的文件夹里生成。而Python与Lisp将会在msg文件夹旁边生成一个srv里面。