2008a/ロボコン

課題:ボール運搬ロボット

テニスボールを所定の位置に運搬するロボットの作成。 それを使ってロボコンを行います!!

ロボコンについて

<ルール>

ボールをそれぞれ向きの違う棒に挟まれた状態から 運びだし、4箇所あるゴールの箱に入れる。 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 4隅のコーナー(半径30cmの1/4円)のいずれかからスタートする。 スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。 開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること。 競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。

メンバー紹介

小鉢、小次郎、コリン、あやこの四人。

ロボットが役割分担して二台あるので、小鉢・コリンチームと小次郎・あやこチームに分かれてプログラムとロボット制作をしました。といっても、ロボット制作は小鉢と小次郎が担当してます。ホムペはコリンが主に担当しました。

使用するロボットについて

二台のロボットを使うにあたって、それぞれ役割分担をすることにしました。一台はテニスボールを板の間から押し出すロボットで、もう一台は押し出されたテニスボールを運ぶロボットです。詳しいロボットの説明は下の項目で!!

ボールを押し出すロボット

ボールを押し出すロボット

ボールを押し出すロボットの全体像。ボールを押し出すために細長いブロックを付けました。ブロックの先についている角には、特に役割があるわけではありません。デザインとしてついています。デザインは大事ですよ!!デザインについて言うと、モータに接続するコードを交差させました(地味だけど)、こっそり目もついてます。

タイヤ

モーターとタイヤの接続部分。前進するときは矢印のように動きます。

ボールを運ぶロボット

ボールをつかむロボット

ボールをつかむロボットの全体像。かなり工夫してました。目がついてて、デザイン的にもかわいくなってます!!

ボールをつかむ仕組み

ボールをつかむ時は、赤い矢印のように手(仮)が動いてボールをつかみます。下の手がボールをすくうようにして、両側の手がボールが落ちないように周りを支えます。ボールをつかむ仕組みは、中央の黒い棒に押し出されたテニスボールにぶつかると奥のタッチセンサが反応して手が動くと言う具合になっています。

ボールをつかむ仕組み

手(仮)が動く仕組み。矢印のように歯車が回って手(仮)が動きます。これは小次郎が頑張って作りました。モーター一つで三つの手を動かすことが大変でした。

ボールをつかむ仕組み

タッチセンサが押される仕組み。まず左の黒い棒にボールが当たるとピンクの矢印から黄色い矢印のように動きが連動していきます。最後に、水色の矢印のようにタッチセンサが押されると言う仕組みです。このタッチセンサは、少しの力では押されないけど、テニスボールを押し出す力が強いので大丈夫!!

プログラムについて

コース

水色の矢印がボールを運ぶロボットの動きで、赤い矢印がボールを押し出すロボットの動き。ボールを押し出すロボットは、ボールを押し出した後、もう一つのテニスボールがあるところへ向かって、ボールを押し出して入れようとする奇跡的な行動に移る。これは、ボールが入ればラッキーというカンジなので、おまけで作ったプログラム。�と�のところでは、ボールを押し出した後に一度後退して、右に曲がります。

ボールを押し出すプログラム

void go(int t)      // 前進するプログラムをと go 設定
{
OnRev(OUT_A+OUT_C);    // AとC出力のモータを負回転させる      
Wait(t);          // t秒間実行
Off(OUT_A+OUT_C);     // AとC出力のモータを止める
}
void back(int t)     // 後退するプログラムをと back と設定
{
OnFwd(OUT_A+OUT_C);    // AとC出力のモータを負回転させる      
Wait(t);          // t秒間実行
Off(OUT_A+OUT_C);     // AとC出力のモータを止める
}
void turn_left(int t)   // 左に曲がるするプログラムをと turn_left と設定
{
OnFwd(OUT_C);           // C出力のモータを正回転させる
OnRev(OUT_A);           // A出力のモータを負回転させる 
Wait(t);         // t秒間実行
Off(OUT_A+OUT_C);     // AとC出力のモータを止める
}
void turn_right(int t)   // 右に曲がるするプログラムをと turn_right と設定
{
OnFwd(OUT_A);           // A出力のモータを正回転させる
OnRev(OUT_C);           // C出力のモータを負回転させる 
Wait(t);          // t秒間実行
Off(OUT_A+OUT_C);      // AとC出力のモータを止める
}

↓以上の設定の素にしたのプログラム

task main()
{
go(300);
turn_left(85);
go(195);
Wait(50);
back(100);       // ,念貉後退。
turn_right(90);     
go(200);
turn_left(90);
go(240);
turn_right(82);
go(260);
back(250);       // △念貉後退。
turn_right(85);
go(300);
turn_right(85);
go(500);
turn_right(85);
go(150);
turn_right(150);    // 最後は角でボールを押し込むイメージ。
}

ボールを運ぶプログラム

task main()
{ 
SetSensor(SENSOR_1, SENSOR_TOUCH);
{
OnFwd(OUT_A+OUT_C);
Wait(200);
OnFwd(OUT_C);
OnRev(OUT_A);
Wait(90);
OnFwd(OUT_A+OUT_C);
Wait(150);
Off(OUT_A+OUT_C);
}
while (true) 
{
if (SENSOR_1 == 1 )
{
OnFwd(OUT_B); 
Wait(200);
Off(OUT_B);
Wait(100);
OnRev(OUT_A+OUT_C);
Wait(50);
Off(OUT_C);
OnRev(OUT_A);
Wait(90);
OnFwd(OUT_A+OUT_C);
Wait(300);
Off(OUT_A+OUT_C);
OnRev(OUT_B);
Wait(50);
OnFwd(OUT_A+OUT_C);
Wait(100);
Off(OUT_A+OUT_C);
}}}

制作してみての感想

どちらのロボットもボールにたどり着くまでに、時間を調節しなければいけなかったのだけど、電池の消耗などで細かく調節することが出来なかったので、大変だった。これは、今までの課題でも苦労した点。

タッチセンサの感度が悪くて、最終的にボールを押し出すロボットで使えなかったのが厳しかった。

進化

↑実は、ボールを押し出すロボットはこういうの進化を遂げていたんです。角は進化の証のような・・・。最終的にシンプルになりすぎてしまったので、コードを交差させてみたのですが、モーターの回転が変わってしまったのでプログラムに影響が出て大変でした。他に、一時短いコードがなぜか使えなくなったりとアクシデントが多くて、根気が必要でした。

ボールを押し出すプログラムは、簡単だけど、ごちゃごちゃしないように整理しました。

全体的に、ロボットのデザインに力を入れました。今回で最後なのでレポートにも力を入れました。

<ロボコンの感想>

ロボコンのリハーサル後に微調整のため少し変更して飛ばしたプログラムがもう片方のロボットにも入ってしまうというハプニングが発生して大変でした。 もっとセンサーを上手く使い、電池の消耗や床との摩擦にも関係なく正確に動けるロボットに改良できたら良いな、と思いました。

コメントお願いします



添付ファイル: filecorse1.jpg 537件 [詳細] filerobo1.jpg 624件 [詳細] filerobo2.jpg 547件 [詳細] filerobo1-gia2.jpg 547件 [詳細] filerobo1-touch2.jpg 659件 [詳細] filerobo2-gia2.jpg 558件 [詳細] filesinka1.jpg 616件 [詳細] filerobo.jpg 662件 [詳細]

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