Ask Your Question

Can a SMACH state machine be paused and resumed?

asked 2013-04-21 14:20:21 -0500

Pi Robot gravatar image


I've been working through the smach and teer tutorials. Teer appears to make it easy to pause and resume a collection of tasks. I was wondering if there is a way to do something similar in SMACH.

My use case is a robot that is running around the house doing things by executing a SMACH state machine. However, it is also monitoring its battery levels using a SMACH MonitorState. When the battery levels fall too low, the robot should navigate to its docking station, recharge, then resume the execution of the original state machine where it left off.

I can imagine using a global "pause/resume" flag in the main state machine across all its contained states but this doesn't feel very SMACH-like. Does any one know how to implement this kind of pause/resume using SMACH?


edit retag flag offensive close merge delete

2 Answers

Sort by ยป oldest newest most voted

answered 2013-04-21 14:30:24 -0500

jbohren gravatar image

So, it is possible to set the initial state (and userdata) of a SMACH state machine with smach.Container.set_initial_state(). So if your battery monitor preempted the state machine, and you stored the active states of the containers you cared about, you could "resume" from a given state of execution later on. You'd have to do the bookkeeping on your own, but you should be able to get the behavior that you want.

What SMACH really needs is an extension for event-based transitions, and then you could distribute the responsibility of pausing / resuming in each active container.

edit flag offensive delete link more


Many thanks @jbohren. This will definitely get me on the right track.

Pi Robot gravatar image Pi Robot  ( 2013-04-21 15:54:45 -0500 )edit

answered 2016-01-21 10:23:34 -0500

jorge gravatar image

I must say that this is half an answer, half a new question...

I have just learnt about the ActionServerWrapper and I think is the place to go. But you need an extending class to manage request belong currently supported start and cancel. I'm thinking in overloading the goal received callback and inspect the goal for a field like "sm_command" or so containing commands like "start", "pause", "resume", "stop", "set_userdata", etc. Of course, "start" would be just the current behavior of starting the state machine.

Do you think this can be a good idea?

Of course, we still need to implement some pause/resume mechanism, as @jbohren explained. Here I'm just guessing what could be a good external interface!

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools



Asked: 2013-04-21 14:20:21 -0500

Seen: 931 times

Last updated: Jan 21 '16