当前位置: 首页 > news >正文

状态机SMACH相关教程介绍与应用案例分析——机器人操作进阶系列之一

文章目录

  • 前言
  • 一、状态机介绍与教程推荐
    • 1.状态机介绍
    • 2.相关教程推荐
    • 3.状态图和流程图的区别
  • 二、基于状态机的鞋子打包实现
    • 1.问题概述
    • 2.感知和重定向
    • 3.任务规划器
  • 总结


前言

状态机是实现机器人任务规划的高效工具,值得深入学习和掌握。本文将系统介绍状态机的基本概念和核心术语,推荐优质学习资源,并通过鞋子打包的实战案例,帮助读者全面理解状态机的实际应用。


一、状态机介绍与教程推荐

1.状态机介绍

在ROS(Robot Operating System)中,状态机是一种用于管理机器人行为和控制逻辑的模型。它帮助开发者将复杂的任务分解为一系列离散的“状态”,每个状态代表系统的一个离散情形,并通过“转移”规则在状态之间切换。状态机特别适用于任务规划、机器人导航等场景,因为它能清晰地处理异步事件和条件分支。

状态机的基本组成:
1)状态(State): 表示系统的一个行为单元。例如,在机器人操作中,状态可以是被操作物体的不同姿态。
2)转移(Transition): 定义从一个状态切换到另一个状态的条件,通常基于事件或数据输入。例如,当传感器检测到特定的位姿时,机器人执行重定向原语,使物体从一个位姿转换到另一个位姿。
3)输出(Outcome): 每个状态执行后产生的结果,用于触发转移。常见输出如“成功”“失败”或自定义标签。
4)层次结构: 状态机可以嵌套,形成子状态机,以处理更复杂的逻辑。

在ROS中,状态机通常通过smach库实现。smach(State Machine)是一个轻量级、灵活的库,专为ROS设计,允许开发者用Python代码定义状态机,并将其集成到ROS节点中。smach提供了可视化工具(如smach_viewer),便于调试和监控状态流。

SMACH功能包的安装命令如下:

sudo apt-get install ros-noetic-executive-smach
sudo apt-get install ros-noetic-executive-smach-visualization

2.相关教程推荐

ROS官网已有关于SMACH的系列教程,这里简要介绍如下。

网址1:https://wiki.ros.org/cn/smach
介绍了状态机的使用条件,什么时候使用和什么时候不使用状态机。

网址2:https://wiki.ros.org/cn/smach/Documentation
介绍了状态机的相关术语及其定义,如状态,状态结果,用户数据,容器等。

网址3:https://wiki.ros.org/cn/smach/Tutorials
给出了学习状态机的基础和高级系列教程,其中初级系列教程如以下截图所示,其中左侧展示的是详细的系列教程,右侧展示的是对应教程的详细代码。
SMACH基础教程
网址4:https://wiki.ros.org/cn/smach/UseCase
使用实例探讨了如何使用SMACH,该实例为在turtlesim中协调两只乌龟的运动。

注意:以上为ROS中文官网的教程,其原版英文教程参考http://wiki.ros.org/smach。

除了上述官网提供的教程,古月老师也整理了SMACH学习的教程,如下所示:
1 ROS探索总结(三十七)——有限状态机smach (1)
2 ROS探索总结(三十八)——有限状态机smach (2)

3.状态图和流程图的区别

SMACH提供的可视化工具smach_viewer,可以显示状态图便于调试和监控状态转换。但是状态图(下图(a))和流程图(下图(b))比较容易混淆,以下为两者的对比。

流程图的节点是状态图中的边。这是因为流程图中的每个节点都代表一个程序命令,程序命令是要执行的操作,其本身并非状态,但当应用于某个状态时,会导致状态转换。

源代码可以以流程图的形式呈现,每个流程图都会衍生出一个状态图。
状态图和流程图的对比

二、基于状态机的鞋子打包实现

1.问题概述

初态:对于单只鞋子的初态可以是top, side, bottom(如下图(a)所示)。对于一双鞋子,其组合理论上有六种(top+top, top+side, top+bottom, side+side, side+bottom, bottom+bottom)。
终态:放置在鞋盒中的标准姿态如下图(b)所示。需要同时考虑鞋子相对于盒子的位姿,还需要考虑第二只鞋子相对于第一只鞋子的位姿,即第一只鞋子的鞋口朝里,第二只鞋子的鞋头和鞋口方向相对于第一只鞋子均为相反方向。

完成此任务需要同时考虑感知、重定向、任务规划器三个方面的设计,由于本文的重心在状态机上,所以我们此处的重心放在基于状态机的任务规划器的设计上,对于感知和重定向简要概述如下。

关于完整的解决方案可以参考文章:
Dong Y, Liu Y, Duan J, et al. Robotic manipulation framework based on semantic keypoints for packing shoes of different sizes, shapes, and softness[J]. Robotics and Autonomous Systems, 2025: 105174.

鞋子打包系统

2.感知和重定向

物体的感知
物体的表示方式包括位姿、关键点和密集表示。位姿表示太单一,不能够满足复杂的操作任务,单纯抓取还可以。密集表示消耗计算资源,导致感知刷新速度变慢。而基于关键点的方法不仅能够适应鞋子的类内和状态间的大差异,还能给我们提供足够的视觉信息用来完成复杂操作。所以,此处我们使用语义关键点的表示方法,如上图(a)所示,用五个关键点(toe, heel, topline, outside, inside)表示鞋子。

结合这五个关键点和鞋子的几何形状,可以推理出鞋子所处的状态(top, side, bottom)和位姿。这些关键点、状态、位姿都是接下来的操作所需要的信息。

物体的重定向
因为鞋子的目标状态为side状态,所以重定向是必须的。对于鞋子而言,最直接的重定向方法如下图Method 1所示,使用toppling原语实现重定向。具体到action,push实现从bottom到side的转换,rotation实现top和side之间的转换。

除了上述直接使用toppling原语的重定向方法,还有一种更为高效的方法。如下图Method 2所示,即利用接触和重力实现物体的重定向。首先,将top状态的鞋子以一定的偏心距放置在边缘上;然后,将夹爪张开缓慢上移;最后,鞋子在重力的作用下会旋转并以side状态掉落在鞋盒内。这种方式巧妙地利用了鞋子与鞋盒的接触,在重力的作用下实现了重定向。

鞋子重定向方法

需要说明的是:第一种重定向方法(Method 1)主要在预放置阶段完成鞋子的重定向,之后还要单独抓取放置鞋子。而第二种重定向方法(Method 2)将重定向和放置阶段融为一体,简化为一个步骤,所以效率更高。但是这种方法只能适用于top状态,而且当其应用于第二只鞋子时,成功率才更高(因为第一只鞋子能够一定程度上阻止第二只鞋子过度翻转)。所以Method 2只能用于top+side的状态组合,其中top作为第二只鞋子放置。

3.任务规划器

因为鞋子的状态是离散的,而且状态之间的转换条件也是可以明确的,所以本项工作十分适合用状态机完成。

根据以上重定向方法,鞋子打包任务可以分为预放置阶段(采取必要的重定向措施)和放置阶段,可以直接进入放置阶段的鞋子状态组合为side+side (inside+outside)和top+side。

那么当出现bottom状态的鞋子时,先执行重定向原语改变其状态。之后状态组合便进入top+side, top+top, side+side三个状态组合。
1)对于top+side状态组合,可以直接使用Method 2重定向方法实现放置打包;
2)对于top+top状态组合,可以采用topppling原语改变任意一只鞋子的状态,就可以进入top+side这样可以直接放置的组合;
3)对于side+side状态组合,还要判断其侧面关键点组合。如果是inside+outside,可以直接放置,如果是两个insides或者outsides,那就得改变一只鞋子的状态,以便于进入top+side的可放置状态组合。

下图就是上述任务规划器的所对应的流程图,与其对应的存在一个状态机的状态转移图,我们可以使用状态机来实现此项任务。状态机通过明确的状态划分和转换规则,将复杂的条件逻辑转化为清晰、模块化的结构,极大地提升了代码的可读性、可维护性和可扩展性,避免了if-else语句带来的嵌套混乱和状态爆炸问题。
鞋子打包任务规划器


总结

本文系统梳理了状态机的核心术语与概念框架,重点推荐了权威的官方学习资源,并通过生动的鞋子打包实例,直观展示了状态机的实际应用场景,帮助读者构建完整的知识体系。


文章转载自:

http://ZumlyxqA.gkfwp.cn
http://6D7OdXy1.gkfwp.cn
http://GeD7Rfgl.gkfwp.cn
http://6fgcN1VB.gkfwp.cn
http://EBPyymfa.gkfwp.cn
http://fk4ErkYO.gkfwp.cn
http://h9RUnLYT.gkfwp.cn
http://PFxZ5WRd.gkfwp.cn
http://v37ZLKJT.gkfwp.cn
http://ZiQgaLzK.gkfwp.cn
http://QmFT3NRE.gkfwp.cn
http://9WWBsS2j.gkfwp.cn
http://1EWDcrZL.gkfwp.cn
http://9lmJPrR7.gkfwp.cn
http://qpcNTunS.gkfwp.cn
http://3qZ34oSK.gkfwp.cn
http://kLPSCpsO.gkfwp.cn
http://3oNydrdB.gkfwp.cn
http://eU6hqShN.gkfwp.cn
http://JgDyF252.gkfwp.cn
http://fiknyrGk.gkfwp.cn
http://FXu4mAim.gkfwp.cn
http://YoE4niOb.gkfwp.cn
http://oyo1D2oe.gkfwp.cn
http://Bp4Izpfg.gkfwp.cn
http://6ByiJGHf.gkfwp.cn
http://NYEWt888.gkfwp.cn
http://Yey0yqJ5.gkfwp.cn
http://tr65XNB8.gkfwp.cn
http://YXPzos8h.gkfwp.cn
http://www.dtcms.com/a/382848.html

相关文章:

  • Grafana与Prometheus实战
  • godot+c#操作godot-sqlite并加解密
  • Scikit-learn 机器学习:构建、训练与评估预测模型
  • React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
  • Java分布式编程:RMI机制
  • 5-12 WPS JS宏 Range数组规范性测试
  • MySQL 的安装、启动、连接(Windows、macOS 和 Linux)
  • (附源码)基于Spring Boot的宿舍管理系统设计
  • Mac下Python3安装
  • C++数组与字符串:从基础到实战技巧
  • 第13课:分布式Agent系统
  • Docker 容器化部署核心实战——Nginx 服务配置与正反向代理原理解析
  • 【分享】中小学教材课本 PDF 资源获取指南
  • 如何用 Git Hook 和 CI 流水线为 FastAPI 项目保驾护航?
  • 安卓旋转屏幕后如何防止数据丢失-ViewModel入门
  • STM32_05_时钟树
  • 元宇宙与体育产业:沉浸式体验重构体育全链条生态
  • LeetCode 每日一题 966. 元音拼写检查器
  • C++密码锁 2023年CSP-S认证真题 CCF信息学奥赛C++ 中小学提高组 第二轮真题解析
  • Vue3 视频播放器完整指南 – @videojs-player/vue 从入门到精通
  • 零售企业数字化转型的道、法、术:基于开源AI大模型AI智能名片S2B2C商城小程序的战略重构
  • 【编号500】(道路分类)广东路网数据广东路网分类数据(2025年)
  • 【PHP7内核剖析】-1.3 FPM
  • 网络编程之UDP广播与粘包问题
  • h3笔记:polygon
  • Unity 性能优化 之 编辑器创建资源优化( 工作流 | 场景 | 预制体)
  • 《Python Web部署应知应会》No3:Flask网站的性能优化和实时监测深度实战
  • 《嵌入式硬件(十):基于IMX6ULL的按键操作》
  • JVM默认栈大小
  • 深度学习实战指南:从神经网络基础到模型优化的完整攻略