[[2016a/Member]] 目次 #contents *はじめに [#v2227d5f] 課題は「お絵かきロボット」の制作である。 ・詳細やルール 自分またはチームメイトの似顔絵を描くロボットを製作する。 定数名やマクロなどは分かりやすい名前を用いて、絵はA4の紙の中に収まる大きさにする。 *ロボットの外観と仕組み [#l03d9b21] #ref(IMG_0269.JPG) 車体の先端にペンを取り付ける構造にした。 はじめの車体から形を大きく変更することなくペンを取り付けることができた。 #ref(IMG_0271.JPG) ペンを取り付け方としては、ペンを2つのタイヤで挟んだ。 タイヤにつながれたモーターを回すことでペンの上げ下げを可能にした。 ・工夫した点としては、絵を描く際にペンにつながれたモーターを常に紙に押しつけるような形で回すことで、十分な筆圧を確保した。 *ロボットの動きとプログラミング [#k103c265] まず初めにロボットに求められる動きとしては ・ペンの上下運動 ・細かい旋回運動 ・旋回運動で生じた位置の誤差を調整する動き の3つである。 **プログラミング [#z9cbc1b6] プログラミングの定義には次のもの用いた。 #define left(t) Off(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_C); // 左旋回 #define right(t) Off(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A); // 右旋回 #define run_mae(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC); // 前進 #define run_usiro(t) OnRev(OUT_AC); Wait(t); Off(OUT_AC); // 後退 #define pen_down(t) OnFwd(OUT_B); Wait(180); Off(OUT_B); // ペンを下げる #define pen_up(t) OnRev(OUT_B); Wait(180); Off(OUT_B); // ペンを上げる 以上のプログラムを基本とし、それらを組み合わせることによって 顔の輪郭や口、鼻などを描けるようにした。 **輪郭のプログラミングは次のように定義した。 [#p66726a5] #define faceline pen_down; run_mae(50); pen_up; run_mae(57); right(85); run_usiro(100); 本番ではこのプログラミングをリピート用いて、8回繰り返すことで「正八角形」の図形を描くことができ、それを顔の輪郭とした。 **口のプログラミングは次のように定義した。 [#q77c29f8] #defin pen_down; right(150); pen_up; run_usiro(130); left(100); run_mae(75); このプログラミングではまず前半の pen_down; right(150); で口を描き、後半の部分は次の動作をスムーズに行うために車体の位置を微調整するプログラミングとした。 **目のプログラミングは次のように定義した。 [#y5db35c2] #define nikori right(20); pen_down; right(30); pen_up; right(35); pen_down; right(30); pen_up; 口のプログラミングで位置をちゃんと調整したため、この部分では苦労することはなかった。 **最後に鼻のプログラミングを次のように定義した。 [#re75e914] #define hana left(40); run_usiro(80); pen_down; run_usiro(25); right(25); ここでは前半のleft(40); run_usiro(80); で位置を調整し、後半の部分で鼻を描く形となった。 *実際に絵を描いたプログラミングの完成形 [#w0180c7c] #define left(t) Off(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_C); #define left(t) Off(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_C); #define right(t) Off(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A); #define right(t) Off(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A); #define run_mae(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); #define run_mae(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC); #define run_usiro(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); #define run_usiro(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC); #define pen_down OnFwd(OUT_B);Wait(180);Off(OUT_B); #define pen_down OnFwd(OUT_B);Wait(180);Off(OUT_B); #define pen_up OnRev(OUT_B);Wait(10);Off(OUT_B); #define pen_up OnRev(OUT_B);Wait(10);Off(OUT_B); #define faceline pen_down; run_mae(50); pen_up; run_mae(57);\ right(85);run_usiro(100); #define faceline pen_down; run_mae(50); pen_up; run_mae(57);\ right(85);run_usiro(100); #define mouth pen_down; right(150); pen_up; run_usiro(130);\ left(100); run_mae(75); #define mouth pen_down; right(150); pen_up; run_usiro(130);\ left(100); run_mae(75); #define nikori right(20); pen_down; right(30); pen_up; right(35);\ pen_down; right(30); pen_up; #define nikori right(20); pen_down; right(30); pen_up; right(35);\ pen_down; right(30); pen_up; #define hana left(40); run_usiro(80); pen_down;\ run_usiro(25); right(25); #define hana left(40); run_usiro(80); pen_down;\ run_usiro(25); right(25); task main() { repeat(8){faceline} pen_down; run_mae(50); pen_up;run_usiro(90);\ right(20); mouth nikori hana } task main() { repeat(8){faceline} pen_down; run_mae(50); pen_up;run_usiro(90);\ right(20); mouth nikori hana } *絵を描く様子 [#z6db95b8] #ref(IMG_0273.JPG) *完成形 [#y3a23728] #ref(FullSizeRender.jpg) 輪郭は正八角形、口と目は円の弧を描くように描き、鼻は途中で折れ曲がるような形にした。 *まとめ、感想 [#a50510a2] 顔を描くうえでここまで苦労するとは思っていなかった。 一番難しかった点は、顔のパーツを描く場所の微調整である。 少しでもずれると顔に見えなくなってしまうので何度も調整を繰り返し、 適切な位置に顔のパーツが配置されるように努力した。 改善点としては髪の毛を描けるようにしたかった。顔のパーツに大きく時間を取られ、 髪にまで意識を向けられなかったのは今になって残念に思う。 顔を描くという、人間にとっては簡単な作業もロボットにやらせようとするとここまで苦労するとは 知らなかったが、今後エンジニアとしてロボットに関わっていきたいと思う自分にとってはこの授業がとても貴重な体験になったのも事実である。