ROS系统初体验

需要特别说明:ROS版本必须与Ubuntu系统版本匹配。

实验环境:

ROS Fuerte

Ubuntu 12.04

在进行实际使用ROS开发之前,首先对ROS中的一些基础操作内容进行学习。使用TurtleSim进行练习,其中包括如何建立功能包、使用节点、使用参数服务和移动一个虚拟的机器人。

(1)查看ROS文件系统

使用rospack和rosstack来获取有关功能包、功能包集、路径和依赖性等信息。

查找turtlesim包的路径

获得功能包或功能包集下面的文件列表

进入到某个文件夹,使用roscd命令

(2) 创建工作空间

查看ROS正在使用的工作空间

我们将要创建的文件夹是在~/dev/rosbook/中,使用如下命令

创建好文件夹后我们需要将新路径添加到ROS_PACKAGE_PATH,需要在~/.bashrc文件的末尾添加新的一行:

这样我们就在ROS系统中创建和配置完成自己的新文件夹。

(3)创建ROS功能包

可以使用手动创建功能包,为了避免繁琐工作,推荐使用roscreate-pck命令行工具。

在rosbook文件夹下创建新的功能包

$ roscreate-pkg davebobo_tutorials std_msgs rospy roscpp

此功能包的格式包括功能包名称和依赖项;其中依赖项包括std_msgs rospy roscpp,如下命令行所示

值得说明的是:

std_msgs 包含了常见消息类型,表示基本数据类型和其他基本的消息构造,如多维数组

rospy 一个ROS的纯Python客户端库。

roscpp 使用C++实现的ROS的各种功能。程序员能够用这些接口快速完成与ROS的主题、服务和参数相关的开发工作。

正确执行以上命令后的效果:

我们可以使用rospack、roscd、rosls命令来获取新的功能包信息。

(4)编译ROS功能包

如果创建了一个功能包并且编写了一下代码,就需要编译功能包了。编译功能包时主要是代码的编译过程,为了编译功能包,可以使用命令rosmak

几秒之后编译成功。

(5)使用ROS节点

节点都是可执行程序,位于packagename/bin目录中,我们使用turtlesim的功能包进行练习。

在开始之前,必须使用如下命令启动roscore

使用rosrun命令启动一个新的节点。

我们可以看见出现一个新窗口,窗口中间出现一个小海龟。

这时再去查看节点列表就会看到出现一个新的节点。叫做/turtlesim。使用rosnode info Nodename查看节点的信息。

以上信息中,包括发布者(及相应主题)、订阅者(及相应主题)和该节点具有的服务(srv)及它们各自唯一的名称。

(6)使用主题与节点交互

首先需要打开一个终端在里面运行roscore:

再打开一个终端,在里面运行一个turtlesim_node节点:

打开另一个终端,在里面输入:

在运行完这条命令后,在这个终端下,按键盘上的方向键可以看到,之前我们运行的乌龟开始移动,:-),很有意思吧。

urtlesim_node和turtle_teleop_key通过ROS的主题来相互通信。turtle_teleop_key把用户按下的键发布到主题上,turtlesim_node也订阅了同一个主题用来接收用户按下的键,并做出相应的动作。我们有这个例子可以体会到主题的作用,更加深刻的认识到了节点的概念。

可以使用以下命令查看/teleop_turtle和/turtlesim节点的信息。

使用rostopic pub [topic] [msg_type] [args]命令直接发布主题。

可以看到小海龟在做曲线运动。

(7)使用服务

同上,先运行roscore并启动turtlesim节点。使用以下命令列出在turtlesim节点运行时系统提供的服务。

使用/spawn服务在不同的方向和不同的位置创建另一只小海龟。

(8)使用参数服务器

参数服务器用于存储所有节点均可以访问的共享数据。ROS中用于管理参数服务器的工具称为rosparam,查看被所有节点所使用的服务器参数:

可以使用get参数读取某个值,也可以使用set参数设定一个新的值。rosparam的另外一个特性是参数转存。通过该参数可以保存或加载参数服务器的内容。

使用rosparam dump [file_name]来保存参数服务器。

使用rosparam load [file_name] [namesapce]像参数服务器加载一个新的数据文件。

(9)创建节点和编译节点

本节使用一个实例进行学习,一个发布一些数据,另一个接收这些数据,两个节点之间使用最基本的工作进行通信。进入如下文件位置:

创建两个文件并分别命名为exaple1_a.cpp和example_b.cpp,

exaple1_a.cpp文件将会发送带有节点名称的数据, exaple1_b.cpp文件会把这些数据显示在shell窗口中。

exaple1_a.cpp中的代码如下:

exaple1_b.cpp中的代码如下:

编写好程序后,当使用davebobo_tutorials功能包时,需要自行编辑CMakeLists.txt文件。使用自己喜欢的编辑器或直接使用rosed工具将会在VIM编辑器下打开这个文件,并将以下命令行复制到文件的末尾处:

启动ROS,然后在不同的shell窗口下分别运行以下命令

可以发现在example1_b运行的shell窗口可以打印出INFO消息。

(10)创建并使用msg和srv文件

服务

首先,在davebobo_tutorials功能包下创建msg文件夹,并在其中创建一个新的文件davebobo_msg1.msg。在文件中增加以下行:

接着编辑CMakeList.txt从rosbuild_genmsg()这一行中删除#,然后使用rosmake命令编译功能包。

为检查编译是否正确,使用rosmsg命令,如果可以看到与davebobo_msg1.msg文件中相同的内容说明编译正确。

现在创建一个srv文件,同样在dvaebobo_tutorials文件夹下创建一个名为srv的文件,并新建davebobo_srv1.srv.在文件中增加以下行

编辑CMakeList.txt从rosbuild_gensrv()这一行中删除#,重新编译功能包并使用rossrv工具来检查。

上面我们在ROS中创建一个服务,接着我们需要两个节点,一个服务器和一个客户端。在davebobo_tutorials功能包中新建两个节点分别命名为example2_a.cpp和example2_b.cpp.

example2_a.cpp中的代码:

example2_b.cpp中的代码:

为了编译节点,在CMakeList.txt文件中增加以下行:

执行编译命令:

分别在不同命令窗口启动节点:

example2_a窗口如下显示

example2_b窗口如下显示

消息

现在将使用自定义的msg文件来创建节点。创建example3_a.cpp和example3_b.cpp文件,同时调用davebobo_msg1.msg

example3_a.cpp中代码

example3_b.cpp中代码

现在运行这两个节点会显示如下:

References:

[1]. Aaron Martinez Enrique Fern andez, ROS机器人程序设计[B], P14-42, 2014.

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180119G0DDNR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券