Python-learning-SMACH-1-GettingStarted

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>

<meta name="google-site-verification" content="CjkdY6BqKWAVmQ78_iSq6J7ZZ9AoL7-CjFVBYGg9FU4" />
<link rel="shortcut icon" href="/custom/favicon.ico" type="image/ico" />
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" />
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script type="text/javascript" src="/custom/js/sorttable.js"></script>
<script type="text/javascript" src="/custom/libraries/jquery.min.js"></script>                         
<script type="text/javascript" src="/custom/js/seesaw.js"></script> 
<script type="text/javascript" src="/custom/js/rosversion.js"></script> 
<!--script type="text/javascript" src="/custom/libraries/RGraph.common.core.js" ></script Used for metrics only, should be conditional, not at the top-->
<!--script type="text/javascript" src="/custom/libraries/RGraph.bar.js" ></script same as above -->

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-17821189-2']);
  _gaq.push(['_setDomainName', 'wiki.ros.org']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"><script type="text/javascript">window.NREUM||(NREUM={}),__nr_require=function(e,n,t){function r(t){if(!n[t]){var o=n[t]={exports:{}};e[t][0].call(o.exports,function(n){var o=e[t][1][n];return r(o||n)},o,o.exports)}return n[t].exports}if("function"==typeof __nr_require)return __nr_require;for(var o=0;o<t.length;o++)r(t[o]);return r}({1:[function(e,n,t){function r(){}function o(e,n,t){return function(){return i(e,[c.now()].concat(u(arguments)),n?null:this,t),n?void 0:this}}var i=e("handle"),a=e(2),u=e(3),f=e("ee").get("tracer"),c=e("loader"),s=NREUM;"undefined"==typeof window.newrelic&&(newrelic=s);var p=["setPageViewName","setCustomAttribute","setErrorHandler","finished","addToTrace","inlineHit","addRelease"],d="api-",l=d+"ixn-";a(p,function(e,n){s[n]=o(d+n,!0,"api")}),s.addPageAction=o(d+"addPageAction",!0),s.setCurrentRouteName=o(d+"routeName",!0),n.exports=newrelic,s.interaction=function(){return(new r).get()};var m=r.prototype={createTracer:function(e,n){var t={},r=this,o="function"==typeof n;return i(l+"tracer",[c.now(),e,t],r),function(){if(f.emit((o?"":"no-")+"fn-start",[c.now(),r,o],t),o)try{return n.apply(this,arguments)}finally{f.emit("fn-end",[c.now()],t)}}}};a("setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","),function(e,n){m[n]=o(l+n)}),newrelic.noticeError=function(e){"string"==typeof e&&(e=new Error(e)),i("err",[e,c.now()])}},{}],2:[function(e,n,t){function r(e,n){var t=[],r="",i=0;for(r in e)o.call(e,r)&&(t[i]=n(r,e[r]),i+=1);return t}var o=Object.prototype.hasOwnProperty;n.exports=r},{}],3:[function(e,n,t){function r(e,n,t){n||(n=0),"undefined"==typeof t&&(t=e?e.length:0);for(var r=-1,o=t-n||0,i=Array(o<0?0:o);++r<o;)i[r]=e[n+r];return i}n.exports=r},{}],4:[function(e,n,t){n.exports={exists:"undefined"!=typeof window.performance&&window.performance.timing&&"undefined"!=typeof window.performance.timing.navigationStart}},{}],ee:[function(e,n,t){function r(){}function o(e){function n(e){return e&&e instanceof r?e:e?f(e,u,i):i()}function t(t,r,o,i){if(!d.aborted||i){e&&e(t,r,o);for(var a=n(o),u=m(t),f=u.length,c=0;c<f;c++)u[c].apply(a,r);var p=s[y[t]];return p&&p.push([b,t,r,a]),a}}function l(e,n){v[e]=m(e).concat(n)}function m(e){return v[e]||[]}function w(e){return p[e]=p[e]||o(t)}function g(e,n){c(e,function(e,t){n=n||"feature",y[t]=n,n in s||(s[n]=[])})}var v={},y={},b={on:l,emit:t,get:w,listeners:m,context:n,buffer:g,abort:a,aborted:!1};return b}function i(){return new r}function a(){(s.api||s.feature)&&(d.aborted=!0,s=d.backlog={})}var u="nr@context",f=e("gos"),c=e(2),s={},p={},d=n.exports=o();d.backlog=s},{}],gos:[function(e,n,t){function r(e,n,t){if(o.call(e,n))return e[n];var r=t();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,n,{value:r,writable:!0,enumerable:!1}),r}catch(i){}return e[n]=r,r}var o=Object.prototype.hasOwnProperty;n.exports=r},{}],handle:[function(e,n,t){function r(e,n,t,r){o.buffer([e],r),o.emit(e,n,t)}var o=e("ee").get("handle");n.exports=r,r.ee=o},{}],id:[function(e,n,t){function r(e){var n=typeof e;return!e||"object"!==n&&"function"!==n?-1:e===window?0:a(e,i,function(){return o++})}var o=1,i="nr@id",a=e("gos");n.exports=r},{}],loader:[function(e,n,t){function r(){if(!x++){var e=h.info=NREUM.info,n=d.getElementsByTagName("script")[0];if(setTimeout(s.abort,3e4),!(e&&e.licenseKey&&e.applicationID&&n))return s.abort();c(y,function(n,t){e[n]||(e[n]=t)}),f("mark",["onload",a()+h.offset],null,"api");var t=d.createElement("script");t.src="https://"+e.agent,n.parentNode.insertBefore(t,n)}}function o(){"complete"===d.readyState&&i()}function i(){f("mark",["domContent",a()+h.offset],null,"api")}function a(){return E.exists&&performance.now?Math.round(performance.now()):(u=Math.max((new Date).getTime(),u))-h.offset}var u=(new Date).getTime(),f=e("handle"),c=e(2),s=e("ee"),p=window,d=p.document,l="addEventListener",m="attachEvent",w=p.XMLHttpRequest,g=w&&w.prototype;NREUM.o={ST:setTimeout,CT:clearTimeout,XHR:w,REQ:p.Request,EV:p.Event,PR:p.Promise,MO:p.MutationObserver};var v=""+location,y={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net",agent:"js-agent.newrelic.com/nr-1026.min.js"},b=w&&g&&g[l]&&!/CriOS/.test(navigator.userAgent),h=n.exports={offset:u,now:a,origin:v,features:{},xhrWrappable:b};e(1),d[l]?(d[l]("DOMContentLoaded",i,!1),p[l]("load",r,!1)):(d[m]("onreadystatechange",o),p[m]("onload",r)),f("mark",["firstbyte",u],null,"api");var x=0,E=e(4)},{}]},{},["loader"]);</script><script type="text/javascript">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","queueTime":0,"licenseKey":"4c8610d177","agent":"","transactionName":"NFZaMEVUV0ZVBkBeCQ0cbRZeGkpYVQZcGEw=","applicationID":"3371695","errorBeacon":"bam.nr-data.net","applicationTime":500}</script>
<meta name="robots" content="index,nofollow">

<title>smach/Tutorials/Getting Started - ROS Wiki</title>
<script type="text/javascript" src="/moin_static197/common/js/common.js"></script>

<script type="text/javascript">
<!--
var search_hint = "Search";
//-->
</script>


<link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/moin_static197/rostheme/css/common.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="screen" href="/moin_static197/rostheme/css/screen.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="print" href="/moin_static197/rostheme/css/print.css">
<link rel="stylesheet" type="text/css" charset="utf-8" media="projection" href="/moin_static197/rostheme/css/projection.css">

<!-- css only for MS IE6/IE7 browsers -->
<!--[if lt IE 8]>
   <link rel="stylesheet" type="text/css" charset="utf-8" media="all" href="/moin_static197/rostheme/css/msie.css">
<![endif]-->




<link rel="canonical" href="http://wiki.ros.org/smach/Tutorials/Getting%20Started" />

<link rel="Start" href="/Documentation">
<link rel="Alternate" title="Wiki Markup" href="/smach/Tutorials/Getting%20Started?action=raw">
<link rel="Alternate" media="print" title="Print View" href="/smach/Tutorials/Getting%20Started?action=print">
<link rel="Up" href="/smach/Tutorials">
<link rel="Appendix" title="containers.png" href="/smach/Tutorials/Getting%20Started?action=AttachFile&do=view&target=containers.png">
<link rel="Appendix" title="simple.png" href="/smach/Tutorials/Getting%20Started?action=AttachFile&do=view&target=simple.png">
<link rel="Search" href="/FindPage">
<link rel="Index" href="/TitleIndex">
<link rel="Glossary" href="/WordIndex">
<link rel="Help" href="/HelpOnFormatting">
</head>

<body  lang="en" dir="ltr">

<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-5950817-2");
pageTracker._trackPageview();
} catch(err) {}</script>

<script type="text/javascript">
<!--// Initialize search form
var f = document.getElementById('searchform');
if(f) f.getElementsByTagName('label')[0].style.display = 'none';
var e = document.getElementById('searchinput');
if(e) {
  searchChange(e);
  searchBlur(e);
}

function handleSubmit() {
  var f = document.getElementById('searchform');
  var t = document.getElementById('searchinput');
  var r = document.getElementById('real_searchinput');
  
  //alert("handleSubmit "+ t.value);
  if(t.value.match(/review/)) {
    r.value = t.value;
  } else {
    //r.value = t.value + " -PackageReviewCategory -StackReviewCategory -M3Review -DocReview -ApiReview -HelpOn -BadContent -LocalSpellingWords";
    r.value = t.value + " -PackageReviewCategory -StackReviewCategory -DocReview -ApiReview";
  }
  //return validate(f);
}
//-->
</script>

<div id="dpage">
  <div id="dpage-inner">
    <div id="header"><div id="topnav">

<!-- Alert box -->
<!-- To enable the alert box uncomment the block below. Change the alert_box_name to a new name. Then update the content below the button. -->
<!-- Disabling alert box
    <div class="alert alert-info alert-dismissable" style="text-align: center;">
<script>
jQuery(function( $ ){
    alert_box_name = 'roswiki_roscon2016_early_registration_last_day'
    state = localStorage.getItem(alert_box_name);
    if (!state) {
      localStorage.setItem(alert_box_name, 'open');
    }
    state = localStorage.getItem(alert_box_name);
    if (state == 'closed') {
        $( '#topnav .alert' ).hide();
    }
    $( '.close' ).click(function () {
	console.log('in .close.click');
        localStorage.setItem(alert_box_name, 'closed');
        $( '#topnav .alert' ).hide();
  });
});
</script>
      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
      Early registration for <a href="http://roscon.ros.org/2016">ROSCon 2016</a> ends today, August 26th! <br><a href="https://events.osrfoundation.org/roscon-2016-registration/">Register now</a> to get the early registration discount. And <a href="http://conradhotels.hilton.com/en/ch/groups/personalized/S/SELCICI-GROSA-20161003/index.jhtml?WT.mc_id=POG">book you discounted hotel rooms</a> at our <a href="http://roscon.ros.org/2016/#location">discounted rates</a>.
    </div>
 End disabling alert box -->
<!-- End Alert box -->

      <table id="topnav-table">
        <tr>
          <td width="300" valign="top"><a href="/"><img border="0" src="/custom/images/ros_org.png" alt="ros.org" width="238" height="51"/></a></td>
          <td width="500" valign="middle">
            <a href="http://www.ros.org/about-ros">About</a>
            |
            <a href="/Support">Support</a>
            |
            <a href="http://discourse.ros.org/">Discussion Forum</a>
            |
            <a href="http://status.ros.org/">Service Status</a>
            |
            <a href="http://answers.ros.org/">Q&A answers.ros.org</a>

<!--<a href="http://roscon.ros.org/2016/"><img align="middle" style="padding-left: 15px;" src="http://ros.org/images/roscon_wiki_header.jpg" width="133" height="65" alt="ROSCon 2016" /></a>
-->

<!-- <a href="https://events.osrfoundation.org/ros-kong-2014/"><img align="middle" style="padding-left: 15px;" src="http://ros.org/images/ros_kong_2014_badge.png" width="133" height="38" alt="roskong" /></a>
-->
<!--a href="https://events.osrfoundation.org/ros-kong-2014/"><img align="middle" style="padding-left: 15px;" src="http://imgur.com/eMzUJVe.png" width="133" height="38" alt="roskong" /></a-->
          </td>

          <td valign="middle" align="right">

<script language="Javascript">

function Searchy(theButton){

theForm = theButton.form;
newID = theForm.input.value;
theForm.q.value = newID;
theForm.input.value=theForm.input.value

}
</script>


<form action="http://www.ros.org/search/index.html" id="cse">
  <div>
    <label>Search:</label>
    <input type="hidden" name="cx" value="018259903093183594226:txvzw9fat6w" />
    <input type="hidden" name="cof" value="FORID:11;NB:1" />
    <input type="hidden" name="filter" value="0" />
    <input type="hidden" name="num" value="10" />

    <input type="hidden" name="ie" value="UTF-8" />
    <input type="text" name="input" id="input" autocomplete="on" style="width: 35%"/>
    <input type="hidden" name="q" value="" />
    <input type="submit" name="sa" value="Submit" onClick="Searchy(this)"/>

  </div>
</form>

         </td>
      </tr>
      <tr>
        <td colspan="3" height="53" width="1024"><nobr><img src="/custom/images/menu_left.png" width="17" height="53" alt=""/><a href="/"><img
        border="0" src="/custom/images/menu_documentation.png" width="237" height="53" alt="Documentation" /></a><img
        src="/custom/images/menu_spacer.png" width="69" height="53" /><a href="http://www.ros.org/browse/"><img border="0"
        src="/custom/images/menu_browse_software.png" width="268" height="53" alt="Browse Software" /></a><img
        src="/custom/images/menu_spacer.png" width="69" height="53" /><a href="http://www.ros.org/news"><img border="0"
        src="/custom/images/menu_news.png" width="84" height="53" alt="News" /></a><img
        src="/custom/images/menu_spacer.png" width="69" height="53" /><a href="/ROS/Installation"><img border="0"
        src="/custom/images/menu_download.png" width="151" height="53" alt="Download" /></a><img
        src="/custom/images/menu_right.png" width="60" height="53" /></nobr></td>

      </tr>
    </table> <!-- topnav-table -->

    </div> <!-- /#topav -->
  </div> <!-- /#header -->


<div id="header2">

<ul id="pagelocation">
<li><a href="/smach">smach</a></li><li><a href="/smach/Tutorials">Tutorials</a></li><li><a class="backlink" href="/action/fullsearch/smach/Tutorials/Getting%20Started?action=fullsearch&context=180&value=linkto%3A%22smach%2FTutorials%2FGetting+Started%22" rel="nofollow" title="Click to do a full-text search for this title">Getting Started</a></li>
</ul>

<div id="locationline">
</div>
</div>

<div id="sidebar">
<div class="sidepanel">
<h1>Wiki</h1>

<ul id="navibar">
<li class="wikilink"><a href="/Distributions">Distributions</a></li><li class="wikilink"><a href="/ROS/Installation">ROS/Installation</a></li><li class="wikilink"><a href="/ROS/Tutorials">ROS/Tutorials</a></li><li class="wikilink"><a href="/RecentChanges">RecentChanges</a></li><li class="current"><a href="/smach/Tutorials/Getting%20Started">Getting Started</a></li>
</ul>

</div>
<div class="sidepanel">
<h1>Page</h1>
<ul class="editbar"><li><span class="disabled">Immutable Page</span></li><li class="toggleCommentsButton" style="display:none;"><a href="#" class="nbcomment" onClick="toggleComments();return false;">Comments</a></li><li><a class="nbinfo" href="/action/info/smach/Tutorials/Getting%20Started?action=info" rel="nofollow">Info</a></li><li><a class="nbattachments" href="/action/AttachFile/smach/Tutorials/Getting%20Started?action=AttachFile" rel="nofollow">Attachments</a></li><li>
<form class="actionsmenu" method="GET" action="/smach/Tutorials/Getting%20Started">
<div>
    <label>More Actions:</label>
    <select name="action"
        οnchange="if ((this.selectedIndex != 0) &&
                      (this.options[this.selectedIndex].disabled == false)) {
                this.form.submit();
            }
            this.selectedIndex = 0;">
        <option value="raw">Raw Text</option>
<option value="print">Print View</option>
<option value="RenderAsDocbook">Render as Docbook</option>
<option value="show" disabled class="disabled">Delete Cache</option>
<option value="show" disabled class="disabled">------------------------</option>
<option value="SpellCheck">Check Spelling</option>
<option value="LikePages">Like Pages</option>
<option value="LocalSiteMap">Local Site Map</option>
<option value="show" disabled class="disabled">------------------------</option>
<option value="RenamePage" disabled class="disabled">Rename Page</option>
<option value="CopyPage">Copy Page</option>
<option value="DeletePage" disabled class="disabled">Delete Page</option>
<option value="show" disabled class="disabled">------------------------</option>
<option value="MyPages">My Pages</option>
<option value="show" disabled class="disabled">Subscribe User</option>
<option value="show" disabled class="disabled">------------------------</option>
<option value="show" disabled class="disabled">Remove Spam</option>
<option value="show" disabled class="disabled">Revert to this revision</option>
<option value="PackagePages">Package Pages</option>
<option value="SyncPages">Sync Pages</option>
<option value="show" disabled class="disabled">------------------------</option>
<option value="CreatePdfDocument">CreatePdfDocument</option>
<option value="Load">Load</option>
<option value="RawFile">RawFile</option>
<option value="Save">Save</option>
<option value="SlideShow">SlideShow</option>
    </select>
    <input type="submit" value="Do">
    
</div>
<script type="text/javascript">
<!--// Init menu
actionsMenuInit('More Actions:');
//-->
</script>
</form>
</li></ul>

</div>
<div class="sidepanel">
<h1>User</h1>
<ul id="username"><li><a href="/action/login/smach/Tutorials/Getting%20Started?action=login" id="login" rel="nofollow">Login</a></li></ul>
</div>
</div>

<div id="page" lang="en" dir="ltr">

<div dir="ltr" id="content" lang="en"><span class="anchor" id="top"></span>
<span class="anchor" id="line-1"></span><p class="line874">s## For instruction on writing tutorials <span class="anchor" id="line-2"></span><span class="anchor" id="line-3"></span><p class="line867"><span class="anchor" id="line-4"></span><p class="line867"><span class="anchor" id="line-5"></span><p class="line867"><span class="anchor" id="line-6"></span><p class="line867"><span class="anchor" id="line-7"></span><p class="line867"><span class="anchor" id="line-8"></span><p class="line867"><span class="anchor" id="line-9"></span><p class="line867"><span class="anchor" id="line-10"></span><p class="line867"><span class="anchor" id="line-11"></span><p class="line867"><span class="anchor" id="line-12"></span><p class="line867"><span class="anchor" id="line-13"></span><p class="line867"><span class="anchor" id="line-14"></span><p class="line867"><span class="anchor" id="line-15"></span><p class="line867"><span class="anchor" id="line-16"></span><p class="line867"><span class="anchor" id="line-17"></span><p class="line867"><span class="anchor" id="line-18"></span><p class="line867"><span class="anchor" id="line-19"></span><p class="line867"><span class="anchor" id="line-20"></span><p class="line867"><span class="anchor" id="line-21"></span><p class="line867"><span class="anchor" id="line-22"></span><p class="line867"><span class="anchor" id="line-23"></span><p class="line867"><span class="anchor" id="line-1-1"></span><span class="anchor" id="line-2-1"></span><span class="anchor" id="line-3-1"></span><span class="anchor" id="line-4-1"></span><span class="anchor" id="line-5-1"></span><div><table><tbody><tr>  <td style="background-color: #bbceee"> <img alt="(!)" height="15" src="/moin_static197/rostheme/img/idea.png" title="(!)" width="15" /> Please ask about problems and questions regarding this tutorial on <a class="http" href="http://answers.ros.org">answers.ros.org</a>. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.</td>
</tr>
</tbody></table></div><span class="anchor" id="line-6-1"></span><span class="anchor" id="line-7-1"></span><span class="anchor" id="line-8-1"></span>
<h1 id="Getting_Started_with_smach">Getting Started with smach</h1>
<span class="anchor" id="line-9-1"></span><strong>Description:</strong> This tutorial guides you through the very first steps of using smach.<br>
<br>
 <span class="anchor" id="line-10-1"></span><span class="anchor" id="line-11-1"></span><span class="anchor" id="line-12-1"></span><span class="anchor" id="line-13-1"></span><strong>Tutorial Level:</strong> BEGINNER<br>
 <br>
 <span class="anchor" id="line-14-1"></span><span class="anchor" id="line-15-1"></span><strong>Next Tutorial:</strong>   <a href="/smach/Tutorials/User%20Data">Passing User Data between States</a> <br>
 <br>
  <span class="anchor" id="line-16-1"></span><p class="line874"> <span class="anchor" id="line-24"></span><span class="anchor" id="line-25"></span><p class="line867"><div class="table-of-contents"><p class="table-of-contents-heading">Contents<ol><li>
<a href="#Why_learn_Smach.3F">Why learn Smach?</a></li><li>
<a href="#Creating_a_State_Machine">Creating a State Machine</a><ol><li>
<a href="#Creating_a_state">Creating a state</a></li><li>
<a href="#Adding_states_to_a_state_machine">Adding states to a state machine</a></li><li>
<a href="#Example">Example</a></li></ol></li><li>
<a href="#Pre-defined_States_and_Containers">Pre-defined States and Containers</a><ol><li>
<a href="#State_library">State library</a></li><li>
<a href="#Container_library">Container library</a></li></ol></li></ol></li></ol></div><p class="line874"> <span class="anchor" id="line-26"></span><span class="anchor" id="line-27"></span><p class="line867">
<h2 id="Why_learn_Smach.3F">Why learn Smach?</h2>
<span class="anchor" id="line-28"></span><p class="line862">Smach, which stands for "State Machine", is a powerful and scalable Python-based library for hierarchical state machines. The Smach library does not depend on ROS, and can be used in any Python project. The <a href="/executive_smach">executive_smach</a> stack however provides very nice integration with ROS, including smooth <a href="/actionlib">actionlib</a> integration and a powerful <a href="/smach_viewer">Smach viewer</a> to visualize and introspect state machines. <span class="anchor" id="line-29"></span><span class="anchor" id="line-30"></span><p class="line862">It is very easy to write a simple Smach state machine, while at the same time Smach allows you to design, maintain and debug large, complex hierarchical state machines. The image below shows an example state machine used to coordinate <a href="/actionlib">actionlib</a> actions that allow the PR2 robot to <a href="/pr2_plugs">charge itself at a standard outlet</a>. <span class="anchor" id="line-31"></span><span class="anchor" id="line-32"></span><p class="line867"><img alt="pr2_plugs_executive/smach.png" class="attachment" src="/pr2_plugs_executive?action=AttachFile&do=get&target=smach.png" title="pr2_plugs_executive/smach.png" width="750" /> <span class="anchor" id="line-33"></span><span class="anchor" id="line-34"></span><p class="line867">
<h2 id="Creating_a_State_Machine">Creating a State Machine</h2>
<span class="anchor" id="line-35"></span><p class="line874">To create a Smach state machine, you first create a number of states, and then add those states to a State Machine container. <span class="anchor" id="line-36"></span><span class="anchor" id="line-37"></span><p class="line867">
<h3 id="Creating_a_state">Creating a state</h3>
<span class="anchor" id="line-38"></span><p class="line862">To create a state, you simply inherit from the <tt class="backtick">State</tt> base class, and implement the <tt class="backtick">State.execute(userdata)</tt> method: <span class="anchor" id="line-39"></span><span class="anchor" id="line-40"></span><p class="line867"><span class="anchor" id="line-41"></span><span class="anchor" id="line-42"></span><span class="anchor" id="line-43"></span><span class="anchor" id="line-44"></span><span class="anchor" id="line-45"></span><span class="anchor" id="line-46"></span><span class="anchor" id="line-47"></span><span class="anchor" id="line-48"></span><span class="anchor" id="line-49"></span><span class="anchor" id="line-50"></span><span class="anchor" id="line-51"></span><span class="anchor" id="line-1-2"></span><div class="highlight python"><div class="codearea" dir="ltr" lang="en">
<script type="text/javascript">
function isnumbered(obj) {
  return obj.childNodes.length && obj.firstChild.childNodes.length && obj.firstChild.firstChild.className == 'LineNumber';
}
function nformat(num,chrs,add) {
  var nlen = Math.max(0,chrs-(''+num).length), res = '';
  while (nlen>0) { res += ' '; nlen-- }
  return res+num+add;
}
function addnumber(did, nstart, nstep) {
  var c = document.getElementById(did), l = c.firstChild, n = 1;
  if (!isnumbered(c)) {
    if (typeof nstart == 'undefined') nstart = 1;
    if (typeof nstep  == 'undefined') nstep = 1;
    var n = nstart;
    while (l != null) {
      if (l.tagName == 'SPAN') {
        var s = document.createElement('SPAN');
        var a = document.createElement('A');
        s.className = 'LineNumber';
        a.appendChild(document.createTextNode(nformat(n,4,'')));
        a.href = '#' + did + '_' + n;
        s.appendChild(a);
        s.appendChild(document.createTextNode(' '));
        n += nstep;
        if (l.childNodes.length) {
          l.insertBefore(s, l.firstChild);
        }
        else {
          l.appendChild(s);
        }
      }
      l = l.nextSibling;
    }
  }
  return false;
}
function remnumber(did) {
  var c = document.getElementById(did), l = c.firstChild;
  if (isnumbered(c)) {
    while (l != null) {
      if (l.tagName == 'SPAN' && l.firstChild.className == 'LineNumber') l.removeChild(l.firstChild);
      l = l.nextSibling;
    }
  }
  return false;
}
function togglenumber(did, nstart, nstep) {
  var c = document.getElementById(did);
  if (isnumbered(c)) {
    remnumber(did);
  } else {
    addnumber(did,nstart,nstep);
  }
  return false;
}
</script>

<script type="text/javascript">
document.write('<a href="#" οnclick="return togglenumber(\'CA-9d7418365444599849ea25a7f1d07887f116c71b\', 1, 1);" \
                class="codenumbers">Toggle line numbers<\/a>');
</script>
<pre dir="ltr" id="CA-9d7418365444599849ea25a7f1d07887f116c71b" lang="en"><span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_1">   1</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_1"></span><span class="anchor" id="line-1-3"></span>  <span class="ResWord">class</span> <span class="ID">Foo</span>(<span class="ID">smach</span>.<span class="ID">State</span>):</span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_2">   2</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_2"></span><span class="anchor" id="line-2-2"></span>     <span class="ResWord">def</span> <span class="ID">__init__</span>(<span class="ResWord">self</span>, <span class="ID">outcomes</span>=[<span class="String">'</span><span class="String">outcome1</span><span class="String">'</span>, <span class="String">'</span><span class="String">outcome2</span><span class="String">'</span>]):</span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_3">   3</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_3"></span><span class="anchor" id="line-3-2"></span>       <span class="Comment"># Your state initialization goes here</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_4">   4</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_4"></span><span class="anchor" id="line-4-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_5">   5</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_5"></span><span class="anchor" id="line-5-2"></span>     <span class="ResWord">def</span> <span class="ID">execute</span>(<span class="ResWord">self</span>, <span class="ID">userdata</span>):</span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_6">   6</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_6"></span><span class="anchor" id="line-6-2"></span>        <span class="Comment"># Your state execution goes here</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_7">   7</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_7"></span><span class="anchor" id="line-7-2"></span>        <span class="ResWord">if</span> <span class="ID">xxxx</span>:</span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_8">   8</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_8"></span><span class="anchor" id="line-8-2"></span>            <span class="ResWord">return</span> <span class="String">'</span><span class="String">outcome1</span><span class="String">'</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_9">   9</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_9"></span><span class="anchor" id="line-9-2"></span>        <span class="ResWord">else</span>:</span>
<span class="line"><span class="LineNumber"><a href="#CA-9d7418365444599849ea25a7f1d07887f116c71b_10">  10</a> </span><span class="LineAnchor" id="CA-9d7418365444599849ea25a7f1d07887f116c71b_10"></span><span class="anchor" id="line-10-2"></span>            <span class="ResWord">return</span> <span class="String">'</span><span class="String">outcome2</span><span class="String">'</span></span>
</pre></div></div><span class="anchor" id="line-52"></span><ul><li><p class="line862">In the <strong>init</strong> method you initialize your state class. Make sure to never block in the init method! If you need to wait for other parts of your system to start up, do this from a separate thread. <span class="anchor" id="line-53"></span><span class="anchor" id="line-54"></span></li><li class="gap"><p class="line862">In the <strong>execute</strong> method of a state the actual work is done. Here you can execute any code you want. It is okay to block in this method as long as you like. Once you return from this method, the current state is finished. <span class="anchor" id="line-55"></span><span class="anchor" id="line-56"></span></li><li class="gap"><p class="line862">When a state finishes, it returns an <strong>outcome</strong>. Each state has a number of possible outcomes associated with it. An outcome is a user-defined string that describes how a state finishes. A set of possible outcomes could for example be ['succeeded', 'failed', 'awesome']. The transition to the next state will be specified based on the outcome of the previous state. <span class="anchor" id="line-57"></span><span class="anchor" id="line-58"></span></li></ul><p class="line867">
<h3 id="Adding_states_to_a_state_machine">Adding states to a state machine</h3>
<span class="anchor" id="line-59"></span><p class="line874">A state machine is a container that holds a number of states. When adding a state to a state machine container, you specify the transitions between the states. <span class="anchor" id="line-60"></span><span class="anchor" id="line-61"></span><p class="line867"><span class="anchor" id="line-62"></span><span class="anchor" id="line-63"></span><span class="anchor" id="line-64"></span><span class="anchor" id="line-65"></span><span class="anchor" id="line-66"></span><span class="anchor" id="line-67"></span><span class="anchor" id="line-68"></span><span class="anchor" id="line-69"></span><span class="anchor" id="line-1-4"></span><div class="highlight python"><div class="codearea" dir="ltr" lang="en">
<script type="text/javascript">
document.write('<a href="#" οnclick="return togglenumber(\'CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99\', 1, 1);" \
                class="codenumbers">Toggle line numbers<\/a>');
</script>
<pre dir="ltr" id="CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99" lang="en"><span class="line"><span class="LineNumber"><a href="#CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_1">   1</a> </span><span class="LineAnchor" id="CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_1"></span><span class="anchor" id="line-1-5"></span>  <span class="ID">sm</span> = <span class="ID">smach</span>.<span class="ID">StateMachine</span>(<span class="ID">outcomes</span>=[<span class="String">'</span><span class="String">outcome4</span><span class="String">'</span>,<span class="String">'</span><span class="String">outcome5</span><span class="String">'</span>])</span>
<span class="line"><span class="LineNumber"><a href="#CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_2">   2</a> </span><span class="LineAnchor" id="CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_2"></span><span class="anchor" id="line-2-3"></span>  <span class="ResWord">with</span> <span class="ID">sm</span>:</span>
<span class="line"><span class="LineNumber"><a href="#CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_3">   3</a> </span><span class="LineAnchor" id="CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_3"></span><span class="anchor" id="line-3-3"></span>     <span class="ID">smach</span>.<span class="ID">StateMachine</span>.<span class="ID">add</span>(<span class="String">'</span><span class="String">FOO</span><span class="String">'</span>, <span class="ID">Foo</span>(),</span>
<span class="line"><span class="LineNumber"><a href="#CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_4">   4</a> </span><span class="LineAnchor" id="CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_4"></span><span class="anchor" id="line-4-3"></span>                            <span class="ID">transitions</span>={<span class="String">'</span><span class="String">outcome1</span><span class="String">'</span>:<span class="String">'</span><span class="String">BAR</span><span class="String">'</span>,</span>
<span class="line"><span class="LineNumber"><a href="#CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_5">   5</a> </span><span class="LineAnchor" id="CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_5"></span><span class="anchor" id="line-5-3"></span>                                         <span class="String">'</span><span class="String">outcome2</span><span class="String">'</span>:<span class="String">'</span><span class="String">outcome4</span><span class="String">'</span>})</span>
<span class="line"><span class="LineNumber"><a href="#CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_6">   6</a> </span><span class="LineAnchor" id="CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_6"></span><span class="anchor" id="line-6-3"></span>     <span class="ID">smach</span>.<span class="ID">StateMachine</span>.<span class="ID">add</span>(<span class="String">'</span><span class="String">BAR</span><span class="String">'</span>, <span class="ID">Bar</span>(),</span>
<span class="line"><span class="LineNumber"><a href="#CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_7">   7</a> </span><span class="LineAnchor" id="CA-e3031002f9584789f354e2f64f7c7d8f8c4fea99_7"></span><span class="anchor" id="line-7-3"></span>                            <span class="ID">transitions</span>={<span class="String">'</span><span class="String">outcome2</span><span class="String">'</span>:<span class="String">'</span><span class="String">FOO</span><span class="String">'</span>})</span>
</pre></div></div><span class="anchor" id="line-70"></span><p class="line874">The resulting state machine looks like this: <span class="anchor" id="line-71"></span><span class="anchor" id="line-72"></span><p class="line867"><img alt="simple.png" class="attachment" src="/smach/Tutorials/Getting%20Started?action=AttachFile&do=get&target=simple.png" title="simple.png" width="350" /> <span class="anchor" id="line-73"></span><span class="anchor" id="line-74"></span><ul><li><p class="line862">The red boxes show the possible <strong>outcomes</strong> of the state machine container: outcome4 and outcome5, as specified in line 1. <span class="anchor" id="line-75"></span></li><li><p class="line862">In line 3-5 we <strong>add</strong> the first state to the container, and call it FOO. The convention is to name states with all caps. If the outcome of state FOO is 'outcome1', then we transition to state BAR. If the outcome of state FOO is 'outcome2', then the whole state machine will exit with 'outcome4'. <span class="anchor" id="line-76"></span></li><li><p class="line862">Every state machine container is also a state. So you can <strong>nest state machines</strong> by adding a state machine container to another state machine container. <span class="anchor" id="line-77"></span><span class="anchor" id="line-78"></span></li></ul><p class="line867">
<h3 id="Example">Example</h3>
<span class="anchor" id="line-79"></span><p class="line862">This is a complete runnable example you can find in the <a href="/executive_smach_tutorials">executive_smach_tutorials</a> package. <span class="anchor" id="line-80"></span><span class="anchor" id="line-81"></span><p class="line867"><span class="anchor" id="line-82"></span><span class="anchor" id="line-83"></span><span class="anchor" id="line-1-6"></span><p class="line867"><span class="anchor" id="line-1-7"></span><em><a class="https" href="https://raw.githubusercontent.com/eacousineau/executive_smach_tutorials/hydro-devel/smach_tutorials/examples/state_machine_simple.py">https://raw.githubusercontent.com/eacousineau/executive_smach_tutorials/hydro-devel/smach_tutorials/examples/state_machine_simple.py</a></em> <span class="anchor" id="line-2-4"></span><span class="anchor" id="line-3-4"></span><span class="anchor" id="line-4-4"></span><span class="anchor" id="line-5-4"></span><span class="anchor" id="line-6-4"></span><span class="anchor" id="line-7-4"></span><span class="anchor" id="line-8-3"></span><span class="anchor" id="line-9-3"></span><span class="anchor" id="line-10-3"></span><span class="anchor" id="line-11-2"></span><span class="anchor" id="line-12-2"></span><span class="anchor" id="line-13-2"></span><span class="anchor" id="line-14-2"></span><span class="anchor" id="line-15-2"></span><span class="anchor" id="line-16-2"></span><span class="anchor" id="line-17-1"></span><span class="anchor" id="line-18-1"></span><span class="anchor" id="line-19-1"></span><span class="anchor" id="line-20-1"></span><span class="anchor" id="line-21-1"></span><span class="anchor" id="line-22-1"></span><span class="anchor" id="line-23-1"></span><span class="anchor" id="line-24-1"></span><span class="anchor" id="line-25-1"></span><span class="anchor" id="line-26-1"></span><span class="anchor" id="line-27-1"></span><span class="anchor" id="line-28-1"></span><span class="anchor" id="line-29-1"></span><span class="anchor" id="line-30-1"></span><span class="anchor" id="line-31-1"></span><span class="anchor" id="line-32-1"></span><span class="anchor" id="line-33-1"></span><span class="anchor" id="line-34-1"></span><span class="anchor" id="line-35-1"></span><span class="anchor" id="line-36-1"></span><span class="anchor" id="line-37-1"></span><span class="anchor" id="line-38-1"></span><span class="anchor" id="line-39-1"></span><span class="anchor" id="line-40-1"></span><span class="anchor" id="line-41-1"></span><span class="anchor" id="line-42-1"></span><span class="anchor" id="line-43-1"></span><span class="anchor" id="line-44-1"></span><span class="anchor" id="line-45-1"></span><span class="anchor" id="line-46-1"></span><span class="anchor" id="line-47-1"></span><span class="anchor" id="line-48-1"></span><span class="anchor" id="line-49-1"></span><span class="anchor" id="line-50-1"></span><span class="anchor" id="line-51-1"></span><span class="anchor" id="line-52-1"></span><span class="anchor" id="line-53-1"></span><span class="anchor" id="line-54-1"></span><span class="anchor" id="line-55-1"></span><span class="anchor" id="line-56-1"></span><span class="anchor" id="line-57-1"></span><span class="anchor" id="line-58-1"></span><span class="anchor" id="line-59-1"></span><span class="anchor" id="line-60-1"></span><span class="anchor" id="line-61-1"></span><span class="anchor" id="line-1-8"></span><div class="highlight python"><div class="codearea" dir="ltr" lang="en">
<script type="text/javascript">
document.write('<a href="#" οnclick="return togglenumber(\'CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01\', 1, 1);" \
                class="codenumbers">Toggle line numbers<\/a>');
</script>
<pre dir="ltr" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01" lang="en"><span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_1">   1</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_1"></span><span class="anchor" id="line-1-9"></span><span class="Comment">#!/usr/bin/env python</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_2">   2</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_2"></span><span class="anchor" id="line-2-5"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_3">   3</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_3"></span><span class="anchor" id="line-3-5"></span><span class="ResWord">import</span> <span class="ID">roslib</span>; <span class="ID">roslib</span>.<span class="ID">load_manifest</span>(<span class="String">'</span><span class="String">smach_tutorials</span><span class="String">'</span>)</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_4">   4</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_4"></span><span class="anchor" id="line-4-5"></span><span class="ResWord">import</span> <span class="ID">rospy</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_5">   5</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_5"></span><span class="anchor" id="line-5-5"></span><span class="ResWord">import</span> <span class="ID">smach</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_6">   6</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_6"></span><span class="anchor" id="line-6-5"></span><span class="ResWord">import</span> <span class="ID">smach_ros</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_7">   7</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_7"></span><span class="anchor" id="line-7-5"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_8">   8</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_8"></span><span class="anchor" id="line-8-4"></span><span class="Comment"># define state Foo</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_9">   9</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_9"></span><span class="anchor" id="line-9-4"></span><span class="ResWord">class</span> <span class="ID">Foo</span>(<span class="ID">smach</span>.<span class="ID">State</span>):</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_10">  10</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_10"></span><span class="anchor" id="line-10-4"></span>    <span class="ResWord">def</span> <span class="ID">__init__</span>(<span class="ResWord">self</span>):</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_11">  11</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_11"></span><span class="anchor" id="line-11-3"></span>        <span class="ID">smach</span>.<span class="ID">State</span>.<span class="ID">__init__</span>(<span class="ResWord">self</span>, <span class="ID">outcomes</span>=[<span class="String">'</span><span class="String">outcome1</span><span class="String">'</span>,<span class="String">'</span><span class="String">outcome2</span><span class="String">'</span>])</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_12">  12</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_12"></span><span class="anchor" id="line-12-3"></span>        <span class="ResWord">self</span>.<span class="ID">counter</span> = <span class="Number">0</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_13">  13</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_13"></span><span class="anchor" id="line-13-3"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_14">  14</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_14"></span><span class="anchor" id="line-14-3"></span>    <span class="ResWord">def</span> <span class="ID">execute</span>(<span class="ResWord">self</span>, <span class="ID">userdata</span>):</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_15">  15</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_15"></span><span class="anchor" id="line-15-3"></span>        <span class="ID">rospy</span>.<span class="ID">loginfo</span>(<span class="String">'</span><span class="String">Executing state FOO</span><span class="String">'</span>)</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_16">  16</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_16"></span><span class="anchor" id="line-16-3"></span>        <span class="ResWord">if</span> <span class="ResWord">self</span>.<span class="ID">counter</span> < <span class="Number">3</span>:</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_17">  17</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_17"></span><span class="anchor" id="line-17-2"></span>            <span class="ResWord">self</span>.<span class="ID">counter</span> += <span class="Number">1</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_18">  18</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_18"></span><span class="anchor" id="line-18-2"></span>            <span class="ResWord">return</span> <span class="String">'</span><span class="String">outcome1</span><span class="String">'</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_19">  19</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_19"></span><span class="anchor" id="line-19-2"></span>        <span class="ResWord">else</span>:</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_20">  20</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_20"></span><span class="anchor" id="line-20-2"></span>            <span class="ResWord">return</span> <span class="String">'</span><span class="String">outcome2</span><span class="String">'</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_21">  21</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_21"></span><span class="anchor" id="line-21-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_22">  22</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_22"></span><span class="anchor" id="line-22-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_23">  23</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_23"></span><span class="anchor" id="line-23-2"></span><span class="Comment"># define state Bar</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_24">  24</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_24"></span><span class="anchor" id="line-24-2"></span><span class="ResWord">class</span> <span class="ID">Bar</span>(<span class="ID">smach</span>.<span class="ID">State</span>):</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_25">  25</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_25"></span><span class="anchor" id="line-25-2"></span>    <span class="ResWord">def</span> <span class="ID">__init__</span>(<span class="ResWord">self</span>):</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_26">  26</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_26"></span><span class="anchor" id="line-26-2"></span>        <span class="ID">smach</span>.<span class="ID">State</span>.<span class="ID">__init__</span>(<span class="ResWord">self</span>, <span class="ID">outcomes</span>=[<span class="String">'</span><span class="String">outcome2</span><span class="String">'</span>])</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_27">  27</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_27"></span><span class="anchor" id="line-27-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_28">  28</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_28"></span><span class="anchor" id="line-28-2"></span>    <span class="ResWord">def</span> <span class="ID">execute</span>(<span class="ResWord">self</span>, <span class="ID">userdata</span>):</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_29">  29</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_29"></span><span class="anchor" id="line-29-2"></span>        <span class="ID">rospy</span>.<span class="ID">loginfo</span>(<span class="String">'</span><span class="String">Executing state BAR</span><span class="String">'</span>)</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_30">  30</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_30"></span><span class="anchor" id="line-30-2"></span>        <span class="ResWord">return</span> <span class="String">'</span><span class="String">outcome2</span><span class="String">'</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_31">  31</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_31"></span><span class="anchor" id="line-31-2"></span>        </span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_32">  32</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_32"></span><span class="anchor" id="line-32-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_33">  33</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_33"></span><span class="anchor" id="line-33-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_34">  34</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_34"></span><span class="anchor" id="line-34-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_35">  35</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_35"></span><span class="anchor" id="line-35-2"></span><span class="Comment"># main</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_36">  36</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_36"></span><span class="anchor" id="line-36-2"></span><span class="ResWord">def</span> <span class="ID">main</span>():</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_37">  37</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_37"></span><span class="anchor" id="line-37-2"></span>    <span class="ID">rospy</span>.<span class="ID">init_node</span>(<span class="String">'</span><span class="String">smach_example_state_machine</span><span class="String">'</span>)</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_38">  38</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_38"></span><span class="anchor" id="line-38-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_39">  39</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_39"></span><span class="anchor" id="line-39-2"></span>    <span class="Comment"># Create a SMACH state machine</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_40">  40</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_40"></span><span class="anchor" id="line-40-2"></span>    <span class="ID">sm</span> = <span class="ID">smach</span>.<span class="ID">StateMachine</span>(<span class="ID">outcomes</span>=[<span class="String">'</span><span class="String">outcome4</span><span class="String">'</span>, <span class="String">'</span><span class="String">outcome5</span><span class="String">'</span>])</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_41">  41</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_41"></span><span class="anchor" id="line-41-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_42">  42</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_42"></span><span class="anchor" id="line-42-2"></span>    <span class="Comment"># Open the container</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_43">  43</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_43"></span><span class="anchor" id="line-43-2"></span>    <span class="ResWord">with</span> <span class="ID">sm</span>:</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_44">  44</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_44"></span><span class="anchor" id="line-44-2"></span>        <span class="Comment"># Add states to the container</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_45">  45</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_45"></span><span class="anchor" id="line-45-2"></span>        <span class="ID">smach</span>.<span class="ID">StateMachine</span>.<span class="ID">add</span>(<span class="String">'</span><span class="String">FOO</span><span class="String">'</span>, <span class="ID">Foo</span>(), </span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_46">  46</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_46"></span><span class="anchor" id="line-46-2"></span>                               <span class="ID">transitions</span>={<span class="String">'</span><span class="String">outcome1</span><span class="String">'</span>:<span class="String">'</span><span class="String">BAR</span><span class="String">'</span>, </span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_47">  47</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_47"></span><span class="anchor" id="line-47-2"></span>                                            <span class="String">'</span><span class="String">outcome2</span><span class="String">'</span>:<span class="String">'</span><span class="String">outcome4</span><span class="String">'</span>})</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_48">  48</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_48"></span><span class="anchor" id="line-48-2"></span>        <span class="ID">smach</span>.<span class="ID">StateMachine</span>.<span class="ID">add</span>(<span class="String">'</span><span class="String">BAR</span><span class="String">'</span>, <span class="ID">Bar</span>(), </span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_49">  49</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_49"></span><span class="anchor" id="line-49-2"></span>                               <span class="ID">transitions</span>={<span class="String">'</span><span class="String">outcome2</span><span class="String">'</span>:<span class="String">'</span><span class="String">FOO</span><span class="String">'</span>})</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_50">  50</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_50"></span><span class="anchor" id="line-50-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_51">  51</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_51"></span><span class="anchor" id="line-51-2"></span>    <span class="Comment"># Execute SMACH plan</span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_52">  52</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_52"></span><span class="anchor" id="line-52-2"></span>    <span class="ID">outcome</span> = <span class="ID">sm</span>.<span class="ID">execute</span>()</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_53">  53</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_53"></span><span class="anchor" id="line-53-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_54">  54</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_54"></span><span class="anchor" id="line-54-2"></span></span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_55">  55</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_55"></span><span class="anchor" id="line-55-2"></span><span class="ResWord">if</span> <span class="ID">__name__</span> == <span class="String">'</span><span class="String">__main__</span><span class="String">'</span>:</span>
<span class="line"><span class="LineNumber"><a href="#CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_56">  56</a> </span><span class="LineAnchor" id="CA-5ed0a1465d43207c47ff3857f30d6536ccfa9b01_56"></span><span class="anchor" id="line-56-2"></span>    <span class="ID">main</span>()</span>
</pre></div></div><span class="anchor" id="line-62-1"></span><p class="line874"> <span class="anchor" id="line-84"></span><p class="line874">Running the example: <span class="anchor" id="line-85"></span><span class="anchor" id="line-86"></span><p class="line867"><span class="anchor" id="line-87"></span><span class="anchor" id="line-88"></span><span class="anchor" id="line-89"></span><pre><span class="anchor" id="line-1-10"></span>$ roscd smach_tutorials
<span class="anchor" id="line-2-6"></span>$ ./examples/state_machine_simple.py</pre><span class="anchor" id="line-90"></span><p class="line874">This should give you the following output: <span class="anchor" id="line-91"></span><span class="anchor" id="line-92"></span><p class="line867"><span class="anchor" id="line-93"></span><span class="anchor" id="line-94"></span><span class="anchor" id="line-95"></span><span class="anchor" id="line-96"></span><span class="anchor" id="line-97"></span><span class="anchor" id="line-98"></span><span class="anchor" id="line-99"></span><span class="anchor" id="line-100"></span><span class="anchor" id="line-101"></span><span class="anchor" id="line-102"></span><span class="anchor" id="line-103"></span><span class="anchor" id="line-104"></span><span class="anchor" id="line-105"></span><span class="anchor" id="line-106"></span><span class="anchor" id="line-107"></span><pre><span class="anchor" id="line-1-11"></span>[INFO] 1279835117.234563: Executing state FOO
<span class="anchor" id="line-2-7"></span>[INFO] 1279835117.234849: State machine transitioning 'FOO':'outcome1'-->'BAR'
<span class="anchor" id="line-3-6"></span>[INFO] 1279835117.235114: Executing state BAR
<span class="anchor" id="line-4-6"></span>[INFO] 1279835117.235360: State machine transitioning 'BAR':'outcome2'-->'FOO'
<span class="anchor" id="line-5-6"></span>[INFO] 1279835117.235633: Executing state FOO
<span class="anchor" id="line-6-6"></span>[INFO] 1279835117.235884: State machine transitioning 'FOO':'outcome1'-->'BAR'
<span class="anchor" id="line-7-6"></span>[INFO] 1279835117.236143: Executing state BAR
<span class="anchor" id="line-8-5"></span>[INFO] 1279835117.236387: State machine transitioning 'BAR':'outcome2'-->'FOO'
<span class="anchor" id="line-9-5"></span>[INFO] 1279835117.236644: Executing state FOO
<span class="anchor" id="line-10-5"></span>[INFO] 1279835117.236891: State machine transitioning 'FOO':'outcome1'-->'BAR'
<span class="anchor" id="line-11-4"></span>[INFO] 1279835117.237149: Executing state BAR
<span class="anchor" id="line-12-4"></span>[INFO] 1279835117.237394: State machine transitioning 'BAR':'outcome2'-->'FOO'
<span class="anchor" id="line-13-4"></span>[INFO] 1279835117.237652: Executing state FOO
<span class="anchor" id="line-14-4"></span>[INFO] 1279835117.237898: State machine terminating 'FOO':'outcome2':'outcome4'</pre><span class="anchor" id="line-108"></span><p class="line867">
<h2 id="Pre-defined_States_and_Containers">Pre-defined States and Containers</h2>
<span class="anchor" id="line-109"></span><p class="line867">
<h3 id="State_library">State library</h3>
<span class="anchor" id="line-110"></span><p class="line874">The example above shows how you can implement your own states. However, Smach comes with a whole library of pre-implemented states that cover many common usecases: <span class="anchor" id="line-111"></span><span class="anchor" id="line-112"></span><ul><li><p class="line891"><strong>SimpleActionState</strong>: automatically call <a href="/actionlib">actionlib</a> actions. <span class="anchor" id="line-113"></span></li><li><p class="line891"><strong>ServiceState</strong>: automatically call ROS services <span class="anchor" id="line-114"></span></li><li><p class="line891"><strong>MonitorState</strong> <span class="anchor" id="line-115"></span></li><li>... <span class="anchor" id="line-116"></span><span class="anchor" id="line-117"></span></li></ul><p class="line862">The 'Smach States' section on the <a href="/smach/Tutorials">tutorials page</a> gives an overview of all available states. <span class="anchor" id="line-118"></span><span class="anchor" id="line-119"></span><p class="line867">
<h3 id="Container_library">Container library</h3>
<span class="anchor" id="line-120"></span><p class="line874">Similarly, Smach also comes with a set of useful containers: <span class="anchor" id="line-121"></span><span class="anchor" id="line-122"></span><ul><li><p class="line891"><strong>StateMachine</strong>: the generic state machine container <span class="anchor" id="line-123"></span></li><li><p class="line891"><strong>Concurrence</strong>: a state machine that can run multiple states in parallel. <span class="anchor" id="line-124"></span></li><li><p class="line891"><strong>Sequence</strong>: a state machine that makes it easy to execute a set of states in sequence. The 'Smach Containers' section on the <a href="/smach/Tutorials">tutorials page</a> gives an overview of all available containers. <span class="anchor" id="line-125"></span><span class="anchor" id="line-126"></span></li></ul><p class="line867"><img alt="width="350"" class="attachment" src="/smach/Tutorials/Getting%20Started?action=AttachFile&do=get&target=containers.png" title="width="350"" /> <span class="anchor" id="line-127"></span><span class="anchor" id="line-128"></span><p class="line862">The <a href="/smach/Tutorials/User%20Data">next tutorial</a> will teach you how to pass user data between different states and state machines. <span class="anchor" id="line-129"></span><span class="anchor" id="line-130"></span><p class="line867"><span class="anchor" id="line-131"></span><p class="line867"><span class="anchor" id="line-132"></span><p class="line867"><span class="anchor" id="line-133"></span><p class="line867"><span class="anchor" id="line-134"></span><span class="anchor" id="bottom"></span></div></div>
<div id="pagebottom"></div>
</div>

<p id="pageinfo" class="info" lang="en" dir="ltr">Wiki: smach/Tutorials/Getting Started  (last edited 2015-07-26 13:28:41 by <span title="snorri @ 118.32.165.21[118.32.165.21]"><a class="mailto" href="mailto:d.stonier@gmail.com" title="snorri @ 118.32.165.21[118.32.165.21]">DanielStonier</a></span>)</p>




<div style="margin-top: 9px;" class="footer">
Except where otherwise noted, the ROS wiki is licensed under the <br /><a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> | <a href="https://plus.google.com/113789706402978299308" rel="publisher">Find us on Google+</a>
<hr style="margin-top: 10px;">
<div class="row">
  <div class="col-md-4 col-md-offset-4">
<a href="http://www.osrfoundation.org"><img style="margin-top: -1px;" src="/custom/images/brought_by_horiz.png"></p></a>
  </div>
</div>
</div>

  </div></div> <!-- /#dpage-inner, /#dpage -->


</body>
</html>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值