Python 3.0 Hacks

第3回 turtleモジュールで図と戯れる

この記事を読むのに必要な時間:およそ 3 分

まとめ

プロッティングとイベントハンドリングを駆使することで,チャート描画に用いたり,グラフ理論等の可視化に用いることもできます。対話的に操作できるというのがこのturtleモジュールの特徴でもあります。私の場合,ロボットの経路アルゴリズム動作の可視化などに使っています。

今回は主要機能だけを紹介しました。以下のリファレンスページをご覧いただければ,もう少し凝ったことができます。

おまけ

最後にちょっとお遊びなサンプルを紹介します。ロボット関連開発では実機テストが自由にできる期間が限られるので,動作アルゴリズムの検証にこういったビジュアライザがあると非常に助かります。ここでは,ラジコンカーのシミュレータを作成してみます。ジョイスティックを模した赤い丸をドラッグすることで「車を模した亀」を操縦できます。

リスト6 ラジコンカーシミュレーション

from turtle import *

class Joystick(Turtle):
  def __init__(self, pos=(100,100), radius=50):
    self.input = Vec2D(0,0)
    self.center = Vec2D(*pos)
    self.radius = radius
    super().__init__(shape='circle')
    tracer(0)
    self.penup()
    self.setpos(self.center-(0,self.radius))
    self.pendown()
    self.pen(pensize=3, fillcolor='gray')
    self.circle(self.radius)
    self.penup()
    self.fillcolor('red')
    self.setpos(self.center)
    tracer(1)
    self.target = None
    self.ondrag(self.Drag)
    self.onrelease(self.Release)

  def Release(self, x, y):
    self.setpos(self.center)
    self.input = Vec2D(0.,0.)

  def Drag(self, x, y):
    vec = Vec2D(x,y) - self.center
    if abs(vec)>self.radius:
      vec *= self.radius/abs(vec)
      x, y = self.center + vec
    self.input = (Vec2D(x,y) - self.center)*self.radius**-1
    self.setpos(x,y)

class Cart(Turtle):
  def __init__(self):
    super().__init__(shape='turtle')
    self.speed(0)
    self.velocity = 0.0
    self.handle = 0.0

  def Tick(self, dt):
    distance = self.velocity*dt
    self.forward(50.0*distance)
    self.setheading(self.heading() + 200.0*self.handle*distance)

stick = Joystick()
cart = Cart()

def tick():
  dt = 0.1
  cart.handle = -stick.input[0]
  cart.velocity = stick.input[1]
  cart.Tick(dt)
  ontimer(tick, int(dt*1000))

ontimer(tick)
mainloop()

図5 リスト6の実行結果

図5 リスト6の実行結果

著者プロフィール

入江田昇(いりえだ のぼる)

メカ整備やエレクトロニクス系の業務が長く,ロボットに関わることが多い。国のRTミドルウェアプロジェクトでPythonを強く推した張本人。Python/C++を中心に制御ソフトや業務支援ツールなどをよく作成している。自分でブログシステムを構築し,Pythonに関するサイトを運営しながらWeb系の勉強中。最近はFPGAロジックをPythonで書くのが楽しい。