2019b/Member/numanum/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*課題 [#id882bf4]
空き缶に乗ったボールを運搬し、ゴール地点にある別の空き缶...
**詳細 [#g5b4a6ef]
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&...
コースは課題2で作ったものをそのまま使用し、発表会にて得点...
*ロボットの説明 [#ca8d98e9]
ボールを空き缶と共に運ぶロボットと、そのボールを受け取り...
**1台目 [#x887ada8]
#ref(IMG_71255.JPG,left)
このロボットがボールの乗った空き缶全てを一度に運搬し、コ...
構造は単純で、本体前方の長いアームで缶を縦に3つ並べること...
このアームは右側のみが可変で、左側は動かない。空き缶を最...
またアームの長さがD-E間より長くなっているため、D点で片側...
**2台目 [#c5669490]
#ref(IMG_71277.JPG)
このロボットがボールを受け取りゴールまで運搬する。1台目よ...
***受け取る機構 [#b054119a]
ボールを受け取るために超音波センサーと光センサーを使用す...
上記のセンサーで缶の位置をおおよそ把握し、本体上部につい...
#ref(IMG_71244.JPG)
***ゴールに置く機構 [#bdd6d56a]
ゴールの空き缶にボールを置く機構は完成したが、離れた位置...
#ref(IMG_71266.JPG)
この機構は空き缶を押した時に効果を発揮し、缶を押したとき...
ライントレースの黒い部分よりも明るさがはっきり低くなるよ...
#ref(IMG_7128 (2).JPG)
缶によって押される部分は3回作動しなければ意味が無く、奥ま...
ブロックを元の位置に戻すためのおもりを取り付け、押される...
*プログラムの説明 [#m7011c9a]
**マスター側(1台目) [#x11a7b74]
***ライントレース [#b21b474e]
#define BLACK 30
#define THRESHOLD 43
#define WHITE_GRAY 51
#define WHITE 57
#define SPEED 20
#define go_forward OnFwdSync(OUT_BC,SPEED,0);
#define curve_left Off(OUT_C); OnFwd(OUT_B,SPEED);
#define curve_right Off(OUT_B); OnFwd(OUT_C,SPEED);
#define turn_left OnFwdSync(OUT_BC,SPEED,-100);
#define turn_right OnFwdSync(OUT_BC,SPEED,100);
まずはライントレースのために明るさの値と使われる動作を定...
明るさはできるだけ厳しく調整しないとトレースによるアーム...
void line_followleft()
{
SetSensorLight(S4);
long t0=CurrentTick();
while(CurrentTick()-t0<150){ //最後の更新からの...
if(SENSOR_4<BLACK){
turn_left; //黒線上で左回転する
}else{
if(SENSOR_4>WHITE){
turn_right; //白いところで右回...
}else if(SENSOR_4>WHITE_GRAY){
curve_right; //白寄りの境界で右...
}else if(SENSOR_4>THRESHOLD-5){
go_forward; //境界線上で直進する
}else{
curve_left; //他の値を取れば左...
}
t0=CurrentTick(); //黒以外のときはt0...
}
}
Off(OUT_BC);
Wait(1000);
turn_right;
Wait(300);
Off(OUT_BC); //交差点を見つけた...
Wait(500);
}
これは黒線の左側の境界線上をトレースし、交差点を見つけた...
***メイン [#y76f932b]
float GetAngle(float d) //旋回したい角度を...
{
const float diameter = 5.45;
const float length = 12.0;
float ang = d*length*2/diameter;
return ang;
}
先に、片方のタイヤを軸にして回転する際のタイヤの回転角を...
#define CONN 1
#define SIGNALON 11
#define few_go(t) OnFwdSync(OUT_BC,SPEED,0); Wait(t); Of...
#define raise_hand OnRev(OUT_A,SPEED); Wait(450); Off(OU...
#define hold_can OnFwd(OUT_A,SPEED); Wait(400); Off(OUT_...
#define back(t) OnRev(OUT_BC,SPEED); Wait(t); Off(OUT_BC);
こちらはマスター側なのでスレーブの接続番号は1。~
few_go(t)は交差点を越えるための動作である。使用する場所に...
task main()
{
int angle = GetAngle(90.0);
int msg;
raise_hand; //右側のアームを上...
line_followleft();
RotateMotor(OUT_C,SPEED,angle); //ライントレースし...
hold_can; //缶を固定するため...
line_followleft();
few_go(800); //G点の交差点を越...
line_followleft();
RotateMotor(OUT_B,SPEED,angle); //H点で左に90度旋...
back(1000); //位置調整
raise_hand;
back(5000);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON);
//缶を離した後にス...
}
こちらの動作は主にライントレースを行うのみとなっている。~
H点で旋回した後はライン上に缶が3つ並んだ状態となる。
**スレーブ側(2台目) [#c683a3c3]
***ライントレース [#k939c9f2]
#define BLACK 34
#define THRESHOLD 43
#define WHITE_GRAY 48
#define WHITE 53
#define SPEED 30
#define go_forward OnFwdSync(OUT_BC,SPEED,0);
#define curve_left Off(OUT_C); OnFwd(OUT_B,SPEED);
#define curve_right Off(OUT_B); OnFwd(OUT_C,SPEED);
#define turn_left OnFwdSync(OUT_BC,SPEED,-100);
#define turn_right OnFwdSync(OUT_BC,SPEED,100);
まずはマスターと同じように定義する。
void line_followleft()
{
long t0=CurrentTick();
while(CurrentTick()-t0<160){ //交差点を判別す...
if(SENSOR_2<BLACK){
turn_left;
}else{
if(SENSOR_2>WHITE){
turn_right;
}else if(SENSOR_2>WHITE_GRAY){
curve_right;
}else if(SENSOR_2>THRESHOLD-3){
go_forward;
}else{
curve_left;
}
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
turn_right;
Wait(200);
Off(OUT_BC);
Wait(500);
}
左の境界線上のライントレースはマスター側とほとんど同じで...
トレースするラインがマスターと違うため、交差点の判別に必...
void line_followright()
{
long t0=CurrentTick();
while(CurrentTick()-t0<200){ //最後の更新か...
if(SENSOR_2<BLACK){
turn_right; //黒線上で右回...
}else{
if(SENSOR_2>WHITE){
turn_left; //白いところで...
}else if(SENSOR_2>WHITE_GRAY){
curve_left; //白寄りの境界...
}else if(SENSOR_2>THRESHOLD-5){
go_forward; //境界線上で直...
}else{
curve_right; //他の値を取れ...
}
t0=CurrentTick(); //黒以外のとき...
}
}
Off(OUT_BC);
Wait(1000);
turn_left;
Wait(200);
Off(OUT_BC); //交差点を見つ...
Wait(500);
}
右のライントレースは左のものと全く逆の動作を入れてある。
***旋回・回転の角度 [#bce47146]
const float diameter = 5.45;
const float length = 12.0;
計算式を2つ使用するので、同一の値は外に出しておく。
float GetAngle1(float d) //回転したい角度を未...
{
float ang = d*length*2/diameter;
return ang;
}
1つ目はその場で回転する際のタイヤの回転角を算出するもの...
float GetAngle2(float k) //旋回したい角度を未...
{
float ang = length*k/diameter;
return ang;
}
2つ目は片方のタイヤを軸にして旋回する際のタイヤの回転角...
***ボールを受け取る [#dcd5756d]
void fetch_ball()
{
int angle = GetAngle1(60.0);
repeat(3){
while(SensorUS(S3)>7){ //超音波センサ...
if(SENSOR_2<BLACK){
turn_left;
}else if(SENSOR_2>WHITE){
turn_right;
}else if(SENSOR_2>WHITE_GRAY){
curve_right;
}else if(SENSOR_2>THRESHOLD-5){
go_forward;
}else{
curve_left;
}
} //左の境界をラ...
Off(OUT_BC);
OnFwd(OUT_BC,SPEED);
Wait(600);
Off(OUT_BC); //超音波センサ...
RotateMotor(OUT_A,SPEED,92.0); //プロペラを約...
RotateMotor(OUT_B,SPEED,-angle); //もうボールが...
RotateMotor(OUT_B,SPEED,angle); //方向を戻す
} //以上を3回繰...
}
ボールを受け取る動作には超音波センサーと光センサーを使用...
***ボールを置く [#h5a7b578]
void put_ball()
{
long t0=CurrentTick();
long t_start,t_last;
t_start = CurrentTick();
while(SENSOR_2>21&&CurrentTick()-t0<5000){ //光...
OnFwdSync(OUT_BC,20,0); //前...
}
Off(OUT_BC); //光...
t_last = CurrentTick()-t_start; //前...
RotateMotor(OUT_A,SPEED,90.0); //プ...
OnRevSync(OUT_BC,20,0);
Wait(t_last);
Off(OUT_BC); //先...
}
まず、これは未完成である。
このプログラムはロボットの説明で紹介したギミックを使用し...
缶によってギミックが押されるまで前進し、ボールを置いて同...
whileの条件によって、缶を見つけなくても5秒以上経つとボー...
***ゴールの缶を探す [#z2f4cc1b]
この動作については先生に配られた紙に書いてあるものを参考...
#define SPEED_SLOW 20
void turnAng(long ang)
{
long angle;
angle = length/diameter*ang;
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,100,true,true);
}
これは指定した角度まで回転するというもの。
int searchDirection(long ang)
{
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; //仮の最...
angle = (length/diameter)*ang;
turnAng(ang/2); //指定さ...
ResetTachoCount(OUT_BC); //角度の...
OnFwdSync(OUT_BC,SPEED_SLOW,-100);
while(MotorTachoCount(OUT_B)<=angle){ //回転角...
if(SensorUS(S3)<d_min&&SensorUS(S3)>10){
d_min=SensorUS(S3); //仮の最...
tacho_min=MotorTachoCount(OUT_B); //またそ...
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min); //記録さ...
Wait(14); //微調整
Off(OUT_BC);
Wait(500);
return d_min;
}
これもうまく作動しなかった。~
このプログラムは最も近くにある缶の方向を見つけるというも...
仮の最小値を更新する条件に「10cmより大きい」というものが...
またこの動作はH点で使用するので、缶との最小距離が10cmを下...
***メイン [#ce02884d]
#define SIGNALON 11
#define few_go(t) OnFwdSync(OUT_BC,SPEED,0); Wait(t); Of...
#define back(t) OnRev(OUT_BC,SPEED); Wait(t); Off(OUT_BC);
タスクメインで使用する他の動作を定義する。
task main()
{
int msg;
int angle1 = GetAngle1(60.0);
int angle2 = GetAngle2(90.0);
int angle3 = GetAngle1(90.0); //使用す...
SetSensorLight(S2);
SetSensorLowspeed(S3); //センサ...
line_followleft();
back(1200); //ライン...
RotateMotor(OUT_C,SPEED,angle3); //旋回し...
few_go(600);
while(msg != SIGNALON){ //マスタ...
ReceiveRemoteNumber(MAILBOX1,false,msg);
}
fetch_ball();
RotateMotorEx(OUT_BC,SPEED,angle2,-100,true,true); ...
line_followright(); ...
few_go(700);
RotateMotorEx(OUT_BC,SPEED,angle2,100,true,true);
back(700); ...
repeat(2){
searchDirection(100);
Wait(1000);
put_ball();
}
}
repeatの中がうまく作動しなかった。~
最初の左側ライントレースをした後に後ろに下がると入力して...
このプログラムでは本体がライントレース後G点で停止するため...
*まとめ・反省 [#yd936244]
今回はロボット製作とプログラム作成のどちらにも非常に時間...
また以前の課題と変わらず、ロボットが大きくなってしまった...
終了行:
#contents
*課題 [#id882bf4]
空き缶に乗ったボールを運搬し、ゴール地点にある別の空き缶...
**詳細 [#g5b4a6ef]
#ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&...
コースは課題2で作ったものをそのまま使用し、発表会にて得点...
*ロボットの説明 [#ca8d98e9]
ボールを空き缶と共に運ぶロボットと、そのボールを受け取り...
**1台目 [#x887ada8]
#ref(IMG_71255.JPG,left)
このロボットがボールの乗った空き缶全てを一度に運搬し、コ...
構造は単純で、本体前方の長いアームで缶を縦に3つ並べること...
このアームは右側のみが可変で、左側は動かない。空き缶を最...
またアームの長さがD-E間より長くなっているため、D点で片側...
**2台目 [#c5669490]
#ref(IMG_71277.JPG)
このロボットがボールを受け取りゴールまで運搬する。1台目よ...
***受け取る機構 [#b054119a]
ボールを受け取るために超音波センサーと光センサーを使用す...
上記のセンサーで缶の位置をおおよそ把握し、本体上部につい...
#ref(IMG_71244.JPG)
***ゴールに置く機構 [#bdd6d56a]
ゴールの空き缶にボールを置く機構は完成したが、離れた位置...
#ref(IMG_71266.JPG)
この機構は空き缶を押した時に効果を発揮し、缶を押したとき...
ライントレースの黒い部分よりも明るさがはっきり低くなるよ...
#ref(IMG_7128 (2).JPG)
缶によって押される部分は3回作動しなければ意味が無く、奥ま...
ブロックを元の位置に戻すためのおもりを取り付け、押される...
*プログラムの説明 [#m7011c9a]
**マスター側(1台目) [#x11a7b74]
***ライントレース [#b21b474e]
#define BLACK 30
#define THRESHOLD 43
#define WHITE_GRAY 51
#define WHITE 57
#define SPEED 20
#define go_forward OnFwdSync(OUT_BC,SPEED,0);
#define curve_left Off(OUT_C); OnFwd(OUT_B,SPEED);
#define curve_right Off(OUT_B); OnFwd(OUT_C,SPEED);
#define turn_left OnFwdSync(OUT_BC,SPEED,-100);
#define turn_right OnFwdSync(OUT_BC,SPEED,100);
まずはライントレースのために明るさの値と使われる動作を定...
明るさはできるだけ厳しく調整しないとトレースによるアーム...
void line_followleft()
{
SetSensorLight(S4);
long t0=CurrentTick();
while(CurrentTick()-t0<150){ //最後の更新からの...
if(SENSOR_4<BLACK){
turn_left; //黒線上で左回転する
}else{
if(SENSOR_4>WHITE){
turn_right; //白いところで右回...
}else if(SENSOR_4>WHITE_GRAY){
curve_right; //白寄りの境界で右...
}else if(SENSOR_4>THRESHOLD-5){
go_forward; //境界線上で直進する
}else{
curve_left; //他の値を取れば左...
}
t0=CurrentTick(); //黒以外のときはt0...
}
}
Off(OUT_BC);
Wait(1000);
turn_right;
Wait(300);
Off(OUT_BC); //交差点を見つけた...
Wait(500);
}
これは黒線の左側の境界線上をトレースし、交差点を見つけた...
***メイン [#y76f932b]
float GetAngle(float d) //旋回したい角度を...
{
const float diameter = 5.45;
const float length = 12.0;
float ang = d*length*2/diameter;
return ang;
}
先に、片方のタイヤを軸にして回転する際のタイヤの回転角を...
#define CONN 1
#define SIGNALON 11
#define few_go(t) OnFwdSync(OUT_BC,SPEED,0); Wait(t); Of...
#define raise_hand OnRev(OUT_A,SPEED); Wait(450); Off(OU...
#define hold_can OnFwd(OUT_A,SPEED); Wait(400); Off(OUT_...
#define back(t) OnRev(OUT_BC,SPEED); Wait(t); Off(OUT_BC);
こちらはマスター側なのでスレーブの接続番号は1。~
few_go(t)は交差点を越えるための動作である。使用する場所に...
task main()
{
int angle = GetAngle(90.0);
int msg;
raise_hand; //右側のアームを上...
line_followleft();
RotateMotor(OUT_C,SPEED,angle); //ライントレースし...
hold_can; //缶を固定するため...
line_followleft();
few_go(800); //G点の交差点を越...
line_followleft();
RotateMotor(OUT_B,SPEED,angle); //H点で左に90度旋...
back(1000); //位置調整
raise_hand;
back(5000);
SendRemoteNumber(CONN,MAILBOX1,SIGNALON);
//缶を離した後にス...
}
こちらの動作は主にライントレースを行うのみとなっている。~
H点で旋回した後はライン上に缶が3つ並んだ状態となる。
**スレーブ側(2台目) [#c683a3c3]
***ライントレース [#k939c9f2]
#define BLACK 34
#define THRESHOLD 43
#define WHITE_GRAY 48
#define WHITE 53
#define SPEED 30
#define go_forward OnFwdSync(OUT_BC,SPEED,0);
#define curve_left Off(OUT_C); OnFwd(OUT_B,SPEED);
#define curve_right Off(OUT_B); OnFwd(OUT_C,SPEED);
#define turn_left OnFwdSync(OUT_BC,SPEED,-100);
#define turn_right OnFwdSync(OUT_BC,SPEED,100);
まずはマスターと同じように定義する。
void line_followleft()
{
long t0=CurrentTick();
while(CurrentTick()-t0<160){ //交差点を判別す...
if(SENSOR_2<BLACK){
turn_left;
}else{
if(SENSOR_2>WHITE){
turn_right;
}else if(SENSOR_2>WHITE_GRAY){
curve_right;
}else if(SENSOR_2>THRESHOLD-3){
go_forward;
}else{
curve_left;
}
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
turn_right;
Wait(200);
Off(OUT_BC);
Wait(500);
}
左の境界線上のライントレースはマスター側とほとんど同じで...
トレースするラインがマスターと違うため、交差点の判別に必...
void line_followright()
{
long t0=CurrentTick();
while(CurrentTick()-t0<200){ //最後の更新か...
if(SENSOR_2<BLACK){
turn_right; //黒線上で右回...
}else{
if(SENSOR_2>WHITE){
turn_left; //白いところで...
}else if(SENSOR_2>WHITE_GRAY){
curve_left; //白寄りの境界...
}else if(SENSOR_2>THRESHOLD-5){
go_forward; //境界線上で直...
}else{
curve_right; //他の値を取れ...
}
t0=CurrentTick(); //黒以外のとき...
}
}
Off(OUT_BC);
Wait(1000);
turn_left;
Wait(200);
Off(OUT_BC); //交差点を見つ...
Wait(500);
}
右のライントレースは左のものと全く逆の動作を入れてある。
***旋回・回転の角度 [#bce47146]
const float diameter = 5.45;
const float length = 12.0;
計算式を2つ使用するので、同一の値は外に出しておく。
float GetAngle1(float d) //回転したい角度を未...
{
float ang = d*length*2/diameter;
return ang;
}
1つ目はその場で回転する際のタイヤの回転角を算出するもの...
float GetAngle2(float k) //旋回したい角度を未...
{
float ang = length*k/diameter;
return ang;
}
2つ目は片方のタイヤを軸にして旋回する際のタイヤの回転角...
***ボールを受け取る [#dcd5756d]
void fetch_ball()
{
int angle = GetAngle1(60.0);
repeat(3){
while(SensorUS(S3)>7){ //超音波センサ...
if(SENSOR_2<BLACK){
turn_left;
}else if(SENSOR_2>WHITE){
turn_right;
}else if(SENSOR_2>WHITE_GRAY){
curve_right;
}else if(SENSOR_2>THRESHOLD-5){
go_forward;
}else{
curve_left;
}
} //左の境界をラ...
Off(OUT_BC);
OnFwd(OUT_BC,SPEED);
Wait(600);
Off(OUT_BC); //超音波センサ...
RotateMotor(OUT_A,SPEED,92.0); //プロペラを約...
RotateMotor(OUT_B,SPEED,-angle); //もうボールが...
RotateMotor(OUT_B,SPEED,angle); //方向を戻す
} //以上を3回繰...
}
ボールを受け取る動作には超音波センサーと光センサーを使用...
***ボールを置く [#h5a7b578]
void put_ball()
{
long t0=CurrentTick();
long t_start,t_last;
t_start = CurrentTick();
while(SENSOR_2>21&&CurrentTick()-t0<5000){ //光...
OnFwdSync(OUT_BC,20,0); //前...
}
Off(OUT_BC); //光...
t_last = CurrentTick()-t_start; //前...
RotateMotor(OUT_A,SPEED,90.0); //プ...
OnRevSync(OUT_BC,20,0);
Wait(t_last);
Off(OUT_BC); //先...
}
まず、これは未完成である。
このプログラムはロボットの説明で紹介したギミックを使用し...
缶によってギミックが押されるまで前進し、ボールを置いて同...
whileの条件によって、缶を見つけなくても5秒以上経つとボー...
***ゴールの缶を探す [#z2f4cc1b]
この動作については先生に配られた紙に書いてあるものを参考...
#define SPEED_SLOW 20
void turnAng(long ang)
{
long angle;
angle = length/diameter*ang;
RotateMotorEx(OUT_BC,SPEED_SLOW,angle,100,true,true);
}
これは指定した角度まで回転するというもの。
int searchDirection(long ang)
{
long angle,tacho_min=0,tacho_corr;
int d_min;
d_min=300; //仮の最...
angle = (length/diameter)*ang;
turnAng(ang/2); //指定さ...
ResetTachoCount(OUT_BC); //角度の...
OnFwdSync(OUT_BC,SPEED_SLOW,-100);
while(MotorTachoCount(OUT_B)<=angle){ //回転角...
if(SensorUS(S3)<d_min&&SensorUS(S3)>10){
d_min=SensorUS(S3); //仮の最...
tacho_min=MotorTachoCount(OUT_B); //またそ...
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min); //記録さ...
Wait(14); //微調整
Off(OUT_BC);
Wait(500);
return d_min;
}
これもうまく作動しなかった。~
このプログラムは最も近くにある缶の方向を見つけるというも...
仮の最小値を更新する条件に「10cmより大きい」というものが...
またこの動作はH点で使用するので、缶との最小距離が10cmを下...
***メイン [#ce02884d]
#define SIGNALON 11
#define few_go(t) OnFwdSync(OUT_BC,SPEED,0); Wait(t); Of...
#define back(t) OnRev(OUT_BC,SPEED); Wait(t); Off(OUT_BC);
タスクメインで使用する他の動作を定義する。
task main()
{
int msg;
int angle1 = GetAngle1(60.0);
int angle2 = GetAngle2(90.0);
int angle3 = GetAngle1(90.0); //使用す...
SetSensorLight(S2);
SetSensorLowspeed(S3); //センサ...
line_followleft();
back(1200); //ライン...
RotateMotor(OUT_C,SPEED,angle3); //旋回し...
few_go(600);
while(msg != SIGNALON){ //マスタ...
ReceiveRemoteNumber(MAILBOX1,false,msg);
}
fetch_ball();
RotateMotorEx(OUT_BC,SPEED,angle2,-100,true,true); ...
line_followright(); ...
few_go(700);
RotateMotorEx(OUT_BC,SPEED,angle2,100,true,true);
back(700); ...
repeat(2){
searchDirection(100);
Wait(1000);
put_ball();
}
}
repeatの中がうまく作動しなかった。~
最初の左側ライントレースをした後に後ろに下がると入力して...
このプログラムでは本体がライントレース後G点で停止するため...
*まとめ・反省 [#yd936244]
今回はロボット製作とプログラム作成のどちらにも非常に時間...
また以前の課題と変わらず、ロボットが大きくなってしまった...
ページ名: