2018b/Member/yuto/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2018b/Member]]
#contents
*課題3 [#q9913e0e]
**ボール運搬ロボット [#ifa577be]
青と赤のボールを運搬して、それぞれ所定の350㎖缶の上...
**コース [#e372aa9d]
経路図ロボットを動かす。
&ref(2018b-mission3.png);
私たちのグループでは、上の図のように
+Xからスタート
+Gで赤いボールを取る
+Fを通過しEを直進
+Dで缶を探しボールを置く
+ボールを置いたらDに戻る
+Eを右折
+Iを直進して青いボールを取る
+缶を探しボールを置く
という経路でロボットを動かした。
*ロボットの説明 [#l0d0c84d]
**ロボットの全体 [#v01c7fed]
&ref(KIMG0103.jpg);
今回のミッションではNXTの本体が2つ使えたので、NXTの本体...
**アーム [#pe11c5d3]
&ref(KIMG0096_LI.jpg);
アームはモータを回すことで、図のような動きをするようにし...
**その他 [#tefda66a]
ほかの部分は基本的に第2の課題と構造は変わっていない。た...
*プログラミング [#j1d1cde9]
**ボールを持つプログラミング [#m90e211a]
#define UP OnFwd(OUT_B,20);Wait(4750);Off(OUT_BC); //...
#define DOWN OnRev(OUT_B,20);Wait(2600);Off(OUT_BC); //...
#define CATCH OnRev(OUT_C,15);Wait(725);Off(OUT_BC); //...
task main()
{
DOWN
CATCH
UP
}
**ボールを離すプログラミング [#a79d16f7]
#define LOST OnFwd(OUT_C,15);Wait(685);Off(OUT_C); //...
task main()
{ //ボールを持って腕は上がっている状態
LOST
}
**ライントレースのプログラミング [#f633af55]
&ref(IMG_1130.jpg);
プログラミング内容はほとんど変わっていない。今回もこのよ...
#define turn_l1 OnFwd(OUT_B,33);OnRev(OUT_C,33); //左旋回
#define turn_r1 OnFwd(OUT_C,33);OnRev(OUT_B,33); //右旋回
#define turn_l0 OnFwd(OUT_B,30);Off(OUT_C); //左折
#define turn_r0 Off(OUT_B);OnFwd(OUT_C,30); //右折
#define go_s OnFwd(OUT_BC,30); //直進
SetSensorLight(S1); //1番に繋がっている光センサを使う
if(SENSOR_1>58){ //もし光センサが58以上の値を測定したら
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57以下の...
turn_r0; //右折
}else if(SENSOR_1>44){ //もし光センサが44以上52以下の値...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43以下の値...
turn_l0; //左折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
}
交差点も前回と同様である。プログラミングは、
void tuuzyou()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t0; //long型のt0を定義 ...
t0=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t0<90){ //現在の時間とt0の差が0...
ラムを繰り返す
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
t0=CurrentTick(); //t0を更新する ...
}else if(SENSOR_1>53){ //もし光センサが53以上57...
turn_r0; //右折
t0=CurrentTick(); //t0を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t0=CurrentTick(); //t0を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折
t0=CurrentTick(); //t0を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
また、前回同様急カーブがあるので、そのプログラミングは ...
void special()
{
SetSensorLight(S1); //1番に繋がっている光センサを使...
long t1; //long型のt1を定義する ...
t1=CurrentTick() //現在の時間を記録
while(CurrentTick()-t1<23500){ //現在の時間とt1の差が...
ラムを繰り返す
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57...
turn_r0; //右折
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
}
}
**Dの直角を認識するプログラミング [#r9a828f4]
Dの位置でボールを探そうとしていたので、Dの直角で止まらな...
void sirotuuzyou()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t2; //long型のt2を定義 ...
t2=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t2<90){ //現在の時間とt2の差が0.9...
を繰り返す
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57...
turn_r0; //右折
t2=CurrentTick(); //t2を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t2=CurrentTick(); //t2を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折
t2=CurrentTick(); //t2を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
t2=CurrentTick(); //t2を更新する
}
}
}
**缶を探して缶に置くプログラミング [#qa805d09]
***ロボットからの距離が最小のものを探すプログラム [#q71ca...
コンテストではダミーの缶も置けたが、私たちのグループはダ...
まず
#define speed 70
#define speed_s 50
const float diameter=5.54; //タイヤの直径(cm) ...
const float track=10.35; //タイヤのトレッド幅(cm)
const float pi=3.1415; //円周率
と定義する。
void fwdDist(float d)
{
long angle; ...
angle= d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC,speed_s,angle,0,true,true); ...
}
void turnAng(long ang) //角度ang度の時計回りの旋回をする
{
long angle;
angle=track/diameter*ang;
RotateMotorEx(OUT_BC,speed_s,angle,100,true,true);
} ...
int searchDirection(long ang) //現在の方向を中心にang度...
//障害物...
{
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; //仮の最小値
angle=(track/diameter)*ang; //旋回角度からタイヤの回...
turnAng(ang/2); //指定された角度の半分を旋回する
ResetTachoCount(OUT_BC); //角度計測をリセット ...
OnFwdSync(OUT_BC,speed_s,-100); //反時計回りに旋回する
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S4)<d_min){
d_min=SensorUS(S4); //仮の最小値を更新する
tacho_min=MotorTachoCount(OUT_B);
}
} kono ...
OnFwdSyncEx(OUT_BC,speed_s,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S4)...
Wait(14); //微調整
Off(OUT_BC);Wait(500);
return d_min;
}
このプログラムを図にするとこうである。
&ref(IMG_1053.jpg);
***缶の近くに移動する [#t1449ba7]
あらかじめ超音波センサを用いて缶にボールを置くのに適して...
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを使う
int d=searchDirection(360); //int型でdを定義し、ロボッ...
してその最小値を探す
if (d>13.5){ //もし見つけた最小値の距...
fwdDist(d-13.5); //缶とロボットの距離が13.5cmになる...
}
***缶から同じ場所に戻ってくるプログラム [#ff1d5050]
void sagasu()
{
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを使う
int d=searchDirection(360); //int型でdを定義し、ロボ...
測定してその最小値を探す
if (d>13.5){ //もし見つけた最小値...
ら
long t3,t4; //long型のt3,t4を定義する
t3=CurrentTick(); //ロボットが缶に近づく前の時間...
fwdDist(d-13.5); //缶とロボットの距離が13.5cmに...
t4=CurrentTick(); //ロボットが缶に近づいた後の時...
stoop; //親機はボールを置く際に動かないのでモー...
RemoteStartProgram(CONN,"lost.rxe"); //親機が子...
Wait(2000); //子機がボールを置いている時間、親機...
OnRev(OUT_BC,30); //元の位置(直角D)に戻るため...
Wait(t4-t3); //t4-t3の時間後退させる...? ...
}
}
?のt3はロボットが缶に近づく前の時間で、t4はロボットが缶に...
**メインプログラム [#hf156936]
task main()
{
go_s; //Xから赤いボールの方向に直進 ...
Wait(1000); //1秒間直進
stoop; //ボールを掴むためロボットの動きを一旦止める
tukamu(); //赤いボールを掴んで持ち上げる
go_s; //交差点Dを直進
Wait(2000); //2秒間直進
special(); //D-F間の急カーブとFの直角があっても止ま...
tuuzyou(); //F-E間ライントレースをしてEの交差点を認...
massugu(); //Eの交差点は直進 ...
sirotuuzyou(); //Dの直角で終わるプログラム
sagasu(); //缶を探して、缶に近づいて、赤いボールを缶...
戻る
gyakuspe(); //D-E間の走行でEの直角があっても終わらな...
gyakutuuzyou(); //E-I間の走行で、Iの交差点で終わるプ...
go_s; //直進して青いボールを撮れる距離まで移動する
Wait(700); //0.7秒間直進
stoop; //ボールを掴むためロボットの動きを一旦止める
tukamu(); //ボールを掴んで持ち上げる ...
sagasu2(); //缶を探して、缶に近づいて、青いボールを...
}
*まとめと感想 [#s07b5cf7]
今回はロボットの組み立てからやり直したので、とても苦労し...
また、今までのプログラムをいろいろと改良しないといけなか...
終了行:
[[2018b/Member]]
#contents
*課題3 [#q9913e0e]
**ボール運搬ロボット [#ifa577be]
青と赤のボールを運搬して、それぞれ所定の350㎖缶の上...
**コース [#e372aa9d]
経路図ロボットを動かす。
&ref(2018b-mission3.png);
私たちのグループでは、上の図のように
+Xからスタート
+Gで赤いボールを取る
+Fを通過しEを直進
+Dで缶を探しボールを置く
+ボールを置いたらDに戻る
+Eを右折
+Iを直進して青いボールを取る
+缶を探しボールを置く
という経路でロボットを動かした。
*ロボットの説明 [#l0d0c84d]
**ロボットの全体 [#v01c7fed]
&ref(KIMG0103.jpg);
今回のミッションではNXTの本体が2つ使えたので、NXTの本体...
**アーム [#pe11c5d3]
&ref(KIMG0096_LI.jpg);
アームはモータを回すことで、図のような動きをするようにし...
**その他 [#tefda66a]
ほかの部分は基本的に第2の課題と構造は変わっていない。た...
*プログラミング [#j1d1cde9]
**ボールを持つプログラミング [#m90e211a]
#define UP OnFwd(OUT_B,20);Wait(4750);Off(OUT_BC); //...
#define DOWN OnRev(OUT_B,20);Wait(2600);Off(OUT_BC); //...
#define CATCH OnRev(OUT_C,15);Wait(725);Off(OUT_BC); //...
task main()
{
DOWN
CATCH
UP
}
**ボールを離すプログラミング [#a79d16f7]
#define LOST OnFwd(OUT_C,15);Wait(685);Off(OUT_C); //...
task main()
{ //ボールを持って腕は上がっている状態
LOST
}
**ライントレースのプログラミング [#f633af55]
&ref(IMG_1130.jpg);
プログラミング内容はほとんど変わっていない。今回もこのよ...
#define turn_l1 OnFwd(OUT_B,33);OnRev(OUT_C,33); //左旋回
#define turn_r1 OnFwd(OUT_C,33);OnRev(OUT_B,33); //右旋回
#define turn_l0 OnFwd(OUT_B,30);Off(OUT_C); //左折
#define turn_r0 Off(OUT_B);OnFwd(OUT_C,30); //右折
#define go_s OnFwd(OUT_BC,30); //直進
SetSensorLight(S1); //1番に繋がっている光センサを使う
if(SENSOR_1>58){ //もし光センサが58以上の値を測定したら
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57以下の...
turn_r0; //右折
}else if(SENSOR_1>44){ //もし光センサが44以上52以下の値...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43以下の値...
turn_l0; //左折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
}
交差点も前回と同様である。プログラミングは、
void tuuzyou()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t0; //long型のt0を定義 ...
t0=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t0<90){ //現在の時間とt0の差が0...
ラムを繰り返す
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
t0=CurrentTick(); //t0を更新する ...
}else if(SENSOR_1>53){ //もし光センサが53以上57...
turn_r0; //右折
t0=CurrentTick(); //t0を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t0=CurrentTick(); //t0を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折
t0=CurrentTick(); //t0を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
また、前回同様急カーブがあるので、そのプログラミングは ...
void special()
{
SetSensorLight(S1); //1番に繋がっている光センサを使...
long t1; //long型のt1を定義する ...
t1=CurrentTick() //現在の時間を記録
while(CurrentTick()-t1<23500){ //現在の時間とt1の差が...
ラムを繰り返す
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57...
turn_r0; //右折
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進 ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折 ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
}
}
}
**Dの直角を認識するプログラミング [#r9a828f4]
Dの位置でボールを探そうとしていたので、Dの直角で止まらな...
void sirotuuzyou()
{
SetSensorLight(S1); //1番に繋がっている光センサを使う
long t2; //long型のt2を定義 ...
t2=CurrentTick(); //現在の時間を記録
while(CurrentTick()-t2<90){ //現在の時間とt2の差が0.9...
を繰り返す
if(SENSOR_1>58){ //もし光センサが58以上の値を測...
turn_r1; //右旋回
}else if(SENSOR_1>53){ //もし光センサが53以上57...
turn_r0; //右折
t2=CurrentTick(); //t2を更新する
}else if(SENSOR_1>44){ //もし光センサが44以上52...
go_s; //直進
t2=CurrentTick(); //t2を更新する ...
}else if(SENSOR_1>34){ //もし光センサが34以上43...
turn_l0; //左折
t2=CurrentTick(); //t2を更新する ...
}else{ //もし光センサが33以下の値を測定したら
turn_l1; //左旋回
t2=CurrentTick(); //t2を更新する
}
}
}
**缶を探して缶に置くプログラミング [#qa805d09]
***ロボットからの距離が最小のものを探すプログラム [#q71ca...
コンテストではダミーの缶も置けたが、私たちのグループはダ...
まず
#define speed 70
#define speed_s 50
const float diameter=5.54; //タイヤの直径(cm) ...
const float track=10.35; //タイヤのトレッド幅(cm)
const float pi=3.1415; //円周率
と定義する。
void fwdDist(float d)
{
long angle; ...
angle= d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC,speed_s,angle,0,true,true); ...
}
void turnAng(long ang) //角度ang度の時計回りの旋回をする
{
long angle;
angle=track/diameter*ang;
RotateMotorEx(OUT_BC,speed_s,angle,100,true,true);
} ...
int searchDirection(long ang) //現在の方向を中心にang度...
//障害物...
{
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; //仮の最小値
angle=(track/diameter)*ang; //旋回角度からタイヤの回...
turnAng(ang/2); //指定された角度の半分を旋回する
ResetTachoCount(OUT_BC); //角度計測をリセット ...
OnFwdSync(OUT_BC,speed_s,-100); //反時計回りに旋回する
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S4)<d_min){
d_min=SensorUS(S4); //仮の最小値を更新する
tacho_min=MotorTachoCount(OUT_B);
}
} kono ...
OnFwdSyncEx(OUT_BC,speed_s,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S4)...
Wait(14); //微調整
Off(OUT_BC);Wait(500);
return d_min;
}
このプログラムを図にするとこうである。
&ref(IMG_1053.jpg);
***缶の近くに移動する [#t1449ba7]
あらかじめ超音波センサを用いて缶にボールを置くのに適して...
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを使う
int d=searchDirection(360); //int型でdを定義し、ロボッ...
してその最小値を探す
if (d>13.5){ //もし見つけた最小値の距...
fwdDist(d-13.5); //缶とロボットの距離が13.5cmになる...
}
***缶から同じ場所に戻ってくるプログラム [#ff1d5050]
void sagasu()
{
SetSensorLowspeed(S4); //4番に繋いだ超音波センサを使う
int d=searchDirection(360); //int型でdを定義し、ロボ...
測定してその最小値を探す
if (d>13.5){ //もし見つけた最小値...
ら
long t3,t4; //long型のt3,t4を定義する
t3=CurrentTick(); //ロボットが缶に近づく前の時間...
fwdDist(d-13.5); //缶とロボットの距離が13.5cmに...
t4=CurrentTick(); //ロボットが缶に近づいた後の時...
stoop; //親機はボールを置く際に動かないのでモー...
RemoteStartProgram(CONN,"lost.rxe"); //親機が子...
Wait(2000); //子機がボールを置いている時間、親機...
OnRev(OUT_BC,30); //元の位置(直角D)に戻るため...
Wait(t4-t3); //t4-t3の時間後退させる...? ...
}
}
?のt3はロボットが缶に近づく前の時間で、t4はロボットが缶に...
**メインプログラム [#hf156936]
task main()
{
go_s; //Xから赤いボールの方向に直進 ...
Wait(1000); //1秒間直進
stoop; //ボールを掴むためロボットの動きを一旦止める
tukamu(); //赤いボールを掴んで持ち上げる
go_s; //交差点Dを直進
Wait(2000); //2秒間直進
special(); //D-F間の急カーブとFの直角があっても止ま...
tuuzyou(); //F-E間ライントレースをしてEの交差点を認...
massugu(); //Eの交差点は直進 ...
sirotuuzyou(); //Dの直角で終わるプログラム
sagasu(); //缶を探して、缶に近づいて、赤いボールを缶...
戻る
gyakuspe(); //D-E間の走行でEの直角があっても終わらな...
gyakutuuzyou(); //E-I間の走行で、Iの交差点で終わるプ...
go_s; //直進して青いボールを撮れる距離まで移動する
Wait(700); //0.7秒間直進
stoop; //ボールを掴むためロボットの動きを一旦止める
tukamu(); //ボールを掴んで持ち上げる ...
sagasu2(); //缶を探して、缶に近づいて、青いボールを...
}
*まとめと感想 [#s07b5cf7]
今回はロボットの組み立てからやり直したので、とても苦労し...
また、今までのプログラムをいろいろと改良しないといけなか...
ページ名: