2016年12月26日月曜日

【Book】 Programming Robots with ROS Chapter13: ROSのStateMachinesについて

こんにちは。

久々に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 件のコメント:

コメントを投稿