2007b/A2

課題3 光を追うロボット

PA0_0096.JPG

課題3の概要

詳しい課題3の説明は こちらから

課題3のポイントとして考えられる事は

(1)ロボットの駆動にはディファレシャルギアを使用しなければならないこと

(2)ロボットがものを投げなくてはならないこと

(3)周囲から最も明るい場所を探すこと

(4)光を追いかけること

(5)光が止まっていることを認識すること

の5点です。

課題1の書道ロボットは決められた動作をただ行うだけ、課題2のライントレースロボットは決められたコース上での動きであったのに対して、今回の課題3は光という不確かにも思えるものの最も明るい場所を探したり停止していることを確かめたりすることは、ロボットの動作に制約がなくなった分非常に難しいことであるように感じました。

ロボットの本体について

はじめのロボットの機構について

〈駆動部分〉 ディファンレシャルギアについて

ディファンレシャルギアとは…

作動装置と訳され、自動車のような車輪のついた乗り物などに利用される動力を伝えるための装置です。自動車に使用される場合は、内側と外側のタイヤの回転数の差を吸収し両側のタイヤに同じだけの力を動力から与える役割をしています。(下図参照)

作動装置の役割.jpg

赤の軌道を動くタイヤと青の軌道を動くタイヤの移動距離は異なる →タイヤの回転数が異なる →ディファレンシャルギアで調節する

4輪の自動車の場合には作動装置を、前後のタイヤの外側と内側の回転数を吸収するために2つと、その前後2つの作動装置の回転数を吸収するために1つの計3つのディファンレシャルギアを持っています。

以下にディファンレシャルギアによって1つのモーターで両輪を回転させる原理を示します。

各部名称.jpg

上の図は作動装置の構造を示しています。作動装置は複数枚かつ数種類の歯車によって構成されています。モーターの回転はオレンジ色の歯車2枚を通じてディファレンシャルギアに伝達されます。ディファレンシャルギアと左右のタイヤをつなぐ歯車が左右で枚数が違っていますこれは左右のタイヤの回転方向をそろえるためで、この部分の歯車の枚数が奇数同士もしくは偶数同士ではいけません。このことに気がつかずに左右の歯車を偶数同士にしたためロボットが回転し続けるという失敗をしました。

ラチェット.jpg

上の図はラチェットの役割を示す図です。 ラチェットは一転で固定されており自由に回転できるようになっていて、タイヤに直結する歯車と接触しており、歯車を特定の方向の回転は可能にするが反対の回転はできないようにしています。その原理は図において矢印の方向に回転しようとすると歯車の歯がラチェットの先端にぶつかります。歯がラチェットに加える力の方向はラチェットが固定されている部分すなわち回転軸に向きであるためラチェットは回転しません。よって歯車ははそれ以上回転できません。 また、歯車が図の矢印と反対方向に回転する場合、歯車の歯がラチェットに加える力の方向はラチェットの回転軸に対して垂直に近くなるので、ラチェットを回転させる力に変わり、ラチェットは歯車の回転を妨害しません。すなわち、歯車は回転することができます。

回転方向.jpg

上図はモーターの回転方向を変えることで動くタイヤを変えることができることを示しています。左側の図の場合、モーターの回転は歯車を伝いディファレンシャルギア部分に伝達されます。すると灰色の歯車が矢印(灰色)の方向に回転します。このとき青色で示される灰色の歯車と連結されているかさ歯車が左右のかさ歯車の周りを回るように動きます。となると青色のかさ歯車は矢印(青)向きに回ろうとします。ところで青いかさ歯車が矢印(青)の方向に回転すると黄色で示されるかさ歯車は↑方向に回転しようとしますが、この回転は黄色で示される歯車列に伝わっていきますがラチェットによって回転が止められてしまうので、結局黄色で示された歯車は皆固定される。したがって回転が伝わるのは緑色で示された歯車列で、タイヤの動きと示された矢印方向にロボットは動くことになる。 右の図ではモーターの回転が左の図とは逆になった場合で、左側のタイヤが固定されるので、左図とは反対方向にロボットは旋回する。

移動.jpg

つまりディファレンシャルギアによってタイヤが回転しロボットが駆動する仕組みにおいては、左右のどちらか片方のタイヤしか動かすことができません。また、後退もできません。したがってロボットの移動は上図に示すようにタイヤを交互に動かすことで、目的の場所へ移動します。

タイヤを飛ばす部分

課題3では光に対しホイールを投げるという動作が必要です。そのためホイールを投げる(飛ばす)機構が必要になってきます。 考えられるホイールの発射機構としては、

(1)投石機のようにモーターの回転を棒のような腕に伝えてホイールを飛ばす。単純な構造なので簡単に製作できるが、遠心力でモーターの回転以上の回転をしてモーターに負荷がかかるのではないかと考えてロボットの機構には採用しませんでした。

(2)ピッチングマシーンのようにローラーでホイールを挟み回転させて飛ばす。両側からホイールをはさんで飛ばすため、まっすぐに飛び安定している方法ではないかと思った。しかし、製作してみるとローラーの適切な軸間距離に合うブロックの穴が見つからなかったため、ホイールを挟む力が弱過ぎたり逆に強すぎたりしてうまくいかなくて断念しました。

(3)ビー玉を飛ばして遊ぶ某玩具のようにホイールを挟んで固定しておき棒のようなもので後ろから押すして飛ばす。挟んでおく構造部分に力がかかり破損するのではないかと考えて、自由に回転する2つのローラーで固定しておくことを考えたが、(2)とおなじ適切な軸間距離を得られないという理由で断念した。

下図はホイールを飛ばす機構を示す

発射方法.jpg

採用した機構

発射機構(1).jpg

上図は採用した機構の原理を示しています。

2つのローラーで挟むのは難しいと考えて簡略化してローラーは1つにすることを考えました。しかしこうするとホイールが傾いたりしてまっすぐ飛ばせない問題が起こることが予想されました。そこでホイールにある溝に注目しました。この溝は黒いくの字に曲がっているブロックの幅より少し広いくらいの幅なので、このブロックをレールのように使いホイールを送り出すことができます。このようにして1つのローラーとブロックのレールを使った飛ばす機構にしました。この機構のメリットは

(1)ローラーによってまっすぐにホイール飛ばすことができる

(2)レールによってぶれないでローラーがホイールを送り出すことができる

(3)ローラーとレールでホイールを挟んでいるのでロボットの走行中にホイールが落ちることがない

発射機構(2).jpg

上図はローラーを回転させるためのモーターとの連結を示す

ローラーにはプーリーが付いていて、ゴムによってモーターのプーリーとつながっており、モーターの回転がローラーにお伝わるようになっています。この部分はギアの連結で回転を伝えようと考えていましたが、またも適切な歯車の組み合わせを見つけることができずプーリーによって回転を伝えることにしました。プーリーは軸間距離に自由度があるので便利ですが、ゴムが切れる恐れがあるのでできれば使いたくありませんでした。

その他の機構

キャスター

ディファレンシャルギアがタイヤを回転させる動きをロボットの移動に的確に伝えるために、キャスターを利用しました。駆動輪の高さと合わせることが苦労しました。

光センサー

課題3は光をおう課題なので光センサーは必須です。光センサーはロボットの前方の部分に取り付けられており確実に光を感知するようになっています。

はじめのロボットの問題点

問題点.jpg

はじめに製作したロボットは以下のような問題点がありました。

(1)光センサーが隣り合わせに密着してついているので、左右の光センサーで明るさの値に変化が生じないため、ロボットがきちんと動いてくれませんでした。

(2)ホイールを飛ばす機構はロボットと独立して製作したこともあり、ロボット本体との組み合わせ方に問題がありました。すなわち、本体とはブロックの穴によって左右一か所ずつでしか固定できていなかったので、発射機構自体が固定されてる部分を軸にぐらぐらと回転してしまうという問題が発生しました。プーリーにゴムを張っていれば動くことはないのですが、改善すべき点だと思われました。

(3)ロボットの駆動部分について、キャスターが駆動輪より前側についているので動きにくいということがありました。

(4)光センサーの取り付け位置が駆動輪と離れすぎているので、光センサーが感知した反応が適切にロボットの移動の動きに反映できていませんでした。このことは課題2で学んだことなのにまた同じミスを犯していました。

改善したロボット

完成.jpg

上図のようにロボットを改善しました。

(1)ヒントにあったように光センサーの間についたてをつけてみました。すると下図に様に左右の光センサーの間で明るさにはっきりとした違いが生じロボットの動きが良くなりました。

つい立の効果.jpg
光センサーの変化.jpg

(2)キャスターを駆動輪より後ろに取り付けました。このことによってキャスターは駆動輪に追従する動きを行えばよいので、ロボットの動きを阻害することがなくなりました。これに伴い、駆動輪と光センサーの距離が近くなるという効果もありました。

(3)発射機構ははじめの段階では固定が不安定だということに問題がありました。その原因には、ホイールを遠くまで飛ばそうとしたとき発射の角度は上向きのほうがよいと考えていたこととレールはホイールの下側にあった方が良いという思い込みによるもので、はじめの発射機構のようなローラー・ホイール・レールの配置にこだわっていました。そうするとブロックの穴を利用してこの配置で作ろうと思うと、はじめの発射機構のように不安定な固定にならざるを得ませんでした。しかし固定の強化を優先し発射機構の向きを変えたところ、発射の角度に変化はなくレールが上側にあっても問題ないということがわかりました。先入観や思い込みを別の角度から見たことでなくすことができました。

向きの変化.jpg
発射機構変化.jpg

プログラムについて

プログラム(1)光を探す 

プログラム1の解説.jpg

このプログラムの目的は周囲から最も強い明りが照らされている場所を探すことです。そしてその場所にホイールを投げます。

#define RUN_TIME 1500   // トレースする時間;このロボットが一回転するのに要する時間
int MAX=0,        //光度の値の変数;最も明るいところを記憶するために必要
sub  THROW()            //ホイールを発射する動作
{
    OnFwd(OUT_B);
    Wait(50);
}
task main()
 {
    SetSensor(SENSOR_1,SENSOR_LIGHT);   //センサー1が光センサーであると認識させる
 
 ClearTimer(0);                       // Timer(0) をリセット
     
 OnFwd(OUT_A);              //ロボットを時計回りに回転させる(図1)
 Wait(RUN_TIME);            //15秒間
 
 while ( Timer(0) <= RUN_TIME )
  {                    // タイマーがRUN_TIME(15秒)以下の時に次の命令を繰り返す
  
   if(SENSOR_1 > MAX)          //もし、今の明るさが今までのどの明るさよりも明るい場合(図2)
   {
    MAX=SENSOR_1;            //変数MAXの値を今の明るさの値に置き換える
    TIME=Timer(0);                      //その時間を変数TIME代入し記憶させる
   }
  }
  
  if(HANBUN_RUN_TIME>TIME)              //もし、最も明るい場所が時計周りで考えたとき半回転よりも近い場所にあったなら
  {
     OnFwd(OUT_A);                      //そのまま時計周りをさせる
     Wait(TIME);                        //変数TIMEに記憶させた時間だけ回転しその場所へ行く
     THROW();                           //その場所でホイールを投げる
  }
  else                                  //もし、最も明るい場所が時計周りの回転で考えたとき、半回転より遠くにある時
  {
   TIME=RUN_TIME - TIME;                //一回転の時間から時計回りした時に最も明るいと判断した場所の時間を引いた値を変数TIMEに代入する。
   OnFwd(OUT_A);                        //反時計回りをする
   Wait(TIME);                          //最も明るい場所へ少ない回転角度で向かう
   THROW();                             //ホイールを投げる
  }
}

プログラム(2)光を追う

プログラム2の解説.jpg

2つの光センサーの反応の違い(場合分け)により、光源の位置を特定し動きます

#define THRESHOLD  55           //光度の閾値55を設定
task main ()
    {
      SetSensor(SENSOR_1,SENSOR_LIGHT);               
      SetSensor(SENSOR_3,SENSOR_LIGHT);               
      SetPower(OUT_C,5);                              //モーターの出力を5にする
      
      while(true){
         if(SENSOR_1 > THRESHOLD){
                     if(SENSOR_3 > THRESHOLD){ //センサーが両方閾値以上、つまり前方に光源があるとき
                           OnFwd(OUT_C);               //前進;デファレンシャルギアのため、左右を少しずつ動かす
                           Wait(30);         
                           OnRev(OUT_C);
                           Wait(30);                  
                    } else {
                       OnRev(OUT_C);                   //センサー1のみ閾値以上となったとき、左へ曲がる
                        }
                    } else {
                       if(SENSOR_3 > THRESHOLD){ //センサー3のみ閾値以上となったとき、右へ曲がる
                       OnFwd(OUT_C);                  
                          }else{
                              Off(OUT_C);                //センサーがともに閾値以下、つまり光源を見失ったとき止まる
                         } 
                   }
               }
               }

プログラム(3)光を追い光が止まったことを認識する

プログラム3の解説.jpg

光の追い方はプログラム(2)と同じです。しかし前進の動きを変数を使って数えることにより止まったことを認識します。

#define THRESHOLD  60    //光度の閾値を60と定義        
int run_count;                   //変数run_countを定義
task main ()
 {
      SetSensor(SENSOR_1,SENSOR_LIGHT);               
      SetSensor(SENSOR_3,SENSOR_LIGHT);               
      SetPower(OUT_A,5);    //モーターの出力をA5、C7とする
      SetPower(OUT_C,7);
   run_count = 0 ;                         //前進の回数を数える    
   while(run_count <= 3){             //前進が3回以下のとき   
             if(SENSOR_1 > THRESHOLD){   
                     if(SENSOR_3 > THRESHOLD){ //センサー1、3が閾値以上;前方に光源;前進
                           OnFwd(OUT_C);   
                           Wait(30);
                           OnRev(OUT_C);
                           Wait(30);
                           run_count += 1;            //前進が1回カウントされる
                    } else {
                       OnFwd(OUT_C);        //左へ曲がる
                       run_count  = 0;              //前進の回数をリセット
                          }
                    } else {
                       if(SENSOR_3 > THRESHOLD){ 
                       OnRev(OUT_C);            //右へ曲がる
                          }else{
                              Off(OUT_C);           //止まる
                              run_count = 0;                      //前進の回数をリセット            
                              }
                  }
      }
                                
              Off(OUT_C); 
              Wait(100);                            
                OnFwd(OUT_A);
              Wait(80);   
              Off(OUT_A);
                                   
}

考察

プログラム(3)では光源が前方で止まっているときは、前進を繰り返すことから3回以上連続して前進した場合、そこに光源があると考えた。ただし光源は動くためバラバラに3回前進することもあるので、右や左に曲がったり止まった場合には、カウントをリセットした。

コメントをお願いします

  • ロボット本体の説明はとてもわかりやすいです。プログラム(2)(3)については、絶対的なしきい値を基準にして明るい方向を探すのではなくて(1)と同様に他のどの方角よりも明るい方向を相対的に探すアルゴリズムを少し考えてもらいたかったと思います。 -- 松本 2008-01-19 (土) 22:07:18
  • 機構の説明は素晴らしいと思います。光の探し方についての説明があるとなお良いです。 -- クノ? 2008-01-22 (火) 00:07:00
  • 図を用いてわかりやすく説明できていると思いますが、プログラムにコメントはつけておいてください。 -- まいける(TA) 2008-01-23 (水) 15:48:11


添付ファイル: fileプログラム3の解説.jpg 660件 [詳細] fileプログラム2の解説.jpg 728件 [詳細] fileプログラム1の解説.jpg 683件 [詳細] file発射機構変化.jpg 804件 [詳細] file向きの変化.jpg 672件 [詳細] file完成.jpg 660件 [詳細] file問題点.jpg 710件 [詳細] file光センサーの変化.jpg 697件 [詳細] fileつい立の効果.jpg 675件 [詳細] file移動.jpg 870件 [詳細] file発射方法.jpg 786件 [詳細] file発射機構(2).jpg 732件 [詳細] file発射機構(1).jpg 782件 [詳細] file回転方向.jpg 687件 [詳細] fileラチェット.jpg 921件 [詳細] file各部名称.jpg 786件 [詳細] file作動装置の役割.jpg 1016件 [詳細] filePA0_0096.JPG 676件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-10 (日) 21:54:40