2019a/Member/ohta/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
目次
#contents
*課題について [#zbc4d0e4]
**課題内容 [#a8d8a0f8]
ピンポン玉または青と赤のボールを運搬して、所定の容器の中...
詳しいルール等は [[2019a/Mission3]] を参照。~
また課題となるコースは以下。~
箱の中の2つ、地面にある2つの黄色いボールが運搬対象のボー...
#ref(2019a/Member/ohta/Mission3/課題コース.png,課題コース...
**戦略 [#n4aee92c]
今回の課題において、我々はロボットを2台作ることにした。~
一つは地面にある2つの球を担当し、もう一つは箱にある2つの...
ロボットの構造、またどの様に動くかは後述する。~
*ロボットについて [#h66aa068]
私たちの班は2種類のロボットを作った。~
ひとつめは、アームが一本角のように伸びているもの。~
ふたつめは、アームが刺又型になっていているもの。~
その構造的特徴から我々はそれぞれカブトムシ型ロボット、ク...
略してカブトロボ、クワガタロボと名付けた。~
**カブトロボ [#wea32682]
***全体像 [#e274dbcc]
#ref(2019a/Member/ohta/Mission3/クワガタロボ全体.png,カブ...
カブトロボの全体像である。~
右に付いているのが球を取るアーム、車体の端には光センサー...
また背中には持ち上げた球が転がる道が備え付けられている。~
***アームと背中の構造 [#nb093e4d]
#ref(2019a/Member/ohta/Mission3/クワガタアーム.png,カブト...
アームの先にはゴムが計3本が張られている。~
この輪ゴムの柔軟性を利用して、球を取る仕組みである。~
また、背中には左右に壁となるブロックをつけ、アームが上が...
ゴールである箱に落ちるよう、そのルートを強制している。~
***球をキャッチする方法 [#fe44dce4]
球のキャッチする仕組みをもう少し詳しく見てみよう。~
以下の写真は実際の球のキャッチのコマ送りだ。~
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0019.jpg,カブ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0018.jpg,カブ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0017.jpg,カブ...
?ボールの真下に来た時、上に固定されていたアームが勢いよく...
?輪ゴムの柔軟性により、球をすり抜けアームが最下点まで下ろ...
?球をすり抜けた後、ゴムは元の形状に戻るため球は下に落ちな...
キャッチ成功!~
***球をシュートする方法 [#m647fc1b]
キャッチした後、球を箱に入れる仕組みは以下の通りだ。~
(*キャッチからの通し番号になっている)
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0016.jpg,カブ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0015.jpg,カブ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0014.jpg,カブ...
?アームが球を乗せたまま上がる。~
?アームが上がりきると、球が重力に従って転がり落ちる。~
?ロボットの背中をまっすぐ転がり落ち、先にある箱に入る。~
シュート成功!~
**クワガタロボ [#j48e441f]
***全体像 [#ge8a420b]
#ref(2019a/Member/ohta/Mission3/クワガタ全体.png,クワガタ...
クワガタロボの全体像である。~
左に付いているのが箱を挟むアーム、背中にはカブトロボと同...
このロボはライントレースは使わないため、光センサーは付い...
***アームと背中の構造 [#k4d6438f]
#ref(2019a/Member/ohta/Mission3/クワガタアームム.png,クワ...
アーム(グレーの棒)は二又に分かれている。~
目標となる箱は上部が出っ張ている形をしている。~
そのため、箱にこの刺又を差し込めば上に持ち上げても~
箱の上部が引っ掛かり持ち上げられるのだ。~
持ち上げると、白の二又の棒がストッパーとなり中の球だけが...
あとはカブトロボと同じように背中を伝って箱にゴールする。~
***箱を挟み取る方法 [#l46e282d]
それでは詳しく挟み取りを見てみよう。~
以下の写真は挟み取る動作のコマ送りだ。~
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0010.jpg,クワ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0009.jpg,クワ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0008.jpg,クワ...
?箱に刺又を差し込む。~
?奥まで刺しこむとロボットの動作に従い箱は引っ張られる。~
*ただし後ろに動くと箱はその場に置き去りになるので、~
アームを少し上げ箱と地面の接触をなくす必要がある。~
差し込み成功!~
***箱を持ち上げシュートする方法 [#hc5e16c0]
箱を持ち上げ球をシュートする方法は以下の通りだ。~
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0013.jpg,クワ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0012.jpg,クワ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0011.jpg,クワ...
?アームを上げると箱のくびれに引っ掛かり箱は持ち上がる。~
?白い棒の刺又がストッパーとなって箱は落ちず中の球だけ転が...
いわゆるちゃぶ台返しのような形。~
?転がり出た球は背中の通路を伝って箱に落ちる。~
シュート成功!~
*プログラミングについて [#s723a639]
**定義の設定 [#rdfcc3ec]
以下、defineを使用し定義したプログラミングである。~
***値 [#oc2ce9bd]
-ライントレース継続の判断時間~
#define MOVE_TIME 250
-ライントレース時に判断基準となる明度~
詳細は後述~
#define B1 43
#define G 53
#define W1 59
#define W2 61
-モーターの速さ~
モーターの速さをあらかじめ統一しておくことで作業の効率化...
#define SPEED_H 35
#define SPEED_L 20
***動作 [#i6ce8b6a]
-OnRL
この定義はOnRL(x,y)とした時、x=(モーターBの速さ)y=(モータ...
モーターBが右の車輪、モーターCが左の車輪に連携していて、...
車体が前後運動、方向転換を行うことができる。~
この定義により後述する定義等の簡略化に貢献している。~
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
-前後運動~
#define go_straight OnRL(SPEED_H,SPEED_H); //前進
#define BACK OnRL(-SPEED_H,-SPEED_H); //後進
-旋回~
片方の車輪を前転、もう片方が後転することで、急な方向転換...
回転軸は車輪軸の中央。~
#define rot_r OnRL(-SPEED_L,SPEED_L); //右旋回
#define rot_l OnRL(SPEED_L,-SPEED_L); //左旋回
-回転~
片方の車輪を前転、もう片方は停止させることで、緩やかな方...
回転軸は停止車輪の中央。~
#define turn_r OnRL(0,SPEED_L); //右回転
#define turn_l OnRL(SPEED_L,0); //左回転
**サブルーチン関数の設定 [#i12ffb23]
以下、今回使用したsubルーチン関数である。~
***ライントレース [follow_line] [#j80370e9]
この関数は光センサーでコースの線の明度を計測し、~
条件に従って指定された動作をして線上を動いていくものだ。~
以下がその関数である。~
-左側の直線トレース
sub follow_line_l()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<MOVE_TIME){
if(SENSOR_1>W1){
rot_r;t0=CurrentTick();
}
else if(SENSOR_1>W2){
turn_r;t0=CurrentTick();
}
else if(SENSOR_1>G){
go_straight;t0=CurrentTick();
}
else if(SENSOR_1>B1){
turn_l;t0=CurrentTick();
}
else{
rot_l;
}
}
}
-右側の直線トレース
sub follow_line_r()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<MOVE_TIME){
if(SENSOR_1>W1){
rot_l;t0=CurrentTick();
}
else if(SENSOR_1>W2){
turn_l;t0=CurrentTick();
}
else if(SENSOR_1>G){
go_straight;t0=CurrentTick();
}
else if(SENSOR_1>B1){
turn_r;t0=CurrentTick();
}
else{
rot_r;
}
}
}
詳細について述べていく。今回は左側直線トレースを取り上げ...
光センサーがコースの線路の明度を計測。明度ごとに設定され...
明度と命令の設定は以下。~
#ref(2019a/Member/ohta/Mission3/表1.png,50%,ライン)
この表を図化したものが以下である。~
緑→が前進、オレンジ→が回転、青→が旋回を示している。~
#ref(2019a/Member/ohta/Mission3/表2.png,50%,ライン)
「follow_line_l」をフローチャート化すると次のようになる。
#ref(2019a/Member/ohta/Mission3/チャート改.png,65%,チャー...
始めにCurrentTickをt0に(リセット)する。~
次に「CurrentTick()-t0<MOVE_TIME」によってCurrentTick...
MOVE_TIME(250)を超えるまでwhileの中をループし続ける。~
while文の中にはif文、else文で構成されていて、光センサ...
異なるようになっている。光センサーの値が43より大きい...
CurrentTickの値は命令遂行後、常にリセットされ、ループ...
しかし光センサーの値が45以下の時(黒の時)、CurrentTi...
この状態が一定の時間(MOVE_TIME)続くことで、交差点で...
このループから抜け、止まる構造となっている。~
***一時停止 [short_brake] [#k9d9ee68]
ライントレースが交差点と判断し止まったかどうか視覚化する...
sub short_break()
{
Off(OUT_BC);
Wait(1000);
}
***後進 [back] [#kb6e37bf]
long型を使い、backする時間を指定できるようにした。~
sub back(long t)
{
BACK;
Wait(t);
Off(OUT_BC);
}
***球のキャッチ [arm_down] [#hebd3031]
カブトロボが球をキャッチするときに使う関数。~
キャッチの詳細は [[#fe44dce4]] を参照。~
sub arm_down()
{
OnFwd(OUT_A,70); //アームを上げる
Wait(600);
Off(OUT_A);
Wait(500);
OnRev(OUT_A,50); //アームを下げる
Wait(500);
Off(OUT_A);
}
***球のシュート [shoot] [#y4aa30b8]
ロボが球をシュートするときに使う関数。~
シュートの詳細は [[#m647fc1b]] や [[#hc5e16c0]] を参照。~
sub shoot()
{
OnRev(OUT_A,60); //アームを下げる
Wait(700);
Off(OUT_A);
OnFwd(OUT_A,55); //アームを上げる
Wait(500);
Off(OUT_A);
}
**メインプログラム [#ee4940a2]
以上の定義や関数を使い、メインとなるプログラミングを行う。~
以下はコースをどう動くかを表したマップとそのプログラミン...
緑→が前進、赤→が後進を示している。~
***カブトver. [#uc771d5d]
マップを見やすくするための都合上、ゴールの箱に近い球を球A...
球Aを取りシュートするまでのコースA、~
そこから球Bを取りシュートするまでのコースB、~
で分けて紹介する。~
-コースA
#ref(2019a/Member/ohta/Mission3/コース1.png,コース1,50%)
A'地点をスタート後、ライントレースでJ'地点の交差点(マップ...
そこからは、Waitの時間を調節しながら進んでいく。~
詳細をプログラムと同時に説明していこう。~
task main()
{
Off(OUT_A); //車体の動き始めのブレで上げてある...
go_straight; //スタート地点からトレースするライ...
Wait(1000);
Off(OUT_BC);
follow_line_l(); //ライントレース開始(今回は線の左側...
short_break(); //交差点判断後、一旦停止
rot_r; //右旋回で車体を球Aの方向へ向ける
Wait(400);
Off(OUT_BC);
go_straight; //球Aまで前進
Wait(800);
Off(OUT_BC);
arm_down(); //アームを下げ球Aをキャッチ
turn_r; //右回転で車体のお尻をゴールである...
Wait(3500);
Off(OUT_BC);
shoot(); //シュート
-コースB
#ref(2019a/Member/ohta/Mission3/コース2.png,コース2,50%)
球Aをシュートした後、そのまま球Bを取りに行く。~
同様に詳細をプログラムと同時に説明していこう。~
Wait(1000); //(球Aシュート後の続きから)一度...
rot_r; //右旋回し車体を球Bの方へ向ける
Wait(3800);
Off(OUT_BC);
go_straight; //球Bまで前進
Wait(6600);
Off(OUT_BC);
arm_down(); //アームを下げ球Bをキャッチ
back(3000); //球Bを持ったまま後進
OnRL(0,-SPEED_L); //左車輪を後転させ車体のお尻をゴ...
Wait(300);
Off(OUT_BC);
shoot(); //シュート
}
***クワガタver. [#t17493b1]
クワガタロボは箱にある2つの球を一気に運ぶため一度に紹介す...
またこのロボは光センサーを使ったライントレースはしない。~
#ref(2019a/Member/ohta/Mission3/コース3.png,コース3,50%)
カブトロボとは違うA地点をスタート後、球の入った箱を取り、...
以下、詳細をプログラムと同時に説明していこう。~
task main()
{
go_straight; //スタート後、箱の下まで前進
Wait(1000);
Off(OUT_BC);
rot_l; //右旋回し車体を目標の箱の方向へ...
Wait(2800);
Off(OUT_BC);
go_straight; //前進し刺又アームで箱を差し込む
Wait(3000);
Off(OUT_BC);
rot_l; //左旋回し車体をゴールの箱の方向...
Wait(4500);
Off(OUT_BC);
go_straight; //ゴールの箱付近まで前進
Wait(3000);
turn_l; //左回転をし車体のお尻をゴールの...
Wait(8700);
Off(OUT_BC);
Wait(27000); //衝突や接触を避けるためカブトロ...
OnFwd(OUT_A,50); //バックで箱を置き去りにしないよ...
Wait(700);
OnRev(OUT_BC,60); //勢いよく箱に向かってバック←箱の...
Wait(700);
Off(OUT_BC);
shoot(); //バックと同時に箱を持ちあげ球を...
}
*感想 [#q27b2dd6]
**ロボットについて [#j1247e19]
今回、ロボットの制作にあたって構想に多くの時間を費やした。~
ロボットを一台にまとめるか、それとも二台作り分担させるか。~
地面の球はどのように取りどの様に箱に入れるか。~
同様に箱の中の球はどうやって扱うか。~
そもそも何点を目標にするか。~
などなど、課題が難しくその分手法も多く考えられるためかな...
ただ、その十分な構想期間があったからこそ、その後の制作を...
今回の課題では、事前の構想をいかに現実的で詳細にできるか...
**プログラミングについて [#sae6b3ab]
ライントレースなど課題2で使用したプログラムの多くをその...
作業効率をぐんと上げてくれた。~
我々はプログラミング初心者なので自分たちのできる範囲内で...
最善を尽くせたと思う。~
**ロボコンの結果について [#d3103ef1]
私たちの班は結果3位という好成績を残せた。~
最後の最後まで調整をするなど、課外で多くの時間を費やした...
それぞれの得意な部分を生かした分担作業が功を奏したと思う...
**この講義を通して [#kd0bcbb3]
これにてロボティクス入門ゼミは終了となる。~
私にとって、ロボットもプログラミングも全くの未知のもので...
どの課題もかなり難しく失敗や消費する時間は他の人より多か...
しかし、普通に生きていたら恐らく関わることなど一切なかっ...
経験できたことは大きなアドバンテージになると思う。~
将来的に自分の中の持ち駒を増やすことや視野を広げることに...
もちろん今回学んだのはロボット制作やプログラミングの初歩...
関わることのなかった新しいものに興味を持てた点で充実した...
終了行:
[[2019a/Member]]
目次
#contents
*課題について [#zbc4d0e4]
**課題内容 [#a8d8a0f8]
ピンポン玉または青と赤のボールを運搬して、所定の容器の中...
詳しいルール等は [[2019a/Mission3]] を参照。~
また課題となるコースは以下。~
箱の中の2つ、地面にある2つの黄色いボールが運搬対象のボー...
#ref(2019a/Member/ohta/Mission3/課題コース.png,課題コース...
**戦略 [#n4aee92c]
今回の課題において、我々はロボットを2台作ることにした。~
一つは地面にある2つの球を担当し、もう一つは箱にある2つの...
ロボットの構造、またどの様に動くかは後述する。~
*ロボットについて [#h66aa068]
私たちの班は2種類のロボットを作った。~
ひとつめは、アームが一本角のように伸びているもの。~
ふたつめは、アームが刺又型になっていているもの。~
その構造的特徴から我々はそれぞれカブトムシ型ロボット、ク...
略してカブトロボ、クワガタロボと名付けた。~
**カブトロボ [#wea32682]
***全体像 [#e274dbcc]
#ref(2019a/Member/ohta/Mission3/クワガタロボ全体.png,カブ...
カブトロボの全体像である。~
右に付いているのが球を取るアーム、車体の端には光センサー...
また背中には持ち上げた球が転がる道が備え付けられている。~
***アームと背中の構造 [#nb093e4d]
#ref(2019a/Member/ohta/Mission3/クワガタアーム.png,カブト...
アームの先にはゴムが計3本が張られている。~
この輪ゴムの柔軟性を利用して、球を取る仕組みである。~
また、背中には左右に壁となるブロックをつけ、アームが上が...
ゴールである箱に落ちるよう、そのルートを強制している。~
***球をキャッチする方法 [#fe44dce4]
球のキャッチする仕組みをもう少し詳しく見てみよう。~
以下の写真は実際の球のキャッチのコマ送りだ。~
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0019.jpg,カブ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0018.jpg,カブ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0017.jpg,カブ...
?ボールの真下に来た時、上に固定されていたアームが勢いよく...
?輪ゴムの柔軟性により、球をすり抜けアームが最下点まで下ろ...
?球をすり抜けた後、ゴムは元の形状に戻るため球は下に落ちな...
キャッチ成功!~
***球をシュートする方法 [#m647fc1b]
キャッチした後、球を箱に入れる仕組みは以下の通りだ。~
(*キャッチからの通し番号になっている)
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0016.jpg,カブ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0015.jpg,カブ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0014.jpg,カブ...
?アームが球を乗せたまま上がる。~
?アームが上がりきると、球が重力に従って転がり落ちる。~
?ロボットの背中をまっすぐ転がり落ち、先にある箱に入る。~
シュート成功!~
**クワガタロボ [#j48e441f]
***全体像 [#ge8a420b]
#ref(2019a/Member/ohta/Mission3/クワガタ全体.png,クワガタ...
クワガタロボの全体像である。~
左に付いているのが箱を挟むアーム、背中にはカブトロボと同...
このロボはライントレースは使わないため、光センサーは付い...
***アームと背中の構造 [#k4d6438f]
#ref(2019a/Member/ohta/Mission3/クワガタアームム.png,クワ...
アーム(グレーの棒)は二又に分かれている。~
目標となる箱は上部が出っ張ている形をしている。~
そのため、箱にこの刺又を差し込めば上に持ち上げても~
箱の上部が引っ掛かり持ち上げられるのだ。~
持ち上げると、白の二又の棒がストッパーとなり中の球だけが...
あとはカブトロボと同じように背中を伝って箱にゴールする。~
***箱を挟み取る方法 [#l46e282d]
それでは詳しく挟み取りを見てみよう。~
以下の写真は挟み取る動作のコマ送りだ。~
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0010.jpg,クワ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0009.jpg,クワ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0008.jpg,クワ...
?箱に刺又を差し込む。~
?奥まで刺しこむとロボットの動作に従い箱は引っ張られる。~
*ただし後ろに動くと箱はその場に置き去りになるので、~
アームを少し上げ箱と地面の接触をなくす必要がある。~
差し込み成功!~
***箱を持ち上げシュートする方法 [#hc5e16c0]
箱を持ち上げ球をシュートする方法は以下の通りだ。~
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0013.jpg,クワ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0012.jpg,クワ...
#ref(2019a/Member/ohta/Mission3/ロボ_190810_0011.jpg,クワ...
?アームを上げると箱のくびれに引っ掛かり箱は持ち上がる。~
?白い棒の刺又がストッパーとなって箱は落ちず中の球だけ転が...
いわゆるちゃぶ台返しのような形。~
?転がり出た球は背中の通路を伝って箱に落ちる。~
シュート成功!~
*プログラミングについて [#s723a639]
**定義の設定 [#rdfcc3ec]
以下、defineを使用し定義したプログラミングである。~
***値 [#oc2ce9bd]
-ライントレース継続の判断時間~
#define MOVE_TIME 250
-ライントレース時に判断基準となる明度~
詳細は後述~
#define B1 43
#define G 53
#define W1 59
#define W2 61
-モーターの速さ~
モーターの速さをあらかじめ統一しておくことで作業の効率化...
#define SPEED_H 35
#define SPEED_L 20
***動作 [#i6ce8b6a]
-OnRL
この定義はOnRL(x,y)とした時、x=(モーターBの速さ)y=(モータ...
モーターBが右の車輪、モーターCが左の車輪に連携していて、...
車体が前後運動、方向転換を行うことができる。~
この定義により後述する定義等の簡略化に貢献している。~
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
-前後運動~
#define go_straight OnRL(SPEED_H,SPEED_H); //前進
#define BACK OnRL(-SPEED_H,-SPEED_H); //後進
-旋回~
片方の車輪を前転、もう片方が後転することで、急な方向転換...
回転軸は車輪軸の中央。~
#define rot_r OnRL(-SPEED_L,SPEED_L); //右旋回
#define rot_l OnRL(SPEED_L,-SPEED_L); //左旋回
-回転~
片方の車輪を前転、もう片方は停止させることで、緩やかな方...
回転軸は停止車輪の中央。~
#define turn_r OnRL(0,SPEED_L); //右回転
#define turn_l OnRL(SPEED_L,0); //左回転
**サブルーチン関数の設定 [#i12ffb23]
以下、今回使用したsubルーチン関数である。~
***ライントレース [follow_line] [#j80370e9]
この関数は光センサーでコースの線の明度を計測し、~
条件に従って指定された動作をして線上を動いていくものだ。~
以下がその関数である。~
-左側の直線トレース
sub follow_line_l()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<MOVE_TIME){
if(SENSOR_1>W1){
rot_r;t0=CurrentTick();
}
else if(SENSOR_1>W2){
turn_r;t0=CurrentTick();
}
else if(SENSOR_1>G){
go_straight;t0=CurrentTick();
}
else if(SENSOR_1>B1){
turn_l;t0=CurrentTick();
}
else{
rot_l;
}
}
}
-右側の直線トレース
sub follow_line_r()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<MOVE_TIME){
if(SENSOR_1>W1){
rot_l;t0=CurrentTick();
}
else if(SENSOR_1>W2){
turn_l;t0=CurrentTick();
}
else if(SENSOR_1>G){
go_straight;t0=CurrentTick();
}
else if(SENSOR_1>B1){
turn_r;t0=CurrentTick();
}
else{
rot_r;
}
}
}
詳細について述べていく。今回は左側直線トレースを取り上げ...
光センサーがコースの線路の明度を計測。明度ごとに設定され...
明度と命令の設定は以下。~
#ref(2019a/Member/ohta/Mission3/表1.png,50%,ライン)
この表を図化したものが以下である。~
緑→が前進、オレンジ→が回転、青→が旋回を示している。~
#ref(2019a/Member/ohta/Mission3/表2.png,50%,ライン)
「follow_line_l」をフローチャート化すると次のようになる。
#ref(2019a/Member/ohta/Mission3/チャート改.png,65%,チャー...
始めにCurrentTickをt0に(リセット)する。~
次に「CurrentTick()-t0<MOVE_TIME」によってCurrentTick...
MOVE_TIME(250)を超えるまでwhileの中をループし続ける。~
while文の中にはif文、else文で構成されていて、光センサ...
異なるようになっている。光センサーの値が43より大きい...
CurrentTickの値は命令遂行後、常にリセットされ、ループ...
しかし光センサーの値が45以下の時(黒の時)、CurrentTi...
この状態が一定の時間(MOVE_TIME)続くことで、交差点で...
このループから抜け、止まる構造となっている。~
***一時停止 [short_brake] [#k9d9ee68]
ライントレースが交差点と判断し止まったかどうか視覚化する...
sub short_break()
{
Off(OUT_BC);
Wait(1000);
}
***後進 [back] [#kb6e37bf]
long型を使い、backする時間を指定できるようにした。~
sub back(long t)
{
BACK;
Wait(t);
Off(OUT_BC);
}
***球のキャッチ [arm_down] [#hebd3031]
カブトロボが球をキャッチするときに使う関数。~
キャッチの詳細は [[#fe44dce4]] を参照。~
sub arm_down()
{
OnFwd(OUT_A,70); //アームを上げる
Wait(600);
Off(OUT_A);
Wait(500);
OnRev(OUT_A,50); //アームを下げる
Wait(500);
Off(OUT_A);
}
***球のシュート [shoot] [#y4aa30b8]
ロボが球をシュートするときに使う関数。~
シュートの詳細は [[#m647fc1b]] や [[#hc5e16c0]] を参照。~
sub shoot()
{
OnRev(OUT_A,60); //アームを下げる
Wait(700);
Off(OUT_A);
OnFwd(OUT_A,55); //アームを上げる
Wait(500);
Off(OUT_A);
}
**メインプログラム [#ee4940a2]
以上の定義や関数を使い、メインとなるプログラミングを行う。~
以下はコースをどう動くかを表したマップとそのプログラミン...
緑→が前進、赤→が後進を示している。~
***カブトver. [#uc771d5d]
マップを見やすくするための都合上、ゴールの箱に近い球を球A...
球Aを取りシュートするまでのコースA、~
そこから球Bを取りシュートするまでのコースB、~
で分けて紹介する。~
-コースA
#ref(2019a/Member/ohta/Mission3/コース1.png,コース1,50%)
A'地点をスタート後、ライントレースでJ'地点の交差点(マップ...
そこからは、Waitの時間を調節しながら進んでいく。~
詳細をプログラムと同時に説明していこう。~
task main()
{
Off(OUT_A); //車体の動き始めのブレで上げてある...
go_straight; //スタート地点からトレースするライ...
Wait(1000);
Off(OUT_BC);
follow_line_l(); //ライントレース開始(今回は線の左側...
short_break(); //交差点判断後、一旦停止
rot_r; //右旋回で車体を球Aの方向へ向ける
Wait(400);
Off(OUT_BC);
go_straight; //球Aまで前進
Wait(800);
Off(OUT_BC);
arm_down(); //アームを下げ球Aをキャッチ
turn_r; //右回転で車体のお尻をゴールである...
Wait(3500);
Off(OUT_BC);
shoot(); //シュート
-コースB
#ref(2019a/Member/ohta/Mission3/コース2.png,コース2,50%)
球Aをシュートした後、そのまま球Bを取りに行く。~
同様に詳細をプログラムと同時に説明していこう。~
Wait(1000); //(球Aシュート後の続きから)一度...
rot_r; //右旋回し車体を球Bの方へ向ける
Wait(3800);
Off(OUT_BC);
go_straight; //球Bまで前進
Wait(6600);
Off(OUT_BC);
arm_down(); //アームを下げ球Bをキャッチ
back(3000); //球Bを持ったまま後進
OnRL(0,-SPEED_L); //左車輪を後転させ車体のお尻をゴ...
Wait(300);
Off(OUT_BC);
shoot(); //シュート
}
***クワガタver. [#t17493b1]
クワガタロボは箱にある2つの球を一気に運ぶため一度に紹介す...
またこのロボは光センサーを使ったライントレースはしない。~
#ref(2019a/Member/ohta/Mission3/コース3.png,コース3,50%)
カブトロボとは違うA地点をスタート後、球の入った箱を取り、...
以下、詳細をプログラムと同時に説明していこう。~
task main()
{
go_straight; //スタート後、箱の下まで前進
Wait(1000);
Off(OUT_BC);
rot_l; //右旋回し車体を目標の箱の方向へ...
Wait(2800);
Off(OUT_BC);
go_straight; //前進し刺又アームで箱を差し込む
Wait(3000);
Off(OUT_BC);
rot_l; //左旋回し車体をゴールの箱の方向...
Wait(4500);
Off(OUT_BC);
go_straight; //ゴールの箱付近まで前進
Wait(3000);
turn_l; //左回転をし車体のお尻をゴールの...
Wait(8700);
Off(OUT_BC);
Wait(27000); //衝突や接触を避けるためカブトロ...
OnFwd(OUT_A,50); //バックで箱を置き去りにしないよ...
Wait(700);
OnRev(OUT_BC,60); //勢いよく箱に向かってバック←箱の...
Wait(700);
Off(OUT_BC);
shoot(); //バックと同時に箱を持ちあげ球を...
}
*感想 [#q27b2dd6]
**ロボットについて [#j1247e19]
今回、ロボットの制作にあたって構想に多くの時間を費やした。~
ロボットを一台にまとめるか、それとも二台作り分担させるか。~
地面の球はどのように取りどの様に箱に入れるか。~
同様に箱の中の球はどうやって扱うか。~
そもそも何点を目標にするか。~
などなど、課題が難しくその分手法も多く考えられるためかな...
ただ、その十分な構想期間があったからこそ、その後の制作を...
今回の課題では、事前の構想をいかに現実的で詳細にできるか...
**プログラミングについて [#sae6b3ab]
ライントレースなど課題2で使用したプログラムの多くをその...
作業効率をぐんと上げてくれた。~
我々はプログラミング初心者なので自分たちのできる範囲内で...
最善を尽くせたと思う。~
**ロボコンの結果について [#d3103ef1]
私たちの班は結果3位という好成績を残せた。~
最後の最後まで調整をするなど、課外で多くの時間を費やした...
それぞれの得意な部分を生かした分担作業が功を奏したと思う...
**この講義を通して [#kd0bcbb3]
これにてロボティクス入門ゼミは終了となる。~
私にとって、ロボットもプログラミングも全くの未知のもので...
どの課題もかなり難しく失敗や消費する時間は他の人より多か...
しかし、普通に生きていたら恐らく関わることなど一切なかっ...
経験できたことは大きなアドバンテージになると思う。~
将来的に自分の中の持ち駒を増やすことや視野を広げることに...
もちろん今回学んだのはロボット制作やプログラミングの初歩...
関わることのなかった新しいものに興味を持てた点で充実した...
ページ名: