2016a/Member 目次

はじめに

私達のチームは旧モデルであるマインドストーム・ロボティクス・インベンション・システム (以後RIS) を使わせてもらい、2016年度ロボティクス入門での課題である似顔絵を描くロボットの製作とプログラミングにあたった。これからこのロボットを完成させるまでのプロセスを紹介したいと思う。

ロボットについて

全体像

IMG_1573.JPG IMG_1570.JPG

これがロボットの全体像だ。車体は最もオーソドックスな形で製作した。

構造について

IMG_1579.PNG

ペンを支える部分、私たちの班は安定性と筆圧を確実なものにすることを目的としてペンをタイヤで挟むことにした。モーターでタイヤを回すことでペンの上下運動を可能とした。 後に気づくことになるのだがこのペンを挟むために取り付けたパーツが前に飛び出すぎていることで、車体の重心が前方にずれ不安定なものとなってしまっている。

IMG_1578.PNG IMG_1577.PNG

モーターに取り付ける物をギヤではなくゴムでつなげることにより、スムーズで静かな運動を可能とし、ギヤと違い空回りをしやすいゴムにすることで、ペンを下に下げ続けてもある一定の力以上の筆圧にはならず、斜体が上に持ち上がることを防ぐことができるようにした。2枚目の写真で示されている部分はペンの安定性を向上させるために取り付けた物である。

プログラミングについて

完成図

IMG_1512.JPG

まず始めに完成図を見てもらいたい。以下で説明するプログラムは非常に複雑なものとなっていて文字だけでは理解しにくい点が多々あると思う。そのため是非この完成図と照らしあわせながらプログラムについての説明を読んでもらいたい。似顔絵を完成させるまでの順序は【輪郭→口→鼻→目→髪の毛】だ。

IMG_1600.GIF

これが実際にロボットの描いた順序である。点線部分は空白を表している。

動作の定義づけとプログラム

私はまず定義づけに重きを置いた。 実際は細かい命令を与えていたのだが一連の動作が出来るとその動作を新たな定義とすることで徐々に最終的なプログラムをコンパクトな物へとすることに力を注ぎたかったのだ。 また、定義における動作の名称については楽しみながらプログラムを作成したいと思い、適当な形でつけた。おかげで楽しみながらプログラムの制作にあたれた。以下で一つ一つの定義された動きについて説明したいと思う。  

 #define up OnRev(OUT_B);Wait(10);Off(OUT_B);  //ペンを上げる
 
 #define down OnFwd(OUT_B);Wait(120);Off(OUT_B); //ペンを下ろす

まずはじめに定義したのは最も基本的かつ重要な動作であるペンの上下運動である。 何度もつかうことになるであろう動作だったので定義づけの際【up】【down】と、コンパクトで打ち込みやすい名称として定義した。このプログラムで工夫した点については【down】に注目してもらいたい、モーターを回転させてからのWait(行動持続)が非常に長いことに気づいていただけただろうか、これは上記にあるようにゴムは床についてから空回りするため斜体は持ち上がらない、したがってペンの下げる動作をなるべくじっくり取ることでペンの床への着地を確実なものへとした。

#define left(t) Off(OUT_A); OnFwd(OUT_C); Wait(t); Off(OUT_C); //左回転

#define right(t) Off(OUT_C); OnFwd(OUT_A); Wait(t); Off(OUT_A); //右回転

これは片方のタイヤを静止させて静止してないほうのタイヤを回転させることで回転運動をさせるプログラムだ。もうひとつ両方のタイヤを違う向きに回転させることで旋回運動をさせるプログラムを併用することになるのだが、この回転運動を利用するメリットはどこにあるのかを説明したいと思う。 この回転運動は旋回と比べて描く円の半径が大きくなることはイメージしてもらえるだろうか?円の中心が車体ではなくタイヤに移動することを考えればわかりやすいと思う。この半径が大きくなることにより、後に私が似顔絵を描く際に輪郭として採用した八角形を描く動作において、旋回を利用するよりも動作を非常に少なくコンパクトにまとめることができるのだ。 しかしこの動作にはデメリットがある。それはこの回転運動の角度はタイヤにかかる摩擦力によって左右されているという点である。少しでもこのズレが生じると回転する角度が毎回違うことになってしまうのでこの問題には悩まされた。しかし似顔絵を描く際には微量な差として見ることができたので、幸いにもこの動作を採用することができた。

#define turnleft(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A);Off(OUT_C); //左旋回

#define turnright(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_A);Off(OUT_C); //右旋回

これが先ほど紹介した旋回のプログラム。

#define go(t) OnFwd(OUT_A); OnFwd(OUT_C); Wait(t); Off(OUT_AC); //直進

#define back(t)  OnRev(OUT_A); OnRev(OUT_C); Wait(t); Off(OUT_AC); //後退

これは前進と後退のプログラムだ。上記で示した計8個のプログラムですべての動作は構成されていることになるのだが。以下ではこの8個の動作を組み合わせた複合プログラムの紹介をしたいと思う。

#define rinkaku down;go(40);up;go(50);right(90);back(100);

これが輪郭である正八角形を描く際の基盤となるプログラムだ。 まずペンを【down】で下ろし【go】で直進をする、これで正八角形の1辺が描けたことをイメージしてもらえるだろうか? 次の動作が鍵である。一度【up】でペンを上げてからまた直進をする。そのペンを上げたまま【right】で回転をする。この地点から更に【back】で後退をするとちょうどペン先が描いた正八角形の1辺の端に到着することになる。要するに角度の変更である。この動作を何度も繰り返す状態を想像してもらいたい。最終的には正八角形になるはずだ。 この一連の動作で、回転ではなく旋回を使った場合を考えて頂きたい、旋回にすると回転軸がタイヤではなく車体の中心になってしまう、そうなるとペン先はあまり前方に進むことができずバックをして線を引いたとしても短すぎて八角形を描くことができないのだ。そのためこの動作では回転を採用している。

#define rinkakku go(90);right(87);back(100);

これは上記の【rinkaku】のペンを上げ続けたバージョンのものだ。これと【rinkaku】あわせて使用することで八角形の好きな辺を空欄にすることができる。

#define korekosogarinkaku rinkaku;repeat(3){rinkakku};repeat(3){rinkaku};down;go(40);up;go(50);right(50);back(90);

これがその【rinkaku】と【rinkakku】を繰り返した複合プログラムだ。「repeat」をつかうことでより簡易にしている。(repeatとは同じ動作を繰り返すプログラムだ) 結果としてこの【korekosogarinkaku】を命令するだけでロボットは正八角形を描くことになる。 プログラムとしては八角形の隣接した3つの辺が空欄になることになる。空欄となった3つの辺の部分は頭部ににあたる。(髪の毛を描くため空欄にした)

#define punpunokottazo down;turnright(65);

これは正八角形を描いたあとに口を描くプログラムだ。ただの曲線である。正八角形を書き終えた時点でロボットのペン先は口の左端部分に位置しているためそこから旋回をすることで口を描くことができる。

#define itiouhanadayo go(10);down;go(10);up;

直進して鼻を描くプログラム。次に紹介するプログラムと合わせることで口の真上に鼻を描くことができる。

#define nikonikonikkori go(20);turnleft(10);down;turnleft(15);up;turnright(20);turnright(10);down;turnright(15);up;turnleft(20);up;

#define tuginodousahenojunnbidayo up;turnleft(30);

1つめは目を描くプログラムで鼻を描いたあとに左右に揺れることで直線の目を描けるようにプログラミングをした。口・鼻・目は非常にスムーズに描けていることを確認してもらいたい。 2つめの【tuginodousahenojunnbidayo】は口を描いたあと、鼻を描く動作への準備としてプログラミングをした動きだ。具体的には口を描ききった後に、口の中央までペン先を戻す動作に当たる。その後直進すれば口の真上に鼻が描けるということになる。

#define hagetenaiyo go(50);down;back(35);up;turnleft(5);go(30);down;back(30);up;turnleft(5);\
go(30);down;back(30);up;turnleft(5);go(30);down;back(30);up;\
turnleft(5);go(30);down;back(30);up;turnleft(5);go(30);down;back(30);up;turnleft(5);go(30);down;\
back(30);up;turnleft(5);go(30);down;back(30);up;turnleft(5);go(30);down;back(30);up;turnright(45);go(30)down;back(30);\
up;turnright(5);go(30);down;back(30);up;turnright(5);go(30);down;back(30);up;turnright(5);go(30);down;back(30);up;turnright(5);\
go(30);down;back(30);up;turnright(5);go(30);down;back(30);up;turnright(5);go(30);down;back(30);up;turnright(5);go(30);down;back(30);up;

似顔絵を描く、という動作においてはこれが最後の複合プログラムだ。描くものは髪の毛、目を描いたあとに直進し、輪郭において頭に相当する部分より更に上方まで直進する。ペンの着地点は毛先の部分だ、その後ペンを下ろしバックをすることで髪の毛が一本描けた状態をイメージできると思う。 そして、【ペンを上げる→左に旋回→前方に直進し毛先の地点へ→ペンを下ろす→バック】を何度も繰り返し丁寧に髪の毛を一本ずつ足していく。左側が終わったら同様に右側まで旋回し同じ動作をくりかえす。これで最後の髪の毛を描く動作は終了し、似顔絵は完成したことになる。

#define yorokobinodansu turnleft(60);go(200);turnright(200);turnleft(200)

これが本当に最後のプログラム【yorokobinodansu】だ。始めに断っておくが、ただダンスをするだけだはない。似顔絵を書き終えた時点ではロボットは似顔絵の真上に位置しており。描けた絵を見ることはできない状態にある。したがってこの前方に避けることを目的とした【向きの修正→前進→右旋回→左旋回】の一連の動作を与えることでロボットを手で持ち上げることなく完成した似顔絵を見ることができるようにしたのだ。決して無駄な動作ではない。

最終的なプログラムと全体の流れについて

task main ()
{
korekosogarinkaku;
punpunokottazo;
tuginodousahenojunnbidayo;
itiouhanadayo;
nikonikonikkori;
hagetenaiyo;
yorokobinodansu;
}

これが最終的にロボットに命令することになるプログラムだ。多くの定義付けをしたことで、定義付けの作業は増え大変だったものの、非常にスッキリしているのがお分かりいただけると思う。 まず八角形をうまく描けるようにすることに必死だった。 少しずつ微調整をしてなんとか正八角形を描くプログラムを完成させたら次は正八角形の終着点を利用し、ただ回転するだけで口を描けるようにした。 その後は直進し、左右に旋回をさせることで流れるように鼻と目を描かせ、髪の毛は直進と旋回を繰り返すことで自分なりに特徴のあるものへと完成させることが出来たと思う。

反省、工夫した点、感想

反省点

今回の反省点はロボットの不安定さによって描かれる絵に毎回ずれが生じてしまった点である、何度もプログラムを変更することになったのでこの問題には非常に悩まされた。もう一つはペンの筆圧(摩擦力)の違いを考慮に入れていなかったことである、私たちはシャーペンを利用して模擬テストを行っていたのだが、本番では油性のマジックペンを使用することにしていた、しかしいざ本番でペンを変更するとペンの筆圧の違いによりロボットの直進する距離やカーブの角度に影響を及ぼしてしまったのだ。そこを考慮に入れてプログラムを制作していればより良く精密な絵が描けただろう。

工夫した点

工夫した点は正八角形を採用したこと、書き始める始点を移動するために必要となる車体の向きの変更 や後退などの無駄な動きを無くし、流れるように絵を描けるようにプログラムを制作したこと。そして輪郭や髪の毛などを他の班にはない独特なものにしたいと考え、完成させることが出来た点、無駄な動きは極力なくし流れるように描かせた点である。

感想

時間をかなり必要とする大変な課題だった。 ロボットを作りプログラミングをするのは人生初の経験で、無事終えることが出来るのか非常に心配 だった、最初は不慣れだったものの、最終的にプログラミングにはしっかりとなれることができ、 やっていて苦しいということは無く自分にとって大きな自信へとつながったと思う。 次の課題ではもっと複雑なロボットやプログラミングの製作が出来るように頑張りたい。


添付ファイル: fileIMG_1577.PNG 341件 [詳細] fileIMG_1578.PNG 303件 [詳細] fileIMG_1579.PNG 280件 [詳細] fileIMG_1600.GIF 254件 [詳細] fileIMG_1599.mp4 160件 [詳細] fileIMG_1512.JPG 343件 [詳細] fileIMG_1575 (1).JPG 136件 [詳細] fileIMG_1574 (1).JPG 142件 [詳細] fileIMG_1575.JPG 159件 [詳細] fileIMG_1574.JPG 182件 [詳細] fileIMG_1569.JPG 161件 [詳細] fileIMG_1568.JPG 149件 [詳細] fileIMG_1566.JPG 127件 [詳細] fileIMG_1570.JPG 318件 [詳細] fileIMG_1573.JPG 314件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-06-10 (金) 22:08:30