ロボコン

''内容''

基本ルール

●4段に積まれた空き缶を運びだし、ゴールに入れる。

●競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。

●2隅のコーナー(30cm四方)からスタートする。

●競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。

●途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。

基本得点の計算方法

●緑の空き缶を1個ゴールに運べば4点。

●黒い空き缶(最上の空き缶)を運べば8点

●空き缶を場外に出してしまった場合は一個につきマイナス1点。

フィールドの説明

?plugin=attach&refer=2008b%2F%A5%ED%A5%DC%A5%B3%A5%F3&openfile=robocon2008b-3.png

フィールドは約160cm×110cm

空き缶が積み上げられている場所を中心に半径10cm,20cm,30cmの円が黒い線で描かれてる

黒い線の太さは約25mm

ロボット製作

概形を考える

ロボットの台数

今回は2台のロボットを使う、あるいは2セットのキットを使って1つのロボットを使う2通りの方法が選べるが、2台で分業させると、連携させる必要がある。

しかし、それが難しく、1台に機能をまとめた方がパーツ、スペース面で自由度が広がる等のメリットがあることから、1台に機能を集約にすることにした。

缶の運び方

初めは4つ一緒に運ぶことを考えたが、全高があまりにも高くなり過ぎ、アームの強度、サイズから信頼性に問題があるように思えた。掴む前に接触することによる缶の転倒、パーツの破損、運搬中の缶の脱落などが起きた場合、缶の後の回収が困難になるからである。

次に考えたのは、大型アームで壁を越えて缶を掴み、アームをゴールまで直接持っていく方法。この問題点は、缶とゴールの間の壁の配置が、当初定められてなかったこと、正確に缶を掴めそうになかったこと、アームが重くなりすぎること。面白い発想だったが実現性に乏しかったため廃案に。

ルールでは黒缶(一番上の缶)をゴールに入れると8点、緑をゴールに入れると4点。

だから、倒さずに上部の高得点の二缶を確実に狙って点を稼ぐ方針にした。

アーム制作

アーム部分の機構は大きく分けて2つ
缶を確実に掴み、好きな時に放して置くためのもの
もう一つは、アーム自体を上下させ、掴む缶を選ぶためのもの

キットにあるパーツを合わせて組んでみたところ、どうしてもアームの上下幅は缶1個分しか得られなかったため、より多くの缶を1度に掴めるよう、アームを2つにして組んでみた
しかし、2つのアームには伝わる力に優劣があるようで、どうしてもひとつ分しか缶を持ち上げることはできなかった
つかめなかった方のアームで缶の山を崩してしまっては不味いと考え、確実性を優先し、缶を一度に運ぶ数は1つで、2度の運搬で2缶を確実に取るという方針で作ることになった

センサー類

まず、必要なセンサーと数を考えてみた
ライントレース用に、黒い線を挟むための光センサーを2つ
壁にぶつかったとき用のタッチセンサーを1つ
掴む缶の存在を感知するためのセンサーを1つ
缶を放すときに、GOALを感知するためのセンサーを1つ

問題となったのは、後半の2つである

まず缶をどう探知するか?これは当初タッチセンサーを壁以上の高さの位置に配置し、缶に触れて探知する予定であったが、実際試したところセンサーが感知できる前に衝撃で缶が倒れてしまうことが判明したため、光センサーにて缶の存在を探知することにした

もうひとつはGOALを探知するセンサーだが、こちらはコースの壁とGOALの囲いの高さの違いに着目し、壁用とGOAL用の2つのタッチセンサーを高さを変えて配置し、どちらにぶつかったのかを判別できるようにした

車体製作

今回のロボは2台分のパーツを使ったためとても大きくなることと、センサーやモーターを大量に使ったためにRCXを2台使うということがネックだった
コースの通れる幅はあまり大きくないため、よりスリムな車体を心がけなくてはいけない
そのため、RCX2台を縦に積み、それにアーム部分を組み合わせることで、極力車体の前後左右の幅を減らすことにした

プログラム

動力

  #define infrared 42                //  赤外線センサーの明るさ調整

メインタスク用にライントレースのプログラムをあらかじめ組んどきました!

   task line_checks()
 {
 while(true)
 {
 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);                          //左にカーブ。
 }                               
 }    
 }
 }
           
  task main ()
 {
 SetSensor(SENSOR_1,SENSOR_LIGHT);  // 赤外線センサーセット
 SetSensor(SENSOR_3,SENSOR_LIGHT);  // 赤外線センサーセット 
 SetSensor(SENSOR_2,SENSOR_TOUCH);  // タッチセンサーセット     
    
 OnFwd(OUT_A+OUT_C);Wait(160);Off(OUT_A+OUT_B);
 OnFwd(OUT_A);OnRev(OUT_C);Wait(30);
 OnFwd(OUT_A+OUT_C);
 until ((SENSOR_1 < infrared ) && (SENSOR_3 < infrared));
 Off(OUT_A+OUT_C);
 OnFwd(OUT_C);OnRev(OUT_A);Wait(60);
 PlaySound(SOUND_CLICK) ;
 start line_checks;
 until (SENSOR_2 == 1);
 PlaySound(SOUND_CLICK) ;
 stop line_checks;
 PlaySound(SOUND_CLICK) ;
 OnRev(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C);
 OnRev(OUT_C);OnFwd(OUT_A);Wait(125);
 Off(OUT_A+OUT_C);
 OnFwd(OUT_A+OUT_C);
 until(SENSOR_2 == 1);
 Off(OUT_A+OUT_C);
 OnRev(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C);Wait(50);
 Off(OUT_A+OUT_C);Wait(100);
 OnRev(OUT_A);OnFwd(OUT_C);Wait(28);//kanmukau
 Off(OUT_A+OUT_C);
 int n; 
 n=0;  
  while(n<1)
 {
 if (SENSOR_1 >infrared)             //センサー1が明るいと判断して、
 {      
 if (SENSOR_3 >infrared)             //センサー3も明るいと判断したら、 
 { 
 { 
 OnRev(OUT_A+OUT_C);   
 }                        
 }                              
 else
 {
 Off(OUT_C);                         //右にカーブ。
 OnRev(OUT_A);
 }                                  
 }                                   
 else
 {
 if(SENSOR_3>infrared)
 {                         
 OnRev(OUT_C);                 
 Off(OUT_A);
 }     
 else{Off(OUT_A+OUT_C);Wait(30);
 n=n+1;
 OnRev(OUT_A+OUT_C);Wait(55);     
 }                 
 }    
 }
 Off(OUT_A+OUT_C);Wait(1000);PlaySound(SOUND_FAST_UP) ;  
 OnRev(OUT_A);
 OnFwd(OUT_C);
 Wait(110);   
 OnFwd(OUT_A+OUT_C);
 until (SENSOR_2 == 1);
 PlaySound(SOUND_CLICK) ;
 Off(OUT_A+OUT_C);Wait(50);
 OnRev(OUT_A+OUT_C);Wait(50);
 OnFwd(OUT_C);OnRev(OUT_A);Wait(125);
 Off(OUT_A+OUT_C);Wait(50);
 OnFwd(OUT_A+OUT_C);Wait(310);//en
 OnFwd(OUT_A+OUT_C);
 until ((SENSOR_1 < infrared ) && (SENSOR_3 < infrared));
 Off(OUT_A+OUT_C);Wait(50);
 OnRev(OUT_A);OnFwd(OUT_C);Wait(125);
 PlaySound(SOUND_CLICK) ;
 start line_checks;
 until (SENSOR_2 == 1);
 PlaySound(SOUND_CLICK) ;
 stop line_checks;
 PlaySound(SOUND_CLICK) ;
 OnRev(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C);
 OnFwd(OUT_C);OnRev(OUT_A);Wait(125);
 OnRev(OUT_A+OUT_C);Wait(250);Off(OUT_A+OUT_C);
 }

改善すべき点

今回のロボのそもそもの発想、2つの缶を確実にという時点で既に妥協であったと思う
時間が無かったと言い訳をすることもできるが、やはり結局は自分たちの力不足だろう
出来上がったロボは、自分たちの当初イメージしていたものの縮小版、劣化版でしかなかったのがとても悔しい

反省

@ロボコンとテスト週間が重なっていたとはいえ時間にもっとゆとりを持つべきだった。(汗)

@チームの団結力に欠けていた。

@なにがともあれ、''4位''という好成績を残せたのでよかった。

@ロボコンに集中しすぎたため、皆、写真撮影に気づかずHPがうまく作れなかった。(痛)

感想

これまでのことを言葉で表すならば「楽しかった」の一言に尽きると思います
自分と同じように機械をいじることを楽しいと感じる仲間たちと共に、時には協力し、時にはぶつかり合ったこの時間はとてもかけがえないものであり、充実していました
これから技術者を目指していく中、こういった気持は自分の原動力になっていくと思います
とても有意義な時間を過ごせたことを嬉しく思います

コメントをどうぞ

  • プログラムの解説をかねて、今からでも遅くないのでプログラム内にコメントを入れておきましょう。 -- 松本 2009-02-13 (金) 10:58:04
  • 書くべきことは書けているので、あとは以下にしてわかりやすく伝えるか考えましょう。プログラムに説明が必要ですし、ロボットの写真があったほうがいいです。(ないならしょうがないですが) -- FI? 2009-02-14 (土) 03:13:05
  • プログラムのコメント、ロボの説明が欲しいです。 -- なかむら? 2009-02-16 (月) 06:24:46


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