2019b/Member/kzy_k/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019b/Member]]
#contents
*課題2の概要 [#u3a97da7]
-図の赤い線の経路を黒い線にそって動くロボットを作成する。
#ref(2019b/Member/kzy_k/Mission2/2019b-mission2'.png,100%...
-ただし、交差点や丁字路では1秒一時停止する。~
また、I地点にある球をつかみI'地点で離す。
*ロボットの説明 [#y255cad1]
-ロボットの全体像は以下である
#ref(2019b/Member/kzy_k/Mission2/IMG_20191220_172047.jpg,...
#br
#br
-黒い線に沿って行くためには線を検知しなければならないので...
あまり車輪から離れていると、カーブの時などにセンサーが線...
#ref(2019b/Member/kzy_k/Mission2/IMG_20191211_201823.jpg,...
#br
#br
-ボールをつかむ機構はギアでモーターの前後の回転を左右の回...
#ref(2019b/Member/kzy_k/Mission2/gear.png,60%,ギア図)
*プログラムの説明 [#g3d09da0]
**ライントレース [#p0575474]
-今回の課題の主要部分である。~
基本原理として取り付けたセンサーにより得た地面の明るさの...
センサーの値が35以下だと左旋回(左の車輪を前に回転、右の車...
43以下で左折(左の車輪を前に回転、右の車輪は停止)~
57以下で直進~
65以下で右折~
65以上で右旋回~
センサーの値から判断して動くという一連の動作をwhile文でル...
#ref(2019b/Member/kzy_k/Mission2/トレース.png,40%,ライン...
#br
#br
-さらにこれに交差点を認識する機構を組み込む。~
交差点に差し掛かるとセンサーは通常より長い間黒(センサー値...
具体的には、t0という変数にまず現在時刻を記録させる。そし...
そしてwhileのループが成立するために現在の時刻とt0の差があ...
#ref(2019b/Member/kzy_k/Mission2/交差点.png,40%,交差点)
#br
#br
-ただし、急カーブなどは交差点でないがずっと黒であり続ける...
具体的には、ループの外でt_startという変数にCurrentTick()...
#br
#br
-また、ループを強制終了させるという機構を組み込む。上と同...
#br
#br
-以下がこれらをすべてまとめたライントレースのプログラムで...
#define t 50
#define SPEED 30
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void left_line(long t_min,long t_max) {
SetSensorLight(S1);
long t0=CurrentTick();
long t_start=CurrentTick();
while((CurrentTick()-t0<=100||CurrentTick()-t_start<t...
(CurrentTick()-t_start<t_max)){//100以上黒で外れるが...
if(SENSOR_1 < (t-15)){//真っ黒
gf(-SPEED,SPEED);//左旋回
}
else{
t0=CurrentTick();
if(SENSOR_1<(t-7)){ //黒
gf(0,SPEED);//左折
}
else if(SENSOR_1 <(t+7)){ //灰
gf(SPEED,SPEED); //直進
}
else if(SENSOR_1>t+15){ //白
gf(SPEED,0); //右折
}
else{ //真っ白
gf(SPEED,-SPEED); //右旋回
}
} //else
} //while
Off(OUT_BC);
}
これは線の左側をトレースするプログラムであるが、課題を達...
**ボールをつかむ [#ldbcd658]
-ボールをつかむ機構はセンサーを使いボールを認識させて掴む...
+H地点から少し進む~
+ボールをつかむ~
+線をまたぎ、右側をH'の丁字路に差し掛かるまでトレースする...
+回れ右をする~
+ボールを離す~
+少しバックをする~
+回れ左をする~
#br
#ref(2019b/Member/kzy_k/Mission2/ボール掴み.png,100%,ボー...
#br
-以下がプログラムである
#define SPEED 30
#define halfturn_time 3000
#define quarterturn_time 500
#define catch_release_time 1900
#define t_3 1000//バック時間
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void turn_right (long z){//右回転
OnFwd(OUT_C,25);OnFwd(OUT_B,-20);Wait(z);Off(OUT_BC);
}
void turn_left (long w){//左回転
OnFwd(OUT_C,-25);OnFwd(OUT_B,20);Wait(w);Off(OUT_BC);
}
void release (){
OnFwd(OUT_A,30);Wait(catch_release_time);Off(OUT_A);
}
void catch(){
OnFwd(OUT_A,-30);Wait(catch_release_time);Off(OUT_A);
}
void catch_ball()//ボールつかみ
{
gf(SPEED,SPEED);Wait(500);
gf(0,0);catch();//つかむ
gf(20,0);Wait(1000);right_line(3000,100000);//置く向...
turn_right(halfturn_time);//uターン
gf(0,0);release();//はなす
gf(-SPEED,-SPEED);Wait(t_3);//バック
turn_left(quarterturn_time);//少しターン
}
**つなぎのプログラム [#hdf28aee]
-まっすぐ線を渡るプログラムと少し回転して線を渡るプログラ...
#define t_4 800//線を超える時間
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void closs_line1()//線を渡る
{
gf(20,20);Wait(t_4);
}
void closs_line2()//線を渡り向こうへ
{
gf(20,0);Wait(1300);
}
**メインプログラム [#x141ec72]
あとは、上で述べたプログラムを組み合わせて、各時間を調節...
+初めにA地点を出発。~
ここはトレースでなく直線的に1秒進む。
+ここから左側のライントレースをH地点までする。~
ただし、初めのカーブを交差点と認識してしまうのでt_minを...
そしてH地点で1秒間一時停止し、closs_line2()で渡る。
+上で説明したボールをつかむプログラム、catch_ball()を実行。
+H'地点からG'の交差点まで右側のライントレース。
+G'の交差点で一時停止。
+G'をcloss_line1()で渡る。
+E'、F'を右側のライントレースで通過する。~
この時、D'、E'、F'を交差点と認識して止まってしまうがこ...
+G'の交差点で一時停止。
+G'をcloss_line1()で渡る。
+C'まで右側のライントレース。
+左に約90°旋回。
+C'をcloss_line1()で渡る。
+B'まで左側をライントレース。
+A'に入って止まる。
#ref(2019b/Member/kzy_k/Mission2/main.png,100%,メインプロ...
#br
#br
-以下が実際のプログラムである
#define SPEED 30
#define halfturn_time 3000
#define t_5 8000//終盤の四角を行く時間
#define t_6 5000//最後の直線の時間
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void turn_right (long z){//右回転
OnFwd(OUT_C,25);OnFwd(OUT_B,-20);Wait(z);Off(OUT_BC);
}
void turn_left (long w){//左回転
OnFwd(OUT_C,-25);OnFwd(OUT_B,20);Wait(w);Off(OUT_BC);
}
task main(){
gf(SPEED,SPEED);Wait(1000);//a
left_line(t_0,1000000);Wait(1000);closs_line2();//jhi
catch_ball();//ボールつかむ
right_line(0,100000);//h'g'
Wait(1000);//g'
closs_line1();//g'渡る
right_line(t_5,100000);//g'まで止まらずライントレース
Wait(1000);//g'
closs_line1();//g'渡る
right_line(0,100000);//g'c'
turn_left(halfturn_time/2);//c'
closs_line1();//c'渡る
left_line(t_6,10000000);//c'b'
gf(SPEED,SPEED);Wait(1000);gf(0,0);//a'
}
**プログラム全文 [#qe850f7a]
これらをまとめて、コンピュータに入れた全てのプログラムは...
#define t 50
#define SPEED 30
#define halfturn_time 3000
#define quarterturn_time 500
#define catch_release_time 1900
#define t_0 8000//はじめの時間
#define t_1 500//ボールまで行く時間
#define t_2 7000//置く場所の向こうへ行く時間
#define t_3 1000//バック時間
#define t_4 800//線を超える時間
#define t_5 8000//終盤の四角を行く時間
#define t_6 5000//最後の直線の時間
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void turn_right (long z){//右回転
OnFwd(OUT_C,25);OnFwd(OUT_B,-20);Wait(z);Off(OUT_BC);
}
void turn_left (long w){//左回転
OnFwd(OUT_C,-25);OnFwd(OUT_B,20);Wait(w);Off(OUT_BC);
}
void release (){
OnFwd(OUT_A,30);Wait(catch_release_time);Off(OUT_A);
}
void catch(){
OnFwd(OUT_A,-30);Wait(catch_release_time);Off(OUT_A);
}
void left_line(long t_min,long t_max) {
SetSensorLight(S1);
long t0=CurrentTick();
long t_start=CurrentTick();
while((CurrentTick()-t0<=100||CurrentTick()-t_start<...
(CurrentTick()-t_start<t_max)){//100以上黒で外れる...
if(SENSOR_1 < (t-15)){//真っ黒
gf(-SPEED,SPEED);//左旋回
}
else{
t0=CurrentTick();
if(SENSOR_1<(t-7)){ //黒
gf(0,SPEED);//左折
}
else if(SENSOR_1 <(t+7)){ //灰
gf(SPEED,SPEED); //直進
}
else if(SENSOR_1>t+15){ //白
gf(SPEED,0); //右折
}
else{ //真っ白
gf(SPEED,-SPEED); //右旋回
}
} //else
} //while
Off(OUT_BC);
}
void right_line(long t_min,long t_max) {
SetSensorLight(S1);
long t0=CurrentTick();
long t_start=CurrentTick();
while((CurrentTick()-t0<=100||CurrentTick()-t_start<...
(CurrentTick()-t_start<t_max)){
if(SENSOR_1 < (t-15)){//真っ黒
gf(SPEED,-SPEED);//右旋回
}
else{
t0=CurrentTick();
if(SENSOR_1<(t-7)){ //黒
gf(SPEED,0);//右折
}
else if(SENSOR_1 <(t+7)){ //灰
gf(SPEED,SPEED); //直進
}
else if(SENSOR_1>t+15){ //白
gf(0,SPEED); //左折
}
else{ //真っ白
gf(-SPEED,SPEED); //左旋回
}
} //else
} //while
Off(OUT_BC);
}
void catch_ball()//ボールつかみ
{
gf(SPEED,SPEED);Wait(500);
gf(0,0);catch();//つかむ
gf(20,0);Wait(1000);right_line(3000,100000);//置く向...
turn_right(halfturn_time);//uターン
gf(0,0);release();//はなす
gf(-SPEED,-SPEED);Wait(t_3);//バック
turn_left(quarterturn_time);//少しターン
}
void closs_line1()//線を渡る
{
gf(20,20);Wait(t_4);
}
void closs_line2()//線を渡り向こうへ
{
gf(20,0);Wait(1300);
}
task main(){
gf(SPEED,SPEED);Wait(1000);//a
left_line(t_0,1000000);Wait(1000);closs_line2();//jhi
catch_ball();//ボールつかむ
right_line(0,100000);//h'g'
Wait(1000);//g'
closs_line1();//g'渡る
right_line(t_5,100000);//g'まで止まらずライントレース
Wait(1000);//g'
closs_line1();//g'渡る
right_line(0,100000);//g'c'
turn_left(halfturn_time/2);//c'
closs_line1();//c'渡る
left_line(t_6,10000000);//c'b'
gf(SPEED,SPEED);Wait(1000);gf(0,0);//a'
}
//end
*改善点 [#p8f38731]
-ロボット発表会本番に最後まで行けなかった理由として、ライ...
今回は行えなかったが、改良案として考えたものは、通過した...
*感想 [#c7b4dde9]
-今回の課題は基本的にライントレースのプログラムができれば...
細かいこととして交差点で止まるとき少し交差点を曲がろうと...
ライントレースのt_maxで強制終了というのは今回は特に使わな...
終了行:
[[2019b/Member]]
#contents
*課題2の概要 [#u3a97da7]
-図の赤い線の経路を黒い線にそって動くロボットを作成する。
#ref(2019b/Member/kzy_k/Mission2/2019b-mission2'.png,100%...
-ただし、交差点や丁字路では1秒一時停止する。~
また、I地点にある球をつかみI'地点で離す。
*ロボットの説明 [#y255cad1]
-ロボットの全体像は以下である
#ref(2019b/Member/kzy_k/Mission2/IMG_20191220_172047.jpg,...
#br
#br
-黒い線に沿って行くためには線を検知しなければならないので...
あまり車輪から離れていると、カーブの時などにセンサーが線...
#ref(2019b/Member/kzy_k/Mission2/IMG_20191211_201823.jpg,...
#br
#br
-ボールをつかむ機構はギアでモーターの前後の回転を左右の回...
#ref(2019b/Member/kzy_k/Mission2/gear.png,60%,ギア図)
*プログラムの説明 [#g3d09da0]
**ライントレース [#p0575474]
-今回の課題の主要部分である。~
基本原理として取り付けたセンサーにより得た地面の明るさの...
センサーの値が35以下だと左旋回(左の車輪を前に回転、右の車...
43以下で左折(左の車輪を前に回転、右の車輪は停止)~
57以下で直進~
65以下で右折~
65以上で右旋回~
センサーの値から判断して動くという一連の動作をwhile文でル...
#ref(2019b/Member/kzy_k/Mission2/トレース.png,40%,ライン...
#br
#br
-さらにこれに交差点を認識する機構を組み込む。~
交差点に差し掛かるとセンサーは通常より長い間黒(センサー値...
具体的には、t0という変数にまず現在時刻を記録させる。そし...
そしてwhileのループが成立するために現在の時刻とt0の差があ...
#ref(2019b/Member/kzy_k/Mission2/交差点.png,40%,交差点)
#br
#br
-ただし、急カーブなどは交差点でないがずっと黒であり続ける...
具体的には、ループの外でt_startという変数にCurrentTick()...
#br
#br
-また、ループを強制終了させるという機構を組み込む。上と同...
#br
#br
-以下がこれらをすべてまとめたライントレースのプログラムで...
#define t 50
#define SPEED 30
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void left_line(long t_min,long t_max) {
SetSensorLight(S1);
long t0=CurrentTick();
long t_start=CurrentTick();
while((CurrentTick()-t0<=100||CurrentTick()-t_start<t...
(CurrentTick()-t_start<t_max)){//100以上黒で外れるが...
if(SENSOR_1 < (t-15)){//真っ黒
gf(-SPEED,SPEED);//左旋回
}
else{
t0=CurrentTick();
if(SENSOR_1<(t-7)){ //黒
gf(0,SPEED);//左折
}
else if(SENSOR_1 <(t+7)){ //灰
gf(SPEED,SPEED); //直進
}
else if(SENSOR_1>t+15){ //白
gf(SPEED,0); //右折
}
else{ //真っ白
gf(SPEED,-SPEED); //右旋回
}
} //else
} //while
Off(OUT_BC);
}
これは線の左側をトレースするプログラムであるが、課題を達...
**ボールをつかむ [#ldbcd658]
-ボールをつかむ機構はセンサーを使いボールを認識させて掴む...
+H地点から少し進む~
+ボールをつかむ~
+線をまたぎ、右側をH'の丁字路に差し掛かるまでトレースする...
+回れ右をする~
+ボールを離す~
+少しバックをする~
+回れ左をする~
#br
#ref(2019b/Member/kzy_k/Mission2/ボール掴み.png,100%,ボー...
#br
-以下がプログラムである
#define SPEED 30
#define halfturn_time 3000
#define quarterturn_time 500
#define catch_release_time 1900
#define t_3 1000//バック時間
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void turn_right (long z){//右回転
OnFwd(OUT_C,25);OnFwd(OUT_B,-20);Wait(z);Off(OUT_BC);
}
void turn_left (long w){//左回転
OnFwd(OUT_C,-25);OnFwd(OUT_B,20);Wait(w);Off(OUT_BC);
}
void release (){
OnFwd(OUT_A,30);Wait(catch_release_time);Off(OUT_A);
}
void catch(){
OnFwd(OUT_A,-30);Wait(catch_release_time);Off(OUT_A);
}
void catch_ball()//ボールつかみ
{
gf(SPEED,SPEED);Wait(500);
gf(0,0);catch();//つかむ
gf(20,0);Wait(1000);right_line(3000,100000);//置く向...
turn_right(halfturn_time);//uターン
gf(0,0);release();//はなす
gf(-SPEED,-SPEED);Wait(t_3);//バック
turn_left(quarterturn_time);//少しターン
}
**つなぎのプログラム [#hdf28aee]
-まっすぐ線を渡るプログラムと少し回転して線を渡るプログラ...
#define t_4 800//線を超える時間
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void closs_line1()//線を渡る
{
gf(20,20);Wait(t_4);
}
void closs_line2()//線を渡り向こうへ
{
gf(20,0);Wait(1300);
}
**メインプログラム [#x141ec72]
あとは、上で述べたプログラムを組み合わせて、各時間を調節...
+初めにA地点を出発。~
ここはトレースでなく直線的に1秒進む。
+ここから左側のライントレースをH地点までする。~
ただし、初めのカーブを交差点と認識してしまうのでt_minを...
そしてH地点で1秒間一時停止し、closs_line2()で渡る。
+上で説明したボールをつかむプログラム、catch_ball()を実行。
+H'地点からG'の交差点まで右側のライントレース。
+G'の交差点で一時停止。
+G'をcloss_line1()で渡る。
+E'、F'を右側のライントレースで通過する。~
この時、D'、E'、F'を交差点と認識して止まってしまうがこ...
+G'の交差点で一時停止。
+G'をcloss_line1()で渡る。
+C'まで右側のライントレース。
+左に約90°旋回。
+C'をcloss_line1()で渡る。
+B'まで左側をライントレース。
+A'に入って止まる。
#ref(2019b/Member/kzy_k/Mission2/main.png,100%,メインプロ...
#br
#br
-以下が実際のプログラムである
#define SPEED 30
#define halfturn_time 3000
#define t_5 8000//終盤の四角を行く時間
#define t_6 5000//最後の直線の時間
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void turn_right (long z){//右回転
OnFwd(OUT_C,25);OnFwd(OUT_B,-20);Wait(z);Off(OUT_BC);
}
void turn_left (long w){//左回転
OnFwd(OUT_C,-25);OnFwd(OUT_B,20);Wait(w);Off(OUT_BC);
}
task main(){
gf(SPEED,SPEED);Wait(1000);//a
left_line(t_0,1000000);Wait(1000);closs_line2();//jhi
catch_ball();//ボールつかむ
right_line(0,100000);//h'g'
Wait(1000);//g'
closs_line1();//g'渡る
right_line(t_5,100000);//g'まで止まらずライントレース
Wait(1000);//g'
closs_line1();//g'渡る
right_line(0,100000);//g'c'
turn_left(halfturn_time/2);//c'
closs_line1();//c'渡る
left_line(t_6,10000000);//c'b'
gf(SPEED,SPEED);Wait(1000);gf(0,0);//a'
}
**プログラム全文 [#qe850f7a]
これらをまとめて、コンピュータに入れた全てのプログラムは...
#define t 50
#define SPEED 30
#define halfturn_time 3000
#define quarterturn_time 500
#define catch_release_time 1900
#define t_0 8000//はじめの時間
#define t_1 500//ボールまで行く時間
#define t_2 7000//置く場所の向こうへ行く時間
#define t_3 1000//バック時間
#define t_4 800//線を超える時間
#define t_5 8000//終盤の四角を行く時間
#define t_6 5000//最後の直線の時間
void gf (long x,long y){
OnFwd(OUT_C,x);OnFwd(OUT_B,y);
}
void turn_right (long z){//右回転
OnFwd(OUT_C,25);OnFwd(OUT_B,-20);Wait(z);Off(OUT_BC);
}
void turn_left (long w){//左回転
OnFwd(OUT_C,-25);OnFwd(OUT_B,20);Wait(w);Off(OUT_BC);
}
void release (){
OnFwd(OUT_A,30);Wait(catch_release_time);Off(OUT_A);
}
void catch(){
OnFwd(OUT_A,-30);Wait(catch_release_time);Off(OUT_A);
}
void left_line(long t_min,long t_max) {
SetSensorLight(S1);
long t0=CurrentTick();
long t_start=CurrentTick();
while((CurrentTick()-t0<=100||CurrentTick()-t_start<...
(CurrentTick()-t_start<t_max)){//100以上黒で外れる...
if(SENSOR_1 < (t-15)){//真っ黒
gf(-SPEED,SPEED);//左旋回
}
else{
t0=CurrentTick();
if(SENSOR_1<(t-7)){ //黒
gf(0,SPEED);//左折
}
else if(SENSOR_1 <(t+7)){ //灰
gf(SPEED,SPEED); //直進
}
else if(SENSOR_1>t+15){ //白
gf(SPEED,0); //右折
}
else{ //真っ白
gf(SPEED,-SPEED); //右旋回
}
} //else
} //while
Off(OUT_BC);
}
void right_line(long t_min,long t_max) {
SetSensorLight(S1);
long t0=CurrentTick();
long t_start=CurrentTick();
while((CurrentTick()-t0<=100||CurrentTick()-t_start<...
(CurrentTick()-t_start<t_max)){
if(SENSOR_1 < (t-15)){//真っ黒
gf(SPEED,-SPEED);//右旋回
}
else{
t0=CurrentTick();
if(SENSOR_1<(t-7)){ //黒
gf(SPEED,0);//右折
}
else if(SENSOR_1 <(t+7)){ //灰
gf(SPEED,SPEED); //直進
}
else if(SENSOR_1>t+15){ //白
gf(0,SPEED); //左折
}
else{ //真っ白
gf(-SPEED,SPEED); //左旋回
}
} //else
} //while
Off(OUT_BC);
}
void catch_ball()//ボールつかみ
{
gf(SPEED,SPEED);Wait(500);
gf(0,0);catch();//つかむ
gf(20,0);Wait(1000);right_line(3000,100000);//置く向...
turn_right(halfturn_time);//uターン
gf(0,0);release();//はなす
gf(-SPEED,-SPEED);Wait(t_3);//バック
turn_left(quarterturn_time);//少しターン
}
void closs_line1()//線を渡る
{
gf(20,20);Wait(t_4);
}
void closs_line2()//線を渡り向こうへ
{
gf(20,0);Wait(1300);
}
task main(){
gf(SPEED,SPEED);Wait(1000);//a
left_line(t_0,1000000);Wait(1000);closs_line2();//jhi
catch_ball();//ボールつかむ
right_line(0,100000);//h'g'
Wait(1000);//g'
closs_line1();//g'渡る
right_line(t_5,100000);//g'まで止まらずライントレース
Wait(1000);//g'
closs_line1();//g'渡る
right_line(0,100000);//g'c'
turn_left(halfturn_time/2);//c'
closs_line1();//c'渡る
left_line(t_6,10000000);//c'b'
gf(SPEED,SPEED);Wait(1000);gf(0,0);//a'
}
//end
*改善点 [#p8f38731]
-ロボット発表会本番に最後まで行けなかった理由として、ライ...
今回は行えなかったが、改良案として考えたものは、通過した...
*感想 [#c7b4dde9]
-今回の課題は基本的にライントレースのプログラムができれば...
細かいこととして交差点で止まるとき少し交差点を曲がろうと...
ライントレースのt_maxで強制終了というのは今回は特に使わな...
ページ名: