2008b/MemberOnly/進行状況A

signbord.gif

◇ 目次 ◇

課題

空き缶運搬ロボットを作成して競技を行う。

内容

・基本ルール

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

・基本得点の計算方法

緑の空き缶を1個ゴールに運べば4点。
黒い空き缶(最上の空き缶)を運べば8点
空き缶を場外に出してしまった場合は一個につきマイナス1点。
半分以上ゴールに入った空き缶だけを得点の対象とする。ただし空き缶がゴールからはみ出している場合は、マイナス1点

・技術点の計算方法

得点の目安:
空き缶までたどり着く動作 (3点)
空き缶を運ぶ動作 (転がす・掴むなど) (4点)
空き缶をゴールに入れる動作 (2点)
2台以上のロボット、あるいは単体のロボットの場合は2台のRCXの連携の良さ(3点)
自立型のロボットとしての形や動作の美しさ、斬新さ(3点)
その他 (5点)

コース紹介

course.jpg

・黒い部分は黒線に成っているのでライントレースに使用可能
・茶色い部分は壁
・ゴール周辺は2〜3冂の壁になっている
・水色部分に缶を4つ積む

作成ロボット

robo.gif

作成過程

1/22
・とにかくアームを作成してみる
・やっぱりホールド力を考慮してキャタピラを用いた引き込み式のアーム作成に方向転換
・幅の広い土台作りに取りかかる。

1/29
・試作品ができあがるが、キャタピラ式では缶が立っている場合は上手く引き込めるが
倒れていると難しい事と引き込み角にかなり左右されることが判明
・コース説明から作成したキャタピラ方式ではゴール時に缶を枠内に押し込めない可能性があるのと、持ち運びが1個づつであるのを考慮する
・何度もコースを行き来するには不確定要素が多く、成功率が低くなると考えて一度に4つの缶を運ぶロボットの作成に方向転換する。
・マシンを二台作成し、片方が缶を支えて、もう片方が缶を押し込んで持ち運ぶ方式を考える。
・実際の缶を扱うと意外に倒れにくいことに気がついて、そのまま押してみてはどうかと考える。
・ボックス系のロボットの作成に取りかかる。
・またゴール前で缶の下側をブロックで押すと軽く倒すことが出来ることを判明
・ゴール時に缶を持ち上がる動作なども必要ないので、マシンの下部からスライド式に棒を打ち出す機構作りに取りかかる。

1/4
・センサー類の取り付けも含め、以上の構想からマシンをほぼ完成させる。

mikan.jpg

1/5
・他のチームに比べ見劣りがあったので急きょプロペラを取り付ける。

完成ロボット

上の大きな写真が完成ロボットの全体図になります。

sensor.jpg

★光センサーとタッチセンサーはコンパクトにまとまっています。
またタッチセンサーは低い位置に設置し、壁の高さに左右されないようになっています。(出っ張りがない限り)

lunch.jpg

★上の写真の様にして缶をしたから斜めに持ち上げ、押し倒してゴールを決めます。

★プロペラの拡大図

fan.jpg

走行中に回ります。
赤いプロペラがマシンの印象をシャープに演出します。

工夫点

・高く伸びたホースの部分など、よく見るとどことなくラビットな印象を与えます。(写真提供;ウィキペディア「兎」より)

rabbit.jpg

・出来るだけコンパクトにすることで機動性と誤差範囲を上げました。
・他のチームは缶を挟み込む方式でしたが、ボックスで押して運ぶ方式にしました。
 この方式は缶を取り入れるときに多少位置が多少ずれても移動時に缶が自然と中に入って来ます。
 従って缶の取り込み時の成功率がとても高くなっています。

ball.gif

・マシン下部からシのュート式の機構を取り入れることで、普通に押し込んでは引っかかるところを
缶を傾ける→押し出しながら倒すという順序で缶をゴール内に入れることが出来るようにしました。
・プロペラも走行中のアクセントになっていると思います。

プログラム

走行順序

run.gif

プログラム概要

●マシン用●

#define R1 40                                         //光センサーの閾値     
#define Go_ F OnFwd(OUT_A+OUT_C);                    //直進のショートカット
#define TURNab OnFwd(OUT_A); OnRev(OUT_C); Wait(115); //90度旋回(右)
#define TURNba OnFwd(OUT_C); OnRev(OUT_A); Wait(115); //90度旋回(左)
#define STOP Float(OUT_A+OUT_C);Wait(150);           //なめらかに止まり、しばらく停止
 
void go_back(int t)                   // 缶を運ぶときの動き方を関数で定義
{ 
OnRev(OUT_A+OUT_C);Wait(t /2);STOP;OnRev(OUT_A+OUT_C);Wait(t /2);STOP;
}
void Turn_R(int T)                   //曲がる角度を任意に決められるように関数定義(右)
{ OnFwd(OUT_A); OnRev(OUT_C); Wait(T); }
void Turn_L(int T2)                  //曲がる角度を任意に決められるように関数定義(左)
{ OnFwd(OUT_C); OnRev(OUT_A); Wait(T2); }

 task main()

{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_TOUCH);
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサーのポートと種類の設置

Wait(150);
Go_ F;Wait(100);               //スタート時に光センサーが反応しないための移動
Go_ F ;
until(SENSOR_3 < R1)            //黒い線に触れたら 
Turn_R(100);                 //右に旋回
while(true)
{
Go_ F ;
 if(SENSOR_1 < R1)            //光センサーで左右のズレを修正しながら前進
 { OnRev(OUT_A); }
  if(SENSOR_3 < R1)
  { OnRev(OUT_C); }
 if(SENSOR_2 ==1)            //タッチセンサーが反応したらwihle{}外のプログラムに移る  
 { break; }
}
OnRev(OUT_A+OUT_C);Wait(45);  //旋回幅を取るための後退動作
TURNba;            //左に90度旋回
Go_ F ;Wait(540);              //任意時間直進
Turn_R(60);          //任意角右への旋回
OnRev(OUT_A+OUT_C);Wait(435); //任意時間直進
STOP;         
Turn_L(46);          //任意角左へ旋回
STOP;                          //空き缶が落ち着くのを待つ
OnRev(OUT_A+OUT_C);Wait(90);  //任意時間直進
STOP;                          
SetPower(OUT_A+OUT_C,1);     //モーターの出力を下げて移動速度を落とす
OnRev(OUT_A+OUT_C);Wait(116);  //任意時間直進
STOP;
SetPower(OUT_A+OUT_C,5);         //モータの出力を上げる
TURNab;              //右に90度旋回
STOP;
go_back(350);           //直進の安定走行(走行時に停止動作を含む)
Turn_R(57);            //右に任意角旋回
STOP;
go_back(330);           //直進の安定走行(走行時に停止動作を含む)
Turn_L(46);            //右に任意角旋回 
STOP;
OnRev(OUT_A+OUT_C);Wait(80);  //任意時間前進
STOP;
              //缶をゴールに入れるための動作       
OnFwd(OUT_B);        //缶を倒す部分をはじき出す   
Wait(200);
Off(OUT_B);
}

試行走行の繰り返しにより走行数値の多くを得ました。

●プロペラ用●

task main()
{
while(true)              //以下の動作をずっと繰り返す
{  
SetPower(OUT_A,0);   //モーター出力を下げて回転速度を調整
OnFwd(OUT_A);
Wait(7); 
Float(OUT_A);      //慣性力で羽根が回るようにする
Wait(13);
}

プログラム工夫点

・マクロや関数を用いてプログラムの簡素な表示に心がけました。
・缶を運ぶときは普通に進むと缶が倒れてしまうために、モーター出力を調節してスピードを落としたり、
 なめらかな停止動作や適度な停止時間を用いて上手く缶を倒れないようにしました。

ロボコンを終えて・・・

run.jpg

いろいろ不具合やハプニングもありましたが、再チャレンジでゴールを決めることが出来たときは感動しました。
缶を運んでいるときは、何時倒れやしないかとハラハラドキドキの連続でした。 また見事3位を勝ち取れたことも良い思い出になりました。

プログラム作りはなかなか思い通りにマシンが動いてくれず試行錯誤の連続で、プログラム作成の難しさや地道な作業の大切さを感じました。

全体を等して非常に大変な作業でしたが、終えてみるととても充実して大きな達成感が感じられる良い経験になったと思います。

◆よろしければコメントをどうぞ◆

  • 今回の課題のポイントの一つに缶をいかにつかむかでしたか、そこを工夫していたのは良かったです。また、内容を充実させるとともにレポートも見やすいように頑張っています。 -- FI? 2009-02-14 (土) 03:50:49
  • うまく缶が運べたときの動画や写真、図があるとわかりやすいと思います。 -- なかむら? 2009-02-16 (月) 06:28:28


添付ファイル: fileball.gif 296件 [詳細] filesignbord.gif 236件 [詳細] filerun.jpg 244件 [詳細] filerun2.jpg 127件 [詳細] filesensor.jpg 267件 [詳細] filefan.jpg 249件 [詳細] filelunch.jpg 264件 [詳細] filerabbit.jpg 267件 [詳細] filemikan.jpg 260件 [詳細] filerun.gif 271件 [詳細] filerobo.gif 263件 [詳細] file表紙.gif 229件 [詳細] filecourse.jpg 251件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-02-16 (月) 06:28:28 (3839d)