*課題2 黒い線に沿って動くロボット [#s62a3f8a]
*課題2 黒い線に沿って動くロボット&size(15){( Ozawa男 & 相方 )}; [#l06baa4a]
*ロボコン  [#g3021471]
#contents
**課題内容 [#ea510ca4]
各チームで作成したコースに沿って動くロボットを作成せよ。ただし、

速さと正確さを追求すること~
交差点で優先側を走っていない場合には、一時停止すること~
前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと~
コースを2周したら自動的に止まること~

**困難なこと [#jbb7a784]
注意:コースラインの幅は20〜25mmくらいとしてますが,あまり太くしない限り制限はしていません.ちなみに過去のロボコンコースレイアウトは25mm幅で制作してきました

**コース説明 [#mbd07934]
A6の作ったコースはこちら
#ref(081127_1658~01.jpg)
正直あまり深く考えずに作ってみたが、後に難点を発見~
#ref(081127_1658~02.jpg)
この急カーブ後の交差点である~
ここをうまく通過するには交差点に線と平行に入ることが望ましいが、直前の急カーブによりそれが難しくなっている
**この課題のミソ [#o656b244]
この課題での難点はこの三点であると思われる~

1、急なカーブをいかにして曲がるか~
2、交差点でどのように動かすか~
3、二台を同時に動かすため、衝突した際の対処が必要である~
4、相反する"速さ"と"正確さ"をいかにして両立させるか
この4点をどのようにして攻略するかがこの課題のミソであると思う

**コース説明 [#mbd07934]
A6の作ったコースはこちら
#ref(081127_1658~01.jpg)
正直あまり深く考えずに作ってみたが、後に難点を発見~
#ref(081127_1658~02.jpg)
この急カーブ後の交差点である~
ここをうまく通過するには交差点に線と平行に入ることが望ましいが、直前の急カーブによりそれが難しくなっている
*ロボについて [#ucde2d21]

**本体構造 [#w3c770be]
***設計土台 [#h932b0b5]
 まず始めに決めなければならなかったのは土台となる本体、どのようにして車体を動かすのか?~
選択肢としては、~
1、四輪
利点:オーソドックスであり簡単に作れる、基本的で安定  欠点:急なカーブに弱い

2、三輪
利点:何といっても小回りが利く  欠点:四輪に比べ安定性に欠ける(これは作り手次第だが、、、)

3、キャタピラ
利点:高い安定性と小回りの良さ  欠点:スピードの無さ、もう一台との連携に問題

が考えられた、この中で我々が選択したのは2の三輪、キャタピラも捨てがたかったがこの課題の”速さと正確さ”という点を考慮すると、三輪の方がベターであると考えたためである

***製作開始 [#jd838ac2]
二輪をモーターにつなぎ、残りの一つを自由度の高い動きが出来るようにしようと思う
まずはマニュアルを見て試しに作ってみた
#ref(081120_1713~01.jpg)
ふむ、確かに自由に動く、動くが、、、全く意味をなしていない!!車体を支えてないどころか重りにしかなっていなかった、これでは二輪だろう~
なぜ作っている最中に気づかなかったのだろうort~


そこで前回の失敗から”三輪で動く”ということをふまえて改良型を製作してみた
#ref(081127_1728~01.jpg)
なんだか無駄に細々して脆そうな・・・いや、やめよう~
これならタイヤは自由に回ることが出来るし、ちゃんと車体を支えている、立派な三輪車だ
それでは試走を・・・

   &size(30){見事大破};

カーブでかかる圧力に耐えきれずに壊れてしまった~
全く期待を裏切らない出来である,もちろん嬉しくは無いが~


更なる改良を加えたのが
#ref(081127_1854~01.jpg)
前回の問題点”耐久性”を改善したものである~
イメージとしては3輪よりも2輪に近いものだ~
旋回が最もしやすいのは余計なものがない2輪であり、それに安定性を加えるために補助輪を付けた形となっている~
これなら急なカーブにも対応でき、車体が前後に倒れることもない~
やはりシンプルな機構であるほど耐久性、安定性共にいいものが出来る~

これが片輪なのは、一つのほうが旋回時に力が集中した方が曲がりやすいのではないかとのからだったが、しばらく走らせていくうちに、微妙に曲がって走っていることが判明したため、両輪へと変更した
重心が中心からずれてしまったためではないかと思う~
#ref(081201_2033~01.jpg)


**光センサーとタッチセンサー [#cd2dc0b8]
二つのセンサーは組み合わせて作成し、車体前面に配置できるようにした
#ref(081127_1729~01.jpg)
タッチセンサーはバンパー部分に前面から力が加わると反応するようになっている~
基本的に衝突する際はどちらかは正面からぶつかることになるので、その際は一台のセンサーさえ稼働すれば問題無いと思われる~
これはセンサーの感度が良いため、ぶつかってももう一台の走行に支障をきたす前にセンサーが反応するであろうこと考えてのことだ~
側面も反応させられないかと考えてみたが、その場合は感度が下がるため逆に使いにくくなってしまった~
そのため、現在のこの形をベストと判断して採用した~

光センサーは二つ取り付けて線を挟んで走るようにした、これによりセンサーの反応のパターンを4つにし、モーターの回転のバリエーションを出した~
交差点対策のためでもある~
二つのセンサーが同時に反応する=交差点に差し掛かるといもので、これを一つで再現するアイディアは自分達には浮かばなかったため、これを採用した~
この課題では交差点があるため、光センサー一つでは困難だと思われる~
コースの部分部分で色を変えるなどして、明度を調整すれば可能ではないか?と考えたが、それはもう1台を巻き込むことになるし何より”黒い線に沿って”にならなそうなので諦めた

**完成品 [#a508fb45]
そして完成品がこちら
#ref(081201_2034~01.jpg)
#ref(081204_1631~01.jpg)

以前の物は車体の前後の重量のバランスが悪かったため、後輪を後ろに動かし補強、加えて重量のあるRCXを後方に動かした~
これにより車体全体の重量バランスも向上した~

ちなみに、タイヤとモーター部分のギア比を変えることで速度の調節も手軽に出来るようにしてある~

#ref(081204_1640~01.jpg)


しかし、速度を上げるとあまりのスピードのためか光センサーが上手く反応出来なくなったため、安定性を考慮して遅めのスピードにしてある~
*プログラムについて [#gfeb76fb]
今回作成したプログラムはこちらです
~定義は次のものを使用
      #define infrared 42              //  赤外線センサーの明るさ調整
      #define crossing   3*4          // 交差点を通る回数(2周させるため)
      #define start_position 100    //  タイマー(正確に2周させるため)
 
メインルーチン
      task main()
      {
        SetSensor(SENSOR_1,SENSOR_LIGHT);  // 赤外線センサーセット
      SetSensor(SENSOR_3,SENSOR_LIGHT);  // 赤外線センサーセット  
       SetSensor(SENSOR_2,SENSOR_TOUCH);  // タッチセンサーセット         
        int n;                // 関数を定義(交差点を数える)
        n=0;  
    
    while (n<crossing)                  //2周するまで繰り返す
   {
    if(SENSOR_2==0)           //タッチセンサーが反応してないで、
   {
     if (SENSOR_1 >infrared)             //センサー1が明るいと判断して、
     {       
       if (SENSOR_3 >infrared)             //センサー3も明るいと判断したら、  
     {                
     {        
       OnFwd(OUT_A+OUT_C);           //まっすぐ進む。
     }                                   
     }                               
  
       else                //センサー1が明るくセンサー3が暗かったら、
     { 
       Off(OUT_C);                         //右にカーブ。
       OnFwd(OUT_A); 
     }                                   
     }                                    
    
       else                //センサー1が暗く、
     {
       if(SENSOR_3>infrared)        //センサー3が明るかったら、
     {                          
       OnFwd(OUT_C);                       //左にカーブ。
       Off(OUT_A);
     }                                 
     
       else                           //センサー1もセンサー3も暗かったら、           
     {
       PlaySound(SOUND_CLICK);             //音を鳴らす。                 
       Off(OUT_A+OUT_B);          //一時停止。
       Wait(30);
       OnFwd(OUT_A+OUT_C);                //交差点を渡る。
       until (SENSOR_1>infrared||SENSOR_3>infrared); 
       n=n+1;                              //交差点を渡ったと判断。           
     }                                
     }                                
     }                                   
        
       else                                //タッチセンサーが反応したら、
     { 
       PlaySound(SOUND_DOUBLE_BEEP);       //音で知らせて、
       OnRev(OUT_A+OUT_C);Wait(100);       //バック。
       Off(OUT_A+OUT_C);Wait(200);
     }                                       
     }                                      
        
        
       ClearTimer(0);          
       while (Timer(0) <= start_position)  //スタート位置とゴール位置を正確にするためのタイマー。
     
    {                   
       if(SENSOR_2==0)                     //交差点を設定回数渡り終えてからのライントレースのプログラム(上のものと一緒)
     {
       if (SENSOR_1 >infrared)  
     {       
       if (SENSOR_3 >infrared)                    
     {
      
                    
     {     
       OnFwd(OUT_A+OUT_C);     
     }                                       
     }                                       
       else
     { 
       Off(OUT_C);                        
       OnFwd(OUT_A); 
     }                                           
     }                                              
       
       else
     {
       if(SENSOR_3>infrared)
     {
                                
       OnFwd(OUT_C);
       Off(OUT_A);
     }                                    
     } 
     }  
       else
     { 
       PlaySound(SOUND_DOUBLE_BEEP);
       OnRev(OUT_A+OUT_C);Wait(100);
       Off(OUT_A+OUT_C);Wait(200);
     }                                      
     }
       Float(OUT_A+OUT_C);                 //2周走行したら止まる。
     }                                                   







*総括 [#b0d6b332]
前回のプログラムは結果的に似顔絵が描ければ良く、その過程の動きは問われなかったため自由度が高かったが、今回は線に沿って動かなければならないため難易度が高く、よりプログラムを煮詰めていかなければならなかった~
ただ線に沿って動いていくだけのものならば簡単であったが、そこに交差点を含むのと2台を同時に走らせることを加えられたことで難題になっている~

今回は車体の安定性と旋回性能を重視したため”速さ”にまで手が回らなかったことが悔やまれる~
車輪を大きくし、ギアをいじれば簡単に速度は出るが、まるで狂ったように走り回ってしまい、自分たちでは扱い切れなかったため断念せざるを得なかった~

*感想 [#m5b6a0ff]
今回は前回の反省を踏まえ、早くから製作を始めたのが良かったと思います。時間に追われることなく余裕をもって臨めたため、ロボットの製作にもこだわることができました。~
苦労した点といえば、やはり急カーブ後の交差点だと思います。ここをいかにして乗り切るかが今回の要でしたので、これには特に時間をかけ、プログラム、車体共に調整を続けることとなりました。~
しかし、やはりもっと速く動くように作れなかったのかということは心残りです。~
次の課題ではもっと高い水準で課題をクリアーしていきたいです。 
*コメントをお願いします [#p8c982d9]
- ソースがもっと美しくできたらよかったですね -- [[なかむら]] &new{2008-12-11 (木) 15:22:48};

#comment
きちんと2周させるための工夫やタイヤの数の選択などいろいろと工夫していて良いです。
FI


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