検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
img_for_tre_tron

Tré Thộn を食べたことがありますか?
ベトナム・ビンズオン滞在中の方は是非注文して食べてみて!
絶対に美味しいです!
ホーチミン市内へも配達可能です。お問い合わせください。

Have you ever had "Tré Thộn" before?
If you're living at Bình Dương in Vietnam, you "must" try to order and eat it.
I'm sure you're very surprised how delicious it is!!
If you're in Hồ Chí Minh, you have a chance to get it too. Please call!!
>>
practical_python_design_patterns

Practical Python Design Patterns - Python で学ぶデザインパターン: The Command Pattern - Part. 1 「第11章: コマンドパターン」の巻 投稿一覧へ戻る

Published 2022年6月20日5:23 by mootaro23

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

Practical Python Design Patterns - Command Pattern 編
「第11章: コマンドパターン」の巻

Chapter 11: Command Pattern
(第11章: コマンドパターン)

I'll be back.
- Terminator
Overview
(概要)
ロボットがやって来ますよーーー!
この章では Python でのロボット制御!?を試してみます。利用するのは Python 組み込みの turtle ライブラリです。このライブラリを利用することで、実際のロボットを用意せずとも「進め」「左へ」「右へ」といったコマンドの発行を「模倣」することができます。でもやっぱり実際に動かしてみたい、という方、ご安心を。この章で学習するコードと Raspberry Pi などの基盤類、そしていくつかのアクチュエータ (actuators) を用意すれば、自分が書いたコードで制御可能な本物のロボットを製作することも可能です!!

Controlling the Turtle
(さあ、ロボットを制御しよう!)

まずは簡単なことから始めましょう。Turtle ライブラリを利用して画面上に四角形を描画してみます:
turtle_basic.py
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) です。上のコードで行っているのは:
Turtle ライブラリをインポートします。
線の色を '青'、領域塗りつぶしの色を '赤' に設定します。
描画の開始地点を記憶します。後々の領域塗り潰しのために必要です。
4辺を描画します。100 の長さの線を描画したら描画の方向を左へ 90度回転させる、という動きを4回繰り返します。
ポリゴンを赤で塗り潰します。
処理が終了してもプログラムを終了させずスクリーンを表示したままにします。
もし 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 ポートを介して伝えられていますが、これが遠隔地からの電波等で送られてくるシグナルであり、それを受信・解析するプログラムによって自動車が遠隔運転される、と考えれば、まさにここで我々が記述したコードと同様のものであるはずです。つまり、これと同じようなコードでロボットの遠隔操作も可能である、ということになります。
要するに、システムを構成するあるパートから別のパートへコマンドを送信している、ということです。