目次

ロボコン

ルール

・ロボットでテニスボールを所定の位置に運ぶ
・4隅のコーナー(半径30cmの1/4円)のいずれかからスタートする
・開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること
・1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。

戦略

一台のロボットで下記の機能を持たせた

・ボールの取り出し
・ボールの運搬
・ボールを上から箱に入れる
・ボールを下から箱に入れる

と非常に汎用性の高いロボットを製作した
ソフトウェアによる改良、ソースコードの流用を目的とするため、同じ仕様のロボットを2台作った。
具体的な戦法として、それぞれが確実にボールを取り、最低1点は加点することを目的とした。
それぞれのロボットには異なった方向性のプログラムを入れ、それぞれの可能性を比較することでより精度の高いロボットを目指した

使用したロボット

A2のロボットは2台とも同じ仕様のロボットである。
そしてその両方が独自に得点をいれるように作られている
これは「ロボット同士の連携を」廃したわけではない。 同じ仕様のロボットということはプログラムの流用が容易いということだ。
つまり、A2のロボットの「連携」とはフィールド上におけるロボット同士の動きの連携ではなく、目に見えない部分における「プログラムの連携」である。

全体図

TS3H0123.JPG

ロボット前方にキャッチしたボールを入れるスペースを確保しているため、
RCXを後方につける必要があり、重心はやや後方にある。
したがって、車体を安定させるために後方にキャスターを付けた。
タイヤは狭いフィールドでの移動を考え車体の中心に取り付け、小回りが可能である。

アームモーター

TS3H0124.JPG

今回のロボコンにおいてアームはボールを取り出し、ボールを保持し、ボールを持ち上げる、ボールを弾き飛ばす・・・
と、数多くの役割を担っている。
特に並んでいるボールを取り出すにはモーターのトルクを最大限に生かす必要があった。
試行錯誤の結果、図のようなギアの組み合わせになった。
結果として、ボールを箱に入れる速度は他の班のロボットに比べて格段に速いものとなった。
その速さは「動画紹介」で確かめてもらいたい。

車体内部

TS3H0125.JPG

今回のロボコンにおいてボールの初期位置には木に棒が2本並んで横たわっている。
そのためロボットは一定の方向からしかボールを取り出すことができない。
しかも、木の棒にはある程度の高さがあるため木の隙間に近づいても普通の車高ではぶつかってしまう。
故にA2のロボットは車体の前方を空洞化することで更にボールに近づけるように設計した。

ボールキャッチ

TS3H0131.JPG

独特の形をしたアームでボールを包み込むように車体の中に取り込む。
ボールは車体の中にある斜面に沿って無理なくアームに乗るようになっている。

ボール保持

横から

TS3H0132.JPG

正面から

TS3H0126.JPG

ボールキャッチの動作から自動的にボール保持の状態に移行する。
ボール保持の状態ではモータなどによって挟み込んでいる訳ではないのでアームのモーター一個で足りるのが大きな利点となっている。
また、ボールは完全に地面から離れているので地面との摩擦の影響はなく移動中にボールが落ちてしまうことはない。

アーム

TS3H0135.JPG

ボールキャッチ、ボール保持、ボールを入れる(上下兼用)・・・・
このアームは今回のロボコンにおいての最重要機構の一つである。
他の班多くががボールを入れる方向を上か下どちらかのみに特化してしている中、そのどちらにも特化したロボットを作った。

それを実現したのがこのアームである。
上の図より、黒と黄色のアームでボール保持を担当し。
そして、赤線で囲った部分はボールの後方からえぐりこむようにボールの後方からボールを持ち上げる。

スロープ

TS3H0133.JPG

地面にあるボールを持ち上げ場合においてこのスロープは大変重要な役割を担っている。
これがない場合、アームの力だけではボールを持ち上げることはできない。
また、アームとボールの力が直接加わるのでどうしてもブロックが外れやすいのが欠点である。本番はこのスロープがうまく作用せずにボールを引きずることしかできなかった。

ボールを箱に入れる(上から)

TS3H0127.JPG

一見すると、ボールが箱を飛び越えていきそうなイメージを抱きがちだが
アームがガイドラインの役割を果たすためボールはまっすぐに落ちる。
ボールを箱に入れる際にはアームが箱に引っかかるのを防ぐために、ボールを箱に入れたらすぐにアームを戻すという動作が必要となる。
これは「動画紹介」の「上からポイントする動画」を見るとよくわかります。
アームを戻すのは一瞬なので見逃さないように。

ボールを箱に入れる(下から)

TS3H0128.JPG

ボールを保持した状態からアームを逆回転させることによって一度ボールを地面に落とし、一回転してきたアームで前方にボールを打ち出します。
今までボールを支えるために使用してきたアームの更なる利用法として苦労して設計しました。
アームの回転速度が速いためかなり遠くまで転がすことができます。
しかも、アームの構造上ボールの中心を押すわけでなく、ボールの左右を二ヶ同時に押し出すので正確に前に転がるようになっている。

これも「動画紹介」の「下からポイントする動画」を見るとよくわかります。
ボールを地面に落としたときにあまり転がらずにアームがあたる位置に停止するところに注目して見てください。

プログラム

プログラムの方向性について

A2では二台ロボットはほぼ同じ機能・構造をもっている。
だが、二台のロボットのプログラムの方向性は大きく異なっている。

ロボットA
 ⇒光センサー、回転センサーを用い正確にロボットに指令を与える。
  

ロボットB
 ⇒試行錯誤の結果から求めた数値計算による移動時間の設定。
  自動プログラムによってフィールド上を動き続け、ボールを探し続ける

誤解のないように書いておくが二台のロボットには優劣はない。
「それぞれのロボットが独自に得点をいれる」
そのためには一つの方向性で縛るよりも異なった方向性の方が都合が良かったにすぎない
最終的に一方のプログラムが優れていれば、もう一台もそれを流用するつもりだった。

ロボットA

フィールドでの動き

A.png

プログラムA

#define go OnFwd(OUT_A+OUT_C);                      //前進を「go」で定義
#define back OnRev(OUT_A+OUT_C);           //後進を「back」で定義
#define right OnFwd(OUT_A);OnRev(OUT_C);      //右回りを「right」で定義
#define left OnFwd(OUT_C);             //左回りを「left」で定義
#define enter OnRev(OUT_B);             //ボールを箱の上に入れる動作を「enter」で定義
#define shot OnFwd(OUT_B);             //ボールを箱の横に入れる動作を「shot」で定義
#define freez Off(OUT_A+OUT_C); Wait(100);     //モーターA,Cの停止を「freez」で定義
#define freezb Off(OUT_B);             //モーターBの停止を「freezb」で定義
#define r freez Wait(30);              //0.3秒間停止する動作を「r」で定義
#define gool  enter;Wait(50);shot;Wait(30);freezb; //ボールを上に入れてアームを元の位置に戻す動作を「gool」で定義
#define hand  enter;Wait(50);freezb;        //ボールを取り出し、保持する動作を「hand」で定義
#define THRESHOLD 40
task main()
{ SetPower (OUT_A,3);           //モーターAのパワーを3にセット
  SetPower(OUT_C,3);      //モーターCのパワーを3にセット
  SetPower (OUT_B,7);      //モーターBのパワーを7にセット 
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_ROTATION);
	
	go
	until (SENSOR_1 < THRESHOLD) ;  //仝センサーがラインの上を通るまで前進
	freez
	right
	ClearSensor(SENSOR_2);      //回転センサーの値を初期化する
	until(SENSOR_2 > 6);       //回転センサーの値が6より小さいなら右に方向転換を続ける
	freez
	go
	until (SENSOR_1 < THRESHOLD) ;  //光センサーがラインを上を通るまで前進
	freez
	enter               //ボールを車体に取り入れる
	Wait(65);
	freezb
	back               //▲棔璽襪鯤飮したまま後進する
	Wait(30);
	back
	until (SENSOR_1 < THRESHOLD) ;  //光センサーがラインの上を通るまで後進
	freez
	left
	ClearSensor(SENSOR_2);      //回転センサーの値を初期化する
	until(SENSOR_2 < -7);       //回転センサーが2からー7より大きくなるまで左周りに方向転換
	freez
	go                //前進する
	Wait(130);
	freez
	left               //箱の前で左に90°方向転換
	Wait(70);
	freez
	go                //箱に密着するために前進
	enter               //ボールを箱に入れる
	Wait(100);
	freez
	shot               //アームが箱に引っかからないようにアームを戻す
	Wait(50);
	freezb
	
	while(true) {
	right               //H△料阿韮坑亜詈向転換
	ClearSensor(SENSOR_2);      //回転センサーの値を初期化
	until(SENSOR_2 > 3);       //回転センサーの値が3より大きくなるまで方向転換を続ける   
	freez
	back               //後進
	until (SENSOR_1 < THRESHOLD) ;   //光センサーがラインの上を通るまで後進を続ける
	right
	ClearSensor(SENSOR_2);      //回転センサーの値を初期化
	until(SENSOR_2 > 3.);       //回転センサーの値が3より大きくなるまで方向転換を続ける
	go                //前進する
	Wait(30);
	go
	until (SENSOR_1 < THRESHOLD) ;  //光センサーがラインの上を通るまで前進
	freez
	enter               //ボールを取り入れる
	Wait(65);
	freezb
	back               //じ綽覆垢
	Wait(30);
	back
	until (SENSOR_1 < THRESHOLD) ;  //光センサーがラインの上を通るまで後進を続ける
	freez
	left
	ClearSensor(SENSOR_2);      //回転センサーの値を初期化
	until(SENSOR_2 < -6);       //回転センサーの値が−6よりも小さくなるまで方向転換を続ける
	freez
	go
	Wait(130);
	freez
	left
	ClearSensor(SENSOR_2);      //回転センサーの値を初期化
	until(SENSOR_2 < -6);       //回転センサーの値がー6よりも小さくなるまで左周りに方向転換を続ける
	freez
	go                                //箱に近づくために前進
        Wait(30)
	enter                             //ボールを箱に入れる
	Wait(100);
	freez
	shot               //アームが箱に引っかかるのを防ぐためにアームを戻す
	Wait(50);
	freezb
	
	
	}
	}

初めは秒数による位置の特定をしていたが、回転センサーを使った方が正確であるため、回転センサーを使ったプログラムに書き換えた。その際に上手に動かずに停止したため、不具合の原因を特定するために該当箇所と思われる部分のみを書いたプログラムを走らせて原因を特定するのに使った。

#define go OnFwd(OUT_A+OUT_C);
中略
#define THRESHOLD 40
task main()
{  SetPower (OUT_A,3);
   SetPower(OUT_C,3);
   SetPower (OUT_B,7);
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_ROTATION);
	left
	until(SENSOR_2 < -6);
	freez}

原因は、コードの書き忘れだったのでこのコードが直接の原因ではなかったが、このように問題が生じたときに単純なプログラムを作り、動作確認をすることは非常に良い方法だ。

回転センサーについて

ロボコン当日に急遽回転センサーを実装したため、センサーとモーターのギア比が1:1で、あいまいな評価しかできなかった。もう少し時間があればギア比を高いものにすることで、より正確な評価ができた可能性があった。

ロボットB

フィールドでの動き(一回目)

B.png

フィールドでの動き(再スタート)

B2.png

プログラムB(一回目)

#define go OnFwd(OUT_A+OUT_C);                      //前進を「go」で定義
#define back OnRev(OUT_A+OUT_C);           //後進を「back」で定義
#define right OnFwd(OUT_A);OnRev(OUT_C);      //右回りを「right」で定義
#define left OnFwd(OUT_C);             //左回りを「left」で定義
#define enter OnRev(OUT_B);             //ボールを箱の上に入れる動作を「enter」で定義
#define shot OnFwd(OUT_B);             //ボールを箱の横に入れる動作を「shot」で定義
#define freez Off(OUT_A+OUT_C); Wait(100);     //モーターA,Cの停止を「freez」で定義
#define freezb Off(OUT_B);             //モーターBの停止を「freezb」で定義
#define r freez Wait(30);              //0.3秒間停止する動作を「r」で定義
#define gool  enter;Wait(50);shot;Wait(30);freezb; //ボールを上に入れてアームを元の位置に戻す動作を「gool」で定義
#define hand  enter;Wait(50);freezb;        //ボールを取り出し、保持する動作を「hand」で定義
task main ()
 {
  SetPower (OUT_A,3);           //モーターAのパワーを3にセット
  SetPower(OUT_C,3);      //モーターCのパワーを3にセット
  SetPower (OUT_B,7);      //モーターBのパワーを7にセット
  int p;            //変数「p」定義
  p=0;             //pに0を代入
      while (p<1)        //「フィールドの動作」の´△砲△燭詁虻
      {
       go
       Wait(50);
       freez;r;
       left;
       Wait(90);
       freez
       go
       Wait(100);
       freez;r;
       hand;r;         //ボールをアームに取り込み保持する
       back
       Wait(40);
       right
       Wait(90);r;
       go
       Wait(30);r;
       right
       Wait(90);r;
       go
       Wait(200);r;
       gool            //ボールを箱の上から入れる
       p=1;
      }
     while (1<=p<3)       //「フィールドの動作」のい砲△燭詁虻
     {
       r:back;
       Wait(180);r;
       go
       Wait(50);r;
       right
       Wait(90);r;
       go
       Wait(90);r;
       hand;r;
       back
       Wait(40);
       right
       Wait(90);r;
       go
       Wait(120);r;
       gool
       p=p+1;
      }
     while(3<=p<=4)        //二個目のボールが箱に入らなかったときの為にい鬚發Γ臆鷏り返す
      {
       r
       back
       Wait(100);r;
       left
       Wait(90);r;
       go
       Wait(80);r;
       hand;r;
       back
       Wait(60);r;
       right
       Wait(90);r;
       go
       Wait(100);r;
       gool
       p=p+1
      }
     while(5<=p<6)         //ボールを箱の上に入れるのを諦めボールを弾き飛ばすことで横からボールを入れる
      {
       r;back;
       Wait(180);r;
       go
       Wait(50);r;
       right
       Wait(90);r;
       go
       Wait(90);
       freez;r;
       shot
       Wait(300);
       freezb;r;
       go
       Wait(100);
       freez;r;
       shot
       Wait(300);
       freezb
       p=6
      }    
     while(6<=p)           //位置を調整したのちにい砲△燭詁虻遒北瓩
     {
      back
      Wait(50);
      freez;r;
      go
      Wait(80);
      freez;r;
      shot
      Wait(200);
      freezb;r;
      p=2
     }
 }

プログラムB(再スタート)

<中略>
task main()
{go                   //「フィールドでの動き(再スタート)」の,砲△燭詁阿
 Wait(60);
 freez
 left
 Wait(54);
 freez
 go
 Wait(60);
 freez
 r
 hand         //ボールを取り込み保持する
 freezb
 back                 //△砲△燭詁阿
 Wait(36);
 freez
 r
 left
 Wait(80);
 freez
 r
 go
 Wait(30);
 freez
 back                //箱の前から少し離れることで位置を調整する
 Wait(20);
 freez
 shot         //ボールをけり飛ばして箱に入れる
 Wait(100);
 freezb
}

動画紹介

テニスボールを入れる動画です。
見る場合は下のファイルをクリック⇒ダウンロードすることで見れます。
ファイル形式は「avi」なので「windows media player」でも再生可能です。
携帯動画からの変換なので画質は悪いですが、内容はわかると思います。
文面だけでは仕組みを説明できなかった箇所もあると思うので
できればTAの方にはぜひ見てもらいたいです。

上から入れる動画.jpg

★★↓をクリック★★

下から入れる動画.jpg

★★↓をクリック★★

結果

内容だけ見ればボールを箱に入れることができなかった「失敗」と言わざるをえない。
ロボットBは一個目が入らなかったため再スタート時のプログラムをお見せすることができなかった。
原因としてはスロープがうまく作用せずボールを完全な保持の状態に移行できなかったことがあげられる。
だが、1個目のボールを運び終わったあとにロボットを停止させている班が多い中、自分たちのグループは2個目、3個目・・・のボール獲得を狙いロボットを動かし続けたことに目を向けて欲しい。
特に、一個目のボールを保持はしたが箱に入れられずにいたときも再びボールを取りにいきボールを入れようと何度も箱に近づいた。
結果として自分たちの班は優勝したA1に比べても多くのボールに触れ、動かした。
制限時間が設定されていない今回のルールにおいて一つ目のボールだけで満足するのは少々物足りない。
故に自分たちはたとえボールが入らないとしても僅かな可能性を信じてボールを動かし続けた。

2回目以降のボール運びができなかった問題

左右の重さのバランスから、正確に前進できず、若干右方向に進む仕様のロボットだった。この特性のため、一度ボールを目標に入れてから再度ボールを拾いにいこうとする際、大幅にずれた場所に行ってしまった。この問題も最後まで解決できず、一台あたり一つのボールをゴールに入れられれば負けはしないだろうという予測のもとで製作を進めた。
実際、その戦法は間違いではなかったが、さらに改良するならば、8の字に交差する部分をリセットポイントとし、1回目の動作が終了すると後退、内側のラインまで戻り、ラインに沿って周回運動を経ることで位置と動作の初期化ができたかもしれない。

他グループから学べた点

通信機能を使わずに2台のロボットの連係動作を期待するグループが非常に多かったが、スイッチを入れるタイミングをあわせる必要があるため、最適とはいえない。制作者の練習が必要な初期位置の調整を要するロボットも多数みられた。自分たちのグループのロボもそれであったが、前に述べた通り、最初にライントレースする動作を組み込むことで、この問題は容易に解決できたであろう。A1のロボットは、ライントレースを組み込むことで正確なボール運びを可能にしていた。非常に良いロボットだと思う。考えてみればゴール直前まで線が引いてあるのだから、利用しない方がおかしい。

ロボコンで失敗した理由として考えうるもの

リハーサルではボールが運べたのに、本番では失敗した理由のうち、考えられるものは「2台同時に走らせたことがなかった」であろう。ボールは初期位置にある場合にとれるよう設定してあったため、2台同時に、両側からボールを取ろうとすると、両側からボールが圧迫されるため、トルクが足りずにアームがボールを拾えなかったと考えられる。

またこれはすべての班にも言えることだが、プログラムの例外処理が不完全であったと思う。
例えばロボットの進行方向が予定したコースとずれてしまったときなど如何にして再びコースに復帰するか・・・などそこらへんの動作をプログラムすれば精密さ以上にかなり成功率が上がると思われる。
A2のロボットもタッチセンサーなどを用いてボールをアームに乗せたことを認識させ、もし乗らなかったときは「再びキャッチしなおす」といった動作をプログラムをすればよかったと思われる。

コメント

気づいた点やアドバイスがあったら書き込んでください。



添付ファイル: fileTS3H0126.JPG 327件 [詳細] fileTS3H0135.JPG 356件 [詳細] fileTS3H0133.JPG 328件 [詳細] fileTS3H0128.JPG 316件 [詳細] fileTS3H0127.JPG 341件 [詳細] fileTS3H0132.JPG 388件 [詳細] fileTS3H0131.JPG 343件 [詳細] fileTS3H0125.JPG 311件 [詳細] fileTS3H0124.JPG 331件 [詳細] fileB2.png 333件 [詳細] fileB.png 344件 [詳細] fileA.png 322件 [詳細] fileTS3H0123.JPG 344件 [詳細] file下から入れる動画.jpg 318件 [詳細] file上から入れる動画.jpg 309件 [詳細] file下からポイントする動画.avi 282件 [詳細] file上からポイントする動画.avi 363件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-08-08 (金) 05:40:58 (4032d)