相手の似顔絵を書くロボットの作成
今回、私たちは四輪のRCX縦型のロボットを作りました。まず最初にできたのが下の写真です。
しかしギアがうまくかみ合わなかったり、小回りがあまり利かなかったので、改良しました。 工夫した点 最初キャタピラを使用していましたが、小回りや、止まりの良さなどを重視して車輪に変更しました。
ロボットは縦にRCX本体をおき、ペンを一番上にあるモーターからの突き刺し型。そして、ペンの位置ができる限り回転の真ん中にいくようにと考えて4輪駆動の前輪をなるべく前にやり、バランスのとれた形を目指しました。
車輪がうまく噛み合ず、動き方がランダムでした。そしてその結果、プログラム通りにロボットの動きが実行されず、絵がなかなか思い通りにかけませんでした。そしてその問題を解決するために
私たちは、ペンを片側に3個のギアをかませることで安定させました。また、先端の固定は、タイヤを支えるパーツとリンクをさせたこと、RCXの本体との間にパーツを一つ入れてあること、棒のパーツを使い、両サイドから圧迫することにより固定をしました。
最後に改良を加えるにあたり、ペンをできる限り回転の中心に近い位置に取り付けようと試み、3個目のモーターを高い位置にした結果、強度、パーツの数、ペンの安定などたくさんの課題を抱え、多少の強度と、形にこだわらない無理矢理なパーツの組み合わせにより、かろうじてペンの固定に成功しました
#define fwd(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//前進 #define rev(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//後進 #define arev(t) OnRev(OUT_A);Wait(t);Off(OUT_A);//右回り #define crev(t) OnRev(OUT_C);Wait(t);Off(OUT_C);//左回り #define circa(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右回転 #define circb(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C);//左回転 #define pend OnFwd(OUT_B);Wait(15);Off(OUT_B);//ペンを下げる #define penu OnRev(OUT_B);Wait(12);Off(OUT_B);//ペンを上げる
task main () { penu; pend; afwd(350);//顔の輪郭を描く circa(170); fwd(30); penu; afwd(250);//移動 fwd(20); repeat(5)//髪の毛を描く { cfwd(40); afwd(35); } crev(200);//移動 fwd(100); circa(120); pend;//左目を描く fwd(30); penu; Wait(100); fwd(30); fwd(30);//右目を描く Wait(100); penu; fwd(30);//移動 circa(60); crev(30); pend; fwd(40);口を描く penu; fwd(25); }
特に苦労したのが顔の輪郭です。これだけはどうしても譲ることができず、何度もプログラムしました。このロボットの大きさの特性を生かし、半円と直線を組み合わせることで、自然な顔の輪郭をつくることができました。髪の毛にブログラムは、複雑だったのプログラムをシンプルにし、できるだけ誤差がでないようにしました。
#define UP OnFwd(OUT_B);Wait(15);Off(OUT_B); #define DOWN OnRev(OUT_B);Wait(20);Off(OUT_B); #define GO OnRev(OUT_A+OUT_C); #define STOP Off(OUT_A+OUT_C); #define STOP_2 Off(OUT_A+OUT_C);Wait(50); #define STOP_3 Off(OUT_A+OUT_C);Wait(5) #define BACK OnFwd(OUT_A+OUT_C);
task main () {SetPower(OUT_A+OUT_C,3); Wait(500);
DOWN;//顔の輪郭 STOP_2; GO; Wait(60); STOP_3; UP; STOP_2//あごの角 GO; Wait(19); OnFwd(OUT_C); OnRev(OUT_A); Wait(160); STOP_2 BACK Wait(36); STOP_2 DOWN; STOP_2 GO; Wait(40); STOP_3; UP;//あごの先端 STOP_2; GO; Wait(19); STOP_2; OnFwd(OUT_C); OnRev(OUT_A); Wait(170); STOP_2; BACK Wait(27); STOP_2; DOWN; STOP_2; GO; Wait(50); STOP; UP;//あご→顔の輪郭 STOP_2 GO; Wait(18); OnFwd(OUT_C); OnRev(OUT_A); Wait(160); STOP_2 BACK Wait(37); STOP_2 DOWN; STOP_2 GO; Wait(60); STOP; OnRev(OUT_A);//髪の毛 OnFwd(OUT_C); Wait(7); repeat(21) { OnRev(OUT_A+OUT_C); Wait(17); UP; OnFwd(OUT_A); OnRev(OUT_C); Wait(15); DOWN OnFwd(OUT_A+OUT_C); Wait(22); UP; OnRev(OUT_A); OnFwd(OUT_C); Wait(15); DOWN } BACK;//目 Wait(10); OnFwd(OUT_C); OnRev(OUT_A); Wait(140); BACK; Wait(30); STOP_2 DOWN STOP_2; BACK Wait(20); STOP_2 UP; OnFwd(OUT_C); Wait(60); STOP_2 DOWN STOP_2; BACK Wait(20); STOP_2 UP; }
輪郭をホームベース型にすることにより人間らしくし、髪も、輪郭を書くのではなく細かい動きで髪の毛を表現しました。 顔の輪郭を直線にしたために、線と線をつなぐのがとても大変でした、 最初は 直進→ペンをあげてバック→左折→バック→ペンをおろす という行程で角を描こうとしていました。すると、動きが多いため、誤差が多く、微調整を繰り返してもなかなかうまくいきませんでした。 そこで、班の人にアイディアをもらい。 直進→ペンをあげて少し直進→バックしながら曲がる→直進 とすることで動きを減らし、誤差を減らすことにつながりました。 後は、髪の毛を線でもっと細かく作りたかったのですが、 斜めに上に上がっていったり、角度が大きすぎたり小さすぎたり、となかなか思うようにいかず、すごく苦労をしました。
プログラムなどはあまり経験などなったのでとても大変でしたがパートナーの協力もあって無事終わらせることができ、嬉しいです。
初めてのプログラミング、組み立てということで、何をすればいいのか、何が楽、かつきれいにできるか、何を優先してくむべきなのか(ペンを真ん中にやることか曲がりやすくするべきか)がわからず。ただ迷走を繰り返し、本体、プログラミングともに何度もやり直していったのに、結局最後までいいものはできませんでした。満足のいく結果とは言えないまま期限を越すことになり、ただただ残念で、すごく情けなかったです。 次回の課題は、満足がいくように妥協をいっさいせずに頑張り、かつ妥協をしないで成功できるように。たくさんの努力し、心血を注ぎたいと思いました。
コメントをどうぞ