2015a/Member/uchi/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*課題 [#t65faa08]
ライントレースロボットを作成し、途中にあるピンポン玉をゴールに入れる。詳しくは
[[課題2のページ>http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMission2]]
を参照。
私はA地点からB地点までのコース(下図赤線)を通って(下図黄丸の位置にある)ピンポン玉を運ぶことにした。
#ref(endo1.jpg)
*ロボット本体の説明 [#k1e14181]
**ロボットの外観 [#z447b995]
下から見た写真
#ref(endo3-1.jpg)
それぞれの色の四角で囲まれている部分ついて説明していく。
**ボールキャッチャー(写真青い四角の部分) [#e82a7d3e]
前方についている2つのタイヤが走行中に回転し続けることで前方にあるピンポン玉を巻き込み内部にスッポリとはまる様になっている。
(下の写真1番目がはまる前、2番目がはまった後)
また、ボールをゴールに入れるときはタイヤの回転方向を逆にするだけでよい。
#ref(endo6.jpg)
#ref(endo4.jpg)
**光センサー(写真赤い四角部分) [#t40157ef]
光センサーがつく位置が前すぎると他の線を誤認識してしまうことが多かった。そこで光センサーは極力後輪の近くにつけて誤認識をしないようにした。
**後輪(写真緑色四角部分) [#o00719ff]
後輪には左右それぞれにモーターを付けた。また、左右のタイヤが離れすぎると小回りが利かなくなり、近すぎると曲がれなくなったので、程よい距離を模索した。
**前輪の代わり(写真紫色四角部分) [#q9550746]
前輪がタイヤだと曲がる際に小回りが利かずに曲がり切れなかったが、タイヤの代わりにすべりやすいパーツを取り付けることで急なカーブでも比較的容易に曲がることができた。
*プログラムの説明 [#b17017e0]
**ライントレース [#v8a56bae]
ラインの左側にそってプログラムを書くことにした。そこで、ラインの中での明るさの違いに注目して、ラインの左から、右回転、右旋回、左旋回の順で動く指示を出す(下図参照)ようにプログラムを書いた。こうすることである程度の急カーブは曲がることが出来る。また、右側は通らないので考慮しない。
#ref(endo7.png)
**道路の交点の見極め [#y5479fcf]
三叉路も、十字路もどちらも左に直角に曲がるような道がついている。なので、見極めるときにはそれを利用した。
具体的な方法はカーブが急な左である時、曲がるときに大回りになるために連続して黒い領域にいる間が長くなる。(下図の黄丸部分)すると、左に旋回するというの指示が何度も出る。その指示が出た回数が一定以上になったら道の交点となると判断するようにした。
#ref(endo8.png)
この方法の問題点として、ただの左の直角カーブを誤認してしまう点があるが、今回のコースにはそう行ったものが無かったので無視した。
**終了の判断 [#sd7c8f31]
このコースでは基本的にその場で右回転して長い間より暗いところを見つけることが出来ないという事は起こりにくい。しかし、確実におこる場所が1か所だけ存在する。それは線が途切れるところすなわちゴール地点のみ。これを今回利用した。
方法は道路の好転を見つけるときと同様に、暗い点を求めて右回転の指示を続けてした回数を数えて、それが一定以上になったらゴールしたと判断するようにした。
**使用したプログラム(全て) [#u29af1a4]
#define naka 45 //境界線の明るさ
#define kuro 40 //境界線と中央部の間の明るさ
int n=0; //連続して左旋回した回数
int nmax=10; //連続して左旋回した時に道が交点になっていると判断するまでの回数
int e=0; //連続して右回転した回数15回以上でゴールしたと判断する
int S=0; //道の交点に入った回数。0で三叉路、1で十字路、2でもう交点はない
task main()
{
SetPower(OUT_B,6);
OnFwd(OUT_B); //ピンポン玉を巻き込む部分の起動
SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサーの起動
while (e<=15) //ゴールするまでの繰り返し
{
while ((n<=nmax)&&(e<=15)) //直角に左に曲がらずかつゴールでない時の繰り返し
{
if (SENSOR_2 < kuro) //完全に黒い部分に入った時
{
OnFwd(OUT_C);
Off(OUT_A);
n+=1;
e=0; //左旋回してnを1増やしてeをリセット
}
if (SENSOR_2 > kuro) //完全には黒い部分に入ってない時
{
if (SENSOR_2 < naka)//境界より内側の時
{
OnFwd(OUT_A);
Off(OUT_C);
n=0;
e=0; //右旋回してnとeをリセット
}
if (SENSOR_2 > naka)//境界より外側の時
{
OnFwd(OUT_A);
OnRev(OUT_C);
n=0;
e+=1; //右を向き、nをリセットしてeを1増やす
}
}
while ((n>=nmax)&&(S==0)) //1回も道の交点に入ってなく直角に曲がろうとした時
{
PlaySound(SOUND_CLICK);
Off(OUT_A);
Off(OUT_C);
Wait(200); //三叉路なので2秒止まる
OnRev(OUT_C);
Off(OUT_A);
Wait(45); //道に対して車体をまっすぐにする
OnFwd(OUT_A);
OnFwd(OUT_C);
Wait(30); //三叉路を直進
Off(OUT_A);
Off(OUT_C);
n=0;
S=1; //nをリセットして交点の回数を1回追加
nmax+=7; //基準変更
}
while ((n>=nmax)&&(S==1)) //上のことが起きた後にまた左に曲がろうとした時
{
PlaySound(SOUND_CLICK);
Off(OUT_A);
Off(OUT_C);
Wait(200); //十字路なので2秒止まる
OnRev(OUT_C);
Off(OUT_A);
Wait(70); //道に対して車体をまっすぐにする
OnFwd(OUT_A);
OnFwd(OUT_C);
Wait(30); //十字路を直進
Off(OUT_A);
Off(OUT_C);
n=0;
S=2; //nをリセットして交点の回数を1回追加
}
}
Off(OUT_A); //eが15以上になったのでゴールしたと判断
Off(OUT_C);
OnFwd(OUT_C); //ゴールしたあとの車体をまっすぐにする
OnRev(OUT_A);
Wait(90);
Off(OUT_A);
Off(OUT_C);
OnRev(OUT_B); //シュートして終了する
Wait(20);
Off(OUT_B);
}
}
*ロボットの動作動画 [#v3cc8f0c]
#ref(endomov.mov)
*未解決の問題点 [#qe875fba]
-ピンポン玉をとる際に誤ってピンポン玉に本体がぶつかり、とることに失敗してしまうことがある。ぶつからないようにもっとコンパクトにすればよいだろうが、方法が思いつかなかった。
-初めは、コースが事前にわからない状態でもどこの分かれ道をどのように曲がればいいかを入れればどんな風にも動けるロボットという方向性で作成していたが断念した。もっと細かくモータの速度が調節できていたらうまく行っていたかもしれない。
*かかった時間 [#p23434fa]
-ロボットの試行錯誤…約60時間
-このロボット本体…約1時間
-プログラム…約1時間
-プログラムの微調整…約4時間
-ホームページ…約4時間
*まとめと反省 [#t079a71e]
今回初めはより性能の高いロボットを作ろうとしていたが、結局この形に落ち着いた。
限られた材料で理想的なロボットを作ることの難しさを改めて思い知った。
終了行:
#contents
*課題 [#t65faa08]
ライントレースロボットを作成し、途中にあるピンポン玉をゴールに入れる。詳しくは
[[課題2のページ>http://yakushi.shinshu-u.ac.jp/robotics/?2015a%2FMission2]]
を参照。
私はA地点からB地点までのコース(下図赤線)を通って(下図黄丸の位置にある)ピンポン玉を運ぶことにした。
#ref(endo1.jpg)
*ロボット本体の説明 [#k1e14181]
**ロボットの外観 [#z447b995]
下から見た写真
#ref(endo3-1.jpg)
それぞれの色の四角で囲まれている部分ついて説明していく。
**ボールキャッチャー(写真青い四角の部分) [#e82a7d3e]
前方についている2つのタイヤが走行中に回転し続けることで前方にあるピンポン玉を巻き込み内部にスッポリとはまる様になっている。
(下の写真1番目がはまる前、2番目がはまった後)
また、ボールをゴールに入れるときはタイヤの回転方向を逆にするだけでよい。
#ref(endo6.jpg)
#ref(endo4.jpg)
**光センサー(写真赤い四角部分) [#t40157ef]
光センサーがつく位置が前すぎると他の線を誤認識してしまうことが多かった。そこで光センサーは極力後輪の近くにつけて誤認識をしないようにした。
**後輪(写真緑色四角部分) [#o00719ff]
後輪には左右それぞれにモーターを付けた。また、左右のタイヤが離れすぎると小回りが利かなくなり、近すぎると曲がれなくなったので、程よい距離を模索した。
**前輪の代わり(写真紫色四角部分) [#q9550746]
前輪がタイヤだと曲がる際に小回りが利かずに曲がり切れなかったが、タイヤの代わりにすべりやすいパーツを取り付けることで急なカーブでも比較的容易に曲がることができた。
*プログラムの説明 [#b17017e0]
**ライントレース [#v8a56bae]
ラインの左側にそってプログラムを書くことにした。そこで、ラインの中での明るさの違いに注目して、ラインの左から、右回転、右旋回、左旋回の順で動く指示を出す(下図参照)ようにプログラムを書いた。こうすることである程度の急カーブは曲がることが出来る。また、右側は通らないので考慮しない。
#ref(endo7.png)
**道路の交点の見極め [#y5479fcf]
三叉路も、十字路もどちらも左に直角に曲がるような道がついている。なので、見極めるときにはそれを利用した。
具体的な方法はカーブが急な左である時、曲がるときに大回りになるために連続して黒い領域にいる間が長くなる。(下図の黄丸部分)すると、左に旋回するというの指示が何度も出る。その指示が出た回数が一定以上になったら道の交点となると判断するようにした。
#ref(endo8.png)
この方法の問題点として、ただの左の直角カーブを誤認してしまう点があるが、今回のコースにはそう行ったものが無かったので無視した。
**終了の判断 [#sd7c8f31]
このコースでは基本的にその場で右回転して長い間より暗いところを見つけることが出来ないという事は起こりにくい。しかし、確実におこる場所が1か所だけ存在する。それは線が途切れるところすなわちゴール地点のみ。これを今回利用した。
方法は道路の好転を見つけるときと同様に、暗い点を求めて右回転の指示を続けてした回数を数えて、それが一定以上になったらゴールしたと判断するようにした。
**使用したプログラム(全て) [#u29af1a4]
#define naka 45 //境界線の明るさ
#define kuro 40 //境界線と中央部の間の明るさ
int n=0; //連続して左旋回した回数
int nmax=10; //連続して左旋回した時に道が交点になっていると判断するまでの回数
int e=0; //連続して右回転した回数15回以上でゴールしたと判断する
int S=0; //道の交点に入った回数。0で三叉路、1で十字路、2でもう交点はない
task main()
{
SetPower(OUT_B,6);
OnFwd(OUT_B); //ピンポン玉を巻き込む部分の起動
SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサーの起動
while (e<=15) //ゴールするまでの繰り返し
{
while ((n<=nmax)&&(e<=15)) //直角に左に曲がらずかつゴールでない時の繰り返し
{
if (SENSOR_2 < kuro) //完全に黒い部分に入った時
{
OnFwd(OUT_C);
Off(OUT_A);
n+=1;
e=0; //左旋回してnを1増やしてeをリセット
}
if (SENSOR_2 > kuro) //完全には黒い部分に入ってない時
{
if (SENSOR_2 < naka)//境界より内側の時
{
OnFwd(OUT_A);
Off(OUT_C);
n=0;
e=0; //右旋回してnとeをリセット
}
if (SENSOR_2 > naka)//境界より外側の時
{
OnFwd(OUT_A);
OnRev(OUT_C);
n=0;
e+=1; //右を向き、nをリセットしてeを1増やす
}
}
while ((n>=nmax)&&(S==0)) //1回も道の交点に入ってなく直角に曲がろうとした時
{
PlaySound(SOUND_CLICK);
Off(OUT_A);
Off(OUT_C);
Wait(200); //三叉路なので2秒止まる
OnRev(OUT_C);
Off(OUT_A);
Wait(45); //道に対して車体をまっすぐにする
OnFwd(OUT_A);
OnFwd(OUT_C);
Wait(30); //三叉路を直進
Off(OUT_A);
Off(OUT_C);
n=0;
S=1; //nをリセットして交点の回数を1回追加
nmax+=7; //基準変更
}
while ((n>=nmax)&&(S==1)) //上のことが起きた後にまた左に曲がろうとした時
{
PlaySound(SOUND_CLICK);
Off(OUT_A);
Off(OUT_C);
Wait(200); //十字路なので2秒止まる
OnRev(OUT_C);
Off(OUT_A);
Wait(70); //道に対して車体をまっすぐにする
OnFwd(OUT_A);
OnFwd(OUT_C);
Wait(30); //十字路を直進
Off(OUT_A);
Off(OUT_C);
n=0;
S=2; //nをリセットして交点の回数を1回追加
}
}
Off(OUT_A); //eが15以上になったのでゴールしたと判断
Off(OUT_C);
OnFwd(OUT_C); //ゴールしたあとの車体をまっすぐにする
OnRev(OUT_A);
Wait(90);
Off(OUT_A);
Off(OUT_C);
OnRev(OUT_B); //シュートして終了する
Wait(20);
Off(OUT_B);
}
}
*ロボットの動作動画 [#v3cc8f0c]
#ref(endomov.mov)
*未解決の問題点 [#qe875fba]
-ピンポン玉をとる際に誤ってピンポン玉に本体がぶつかり、とることに失敗してしまうことがある。ぶつからないようにもっとコンパクトにすればよいだろうが、方法が思いつかなかった。
-初めは、コースが事前にわからない状態でもどこの分かれ道をどのように曲がればいいかを入れればどんな風にも動けるロボットという方向性で作成していたが断念した。もっと細かくモータの速度が調節できていたらうまく行っていたかもしれない。
*かかった時間 [#p23434fa]
-ロボットの試行錯誤…約60時間
-このロボット本体…約1時間
-プログラム…約1時間
-プログラムの微調整…約4時間
-ホームページ…約4時間
*まとめと反省 [#t079a71e]
今回初めはより性能の高いロボットを作ろうとしていたが、結局この形に落ち着いた。
限られた材料で理想的なロボットを作ることの難しさを改めて思い知った。
ページ名: