您的位置:首页 > 其它

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

2017-07-27 11:24 459 查看

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐