1、第二章中的概念
一、安装
二、配置账户
不管是安装ROS还是使用一台预装了ROS的电脑,要想在你的账户中使用ROS,就必须完成下面步骤:
a、为用户账户中设置rosdep,首先在账户中初始化rosdep系统,命令如下:
rosdep update
该命令将在你的根目录下保存一些文件,文件夹名为.ros,这条命令只需执行一次。
注意:
这里需要注意,不像上文的 rosdep init,rosdep update 命令是在你的普通账户下运行,而不使用超级用户前缀sudo。
b)设置环境变量
ROS要依据一些环境变量来定位文件。 设置这些环境变量,你需要使用以下命令7执行ROS提供的脚本setup.bash:
source /opt/ros/indigo/setup.bash
然后,用下行命令确认环境变量已经设置正确:
export | grep ROS
正确配置后,显示结果如下
上面的方式只能在当前shell下运行,如果想在其他shell也能正确运行,那么要做到这一点,编辑账户根目录中的文件.bashrc,并在最下面添加前文的 source 命令。
source /opt/ros/indigo/setup.bash
除了设置环境变量外,setup.bash 命令还能定义了一些ROS系统的bash函数,包括roscd和rosls(下面将要介绍) ,这些函数在rosbash软件包8中定义。
三、例子
启动 turtlesim 在三个不同的终端中,分别执行以下三个指令:
roscore
rosrun turtlesim turtlesim_node (有些时候先执行这个命令会有点问题,要先执行下面的命令才能正常运行)
rosrun turtlesim turtle_teleop_key
四、相关概念
1、功能包/软件包
在ROS中,所有软件都被组织为软件包的形式,称为ROS软件包或功能包,有时也简称包。ROS软件包是一组用于实现特定功能的相关文件的集合,包括可执行文件和其他支持文件。如,前面使用的两个可执行文件turtlesim_node和turtle_teleop_key都属于turlesim包。
毫不夸张地说,所有的 ROS 软件都是一个软件包或其他软件包的一部分。
一些命令:
a、查看软件包列表和定位软件包,使用如下命令,可以获取所有已安装的ROS软件包列表清单:
rospack list
每个程序包由一个清单文件(文件名为package.xml)定义。该文件定义关于包的一些细节,包括其名称、版本、维护者和依赖关系。包含package.xml文件的目录被称为软件包目录(其实,这也是ROS软件包的定义:任何ROS能找到且包含package.xml文件的目录就是软件包目录。)这个目录存储所在软件包的大部分文件。
要寻找一个软件包的目录,使用rospack find命令:
rospack find package-name
查看软件包:要查看软件包目录下的文件,使用如下命令:
rosls package-name
如果想“访问”某软件包目录,可以将当前目录切换至此软件包目录,使用如下命令:
2、节点管理器(The Master)
ROS 的一个基本目标是使机器人专家设计的很多称为节点(node)的几乎相对独立的小程序能够同时运行。为此,这些节点必须能够彼此通信。ROS 中实现通信的关键部分就是 ROS 节点管理器。
要启动节点管理器,使用如下命令: roscore
节点管理器应该在使用 ROS 的全部时间内持续运行。一个合理的工作流程是在一个终端启动 roscore, 然后打开其他终端运行其他程序。当结束时, 可以通过在 roscore 终端键入 Ctrl-C停止节点管理器。
3、节点(Nodes)
一旦启动roscore后,便可以运行ROS程序了。ROS程序的运行实例被称为节点(node)。
在 turtlesim 的例子中,我们创建了两个节点。第一个节点是可执行文件turtlesim_node的实例化。 这个节点负责创建turtlesim窗口和模拟海龟的运动。 第二节点是可执行文件 turtle_teleop_key的实例化。
启动节点:
启动节点(也称为运行ROS程序)的基本命令是rosrun:
rosrun package-name executable-name
可以看到,rosrun 命令有两个参数,其中第一个参数是功能包的名称,第二个参数是该软件包中的可执行文件的名称。
查看节点列表ROS提供了一些方法来获取任意时间运行节点的信息。要获得运行节点列表,使用如下命令:
rosnode list
rosout 节点是一个特殊的节点,通过 roscore 自动启动。
查看节点:要获得特定节点的信息,使用如下命令:
rosnode info node-name
终止节点 要终止节点,使用如下命令:
rosnode kill node-name
4、话题和消息
ROS节点之间进行通信所利用的最重要的机制就是消息传递。在ROS中,消息有组织地存放在话题里。消息传递的理念是:当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题,ROS节点管理器负责确保发布节点和订阅节点能找到对方;而且消息是直接地从发布节点传递到订阅节点,中间并不经过节点管理器转交。
a) 查看节点构成的计算图
在 ROS 系统中查看节点之间的发布-订阅关系的最简单方式就是在终端输入如下命令:
rqt_graph
在该图中,椭圆形表示节点,有向边表示其两端节点间的发布-订阅关系。该计算图告诉我们, /teleop_turtle节点向话题/turtle1/cmd_vel发布消息,而/turtlesim节点订阅了这些消息(“cmd_vel”是“command velocity”的缩写。)。
从上图中并没有看到rosout节点在图中。这是因为,在默认情况下,rqt_graph 隐藏了其认为只在调试过程中使用的节点。你可以通过取消“Hide debug”选项来禁止这个特性,图 2.3 展示了这个结果。
请注意 rqt_graph 本身就是一个节点。
b)消息和消息类型
另一个例子是 geometry_msgs/Twist,书中将多次使用这种消息类型。该消息类型对应/turtle1/cmd_vel 话题,而且要稍微复杂一些:
你很有可能已经开始设想,为了自动测试你的程序,编写
一种脚本将 rostopic echo 和 rostopic pub 结合起来作为“记
录”和“回放”消息的方式。如果是这样的话,你会对 rosbag
工具感兴趣 (第 9 章) , 该工具是上述想法的更加完善的实现。
4、一个更复杂的例子
2.8.1 话题通信的多对多机制
远程操作节点 C 发布的每条消息都会传送给 A 和
B 两个仿真节点。 同样的, D 节点发布的消息也会传送给 A 和 B。
当这些消息到达仿真节点时,海龟将会相应地移动,而不管这条
消息是哪个节点发布的。此处要强调的是,基于话题和消息的通
信机制是多对多的,即多个发布者和多个订阅者可以共享同一个话题。
2.8.2 节点之间的松耦合关系
每个节点都不需要显式知道其他节点的存在与否;它们的唯
一交互方式是间接地发生在基于话题和消息的通信层。这种节点
之间的独立性,以及其支持的任务可分解特性(即复杂任务分解
成可重用的小模块) ,是 ROS 最关键的设计特性之一。
此外,ROS 为更加直接的一对一通信提供了一种称为服务
(services)的机制。
5、问题检查