2009a/A9/課題1右 目次~ ┣[[課題の概要:http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA9%2F%B2%DD%C2%EA%A3%B1%B1%A6#ye9bf82d]]~ ┣[[メンバーの紹介:http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA9%2F%B2%DD%C2%EA%A3%B1%B1%A6#pe2a50a9]]~ ┣[[ロボットの解説:http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA9%2F%B2%DD%C2%EA%A3%B1%B1%A6#ea115a11]]~ ┣[[プログラムの解説:http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA9%2F%B2%DD%C2%EA%A3%B1%B1%A6#faf34912]]~ ┣[[感想:http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA9%2F%B2%DD%C2%EA%A3%B1%B1%A6#xa1e39f8]]~ ┗[[コメント欄:http://yakushi.shinshu-u.ac.jp/robotics/?2009a%2FA9%2F%B2%DD%C2%EA%A3%B1%B1%A6#g954dcb2]]~ &aname(gai); *課題の概要 [#ye9bf82d] 4輪ロボットが、ペンをうまく使って、パートナーの似顔絵を描くというもの。 &br;ペンで書くためにアームなどを使って、上げ下げし、タイヤの動きを見て、うまく書いてゆく *メンバーの紹介 [#pe2a50a9] かおりん…(♂)、文章~ はやぶさ…50m8秒2、写真~ *ロボットの解説 [#ea115a11] #ref(kr1.jpg) このロボットの名前を『気まぐれロボ』と命名しました。理由は、時々タイヤが動かなくなることが起きるからであります。(ちゃんと説明書通り作りました) &br;では気まぐれロボの解説をしたいと思います。~ #ref(kr2.jpg) まずは全体像から。~ 電源を見栄えをすっきり見せるために、後ろに立てる話もありましたが、電池が重いので、バランスを考えて一番上に置くようにしました。 #ref(kr3.jpg) &br;次にアームです。2本のパーツを使い、書くときのペンの安定性を重視しました。これで書いているときも、上げ下げしているときもずれたり、落ちたりしません。またペンを動かすにいたるために、このようにギアを繋ぎ合わせていきました。 #ref(kr4.jpg) *プログラムの解説 [#faf34912] かおりん作 #ref(kao(kaorin).jpg) void down_pen() ここでペンを下ろす動作を関数にします { OnFwd(OUT_B); Wait(10); Off(OUT_B); Wait(30); } void up_pen() ここでペンを上げる動作を関数にします { OnRev(OUT_B); Wait(10); Off(OUT_B); } task main() { OnRev(OUT_A); 円を描いて輪郭を書きます Wait(800); Off(OUT_A); Wait(30); up_pen(); ペンを上げます OnFwd(OUT_A); 右目尻へ移動するために方向転換 OnRev(OUT_C); Wait(50); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); 右目尻へ移動開始 Wait(75); down_pen(); 書き始めます up_pen(); 右目を書き終えたのでペンを上げます Wait(20); down_pen(); 左目を書き始めます up_pen(); 左目の目尻まで書き終わります Off(OUT_A+OUT_C); Wait(30); OnRev(OUT_A+OUT_C); 眉間へ戻ります Wait(130); Off(OUT_A+OUT_C); OnRev(OUT_A); 目と垂直に鼻を書くため方向転換します OnFwd(OUT_C); Wait(95); Off(OUT_A+OUT_C); Wait(30); OnFwd(OUT_A+OUT_C); 鼻を書くため移動開始 Wait(45); Off(OUT_A+OUT_C); down_pen(); 鼻を書き始めます OnRev(OUT_A+OUT_C); ちょっと戻ります Wait(30); OnRev(OUT_B); ペンを上げます Wait(10); Off(OUT_A+OUT_C); 一度停止 Wait(30); OnRev(OUT_A+OUT_C); 口を書くため方向転換します Wait(100); Off(OUT_A+OUT_C); Wait(30); OnRev(OUT_A); 口を書くため方向転換します OnFwd(OUT_C); Wait(110); Off(OUT_A+OUT_C); Wait(30); OnFwd(OUT_A+OUT_C); 口を書くため移動開始 Wait(50); down_pen(); 口を書くためペンを下げます Wait(35); up_pen(); 口を書き終えたのでペンを上げます Off(OUT_A+OUT_C); } はやぶさ作 #ref(kao(hayabusa).jpg) かおりんは笑顔が素敵です。~ #define PM_T 10 //pen move time ペンを上げ下げする時間を定義 sub pen_up() //pen wo ageru ペンを上げる動作を定義 { OnRev(OUT_B);Wait(PM_T);Off(OUT_B); } sub pen_down() //pen wo sageru ペンを下げる動作を定義 { OnFwd(OUT_B);Wait(PM_T);Off(OUT_B);OnFwd(OUT_B); } sub allstop() //subete teisi(0.5s) 0.5秒間全停止 { Off(OUT_A+OUT_B+OUT_C); Wait(50); } #define rall_t OnFwd(OUT_C);OnRev(OUT_A); //tokei mawari 時計回りで回転 #define rall_h OnFwd(OUT_A);OnRev(OUT_C); //han tokei mawari反時計回りで回転 #define go_b OnFwd(OUT_A+OUT_C); //kousin 後進 #define go_f OnRev(OUT_A+OUT_C); //zensin 前進 task main() { //rinkaku まず輪郭を描きます pen_down(); OnFwd(OUT_A); Aモーターだけ動かし大きく回転 Wait(840); allstop(); //kuti idou 位置を調節するため一度輪郭の外へ出ます pen_up(); allstop(); rall_t 向きを調整 Wait(30); go_f //kao no sotohe 輪郭の外へ Wait(130); allstop(); rall_h 向きを調整 Wait(27); allstop(); go_b //kuti no itihe 口を描く位置まで移動します Wait(130); allstop(); //kuti 口を描きます rall_t 口の書き始めの位置へ Wait(30); allstop(); pen_down(); ペンを下ろします allstop(); Wait(50); rall_h 口を描きます Wait(60); allstop(); pen_up(); rall_t 垂直に戻すため向きを調節 Wait(30); allstop(); //hana go_b 鼻の位置へ移動します Wait(25); pen_down(); Wait(30); 鼻を描きます allstop(); pen_up(); //eye go_f 位置を合わせるため一度下がります Wait(50); rall_h 回転しペンを目の位置へ Wait(100); go_b Wait(40); allstop(); pen_down(); //hidari me 左目を描きます Wait(10); pen_up(); allstop(); go_b 右目の位置へ移動 Wait(100); //miken allstop(); pen_down(); //migi me 右目を描きます Wait(10); pen_up(); //hear rall_t 回転と移動を繰り返し髪の描き初めへ Wait(22); allstop(); go_b Wait(55); rall_h Wait(14); allstop(); pen_down(); repeat(7) ジグザグ走行で髪を描きます { OnRev(OUT_C); Wait(30); Off(OUT_C); OnRev(OUT_A); Wait(30); Off(OUT_A); } pen_up(); allstop(); } 解説:よく使うペンの上げ下げ、本体の回転、前進、後進をサブルーチン、マクロを使って定義。~ また慣性でペン先や移動がずれるのを防ぐため前停止のサブルーチンを定義し必要と思ったところに入れました。~ 説明は作業時のものをそのまま入れてあります。~ *感想 [#xa1e39f8] 気をつけたところは、目と鼻、口など直線にしましたが、目と鼻が垂直、鼻と口が垂直というように方向転換がちょっと難しかったです。なるべく無駄がないようにプログラミングをしてみましたが、ところどころ戻ったりするところが出てきてしまいました。パソコンを使うことが苦手な僕でしたが、友達と相談しながら完成することができました。 &br;ペンの上げ下げがいくつもあったので、関数に表したりもして工夫しました。また、ペンをお尻のところに付けて動かす予定でしたが、うまくペンが走らなかったので、タイヤを逆回転にしたことをお知らせしておきます。そして、連続でプログラミングしてもよかったのですが、時々、気まぐれロボがうまく動かないこともあったので、間にwaitを結構入れてしまいました。勿論無くても動きます。 &br;簡単な顔ではあるものの、かなり時間をかけ、一生懸命作りました。これから、さらに難しくなっていくと思いますが、パートナーと力を合わせて頑張りたいと思います。(かおりん) 今回先にマシンを組み上げてしまってからプログラムを描いたのですがペンの位置を全く考えなかったことを強く後悔しました。 ペンを本体の外側に付けると本体の回転と共にペン先も動いてしまうため思ったような線が描けなかったからです。 もしもう一度作ることがあればペンを車体の中心に据え車体の動きをペン先に正確に伝えられるような組み方をしたいです。~ プログラムについては前述の通りペンの動きをいちいち確かめる必要があったため当初考えていたものより大分簡略化しましたがそれでもかなり時間がかかりました。 またタイヤの摩擦がキャンパスによって変わるため床、練習用の紙、本番用の紙で移動距離に差が出て数値の調節にも時間を要しました。 ペンの上げ下げについては初めからサブルーチンを使っていたためスムーズに作業ができたと思います。~ 今回自分の怠惰のせいでパートナーの子に迷惑をかけたので次からはそのようなことがないように頑張りたいと思います。(はやぶさ) *コメント欄 [#g954dcb2] - テスト -- [[はやぶさ]] &new{2009-05-21 (木) 15:08:19}; - 2人目のプログラムに説明を入れましょう。~ 1人目のプログラムではところどころ、downの後すぐにupが来ているので目が書けないのではないでしょうか?(それぞれ、ペンを上げ下げするだけのように定義されているはずです)~ 何故、途中で止まるのかも考えてみてください。-- [[FI]] &new{2009-05-21 (木) 19:20:47}; - 指摘ありがとうございます。プログラムに説明を入れました。 -- [[はやぶさ]] &new{2009-05-21 (木) 19:51:24}; #comment