*目次 [#o598466d]
#contents
*ロボコンのフィールド説明[#e1aeebf0]

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2009a%2F%A5%ED%A5%DC%A5%B3%A5%F3&openfile=robocon2009a-1.png

&br;・フィールドは約160cm×110cm
&br;・運搬する500mlの紙パック(以下単に紙パックと呼ぶ)は約7cm×7cm×10.3cm
&br;・紙パックはすべての面に白あるいは緑色の画用紙がはられている
&br;・スタート地点の壁、中央の壁、ゴール近くの障害壁の断面は約89mm x 38mm
&br;・目的地の正方形の3辺は19mm×19mmの角材で仕切られている
&br;・黒い線の太さは約25mm 
 
&br;&br; 今回の課題は紙パックを収集して色ごとに別の目的地まで運ぶというものでした。真ん中には木の板が置かれており、そこが今回のポイントだったように思えます。

*対ロボコン用機体制作記 [#q53a48cb]
**制作前記〜制作者と方針〜 [#xb300439]
ロボットの制作者は今回も高橋です。&br;
今までの制作機体は数知れず、今回もオリジナルで頑張ります。&br;
今回の機体は2台制作する予定です。&br;
壁を自力で越える機体というのも魅力的でしたが、2台の連携というのにもあこがれ、2台制作することににしました。&br;
1台は中央の壁までの運搬用、1台は壁の反対側でのお仕事用です。
では制作頑張ります。&br;

**制作後記〜苦悩と成功〜 [#r16acd18]
ロボコン仕様のロボットがやっと完成しました。&br;
実に長い道のりでした。ほかのグループの皆さんもとても大変そうでした。&br;
今回のロボット制作はほぼ1人で行ったため非常に疲れましたが、達成感もありました。&br;
無事機体が完成したときにはオッシャーーーー!!!!という感じでした。&br;

**ロボコン後記〜ロボコンと授業の終了〜 [#k7dd3212]
ロボコンを終えて機体を解体するときは少し悲しかったです。&br;
壁を越え、パックをつかみ、ゴールに置いただけでも嬉しかったのに、もう1個置いてくれるとは感動しました。&br;
機体についての説明は、下をご覧ください。&br;
ロボコンお疲れ様でした。&br;

*機体説明 [#oc9c0dc5]
ロボコンで活躍してくれた機体の解説をしていきます。&br;
パック回収用機体運搬用機体名は「アークエンジェル」(命名:河島)です。&br;
パック回収用機体名は「クワトロアーム」(命名:河島)です。&br;

**「アークエンジェル」 [#d61a26de]
今回パック回収用機体運搬用機体として制作した「アークエンジェル」は↓の写真の様な機体です。&br;
#ref(2009a/A10/ロボコン/001.JPG,50%)
「アークエンジェル」が真ん中の壁に到着すると↓のようになり「クワトロアーム」の発車準備完了です。
#ref(2009a/A10/ロボコン/008.JPG,50%)
スタート時にパック回収用機体「クワトロアーム」と合体するときは↓のような感じになります。&br;
それぞれ横から前から後から見た写真です。
#ref(2009a/A10/ロボコン/005.JPG,50%)
#ref(2009a/A10/ロボコン/006.JPG,50%)
#ref(2009a/A10/ロボコン/007.JPG,50%)
「アークエンジェル」から「クワトロアーム」が降りるときに通る階段状のモノがこれ↓です。
#ref(2009a/A10/ロボコン/002.JPG,50%)
「アークエンジェル」から階段部分を取ると↓のようになります。
#ref(2009a/A10/ロボコン/013.JPG,50%)
#ref(2009a/A10/ロボコン/014.JPG,50%)
#ref(2009a/A10/ロボコン/015.JPG,50%)


**「クワトロアーム」 [#ic6cefd3]
今回パック回収用機体として制作したのが↓の「クワトロアーム」です。
#ref(2009a/A10/ロボコン/025.JPG,50%)
#ref(2009a/A10/ロボコン/026.JPG,50%)
#ref(2009a/A10/ロボコン/027.JPG,50%)
なんと言っても今回の自信作がパックをつかむためのアーム部分です。
このアーム制作に1日費やしてしまいましたが、良いのが出来ました。
それが↓の写真です。
#ref(2009a/A10/ロボコン/046.JPG,50%)
#ref(2009a/A10/ロボコン/047.JPG,50%)
#ref(2009a/A10/ロボコン/049.JPG,50%)
実際にパックを回収する動作は↓の様に行います。
#ref(2009a/A10/ロボコン/052.JPG,50%)
#ref(2009a/A10/ロボコン/051.JPG,50%)
そのときの後から見た写真です。
#ref(2009a/A10/ロボコン/050.JPG,50%)
#ref(2009a/A10/ロボコン/049.JPG,50%)

*機体制作における工夫点 [#f5dad1e4]
**駆動部〜20cmを通り抜ける〜 [#y8f9ad11]
今回は高さ4.5cm幅20cmの部分を越えることが、反対側に機体を送る最善の方法だと考えました。
パック回収用機体の幅を20cm以下でどれだけ小さくできるか、というのが1つの課題でありました。
そこで考えたのが↓の駆動部です。
#ref(2009a/A10/ロボコン/038.JPG,50%)
#ref(2009a/A10/ロボコン/039.JPG,50%)
#ref(2009a/A10/ロボコン/040.JPG,50%)
#ref(2009a/A10/ロボコン/041.JPG,50%)
この駆動部の幅は12cmで、壁の幅20cm以下という課題をこれでクリアしました。

この駆動部は基本スタイルとして制作しました。
「アークエンジェル」では前後の距離を伸ばしました。
これは上に「クワトロアーム」を乗せるためで、↓のようになります。
#ref(2009a/A10/ロボコン/013.JPG,50%)
#ref(2009a/A10/ロボコン/015.JPG,50%)
#ref(2009a/A10/ロボコン/016.JPG,50%)
#ref(2009a/A10/ロボコン/017.JPG,50%)
この部分に「クワトロアーム」が乗ります。
#ref(2009a/A10/ロボコン/100.jpg,50%)
「クワトロアーム」では基本スタイルから↓のように改造しました。
#ref(2009a/A10/ロボコン/037.JPG,50%)
#ref(2009a/A10/ロボコン/036.JPG,50%)


**「アークエンジェル」の架け橋〜4.5cmの壁を越える〜 [#s386f425]
上で記したように20cmの幅についての問題はクリアしました。
もう1つの問題は高さ4.5cmの壁を越えて反対側にパック回収用機体を送ることです。
そこで運搬用機体「アークエンジェル」に↓のような階段状のパーツを取り付けました。
#ref(2009a/A10/ロボコン/002.JPG,50%)
#ref(2009a/A10/ロボコン/003.JPG,50%)
#ref(2009a/A10/ロボコン/004.JPG,50%)
実際に「クワトロアーム」が降りていくシーンです。
#ref(2009a/A10/ロボコン/005.JPG,50%)
#ref(2009a/A10/ロボコン/008.JPG,50%)
#ref(2009a/A10/ロボコン/009.JPG,50%)
#ref(2009a/A10/ロボコン/010.JPG,50%)
#ref(2009a/A10/ロボコン/011.JPG,50%)

**小型機体〜センサー類〜 [#mab273ce]
今回のフィールドの仕様上、機体を極力小型化するのことが成功につながり、
そのためには必要な部品だけを場所を選んで取りつけることが重要だと考えました。
そこでタッチセンサーは地面から1cmの高さにポイントがくるように、光センサーは値を確実に読むために地面ギリギリに取り付けました。
#ref(2009a/A10/ロボコン/012.JPG,50%)
センサー類はまとめて、取り付け取り外しが簡単で多少の衝撃では取れないように工夫しました。
光センサーは灰色の部分ではなく上の青色のほうで固定すると外れにくいので↓のように、タッチセンサーはその間から必要な長さだけ前に出しました。
#ref(2009a/A10/ロボコン/018.JPG,50%)


**パック回収機〜ターゲットは1つ〜 [#f67a9049]
今回のロボコンではパックをいかに多くゴールに運ぶかということが大事です。
しかし置いてあるパックの間隔が広くないことが問題です。
パックを回収してから運びゴールに入れる動作を考えるとパックをつかみつかんだ状態で運びはなせばゴールに入るというものがいいと考えました。
すると回収部はアームがいいという決断となりましたが、どのようなアームにするかが問題です。
考えた結果↓のようなアームになりました。
#ref(2009a/A10/ロボコン/046.JPG,50%)
#ref(2009a/A10/ロボコン/052.JPG,50%)
このアームは駆動部と同様に12cmに収まる範囲でアームが動作するようにできています。
この幅はパックの幅7cmに回収機の活動誤差と余裕をあわせて考えいます。
また回収時にほかのパックに干渉しないように12cmの幅に設定しました。
実際にこの回収部分を制作するのは大変でした。
↓は回収機を上から見た図です。
#ref(2009a/A10/ロボコン/059.JPG,50%)
1番上のパーツをはずすと↓のようになっています。
#ref(2009a/A10/ロボコン/060.JPG,50%)
ブロックがさかさまに使用されていますが、こうしないとアーム動作時にブロックの突起に引っかかりうまく動作しないのです。
また1番上のパーツを裏返したのが↓の写真です。
#ref(2009a/A10/ロボコン/062.JPG,50%)
これはアームの動作をスムーズにするだけでなく、アーム自体を壊れにくくしています。
アームが使うスペースだけを残して固定することで安定性が増します。
↓が今回制作したアームです。
#ref(2009a/A10/ロボコン/055.JPG,50%)
#ref(2009a/A10/ロボコン/056.JPG,50%)
この形・能力・強固さを持たせるために必要なパーツだけを必要なところに取り付けることは大変でした。
プログラムの確認中に何度も「クワトロアーム」を倒してしまいましたが、一度も故障や破損はありませんでした。
動作不良もなく本当によく動いてくれました。



*プログラム [#te5e5203]
今回のロボコンで使用したプログラムを貼ります。
デバッグが非常に大変なため様々なタスクとサブルーチンに分けて考えました。

**「クワトロアーム」 [#vcb37b4f]
今回考えたマクロです
通常行動時のパワー設定です
 #define set1    SetPower(OUT_A+OUT_C,4);SetPower(OUT_B,1);
「アークエンジェル」から出発するときとパックに近づくときのパワー設定です
 #define set2    SetPower(OUT_A+OUT_C,2);
各種センサーの設定です
 #define set3    SetSensor(SENSOR_1,SENSOR_LIGHT);SetSensor(SENSOR_2,SENSOR_TOUCH);SetSensor(SENSOR_3,SENSOR_LIGHT);
前進
 #define mae     OnRev(OUT_A+OUT_C);
後進
 #define ura     OnFwd(OUT_A+OUT_C);
左折します(左タイヤは停止)
 #define l       OnRev(OUT_A);Off(OUT_C);
右折します(右タイヤは停止)
 #define r       OnRev(OUT_C);Off(OUT_A);
左折と反対の動作です
 #define lura    OnFwd(OUT_A);Off(OUT_C);
右折と反対の動作です
 #define rura    OnFwd(OUT_C);Off(OUT_A);
その場で反時計回りに旋回します
 #define lsenkai OnRev(OUT_A);OnFwd(OUT_C);
その場で時計回りに旋回します
 #define rsenkai OnRev(OUT_C);OnFwd(OUT_A);
タイヤの行動を停止します
 #define tomare  Off(OUT_A+OUT_C);
アームでパックをつかみます
 #define tukamu  tomare;OnFwd(OUT_B);Wait(50);
アームからパックをはなします
 #define hanasu  tomare;OnRev(OUT_B);Wait(50);
プログラム制作時の作業能率向上のためと見やすさ向上のためのマクロ
 #define s1      SENSOR_1 右側の光センサー
 #define s2      SENSOR_2 タッチセンサー
 #define s3      SENSOR_3 左側の光センサー
 #define al      48    エリアラインの略  ラインの1つの判断基準
 #define sl      40    ストップラインの略 ラインの判断基準の1つ

ライントレースを行うためのタスクです。
 task line (){
 while(true){         左右のセンサーでラインをまたいでいると仮定しています
 if((s1 < al)&&(s3 > al)){r;} 右センサーがライン上で左センサーが外れているときは右折
 if((s1 > al)&&(s3 < al)){l;} 左センサーがライン上で右センサーが外れているときは左折
 if((s1 > al)&&(s3 > al)){mae;}両方のセンサーがライン上にないときは前進
 }} 

フィールド向かって上側3つのパックを回収するときに使用するタスク
 task paku1 (){
 rura;Wait(30);  アームがパックに当たらないように少し機体をずらしておく
 set2;tomare;   パワーを設定し行動停止
 start line;    ライントレースを開始
 until(s2 == 1);  タッチセンサーが反応するまで→壁にぶつかるまで
 stop line;tomare; 停止
 set1;PlayTone(1760,50);パワーを元に戻して確認音
 tukamu;Wait(150);パックをつかむ
 ura;Wait(76);tomare;
 lsenkai;Wait(110);lsenkai;until(s1 < al);rsenkai;Wait(20);tomare;
 }

 task paku2 (){lura;Wait(30);set2;tomare;
 start line;until(s2 == 1);stop line;tomare;set1;PlayTone(1760,50);
 tukamu;Wait(150);ura;Wait(76);tomare;
 rsenkai;Wait(110);rsenkai;until(s3 < al);lsenkai;Wait(20);tomare;
 }

 sub goal1 (){
 lsenkai;Wait(110);lsenkai;until(s1 < al);rsenkai;Wait(20);tomare;
 start line;until(s2 == 1);stop line;tomare;PlayTone(880,50);hanasu;Wait(150);
 }

 sub goal2 (){
 rsenkai;Wait(110);rsenkai;until(s3 < al);lsenkai;Wait(20);tomare;
 start line;until(s2 == 1);stop line;tomare;PlayTone(880,50);hanasu;Wait(150);
 }

 sub point(){
 ura;Wait(40);lsenkai;Wait(100);lsenkai;until(s1 < al);tomare;PlayTone(880,50);
 start line;until((s1 < sl)||(s3 < sl));stop line;mae;Wait(40);tomare;
 }




 task main (){set1;Wait(2200);ura;Wait(100);set2;ura;Wait(300);tomare;set1;set3;

 rsenkai;Wait(120);r;Wait(10);mae;until((s1 < al)||(s3 < al));mae;Wait(40);
 rsenkai;until(s3 < al);lsenkai;Wait(20);tomare;mae;Wait(40); 

 point();tomare;hanasu;
 ClearTimer(0);start paku1;until(Timer(0) > 70);stop paku1;
 goal1();

 point();
 rsenkai;Wait(110);rsenkai;until(s3 < al);lsenkai;Wait(20);PlayTone(880,50);
 start line;until(s3 < sl);stop line;mae;Wait(40);
 lsenkai;Wait(110);lsenkai;until(s1 < al);rsenkai;Wait(20);PlayTone(880,50);
 ClearTimer(0);start paku1;until(Timer(0) > 70);stop paku1;
 start line;until(s1 < sl);stop line;mae;Wait(40);
 lsenkai;Wait(110);lsenkai;until(s1 < al);rsenkai;Wait(20);tomare;
 start line;until(s2 == 1);stop line;ura;Wait(30);
 rsenkai;Wait(120);mae;until((s1 < al)||(s3 < al));mae;Wait(40);
 goal1();

 point();
 ClearTimer(0);start paku2;until(Timer(0) > 70);stop paku2;
 goal2();

 point();
 lsenkai;Wait(110);lsenkai;until(s1 < al);rsenkai;Wait(20);PlayTone(880,50);
 start line;until(s1 < sl);stop line;mae;Wait(40);
 rsenkai;Wait(110);rsenkai;until(s3 < al);lsenkai;Wait(20);PlayTone(880,50);
 ClearTimer(0);start paku2;until(Timer(0) > 70);stop paku2;
 start line;until(s3 < sl);stop line;mae;Wait(40);
 rsenkai;Wait(110);rsenkai;until(s3 < al);lsenkai;Wait(20);tomare;
 start line;until(s2 == 1);stop line;ura;Wait(30);
 lsenkai;Wait(120);mae;until((s1 < al)||(s3 < al));mae;Wait(40);
 goal2();

 point();
 lsenkai;Wait(110);lsenkai;until(s1 < al);rsenkai;Wait(20);PlayTone(880,50);
 repeat(2){start line;until(s1 < sl);stop line;mae;Wait(40);}
 rsenkai;Wait(110);rsenkai;until(s3 < al);lsenkai;Wait(20);PlayTone(880,50);
 ClearTimer(0);start paku2;until(Timer(0) > 70);stop paku2;
 repeat(2){start line;until(s3 < sl);stop line;mae;Wait(40);}ura;Wait(20);
 goal2();

 point();
 rsenkai;Wait(110);rsenkai;until(s3 < al);lsenkai;Wait(20);PlayTone(880,50);
 repeat(2){start line;until(s3 < sl);stop line;mae;Wait(40);}
 lsenkai;Wait(110);lsenkai;until(s1 < al);rsenkai;Wait(20);PlayTone(880,50);
 ClearTimer(0);start paku1;until(Timer(0) > 70);stop paku1;
 repeat(2){start line;until(s1 < sl);stop line;mae;Wait(40);}ura;Wait(20);
 goal1();


 PlayTone(880,100);Wait(100);tomare;

 Off(OUT_B);
 }



**「アークエンジェル」 [#s074a1c0]
今回「アークエンジェル」で使用したプログラムです。
特に仕事がないので比較的少ない分量です。
プログラムの説明は↓のフィールドに手を加えたモノを使って説明してきます。
#ref(2009a/A10/ロボコン/oyaki.png,100%)
今回使用したマクロ
パワーとセンサーの設定
 #define set1    SetPower(OUT_A+OUT_C,4);SetSensor(SENSOR_1,SENSOR_LIGHT);SetSensor(SENSOR_2,SENSOR_TOUCH);SetSensor(SENSOR_3,SENSOR_LIGHT);
パワー設定→「アークエンジェル」の架け橋が落ちないようにするための処置
 #define set2    SetPower(OUT_A+OUT_C,2);
後進
 #define ura     OnRev(OUT_A+OUT_C);
前進
 #define mae     OnFwd(OUT_A+OUT_C);
右折(右タイヤは固定)
 #define r       OnFwd(OUT_A);Off(OUT_C);
左折(左タイヤは固定)
 #define l       OnFwd(OUT_C);Off(OUT_A);
その場で右旋回(時計回り)
 #define rsenkai OnFwd(OUT_A);OnRev(OUT_C);
その場で左旋回(反時計回り)
 #define lsenkai OnFwd(OUT_C);OnRev(OUT_A);
停止
 #define tomare  Off(OUT_A+OUT_C);
作業能率向上と見やすさ向上のためのマクロ
 #define s1      SENSOR_1 左側の光センサー
 #define s2      SENSOR_2 タッチセンサー
 #define s3      SENSOR_3 右側に光センサー
 #define al      48    エリアラインの略  ラインの1つの判断基準
 #define sl      40    ストップラインの略 ラインの判断基準の1つ 

ライントレースのタスク
 task line (){
 while(true){         左右の光センサーがラインをまたいでいると仮定
 if((s1 < al)&&(s3 > al)){l;} 左センサーがライン上で右センサーが外れているときは左折
 if((s1 > al)&&(s3 < al)){r;} 右センサーがライン上で左センサーが外れているときは右折
 if((s1 > al)&&(s3 > al)){mae;}両方のセンサーが外れているときは前進
 }}

メインのタスク
 task main(){set1;        パワー設定

 repeat(2){           スタートしてからa→bと行くときにラインを2回またぐため
 mae;until((s1 < al)||(s3 < al));ラインに反応するまで前進し
 mae;Wait(60);          センサーと前輪がラインから出るくらい前進
 }
 rsenkai;until(s1 < al);     左センサーがラインに反応するまで右旋回
 lsenkai;Wait(20);tomare;    少し左旋回して方向調整して停止

 start line;           b→cまでライントレース
 until((s1 < sl)||(s3 < sl));  強く反応するまで
 stop line;tomare;        その後停止
 mae;Wait(50);          センサーと前輪がラインから出るくらい前進
 rsenkai;Wait(100);       右旋回でラインを1本またぐ
 rsenkai;until(s1 < al);     左センサーがラインに反応するまで右旋回
 lsenkai;Wait(20);               少し左旋回して方向調整

 repeat(2){           c→dとd→eと行動してeに行くため2回リピート
 start line;           ライントレース開始
 until(s1 < sl);stop line;    左センサーが強く反応するまで前進し停止
 mae;Wait(50);tomare;       センサーと前輪が出るまで前進
 }
 tomare;Wait(100);        「アークエンジェル」の架け橋がブレないようにするための1秒停止
 ura;Wait(70);          後進ここでe→fの移動
 lsenkai;Wait(220);       左旋回で壁に方向転換
 mae;until(s2 == 1);tomare;   タッチセンサーが反応するまで前進して停止
 }
これで「アークエンジェル」のお仕事は終了です

*感想 [#ef7bf026]
ロボコンを終えての感想です。
**高橋 [#o0e4a513]
**河島 [#s8050bd3]
**丸山 [#j29810cd]
**橋本 [#dd4934a1]
今回ロボコンに参加することができず、高橋くんに迷惑をかけてしまいました。テスト期間ということもあって、制作も任せっきりになってしまい、申し訳なく思っています。ただロボコンという、この授業での最後の舞台で結果を出せたのでチームの一員としてとてもうれしく思っています。
**柳原 [#s57f9037]
*コメント [#n68e6aba]
コメントお願いします。
- ロボコンに限らず、この授業ではチームワークも重要な要素です (学習の目標や評価の観点からも)。最後までチームワークを大切に。 -- [[松本]] &new{2009-08-06 (木) 10:28:44};

#comment

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS