この章では Python でのロボット制御!?を試してみます。利用するのは Python 組み込みの turtle ライブラリです。このライブラリを利用することで、実際のロボットを用意せずとも「進め」「左へ」「右へ」といったコマンドの発行を「模倣」することができます。でもやっぱり実際に動かしてみたい、という方、ご安心を。この章で学習するコードと Raspberry Pi などの基盤類、そしていくつかのアクチュエータ (actuators) を用意すれば、自分が書いたコードで制御可能な本物のロボットを製作することも可能です!!
まずは簡単なことから始めましょう。Turtle ライブラリを利用して画面上に四角形を描画してみます:
import turtle
turtle.color('blue', 'red')
turtle.begin_fill()
for _ in range(4):
turtle.forward(100)
turtle.left(90)
turtle.end_fill()
turtle.done()
Turtle はロボットの動きを可視化するのに役立つ単純な「線描画・領域塗り潰し」ツール (line-and-fill tool) です。上のコードで行っているのは:
もし Ubuntu システムを利用していて python3-tk に関するエラーメッセージが出た方はパッケージのインストールが必要です:
sudo apt-get install python3-tk
プログラムを実行してみてください。Turtle (小さな三角形) が動き回って四角形が描画されましたか?
スクリーン上に線や図形を描画するだけであればこのようなプログラムで十分ですが、turtle は我々の「ロボット」の象徴 (メタファー) に過ぎませんから、いくら綺麗でも図形だけ描画していてはあまり役に立ちません。そこでこの「ロボットコントロール」スクリプトを拡張して4つのコマンドを受け付けるようにしましょう。それぞれのコマンドは、「開始 (start)」「終了 (stop)」「左 10 度 (left 10 degrees)」「右 10 度 (right 10 degrees)」です。そしてそれぞれのコマンドをキーボードのキーに割り当てるようにします:
import turtle
turtle.setup(400, 400)
screen = turtle.Screen()
screen.title('キーボードを使った描画')
t = turtle.Turtle()
distance = 10
turn_degrees = 10
def advance():
t.forward(distance)
def turn_left():
t.left(turn_degrees)
def turn_right():
t.right(turn_degrees)
def retreat():
t.backward(distance)
def quit():
screen.bye()
screen.onkey(advance, 'w')
screen.onkey(turn_left, 'a')
screen.onkey(turn_right, 's')
screen.onkey(retreat, 'z')
screen.onkey(quit, 'Escape')
screen.listen()
screen.mainloop()
ここで実行したことの本質は、turtle をコントロールするインターフェースを構築した、ということにほかなりません。現実世界に当てはめてみれば、左折、右折、加速、減速という4つのシグナルを受信する遠隔操作自動車用のインターフェースと言えるでしょう。
この turtle 操作プログラムでは、コントロールシグナルはキーボードから発生し USB ポートを介して伝えられていますが、これが遠隔地からの電波等で送られてくるシグナルであり、それを受信・解析するプログラムによって自動車が遠隔運転される、と考えれば、まさにここで我々が記述したコードと同様のものであるはずです。つまり、これと同じようなコードでロボットの遠隔操作も可能である、ということになります。
要するに、システムを構成するあるパートから別のパートへコマンドを送信している、ということです。