今回我々が行うロボコンの説明をします。
・フィールドは約160cm×110cm
・運搬する500mlの紙パック(以下単に紙パックと呼ぶ)は約7cm×7cm×10.3cm
・紙パックはすべての面に白あるいは緑色の画用紙がはられている
・スタート地点の壁、中央の壁、ゴール近くの障害壁の断面は約89mm x 38mm
・目的地の正方形の3辺は19mm×19mmの角材で仕切られている
・黒い線の太さは約25mm
今回の課題は紙パックを収集して色ごとに別の目的地まで運ぶというものでした。真ん中には木の板が置かれており、そこが今回のポイントだったように思えます。
ロボットの制作者は今回も高橋が担当します。
今までの制作機体は数知れず(3,4台くらい・・・)、今回もオリジナルで頑張ります。
今回のロボコン用機体は2台制作する予定でいます。
壁を自力で越えて自らパックを回収する機体というのも魅力的でしたが、2台の連携というのにもあこがれ、機体は2台制作することににしました。
1台は中央の障害壁までの運搬用機体、1台は壁の反対側でのお仕事用機体です。
では機体制作頑張ります。
今回の機体制作におけるいくつかのコンセプトを紹介します。
1つは小型のパック回収用機体を制作したいということです。
小型のパック回収用機体でなければ障害壁の20cmの間は通れません。
また1番外側のパックの回収も機体が小型である方が成功しやすいと思います。
1つは機体・プログラムにおいて「パーツ分け」をするというこです。
松本先生もいっていましたが、プログラムについてはサブルーチンやマクロやメイン以外のタスクを使用してみるという事です。
機体にしてみればある程度のまとまりをつなげて制作するということです。
1つは妥協しないという事です。
自分の納得のいく機体をつくり、納得のいくプログラムを組んでいきたいと思っています。
以上制作中記でした。
ロボコン仕様のロボットがやっと完成しました。
実に長い道のりでした。ほかのグループの皆さんもとても大変そうでした。
今回のロボット制作はほぼ1人で行ったため非常に疲れましたが、達成感もありました。
無事機体が完成したときにはオッシャーーーー!!!!という感じでした。
ロボコンを終えて機体を解体するときは少し悲しかったです。
壁を越え、パックをつかみ、ゴールに置いただけでも嬉しかったのに、もう1個置いてくれるとは感動しました。
機体についての説明は、下をご覧ください。
ロボコンお疲れ様でした。
ロボコンで活躍してくれた機体の解説をしていきます。
パック回収用機体運搬用機体名は「アークエンジェル」(命名:河島)です。
パック回収用機体名は「クワトロアーム」(命名:河島)です。
今回パック回収用機体運搬用機体として制作した「アークエンジェル」は↓の写真の様な機体です。
「アークエンジェル」が真ん中の障害壁に到着すると↓のようになり「クワトロアーム」の発車準備完了です。
スタート時にパック回収用機体「クワトロアーム」と合体するときは↓のような感じになります。
↓は、それぞれ横から前から後から見た写真です。
「アークエンジェル」から「クワトロアーム」が降りるときに通る階段状のモノがこれ↓です。
「アークエンジェル」から階段部分を取ると↓のようになります。
今回パック回収用機体として制作したのが↓の「クワトロアーム」です。
なんと言っても今回の自信作がパックをつかむためのアーム部分です。
このアーム制作に1日費やしてしまいましたが、良いのが出来ました。
それが↓の写真です。
実際にパックを回収する動作は↓の様に行います。
そのときの後から見た写真です。
以上で機体説明を終わりますが、工夫点などは別に記載しています。
今回は高さ4.5cm幅20cmの部分を越えることが、反対側に機体を送る最善の方法だと考えました。
パック回収用機体の幅を20cm以下でどれだけ小さくできるか、というのが1つの課題でありました。
そこで考えたのが↓の駆動部です。
この駆動部の幅は12cmで、壁の幅20cm以下という課題をこれでクリアしました。
また、この駆動部はとても頑丈にできているので上に重たい機体やパーツが乗っても全く問題ありません。
被荷重ポイントもしっかりしているので荷重が原因で動かないということはありません。
この駆動部は基本スタイルとして制作しました。
「アークエンジェル」では「クワトロアーム」を乗せるためのスペースが必要だったので前後の距離を伸ばしました。
実際に「クワトロアーム」を乗せる部分は↓のようになります。
この部分に「クワトロアーム」が乗ります。
「クワトロアーム」の駆動部は基本スタイルから↓のように改造しました。
上で記したように20cmの幅についての問題はクリアしました。
もう1つの問題は高さ4.5cmの壁を越えて反対側にパック回収用機体を送ることです。
そこで運搬用機体「アークエンジェル」に↓のような階段状のパーツを取り付けました。
地面からパーツまでが4.5cmの高さにぴったりはまっています。
これで無駄なく障害壁を越える事が出来ます。
実際に「クワトロアーム」が降りていくシーンです。
本番でも無事に成功してくれました。
今回のフィールドの仕様上、機体を極力小型化するのことが成功につながり、
そのためには必要な部品だけを場所を選んで取りつけることが重要だと考えました。
そこでタッチセンサーは地面から1cmの高さにポイントがくるように、光センサーは値を確実に読むために地面ギリギリに取り付けました。
センサー類はまとめて、取り付け取り外しが簡単で多少の衝撃では取れないように工夫しました。
光センサーは灰色の部分ではなく上の青色のほうで固定すると外れにくいので↓のように、タッチセンサーはその間から必要な長さだけ前に出しました。
今回のロボコンではパックをいかに多くゴールに運ぶかということが大事です。
しかし置いてあるパックの間隔が広くないことが問題です。
パックを回収してから運びゴールに入れる動作を考えるとパックをつかみつかんだ状態で運びはなせばゴールに入るというものがいいと考えました。
すると回収部はアームがいいという決断となりましたが、どのようなアームにするかが問題です。
考えた結果↓のようなアームになりました。
このアームは駆動部と同様に12cmに収まる範囲でアームが動作するようにできています。
この幅はパックの幅7cmに回収機の活動誤差と余裕をあわせて考えいます。
また回収時にほかのパックに干渉しないように12cmの幅に設定しました。
実際にこの回収部分を制作するのは大変でした。
↓は回収機を上から見た図です。
1番上のパーツをはずすと↓のようになっています。
ブロックがさかさまに使用されていますが、こうしないとアーム動作時にブロックの突起に引っかかりうまく動作しないのです。
また1番上のパーツを裏返したのが↓の写真です。
これはアームの動作をスムーズにするだけでなく、アーム自体を壊れにくくしています。
アームが使うスペースだけを残して固定することで安定性が増します。
↓が今回制作したアームです。
この形・能力・強固さを持たせるために必要なパーツだけを必要なところに取り付けることは大変でした。
プログラムの確認中に何度も「クワトロアーム」を倒してしまいましたが、一度も故障や破損はありませんでした。
動作不良もなく本当によく動いてくれました。
今回のロボコンで使用したプログラムを貼ります。
デバッグが非常に大変なため様々なタスクとサブルーチンに分けて考えました。
今回考えたマクロです
プログラムの説明は↓の図を用いながら行います。
通常行動時のパワー設定です
#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つ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;//少し右旋回して方向調整後停止 }
フィール向かって下側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); //タッチセンサーが反応するまで→fに到着するまで stop line;tomare; //停止 PlayTone(880,50);hanasu;Wait(150);//行動確認音のあとパックをゴールへ }
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; //センサーと前輪がラインを出るまで前進して停止 }
ここからがメインタスクです
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まで移動しパックを入れる
PlayTone(880,100);Wait(100); //行動確認音 tomare;Off(OUT_B); //全て停止 }
これで「クワトロアーム」の作業は終了
今回「アークエンジェル」で使用したプログラムです。
特に仕事がないので比較的少ない分量です。
プログラムの説明は↓のフィールドに手を加えたモノを使って説明してきます。
今回使用したマクロ
パワーとセンサーの設定
#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; //タッチセンサーが反応するまで前進して停止 }
これで「アークエンジェル」のお仕事は終了です
8/14
感想を更新しました。
8/15
今までの文章の修正と「制作中記」を制作しました。
ロボコンを終えての感想です。
試験期間中ということもあってかチーム内で連絡がつかない状態での活動であってが、なんとか機体・プログラムともに完成させる事ができた。
1人での活動が多く、大変ではあったがロボコンは満足のいく結果で終える事が出来て良かった。
またRCXを使うような機会があればこの経験を生かして十分に楽しみたい。
無事に授業を終了する事が出来て良かった。
試験期間中ということもあって、ごたごたして忙しかったので100%と言っていいほどまかせっきりになってしまった。
今回のロボコンで成功したのは高橋君のおかげであり、本当に申し訳なく思っているが、完璧といっていいほどの作品を見ることができてたいへんよかったと思い、また感謝の思いが浮かびました。
この、「ロボティクス入門ゼミ」が無事に終わることができて本当に良かったです。
僕自身はあまり作業に参加できなかったのが残念でしたが、ロボコンでは優勝という結果が残せたことをチームの一員として嬉く思います。
今回ロボコンに参加することができず、高橋くんに迷惑をかけてしまいました。テスト期間ということもあって、制作も任せっきりになってしまい、申し訳なく思っています。ただロボコンという、この授業での最後の舞台で結果を出せたのでチームの一員としてとてもうれしく思っています。
今回の優勝は高橋君がいたからこそでした。私は与えられた仕事さえこなすことができず、役立たずでした。皆にただただ感謝したいと思います。
コメントお願いします。