ポール課題

モード(状態遷移)を利用したプログラム

ここまでのプログラムでは,センサーの値に応じて,すぐに振る舞いを変えるというようなものが多かったと思います.


while True:
    sensor = センサー値を取得

    if sensor>閾値:
        action_A()
    else:
        action_B()

しかし,複雑になると,状態遷移という考え方でプログラムを書いていかなければなりません.例えば,赤と青のポールの間を往復するロボットを考えてみましょう.赤から青に向かっている間は青のポールを目指して動き,青に近づいたら赤のポールを目指して動くことになります.このようなプログラムはどのように書くことができるでしょうか?

ロボットに複雑な動きをさせるときに使う、最も一般的な方法は状態機械(state machine)を定義する方法です。状態機械は、いくつかの「状態」と「状態間の遷移」で構成されます。

上記の赤と青のポールの間を行き来するロボットの場合には,状態遷移図は以下のようになります.

このようなプログラムはどのように書けば良いでしょうか? 一つの方法として,以下のように書くことができます.


state = 0  # 0: 赤から青,  1: 青から赤
while True:

    img = 画像取得()
    赤色ポールの位置情報 = 赤色認識(img)
    青色ポールの位置情報 = 青色認識(img)

    if state==0:
        青いポールを目指す()

        if 距離を計算(青いポールの位置情報) < 閾値:
            state = 1

    elif state==1:
        赤いポールを目指す()

        if 距離を計算(赤いポールの位置情報) < 閾値:
            state = 0

より複雑な状態遷移を行う場合には、さらにクラスを定義してプログラムを分割して書くことになりますが、大まかには、上記のような構造で状態に応じたプログラムが動き、状態遷移によって動くモードが変化するようになっていると考えるとよいでしょう。

課題

  1. その場で回転して、ポールが正面に来たら止まるプログラムを作ってください.

  2. ポールまでまっすぐ進み、ポールの手前で止まるプログラムを作ってください.

    • まっすぐ進むにはいろいろな方法があります.
      • 左右の車輪のスピードの命令の左右差を調整する
      • 一定の距離を進むごとに、ポールが正面に来るように左回転・右回転する
  3. ポールまで行ったらポールの周りをまわって、帰ってくるプログラムを作ってください.

    • 最初の位置は別のポールを色をおいても構いません.