2015b/Member/Yoshimasa/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2015b/Member]]
目次
#contents
*課題内容 [#ud861c6a]
・ボールを離れた場所から缶に当てるロボットとボールを回収...
左図が作成するコースです。右図が使用した全体図です。
&ref(./2015b-mission3.png,45%);&ref(./DSC_0107.JPG,14%);
私はボールを回収するロボットを作成しました。
**ルール [#fa588c32]
◦競技時間はロボットAがSTART A地点のスタートラインを...
◦ロボットAはSTART A地点から出発し、P地点におかれた...
◦アルミ缶は中身が入っているものを使う。
◦RISのチームはアルミ缶の上に灯台としてランタンを置...
◦ボールがアルミ缶に当たる前にロボットBがボールに触...
◦ロボットAはセンターラインを超えては行けない。
◦アルミ缶を5cm以上動かした場合は減点
*全体の流れ [#k93320ce]
1:缶の位置を測定
2:通信ができないため相手がボールを缶にあてるまでの時間あ...
3-1:同じ場所からもう一度測定し、距離が近くなっていればそ...
3-2:同じ距離ならボールは缶より奥にあるため缶の真横より後...
4:缶より後ろにいるため測定で一番近いのがボールとなる。そ...
時間が足りず、2つ目を回収するプログラムは無理でした。
*ロボット本体 [#o46d34bd]
**投げるロボット [#o94b83cd]
下の写真が全体像です。説明は同じ班のものを引用します。
リンク:http://yakushi.shinshu-u.ac.jp/robotics/?2015b%2F...
&ref(./DSC_0108.JPG,12%);&ref(./DSC_0109.JPG,12%);&ref(./...
今回使ったモーターは3つ。車輪部分に2つとアームを動かす...
***土台部分 [#p300c8fc]
アーム部分で大量に棒などを固定するためのパーツが必要とな...
***アーム部分 [#ubd644ed]
ボールをつかんだり、投げたりする部分である。制作初期の段...
***光センサー部分 [#n0d77090]
ライントレースのための光センサーはボールを乗せる土台に付...
**回収するロボット [#k945b29b]
***ボールをつかむ [#m0175281]
#ref(./無題1.png,60%)
赤い丸が付いているモータを回すことで、アームが矢印の方向...
***物体を判断する [#o636eeee]
#ref(./無題2.png,35%)
黄色い丸が超音波センサです。これを使うことにより、距離を...
センサが低い位置についている理由は、今回の目標物(ボール)...
***ボールを届ける [#j5469c15]
#ref(./無題3.png,35%)
黄色い丸が光センサです。ボールを回収後ライントレースをし...
*プログラム [#q7d7b321]
#define SPEED 50 //高速度
#define SPEED_SLOW 45 //低速度
#define go(d) RotateMotorEx(OUT_BC,45,d,0,false,true);re...
#define right(d) RotateMotor(OUT_C,45,d);reset; //サ...
#define left(d) RotateMotor(OUT_B,50,d);reset; //サ...
#define reset ResetTachoCount(OUT_BC); //モータの回転...
#define off Off(OUT_BC); //平面移動の停止
#define catch(p) RotateMotor(OUT_A,p,45); //アームの操作
#define go2(p) Off(OUT_BC);OnFwd(OUT_BC,p); //前進
#define right2(p,P) Off(OUT_BC);OnFwd(OUT_C,p);OnFwd(OUT...
#define left2(p,P) Off(OUT_BC);OnFwd(OUT_B,p);OnFwd(OUT_...
#define THE 53 //光センサで使う中間値
#define tmax 115 //交差点判断で使用
const float diameter=5.45; //タイヤの直径[cm]
const float track=10.35; //タイヤのトレッド幅[cm]
const float pi=3.1415; //円周率
・距離d[cm]前進
void fwdDist(float d){
long angle;
angle=d/(diameter*pi)*360.0; //角度計算
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,0,true,true); ...
}
・角度ang度の時計回りの旋回
void turnAng(long ang){
long angle;
angle=track/diameter*ang; //角度計算
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,100,true,true); ...
}
・自身の周囲ang度の範囲を調べ障害物までの距離を返す
int searchDirection(long ang){
long angle,tacho_min=0,tacho_corr;
int d_min=300; //仮の最小値
angle=(track/diameter)*ang; //旋回角度からタイヤの回...
turnAng(ang/2); //指定された角度からの半...
ResetTachoCount(OUT_BC); //角度計測をリセット
OnFwdSync(OUT_BC,SPEED_SLOW,-100); //反時計回りに...
while(MotorTachoCount(OUT_B)<=angle){ //自身の周囲ang...
if(SensorUS(S4)<d_min){ //最小値を更新
d_min=SensorUS(S4);
tacho_min=MotorTachoCount(OUT_B);
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S4)<=d...
Wait(180); //微調整
Off(OUT_BC);Wait(500);
return d_min; //戻り値
}
・以下はメインプログラム
task main(){
SetSensorLowspeed(S4); //超音波センサ
SetSensorLight(S1); //光センサ
go2(50); //前進
Wait(1500);off;
catch(30); //アームを開く
int d=searchDirection(450); //缶の位置を測定
Wait(65000); //通信ができないためプログラムで停止
int d2=searchDirection(450); //距離の変化を調べる
缶かボールかを判断
if(d2<d){ //缶よりボールが近い...
d=d2;
searchDirection(450); //ボールの方向を向く
fwdDist(d-10.0);catch(-70); //近づきボールをつかむ
left(360);go(950); //ライントレースのた...
} else { //缶よりボールが遠い...
reset;
left(400); //缶の左に移動する
Wait(500);
go(700);
Wait(500);
right(450);
go(650);
int d3=searchDirection(450); //缶の横からボールを調...
d=d3;
fwdDist(d-10.0); //ボールに近づく
catch(-70);
left(850);go(100); //ライントレースのため...
}
ライントレース
long t0=0;
t0=CurrentTick(); //時間
while(CurrentTick()-t0<tmax){ //ゴールで交差点判断を...
if(SENSOR_1<THE){ //黒の場合
if(SENSOR_1>35){ //白よりの黒の場合
left2(45,10);
t0=CurrentTick(); //交差点でないため時間(t0)を初...
}
else if(SENSOR_1<35){ //最も黒い場合
left2(35,-40);
}
}
else if(SENSOR_1>THE){ //白の場合
if(SENSOR_1<65){ //黒よりの白の場合
right2(45,10);
t0=CurrentTick();
}
else if(SENSOR_1>65){ //最も白い場合
right2(40,-40);
t0=CurrentTick();
}
else{
go2(50);t0=CurrentTick(); //中間値の場合
}
}
}
right(80); //交差点判断で少し左向きになるため...
}
*工夫点 [#bd270e73]
今回は大きいもの(缶)と小さいもの(ボール)の2種類を判断しな...
私のプログラムは、まず缶より手前にボールがあるかを調べま...
*反省・感想 [#g1d95f0a]
今回は班の人がみんないなくなったため別の班と組むことにな...
異なる機器を使用したため連携がうまくいかないことがありま...
プログラムはテスト期間と重なったためあまり時間が取れなか...
ロボットを他の班のように面白いアイデアで作ることができれ...
本番ではボールを一度もゴールに持って行けませんでした。
原因としては、作成に時間をあまりかけることができなかった...
他の班のように面白いアイデアを思いつくように、もっとゆと...
終了行:
[[2015b/Member]]
目次
#contents
*課題内容 [#ud861c6a]
・ボールを離れた場所から缶に当てるロボットとボールを回収...
左図が作成するコースです。右図が使用した全体図です。
&ref(./2015b-mission3.png,45%);&ref(./DSC_0107.JPG,14%);
私はボールを回収するロボットを作成しました。
**ルール [#fa588c32]
◦競技時間はロボットAがSTART A地点のスタートラインを...
◦ロボットAはSTART A地点から出発し、P地点におかれた...
◦アルミ缶は中身が入っているものを使う。
◦RISのチームはアルミ缶の上に灯台としてランタンを置...
◦ボールがアルミ缶に当たる前にロボットBがボールに触...
◦ロボットAはセンターラインを超えては行けない。
◦アルミ缶を5cm以上動かした場合は減点
*全体の流れ [#k93320ce]
1:缶の位置を測定
2:通信ができないため相手がボールを缶にあてるまでの時間あ...
3-1:同じ場所からもう一度測定し、距離が近くなっていればそ...
3-2:同じ距離ならボールは缶より奥にあるため缶の真横より後...
4:缶より後ろにいるため測定で一番近いのがボールとなる。そ...
時間が足りず、2つ目を回収するプログラムは無理でした。
*ロボット本体 [#o46d34bd]
**投げるロボット [#o94b83cd]
下の写真が全体像です。説明は同じ班のものを引用します。
リンク:http://yakushi.shinshu-u.ac.jp/robotics/?2015b%2F...
&ref(./DSC_0108.JPG,12%);&ref(./DSC_0109.JPG,12%);&ref(./...
今回使ったモーターは3つ。車輪部分に2つとアームを動かす...
***土台部分 [#p300c8fc]
アーム部分で大量に棒などを固定するためのパーツが必要とな...
***アーム部分 [#ubd644ed]
ボールをつかんだり、投げたりする部分である。制作初期の段...
***光センサー部分 [#n0d77090]
ライントレースのための光センサーはボールを乗せる土台に付...
**回収するロボット [#k945b29b]
***ボールをつかむ [#m0175281]
#ref(./無題1.png,60%)
赤い丸が付いているモータを回すことで、アームが矢印の方向...
***物体を判断する [#o636eeee]
#ref(./無題2.png,35%)
黄色い丸が超音波センサです。これを使うことにより、距離を...
センサが低い位置についている理由は、今回の目標物(ボール)...
***ボールを届ける [#j5469c15]
#ref(./無題3.png,35%)
黄色い丸が光センサです。ボールを回収後ライントレースをし...
*プログラム [#q7d7b321]
#define SPEED 50 //高速度
#define SPEED_SLOW 45 //低速度
#define go(d) RotateMotorEx(OUT_BC,45,d,0,false,true);re...
#define right(d) RotateMotor(OUT_C,45,d);reset; //サ...
#define left(d) RotateMotor(OUT_B,50,d);reset; //サ...
#define reset ResetTachoCount(OUT_BC); //モータの回転...
#define off Off(OUT_BC); //平面移動の停止
#define catch(p) RotateMotor(OUT_A,p,45); //アームの操作
#define go2(p) Off(OUT_BC);OnFwd(OUT_BC,p); //前進
#define right2(p,P) Off(OUT_BC);OnFwd(OUT_C,p);OnFwd(OUT...
#define left2(p,P) Off(OUT_BC);OnFwd(OUT_B,p);OnFwd(OUT_...
#define THE 53 //光センサで使う中間値
#define tmax 115 //交差点判断で使用
const float diameter=5.45; //タイヤの直径[cm]
const float track=10.35; //タイヤのトレッド幅[cm]
const float pi=3.1415; //円周率
・距離d[cm]前進
void fwdDist(float d){
long angle;
angle=d/(diameter*pi)*360.0; //角度計算
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,0,true,true); ...
}
・角度ang度の時計回りの旋回
void turnAng(long ang){
long angle;
angle=track/diameter*ang; //角度計算
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,100,true,true); ...
}
・自身の周囲ang度の範囲を調べ障害物までの距離を返す
int searchDirection(long ang){
long angle,tacho_min=0,tacho_corr;
int d_min=300; //仮の最小値
angle=(track/diameter)*ang; //旋回角度からタイヤの回...
turnAng(ang/2); //指定された角度からの半...
ResetTachoCount(OUT_BC); //角度計測をリセット
OnFwdSync(OUT_BC,SPEED_SLOW,-100); //反時計回りに...
while(MotorTachoCount(OUT_B)<=angle){ //自身の周囲ang...
if(SensorUS(S4)<d_min){ //最小値を更新
d_min=SensorUS(S4);
tacho_min=MotorTachoCount(OUT_B);
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min||SensorUS(S4)<=d...
Wait(180); //微調整
Off(OUT_BC);Wait(500);
return d_min; //戻り値
}
・以下はメインプログラム
task main(){
SetSensorLowspeed(S4); //超音波センサ
SetSensorLight(S1); //光センサ
go2(50); //前進
Wait(1500);off;
catch(30); //アームを開く
int d=searchDirection(450); //缶の位置を測定
Wait(65000); //通信ができないためプログラムで停止
int d2=searchDirection(450); //距離の変化を調べる
缶かボールかを判断
if(d2<d){ //缶よりボールが近い...
d=d2;
searchDirection(450); //ボールの方向を向く
fwdDist(d-10.0);catch(-70); //近づきボールをつかむ
left(360);go(950); //ライントレースのた...
} else { //缶よりボールが遠い...
reset;
left(400); //缶の左に移動する
Wait(500);
go(700);
Wait(500);
right(450);
go(650);
int d3=searchDirection(450); //缶の横からボールを調...
d=d3;
fwdDist(d-10.0); //ボールに近づく
catch(-70);
left(850);go(100); //ライントレースのため...
}
ライントレース
long t0=0;
t0=CurrentTick(); //時間
while(CurrentTick()-t0<tmax){ //ゴールで交差点判断を...
if(SENSOR_1<THE){ //黒の場合
if(SENSOR_1>35){ //白よりの黒の場合
left2(45,10);
t0=CurrentTick(); //交差点でないため時間(t0)を初...
}
else if(SENSOR_1<35){ //最も黒い場合
left2(35,-40);
}
}
else if(SENSOR_1>THE){ //白の場合
if(SENSOR_1<65){ //黒よりの白の場合
right2(45,10);
t0=CurrentTick();
}
else if(SENSOR_1>65){ //最も白い場合
right2(40,-40);
t0=CurrentTick();
}
else{
go2(50);t0=CurrentTick(); //中間値の場合
}
}
}
right(80); //交差点判断で少し左向きになるため...
}
*工夫点 [#bd270e73]
今回は大きいもの(缶)と小さいもの(ボール)の2種類を判断しな...
私のプログラムは、まず缶より手前にボールがあるかを調べま...
*反省・感想 [#g1d95f0a]
今回は班の人がみんないなくなったため別の班と組むことにな...
異なる機器を使用したため連携がうまくいかないことがありま...
プログラムはテスト期間と重なったためあまり時間が取れなか...
ロボットを他の班のように面白いアイデアで作ることができれ...
本番ではボールを一度もゴールに持って行けませんでした。
原因としては、作成に時間をあまりかけることができなかった...
他の班のように面白いアイデアを思いつくように、もっとゆと...
ページ名: