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~
かおりん…(♂)、文章~
はやぶさ…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;簡単な顔ではあるものの、かなり時間をかけ、一生懸命作りました。これから、さらに難しくなっていくと思いますが、パートナーと力を合わせて頑張りたいと思います。
  &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};
- ロボットの解説はわかりやすいし、プログラムの説明の詳しさは素晴らしいです(少し書式が崩れていますが)。ただ、「気まぐれ」はプログラムではバグと呼びます。是非原因をつきとめて解決してください。 -- [[こさか]] &new{2009-05-21 (木) 22:57:41};
- タイヤが回らないというのはCモーターが時たま作動していないというもので OnFwd(OUT_A+OUT_C); などの簡単なプログラムでも発生し、コードをつけ直すとなおることがあるのでおそらく接触不良によるものだと思われます。 -- [[はやぶさ]] &new{2009-05-22 (金) 15:16:42};
- ご指摘ありがとうございます -- [[かおりん]] &new{2009-05-22 (金) 15:31:33};
- ペンの上げ下げについては問題はありません。走りながら上げ下げしています。ロボのバグに関しては、解体して調べようと思います。 -- [[かおりん]] &new{2009-05-22 (金) 15:34:38};
- 接触不良が原因だとすれば、先生に申し出て、端子を磨いたりしてみてください。 -- [[こさか]] &new{2009-05-28 (木) 23:43:50};

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS