最近使用ROS进行任务(Task)执行,深切体会用传统的方法实现是极其繁杂的。比如人脸录入工作,包含人脸检测,识别,语音提示,运动控制,这些子部分基本都是通过订阅话题的回调函数中处理,之间的切换,如人脸识别,语音提示之间的切换,需要用信号量进行控制切换,当多数据融合的时候,逻辑是极其的混乱的,也容易导致冗余代码,后期的维护也是不易于维护的。深切体会到一个好的实现框架有多么的重要。正如自己的体会,PR2开发中,发现如果不用一套完整的框架去执行任务,会导致代码的维护特别的繁杂,所以大佬们才开发这套smach状态机功能包。而状态机的思想也正符合机器人的这种多数据融合,多子任务执行的问题。状态机的优点是:实现简单,易于维护,重构任务顺序容易。最近的实现证明,smach正是为任务执行量身定做的。经检索也发现,国内介绍关于smach状态机的介绍和比较少,从这篇开始,我们将连续的介绍在ROS-Indigo版本下的smach使用。

1、安装

  学习smach之前需要安装这个软件,安装smach有两种方式:

  a、使用apt-get直接安装(推荐),只需要执行如下代码:

$ sudo apt-get install ros-indigo-executive-smach

  b、使用源码安装,只需要在相应的工作空间的src下,通过git clone拉取下来,比如在catkin_ws/src的目录下执行如下代码:

$ git clone http://wiki.ros.org/smach/Tutorials

2、smach介绍

 smach[1]是ros中的一个实现有限状态机的开发包,在ROS任务执行中使用得比较多。一提到状态机,大家可能会想起图灵而望而生畏,别紧张,其实没那么的难。smach使用了python实现,所以要使用smach只能在python环境中使用,python使用起来很简单,如果有编程基础,看几个小时就可以上手,没编程基础的看几天也可以很容易上手。

  smach提供了actionlib整合和smach viewer两大组件。smach viewer可以实时地查看任务执行当前的状态节点位置,是调试开发的必备工具。smach还整合了动作状态,例如定点导航。可以把话题topic,服务service转化为状态,也可以把一个类转化为状态节点。smach可以实现状态的并发执行,任务的重复执行,层次嵌套复杂的状态机(状态机也可以作为一个状态)。

  学习smach需要有两个基础:状态机和python知识。

  a、状态机

  状态机就是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。参考资料[3],最简单的例子就是灯的开灯和关灯的例子。用开灯状态和关灯状态描述灯的状态,状态之间的转换,通过开灯动作和关灯的动作来完成,基于smach打实现如下:

#!/usr/bin/env pythonimport roslib; roslib.load_manifest('smach_sample_node')
import rospy
import smach
import smach_ros
import time
# define state Foo       # define state Bar
class Open(smach.State):def __init__(self):smach.State.__init__(self, outcomes=['closed'])def execute(self, userdata):rospy.loginfo('Opened')time.sleep(2)rospy.loginfo('Closeing')return 'closed'    #define state close light
class Close(smach.State):def __init__(self):smach.State.__init__(self, outcomes=['opened'])def execute(self, userdata):rospy.loginfo('Closed')time.sleep(2)rospy.loginfo('Closing')return 'opened'

# main
def main():rospy.init_node('smach_example_state_machine')# Create a SMACH state machinesm_light = smach.StateMachine(outcomes=['stop', 'succee'])# Open the container
    with sm_light:# Add states to the containersmach.StateMachine.add('OPEN', Open(), transitions={'closed':'CLOSE'})smach.StateMachine.add('CLOSE', Close(), transitions={'opened':'OPEN'})# Execute SMACH plansis = smach_ros.IntrospectionServer('sm_light', sm_light, '/SM_ROOT')sis.start()# Execute SMACH planoutcome = sm_light.execute()# Wait for ctrl-c to stop the application
    rospy.spin()sis.stop()if __name__ == '__main__':main()

    输出结果:

[INFO] [WallTime: 1453689512.106141] Closed
[INFO] [WallTime: 1453689514.108995] Closing
[INFO] [WallTime: 1453689514.109447] State machine transitioning 'CLOSE':'opened'-->'OPEN'
[INFO] [WallTime: 1453689514.109942] Opened
[INFO] [WallTime: 1453689514.420038] Closeing
[INFO] [WallTime: 1453689514.420271] State machine transitioning 'OPEN':'closed'-->'CLOSE'

    相应的状态机实时状态,如下图所示:

    大家发现,基于smach实现状态机器是如此打简单,所以大胆打去弄熟它吧。

    下面贴出两张ros smach viewer生成的图,直观感受下状态机的魅力。

    简单有限状态机:

(来自:ros wiki)

    较为复杂的有限状态机:    

(来自ros wiki)

  b、python知识

   网上资源特别多,这里不展开介绍了。请参考[2]

参考资料

[1]. http://wiki.ros.org/smach/Tutorials

[2]. Python菜鸟教程

[3]. 有限状态机

转载于:https://www.cnblogs.com/cv-pr/p/5155828.html

SMACH专题(一)----安装与初探相关推荐

  1. ROS学习|SMACH状态机一(安装与初探)

    系列文章目录 ROS基础 ROS单线程与多线程 navigation基本导航 navigation基本导航 SMACH状态机一(安装与初探) 目录 系列文章目录 SMACH简介 安装 基础知识 ROS ...

  2. 学习OpenCV-(1)-安装与初探

    文章目录 学习OpenCV-(1)-安装与初探 1.概述 下载和安装 OpenCV所拥有的模块 2.初探 1.显示图片 2.显示视频 3.简单的变换 4.不那么简单的变换 5.从摄像头中读取 6.写入 ...

  3. freeswitch编译安装,初探, 以及联合sipgateway, webrtc server的使用场景。

    本文主要记录freeswitch学习过程. 一 安装freeswitch NOTE 以下两种安装方式,再安装的过程中遇到了不少问题,印象比较深刻的就是lua库找到不到这个问题.这个问题发生在make ...

  4. SugarCRM安装与初探

    本周与导师联系,进行了初次的沟通,并且得到了导师的帮助,申请了微软开放公司的开发伙伴,并自己在本地部署了SugarCRM,下面来一起回顾下. 什么是SugarCRm? SugarCRM开源版是一款完全 ...

  5. jupyter安装与初探

    安装jupyter jupyterlab和jupyter notebook的关系暂时没有搞清楚.先都安装了吧,用用再说. 选择国内镜像,避免万里长城的干扰. pip install jupyterla ...

  6. Hadoop YARN安装部署初探

    本文主要介绍了在实验环境下,能使YARN(以CDH4为例,Apache版本安装方法类似)正常工作的最简单的配置部署方法.如果想在线上集群环境下搭建YARN,可参考Cloudera的这篇文档: Depl ...

  7. apache mediawiki 安装_MediaWiki初探:安装及使用入门

    MediaWiki是著名的开源wiki引擎,全球最大的wiki项目维基百科(百科词条协作系统)是使用MediaWiki的成功范例,MediaWiki的最大作用在于对知识的归档,可用于构建企业/个人知识 ...

  8. Ubuntu 经验 —— Fcitx专题:安装Fcitx

    一.检测是否已经安装过fcitx 终端中 > fcitx 二.安装Fcitx 若提示尚未安装,则根据提示命令进行安装 > sudo apt-get install fcitx-bin 相关 ...

  9. selenium安装和初探

    操作系统:win10 python环境:anaconda3 浏览器:百分浏览器 chrome内核版本:Chrome/74.0.3729.169 内核下载地址:https://npm.taobao.or ...

最新文章

  1. 覆盖近2亿篇论文还免费!沈向洋旗下团队「读论文神器」登B站热搜
  2. 一步步写一个符合Promise/A+规范的库
  3. python 列表表达式 if_python中if else如何判断表达式成立?
  4. Spring的静态代理和动态代理
  5. CentOS系统设置自动登录
  6. 成功解决ValueError: Expected 2D array, got 1D array instead: Reshape your data either using array.reshap
  7. git gui管理服务器配置文件,从 Git Gui 管理的Repository(库) 提交更改到 Bonobo服务器管理的Repository(库)...
  8. java io字符输出流_JAVA IO 字符输入流与输出流总结说明
  9. Python数据结构学习笔记——链表:无序链表和有序链表
  10. oracle不同库之间传送文件,EXCEL与ORACLE间的数据互传法数据库 -电脑资料
  11. Python_软件安装
  12. python访问注册表_python3操作注册表
  13. 游戏3D建模入门,有哪些建模软件可以选择?
  14. Bandizip 7.16和winRAR在文件右键压缩功能上的差异
  15. 城链科技董事长肖金伟:践行数据经济系国家战略,引领数字时代新消费发展!
  16. Android学习笔记(4)——探究碎片
  17. c++ 操作Word
  18. 51单片机使用 8线/4线/PCF8574(I2C) 驱动 LCD1602
  19. 天猫用户重复购买预测——特征工程
  20. spring boot 有哪些方式可以实现热部署?

热门文章

  1. SQL Compare
  2. weather at Cambridge will be fine next week
  3. 产品经理的成长历程(宏观)
  4. 怎么理解马氏距离呢?简单的解释
  5. 康奈尔ECE MEng项目拒信+1 哈哈哈
  6. 发现一个好的索引-阳神
  7. Trie 树——搜索关键词提示 1
  8. koa-static使用时报Unexpected token function
  9. github-share报错无法读取远程仓库
  10. php上传文件后无法移动到指定目录的解决