[[2015a/Member]]
#contents

*課題1 [#ic71a861]

第一回目の課題は、書道ロボットの作成です。
課題内容は[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMission1]]になります。

*ロボットの構造説明 [#l825ec4e]

今回の書道ロボットでは「美」という字を描いています。画数は、九画です。

ロボットを作成する際に気を付けた事として、構造を理解しやすいように出来るだけシンプルしたという事が挙げられます。

**setpowerを使用せずに減速 [#u20f4f8d]
モーター自体の力が弱いため、本体全ての重さがかかっている車輪(モーター)にsetpowerを使うと、どうしても床等の環境に依存してしまいます。フローリング等の硬い床でしたらsetpowerは可能ですが、絨毯等の弾力性のあるものでは、setpower3以下は全く動きません。その為、時間での回転角定義が曖昧となってしまいます。

そのような欠点がある以上、車輪プログラムにsetpower避けることが必須でした。

#ref(./001.JPG,40%)

***車輪ののギア比 [#ibb67537]

+モーターの回転部分に歯数12の歯車を付け、次の棒(2番目)に歯数40の歯車を付けます。ここでギア比は12:40=3:10(回転数が3/10になる)です。
+また、同じ棒(2番目)に歯数8の歯車を付け、大きな歯車(歯数40)が1回転すると小さな歯車(歯数8)も一回転します。
+歯数8と車輪についている歯数24の歯車が噛むことになるので、ここでのギア比は8:24=1:3(回転数が1/3になる)です。

よって、以上の(1.)(2.)を掛け合わせたもの{(3/10)*(1/3)=(1/10)}がギア比になります。
つまり、モーターが10回転すると1回車輪が回転し終えるということです。

**ペンを垂直にあげるために [#s7d3fef1]

字の太さに差をつけるため、垂直に上下動させることを考えました。
また、そこでどのようなペンでも使用できるよう考慮し、キャタピラを取り付けることにしました。

ペンは比較的軽いため、setpowerが可能です。ですが、あまりにも回転数が早いと微調整が難しい上、弱いsetpowerで起きる誤作動を防ぐため、LOWPOWERが4でも済むようここでもギア比を用いて調整しました。

作成後の収穫として、キャタピラならではの利点がありました。ペンの位置調整がずれてもペンが前後に動きやすいため、柔軟に対応できるということです。つまり、紙に近い位置にペンをつければ、高さやキャタピラを動かす時間をそれほど意識しなくてよいということです。

&ref(./005.JPG,20%);
ここでのギア比は、一回目に歯数8と歯数40が噛み(1/5)、歯数40と同じ棒に歯数8が付き、その歯数8が歯数24と噛み合っている(1/3)ため、{(1/5)*(1/3)=1/15)}となります。

すなわち、モーターが15回転するとキャタピラの車輪が1回転します。

**後輪のキャスター [#j53f84ca]

重心が前方に位置するため、移動速度が遅いとは言え転倒することが考えられました。前輪が四方滑らかに動くためにはキャスターが必要ですが、キャスターは垂直でなくては機能しません。

#ref(./002.JPG,40%)

重心を少しでも中心へ移動させるには、上の写真のように後輪が少し下がっている必要があります。その微調整が今回のロボット作成で一番の苦労点でした。


*プログラミング[#f224a4ad]
**プログラミングの説明 [#yc494bf1]
まずは今回の書道ロボットのプログラム全てを記載します。

 #define HIPOWER 7
 #define LOWPOWER 4
 #define WAIT Wait(50);
 #define set_power_pH SetPower(OUT_B,HIPOWER);
 #define set_power_pL SetPower(OUT_B,LOWPOWER);
 #define turn_left(t) OnFwd(OUT_A); OnRev(OUT_C); Wait(t); Off(OUT_AC); WAIT;
 #define turn_right(t) OnRev(OUT_A); OnFwd(OUT_C); Wait(t); Off(OUT_AC); WAIT;
 #define go_forward(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC); WAIT;
 #define go_back(t) OnRev(OUT_AC); Wait(t); Off(OUT_AC);
 #define TURN_TIME 190  //垂直回転時間
 #define TURN_TIME2 180  //左右でモーターの強さが異なるため時間で補正

 sub pen_up_fast()
 { set_power_pH OnFwd(OUT_B);
   Wait(49);
   Off(OUT_B);
   WAIT;
 }
 sub pen_up_slow()
 { set_power_pL OnFwd(OUT_B);
   Wait(55);
   Off(OUT_B);
 }
 sub pen_down()
 { set_power_pH OnRev(OUT_B);
   Wait(50);
   Off(OUT_B);
 }

 task main ()
 {
   pen_down();
   go_forward(60);
   pen_up_fast();  //一画目
   go_back(70);
   WAIT;
   turn_left(130);
   go_forward(150);
   turn_right(270);
   pen_down();
   OnFwd(OUT_AC);
   Wait(60);
   pen_up_slow();
   Off(OUT_AC);  //二画目
   WAIT;
   go_back(20);
   WAIT;
   turn_right(100);
   go_forward(100);
   pen_down();
   go_back(170);
   pen_up_fast();  //三角目
   repeat(2){
     turn_left(TURN_TIME);
     go_forward(50);
     turn_right(TURN_TIME2);
     go_forward(150);
     pen_down();
     go_back(150);
     pen_up_fast();
    }  //四・五画目
   turn_left(TURN_TIME);
   go_forward(50);
   turn_right(TURN_TIME2);
   go_forward(180);
   pen_down();
   go_back(230);
   pen_up_fast();  //六画目
   go_forward(150);
   turn_right(TURN_TIME);
   go_forward(135);
   pen_down();
   go_back(125);
   pen_up_fast();  //七画目
   turn_left(40);
   go_forward(30);
   turn_right(110);
   pen_down();
   OnRev(OUT_AC);
   Wait(160);
   pen_up_slow();
   Off(OUT_AC);  //八画目
   WAIT;
   go_forward(215);
   turn_left(140);
   go_back(25);
   pen_down();
   go_back(120);
   OnRev(OUT_AC);
   Wait(50);
   pen_up_slow();
   Off(OUT_AC);  //九画目
 }

**上記のプログラムで実際に書いたもの [#o1792b59]

#ref(./004.JPG,20%)

**書き順 [#md1c0d73]

プログラミングがし易いよう、本来の書き順とは違う書き順にしてあります。下にあるgif画像が今回描いた書き順になります。

#ref(./008.gif)

「美」という字には、横棒が4本あります。実際の書き順では、四画目は縦なのですが、三・四・五・六画目に全て横棒を持ってきました。そうすることで、縦線を引いた後、八・九画目の払いに入りやすいという利点もあります。

**プログラムからのロボット動作観点 [#x70e3026]

最初のdefineでは、setpowerを定義しています。序盤に記載した通り、車輪回転の方にはsetpowerを用いず、ペンの滑らかさを出すため、ペンの上下動だけに用いています。

turn_left,rightの時間を(t)と置いたのは、90°回転以外は基本的に角度が異なり、一角一角調整を加えていくためです。

それぞれの動作の間にWAIT(待ち時間)があるのは、移動後の滑りによる変化を防ぐためです。defineのgo_backにはWAITがありませんが、それはgo_backを用いた後に字の払いの動作が入るからです。go_backの後にWAITが必要な場合は、task mainに書き込んであります。

*細かい動作制御、利用 [#z7b0141b]
今回使用したRISのモーターは左右で出力に差があり、直進することができませんでした。機械の性質上仕方のないことですので、その欠点を時間定義でカバーするようにしました。

例えば、左に90°回転、少し進んで右に90°回転、その後真っ直ぐ進みたいとした時、直進できないという性質上、その後の真っ直ぐでは少しカーブを描きます(「直進」と「真っ直ぐ」という言葉は、意味を混同しないために分けて記述しています)。それを補う為に、右旋回90°を85°程度で止め、直進させることによって、目的の場所へ辿り着かせるというプログラムを作りました。

**文字の細かい部分を描くにあたって [#l60c2627]

***文字(払い) [#b1cfbb27]

文字の払いを表現するために、二画目・九画目に以下のような設定をしています。

  pen_down();
  OnFwd(OUT_AC);
  Wait(60);
  pen_up_slow();
  Off(OUT_AC); 

ペンを上げながら車輪を動かすということです。移動速度の関係から、極端に長い払いは難しいですが、ある程度の払いはこれとペンのsetpowerで表現できました。

***止め払い [#nef8f00d]

プログラムを見ると、一番最後の九画目のプログラミングが不自然であることに気が付きます。

  pen_down();
  go_back(120);
  OnRev(OUT_AC);
  Wait(50);
  pen_up_slow();
  Off(OUT_AC);  //九画目

go_backで一度後進しているはずなのに、OnRevで再び後進する指示を出しています。それは、ペンの向きを微妙に変え、払う方向を少し平らにもってくる、という動作をさせるためです。本来なら指示は同じですので、何もずれることなく真っ直ぐ後進するはずです。

この現象はこのRIS特有なのかは定かではありませんが、同じ指示を繰り返すと少しですが一定の角度のずれが生じます。おそらく左右に指示を出す速さが異なるのではないのか、と考えています。このロボットの構造上、中心点がペン先とは異なるため、回転させて止め払いは出来ません。回転させると、左右どちらかにずれてしまうからです。本来欠点と思われる現象ですが、止め払いをする上で大変有用なものとなりました。

*ロボット作成時間 [#se1eb3b5]

-ロボット本体作成時間・・・約20時間(微調整時間含む)
-プログラミング時間・・・約10時間(試し走行を含む)

*今回の課題を通しての反省 [#i8f4c0d1]

作業全体を通じて、作業効率が悪かったと思います。ロボットの微調整等に大幅に時間を取られ、プログラミングの試行回数が少なかったように思われます。最重要作業はロボットの調整ですが、プログラミングとの比率が大きく傾いてしまうと、それだけ作品も悪化してしまいます。同じ失敗を繰り返した場面も見受けられ、そこが時間のロスに繋がったのだと思います。より議論を交わし、円滑なロボット作成ができるよう目指したいと思います。

また、移動式のロボットのため、アームなどで動くロボット等に比べて、プログラムが長いように思われます。このようなロボットを作った場合仕方のないことのように思われますが、作る前にどのようなプログラムになるか考慮した上でロボット作成に取り掛かるべきだったと考えます。それによってプログラミングにも大きな影響(制御のし易さ、理解度向上)があると思います。

以上の反省点を、次回のロボット作成には活かしていきたいと思います。


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