2019b/Member

課題1:お絵かきロボット

詳細

ロボットの説明

今回、動作確認等に時間がかかったのと授業時間外でロボットを触る時間があまり取れなかったため、ロボットにはあまり工夫することができなかった。

robot

ペンを両側から固定した。ペンは筆圧のあまり関係ないボールペンを使用した。

プログラムの説明

今回は、Pythonのタートルグラフィックスで書いた物をプログラムそのまま(最初の一文のfrom turtle import*等一部を除く)でロボットに書かせることを目標とした。

ペンの上げ下げ

penup()、pendown()という関数を製作した
ペンを上げる時は正の速度(5)、下げるときは負の速度(-5)でモーターを30度動かしている。

from ev3dev2.motor import MediumMotor OUTPUT_A

motor_arm = MediumMotor(OUTPUT_A)


def penup():
    motor_arm.for_on_degrees(5,30)

def pendown():
    motor_arm.for_on_degrees(-5,30)

前進、後退

前進:forward(距離)、後退:backward(距離)の関数を製作
forward(150)を速度=30(正の速度で前進方向)でタイヤが一回転するとした

from ev3dev2.motor import MoveTank OUTPUT_B,OUTPUT_C

tank_drive = MoveTank(OUTPUT_B,OUTPUT_C)


def forward(a):
    tank_drive.for_on degrees(30,30,int(a)/150*360)

def backward(b):
    tank_drive.for_on_degrees(-30,-30,int(b)/150*360)

右左折

left(角度)、right(角度)の関数を製作
一連の動作:ペンを上げる→前進する→右(左)に曲がる→後退する→ペンを下げる
左回転の場合、右タイヤ速度=30、左=-30、角度685度で一回転したので、曲がりたい角度×360÷685度曲がることで曲がるようにした。
また、曲がったときペン先が曲がる前の位置とズレが生じるため、前進して曲がった後に後退する機構にした。

move

先っぽの黒点がペン先

def left(c):
    penup()
    forward(70)
    tank_drive.on_for_degrees(30,-30,int(c)/360*685)
    backward(60)
    pendown()
def right(d):
    penup()
    forward(70)
    tank_drive.on_for_degrees(-30,30,int(d)/360*685)
    backward(60)
    pendown()

turtle graphicsでのデザイン

turtle graphicsについてや仕様は割愛する
都合上最初にgotoやsethを使用しているが、ロボットで動かす際は手動で行えば良いのでそちらでは省いている。開始地点は左上。

from turtle import*

penup()
goto(-100,100)
pendown()

#輪郭
seth(270)
forward(150)
left(55)
forward(110)
left(70)
forward(110)
left(55)
forward(150)

#目の始点に移動
penup()
backward(40)
left(90)
forward(20)
#目
pendown()
forward(50)
penup()
forward(40)
pendown()
forward(50)

#鼻の始点に移動
penup()
backward(70)
left(90)
forward(40)
pendown()
#鼻
forward(30)
left(45)
forward(15)

#口の始点に移動
penup()
right(135)
forward(40)
left(90)
forward(40)
left(90)
pendown()

#口
for i in range(5):
    forward(20)
    left(10)

mainloop()
done()

上を動かした物(jupyter notebook使用)

turtle

実際のプログラム

from ev3dev2.motor import MoveTank, MediumMotor, OUTPUT_A, OUTPUT_B, OUTPUT_C

tank_drive = MoveTank(OUTPUT_B,OUTPUT_C) 
motor_arm = MediumMotor(OUTPUT_A)

#関数の定義
def penup():
    motor_arm.for_on_degrees(5,30)

def pendown():
    motor_arm.for_on_degrees(-5,30)

def forward(a):
    tank_drive.for_on degrees(30,30,int(a)/150*360)

def backward(b):
    tank_drive.for_on_degrees(-30,-30,int(b)/150*360)

def left(c):
    penup()
    forward(70)
    tank_drive.on_for_degrees(30,-30,int(c)/360*685)
    backward(60)
    pendown()

def right(d):
    penup()
    forward(70)
    tank_drive.on_for_degrees(-30,30,int(d)/360*685)
    backward(60)
    pendown()

#ここから絵を描くプログラム
forward(150)
left(55)
forward(110)
left(70)
forward(110)
left(55)
forward(150)

penup()
backward(40)
left(90)
forward(20)
pendown()
forward(50)
penup()
forward(40)
pendown()
forward(50)

penup()
backward(70)
left(90)
forward(40)
pendown()
forward(30)
left(45)
forward(15)

penup()
right(135)
forward(40)
left(90)
forward(40)
left(90)
pendown()

for i in range(5):
    forward(20)
    left(10)

書き始めは左上の線なので、ロボットの初期方向は下向き(タートルグラフィックスのsethで言うところの270の向き)になっている。

結果と反省

e

停止時に緩やかな減速をさせる等の設定をしていなかった為、急ブレーキが掛かり線がブレてしまった。また、ターンするときの前進と後退の距離は、電池残量で大きく変わってしまうようで、設定時には正確だったが絵を描くときには少しズレてしまった。 ループ文を使って書いた曲線(口)は、思っていたよりも曲線になっていて安心した。
ターン等について得たことを、2つめ以降の課題で生かしたい。


添付ファイル: filerobot.jpg 24件 [詳細] filee.jpg 26件 [詳細] filemove.gif 27件 [詳細] fileturtle.png 24件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-02-13 (木) 17:50:42