こんにちは。
久々にProgramming Robots with ROSの13章「On Patrol」を読んでいたら、ROSでのState Machineの実装が載ってたので、概要をメモ。
一般的なステートマシンの状態遷移図がFigure13-1に書いてありました。
ROSでステートマシンを実装するには、smachというパッケージが使えます。
2つのステート(OneとTwo)で、各ステートに遷移するタイミングでone かtwoを表示し、もう一方のほうのステートに遷移する、というサンプルプログラムの説明がありました。
サンプルはこんなかんじ。
とりあえずROSでstateの使い方をまとめてみた。わりと楽ですね。
久々にProgramming Robots with ROSの13章「On Patrol」を読んでいたら、ROSでのState Machineの実装が載ってたので、概要をメモ。
State Machines
一般的なステートマシンの状態遷移図がFigure13-1に書いてありました。
状態が変わるイベントが発生したら次の状態に遷移しますよ、と。
State Machines in ROS
ROSでステートマシンを実装するには、smachというパッケージが使えます。
smach使う際には1点注意点があります。
Pythonで書かれているので、パフォーマンスが要求されるケースではあまり使わないほうがいいかもとのこと。
Defining State Machines with smach
2つのステート(OneとTwo)で、各ステートに遷移するタイミングでone かtwoを表示し、もう一方のほうのステートに遷移する、というサンプルプログラムの説明がありました。
サンプルはこんなかんじ。
#!/usr/bin/env python import rospy from smach import State, StateMachine from time import sleep class One(State): def __init__(self): State.__init__(self, outcomes=['success']) def execute(self, userdata): print 'one' sleep(1) return 'success' class Two(State): def __init__(self): State.__init__(self, outcomes=['success']) def execute(self, userdata): print 'two' sleep(1) return 'success' if __name__ == '__main__': sm = StateMachine(outcomes=['success']) with sm: StateMachine.add('ONE', One(), transitions={'success':'TWO'}) StateMachine.add('TWO', Two(), transitions={'success':'ONE'}) sm.execute()
注意点は以下。
- State, StateMachineをimportする。
from smach import State, StateMachine
- package.xmlを修正して、smachが使えるようにする。
- それぞれのStateで、親クラスのConstructorを呼ぶ。
- それぞれのStateでexecute(self, userdata) functionを実装する。
- main文で、with statementの中で各stateをaddし、executeを実行する。
まとめ
とりあえずROSでstateの使い方をまとめてみた。わりと楽ですね。
かいてみたもののわかりにくいから後でサンプルも貼る。->貼った。
0 件のコメント:
コメントを投稿