- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#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%)
なんと言っても今回の自信作がパックをつかむためのアーム部分です。&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の部分を越えることが、反対側に機体を送る最善の方法だと考えました。&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以下という課題をこれでクリアしました。&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の幅についての問題はクリアしました。&br;
もう1つの問題は高さ4.5cmの壁を越えて反対側にパック回収用機体を送ることです。&br;
そこで運搬用機体「アークエンジェル」に↓のような階段状のパーツを取り付けました。&br;
#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]
今回のフィールドの仕様上、機体を極力小型化するのことが成功につながり、
そのためには必要な部品だけを場所を選んで取りつけることが重要だと考えました。&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に収まる範囲でアームが動作するようにできています。&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つ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;//少し右旋回して方向調整後停止
}
フィール向かって下側3つjとkと無印の左側のパックを回収するときに使用するタスク
task paku2 (){基本的に上のタスクと変わりはないが機体の進行方向とパックの位置が変わるためタスクを2つ用意した
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); タッチセンサーが反応するまで→fに到着するまで
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);//行動確認音のあとパックをゴールへ
}
j、hからfまで移動してパックをゴールに置くサブルーチン
sub goal2 (){基本的に上と同じだが方向転換の仕方が違うのとプログラムを組みやすくするために2つ用意した
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)); センサーがラインに強く反応するまで
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; センサーと前輪がラインを出るまで前進して停止
mae;Wait(40);tomare; //センサーと前輪がラインを出るまで前進して停止
}
ここからがメインタスクです
task main (){ 現在位置は「アークエンジェル」の上です
set1; 架け橋が予想以上に固定されているといけないのでパワーは大きめで
Wait(2200); 「アークエンジェル」が壁に到着するまでの22秒
ura;Wait(100); 後進
set2; パワーを変更して
ura;Wait(300); 後進
tomare;set1;set3; 停止してパワー変更とセンサーセット現在地はa
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; ラインに反応するまで前進
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で右向き
mae;Wait(40); //センサーと前輪が出るまで前進
rsenkai;until(s3 < al); //左センサーが反応するまで右旋回
lsenkai;Wait(20); //少し左旋回で方向調整
mae;Wait(40);tomare; //少し前に移動 現在地gで右向き
1個目のパック回収
point();tomare; g→cに移動して停止
hanasu; パックをつかむ用意
point();tomare; //g→cに移動して停止
hanasu; //パックをつかむ用意
ClearTimer(0);
start paku1; cの左側のパックをつかむ
start paku1; //cの左側のパックをつかむ
until(Timer(0) > 70);
stop paku1;
goal1(); ゴールへ向かいパックを入れる
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へ移動
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); 行動確認音
mae;Wait(40); //センサーとタイヤが出るまで前進
lsenkai;Wait(110); //ラインをまたぐまで左旋回
lsenkai;until(s1 < al); //右センサーがラインに反応するまで左旋回
rsenkai;Wait(20); //少し右旋回して方向調整
PlayTone(880,50); //行動確認音
ClearTimer(0);
start paku1; dの左側のパックをつかみに行動開始
start paku1; //dの左側のパックをつかみに行動開始
until(Timer(0) > 70);
stop paku1;
start line; ライントレース開始d→cへ移動
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まで移動
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に移動しゴールに入れる
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まで移動
point(); //jまで移動
ClearTimer(0);
start paku2; jの左側のパックをつかむ
start paku2; //jの左側のパックをつかむ
until(Timer(0) > 70);
stop paku2;
goal2(); ゴールに向かうj→iまで移動
goal2(); //ゴールに向かうj→iまで移動
4個目のパック回収
point(); jまで移動
lsenkai;Wait(110); ラインをまたぐまで左旋回
lsenkai;until(s1 < al); 右センサーがラインに反応するまで左旋回
rsenkai;Wait(20); 少し右旋回して方向調整
PlayTone(880,50); 行動確認音
start line; ライントレース開始j→kへ移動
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); 行動確認音
mae;Wait(40); //センサーとタイヤが出るまで前進
rsenkai;Wait(110); //ラインをまたぐまで右旋回
rsenkai;until(s3 < al); //左センサーがラインに反応するまで右旋回
lsenkai;Wait(20); //少し左旋回して方向調整
PlayTone(880,50); //行動確認音
ClearTimer(0);
start paku2; kの左側のパックをつかみに行動開始
start paku2; //kの左側のパックをつかみに行動開始
until(Timer(0) > 70);
stop paku2;
start line; ライントレース開始k→jまで移動
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まで移動
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に向かいゴールにパックを入れる
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; ライントレース開始
point();f→cまで移動
rsenkai;Wait(110);
rsenkai;until(s3 < al);
lsenkai;Wait(20);
PlayTone(880,50);
repeat(2){
start line;
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); センサーとタイヤが出るまで前進
mae;Wait(40);
mae;Wait(40); //センサーとタイヤが出るまで前進
}
lsenkai;Wait(110); ラインをまたぐまで左旋回
lsenkai;until(s1 < al); 右センサーがラインに反応するまで左旋回
rsenkai;Wait(20); 少し右旋回して方向調整
PlayTone(880,50); 行動確認音
lsenkai;Wait(110);
lsenkai;until(s1 < al);
rsenkai;Wait(20);
PlayTone(880,50);
lsenkai;Wait(110); //ラインをまたぐまで左旋回
lsenkai;until(s1 < al); //右センサーがラインに反応するまで左旋回
rsenkai;Wait(20); //少し右旋回して方向調整
PlayTone(880,50); //行動確認音
ClearTimer(0);
start paku1; eの左側のパックをつかむために行動開始
start paku1;
start paku1; //eの左側のパックをつかむために行動開始
until(Timer(0) > 70);
stop paku1;
repeat(2){ e→d→cと移動する
start line; ライントレース開始
repeat(2){
start line;
repeat(2){ //e→d→cと移動する
start line; //ライントレース開始
until(s1 < sl);
stop line;
mae;Wait(40); センサーとタイヤが出るまで前進
mae;Wait(40);
mae;Wait(40); //センサーとタイヤが出るまで前進
}
goal1(); c→fに向かいゴールに入れる
goal1(); //c→fに向かいゴールに入れる
6個目のパック回収
ura;Wait(30); 少し後進
rsenkai;Wait(120); 右旋回で約90度回転
ura;Wait(20);
goal1();
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; ライントレース開始
mae;Wait(40);センサーとタイヤが出るまで前進
lsenkai;until(s1 < al);
rsenkai;Wait(20);
mae;Wait(20);tomare;
point();
lsenkai;Wait(110);
lsenkai;until(s1 < al);
rsenkai;Wait(20);
PlayTone(880,50);
repeat(2){
start line;
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); センサーとタイヤが出るまで前進
mae;Wait(40);
mae;Wait(40); //センサーとタイヤが出るまで前進
}
rsenkai;Wait(110); ラインをまたぐまで右旋回
rsenkai;until(s3 < al); 左センサーがラインに反応するまで右旋回
lsenkai;Wait(20); 少し左旋回して方向調整
PlayTone(880,50); 行動確認音
rsenkai;Wait(110);
rsenkai;until(s3 < al);
lsenkai;Wait(20);
PlayTone(880,50);
rsenkai;Wait(110); //ラインをまたぐまで右旋回
rsenkai;until(s3 < al); //左センサーがラインに反応するまで右旋回
lsenkai;Wait(20); //少し左旋回して方向調整
PlayTone(880,50); //行動確認音
ClearTimer(0);
start paku2; 無印の左側のパックをつかむために行動開始
start paku2;
start paku2; //無印の左側のパックをつかむために行動開始
until(Timer(0) > 70);
stop paku2;
repeat(2){ 無印→jまで移動
start line; ライントレース開始
repeat(2){
start line;
repeat(2){ //無印→jまで移動
start line; //ライントレース開始
until(s3 < sl);
stop line;
mae;Wait(40); センサーとタイヤが出るまで前進
mae;Wait(40);
mae;Wait(40); //センサーとタイヤが出るまで前進
}
goal2(); j→iまで移動しパックを入れる
goal2(); //j→iまで移動しパックを入れる
ura;Wait(20);
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; //タッチセンサーが反応するまで前進して停止
}
これで「アークエンジェル」のお仕事は終了です
*感想 [#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};
#comment