ROS SMACH个人学习记录

news2024/11/25 14:43:03

ROS SMACH学习个人记录

  • SMACH
    • 关于抢占
      • 一些Tips
      • SMACH缺点
      • 个人的结论

本文仅为个人学习记录,结论正确性待考究。欢迎大家讨论

SMACH

关于抢占

抢占需要在并发容器里面实现,并发容器里面包含多个状态,我们分成两类:抢占状态与被抢占状态
抢占的实现原理:

  1. 定义子状态结束回调函数,该函数在并发容器里面的任何状态结束时候都会调用
def child_cb(outcome_map):
    rospy.loginfo('excute child call back')
    return True
  1. 在并发容器里面增加子状态结束回调函数调用(看最后一行)
sm_con = smach.Concurrence(outcomes=['outcome4','preempted'],
                                   default_outcome='outcome4',
                                   outcome_map={'preempted':{ 'FOO':'outcome1','BAR':'preempted'},
                                                'outcome4':{'BAR':'outcome2'}},
                                    child_termination_cb = child_cb)
  1. 在被抢占状态里定义抢占响应(excute后面四行)
# define state Bar
class Bar(smach.State):
    def __init__(self):
        smach.State.__init__(self, outcomes=['outcome2','preempted'])
    def execute(self, userdata):
        rospy.loginfo('Executing state BAR')
        if self.preempt_requested():
            self.service_preempt()
            return 'preempted'
        rospy.sleep(50)
        return 'outcome2'
  1. 在代码的后面增加handlerset_preempt_handler(你的状态机名)

全部代码:

#!/usr/bin/env python3

# 在并发状态机里面测试状态抢占功能

import rospy
import smach
import smach_ros
from smach_ros import ServiceState, SimpleActionState, IntrospectionServer,set_preempt_handler, MonitorState


# define state Foo
class Foo(smach.State):
    def __init__(self):
        smach.State.__init__(self, outcomes=['outcome1'])
        self.counter = 0

    def execute(self, userdata):
        rospy.loginfo('Executing state FOO')
        rospy.sleep(1)
        return 'outcome1'



# define state Bar
class Bar(smach.State):
    def __init__(self):
        smach.State.__init__(self, outcomes=['outcome2','preempted'])

    def execute(self, userdata):
        rospy.loginfo('Executing state BAR')
        if self.preempt_requested():
            self.service_preempt()
            return 'preempted'
        # n=1
        # while n<50:
        #     rospy.sleep(1)
        #     rospy.loginfo('Do something')
        #     n+=1
        # Check for preempt
        rospy.sleep(50)
        return 'outcome2'
        


# define state Bas
class Bas(smach.State):
    def __init__(self):
        smach.State.__init__(self, outcomes=['outcome3'])

    def execute(self, userdata):
        rospy.loginfo('Executing state BAS')
        return 'outcome3'


def child_cb(outcome_map):
    rospy.loginfo('excute child call back')
    return True


def main():
    rospy.init_node('smach_example_state_machine')

    # Create the top level SMACH state machine
    sm_top = smach.StateMachine(outcomes=['outcome6'])
    
    # Open the container
    with sm_top:

        smach.StateMachine.add('BAS', Bas(),
                               transitions={'outcome3':'CON'})

        # Create the sub SMACH state machine
        sm_con = smach.Concurrence(outcomes=['outcome4','preempted'],
                                   default_outcome='outcome4',
                                   outcome_map={'preempted':{ 'FOO':'outcome1','BAR':'preempted'},
                                                'outcome4':{'BAR':'outcome2'}},
                                    child_termination_cb = child_cb)

        # Open the container
        with sm_con:
            # Add states to the container
            smach.Concurrence.add('FOO', Foo())
            smach.Concurrence.add('BAR', Bar())

        smach.StateMachine.add('CON', sm_con,
                               transitions={'outcome4':'CON',
                                            'preempted':'outcome6'})
    # Create and start the introspection server
    sis = smach_ros.IntrospectionServer('server_name', sm_top, '/SM_ROOT')
    sis.start()

    # sm_top.request_preempt()
    set_preempt_handler(sm_top)
    outcome = sm_top.execute()

    # Wait for ctrl-c to stop the application
    rospy.spin()
    sis.stop()

if __name__ == '__main__':
    main()

该例子跑出来的效果:
能够完成Foo对Bar的抢占,不抢占的话会反复在CON和Bar状态里循环,但是Foo要等Bar执行完毕才去抢占。

一些Tips

  1. 状态切换太快node会死掉
  2. 各个容器可以不定义结果,但建议最好要定义结果(这里的结果表示为在SMACH viewer里面的红色块),子容器与父容器通过该结果联系。子容器可以结果通向父容器或者重新回到自己状态的开始,父容器不能通向到子容器里面(待验证)
  3. 子容器与父容器的连线结果等于子容器的红色块结果
  4. 并发容器里面嵌套状态机时,如果里面的状态机里面状态阻塞为得到红色快结果,Ctrl C会报错:Concurrent state ‘xxx’ returned no outcome on termination.
  5. 抢占在并发容器里面实现,状态1要抢占状态2必须要等到状态2执行完???(无action的情况下)
  6. Monitor提供消息与状态的交互(monitor call back return true时状态输出invalid,并结束monitor状态,否则monitor状态一直阻塞)
  7. 并发容器下只能并行执行多个单状态,如果需要在其中一个状态下再增加状态,需要打包。即对并发容器呈现出来只有多个单状态的并行。举个例子:

在这里插入图片描述
这样是不行的
必须把状态2和状态3打包成一个整体,打包在sm_sub1里面
在这里插入图片描述

  1. 待补充

SMACH缺点

  1. 基于Tips7带来的问题:并发容器里的子状态是嵌套的状态机时,如何定义抢占响应。对于各个状态我们可以在里面定义def excute,状态机咋搞?
  2. 基于Tips5似乎即便没有缺点1,该抢占也不是真正意义上的抢占???
  3. SMACH viewer node 经常动不动崩溃

个人的结论

层级数目超过教程例子的状态机就不建议参考使用SMACH,在确定要使用SMACH的情况下,建议在状态机设计时尽可能贴近SMACH教程的架构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52330.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APK 是怎么来的?- Android 构建流程解析

一、 APK 组成解析 在开始解析 Android 构建流程之前&#xff0c;我们先来看下构建的最终产物 APK 的整体组成 APK 主要由五个部分组成&#xff0c;分别是&#xff1a; Dex&#xff1a;.class 文件处理后的产物&#xff0c;Android 系统的可执行文件 Resource&#xff1a;资源…

Android S(31) APP 页面绘制流程

接上一篇app 启动流程调用OnCreate方法&#xff0c;页面布局绘制进入setContentView 1、加载布局setContentView() 这里getWindow()直接返回mWindow&#xff0c;这个早在onCreate 调用前Activity#attach里面完成初始化。 进入attach方法&#xff0c;构建一个窗体对象PhoneWind…

[附源码]SSM计算机毕业设计疫情防控下高校教职工健康信息管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Docker Cgroups资源控制

目录 一、cgroups简介 cgroups有四大功能&#xff1a; 二、cpu时间片的概念 三、对CPU使用的限制 1 设置CPU使用率上限 &#xff08;1&#xff09;查看容器的默认CPU使用限制 2 设置CPU资源占用比&#xff08;设置多个容器时才有效&#xff09; 1&#xff09;创建两个容器…

回归商业初心,宝尊电商“深耕广拓”缔造品牌电商有质增长

今年来&#xff0c;受疫情、通胀、能源等因素影响&#xff0c;全球市场都经历了不同程度的“震荡”。 寒气传递之间&#xff0c;电商行业开始摸索后疫情时代的前进之路。随着财报季来临&#xff0c;市场开始期待从各赛道标杆企业财报中看出行业走势。 11月29日&#xff0c;“…

python3基础语法

Python 常用文件扩展名为 .py&#xff0c;可以新建一个 hello.py 文件开始下面的学习&#xff0c;执行使用命令 python3 hello.py 一、标识符 第一个字母必须是 字母 或 下划线 _标识符的其他的部分由 字母、数字 和 下划线 组成标识符对 大小写敏感 二、保留字&#xff08…

[2022世界杯] 小白也可以看懂的世界杯

⚽文化世界杯 如果问你全球最火,影响力最大的体育赛事是什么&#xff1f;那么很多人会说 “奥运会”&#xff01;当然不完全对&#xff0c;如果从关注度来说 世界杯的影响力更大&#xff01; 世界杯与奥运会的不同在于&#xff1a;会员协会的数量&#xff0c;拥有209个会员协会…

【踩坑】double和BigDecimal的精度问题

【踩坑】double和bigdecimal的精度问题背景debug尝试测试代码结果总结背景 今天生产报了个问题&#xff0c;在申报和预算相同的金额的时候&#xff0c;后台返回超出预算。一开始以为是判断逻辑的问题&#xff0c;找了个数据试了下发现重现不出来。又是改数据又是找前端传参最后…

Pose for Everything: Towards Category-Agnostic Pose Estimation 阅读笔记

类无关姿态估计 ECCV 2022 Oral 论文链接 代码链接 其他参考 引入了一个新任务&#xff1a;CategoryAgnostic Pose Estimation (CAPE) 类无关姿态估计 摘要&#xff1a; 目前的2D姿态估计与类别耦合&#xff0c;例如人、动物、车辆。但很多场景需要检测未知类的姿态/关键点。…

我是如何从测试开发做到年薪50万的?

入行测开&#xff0c;马上就要5年了。创业公司待过&#xff0c;大公司也待过&#xff0c;工作这一路走来&#xff0c;一些心得&#xff0c;转变&#xff0c;职场体会&#xff0c;早就想写出来分享一下。这个历程包含了技术的提升&#xff0c;工程师的素养和对这个行业的点滴感悟…

操作系统学习笔记(Ⅳ):文件

目录 1 文件管理 1.1 初识文件管理 1.文件属性 2.文件数据组织 3.向上功能 1.2 文件逻辑结构 1.无结构文件 2.有结构文件 3.顺序文件 4.索引文件 5.索引顺序文件 1.3 文件目录 1.文件控制块 2.目录结构 3.索引结点 1.4 文件物理结构 1.连续分配 2.链接分配 …

【面试题】【ES6】let和const命令 (面试必看)

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 1、let命令 基本用法 用法类似于var&#xff0c;但是所声明的变量&#xff0c;只在let命令所在的代码块内有效。 let…

全国计算机三级嵌入式 - 题库 - 真题(含答案) - 未来教育 - 视频讲解 - 资料获取

全国全国计算机三级嵌入式等级考试 1. 考题大纲 历年不一样。但是换汤不换药。 2. 考试真题 历年全部考题、真题。包含全部答案。 3. 未来教育 考点、知识点、历年真题视频讲解。 4. 资料获取 在本人的博客上传资源里&#xff01;&#xff01;&#xff01;下载不易&#xff0…

[附源码]计算机毕业设计springboot勤工俭学管理小程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

论文投稿指南——中文核心期刊推荐(计算机技术)

>>>深度学习Tricks&#xff0c;第一时间送达<<< &#x1f680; 写在前面 &#x1f431;‍&#x1f3cd; 本期开始&#xff0c;小海带会定期推荐各专业领域的中文核心期刊及论文投稿网址&#xff0c;供大家交流参考 ~ 《中文核心期刊要目总览》——是学术界…

功率放大器主要性能指标是什么(功率放大器工作状态的分类)

电子仪器中&#xff0c;放大器末级都要带动一定的负载&#xff0c;所以末级电路不仅要求可以输出较大幅度电压&#xff0c;而且要求输出较大幅度电流&#xff0c;也就是要求放大器能够对负载输出较大的功率&#xff0c;这种测试仪器就被称为功率放大器。 功率放大器主要性能指标…

人脸检测-级联卷积

人脸检测有好多种cv都有自带 说到人脸检测&#xff0c;应该是近几年不老的话题了&#xff0c;如果要将这技术真的落实到现在产品&#xff0c;其实还有很长的路&#xff0c;不知道大家有没有发现&#xff0c;很多无人超市开始走下坡路&#xff0c;也许不仅仅是技术的原因之一吧…

idea中LeetCode无法正常使用

在风诡云谲的互联网职场中&#xff0c;随时准备好简历和刷题能力是非常必要的&#xff01;在工作时间“光明正大”刷题的神器——LeetCode插件&#xff01; 原来&#xff1a;idea 2019&#xff1b;LeetCode 6.8 目前&#xff1a;idea 2020.3&#xff1b;LeetCode 8.4 一 ide…

ARM-A架构入门基础(四)Cache

14天学习训练营导师课程&#xff1a;周贺贺《ARMv8/ARMv9架构-快速入门》 1. 定义 Cache是ARM中一块可高速访问的内存块&#xff0c;每块cache包含&#xff1a; 主要的内存地址信息&#xff1b;缓存数据。 2. Cache模型 速度方面&#xff1a;L1 cache > L2 cache > L…