#author("2019-11-21T13:06:59+09:00","takaki","takaki") #author("2020-01-24T16:26:20+09:00","takaki","takaki") **目次 [#r53d533a] #contents *課題1 [#md26d522] 相方の似顔絵を描くロボットの作成 *ロボットの説明 [#aa666193] 私達は初めに、関節が3つあり、かなり関節の自由度の高いロボットを作成した。しかし、このロボットではx,y座標を垂直に描くことが非常に難しく、プログラムの面で挫折した。そこで、次のようなロボットを作成しなおした。 これが私たちが作ったロボットである。 #ref(2019b/Member/takaki/Mission1/IMG_1989.jpg,100%,ロボット全体) 前のロボットの欠点をふまえ、垂直な線が描けるよう、x,y座標を動かす部分を別にした。 #ref(2019b/Member/takaki/Mission1/IMG_1991.jpg,100%,ロボット前) 特徴として、縦方向には車の部分、横方向にはペンを取り付けたマジックアームが動くようになっている。 #ref(2019b/Member/takaki/Mission1/IMG_1990.jpg,100%,ロボット後) このロボットを作るにあたって、いかにマジックアームが動く土台となる棒がなめらかであるかが問題になった。最初、土台の部分を長めのブロックで作ったが、移動部分が長いために、どうしても継ぎはぎにしなければならなかった。そこで、極力アームが動く部分に継ぎ目が来ないようにした。結果として、継ぎ目が多かった時よりも若干スムーズには動いた。しかし、プログラムで動作を連続で行わないようにするなどの工夫は必要となった。 *プログラムの説明 [#x8aae064] #define A_SPEED 20 #define B_SPEED 17 void pu() { RotateMotor(OUT_C,10,-15); Wait(1000); } void pd() { RotateMotor(OUT_C,10,15); Wait(1000); } void rmot_a(int k) { RotateMotor(OUT_A,A_SPEED,k); Wait(1000); } void rmot_b(int k) { RotateMotor(OUT_B,B_SPEED,k); Wait(1000); } task main() { Wait(1000); rmot_a(80); rmot_b(15); rmot_a(-80); rmot_a(-15); pu(); rmot_b(5); rmot_a(10); pd(); rmot_b(5); pu(); rmot_b(5); pd(); rmot_b(5); pu(); rmot_a(15); rmot_b(-7); pd(); rmot_a(30); rmot_a(5); pu(); } 車の部分と、マジックアームの部分のモータの速さが違ったため、#defineで定義した。 モータAで車、Bでアーム、Cでペンを動かした。 void pu() { RotateMotor(OUT_C,10,-15); Wait(1000); } void pd() { RotateMotor(OUT_C,10,15); Wait(1000); } ペンの上げ下げを関数として定義した。また、 void rmot_a(int k) { RotateMotor(OUT_A,A_SPEED,k); Wait(1000); } void rmot_b(int k) { RotateMotor(OUT_B,B_SPEED,k); Wait(1000); } 車の部分とアームの部分も関数にした。引数kによって、どれだけ回転させるかを決める。また、アームの部分は非常に繊細なので、動作をさせるときは1テンポ置くようにした。 task main() { Wait(1000); rmot_a(80); rmot_b(15); rmot_a(-80); rmot_a(-15); pu(); rmot_b(5); rmot_a(10); pd(); rmot_b(5); pu(); rmot_b(5); pd(); rmot_b(5); pu(); rmot_a(15); rmot_b(-7); pd(); rmot_a(30); rmot_a(5); pu(); } main関数では、定義した関数を用いて、輪郭、目、口を書くようにプログラムした。最初のWait(1000)は、上で書いたようにロボットアームが非常に繊細なため、すぐにロボットが動作しないようワンテンポ置くための時間稼ぎである。 rmot_a(80); rmot_b(15); rmot_a(-80); rmot_a(-15); で輪郭を描く。 pu(); rmot_b(5); rmot_a(10); pd(); rmot_b(5); pu(); rmot_b(5); pd(); rmot_b(5); この部分で目を描く。最初のブロックで目の書き始めの位置に移動して、次のブロックで実際に目を書いている。 pu(); rmot_a(15); rmot_b(-7); pd(); rmot_a(30); rmot_a(5); pu(); 最後の部分で口を描く。main関数全体として、非常に微調整が難しかった。数値が1,-1変わるごとに、挙動が全く違うことがあったため、ロボットを動かしながら調整することになった。 *感想と反省 [#sc4824a3] #ref(2019b/Member/takaki/Mission1/IMG_1992.jpg,100%,ロボット全体) 今回、うまく似顔絵をかくことができなかった。理由としては、マジックアームの不安定さにあると思う。マジックアームのモーターに、ペンをとりつけたモーターという、非常に重いものを移動させるには、トルクが足りないと感じた。また、アームが片方にしかついていないということもあり、非常にバランスが悪かった。マジックアームを作る部分は比較的簡単だったが、プログラムの面で挫折してしまった。今回のロボットから、ハードウェアを作成するうえで、非常に重要なことが分かった気がする。次の課題では、ハードウェアとソフトウェアの関連性や、ロボットに無理をさせないような作りにしたい。