ROS学习(基于Ubuntu 15.04 和ROS Jade)第三章 ROS核心教程 之 10 创建ROS消息和ROS服务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jrc_january/article/details/76154362

0. 引言

本节讲述ROS消息和服务,以及rosmsg、rossrv和roscp工具。

0.1 消息(msg)和服务(srv)介绍

  • 消息(msg):msg文件是一个描述ROS中所使用消息类型的简单文本。它们会被catkin_make用来生成不同语言的源代码。
  • 服务(srv):一个srv文件描述一项服务。它包含请求和响应两部分(使用—分隔)。
    msg文件实际上就是每行声明一个数据类型和变量名。可以使用以下类型:

  • int8,int16,int32,int64

  • float32,float64
  • string
  • time,duration
  • other msg file
  • 定长数组array[x],可变长度数组arra[]
  • 特殊类型Header(包含时间戳回绕坐标信息)

1. 使用msg

1.1 创建一个msg

首先切换到包目录下:

$ roscd beginner_tutorials     //切换到包中
$ mkdir msg                //在包下创建msg文件夹
$ rosed beginner_tutorials Num.msg //创建一个Num.msg文件

在.msg文件中添加消息变量:

string first_name
string last_name
uint8 age
uint32 score

以下的操作确保了msg文件可以被转换成C++、python或其他语言的源代码:

1.1.1 修改package.xml

确保package.xml中包含以下两句。

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

意思是编译依赖message_generation包,而运行时依赖message_runtime包。

1.1.2 修改CMakeList.txt

1.1.2.1 添加编译依赖:

在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。 你可以直接在COMPONENTS的列表里增加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)

1.1.2.2 添加运行依赖:

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

1.1.2.3 添加.msg文件

这里添加.msg文件,使得在msg文件夹中生产消息。

//修改
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

//为
add_message_files(
  FILES
  Num.msg
)

1.1.2.4 添加消息、服务生成指令

generate_messages()

1.1.3 小结

由于对cmake的使用不熟,目前对以上操作的理解是:

  • find_package用于查找catkin宏和库,如果添加了COMPENTS 列表(例如我们添加的generate_messages),catkin还会寻找其他的依赖。
  • 在add_message_files中添加我们需要编译的msg文件。通过查看CMkaeList文件,还可以看到add_service_files和add_action_files,这些都是用来添加我们自己的消息服务动作文件的。
  • generate_message()用来处理以上添加的3中文件。根据在此列出的任何依赖来生产消息、服务和动作。

1.2 使用rosmsg

可以使用rosmsg show命令来检查ROS是否能够识别我们添加的消息(只要在package下包含了smg文件夹并在其中存放了.msg文件就可以识别)。

$ rosmsg show [message type]

可以直接输入消息名,或者输入消息所在的包和消息名例如:

$ rosmsg show beginner_tutorials/Num
//或
$ rosmsg show Num

2. 使用srv

2.1 创建一个srv

类似msg的创建,需要在一个包中创建一个srv目录用于存放.srv文件。
这里我们不手动编写了,而是使用roscd工具从一个包中复制到另一个包中(roscd实现了将文件从一个package复制到另一个package中的功能):

$ roscp [package_name] [file_to_copy_path] [copy_path]

我们使用以下命令从从rospy_tutorials包中copy AddTwoInts.srv文件到当前的srv文件夹中:

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

以下的操作确保了msg文件可以被转换成C++、python或其他语言的源代码:

2.1.1 添加对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)

可以看出 message_generation对msg和srv都起作用。

2.1.2 添加.srv文件

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )
//改成
add_service_files(
  FILES
  AddTwoInts.srv
)

以上就是创建一个服务需要的步骤,请注意,因为之前已经创建了消息,所以一些相同的操作就不需要再次重复了。

2.2 使用rossrv

可以通过rossrv show命令来检查ROS是否能够识别我们添加的服务(只要在pacakge下的srv目录中存在.srv文件就可以)。

$ rossrv show <service type>

可以仅仅指定服务名,或指定package和服务名,来查看服务参数。
如果仅仅指定服务名,那么拥有相同服务的包都会被列出。

3. msg和srv都需要的步骤

由于增加了消息和服务,现在我们可以编译了package了。
在workspace中使用catkin_make编译。

$ catkin_make

现在所有msg路径下的.msg文件都将转换成ROS所支持语言的源代码。生成的C++头文件放置在~/catkin_ws/devel/include/beginner_tutorials/。其他语言有所不同。

4. 获得帮助

有时候很难记住所有的ROS工具的参数,这是可以使用-h选项来获得帮助信息。

5. REVIEWS

  • rospack = ros+pack(age) : provides information related to ROS packages
  • rosstack = ros+stack : provides information related to ROS stacks
  • roscd = ros+cd : changes directory to a ROS package or stack
  • rosls = ros+ls : lists files in a ROS package
  • roscp = ros+cp : copies files from/to a ROS package
  • rosmsg = ros+msg : provides information related to ROS message definitions
  • rossrv = ros+srv : provides information related to ROS service definitions
  • rosmake = ros+make : makes (compiles) a ROS package (现在是catkin_make)

猜你喜欢

转载自blog.csdn.net/jrc_january/article/details/76154362
ROS
今日推荐