目次 #contents *はじめに [#e79d92f4] 今回の課題は、自分の似顔絵を描くロボットです。~ A4の紙に自分の顔の特徴をとらえた似顔絵を描きなさい、という課題です。~ 正直自分は特徴のない薄い顔なのでしんどいです。 *ロボットの紹介 [#jb5ca23c] #ref(FullSizeRender.jpg) #ref(FullSizeRender (1).jpg) EV3というロボットを使いました!~ 最新の機械なので、とても綺麗で性能がいいです。 前方のモーターは、アームの根元にあります。 最新の機械なので、とても綺麗で性能がいいです。~ 前方のモーターは、アームの根元にあります。~ モーターを動かすことで、アームを上下どちらか任意の方向へ動かすことができるので、アームにペンを取り付けることで、ペンの上下運動を可能にしています。 *ロボットの動作・プログラムの説明 [#bdef6d88] ・円を描くのが難しいので、なるべく直線で描く。~ ・一筆書きは不可能なので、しっかりペンを上げ下げさせる。~ ・少しでも自分の顔の特徴をとらえた似顔絵にする。~ ・描いでいく内に出てくる誤差が目立たないように細かいパーツから先に描く。 という事を大事にしてロボットの動作・プログラムを考えました。 プログラムはこんな感じです↓ #!/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') //ペンを動かす前方のモーター 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() //ここでforwardとpenを定義することで、下記のプログラムの通り、プログラムを単純に、簡潔にすることができる。 pen(1000,-38) //1000=1秒です。 time.sleep(2) 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) time.sleep(1) 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) time.sleep(1) pen(1000,50) forward(1000,-15,-15) pen(1000,-38) forward(1000,-15,-15) time.sleep(1) pen(1000,50) forward(1000,35,35) pen(1000,-38) forward(1000,28,-36) time.sleep(1) forward(1000,-18,-25) pen(1000,50) forward(1000,-10,-60) forward(1000,-55,0) forward(1000,10,10) pen(1000,-38) forward(1000,35,0) pen(1000,50) forward(1000,-28,0) time.sleep(1) pen(1000,-38) time.sleep(2) forward(2000,15,25) pen(1000,50) exit() 数字の前に「−」をつけることで、車輪を逆回転させることができます。~ そのことを利用して、回転する際、一方の車輪をもう片方の車輪と逆回転させることでよりコンパクトにロボットを動かすことができるようになります。~ pen()内にある「-」は、ペンを上げるか下げるかどうかを決めます。~ 数字の前に「-」があるときはペンを下げ、ないときはペンを上げます。 **ロボットの動きの詳細 [#i4d0f5d0] ***口を描く [#rd58e3b4] pen(1000,-38) time.sleep(2) forward(1000,-15,15) pen(1000,50) time.sleep(1) 一番最初のこのプログラムは、口を描くプログラムです。~ 最初のプログラムでペンを下ろしています。~ 左車輪を-15、右車輪を15に設定し、弧を描くように(ほぼ直線に近いですが・・・)設定してます。~ そして、弧を描き終えたら、ペンを上げるようにプログラムしています。 #ref(FullSizeRender (2).jpg) ***鼻を描く [#zbb2596b] forward(1000,-12,-17) time.sleep(2) pen(1000,-38) time.sleep(2) forward(1000,-12,-12) time.sleep(1) forward(1000,-20,0) pen(1000,50) 次のプログラムは、鼻を描くプログラムです。~ 初めのforward()で口を描き終えた地点から少し移動し、鼻を描き始める最初の地点である、鼻の下の位置にペン先が来るように設定しています。~ 途中でペンを下ろした状態でロボットを回転させることで、鼻を鼻っぽく山型に描いています。 #ref(FullSizeRender (3).jpg) ***目を描く [#x4c230ef] forward(2000,25,25) forward(1000,-26,26) forward(1000,-30,-30) pen(1000,-38) forward(1000,-15,-15) time.sleep(1) pen(1000,50) forward(1000,-15,-15) pen(1000,-38) forward(1000,-15,-15) time.sleep(1) pen(1000,50) 次のプログラムは目を描くプログラムです。~ 左目の目尻のほうから描いていきます。~ ロボットを回転・移動させ、左目の目尻を描く位置にペン先が来るようにしたら、ペンを下ろし、そのままロボットを後退させながら線を引き、目頭まで描いたらペンを上げ、そのまま後退させ、少し距離をあけたら、またペンを下ろし、後退させ、右目は目頭から目尻にかけて線を描きます。 #ref(FullSizeRender (4).jpg) ***顔の輪郭を描く [#g745c7ed] forward(1000,35,35) pen(1000,-38) forward(1000,28,-36) time.sleep(1) forward(1000,-18,-25) pen(1000,50) 次のプログラムは顔の輪郭を描くものです。 目を描き終えたら、目を描き始めた左目の目尻の位置からすこしだけ離れた位置までロボットを移動させ、ペンを下し、そこから一気にあごの位置まで弧を描きます。~ あごの位置まで描いたら、一度止め、そこからは左右の車輪の数値を変え、あごを描きました。~ ここは微調整の連続で、かなり苦労しました。 #ref(FullSizeRender (5).jpg) ***髪の毛を描く [#p9442f71] pen(1000,50) forward(1000,-10,-60) forward(1000,-55,0) forward(1000,10,10) pen(1000,-38) forward(1000,35,0) pen(1000,50) forward(1000,-28,0) time.sleep(1) pen(1000,-38) time.sleep(2) forward(2000,15,25) pen(1000,50) 最後に、髪の毛を描きます。~ 輪郭を描き終えたら、目と目の間から少し上の位置にペン先が来るようにプログラムし、そこから右目の上あたりまで弧を描きます。~ そしたらペンを上げ、髪の毛を描き始めた位置の近くまでペン先を戻し、そこからまたペンを下ろして最後に左目あたりにかかるように弧を描いて終了です。~ 僕は少し髪が長いので、その特徴を描くために目にかかるくらいの髪の毛を描きました。~ #ref(FullSizeRender (6).jpg) これで完成です。~ *感想・反省 [#ued9b3d0] 初めてプログラミングなるものをしたので、かなり苦戦して、多くの時間がかかりました。~ 似顔絵を見ると、かなり簡易的ではありますが、先生や班の仲間、EV3を使用している他の班の人たちとどうプログラムを組めばモーターが動くか、どうすれば特徴を捉えた似顔絵を作れるか、というのを何時間も話し合い、考えた末に完成したものなので、満足しています。~ ただ、ペンを取り付ける方法がわからず、半ば強引にテープと輪ゴムで取り付けてしまったので、そこは反省点として、次回に生かそうと思います。~ また、先述の通り、誤差の影響を最小限にするために、細かなパーツから先に描くようにしましたが、それでも、毎回絵にムラがあり、誤差にも苦労させられました。~ 結果的に誤差の影響を受けてしまったので、これも反省点として、次回に生かせるようにしたいと思います。