- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*はじめに [#x70dfc76]
課題はA4サイズの紙に収まる大きさの似顔絵を描くお絵かきロボットの作成である.~
*ロボットの説明 [#dd7d14cc]
#ref(DSC_0396.jpg)
私たちの班ではEV3を使用した~
#ref(DSC_0397.JPG)
上記の写真の右側を前方とし、機体を後方から見たとき左のタイヤのモーターをA、右のタイヤのモーターをBに接続した.そして、前方に取り付けたMediumMotorをCに接続した.ペンを上げ下げするのはCに接続したモーターで前方のアームを上下運動させる.~
反省点として、ペンの固定がうまくいかず、結局輪ゴムとセロテープでつけるだけになってしまった.~
*ロボットの動作・プログラミングの説明 [#h6098d3b]
ロボットで似顔絵を描かすために必要な主な動作として以下があげられる.~
・ペンを上げ下げする.~
・ロボット本体が前進、後退する.~
・ロボット本体が回転する.~
これらの動作を使って顔を描かせようと思う.~
#!/usr/bin/python
import ev3dev.ev3 as ev3
import time
motor_left = ev3.LargeMotor('outA')
motor_right = ev3.LargeMotor('outB')
motor_front = ev3.MediumMotor('outC')
motor_left = ev3.LargeMotor('outA') //左側のモーター
motor_right = ev3.LargeMotor('outB') //右側のモーター
motor_front = ev3.MediumMotor('outC') //ペンを上げ下げするモーター
簡単にロボットを動かすために「ロボットの前進、後退」、「ペンの上げ下げ」を簡単に呼び寄せるように定義をする.
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()
ここでの(t,dl,dr)は(機体の動く時間、左モーターの出力、右モーターの出力)である.このとき、tは1/1000秒であることに注意する.
def pen(t,df):
motor_front.run_forever(duty_cycle_sp=df)
time.sleep(t/1000)
motor_front.stop()
上記と同様に、(t,df)は(機体の動く時間、前方に取り付けたモーターの出力)を意味する.ここでも、tは1/1000秒であることに注意する.また、ペンを下ろすときのモーターは逆向きになっていたのでーをつけて表した.
*顔を描く [#d8a83f97]
ここで時間tは1/1000で表示されることに注目する.~
また、forwardのモーターの出力についた−記号がついたものはモーターの逆回転、つまり機体の後退を意味する.~
**顔のパーツを書く [#l71ea1e8]
顔のパーツを書き始める際、なるべくプログラムが少ない回数で行えるようにペンを置き、書き終えたところから簡単に次のパーツの書き始めへと移れるように注意した.
pen(1000,-38)
time.sleep(2)
forward(1000,-15,15)
forward(1000,-15,15) //口の曲線
pen(1000,50)
time.sleep(1)
forward(1000,-12,-17)
time.sleep(2)
pen(1000,-38)
time.sleep(2)
forward(1000,-12,-12)
forward(1000,-12,-12) //鼻の下の直線
time.sleep(1)
forward(1000,-20,0)
forward(1000,-20,0) //鼻の上側の曲線
pen(1000,50)
forward(2000,25,25)
forward(1000,-26,26)
forward(1000,-30,-30)
pen(1000,-38)
forward(1000,-15,-15)
forward(1000,-15,-15) //右目の直線
time.sleep(1)
pen(1000,50)
forward(1000,-15,-15)
pen(1000,-38)
forward(1000,-15,-15)
forward(1000,-15,-15) //左目の直線
time.sleep(1)
**顔の輪郭線を書く [#naabbfba]
上記で書いた顔のパーツが全て入り込むように目の外側から、なめらかな曲線を描きちょうど口の下にあご先がくるように調整を重ねることで顔の輪郭線を描いた.また、顔のパーツが斜めにずれていたので、あえて顔の左側の輪郭線を途中で切ることによって顔の輪郭線を仕上げた.
pen(1000,50)
forward(1000,35,35)
pen(1000,-38)
forward(1000,28,-36)
forward(1000,28,-36) //右側の顔の輪郭線
time.sleep(1)
forward(1000,-18,-25)
forward(1000,-18,-25) //左側の顔の輪郭線
pen(1000,50)
**髪の毛を書く [#z41a8d18]
髪の毛を顔の輪郭線とつなげること、また目とかぶらないようにすることが難しく髪の毛を直線によって描くことにした.毎回、髪の毛を書くのに角度変更をするため、誤差が生まれやすいが髪の毛を直線で表すことにより誤差をあまり気にせずに描くことが出来た.
forward(1000,0,90)
time.sleep(1)
forward(1000,-50,-50)
pen(1000,-38)
forward(1000,30,30)
forward(1000,30,30) //髪の毛1本目
pen(1000,50)
forward(1000,35,0)
time.sleep(1)
forward(1000,-17,-17)
pen(1000,-38)
forward(1000,-30,-30)
forward(1000,-30,-30) //髪の毛2本目
time.sleep(1)
pen(1000,50)
forward(1000,-10,-10)
time.sleep(1)
forward(1000,0,-18)
time.sleep(1)
forward(1000,16,16)
pen(1000,-38)
forward(1000,20,20)
forward(1000,20,20) //髪の毛3本目
pen(1000,50)
forward(1000,-20,-20)
time.sleep(1)
forward(1000,-15,15)
time.sleep(1)
forward(1000,-20,-20)
forward(1000,25,25)
pen(1000,-38)
time.sleep(1)
forward(1000,25,25)
forward(1000,25,25) //髪の毛4本目
pen(1000,50)
forward(1000,-27,27)
time.sleep(1)
forward(1000,-18,-18)
pen(1000,-38)
forward(1000,-25,-25)
forward(1000,-25,-25) //髪の毛5本目
time.sleep(1)
pen(1000,50)
forward(1000,15,-10)
time.sleep(1)
pen(1000,-38)
forward(1000,18,18)
forward(1000,18,18) //髪の毛6本目
time.sleep(1)
pen(1000,50)
exit()
*顔を描く [#d8a83f97]
exit() //終了
**顔の完成 [#g0de7157]
#ref(DSC_0400.jpg)
*感想・考察 [#u82222bd]
最初なかなか動かすことすら出来ず、行き詰まっていたが講師の松本先生や同じ班の仲間、また同じEV3を使用し悪戦苦闘していた仲間たちとの協力でEV3が動いたときは感無量であった.一度動かし始めるとプログラムを組めるようになるまでそう時間はかからなかった.ただ、今回ペンをうまく取り付けることが出来なかったことが悔やまれる.ペンにもっと軽量なものを使用し、部品をつなぎ合わせることでうまく取り付けられたのではと思う.また、髪の毛が一本、紙の外側にはみ出してしまった.誤差をもっと考慮に入れ、何度も検証することが必要であった.~
ただ、今回でEV3のプログラムが組め、非常に楽しかった.もっともっと高度なものに挑戦してみたい.