2019b/Member/ameame/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019b/Member]]
#contents
*課題2 ライントレース [#be995a5d]
指定されたコースを走り,コース上のボールをスタート地点に...
コースは[[こちらのページ>2019b/Mission2]]の2人目である.
*成果 [#e5171237]
光センサの値に合わせて比例的にタイヤの速さを変えライント...
*ロボットについて [#x7653024]
#ref(image0.jpeg)
タイヤと本体は講義内で配布されたNXTの説明書に載っているも...
光センサ,超音波センサ,ボールを取るためのアームが写真の...
光センサは周りの明るさの影響を減らすために地面に平行に取...
プログラムに時間を割くためロボットにはあまり時間をかけて...
*ライントレースの仕組み [#eb4d28c1]
黒い線の縁,つまり黒色と白色の境目をトレースしている.線...
*プログラムについて [#jb2d6ae3]
**使用したプログラム [#kfd765f5]
#define TIME1 120 //この時間を超えて黒の部分にいる...
#define TIME2 120 //この時間を超えて白の部分にいる...
#define SPEED 50 //ロボットのベースとなる速さ
#define centor 49 //白と黒の境目の光センサの値
#define distance 12.5 //タイヤ間の距離
#define diameter 5.5 //タイヤの直径
void crossroad(int t)
{
Off(OUT_BC);
Wait(2000);
OnFwd(OUT_BC,65);
Wait(t);
Off(OUT_BC);
}
void change_line(int curve){
while(SENSOR_1>centor-10){
OnRev(OUT_B,60*(-curve/abs(curve)));
OnFwd(OUT_C,60*(-curve/abs(curve)));
}
}
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_1-centor);
int vb=(SPEED-a)/(slowdown/10);
int vc=(SPEED+a)/(slowdown/10);
if(vb>100){vb=100;}
if(vc>100){vc=100;}
if(vb<-100){vb=-100;}
if(vc<-100){vc=-100;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick();
long tb=CurrentTick();
long tw=CurrentTick();
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_1>centor+5 || CurrentTick()-t0<tmin){t...
if(SENSOR_1<centor+5){tw=CurrentTick();}
if(CurrentTick()-tw>TIME2){
while(SENSOR_1>centor-5){
OnRev(OUT_B,60*(CURVE/abs(CURVE)));
OnFwd(OUT_C,60*(CURVE/abs(CURVE)));
tb=CurrentTick();
tw=CurrentTick();
}
}
}
}
void fetch_ball(int CURVE,int SLOWDOWN,long tmax)
{
long t0=CurrentTick();
while(SensorUS(S4)>11 && CurrentTick()-t0<tmax){
follow_line(CURVE,SLOWDOWN);
}
Off(OUT_BC);
RotateMotor(OUT_A,10,130);
t0=CurrentTick();
while(CurrentTick()-t0<800){
follow_line(CURVE,SLOWDOWN);
}
RotateMotorEx(OUT_BC,50,180*distance/diameter,-100,t...
}
task main()
{
SetSensorLight(S1);
SetSensorLowspeed(S4);
//以下はルート...
follow_linePlus(50,10,6000,6000); //1
change_line(-50);
fetch_ball(-50,10,5000); //2
follow_linePlus(-200,20,1800,10000); //3
crossroad(250);
follow_linePlus(-200,20,3000,3000); //4
change_line(50);
follow_linePlus(200,20,4000,6000); //5
crossroad(300);
follow_linePlus(200,20,2000,5000); //6
crossroad(0);
follow_linePlus(200,20,3500,4500); //7
crossroad(700);
}
**ルートの説明 [#o0fc34f8]
#ref(roat.jpeg)
写真のように頻繁にトレースするラインの左右を入れ替えてい...
**関数の説明 [#je09e5ac]
5つの関数を使っている.
***follow_line [#c0841384]
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_1-centor); //光センサの値と...
int vb=(SPEED-a)/(slowdown/10); //モータBの速さ
int vc=(SPEED+a)/(slowdown/10); //モータCの速さ
if(vb>100){vb=100;} //モータの速さを...
if(vc>100){vc=100;}
if(vb<-100){vb=-100;}
if(vc<-100){vc=-100;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
SPEED:ロボットのベースとなる速さ~
光センサの値によって左右のモータの速さをそれぞれ-100〜100...
引数は2種類あり,~
curve:ロボットの曲がりやすさを決める.''値の正負で沿うラ...
slowdown:ロボットを全体的に減速させる
***follow_linePlus [#xc2437e0]
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick(); //総経過時間を計る
long tb=CurrentTick(); //黒の部分にいる時間を計る
long tw=CurrentTick(); //白の部分にいる時間を計る
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_1>centor+5 || CurrentTick()-t0<tmin){t...
if(SENSOR_1<centor+5){tw=CurrentTick();}
if(CurrentTick()-tw>TIME2){ //白...
while(SENSOR_1>centor-5){
OnRev(OUT_B,60*(CURVE/abs(CURVE))); //CU...
OnFwd(OUT_C,60*(CURVE/abs(CURVE)));
tb=CurrentTick();
tw=CurrentTick();
}
}
}
}
ライントレースをする.白の部分にいる時間がTIME2より長くな...
引数は4つあり,前2つはfollow_line内の値を決め,後2つは前...
***change_line [#n0629891]
void change_line(int curve){
while(SENSOR_1>centor-10){
OnRev(OUT_B,60*(-curve/abs(curve)));
OnFwd(OUT_C,60*(-curve/abs(curve)));
}
}
沿うラインの左右を変えるときに使う.センサーがラインの外...
引数は1つあり,左から右に移る時は負の値,右から左の時は正...
***crossroad [#ge9d7b43]
void crossroad(int t)
{
Off(OUT_BC);
Wait(2000);
OnFwd(OUT_BC,65);
Wait(t);
Off(OUT_BC);
}
十字路で2秒一時停止をし,その後t秒前進する.
***fetch_ball [#pe8e540b]
void fetch_ball(int CURVE,int SLOWDOWN,long tmax)
{
long t0=CurrentTick();
while(SensorUS(S4)>11 && CurrentTick()-t0<tmax){
follow_line(CURVE,SLOWDOWN);
}
Off(OUT_BC);
RotateMotor(OUT_A,10,130);
t0=CurrentTick();
while(CurrentTick()-t0<800){
follow_line(CURVE,SLOWDOWN);
}
RotateMotorEx(OUT_BC,50,180*distance/diameter,-100,t...
}
超音波センサがボールを見つけるまでライントレースを行い,...
引数は3つあり,前2つはfollow_lineの値を指定し,もう一つは...
*まとめ [#w9151a3e]
今回の方法では緩やかなカーブをなめらかにすばやく曲がるこ...
終了行:
[[2019b/Member]]
#contents
*課題2 ライントレース [#be995a5d]
指定されたコースを走り,コース上のボールをスタート地点に...
コースは[[こちらのページ>2019b/Mission2]]の2人目である.
*成果 [#e5171237]
光センサの値に合わせて比例的にタイヤの速さを変えライント...
*ロボットについて [#x7653024]
#ref(image0.jpeg)
タイヤと本体は講義内で配布されたNXTの説明書に載っているも...
光センサ,超音波センサ,ボールを取るためのアームが写真の...
光センサは周りの明るさの影響を減らすために地面に平行に取...
プログラムに時間を割くためロボットにはあまり時間をかけて...
*ライントレースの仕組み [#eb4d28c1]
黒い線の縁,つまり黒色と白色の境目をトレースしている.線...
*プログラムについて [#jb2d6ae3]
**使用したプログラム [#kfd765f5]
#define TIME1 120 //この時間を超えて黒の部分にいる...
#define TIME2 120 //この時間を超えて白の部分にいる...
#define SPEED 50 //ロボットのベースとなる速さ
#define centor 49 //白と黒の境目の光センサの値
#define distance 12.5 //タイヤ間の距離
#define diameter 5.5 //タイヤの直径
void crossroad(int t)
{
Off(OUT_BC);
Wait(2000);
OnFwd(OUT_BC,65);
Wait(t);
Off(OUT_BC);
}
void change_line(int curve){
while(SENSOR_1>centor-10){
OnRev(OUT_B,60*(-curve/abs(curve)));
OnFwd(OUT_C,60*(-curve/abs(curve)));
}
}
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_1-centor);
int vb=(SPEED-a)/(slowdown/10);
int vc=(SPEED+a)/(slowdown/10);
if(vb>100){vb=100;}
if(vc>100){vc=100;}
if(vb<-100){vb=-100;}
if(vc<-100){vc=-100;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick();
long tb=CurrentTick();
long tw=CurrentTick();
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_1>centor+5 || CurrentTick()-t0<tmin){t...
if(SENSOR_1<centor+5){tw=CurrentTick();}
if(CurrentTick()-tw>TIME2){
while(SENSOR_1>centor-5){
OnRev(OUT_B,60*(CURVE/abs(CURVE)));
OnFwd(OUT_C,60*(CURVE/abs(CURVE)));
tb=CurrentTick();
tw=CurrentTick();
}
}
}
}
void fetch_ball(int CURVE,int SLOWDOWN,long tmax)
{
long t0=CurrentTick();
while(SensorUS(S4)>11 && CurrentTick()-t0<tmax){
follow_line(CURVE,SLOWDOWN);
}
Off(OUT_BC);
RotateMotor(OUT_A,10,130);
t0=CurrentTick();
while(CurrentTick()-t0<800){
follow_line(CURVE,SLOWDOWN);
}
RotateMotorEx(OUT_BC,50,180*distance/diameter,-100,t...
}
task main()
{
SetSensorLight(S1);
SetSensorLowspeed(S4);
//以下はルート...
follow_linePlus(50,10,6000,6000); //1
change_line(-50);
fetch_ball(-50,10,5000); //2
follow_linePlus(-200,20,1800,10000); //3
crossroad(250);
follow_linePlus(-200,20,3000,3000); //4
change_line(50);
follow_linePlus(200,20,4000,6000); //5
crossroad(300);
follow_linePlus(200,20,2000,5000); //6
crossroad(0);
follow_linePlus(200,20,3500,4500); //7
crossroad(700);
}
**ルートの説明 [#o0fc34f8]
#ref(roat.jpeg)
写真のように頻繁にトレースするラインの左右を入れ替えてい...
**関数の説明 [#je09e5ac]
5つの関数を使っている.
***follow_line [#c0841384]
void follow_line(int curve,int slowdown)
{
int a=(curve/25)*(SENSOR_1-centor); //光センサの値と...
int vb=(SPEED-a)/(slowdown/10); //モータBの速さ
int vc=(SPEED+a)/(slowdown/10); //モータCの速さ
if(vb>100){vb=100;} //モータの速さを...
if(vc>100){vc=100;}
if(vb<-100){vb=-100;}
if(vc<-100){vc=-100;}
OnFwd(OUT_B,vb);
OnFwd(OUT_C,vc);
}
SPEED:ロボットのベースとなる速さ~
光センサの値によって左右のモータの速さをそれぞれ-100〜100...
引数は2種類あり,~
curve:ロボットの曲がりやすさを決める.''値の正負で沿うラ...
slowdown:ロボットを全体的に減速させる
***follow_linePlus [#xc2437e0]
void follow_linePlus(int CURVE,int SLOWDOWN,long tmin,lo...
{
long t0=CurrentTick(); //総経過時間を計る
long tb=CurrentTick(); //黒の部分にいる時間を計る
long tw=CurrentTick(); //白の部分にいる時間を計る
while(CurrentTick()-tb<TIME1 && CurrentTick()-t0<tma...
follow_line(CURVE,SLOWDOWN);
if(SENSOR_1>centor+5 || CurrentTick()-t0<tmin){t...
if(SENSOR_1<centor+5){tw=CurrentTick();}
if(CurrentTick()-tw>TIME2){ //白...
while(SENSOR_1>centor-5){
OnRev(OUT_B,60*(CURVE/abs(CURVE))); //CU...
OnFwd(OUT_C,60*(CURVE/abs(CURVE)));
tb=CurrentTick();
tw=CurrentTick();
}
}
}
}
ライントレースをする.白の部分にいる時間がTIME2より長くな...
引数は4つあり,前2つはfollow_line内の値を決め,後2つは前...
***change_line [#n0629891]
void change_line(int curve){
while(SENSOR_1>centor-10){
OnRev(OUT_B,60*(-curve/abs(curve)));
OnFwd(OUT_C,60*(-curve/abs(curve)));
}
}
沿うラインの左右を変えるときに使う.センサーがラインの外...
引数は1つあり,左から右に移る時は負の値,右から左の時は正...
***crossroad [#ge9d7b43]
void crossroad(int t)
{
Off(OUT_BC);
Wait(2000);
OnFwd(OUT_BC,65);
Wait(t);
Off(OUT_BC);
}
十字路で2秒一時停止をし,その後t秒前進する.
***fetch_ball [#pe8e540b]
void fetch_ball(int CURVE,int SLOWDOWN,long tmax)
{
long t0=CurrentTick();
while(SensorUS(S4)>11 && CurrentTick()-t0<tmax){
follow_line(CURVE,SLOWDOWN);
}
Off(OUT_BC);
RotateMotor(OUT_A,10,130);
t0=CurrentTick();
while(CurrentTick()-t0<800){
follow_line(CURVE,SLOWDOWN);
}
RotateMotorEx(OUT_BC,50,180*distance/diameter,-100,t...
}
超音波センサがボールを見つけるまでライントレースを行い,...
引数は3つあり,前2つはfollow_lineの値を指定し,もう一つは...
*まとめ [#w9151a3e]
今回の方法では緩やかなカーブをなめらかにすばやく曲がるこ...
ページ名: