ROS Smach-----状态创建和添加

2023-11-04 07:30
文章标签 创建 状态 ros smach

本文主要是介绍ROS Smach-----状态创建和添加,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    Smach是状态机的意思,是基于python实现的一个功能强大且易于扩展的库。 smach本质上并不依赖于ROS,可以用于任意python项目,不过在ROS中功能包集executive_smach将smach和ROS很好的集成在了一起,该功能包集还集成了actionlib和smach_viewer(用于可视监控状态机变化,不过目前对于Kinetic版本还没有支持)。

   
本文主要叙述smach的 1)状态创建和2)如何把状态加入到状态机


1 状态创建

   1   class Foo(smach.State):2      def __init__(self, outcomes=['outcome1', 'outcome2']):3        # Your state initialization goes here4 5      def execute(self, userdata):6         # Your state execution goes here7         if xxxx:8             return 'outcome1'9         else:10             return 'outcome2'

  • init用于初始化状态class,必须确保该函数不会block执行。

  • execute 用于定义该状态下要完成的任务,它可以允许block执行,一旦你从该方法返回也意味着当前状态结束。

  • 当状态结束时候会返回outcome。每个状态都可能会有几种可能的outcomes。用户可以自定义 outcome来描述该状态完成的如何(如['succeeded', 'failed', 'awesome'),outcome也是一个状态切换到下一个状态 的依据。

2 添加状态到状态机

    状态机可以看作是一个容器,用于放置不同的状态。当把一个状态加入到状态机时候,我们需要指定状态转换规则。

  1   sm = smach.StateMachine(outcomes=['outcome4','outcome5'])2   with sm:3      smach.StateMachine.add('FOO', Foo(),4                             transitions={'outcome1':'BAR',5                                          'outcome2':'outcome4'})6      smach.StateMachine.add('BAR', Bar(),7                             transitions={'outcome2':'FOO'})

注意:状态机也可以看做状态,这意味着我们可以把一个状态机看做状态加入到另一个状态机。


3 实例代码

说明:以下代码来源于ROS WiKi。

#!/usr/bin/env pythonimport roslib; roslib.load_manifest('smach_tutorials')
import rospy
import smach
import smach_ros
<strong>
# define state Foo</strong>
class Foo(smach.State):def __init__(self):smach.State.__init__(self, outcomes=['outcome1','outcome2'])self.counter = 0def execute(self, userdata):rospy.loginfo('Executing state FOO')if self.counter < 3:self.counter += 1return 'outcome1'else:return 'outcome2'<strong># define state Bar</strong>
class Bar(smach.State):def __init__(self):smach.State.__init__(self, outcomes=['outcome2'])def execute(self, userdata):rospy.loginfo('Executing state BAR')return 'outcome2'<strong># main</strong>
def main():rospy.init_node('smach_example_state_machine')# Create a SMACH state machinesm = smach.StateMachine(outcomes=['outcome4', 'outcome5'])# Open the containerwith sm:# Add states to the containersmach.StateMachine.add('FOO', Foo(), transitions={'outcome1':'BAR', 'outcome2':'outcome4'})smach.StateMachine.add('BAR', Bar(), transitions={'outcome2':'FOO'})
<strong>#<span class="line"><span class="Comment">Create and start the introspection server</span></span><span style="font-family:Microsoft YaHei;">(For debugging interface by smach_viewer )</span></strong>
<span style="font-family:Microsoft YaHei;">         </span> sis = smach_ros.IntrospectionServer('sm_server', sm, '/SM_ROOT')sis.start()<strong># Execute SMACH plan</strong>outcome = sm.execute()
<pre dir="ltr" id="CA-06a92aec5f65b340e778bf2c2ce007b12b82e73a" lang="en"><span class="line"><span class="Comment">    <strong>#Wait for ctrl-c to stop the application</strong></span></span><pre name="code" class="python"><pre dir="ltr" id="CA-06a92aec5f65b340e778bf2c2ce007b12b82e73a" lang="en"><span class="line"><span class="Comment"></span></span><pre name="code" class="python"><strong><span style="font-family:Microsoft YaHei;">             #(For debugging interface by smach_viewer )</span></strong>

 
 
 
 
 
 
 rospy.spin() sis.stop()if __name__ == '__main__': main() 
 

输出信息:

[INFO] [WallTime: 1478497355.866746] State machine starting in initial state 'FOO' with userdata: []
[INFO] [WallTime: 1478497355.867673] Executing state FOO
[INFO] [WallTime: 1478497355.868092] State machine transitioning 'FOO':'outcome1'-->'BAR'
[INFO] [WallTime: 1478497355.868703] Executing state BAR
[INFO] [WallTime: 1478497355.869094] State machine transitioning 'BAR':'outcome2'-->'FOO'
[INFO] [WallTime: 1478497355.869660] Executing state FOO
[INFO] [WallTime: 1478497355.870035] State machine transitioning 'FOO':'outcome1'-->'BAR'
[INFO] [WallTime: 1478497355.870590] Executing state BAR
[INFO] [WallTime: 1478497355.871010] State machine transitioning 'BAR':'outcome2'-->'FOO'
[INFO] [WallTime: 1478497355.871513] Executing state FOO
[INFO] [WallTime: 1478497355.871843] State machine transitioning 'FOO':'outcome1'-->'BAR'
[INFO] [WallTime: 1478497355.872400] Executing state BAR
[INFO] [WallTime: 1478497355.872766] State machine transitioning 'BAR':'outcome2'-->'FOO'
[INFO] [WallTime: 1478497355.873100] Executing state FOO
[INFO] [WallTime: 1478497355.873282] State machine terminating 'FOO':'outcome2':'outcome4'


4 预定义的状态和状态机容器

上面代码是用户自定义状态和状态机容器,其实smach自身已经包含预定义的状态库和容器库,能够支持一些常见的状态和状态机。

4.1 状态库

  • SimpleActionState: automatically call actionlib actions.

  • ServiceState: automatically call ROS services

  • MonitorState

4.2容器库

  • StateMachine: the generic state machine container

  • Concurrence: a state machine that can run multiple states in parallel.

  • Sequence: a state machine that makes it easy to execute a set of states in sequence. The 'Smach Containers' section on the tutorials page gives an overview of all available containers.


如果ROS支持smach_viewer,你能输出图:






 

这篇关于ROS Smach-----状态创建和添加的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/344219

相关文章

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

java创建xls文件放到指定文件夹中实现方式

《java创建xls文件放到指定文件夹中实现方式》本文介绍了如何在Java中使用ApachePOI库创建和操作Excel文件,重点是如何创建一个XLS文件并将其放置到指定文件夹中... 目录Java创建XLS文件并放到指定文件夹中步骤一:引入依赖步骤二:创建XLS文件总结Java创建XLS文件并放到指定文件

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn