3.6 脚本的问题
以上描述的标准脚本存在的主要问题是,我们不得不必须将电池检查深埋在导航程序。同时这个工作的定义用于示例联系,当我们给机器人行为添加更多的任务时,将变得不那么有效。例如,虚拟设我们想要机器人导航到下一个位置之前,在每一个坐标点通过左右平移相机扫描一个人时。我们的巡逻程序可能会是这样:
def patrol():
for location in waypoints:
nav_to_waypoint(location)
scan_for_humans()
同时相机会向后旋转,我们仍需要密切关注电池等级,但现在我们不会运行move_base目标。这意味着我们需要添加第二个电池检查,这个时候头部平移。如果电池低于我们设定的阈值,我们不需要取消导航目标;相反,在移动到充电站之前,我们需要重新定位相机。
对于每一个额外的任务,我们需要添加另一个电池检查,这将会造成我们的代码冗余,使我们的总体任务执行更模块化。从概念上讲,电池检查应该在我们的任务层次结构的顶部,我们真的应该在每一个传递任务列表过程中进行电池检查。
脚本方法的另一个缺点是,我们是直接调用ROS行为、话题和服务,而不是通过可重用的包装器来隐藏常见细节。例如,除了话题订阅电池水平,很有可能我们还将订阅其他话题所产生的额外的传感器,如深度相机、碰撞传感器或激光扫描仪。所有这些用户共享一个类似的话题名称、话题类型和回调函数的设置模式。任务架构像SMACH定义ROS话题、服务和行为的封装照顾到了设置细节从而允许从一个给定的任务执行添加或删除这些对象,而无需重复无数行代码。
3.7 SMACH或行为树?
SMACH是一个Python库用于编译复杂的机器人行为,使用的是层次状态机。smach_ros包提供了紧密集成的ROS话题、服务和行为,并且有一组SMACH教程涵盖了所有的功能。选择这个的原因是,对于大多数ROS初学者,SMACH是一个好的方式。然而,如果你还没有熟悉有限状态机,这个方法或许会有一些疑惑。如果你卡住了,这里还有其他可选项适合你。
一个相对较新的方法称为行为树,首先流行在程序员的电脑游戏。最近,行为树也在机器人中使用。我们将使用一个pi_trees包,该包作者专门为本书写的,当然你也可以使用任何你认为合适的方式。行为树组织机器人任务树结构,使它们相对容易概念化和程序化。此外,许多我们需要的任务执行的属性如优先级(包容)、暂停和恢复(抢占(preempted))、分层结构(子任务)和条件检查是行为树的自然属性,一旦我们建立基础设施,那么我们很容易得到“免费”。
我们也应该提到的第三种方法称为teer。Teer也是一个独立的Python库用于协调任务,但它使用协同程序而不是状态机。协同程序就像一个子程序,但它运行时可以访问其内部状态。(在Python中,这是通过使用yield关键字。)因此,协同程序可以用来表示同时运行的任务也可以暂停和重新开始。Teer没有内置ROS话题、服务和动作的封装包,像SMACH或pi_trees需要更多工作起来和在ROS环境中运行;因此;我们不会在本卷讲述。
3.8 SMACH:任务作为状态机
在开始使用SMACH之前,确保你已经安装了必要的ROS包:
$ sudo apt-get install ros-indigo-smach ros-indigo-smach-ros \ rosindigo-executive-smach ros-indigo-smach-viewer
在一些我们的例程中,我们也需要一个称为python-easygui的简单GUI包,让我们现在安装它:
$ sudo apt-get install python-easygui
SMACH使我们能够使用有限状态机编写行为序列。顾名思义,一个状态机可以在给定的时间切换成任何states。机器还接受输入(inputs),根据输入的值和当前状态,机器可以转换(tramsition)到另一个状态。作为一个转型的结果,状态机也可能产生的结果(outcome)。有限状态机也称为自动机(automata)或反应系统(reactive systems),因为我们只需要知道机器的当前状态和输入来预测下一个行为。
最简单的一个状态机的实际例子是一把锁和钥匙。锁可以在有两种状态:锁定(LOCKED)或解锁(UNLOCKED),同时钥匙顺时针或逆时针方向输入。(按照惯例,状态名称全部用大写字母写。)可能的状态转换是锁定(LOCKED),解锁(UNLOCKED)和根据钥匙的旋转方向转变状态从解锁(UNLOCKED)到锁定(LOCKED)。(出于完整性的考虑,我们也可以指定锁定(LOCKED)到锁定(LOCKED),解锁(UNLOCKED)到解锁(UNLOCKED)间的转换)。结果是,门可以打开,或者不开。
SMACH包提供了一个独立的Python库用于创建状态机和ROS封装用于集成ROS话题、服务和行为库。SMACHWiki页面包含许多