[[2013b/MemberOnly/進行状況]] #contents *チームの仲間たち [#q99e1d55] **Redcicudu [#xe0a2c84] 主にロボットの製作を担当、プログラムはアホみたいにできない。大概はコンパイルエラーで萎えしまう。 因みに名前は「Redcicada(赤い蝉)」としたかったのだが文字が汚すぎて「a」と「u」を間違えられる、どうしてこうなった・・・。 **pianoman氏 [#cd3284a7] このゼミで最も付き合いが長く課題1も一緒に取り組んだ戦友。 奇抜な発想と豊富な知識で素晴らしいプログラムを作成する。 時折変数やプログラムにおかしな名前を付ける。 彼のページはこちら→ http://yakushi.shinshu-u.ac.jp/robotics/?2013b%2FMember%2Fpianoman%2FMission2 **chikuwa氏 [#b1121ba8] 冷静かつ堅実な思考でプログラムとハード双方の製作や調整を行う。 私が大部分を担ったロボットやpianoman氏の奇抜なプログラムを見事に手なずけてみせた苦労人。 私に激辛ぺ○ングの味を教えてくれた。 彼のページはこちら→ http://yakushi.shinshu-u.ac.jp/robotics/?2013b%2FMember%2Fchikuwa%2FMission2 *課題について [#h089b76b] **コース [#o1980176] #ref(2013b/Member/Redcicudu/Mission2/robocon2013b (1).png,17.4KB,今回のコース) コースは前回の課題1において使用したコースを向かい合わせてつなげたものとなっている。そこに黄色い丸で示した位置に空き缶を9個配置し、それらを回収して積み上げて高く積み上げれば積み上げるほど点数が加算されていくというものである。なお、空き缶は「GOAL」と書かれた輪っかの中で積み上げなければ得点が加算されない。 **攻略方針 [#j8a3743e] 今回の課題は空き缶を積めば積むほど得点が高くなってゆく。詳しくは課題2の項目を参照していただきたい。 しかし、空き缶を積むうえでいくつかの問題点が出てくる、大まかに示すと以下の通りである。 +空き缶を高く積みすぎると不安定になる +空き缶はコース上に点在しており、必ずしもライン上にあるわけではない +ゴールの小さな輪っかの中、もしくはライン上に空き缶を置かなければならない そこでこれらの問題点に対して以下のような方法で我々は対処した。 +空き缶を高く積んでも安定して保持できるようなハンド、崩さないように持ち上げるアーム、静かに運搬可能なドライブベースの開発 +超音波センサーを用いてどの方向に空き缶があるのか検出するプログラムを製作する +サーボモーターとしての機能を生かし置く位置の微調整を行う 2に関しては我々のチームの一員であるpianoman氏がプログラムを組んでくれた。残念ながら私は構造をしっかり理解しきれていないので詳しくは彼のページを参照してほしい。 私は主にロボットの製作の方に携わったのでロボット本体について解説を行う。 *ロボットについて [#wa039a17] **ハンド [#sc19a7ef] まずハンドに関してである。我々は「空き缶を四個積み上げたタワーを二つ作る」という方針を大まかに決めていた。そこで空き缶を掴むハンドは四個分の重みに耐えてしっかりと保持し続けることができるような構造にしなくてはならない。そこでハンド自体はいくつか作りかえてのだが、まずは最終決定番について解説する。 #ref(2013b/Member/Redcicudu/Mission2/DVC00019 (2).JPG,42.9KB,ハンドの全体像) 見ての通り非常に大きなハンドであり、このロボットの外見上の特徴ともなっている。これだけ大きなものしたのは空き缶を縦に伸びた棒で支え、横に伸びた部品で空き缶を抑え込むためである。 このハンドは複数個の空き缶を持ち上げるとしても、実際にしっかり摩擦力をかけるのは一番下の空き缶だけである。なぜそのようにしたのかといえば、複数の空き缶に摩擦力を分散させてる構造にしてしまうと、空き缶を複数個ならば固定できるものの一個や二個程度だとむしろ摩擦力が足りなくなってしまうのである。おかげで運搬中に落下するということが頻繁に起きたので、いっそ一番下の空き缶にだけ一極集中させたのだ。 また、ハンドに輪ゴムを使用したことも工夫の一つである。輪ゴムは柔軟性が高く、空き缶にぴったりと接するので摩擦力を高くすることができたのだ。そのおかげもあって空き缶が落下するということは無くなった。 #ref(2013b/Member/Redcicudu/Mission2/・「。シ・猖?ホタオフフ.jpg,96.0KB,旧ハンドの全体像) 初期のハンドは摩擦力をかけるためにタイヤを使用していたが、タイヤのゴムは固く柔軟性に欠けていた。さらに円形であるために接する面積が非常に小さく、十分な摩擦を得ることができなかった。何度か作りなおした末に行きついた形が上記で説明したハンドである。画像を見てのとおり、このころは複数の空き缶にタイヤのゴムが当たるように設計されている、しかし結果として摩擦力の分散によりしっかりと機能しなかった。 **アーム [#m2da0dde] アームを製作するのにあたって最も注意したことは「パワー」と「慎重さ」である。 どのような工夫を行ったのか下の画像を見てほしい。 #ref(2013b/Member/Redcicudu/Mission2/DVC00021 (2).JPG,48.7KB,アームの全体像) 大小のギアが組み込まれているが、これはアームの可動部である。ギアを使用することで同じ出力であっても大きな力を生み出せるようにしたのだ。恐らくご存じの方も多いと思われるが、大きなギアで小さなギアを回すと回転数は多くなるがパワーが小さくなり、小さなギアで大きなギアを回すと回転数は小さくなるがパワーは大きくなるのだ。アームの機構は後者を利用しており、今回の用途ならばアーム自体はゆっくりと大きな力で動かしたいのでうってつけともいえるだろう。また、アームとハンドを取り付ける際に平行四辺形になるように組んでいるので、ハンドが傾いて空き缶を落としてしまうということも無いようにした。 **ドライブベース [#k33deb4d] ドライブベースは上記のハンドとアームを取り付けるため頑丈かつバランスのよいものを目指して製作した。 #ref(2013b/Member/chikuwa/Mission2/sankome.PNG,1357.5KB,全体像) 上の画像をご覧になってもらえばお分かりいただける通り、ハンドとアームはドライブベースのかなり前方にレイアウトすることとなっていた。そのため必然的にトップヘビーとなってしまう。さらに空き缶の重量も前方に集中してしまうのでますますトップヘビーとなってしまう。しかし、それでは全体が前のめりに倒れてしまう。そこでNXTの本体二つを後方に設置することでカウンターウェイトとすることによってバランスを取ることにした。そのおかげで前のめりになることは全く無いのだが、むしろ後方が重くなってしまった。対策としてキャスターを二つつけることで重量を分散させてしっかり支えられるようにした。 #ref(2013b/Member/chikuwa/Mission2/onaka.jpg,202.9KB,下から) また、タイヤの駆動もアーム駆動と同様にギヤを使って回転数を落としてパワーを大きくした。そのおかげで超重量級のこのロボットもゆっくりとだが力強く移動することが可能になった。 *プログラムについて [#xe5d81a7] 残念ながら私はプログラムについて関与した部分がチームの中で最も少ない。プログラムの全体像と詳しい解説を望む方はchikuwa氏とpianoman氏のページを参照することをお勧めしたい。 私が解説するのはごく一部だが、「ライントレースから空き缶の探知に切り替える」プログラムについて解説を行う。chikuwa氏のページでいうCROSS_2()とCROSS_4のサブルーチンがそれに当たる。 **問題点 [#p1f9ffc3] ライントレースを行いながら空き缶を探すということは実はかなり難しい。ライントレースは光センサーを、空き缶の探知には超音波センサーを使用するのだが、二つのセンサーを同時に作動させるのは困難を極めた。そこでいっそのこと「ライントレースを行って空き缶にまっすぐ向き直ったところでライントレースを中断させれば良いのではないか?」と私は考えた。 実はこの考え自体は前回の課題1でも利用したものでもある。今回はその改良版ともいうべきだろう。 **プログラム [#jfe2a74d] ○定義 #define BB 43 //閾値 #define BW 49 #define WB 55 #define WW 60 #define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_B,speedL); #define FWD OnRL(35,35); //前進 #define T_LEFT OnRL(40,0); //左折 #define T_RIGHT OnRL(0,40); //右折 #define Q_LEFT OnRL(30,-30); //左旋回 #define Q_RIGHT OnRL(-30,30); //右旋回 #define STEP 5 //一回の判断で行う動作の長さ int Online2=0; // int hakken=0; ○サブルーチン { while(Online2<1000){ //Online2という変数が1000を超したらライントレース中断 if(SENSOR_1<BB){ Q_RIGHT; Online2++; //Online2をカウント } else { if(SENSOR_1<BW){ T_RIGHT; Online2++; } else if(SENSOR_1<WB){ FWD; Online2++; } else if(SENSOR_1<WW){ T_LEFT; Online2++; } else { Q_LEFT; Online2++; } } Wait(STEP); } hakken++; //ライントレースを中断したらカウント } **仕組み [#ybe867ea] 仕組みはいたってシンプルである。そもそもライントレースというものはセンサーからの値をもとに前進、左折、右折といった動作を細かく行うことであたかもライン上をたどっているかのような動きを行うのである。 それを利用して、ある一定の動作をカウントすることで交差点を検知するプログラムを課題1で作成した。そこで、今回はすべての動作をカウントし、カウントした数が設定した回数を越したらライントレースを中断するようにプログラムしたのである。 それを利用して、ある一定の動作をカウントすることで交差点を検知するプログラムを課題1で作成した。そこで、今回はすべての動作をカウントし、カウントした数が設定した回数を越したらライントレースを中断するようにプログラムしたのである。設定した回数というのは上記のサブルーチンのwhileの中の「1000」という値がそれにあたる。つまりすべての動作のカウントである変数Online2が1000を超えたらライントレースが中断されるようになっているのだ。 しかし、難しいのは「どれだけの回数をカウントした時点でどこまで進んでいるのか?」ということが分かりにくいのだ。途中でカウントがいっぱいになれば空き缶を検知不可能に、カウントする数が大きすぎるとレイントレースをしすぎて空き缶を掴んでくれないのである。 しかし、難しいのは「どれだけの回数をカウントした時点でどこまで進んでいるのか?」ということが分かりにくいのだ。途中でカウントがいっぱいになれば空き缶が遠く検知不可能に、カウントする数が大きすぎるとライントレースをしすぎて空き缶を掴んでくれないのである。 そこでその数字は何回かプログラムを試行することで探り、何とか調整を行うことに成功した。 *まとめ [#s91f4bf8] **ロボコンの結果 [#le8d89b6] 最終的に我々のチームは他のチームに大きく差をつけて優勝した。それはチームの三人が一丸となってこの課題に取り組んだことによる、いわば努力の結晶だと思う。最終的に4缶のタワーを二つ作って無事ゴールに置いた時の感動と安堵は忘れられないだろう。 感動的な空き缶のツインタワーはchikuwa氏のページで是非見てほしい。 **改良点 [#v0ffaedd] 優勝したからといっても完ぺきであるという訳ではない、私がロボコン後に考えた改良点をいくつか以下に示す。 +ロボットが超重量になってしまったのでさらに部品を減らして軽量化するべきだった。 +タイヤへの負担が半端なものではなく、常に不安だった。 +ハンドが開閉する際にギアの歯がスリップして調整がずれてしまう。 +全体の動作があまりにものろまだった。 以上を改善できればより安定した動作ができるロボットになったのではないかと思う。 **感想 [#c65c4ee4] ロボコンでの優勝はとても嬉しかったが、それでもやったことは「空き缶を積んだだけ」である。それまでにかけた時間を考えると、機械というものに何かさせるということはとても大変な事のように思えてきた。よく「機械が発達すれば人間に仕事は無くなるのでは?」と思われがちだが、私はむしろ機械がこの社会に溢れるほどやはり人間の手も必要になってくるのでは無いかと考えた。機械はプログラムの文法上の誤りは正してくれるがそれより先は決してできない。それより先は人間が考えて、手を動かして完成させるのだということをこのゼミで学ぶことができた。