- 追加された行はこの色です。
- 削除された行はこの色です。
[[2016a/Member]]
#contents
*はじめに [#b63fd33b]
今回の課題は絵を描くロボットを作成すること。~
今回の課題は絵を描くロボットを作成することです。~
具体的にはA4サイズの紙に自分の顔を描くロボットのプログラムを作ること。~
またできるだけ単純なプログラムで顔を描くこと。~
*ロボットの説明 [#za3a3534]
&ref(robot21.jpg);~
ペンはロボットのアームに輪ゴムとテープで固定しました。~
アームの軸となる棒を回転させることによりペンを矢印の方向に動かします。
*プログラムの説明およびロボットの動作 [#f1aa0b82]
#usr/bin/python
import ev3dev.ev3 as ev3
import time
**モータの設定 [#n9c604a9]
motor_left = ev3.LargeMotor('outA')
motor_right = ev3.LargeMotor('outB')
motor_front =ev3.MediumMotor('outC')
左側のタイヤを動かすモーターを出力A~
右側のタイヤを動かすモーターを出力B~
ペンの上げ下げを行うモーターを出力C~
に設定する。
**ロボットの動きとペンの動きを制御する。 [#le03b4dd]
def forward(t,dl,dr):
motor_left.run_forever(duty_cycle_sp=dl)
motor_right.run_forever(duty_cycle_sp=dr)
time.sleep(t/1000)
motor_left.stop()
motor_right.stop()
ここでロボットの動きを定義する。~
この文字列では今後ロボットの発進から停止までの動きを簡単に入力するために数字を文字に置き換える。~
左右モーターの出力を変えることにより、ロボットの前後左右の動きを制御する。
左右モーターの出力を変えることにより、ロボットの前後左右の動きをコントロールする。
def pen(t,df):
motor_front.run_forever(duty_cycle_sp=df)
time.sleep(t/1000)
motor_front.stop()
ここでペンの上げ下げを定義する。~
**顔を描く [#fc895a0a]
pen(1000,-38) //ペン下げ
forward(1000,15,15) //目
pen(1000,50) //ペン上げ
forward(1000,15,15)
time.sleep(1)
pen(1000,-38) //ペン下げ
forward(1000,15,15) //目
pen(1000,50) //ペン上げ
forward(1000,15,15)
time.sleep(1)
forward(1000,10,20)
forward(1000,-17,-17)
time.sleep(1)
pen(1000,-38) //ペン下げ
forward(1000,-30,10) //鼻
forward(1000,-25,-25)
pen(1000,50) //ペン上げ
forward(1000,25,12)
pen(1000,-38) //ペン下げ
forward(1000,15,5) //顔の輪郭
pen(1000,50) //ペン上げ
ロボットは動くにつれて誤差が大きくなるので目などの細かいパーツを先に書き、最後に顔の輪郭を書きました。
exit() //プログラム終了
*結果 [#eab7c99a]
似顔絵は描くのに失敗しました。~
原因は顔の大きさを考えていなかったため、A4サイズの紙からはみだしたり、タイヤが紙の端に引っかかってしまった事です。~
そのため紙の位置がずれてしまい顔の形を保つことができませんでした。~
顔を描いた紙は失敗したため廃棄してしまいました。
*考察・感想 [#z982c2e3]
人の顔は複雑な形をしているが今回のプログラムでは
今回プログラムを作るときに注意したのは、できるだけ顔の形を崩さないようにすることです。そのため、顔を描く順番は目・鼻など細かいところを先に書くようにしました。しかし、うまく書くことができませんでした。また、自分の口が最後に修正したプログラムに入っていなかったことは一番の失敗です。~
今回のプログラムでは def forward(t,dl,dr) を使い、この一つの式で発進から停止までコントロールしました。その結果、式が単純化・文字数が減少したことによってミスが減り、誤差を修正するのも楽になりました。