[[2017a/Member]]

#contents

*課題�� [#q042eaac]
今回の課題は缶積みロボットの制作であった。課題�兇濃藩僂靴拭▲魁璽稿發亮靴�所に空き缶を設置する。それらの缶を回収し、積み上げ、ゴール内に運ぶことによって得点を競うというものだった。

詳しいルールについては [[こちら>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission3]] を参照してほしい。

*作戦 [#rbd445cc]
私達は、3段積むことができることを目標として制作した。
まずは、スタート地点からE-F-Q-Tの順にコースをライントレースしながら進み、各地点にある4つの缶を積み重ねず、アームを開いて押しながら回収する。そして、ゴール地点で回収した缶を置く。次にUターンしてR-S-H-Tの順に進み、缶を見つけたらアームで掴み、積み重ねながら回収する。最終的に3段に積み重ねられた缶をゴール地点に置く。という作戦で得点を稼ぐことにした。
しかし、ロボットの制作で時間がかかってしまい、プログラムが間に合わなくなってしまったので、作戦を変更しE-F-Q-T間にある缶のみ積み重ねずに回収し、ゴール地点に運んで得点を稼ぐことに変更した。


*ロボット本体 [#f3274f2d]
今回はロボットの制作が非常に大変だった。
まずは缶を回収し、積み上げるためにはどのような機構が必要であるかということを考えた。その結果、それには、缶を掴むためのアーム、缶を持ち上げ、積み重ねるときに必要なリフトの機構が必要である、というように私達は考えた。

今回の課題ではRCXを2つ繋げて、1つのロボットとして使用する方法と、ひとつは缶を回収し、もうひとつは積み重ねる、というように役割を分担し、機体を2つに分ける方法との2種類が考えられたが、私達は前者を採用した。今回の課題ではアームを開閉する動作、缶を持ち上げる動作、移動する動作、の3種類の動作が必要である。それには最低でも、モータは4つ使用する必要があるのだ。1つのRCXに接続することのできるモータの数は限られているので、機体を2つにした場合ではモータの数が足りなくなってしまうのではないかと思い、私達は余裕を持ってモータを使用できるようにするため、機体を1つにする方法を採用した。


&ref(2017a/Member/Kobakazu/Mission3/IMG_1.jpg,前方);
&ref(2017a/Member/Kobakazu/Mission3/IMG_2.jpg,横);

2つのRCXは縦に接続し、立てることにした。立てると、機体全体のバランスが取りにくくなってしまうのだが、センサやモータのコードの接続が非常にしやすくなり、また、リフトとのバランスがうまく取れるということがわかったので、立てるようにした。
今回のロボットの足回りはタイヤではなく、キャタピラを利用した。キャタピラはタイヤに比べて地面に接している部分が多いので、その分、バランスが取りやすい。今回はリフトの機構によって高さが出るのに加え、RCXを立てることにしたので比較的バランスが取りやすいキャタピラを利用しすることにした。


*アームの機構について [#u5775b9f]
アームは一つのモータで、ギアを組み合わせて缶を掴むことができるようにした。缶が積み重なっていくと高さが出てくるので、高さが出た場合でも缶が崩れ落ちてしまうことが無いように、アームの上に支えを作り、缶が積み重なったとしても簡単に崩れることがないようにした。

&ref(2017a/Member/Kobakazu/Mission3/IMG_5.jpg,アームとリフト);
&ref(2017a/Member/Kobakazu/Mission3/IMG_3.jpg,缶を掴んだ場合);

缶に接触する部分はタイヤにした。缶を積み重ねるには、持ち上げた時に缶が滑り落ちないようにする必要があるのでタイヤを用いて四点で支え、缶との摩擦力を高めることにより、滑り落ちないようにした。このタイヤはできるだけ軽いものを利用して、持ち上げた時にリフトにかかる負担を軽くするようにした。

*リフトの機構について [#z242da34]
今回の課題で機体を作るにあたって、このリフトの機構が一番苦労した部分である。缶を持ち上げる方法は何種類かあり、それらを試してみた。ひとつ目は、アームで挟んだあと、アームに取り付けたタイヤを回転させることによって缶を持ち上げる方法である。ふたつ目はアームで缶を掴み、その掴んだアーム全体をリフトによって持ち上げてしまうという方法である。ひとつ目は、アームで挟んだあと缶と接触するタイヤの位置がうまく行かず、持ち上げることができないことがあった。ふたつ目はアーム全体を持ち上げる必要があるのでモータの力をうまく利用する必要があり、リフトの軸の部分の設置が難しいが、缶を掴んでからは安定して持ち上げることができる方法だった。そこで、両方の機構を試しに作ってみた結果、アーム全体を持ち上げる機構のほうが安定して缶を持ち上げることが出できたのでそちらの機構を採用することにした。

&ref(2017a/Member/Kobakazu/Mission3/IMG_4.jpg,リフト);

リフトの機構ではウォームギアを利用した。ウォームギアを使うことによって大きな力を伝えることが可能になるのである。右側のモータが回転するとウォームギアに動力が伝わり、それからギアに伝わって、シャフトを、ギアが登っていく。そこに、アームを取り付けることによって、アーム全体が、シャフトを登っていくことができ、缶を積み重ねることが可能である。右下のギアは別のギアへと動力を伝えるわけではなく、リフトの高さを手動で調節しやすくするために取り付けた。これを回せば、手動で簡単に高さを調節することができる。

*各センサについて [#k4400f97]
今回の課題では、光センサとタッチセンサを利用した。光センサでライントレースをし、タッチセンサが反応したら缶を掴む動作をするという方法である。各センサの接続はプログラムが書きやすいように接続するようにした。缶を持ち上げるリフトの機構で、回転センサを利用することによって、缶を持ち上げる高さを調整することも考えたが、制作している途中で、リフトとアームの部分がかなり重くなってしまったことに加え、時間調節でも高さが調節することが十分可能であるということがわかったので、機体を軽量化するため、回転センサを利用せずに時間で調節することにした。

*プログラムについて [#x105b1c3]
本来は作戦通りにプログラムを制作する予定だったが、先述したように、ロボット本体を作るのに時間がかかってしまったことが原因で、プログラムを制作する時間がなくなってしまった。そこで、急遽作戦を変更し、E-F-Q-T間にある缶のみ積み重ねずに回収して、ゴール地点に運ぶことで得点を稼ぐことにした。

プログラムについてはコメント分で説明した。

**ライントレースのプログラム [#bd5c942f]
ライントレースのプログラムは課題�兇了�に記述したプログラムを改良して使用した。

定義部分
 #define go_forward OnFwd(OUT_AC);//前進
 #define turn_right OnFwd(OUT_A);//右折
 #define turn_left OnFwd(OUT_C);//左折
 #define migisenkai OnFwd(OUT_A); OnRev(OUT_C);//右旋回
 #define hidarisenkai OnFwd(OUT_C); OnRev(OUT_A);//左旋回
 #define power(s) SetPower(OUT_AC,s); //モーターの出力が変更可能
 #define sound1 PlaySound(SOUND_UP);
 #define sound2 PlaySound(SOUND_DOWN);Wait(100);
 #define GO(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);//前進時間変更可能
 #define SIGNALGRAB 100
 #define SIGNALBACK 200
 #define back(u) OnRev(OUT_AC); Wait(u); Off(OUT_AC);//後退時間変更可能
 
サブルーチン
 
 sub trace2()//交差点の判断などは課題�兇了�と同様
 {
     ClearTimer(0); 
 
     while (FastTimer(0)<=25){
         if (SENSOR_1 > 49){//右旋回
             migisenkai; ClearTimer(0);
         } else if (SENSOR_1 > 44){//右折
             turn_right; ClearTimer(0);
         } else if (SENSOR_1 > 40){//前進
             go_forward; ClearTimer(0);
         } else if (SENSOR_1 > 36){//左折
             turn_left; ClearTimer(0);
         } else if (SENSOR_1 > 33){//左旋回
             hidarisenkai;//タイマをリセットしない
         }
     }
     Off(OUT_AC);
 }
 
 
 sub hidari1()
 {
     sound1;
     go_forward;
     Wait(20);
     hidarisenkai;
     Wait(40);
     turn_left;
     Wait(30);
 }
 
 sub hidari2()
 {
     sound2;
     go_forward;
     Wait(20);
     hidarisenkai;
     Wait(40);
     turn_left;
     Wait(30);
 }
 
タスクメイン
 
 task main()
 {
     SetSensor(SENSOR_1, SENSOR_LIGHT);
     power(4);//モーターの出力を調整。課題�兇了�は0であったが、0の場合では出力が足りなかったので、前回の課題のときよりも出力を高めた。
     ClearMessage();
 
     GO(100);//スタート枠から前進
 
     trace2();//A-F区間
     hidari1();//Fを左折
 
     trace2();//F-Q区間
     hidari2();//Qを左方向
 
     trace2();//Q-R区間
     hidari1();//Rを左折し、Tに向かう
 
     trace2();//R-T
     GO(200);//前進してゴールの中に入る
 
     SendMessage(SIGNALGRAB);//ゴールの位置に到着したことを知らせる。アーム側はこれを受け取ったらアームを動かして缶がゴールの領域に入るようにする
     while(true){
         until (Message() == SIGNALBACK);//SIGNALBACKを受信するまで待つ
         back(300);//後退する
     }
 }
 

**アームのプログラム [#f523fa78]
アームのプログラムは

定義部分

 #define grab OnFwd(OUT_C); Wait(100); Off(OUT_C);//アームで缶をつかむ
 #define relese OnRev(OUT_C); Wait(100); Off(OUT_C);//アームで缶を離す
 #define rift_up OnFwd(OUT_A); Wait(700); Off(OUT_A);//リフトを持ち上げる
 #define rift_down1 OnRev(OUT_A); Wait(200); Off(OUT_A);//リフトを次の缶の高さまで下げる 
 #define rift_down2 OnRev(OUT_A); Wait(300); Off(OUT_A);//リフトを次の缶のつかむ高さまで下げる。つまりはじめの高さまで下げる
 #define SIGNALGRAB 100
 #define SIGNALBACK 200
 #define grab2(s) OnFwd(OUT_C); Wait(s); Off(OUT_C);//缶を掴む時間変更可能
 #define relese(t) OnRev(OUT_C); Wait(t); Off(OUT_C);//缶を離す時間変更可能
 
タスクメイン 

 task main()
 {
     SetSensor(SENSOR_1,SENSOR_TOUCH);//センサー�気縫織奪船札鵐�
     SetSensor(SENSOR_1,SENSOR_TOUCH);//センサー1にタッチセンサ
     ClearMessage();
     int count;//変数を定義
     count=0;
 
     while (count<1){//countが1未満の時ループに入る
         ClearMessage();//Messageの値を0に初期化
         if (Message() == SIGNALGRAB){//SIGNALGRABを受信したらcountに1が足される。受信したらループを抜け出す。
             count++;
         } else count = 0;//そうでなければcountは0
         
     }
     grab2(50);//缶をゴール内にまとめるためにアームを動かす
     relese(70);//大きめにアームを開いて缶を完全に離す
     SendMessage(SIGNALBACK);//後退するように伝える。
 
 }


*まとめ [#h33917be]
製作時間が足りなく、ロボットの制作に時間がかかりすぎてしまったため、プログラムが間に合わなくなってしまい、積み上げることができなかった。リハーサルもろくにできずに本番に向かうことになってしまった。本番ではライントレースのプログラムがうまく動作することができず、一つも缶を回収することができなかった。この不具合の原因として、課題�兇了�と同じライントレースプログラムを利用したので、今回製作したロボットと課題�兇了�のロボットとはモータのコードの接続の向きが違い、モータが回転する方向が異なってしまったのではないかと考えられる。

もう少し計画的に制作をすすめることができれば、プログラムを記述することができ、積み重ねる動作もできたと思う。この反省を活かして、次に何かを制作したり、期限があるときには、問題が発生してもいいように時間に余裕を持った計画を立てて、制作していくようにしたい。

このロボティクス入門ゼミを受講して、ロボットの制御は必ずしも信用できるものではないということが実感できた。ロボットは人間が作っているものであって、その人間が完璧ではなのだから必ずしも信用できないというのは納得である。また、缶を回収して、積み重ねて目的地に置くという人間であれば簡単にできる動作をロボットにやらせるとなると非常に困難になるということも実感した。そう考えると、ロボットに任せるのではなく、人間がやったほうが効率的なものはまだ多くあると思う。現在の社会では、機械化が進み、将来、人工知能などで人間の多くの仕事がロボットに取って代わられると言われているが、人間の能力はロボットに劣らない重要な価値があると思う。これからの社会、人間の能力とロボットの能力どちらか一方に依存するのではなく両方の適度なバランスを保ちながら共生していく必要があると感じた。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS