ROS(二) 创建一个ROS的msg和srv

来源:互联网 发布:删除mac桌面上的文件 编辑:程序博客网 时间:2024/06/09 20:06

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里面。

0 0