*目次 [#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;
ロボットの制作者は今回も高橋が担当します。&br;
今までの制作機体は数知れず(3,4台くらい・・・)、今回もオリジナルで頑張ります。&br;
今回のロボコン用機体は2台制作する予定でいます。&br;
壁を自力で越えて自らパックを回収する機体というのも魅力的でしたが、2台の連携というのにもあこがれ、機体は2台制作することににしました。&br;
1台は中央の障害壁までの運搬用機体、1台は壁の反対側でのお仕事用機体です。
では機体制作頑張ります。&br;

**制作中記〜試行錯誤〜 [#fa5f2ad8]
今回の機体制作におけるいくつかのコンセプトを紹介します。&br;
1つは小型のパック回収用機体を制作したいということです。&br;
小型のパック回収用機体でなければ障害壁の20cmの間は通れません。&br;
また1番外側のパックの回収も機体が小型である方が成功しやすいと思います。&br;
1つは機体・プログラムにおいて「パーツ分け」をするというこです。&br;
松本先生もいっていましたが、プログラムについてはサブルーチンやマクロやメイン以外のタスクを使用してみるという事です。&br;
機体にしてみればある程度のまとまりをつなげて制作するということです。&br;
1つは妥協しないという事です。&br;
自分の納得のいく機体をつくり、納得のいくプログラムを組んでいきたいと思っています。&br;
以上制作中記でした。&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日費やしてしまいましたが、良いのが出来ました。
なんと言っても今回の自信作がパックをつかむためのアーム部分です。&br;
このアーム制作に1日費やしてしまいましたが、良いのが出来ました。&br;
それが↓の写真です。
#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つの課題でありました。
そこで考えたのが↓の駆動部です。
今回は高さ4.5cm幅20cmの部分を越えることが、反対側に機体を送る最善の方法だと考えました。&br;
パック回収用機体の幅を20cm以下でどれだけ小さくできるか、というのが1つの課題でありました。&br;
そこで考えたのが↓の駆動部です。&br;
#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以下という課題をこれでクリアしました。
この駆動部の幅は12cmで、壁の幅20cm以下という課題をこれでクリアしました。&br;
また、この駆動部はとても頑丈にできているので上に重たい機体やパーツが乗っても全く問題ありません。&br;
被荷重ポイントもしっかりしているので荷重が原因で動かないということはありません。&br;

この駆動部は基本スタイルとして制作しました。
「アークエンジェル」では前後の距離を伸ばしました。
これは上に「クワトロアーム」を乗せるためで、↓のようになります。
この駆動部は基本スタイルとして制作しました。&br;
「アークエンジェル」では「クワトロアーム」を乗せるためのスペースが必要だったので前後の距離を伸ばしました。&br;
実際に「クワトロアーム」を乗せる部分は↓のようになります。&br;
#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の壁を越えて反対側にパック回収用機体を送ることです。
そこで運搬用機体「アークエンジェル」に↓のような階段状のパーツを取り付けました。
上で記したように20cmの幅についての問題はクリアしました。&br;
もう1つの問題は高さ4.5cmの壁を越えて反対側にパック回収用機体を送ることです。&br;
そこで運搬用機体「アークエンジェル」に↓のような階段状のパーツを取り付けました。&br;
#ref(2009a/A10/ロボコン/002.JPG,50%)
#ref(2009a/A10/ロボコン/003.JPG,50%)
#ref(2009a/A10/ロボコン/004.JPG,50%)
実際に「クワトロアーム」が降りていくシーンです。
地面からパーツまでが4.5cmの高さにぴったりはまっています。&br;
これで無駄なく障害壁を越える事が出来ます。&br;
実際に「クワトロアーム」が降りていくシーンです。&br;
#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%)
本番でも無事に成功してくれました。&br;


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


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



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

**「クワトロアーム」 [#vcb37b4f]
今回考えたマクロです
今回考えたマクロです&br;
プログラムの説明は↓の図を用いながら行います。&br;
#ref(2009a/A10/ロボコン/koki.png,100%)

通常行動時のパワー設定です
 #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つ
 #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;}両方のセンサーがライン上にないときは前進
 while(true){         //左右のセンサーでラインをまたいでいると仮定しています
 if((s1 < al)&&(s3 > al)){r;} //右センサーがライン上で左センサーが外れているときは右折
 if((s1 > al)&&(s3 < al)){l;} //左センサーがライン上で右センサーが外れているときは左折
 if((s1 > al)&&(s3 > al)){mae;}//両方のセンサーがライン上にないときは前進
 }} 

フィールド向かって上側3つのパックを回収するときに使用するタスク
フィールド向かって上側3つcとdとeの左側のパックを回収するときに使用するタスク
 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;
 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;
フィール向かって下側3つjとkと無印の左側のパックを回収するときに使用するタスク
 task paku2 (){  //基本的に上のタスクと変わりはないが機体の進行方向とパックの位置が変わるためタスクを2つ用意した
 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;
 }

c、gからfまで移動してパックをゴールに置くサブルーチン
 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);
 lsenkai;Wait(110);     //左旋回してラインをまたぐ
 lsenkai;until(s1 < al);  //右センサーがラインに反応するまで左旋回
 rsenkai;Wait(20);tomare; //少し右旋回して方向調整後停止
 start line;        //ライントレース開始
 until(s2 == 1);          //タッチセンサーが反応するまで→fに到着するまで
 stop line;tomare;     //停止
 PlayTone(880,50);hanasu;Wait(150);//行動確認音のあとパックをゴールへ
 }

 sub goal2 (){
j、hからfまで移動してパックをゴールに置くサブルーチン
 sub goal2 (){  //基本的に上と同じだが方向転換の仕方が違うのとプログラムを組みやすくするために2つ用意した
 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);
 }

ゴール(fとi)からcとjまで移動するためのサブルーチン
 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;
 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);         //「アークエンジェル」が壁に到着するまでの22秒
 ura;Wait(100);        //後進
 set2;            //パワーを変更して
 ura;Wait(300);        //後進
 tomare;set1;set3;       //停止してパワー変更とセンサーセット現在地はa

 rsenkai;Wait(120);           //右旋回で約90度回転
 r;Wait(10);         //方向微調整
 mae;             //ラインに反応するまで前進
 until((s1 < al)||(s3 < al));
 mae;Wait(40);        //センサーと前輪が出るまで前進
 rsenkai;until(s3 < al);   //左センサーが反応するまで右旋回
 lsenkai;Wait(20);      //少し左旋回で方向調整
 mae;Wait(40);tomare;     //少し前に移動 現在地gで右向き
1個目のパック回収
 point();tomare;       //g→cに移動して停止
 hanasu;           //パックをつかむ用意
 ClearTimer(0);
 start paku1;         //cの左側のパックをつかむ
 until(Timer(0) > 70);
 stop paku1;
 goal1();           //ゴールへ向かいパックを入れる
2個目のパック回収
 point();           //f→cへ移動
 rsenkai;Wait(110);      //ラインをまたぐまで右旋回
 rsenkai;until(s3 < al);      //左センサーがラインに反応するまで右旋回
 lsenkai;Wait(20);      //少し左旋回して方向調整
 PlayTone(880,50);      //行動確認音
 start line;         //ライントレース
 until(s3 < sl);       //c→dへ移動
 stop line;
 mae;Wait(40);        //センサーとタイヤが出るまで前進
 lsenkai;Wait(110);      //ラインをまたぐまで左旋回
 lsenkai;until(s1 < al);   //右センサーがラインに反応するまで左旋回
 rsenkai;Wait(20);      //少し右旋回して方向調整
 PlayTone(880,50);      //行動確認音
 ClearTimer(0);
 start paku1;         //dの左側のパックをつかみに行動開始
 until(Timer(0) > 70);
 stop paku1;
 start line;         //ライントレース開始d→cへ移動
 until(s1 < sl);
 stop line;
 mae;Wait(40);        //センサーとタイヤが出るまで前進
 lsenkai;Wait(110);        //ラインをまたぐまで左旋回
 lsenkai;until(s1 < al);   //右センサーがラインに反応するまで左旋回
 rsenkai;Wait(20);tomare;   //少し右旋回して方向調整後停止
 start line;         //ライントレース開始c→fまで移動
 until(s2 == 1);
 stop line;
 ura;Wait(30);        //少し後進 現在地はg
 rsenkai;Wait(120);      //右旋回で約90度回転
 mae;until((s1 < al)||(s3 < al));//ラインに反応するまで前進g→hまで移動
 mae;Wait(40);        //センサーとタイヤが出るまで前進
 goal1();           //h→iに移動しゴールに入れる
3個目のパック回収
 point();              //jまで移動
 ClearTimer(0);
 start paku2;         //jの左側のパックをつかむ
 until(Timer(0) > 70);
 stop paku2;
 goal2();                     //ゴールに向かうj→iまで移動
4個目のパック回収
 point();                     //jまで移動
 lsenkai;Wait(110);          //ラインをまたぐまで左旋回
 lsenkai;until(s1 < al);      //右センサーがラインに反応するまで左旋回
 rsenkai;Wait(20);      //少し右旋回して方向調整
 PlayTone(880,50);      //行動確認音
 start line;         //ライントレース開始j→kへ移動
 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;         //kの左側のパックをつかみに行動開始
 until(Timer(0) > 70);
 stop paku2;
 start line;         //ライントレース開始k→jまで移動
 until(s3 < sl);
 stop line;
 mae;Wait(40);        //センサーとタイヤが出るまで前進
 rsenkai;Wait(110);      //ラインをまたぐまで右旋回
 rsenkai;until(s3 < al);   //左センサーがラインに反応するまで右旋回
 lsenkai;Wait(20);tomare;   //少し左旋回して方向調整後停止
 start line;         //ライントレース開始iまで移動
 until(s2 == 1);
 stop line;
 ura;Wait(30);        //少し後進
 lsenkai;Wait(120);      //左旋回約90度
 mae;until((s1 < al)||(s3 < al));//h→jまで前進
 mae;Wait(40);        //センサーとタイヤが出るまで前進
 goal2();           //fに向かいゴールにパックを入れる
5個目のパック回収
 point();           //f→cまで移動
 rsenkai;Wait(110);      //ラインをまたぐまで右旋回
 rsenkai;until(s3 < al);      //左センサーがラインに反応するまで右旋回
 lsenkai;Wait(20);      //少し左旋回して方向調整
 PlayTone(880,50);      //行動確認音
 repeat(2){          //c→d、d→eと移動するので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;                //eの左側のパックをつかむために行動開始
 until(Timer(0) > 70);
 stop paku1;
 repeat(2){          //e→d→cと移動する
 start line;         //ライントレース開始
 until(s1 < sl);
 stop line;
 mae;Wait(40);        //センサーとタイヤが出るまで前進
 }
 goal1();           //c→fに向かいゴールに入れる
6個目のパック回収
 ura;Wait(30);        //少し後進
 rsenkai;Wait(120);           //右旋回で約90度回転
 mae;until((s1 < al)||(s3 < al));//ラインに反応するまで前進g→hまで移動
 mae;Wait(40);        //センサーとタイヤが出るまで前進
 lsenkai;until(s1 < al);   //右センサーがラインに反応するまで左旋回
 rsenkai;Wait(20);      //少し右旋回して方向調整
 mae;Wait(20);tomare;     //少し前進して停止
 point();                     //i→jに移動
 lsenkai;Wait(110);           //ラインをまたぐまで左旋回
 lsenkai;until(s1 < al);   //右センサーがラインに反応するまで左旋回
 rsenkai;Wait(20);      //少し右旋回して方向調整
 PlayTone(880,50);      //行動確認音
 repeat(2){          //j→無印まで移動
 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){          //無印→jまで移動
 start line;         //ライントレース開始
 until(s3 < sl);
 stop line;
 mae;Wait(40);        //センサーとタイヤが出るまで前進
 }
 goal2();           //j→iまで移動しパックを入れる



 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);
 PlayTone(880,100);Wait(100); //行動確認音
 tomare;Off(OUT_B);           //全て停止
 }
これで「クワトロアーム」の作業は終了



**「アークエンジェル」 [#s074a1c0]
今回「アークエンジェル」で使用したプログラムです。
特に仕事がないので比較的少ない分量です。
プログラムの説明は↓のフィールドに手を加えたモノを使って説明してきます。
今回「アークエンジェル」で使用したプログラムです。&br;
特に仕事がないので比較的少ない分量です。&br;
プログラムの説明は↓のフィールドに手を加えたモノを使って説明してきます。&br;
#ref(2009a/A10/ロボコン/oyaki.png,100%)
今回使用したマクロ
今回使用したマクロ&br;
パワーとセンサーの設定
 #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つ 
 #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;}両方のセンサーが外れているときは前進
 while(true){         //左右の光センサーがラインをまたいでいると仮定
 if((s1 < al)&&(s3 > al)){l;} //左センサーがライン上で右センサーが外れているときは左折
 if((s1 > al)&&(s3 < al)){r;} //右センサーがライン上で左センサーが外れているときは右折
 if((s1 > al)&&(s3 > al)){mae;}//両方のセンサーが外れているときは前進
 }}

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

 repeat(2){           スタートしてからa→bと行くときにラインを2回またぐため
 mae;until((s1 < al)||(s3 < al));ラインに反応するまで前進し
 mae;Wait(60);          センサーと前輪がラインから出るくらい前進
 repeat(2){           //スタートしてからa→bと行くときにラインを2回またぐため
 mae;until((s1 < al)||(s3 < al));//ラインに反応するまで前進し
 mae;Wait(60);          //センサーと前輪がラインから出るくらい前進
 }
 rsenkai;until(s1 < al);     左センサーがラインに反応するまで右旋回
 lsenkai;Wait(20);tomare;    少し左旋回して方向調整して停止
 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);               少し左旋回して方向調整
 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;       センサーと前輪が出るまで前進
 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;   タッチセンサーが反応するまで前進して停止
 tomare;Wait(100);        //「アークエンジェル」の架け橋がブレないようにするための1秒停止
 ura;Wait(70);          //後進ここでe→fの移動
 lsenkai;Wait(220);       //左旋回で壁に方向転換
 mae;until(s2 == 1);tomare;   //タッチセンサーが反応するまで前進して停止
 }
これで「アークエンジェル」のお仕事は終了です

*更新履歴 [#keeff84f]
8/14&br;
感想を更新しました。&br;

8/15&br;
今までの文章の修正と「制作中記」を制作しました。&br;


*感想 [#ef7bf026]
ロボコンを終えての感想です。
**高橋 [#o0e4a513]
試験期間中ということもあってかチーム内で連絡がつかない状態での活動であってが、なんとか機体・プログラムともに完成させる事ができた。&br;
1人での活動が多く、大変ではあったがロボコンは満足のいく結果で終える事が出来て良かった。&br;
またRCXを使うような機会があればこの経験を生かして十分に楽しみたい。&br;
無事に授業を終了する事が出来て良かった。&br;
**河島 [#s8050bd3]
試験期間中ということもあって、ごたごたして忙しかったので100%と言っていいほどまかせっきりになってしまった。&br;
今回のロボコンで成功したのは高橋君のおかげであり、本当に申し訳なく思っているが、完璧といっていいほどの作品を見ることができてたいへんよかったと思い、また感謝の思いが浮かびました。&br;
この、「ロボティクス入門ゼミ」が無事に終わることができて本当に良かったです。
**丸山 [#j29810cd]
僕自身はあまり作業に参加できなかったのが残念でしたが、ロボコンでは優勝という結果が残せたことをチームの一員として嬉く思います。
**橋本 [#dd4934a1]
今回ロボコンに参加することができず、高橋くんに迷惑をかけてしまいました。テスト期間ということもあって、制作も任せっきりになってしまい、申し訳なく思っています。ただロボコンという、この授業での最後の舞台で結果を出せたのでチームの一員としてとてもうれしく思っています。
**柳原 [#s57f9037]
今回の優勝は高橋君がいたからこそでした。私は与えられた仕事さえこなすことができず、役立たずでした。皆にただただ感謝したいと思います。
*コメント [#n68e6aba]
コメントお願いします。
- ロボコンに限らず、この授業ではチームワークも重要な要素です (学習の目標や評価の観点からも)。最後までチームワークを大切に。 -- [[松本]] &new{2009-08-06 (木) 10:28:44};
- A5の俺です。A10チームは一人で作ったとは思えないほど機体、プログラムともに秀逸です。また本番のロボコンでの動作も、あそこまでいったチームはなく、更にトリという最高の舞台で、素晴らしいものでした。学習の目標や評価については俺の判断するところではないので、俺個人としては、素直にその健闘を讃えたいと思います。 余談ですが、俺はArch AngelよりArch EnemyやMorbid Angelの方が好きです -- [[俺]] &new{2009-08-09 (日) 22:50:12};
- ロボット、プログラムの説明が詳しくて、何をやったかわかりやすくてとても良いです。また、制作中記によりどんなアイディアで臨んだのかがわかってよいです -- [[FI]] &new{2009-08-31 (月) 16:55:14};

#comment


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