[[2009a11l課題]] *2009a a11L 課題1「似顔絵ロボットを作る」 [#l8517274] NQCを用いたプログラムを理解するため、似顔絵を描くプログラムを作ってみる。 **目次 [#bb21e6e6] #contents **ロボット概要 [#ydef549a] 他のグループとの差別化として、「車」であることを強調する外見に作り上げた。~ また全体的にコンパクトなデザインを追求した。 ***ペン保持部 [#je604e9d] 先輩のアイデアを生かし、車輪でペンを保持することにした。~ &ref(pen.jpg);~ 車輪を直接モーターに取り付け、反対側にモーターには取り付けないが回転できる車輪を上下にひとつづつ取り付けた。~ 回転しない車輪は、ゴムタイヤを外したミゾ付きのものを使用。~ こうすることでうまくペンを保持することができた。~ 更にパーツ節約のため、できるだけコンパクトになるよう設計。~ ***車体 [#oca23b86] 最初のコンセプトとして、三輪にすることになった。~ 後輪と前輪の間にペン保持部を取り付けるのがやりやすいと思ったため。~ 後輪二輪、前輪一輪で、モーターは後輪のみ。前輪は説明書47Pを基に、キャスターを作った。~ &ref(kyasutadef2.jpg);~ しかし47Pのキャスターをそのまま取り付けると車高が高くなってしまうため、後輪タイヤを大きなものに変更。~ 更にキャスター保持部も低くなるようにパーツを取り替えた。~ &ref(kyasuta.jpg);~ 基本的な構造はローヴァーロボットを幅詰めしたもの。~ 前に拡張するようなイメージで、モーターのほぼ直前にペン保持部を装着できるようにした。~ &ref(./kumikomi2.jpg); &ref(shatai.jpg);~ しかしRCXを後方に取り付けてしまったため、重心が後ろに傾いてしまう。~ よって後方、RCXの下にはね上がり防止パーツを装着。ついでにrcxと本体の接続も補強できた。~ &ref(bousi.jpg);~ 車輪を使わなかったのは、ちょうど地面に接する径のものが存在しなかったため。 ***ペン保持部装着 [#f49554df] &ref(gattai.jpg);&ref(gattai2.jpg);~ 前輪フレームに挟み込むように装着。~ 安定性を高める結果となった。 ***調整 [#d221dc2e] ただ回転しただけで大きな円(=顔の輪郭)を描くために後タイヤ間を広くした。~ 軸を長くしたため、動かすとタイヤがブレるようになってしまった。~ そのため、タイヤを前後左右から覆うようにフレームを増強。ブレはかなり抑えられた。~ &ref(hokyou.jpg);~ 安定性、レゴの保持力を高めるように作ったため、特に後輪周りの組み替えやメンテナンスが面倒になってしまった。 &ref(fukuzatu.jpg);~ ***完成 [#zaf0496b] &ref(kansei.jpg);~ 後輪タイヤが大きいため、トルクが大きいと、補強したとはいえ停止時にかなりブレが生じてしまうのが欠点。 **プログラム [#u7aaa3d8] ロボットの設計上、大きな円を全員の輪郭として使用し、~ 顔のパーツを変えることでそれぞれ差別化を図ることになった。 ***ライスさんの顔 [#hc117209] 長い車間を生かした円形の輪郭を描く。~ 彼の上に上げた髪型を表現。~ 長い車間のせいで彼のまるく大きな目が描けなかったので、縦棒でその大きさを表現してみる。~ 彼のいつも絶えない笑顔は大きな口で表してみた。~ &ref(momo.jpg);~ task main() { /*輪郭を描く*/ OnFwd(OUT_A);//face Wait(400);//circle 円形の輪郭 Off(OUT_A); /*髪を描く*/ OnRev(OUT_C);//hair Wait(100);//circle OnFwd(OUT_C); OnRev(OUT_A); Wait(20);//return ピヨンと出た髪を演出 Off(OUT_A); Off(OUT_C); Set(OUT_B,1);//up ペンを上げる OnFwd(OUT_B); Wait(5); Off(OUT_B); /*目を描く*/ OnFwd(OUT_A);//eye ment 移動 Wait(25); Off(OUT_A); Off(OUT_C); OnFwd(OUT_A); OnFwd(OUT_C); Wait(10); Off(OUT_A); Off(OUT_C); Set(OUT_B,1);//down ペンを下ろす OnRev(OUT_B); Wait(8); Off(OUT_B); OnFwd(OUT_A);//left eye 左目 OnFwd(OUT_C); Wait(15); Off(OUT_A); Off(OUT_C); OnFwd(OUT_B);//ペンを上げる Wait(6); Off(OUT_B); Wait(50); OnFwd(OUT_C);//L90 左90度旋回 OnRev(OUT_A); Wait(43); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);//ment Reye 右目へ移動 Wait(32); Off(OUT_A+OUT_C); OnFwd(OUT_A);//R90 右90度旋回 OnRev(OUT_C); Wait(43); Off(OUT_A+OUT_C); Wait(20); OnRev(OUT_B); //down ペンを下ろす Wait(8); Off(OUT_B); OnRev(OUT_A+OUT_C);// 右目を描く Wait(13); Off(OUT_A+OUT_C); OnFwd(OUT_B);//up ペンを上げる Wait(6); Off(OUT_B); Wait(50); /*口を描く*/ OnFwd(OUT_A+OUT_C);//ment mouth 口へ移動 Wait(20); Off(OUT_A+OUT_C); Wait(70); Set(OUT_B,1);//down ペンを下ろす OnRev(OUT_B); Wait(8); Off(OUT_B); OnFwd(OUT_A);//mouth 口を描く Wait(50); Off(OUT_A); } ブレ防止のため、各動作の後に細かい無動作時間を設定した。~ 作成:ピーチクパーチク ***ダークホースさんの顔 [#df68936b] 彼の立てた髪を表現するのは難しかったので、上げた前髪だけを描くことにした。~ いつもつけているヘアピンも描いた。~ &ref(hayashi.jpg);~ #define b_up OnFwd(OUT_B);Wait(5);Off(OUT_B);//ペンを上げる #define b_dw OnRev(OUT_B):Wait(6);Off(OUT_B);//ペンを下げる #define gs(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//(t)だけ直進 #define gb(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//(t)だけ後退 #define turn_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右旋回(t) #define turn_l(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C);//左旋回(t) task main() { OnFwd(OUT_A) ;//輪郭を描く Wait(400) ; Off(OUT_A) ; b_up(5); turn_r(35);//目へ移動 gb(25); b_dw(6);//左右横長の目を描く gs(20); b_up(5); gs(10); b_dw(6); gs(20); b_up(5);//口へ移動 turn_r(43); gs(20); turn_r(40) ; gb(35) ; b_dw(6);//口を描く gs(30) ; b_up(5); turn_l(45) ;//髪へ移動 gb(55) ; b_dw(6);//髪を描く OnRev(OUT_C) ; Wait(65) ; Off(OUT_C) ; turn_l(40); b_up(5);//ヘアピンへ移動 gs(30); turn_r(55); b_dw(6); gs(25);//ヘアピンを描く } 髪がツノのようになってしまったが、彼の特徴をつかんだ絵に仕上がったと思う。~ 作成:ライス ***ピーチクパーチクさんの顔 [#a7ad16dd] 彼は優しい顔立ちをしているが少し暗いのでその暗さを出してみた。~ 主にうつむきがちな目とヘの字に結んだ口。 &ref(ore.jpg); #define t_l(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_A+OUT_C);//左旋回 #define t_r(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A+OUT_C);//右旋回 #define go_s(t) OnFwd(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//直進 #define go_b(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C);//後退 #define p_w Set(OUT_B,1);OnRev(OUT_B);Wait(8);Off(OUT_B);//ペンを下ろす #define p_u Set(OUT_B,1);OnFwd(OUT_B);Wait(5);Off(OUT_B);//ペンを上げる #define s_r(t) OnFwd(OUT_A);Wait(t);Off(OUT_A);//円を描く task main(){ int i; //rinkaku 輪郭(円)を描く s_r(350); p_u; //kami 髪を描く go_s(60);// 移動 t_r(43); go_s(10); t_r(43); p_w;// 描く go_s(62); //eye 目を描く p_u; go_s(60);// 移動 t_l(43); go_s(10); t_l(43); go_s(10);// 直進しながらペンを上げ下げする p_w; go_s(15); p_u; go_s(10); p_w; go_s(15); p_u; go_s(10); //mouth 口を描く go_s(60);// 移動 t_r(43); go_s(10); t_r(43); go_s(20); p_w;// 描く go_s(20); p_u; go_s(20); //nose 鼻を描く t_l(43);// 移動 go_b(30); p_w;// 描く go_b(10); p_u; } 温厚な感じに仕上がった。優しさがにじみ出ている。~ 作成:ダークホース **コメント [#a3b7b2ce] コメントをどうぞ - テスト -- [[ピーチクパーチク]] &new{2009-05-21 (木) 16:58:57}; - マクロを使えていますし、ロボットの説明もよくできています。あとは、二人目のプログラムの説明を加えてください。 -- [[FI]] &new{2009-05-21 (木) 20:01:27}; - ロボットの説明はとても分かりやすいです。プログラムの説明はもう少し付け足していただきたいです。説明をつけることは、「サブルーチンや関数、マクロなどを使って部品に分けること」の手助けになり、より美しいプログラムが書けます。 -- [[こさか]] &new{2009-05-21 (木) 23:12:22}; - 5/22 18:17 更新 -- [[ピーチクパーチク]] &new{2009-05-22 (金) 16:56:17}; - プログラムの説明が入ったことで、私の目からも「どこをマクロにすべきか?」が見えて参りました。例えばピーチクパーチクさん作成のプログラム、「ペンを上げる」「ペンを下ろす」が数回出てきているところなんかがその例です。 -- [[こさか]] &new{2009-05-28 (木) 23:59:53}; #comment