From c5dde45f763f0242df9dbf92fa21d21b375091f6 Mon Sep 17 00:00:00 2001 From: saudag Date: Mon, 2 Dec 2024 10:52:47 -0500 Subject: [PATCH] Team D: SMACH Library --- _data/navigation.yml | 2 + wiki/programming/assets/FSM.png | Bin 0 -> 38222 bytes wiki/programming/smach-library.md | 130 ++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 wiki/programming/assets/FSM.png create mode 100644 wiki/programming/smach-library.md diff --git a/_data/navigation.yml b/_data/navigation.yml index a380856f..f338a1cc 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -200,6 +200,8 @@ wiki: url: /wiki/programming/tutorials-resources/ - title: Python Construct url: /wiki/programming/python-construct/ + - title: SMACH Library + url: /wiki/programming/smach-library/ - title: Networking url: /wiki/networking/ children: diff --git a/wiki/programming/assets/FSM.png b/wiki/programming/assets/FSM.png new file mode 100644 index 0000000000000000000000000000000000000000..a68cb6674cef59ec49f5f1f3fab0984d851b1d5f GIT binary patch literal 38222 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 ZbE+Ry>zOuTQ2@0TWDU22Ra$r@`~@7?8%h8G literal 0 HcmV?d00001 diff --git a/wiki/programming/smach-library.md b/wiki/programming/smach-library.md new file mode 100644 index 00000000..09cf02e4 --- /dev/null +++ b/wiki/programming/smach-library.md @@ -0,0 +1,130 @@ +--- +# Jekyll 'Front Matter' goes here. Most are set by default, and should NOT be +# overwritten except in special circumstances. +# You should set the date the article was last updated like this: +date: 2024-02-12 # YYYY-MM-DD +# This will be displayed at the bottom of the article +# You should set the article's title: +title: SMACH Library Overview +# The 'title' is automatically displayed at the top of the page +# and used in other parts of the site. +--- + +This article provides a comprehensive overview of the SMACH library, which stands for "state machine," a foundational concept in robotics and automation. A Finite State Machine (FSM) is a mathematical model used to represent and manage a system's state transitions. It consists of a defined set of states, including the initial and current states, as well as inputs or events that trigger transitions between these states. In the context of robotics, FSMs are crucial for enabling robots to perform sequences of actions and respond dynamically to changes in their environment. + +SMACH is a powerful and versatile task-level architecture designed to simplify the creation of complex robotic behaviors. While it is often used in conjunction with the Robot Operating System (ROS), SMACH is a ROS-independent Python library. This flexibility allows developers to use it across various robotic platforms. One of the defining features of SMACH is its ability to construct hierarchical state machines, enabling developers to break down complex behaviors into simpler, more manageable components. This hierarchical structure helps ensure that high-level tasks are achieved by coordinating a series of smaller, well-defined sub-tasks. + +SMACH leverages well-established principles of software engineering to provide a framework that supports rapid development of robust, maintainable, and modular robotic systems. The library's modularity allows developers to create reusable components, making it easier to adapt and scale robotic systems as project requirements evolve. Furthermore, SMACH emphasizes maintainability by providing a clean and organized structure for defining and managing states and transitions, reducing the likelihood of errors and making it easier to troubleshoot and debug systems. + +In this article, we will briefly explain how to use the SMACH library with ROS to design, implement, and test state machines for robotic applications. By following the concepts and examples provided, readers will gain insights into the capabilities of SMACH and learn how to integrate it into their own robotic projects to achieve sophisticated, task-level behaviors. + +## Key Features +* Hierarchical State Machines: SMACH offers a robust framework for designing and implementing hierarchical state machines, which are particularly well-suited for managing complex behaviors. By structuring states and transitions in a clear and organized manner, SMACH allows developers to break down intricate systems into manageable layers. This hierarchical approach simplifies the implementation of sophisticated systems by ensuring that high-level behaviors are composed of simpler, more focused sub-behaviors. + +* Modularity and Maintainability: One of the core strengths of SMACH lies in its emphasis on modularity and maintainability. The library encourages developers to write modular code that can be easily maintained and reused. This design philosophy makes it possible to build complex systems by integrating smaller, independent modules seamlessly. As a result, developers can focus on developing each component in isolation and later assemble them into a cohesive system, reducing the risk of errors and increasing code maintainability over time. + +* Rapid Prototyping: SMACH's straightforward, Python-based syntax enables developers to quickly prototype and test state machines. This ease of use is especially advantageous for iterative development and experimentation, where rapid feedback loops are essential. Developers can create, modify, and refine state machines efficiently, accelerating the development process and allowing more time to focus on fine-tuning the system's performance and functionality. + +* Introspection Tools: SMACH provides a suite of powerful introspection tools that are invaluable for monitoring and debugging state machines. These tools allow developers to observe state transitions, track data flow between states, and gain a comprehensive understanding of the overall system's behavior. By offering real-time insights into the internal workings of the state machine, these introspection tools help identify and resolve issues quickly, ensuring that the system performs as intended. + +## Use Cases +SMACH is a powerful tool particularly suited for scenarios where robots are required to execute complex, predefined plans consisting of explicitly defined states and transitions. It shines in applications where robotic systems, such as mobile robotic manipulators, must handle coordinated task execution in a structured and predictable manner. By organizing tasks into hierarchical state machines, SMACH provides a robust framework for managing behaviors and ensuring smooth execution of intricate workflows. Its compatibility with Python and integration with ROS make it a convenient choice for developers working on mid- to high-level robot control systems. + +### When to use SMACH +* Structured Tasks: SMACH is most effective in environments where tasks can be distinctly defined and organized into well-structured states and transitions. For instance, it is ideal for use in robotic systems tasked with repetitive or step-by-step processes, such as automated assembly lines, logistics, or service robots performing routine tasks. +* Complex Systems: SMACH is highly suitable for managing large-scale hierarchical state machines in robotic applications. It enables developers to design, maintain, and debug complex systems with multiple interdependent modules, ensuring that the overall system remains modular, manageable, and scalable. The introspection tools provided by SMACH further enhance its usability by offering a clear view of state transitions and data flow, facilitating debugging and optimization. + +### When not to use SMACH +* Unstructured Tasks: For robotic systems operating in unstructured or highly dynamic environments where tasks lack a clear definition or require constant adaptation, SMACH may not be the ideal choice. In such cases, more flexible frameworks or learning-based approaches may be better suited to handle the inherent uncertainty and variability. +* Low-Level Systems: SMACH is not designed for low-level control tasks where real-time performance and high efficiency are crucial. Tasks such as motor control, sensor data processing, or other time-sensitive operations often require lightweight, real-time-capable solutions that are optimized for performance, making SMACH less suitable in such scenarios. + +While SMACH can be used to build finite state machines, its capabilities extend beyond that. It provides various "state containers" that can encapsulate other state machines or be part of larger containers themselves. This flexibility allows developers to construct intricate systems with nested state hierarchies + +## Writing a Simple State Machine +![FSM](assets/FSM.png) + +The above image describes a state machihne which has three main states - Finding_Cornstalk, Cleaning_Calibrating and Insertion. The outcome of each state is the flag indicating the transition to the next state. The State Machine starts with Finding_Cornstalk state and ends when the output of any state is 'Stop'. Below is a skeleton code of how this state machine programming will look like - + +``` +# define state Finding_Cornstalk +class finding_cornstalk(smach.State): + def __init__(self): + smach.State.__init__(self, outcomes=['cleaning_calibrating']) + + def execute(self, userdata): + rospy.loginfo('Executing state Finding_Cornstalk') + return 'cleaning_calibrating' + + +# define state Cleaning_Calibrating +class cleaning_calibrating(smach.State): + def __init__(self): + smach.State.__init__(self, outcomes=['insertion','replace']) + self.counter = 0 + + def execute(self, userdata): + rospy.loginfo('Executing state Cleaning_Calibrating') + if self.counter < 3: + self.counter += 1 + return 'insertion' + else: + return 'replace' + +# define state Insertion +class insertion(smach.State): + def __init__(self): + smach.State.__init__(self, outcomes=['replace']) + + def execute(self, userdata): + rospy.loginfo('Executing state Insertion') + return 'replace' + + + + def main(): + rospy.init_node('smach_example_state_machine') + + # Create a SMACH state machine + sm = smach.StateMachine(outcomes=['stop']) + + # Open the container + with sm: + # Add states to the container + smach.StateMachine.add('finding_cornstalk', finding_cornstalk(), + transitions={'cleaning_calibrating':'cleaning_calibrating'}) + smach.StateMachine.add('cleaning_clibrating', cleaning_calibrating(), + transitions={'insertion':'insertion', 'replace':'stop'}) + smach.StateMachine.add('insertion', insertion(), + transitions={'insertion':'stop'}) + + + # Execute SMACH plan + outcome = sm.execute() + +if __name__ == '__main__': + main() +``` + +### Code Breakdown +* A state machine is created with smach.StateMachine, and the final outcome is defined as stop. +Three states (Finding_Cornstalk, Cleaning_Calibrating, and Insertion) are added to the state machine: +Transitions define how the states flow into each other: +Finding_Cornstalk → Cleaning_Calibrating +Cleaning_Calibrating → Insertion (up to 3 times) or stop +Insertion → stop. +* The main() function initializes the ROS node and executes the state machine plan (sm.execute()). +The workflow begins in the Finding_Cornstalk state and progresses through the defined states based on the transitions. +* The robot starts in the Finding_Cornstalk state and transitions to Cleaning_Calibrating. +In Cleaning_Calibrating: +It transitions to Insertion for up to 3 cycles. +After 3 cycles, it transitions to stop. +The Insertion state executes once, and the robot stops. + +## Conclusion +SMACH's documentation provides comprehensive guidance on its concepts and usage. The tutorials available are extensive, designed to help users quickly get up to speed with building and running their own state machines. These resources are invaluable for both beginners and experienced developers looking to leverage SMACH's capabilities in their projects. +SMACH stands out as a powerful tool in the ROS ecosystem for developing complex robotic behaviors through hierarchical state machines. Its emphasis on modularity, maintainability, and rapid prototyping makes it an attractive option for developers working on sophisticated robotic applications. However, its use is best suited for structured tasks at the task level rather than low-level system control or highly unstructured environments. + +## References +- [SMACH Library](https://wiki.ros.org/smach) +- [SMACH Documentation](https://wiki.ros.org/smach/Documentation) +- [State Machine Example](https://wiki.ros.org/smach/Tutorials/Simple%20State%20Machine) \ No newline at end of file