uleroboticsgroup / yasmin

YASMIN (Yet Another State MachINe)
GNU General Public License v3.0
130 stars 25 forks source link

Change state from one to another with a service call? #20

Open Devansh1902 opened 3 months ago

Devansh1902 commented 3 months ago

how can user change state from foo to bar using a service call please help

mgonzs13 commented 2 months ago

Hi @Devansh1902, you can create an idle state that waits for service requests and change to another state when a request is received. Is this what you want?

Devansh1902 commented 2 months ago

Yes lets say foo state is the start state and from foo i want to go to bar with a service call and when in bar state also the transition should happen from another service call to change the state back to foo

mgonzs13 commented 2 months ago

So, in that case, should both states have a service or do you want only one service? For the first case, a new ROS 2-based state can be created, similar to the action and service client states.

Devansh1902 commented 2 months ago

Only one service in the default state and from that default state user can do a service call to change the state and then stay in the state till another service call comes to go back to default state

mgonzs13 commented 2 months ago

You can create a node with a service that controls the switch between the states by using a variable on the blackboard. So the states should wait for the service call.

Devansh1902 commented 2 months ago

please explain this line of code std::string outcome = (*sm.get())();

mgonzs13 commented 2 months ago

StateMachine object is got from the pointer and its operator () is called which returns an outcome.

Devansh1902 commented 2 months ago

i have several states but one is default one :

auto sm = std::make_shared(yasmin::StateMachine({""})); // add states sm->add_state("Standby", std::make_shared(), {{"outcome0", "Standby"}, {"outcome1", "manual"}, {"outcome2", " teleop"}, {"outcome3", "assisted"}, {"outcome4", "convoy"}, {"outcome5", "waypoint"}}); sm->add_state("manual", std::make_shared(), {{"outcome6", "Standby"}}); sm->add_state("teleop", std::make_shared(), {{"outcome10", "Standby"}}); sm->add_state("assisted", std::make_shared(), {{"outcome7", "Standby"}}); sm->add_state("convoy", std::make_shared(), {{"outcome8", "Standby"}}); sm->add_state("waypoint", std::make_shared(), {{"outcome9", "Standby"}}); // execute std::string outcome = (*sm.get())(); there is no end to this state machine, can we trigger service call and change states from an external interface

mgonzs13 commented 2 months ago

You should add an outcome to your state machine: auto sm = std::make_sharedyasmin::StateMachine(yasmin::StateMachine({"End"}));

Then, you can add a transition from your Standby state to that outcome ({"outcome6", "End"}).

Devansh1902 commented 2 months ago

sorry i didnt got you. for what we ll use the end ?

mgonzs13 commented 2 months ago

You have to add the final outcomes of the state machine, similar to the states, for instance, "End". Check the demo.