*Mission2(ロボコン)レポート [#kdb5cd9e]
目次一覧
#contents

**メンバー紹介 [#zf7cd4f1]
-blackcat…ネタ担当。積極的にアイデアを出すがその内容が意味不明だったり、おかしな発言を繰り返す内に使えない子ポジションが確立してしまった。今回は音楽制作も担当。&br;レポートのページは[[2012b/Member/blackcat/Mission2]]
-scar…blackcatくんと共同で音楽制作をし、その類稀なる才能を発揮してくれた。なんでもドラマーらしい。かっこいいですね。&br;レポートのページは[[2012b/Member/scar/Mission2]]
-toshi…プログラムの原案を出し、さらに機体の改良にも携わった。また、何度も素晴らしいアイデアを出し、チームに希望の光を見せてくれた。&br;レポートのページは[[2012b/Member/toshi/Mission2]]
-blackcat…ネタ担当。積極的にアイデアを出すがその内容が意味不明だったり、おかしな発言を繰り返す内にネタ要員ポジションが確立してしまった。今回は音楽制作も担当。&br;
レポートのページは[[2012b/Member/blackcat/Mission2]]
-scar…blackcatくんと共同で音楽制作をし、その類稀なる才能を発揮してくれた。なんでもドラマーらしい。かっこいいですね。&br;
レポートのページは[[2012b/Member/scar/Mission2]]
-toshi…プログラムの原案を出し、さらに機体の改良にも携わった。また、何度も素晴らしいアイデアを出し、チームに希望の光を見せてくれた。&br;
レポートのページは[[2012b/Member/toshi/Mission2]]
-yoshi…このレポートの作成者。機体の原案を出した。toshiくんのアドバイスをもとに機体の改良、プログラムの修正作業に携わった。&br;

(アルファベット順)


**課題の内容 [#b9b0d6b8]
***概要 [#dd83266e]
紙パックを所定の位置から所定の位置に運搬する。
ロボコンのフィールド平面図
#ref(./robocon2012b.png,80%,robocon_field)

フィールドの説明
''フィールドの説明''

--フィールドは課題1で使用した紙を2枚つなぎ合わせる (向きは自由)
--白い紙パックと黒い紙パックがそれぞれ3個づつ対角のゴール(課題1のゴール)に置かれている (前1個、後2個の2列に配置する)
--2枚の紙のつなぎ目に断面が約3cm×4cmの角材を両面テープまたは押しピンで貼り付ける。
--黒い線の幅は20mmとする
***ルール [#gb56c77a]
基本ルール
''基本ルール''

--白い紙パックと黒い紙パックを入れ替える。
--競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
--課題1のスタート地点からスタートする。
--スタート時のロボットは2個を越えないこと (スタート後はいくつに分裂してもかまわない)。
--開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
--途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
--最終的にゴールに運び込まれた紙パックの数で点数を計算する。

基本得点の計算方法
''基本得点の計算方法''

--運びこまれた紙パックに1個つき5点。
--紙パックが半分以上ゴールからはみ出している場合は、1個1点、はみ出している部分が半分未満の場合は1個3点とする

技術点の計算方法
''技術点の計算方法''
-以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 &br;得点の目安:

--紙パックまでたどり着く動作 (3点)
--紙パックを運ぶ動作(2点)
--障害物を越える動作 (4点)
--2台以上のロボット、あるいは単体のロボットの場合は2台のRCX,NXTの連携の良さ(3点)
--自立型のロボットとしての形や動作の美しさ、斬新さ(3点)
--その他 (4点)
RIGHT:(画像及び文章は[[2012b/ロボコン]]より引用(一部変更有))


**ロボットの紹介 [#l7fe4118]
今回の課題は角材を超えて紙パックを運ぶ必要があったため、角材の両側にロボットを各一体ずつ、計2体のロボットを使用しています。&br;
機体を作成する段階で既にロボコンの期日が迫っていたので、プログラム作成の負担を軽くするためロボットは2台とも同じ構造にしました。


***全体ついて [#w9c564b1]
-コンセプト

まず、走行するための機構については、機体の大きさを気にする必要がないため、NXT付属のテキストに載っているモデルをそのまま引用することにしました。&br;
本体は、前方に配置するアームのスペースを確保するため、横向きにして後ろの方に配置しようと考えました。&br;
そして、パック回収のための機構を動作させるモータは、本体の前部に固定しようと思いつきました。


-構造の説明
***パックを運ぶ機構について [#w85034af]

全体の構造としてはかなり単純なものになりました。&br;
本体を後方に固定し、駆動させるタイヤは本体の前方下部、紙パックを運ぶ機構は本体の前方上部に設置し、後部にキャスターを設けてあります。&br;
タイヤの前方に光センサが取り付けられていますが、実際にはこれは使用しませんでした。&br;
プログラム作成の最後の最後まで「もしかしたら使うかもしれない」と考えていたので、最後まで残る羽目となりました。&br;
完全に蛇足です。いらない子です。(付いたままでも全く問題ないので、悪い子ではないです。)&br;


#ref(./12bm233.jpg,100%,left_side)
上の写真はロボットの左側から撮影したものです。この写真の左がロボットの前方(進行方向)となります。


&ref(./12bm214.JPG,60%,top);&ref(./12bm208.JPG,60%,back);&br;
左の写真は上方から、右の写真は後方から撮影したものです。

***紙パックを運ぶ機構について [#w85034af]
-コンセプト

まず最初に紙パックを持ち上げることができる機構を考えましたが、成功する確率があまりにも低かったためボツとなりました。&br;
そこで、toshiくんのアイデアから、角材の向こう側にある紙パックをアーム内に取り込み、後退することによってパックを角材の自分側に引き込む、&br;
ということが可能なものを目指しました。&br;

-構造の説明

#ref(./12bm234.jpg,80%,bar)
上の写真は、アームが上がっている状態の機体を右前方から撮影したものです。&br;
○印の付いてるバーは紙パックを押すためのものであり、このバーで押すことによって角材に対して真っ直ぐに紙パックを設置することができます。&br;


#ref(./12bm235.jpg,80%,arm)
紙パックを取り込み、運ぶためのアームです。&br;
動作の誤差によって多少左右にずれても紙パックを回収できるように、アームの横幅は大きく取ってあります。&br;

アームに接続されているバー(1)は、紙パックの真ん中辺りを前方から押さえるためのバーです。これによって、運ぶ際に紙パックがアームの外に出るのを防いでいます。&br;

バー(2)は、真ん中に回転しないタイヤが取り付けられているのですが、これがこの機構の重要なポイントの一つです。&br;
角材の向こう側の紙パックを引き込む際、このバーが主に紙パックに触れており、引き込む役を担います。&br;
その紙パックに触れる部分にタイヤを取り付けることによって、タイヤの摩擦で、紙パックが滑り落ちることなく角材を超えることができるのです。


&ref(./12bm206.JPG,80%,motor1);&ref(./12bm207.JPG,80%,motor2);&br;
アームに動力を伝達するためのモータです。モータに直接接続されているバーから、1つ輪ゴムを介してアームに動力が伝わるようになっています。&br;
この輪ゴムがこの機構の重要なポイントのもう一つです。&br;
角材の向こう側の紙パックを引き込む際、紙パックが角材に乗り上げてアームが少し持ち上がるのですが、その時に輪ゴムの弾性によってアームを下に押し下げようとする力が働きます。&br;
この力によってアームの先のタイヤが紙パックに強く押し付けられて常に接触することで、紙パックが滑り落ちることなく角材を超えることができるようになっています。


文字だけではイメージしづらいので、紙パックを引き込む一連の動作の写真を載せておきます。&br;
&ref(./12bm223.JPG,35%,1);&ref(./12bm224.JPG,35%,2);&ref(./12bm225.JPG,35%,3);&ref(./12bm227.JPG,35%,4);&ref(./12bm229.JPG,35%,5);
2枚目以降の、アームが少し持ち上がってる状態の時、輪ゴムの弾性によって下向きに押さえる力が働いています。&br;
また、2枚目の写真のように紙パックを持ち上げた状態のまま静止させても、バーのタイヤの摩擦のおかげで紙パックが滑り落ちることはありません。&br;
角材を乗り越えた後、紙パックが倒れてしまっていますが、それでも運べるような構造となっています。

***工夫・苦労した点 [#vabeb7eb]
-紙パックを運ぶためのアームの製作(上記)&br;
何度も試行錯誤を繰り返すことでこの型にたどり着くことができました。
***反省点と考察 [#c83abdcd]
-機体に負荷がかかると、変形してタイヤのモータ近くのパーツがモータの回転を阻害してしまうことがある。&br;
恐らくこれのせいで本番で失敗しました。構造はテキストのものそのままでも、重心の位置が違ったためこのようなことが起こったのだと思います。&br;
-キャスターに負荷がかかりすぎている&br;
これも本体を後ろに置いたことによる重心の移動のせいだと思われます。
-タイヤが重いのと輪ゴムを介しているためアームが少し回りづらい&br;
この問題はモータの回転数を増やすことでなんとか解消できました。
-衝撃によってアーム(1)が外れることがある&br;
そもそも無理矢理取り付けたようなパーツだったので、そのせいだと思います。本番でも外れました。


**プログラムの紹介 [#o721ccc9]
***概要 [#e9ff5d03]
今回の課題は、プログラムを作成する段階で私達の能力では高得点を取ることは不可能だと判断したので、&br;とりあえずパックを最低2個(最高も2個)は運ぶ、といったプログラムとなっています。&br;また、ロボットは2台ですがプログラムはほとんど同じものを使っています。&br;
最初は所々でライントレースをすることで位置を調節するようなプログラムを組んだのですが、何回か試すうちにライントレースをすると逆に精度が下がってしまうと判明したので、&br;全ての動作を値を指定して実行させることにしました。&br;その際に、モータの回転角制御や左右のモータの同期を活用して、各動作の誤差を最小限にしようと努めました。
今回の課題は、プログラムを作成する段階で私達の能力では高得点を取ることは不可能だと判断したので、&br;
とりあえず紙パックを最低2個(最高も2個)は運ぶ、といったプログラムとなっています。&br;
また、ロボットは2台ですがプログラムはほとんど同じものを使っています。&br;
最初は所々でライントレースをすることで位置を調節するようなプログラムを組んだのですが、何回か試すうちにライントレースをすると逆に精度が下がってしまうと判明したので、&br;
全ての動作を値を指定して実行させることにしました。&br;
その際に、モータの回転角制御や左右のモータの同期を活用して、各動作の誤差を最小限にしようと努めました。

全体の動作の流れとしては
+パックの前まで直進
+パックを回収
+紙パックの前まで直進
+紙パックを回収
+その場で90度右旋回して直進
+パックを押して壁際に設置し、その後後退
ここで、ロボット2のみ7秒半ほど待機(パック回収の際ロボット同士が接触するのを防ぐため)  
+紙パックを押して壁際に設置し、その後後退
+90度右旋回して、スタート地点手前まで前進
+90度左旋回して、壁際まで前進
+反対側のロボットが設置したパックを回収
+反対側のロボットが設置した紙パックを回収
+後退して90度左旋回
+前進してパックを所定の位置まで運び、パックを放す
+前進して紙パックを所定の位置まで運び、紙パックを放す
+終了

(片方のロボットのみ、4と5の間で7秒半ほど待機(紙パック回収の際ロボット同士が接触するのを防ぐため))&br;

といった様になります。

#ref(./12bm236.jpg,80%,robocon_orbit)


***作成したプログラムとその詳しい説明 [#w5cbcf5d]
ポートAはパックを運ぶ機構、ポートBは右タイヤ、ポートCは左タイヤに接続されています。
ポートAは紙パックを運ぶ機構、ポートBは右タイヤ、ポートCは左タイヤに接続されています。


定数、サブルーチン等

-''定数、サブルーチン等''

 #define SPEED_H 45    //高速
 #define SPEED_L 35        //中速
 #define SPEED_LL 20    //低速
 #define SPEED_L 35        //低速
 #define pi 180            //π=180°
モータの稼働スピードと、モータの回転角制御のための角度の定数を用意。&br;各場面で最適な動作をするために、スピードを3段階設けてあります。
モータの稼働スピードと、モータの回転角制御のための角度の定数を用意。&br;
各場面で最適な動作をするために、スピードを2段階設けてあります。



 #define catch1 RotateMotor(OUT_A,SPEED_H,2*pi);
初期の位置に置いてあるパックを回収する動作。
初期の位置に置いてある紙パックを回収する動作。

 


 sub catch2()
 {
	 OnFwdSync(OUT_BC,SPEED_H,0);     //前進
	 Wait(2000);
	 Off(OUT_BC);
	 OnFwd(OUT_A,SPEED_L);         //パックをアーム内に取り込む
	 OnFwd(OUT_A,SPEED_L);         //紙パックをアーム内に取り込む
	 Wait(1500);
	 Off(OUT_A);
	 Wait(200);
	 OnFwdSync(OUT_BC,-SPEED_H,0);     //後退
	 Wait(2000);
	 Off(OUT_BC);
	 OnRev(OUT_A,SPEED_L);         //アームを上げる
	 Wait(1200);
	 Off(OUT_A);
	 OnFwdSync(OUT_BC,SPEED_H,0);     //前進
	 Wait(1000);
	 Off(OUT_BC);
	 OnFwd(OUT_A,SPEED_L);         //パックを回収
	 OnFwd(OUT_A,SPEED_L);         //紙パックを回収
	 Wait(1200);
	 Off(OUT_A);
	 Wait(200);
	 OnFwdSync(OUT_BC,-SPEED_H,0);
	 Wait(1000);
	 Off(OUT_BC);
 }
木の棒の向こう側にあるパックを回収する動作。一回目の後退でパックを木の棒の自分側に引き込んで落とし、その後パックを回収します。
角材の向こう側にあるパックを回収する動作。一回目の後退でパックを角材の自分側に引き込んで落とし、その後パックを回収します。



実行する動作

-''実行する動作''

 task main()
 {
	 OnFwdSync(OUT_BC,SPEED_H,0);     //パックの前まで前進
	 OnFwdSync(OUT_BC,SPEED_H,0);     //紙パックの前まで前進
	 Wait(2800);
	 Off(OUT_BC);
	 catch1;                //パックを回収
	 catch1;                //紙パックを回収
	 Off(OUT_ABC);
	 Wait(100);
	 RotateMotor(OUT_B,-SPEED_L,2*pi);   //右旋回
	 OnFwdSync(OUT_BC,SPEED_H,0);     //少し前進
	 Wait(800);
	 Off(OUT_BC);
	 RotateMotor(OUT_A,-SPEED_H,3*pi);   //アームを上げる
	 OnFwdSync(OUT_BC,SPEED_L,0);     //木の棒の前まで前進してパックを設置
	 OnFwdSync(OUT_BC,SPEED_L,0);     //角材の前まで前進してパックを設置
	 Wait(900);
	 Off(OUT_BC);
	 OnFwdSync(OUT_BC,-SPEED_L,0);     //後退
	 Wait(1000);
	 Off(OUT_BC);
	 RotateMotor(OUT_B,-SPEED_L,2*pi);   //右旋回
ここまでが1〜4の動作です。&br;パックをより真っ直ぐに設置するため、途中までアームを下げた状態で運ぶようにしています。
ここまでが1〜4の動作です。&br;
紙パックをより真っ直ぐに設置するため、途中までアームを下げた状態で運ぶようにしています。



ここで、一方のロボットは&br;
 Wait(7500);
が入り、7秒半ほど待機します。



	 OnFwdSync(OUT_BC,SPEED_H,0);          //スタート地点手前まで前進
	 Wait(1800);
	 Off(OUT_BC);
	 RotateMotor(OUT_C,-SPEED_L,2*pi);   //左旋回
	 catch2();               //反対側のロボットが運んだパックを回収
	 catch2();               //反対側のロボットが運んだ角材の向こう側のパックを回収
	 RotateMotor(OUT_C,-SPEED_L,2*pi);   //左旋回
	 OnFwdSync(OUT_BC,SPEED_H,0);     //パックを運ぶ目的地まで前進
	 OnFwdSync(OUT_BC,SPEED_H,0);     //紙パックを運ぶ目的地まで前進
	 Wait(2000);
	 Off(OUT_BC);
	 RotateMotor(OUT_A,-SPEED_H,2*pi);   //パックを設置
	 RotateMotor(OUT_A,-SPEED_H,2*pi);   //紙パックを設置
 }
ここまでで5〜9の動作です。もともとパックを2個運ぶことだけを目的としたプログラムなので、ここで終了です。
ここまでで5〜9の動作です。もともと紙パックを2個運ぶことだけを目的としたプログラムなので、ここで終了です。&br;
(ここに載せたプログラムは、ロボコンで実行したプログラムではなくそこから不要な部分を取り除いたものです。&br;
使っていない定数や動作の定義を削っただけなので実際の動作は全く同じものとなっています。)

***工夫・苦労した点 [#e62e201e]
-正確に旋回してくれるよう、モータの回転角を何度も調整した。
-アームがしっかり回ってくれるようにモータの回転速度を早くする、回転角を大きくする等の調整をした。

***反省点と考察 [#i05dad03]
-前進及び後退が時間を指定して動いているので、電池の残量によって移動距離が変わってしまう。&br;
本番直前に調整の時間があったからいいものの、本来はこのような不確実な要素は入れるべきではなかったと思います。
-せっかく授業で学んだライントレースや通信を、取り入れて活用することができなかった。&br;
学んだことを積極的に取り入れてより高度な動きをさせれば、もっと高い点数を取ることは可能だったと思います。&br;
通信の仕方をよく理解していなかったので、その辺をしっかり学習しておくべきでした。

***おまけ [#ff47692b]
blackcatくんとscarくんが音楽制作を大いに頑張ってくれたので、紹介の意味でそちらのリンクを貼っておきます。&br;
blackcatくんのページ:[[2012b/Member/blackcat/Mission2#x1067d6e]]&br;
scarくんのページ:[[2012b/Member/scar/Mission2#e9fa8c3c]]


**ロボコンの結果 [#c8f96604]
反対側のパックを回収後、片方のロボットが旋回に失敗したため、最後まで運べたパックは1個だけでした。&br;点数は基本得点5点、技術点15.8点の合計20.8点となり、6チーム中3位となりました。
反対側のパックを回収後、片方のロボットが旋回に失敗したため、最後まで運べたパックは1個だけでした。&br;
点数は基本得点5点、技術点15.8点の合計20.8点となり、6チーム中3位となりました。

3位の賞品をもらったので写真を載せておきます。
3位の景品をもらったので写真を載せておきます。
#ref(./12bm231.JPG,40%,robocon_prize)
私にはこの商品の価値はわかりませんが、記念として大切に保存しておきたいと思います。


**全体の感想・反省等 [#v0cbb671]
-Mission1の時と違い、皆で集まって作業する時間を多くとれたのでその辺は良かったと思います。&br;
しかし、本格的に取り掛かり始めるのが遅すぎたようにも感じました。
-皆で話し合いながら同じものを共同で作っていく、そんな作業を通してグループワークにおいて大切な何かを学べたのではないかと思います。&br;
-チームワークの大切さを痛感しました。
-製作途中で、3個以上運ぶのは諦める、という大きな決断をしたのはとてもいい判断だったと終わってから気づきました。&br;
限られた時間で自分は何ができるのかということをよく考えるのも大切だと知ることができました。
-この授業はかなり辛いものでしたが、とても多くのことを学べました。&br;
この努力を無駄にしないためにも、今後の工学系の授業では、ここで学んだことを生かせる機会を探していきたいと思います。


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