2017b/Member/yuitom/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題の確認 [#rcb738e9]
&ref(2017b/Member/yuitom/Mission2/rob_mission2.png,70%,コ...
今回私が担当するコースは第3コースである。尚、第3コース...
(1)Aをスタート(2)Bを直進(3)Cを直進
(4)D地点の紙コップを取得して来たコース戻りCへ向かう
(5)Cを左折(6)Fを直進(7)Rを左折(一時停止)(8)Pを直進
(9)X地点に紙コップを置いてコースに戻る
(10)Qを左折(11)Sを右折(一時停止)(12)Fを左折(一時停...
*ロボットの説明 [#k049917e]
**ロボット作成に向けて [#m59a7d6d]
正確にミッションをクリアするために必要になる6つの課題
? ラインの端を正確にたどる
→? より小回りがきくようにするために、センサと動力の位置...
? 紙の凹凸、ラインの塗りの粗さなどで動作に支障をきたさ...
? コップの入手とリリース
→? コップの位置が多少ずれていても入手できるアームを作成...
? コップの入手とリリースの動作を電池残量に左右されない...
? 正確に交差点を見極める(交差点以外での誤認を無くす)
→? 交差点以外で「ここは交差点だ」と誤認しないようなプロ...
? 交差点後の動作を電池残量によって変化しないようにする...
私達のグループでは、以上の6点の課題を解決することで今回の...
**ロボットの作成 [#y629d004]
&ref(2017b/Member/yuitom/Mission2/robo1.jpg,70%,ローバー...
今回は「ロボットの作成に向けて」であげた6つの課題の中のロ...
課題? センサと動力の位置をできるだけ近づける。
課題? センサと地面の位置の調節する。
-試作1 (センサを地面に対し斜めに配置する。)
調度良い位置だったらしく、ライントレースはスムーズに出来...
このことから、センサは地面と垂直になるように設置すること...
-試作2 (センサを地面に対し垂直になるように設置する)
突然カーブしてしまうと言ったおかしな動きをすることが増え...
地面と、ある程度離れた位置にセンサを配置しないと、正確な...
-試作3(本番で使用)
&ref(2017b/Member/yuitom/Mission2/robo1_sisaku2.jpg,50%,...
試作2よりもセンサの位置を地面から離すことで、試作1のよう...
課題? コップの位置が多少ずれていても入手できるアームの作...
&ref(2017b/Member/yuitom/Mission2/robo1_sisaku1.1.jpg,50%...
&ref(2017b/Member/yuitom/Mission2/robo1_sisaku1.2.jpg,50%...
今回私達のグループでは、コップの入手とリリースが容易にで...
これにより、画像のように多少コップに位置がずれていても、...
*プログラミングの説明 [#n5896b66]
**定義 [#vc306296]
私達のグループでは、より滑らかなライントレースを行うため...
これらの問題点を解決するために、私たちのグループではプロ...
-ラインの基準
ライントレースを行う際に非常に大切な値となるものが、ライ...
#define black 30 // 黒基準
#define white 58 // 白基準
#define threshold (black+white)/2 // 基準線の明るさ
-速度の基準
#define speed_standardA 35 // モータA基準速度
#define speed_standardB 35 // モータB基準速度
#define corner_standardA 27 // モータA交差点基準速度
#define corner_standardB 27 // モータB交差点基準速度
-比例制御に必要な定義
私達のグループでは比例5段階制御を行っている。その際「基準...
また ?_speed? としたとき、?はf→forward(前進用)、c→cor...
#define sensor2 SENSOR_2
#define f_speedA (sensor2-threshold)*1 // 直進 モータA
#define c_speedA (sensor2-threshold)*1.5 // corner モー...
#define t_speedA (sensor2-threshold)*2 // turning モータA
#define f_speedB (sensor2-threshold)*1 // 直進 モータB
#define c_speedB (sensor2-threshold)*1.5 // corner モー...
#define t_speedB (sensor2-threshold)*2 // turning モータB
-交差点の識別
私達のグループでは、交差点の識別を「どれほどの時間曲がり...
また、交差点の識別時間が110と非常に短く設定されている理由...
#define corner_time 110 // 交差点判別時間
#define corner_wait 1000 // 交差点待機時間
#define afterselect_time 750 // 交差点通過後左右ライン選...
-コップの入手とリリース
私達のグループでは、コップの入手とリリースが電池残量によ...
#define catch RotateMotor(OUT_C,50,-400);Wait(1000); // ...
#define release RotateMotor(OUT_C,50,400);Wait(1000); //...
#define finish OnFwd(OUT_AB,30);Wait(2500);Off(OUT_AB); ...
**比例制御と5段階制御を組み合わせるために… [#n52315c7]
私達のグループでは、より滑らかな、より安定感のあるライ...
それは「ある程度のカーブであれば対応できるが、急カーブ...
この課題を、解決するために私達が考えた解決策が「比例5段...
-3つの比例制御プログラム
「比例5段階制御」を行うためには、3段階に分けた比例制御...
また、?_proportion(int ?)としたとき、?はf→forward(前進...
例)右側のラインを走行中でカーブしている場合 forward_...
比例制御の方法については次のような計算法で行っている。
モータA(基準速度)+(現在の明るさ−基準の明るさ)×曲が...
モータB(基準速度)−(現在の明るさ−基準の明るさ)×曲が...
sub forward_proportion(int lineselect) // 前進の比例制御
{
OnFwd(OUT_A,(speed_standardA)+f_speedA*lineselect);
OnFwd(OUT_B,(speed_standardB)-f_speedB*lineselect);
}
sub corner_proportion(int lineselect) // 曲がり道の比例...
{
OnFwd(OUT_A,(speed_standardA-12)+c_speedA*lineselect);
OnFwd(OUT_B,(speed_standardB-12)-c_speedB*lineselect);
}
sub turnning_proportion(int lineselect) // 急カーブの比...
{
OnFwd(OUT_A,(speed_standardA-30)+t_speedA*lineselect);
OnFwd(OUT_B,(speed_standardB-30)-t_speedB*lineselect);
}
-5段階の比例制御プログラムとライン選択
「3つの比例制御プログラム」を用いて実際に5段階の比例制...
&ref(2017b/Member/yuitom/Mission2/robo_line1.png,70%,5段...
この時、基準線から±10以上値が離れていた場合(画像の?と?...
また、linetrace_restriction(int ?)としたとき、?はライン...
このサブルーチンは交差点にあたると停止するように制限さ...
例)左側をライントレースする。 linetrace_restriction(...
sub linetrace_restriction(int lineselect) // ライントレ...
{
long t0=CurrentTick();
while(CurrentTick()-t0<=corner_time){
if(sensor2<threshold-10){
turnning_proportion(lineselect);
}else if(sensor2<threshold-7){
corner_proportion(lineselect);
t0=CurrentTick();
}else if(sensor2<threshold+7){
forward_proportion(lineselect);
t0=CurrentTick();
}else if(sensor2<threshold+10){
corner_proportion(lineselect);
t0=CurrentTick();
}else{
turnning_proportion(lineselect);
t0=CurrentTick();
}
Wait(10);
}
Off(OUT_AB);
PlaySound(SOUND_DOUBLE_BEEP);
}
しかし、交差点にあたると停止する上のサブルーチン「linet...
-s字カーブに対応するために…
新しくs字カーブ用に作成したサブルーチンは、指定した時間...
このサブルーチンは、指定した時間の間ライントレースを続...
また、linetrace_release(int ?,int ?)としたとき、?は交差...
このサブルーチンは、指定した時間の間交差点の識別から解...
例)左側を10秒間ライントレース(ただし交差点識別は無し...
sub linetrace_release(int timelimit,int lineselect) // ...
ライン選択)
{
long t0=CurrentTick();
while(CurrentTick()-t0<=timelimit){
if(sensor2<threshold-10){
turnning_proportion(lineselect);
}else if(sensor2<threshold-7){
corner_proportion(lineselect);
}else if(sensor2<threshold+7){
forward_proportion(lineselect);
}else if(sensor2<threshold+10){
corner_proportion(lineselect);
}else{
turnning_proportion(lineselect);
}
Wait(10);
}
}
**電池残量に左右されない交差点の通過 [#x03dbd0d]
ここでは「課題? 交差点後の動作を電池残量によって変化し...
今回は、交差点識別後に以下の3つの行動が必要となる。
? 交差点識別後、前進しライントレースを開始する。
? 交差点識別後、右折しライントレースを開始する。
? 交差点識別後、左折しライントレースを開始する。
この時、「指定された速度で指定された時間前進する」とい...
また、それにより黒線の中にセンサがある状態でライントレ...
この問題を解決するために私たちのグループでは、光センサ...
? 交差点識別後、前進しライントレースを開始する。
&ref(2017b/Member/yuitom/Mission2/robo_map2.png,50%,交差...
交差点を識別→交差点で停止するかしないか→白い部分に出るま...
以上のような流れで交差点を通過する。
また、go_corner(int ?)としたとき、?は交差点認識時に1秒...
例)交差点識別後、1秒間停止後、前進し交差点を通過する。...
sub go_corner(int cornerselect) // wait→「1」 through→「...
{
Wait(corner_wait*cornerselect); // 交差点で停止...
while(sensor2<white-3){ // 白い部分に出...
OnFwd(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500); // 基準線に乗る...
while(sensor2>threshold){
OnFwd(OUT_A,corner_standardA);
OnRev(OUT_B,corner_standardB*0.5);
}
Off(OUT_AB);
Wait(500);
}
? 交差点識別後、右折しライントレースを開始する。
&ref(2017b/Member/yuitom/Mission2/robo_map3.png,50%,交差...
交差点を識別→交差点で停止するかしないか→白い部分に出るま...
以上のような流れで交差点を右折する。
また、turn_right(int ?,int ?)としたとき、?は交差点認識...
例)交差点識別後、停止せずに交差点を右折し右側のライン...
turn_right(0,1);
sub turn_right(int cornerselect,int after_lineselect) //...
{
Wait(corner_wait*cornerselect);
while(sensor2<white-3){
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
while(sensor2>threshold){
OnFwd(OUT_A,corner_standardA);
OnRev(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
linetrace_release(afterselect_time,after_lineselect);
}
? 交差点識別後、左折しライントレースを開始する。
流れ、動作ともに、「? 交差点識別後、右折しライントレー...
sub turn_left(int cornerselect, int after_lineselect) //...
{
Wait(corner_wait*cornerselect);
while(sensor2<white-3){
OnFwd(OUT_A,corner_standardA);
OnRev(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
while(sensor2>threshold){
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
linetrace_release(afterselect_time,after_lineselect);
}
●交差点通過後ライン選択について(課題?の解決)
何度も述べているように、このプログラム上では交差点識別...
交差点通過後ライン選択とは、交差点を通過した後に左右ど...
-交差点通過後ライン選択の仕方
交差点通過後ライン選択では、「比例制御と5段階制御を組み...
「linetrace_release」では指定した時間の間、交差点認識の...
-結果
結果は、それまで交差点を通過した後に交差点だと誤認する...
**コップを入手する [#ofaf6564]
第3コースではコップを入手しライントレースに復帰するため...
今回、Uターンにおいても「電池残量に左右されない交差点の...
-動作の流れ
&ref(2017b/Member/yuitom/Mission2/robo_map5.jpg,80%,コッ...
コップを入手(画像での?)→基準線の乗るまで左へ曲がる(画...
以上のような、左回りの流れでUターンしていく。また、この...
sub get_cup() // コップの獲得
{
OnRev(OUT_A,corner_standardA); // 機首をコップに向ける
OnFwd(OUT_B,corner_standardB);
Wait(corner_time+120);
Off(OUT_AB);
Wait(1000);
catch // コップの獲得
PlaySound(SOUND_UP);
U_turn(); // Uターン
}
sub U_turn() // Uターン
{
while(sensor2<threshold){ // 基準線の乗るまで左へ曲...
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,20);
}
Off(OUT_AB);
Wait(500);
linetrace_release(500,1); // 少し前へ進む
while(sensor2<white-2){ // 白い部分に出るまで左旋回
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
while(sensor2>threshold){ // 基準線に乗るまで左旋回
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
}
**コップのリリース [#nba6760a]
第三コースではX地点にコップを運搬し円の中にコップを配置...
また、この際も他のプログラムと同様に「電池残量に左右され...
-動作の流れ
&ref(2017b/Member/yuitom/Mission2/robo_map4.jpg,80%,コッ...
円の内側をたどりライントレース(時間制限)→白の部分に出る...
→黒のラインに完全に乗るまで後ろへ下がりつつ右回転(画像で...
→黒のラインに完全に乗るまで後退(画像での?)→白の部分に出...
という流れでコップを置いている。
sub put_cup(int after_lineselect) // コップリリース(行...
{
while(sensor2<white-2){ // 白の部分に出るまで後ろへ...
OnRev(OUT_A,corner_standardA);
}
Off(OUT_B);
Wait(250);
while(sensor2>threshold-10){ // 黒のラインに完全に乗...
OnRev(OUT_A,corner_standardA);
}
Off(OUT_AB);
Wait(250);
OnFwd(OUT_A,30); // 指定時間前進
OnFwd(OUT_B,30);
Wait(500);
Off(OUT_AB);
Wait(500);
release // コップのリリース
PlaySound(SOUND_DOWN);
while(sensor2>threshold-10){ // 黒のラインに完全に乗...
OnRev(OUT_A,30);
OnRev(OUT_B,30);
}
Off(OUT_AB);
while(sensor2<white-2){ // 白の部分に出るまで右回転
OnFwd(OUT_A,corner_standardA);
}
Off(OUT_B);
Wait(250);
while(sensor2>threshold){ // 基準線に乗るまで右回転
OnFwd(OUT_A,corner_standardA);
}
Off(OUT_AB);
linetrace_release(afterselect_time,after_lineselect)...
}
*第三コース攻略 [#z909bd72]
**コースの区画分け [#af3f5718]
&ref(2017b/Member/yuitom/Mission2/robo_map6.jpg,80%,コー...
今回、プログラミングをより訂正のしやすく、より見やすく...
? 第1ステージ(A→D→C→D) ポイント「コップの取得とUター...
? 第2ステージ(D→C→F) ポイント「F交差点の直進」
? 第3ステージ(F→E→R) ポイント「FE区間のs字カーブ」
? 第4ステージ(R→P→Q) ポイント「コップのリリース」
? 最終ステージ(Q→S→F→C→D) ポイント「4連続の直角カーブ」
それぞれのステージでの難点とそれに対する解決策を見てい...
? 第1ステージ(A→D→C→D)
-A→D 難点:A→B→C→Dのようにたどると、合計2つもの交差点が...
解決策:ラインの右側でなく左側をたどることで、A→Dまで一...
-D 難点:コップの取得とUターン
解決策:電池残量で動作に影響を及ぼさないようなプログラ...
sub the_first() // 第1ステージ コップの取得「A→D→C→D」
{
linetrace_restriction(-1); // A→D
get_cup(); // コップの獲得
}
? 第2ステージ(D→C→F)
-C 難点:DC区間の短さによるUターンの失敗
解決策:Uターンプログラムの改良(「少しの前進」を加える)
-F 難点:交差点直進後の動作の停止
解決策:原因はわからなかったが、おそらく電池の消耗によ...
sub the_second() // 第2ステージ コップの運搬「D→C→F」
{
linetrace_restriction(-1);
turn_left(0,1); // C
linetrace_restriction(1);
go_corner(1); // F
}
? 第3ステージ(F→E→R)
-F→E 難点:s字カーブでの交差点誤認識
解決策:「linetrace_release」を作成することで、指定した...
-E 難点:E左折後に毎回発生する交差点誤認識
解決策:「linetrace_release」を用いた行動終了後ライン選...
sub the_third() // 第3ステージ コップの運搬「F→E→R」
{
PlaySound(SOUND_CLICK);
linetrace_release(15000,1); // F→E途中地点
PlaySound(SOUND_LOW_BEEP);
linetrace_restriction(1); // E途中地点→E
turn_right(0,1); // E
linetrace_restriction(1);
OnFwd(OUT_AB,-30); // F
Wait(50);
Off(OUT_AB);
turn_left(1,1);
}
? 第4ステージ(R→P→Q)
-P 難点:Pの交差点での交差点識別機能の未反応
解決策:R→P→Qと円の外を回るのではなく、R→Qと円の内側を...
-P→Q 難点:コップのリリース
解決策:電池残量で動作に影響を及ぼさないようなプログラ...
sub the_fourth() // 第4ステージ コップの配置「R→P→Q」
{
PlaySound(SOUND_CLICK);
linetrace_release(5000,1); // R→コップ配置場所
Off(OUT_AB);
PlaySound(SOUND_LOW_BEEP);
Wait(500);
put_cup(-1); // コップの配置
linetrace_restriction(-1); // コップ配置場所→Q
}
? 最終ステージ(Q→S→F→C→D)
-Q,S,F,C 難点:交差点の右折左折後に頻繁に発生する交差点...
解決策:第3ステージと同様に、「linetrace_release」を用...
sub the_fifth() // 最終ステージ ゴール地点への移動「Q→S...
{
turn_left(0,-1); // Q
linetrace_restriction(-1);
turn_right(1,1); // S
linetrace_restriction(1);
turn_left(1,-1); // F
linetrace_restriction(-1);
turn_right(1,1); // C
linetrace_release(500,1);
finish // D ゴール
}
**task main()第三コース攻略 [#r927da9c]
上記の区画分け(第1〜最終ステージ)までを合わせたものが...
task main()
{
SetSensorLight(S2);
the_first();
the_second();
the_third();
the_fourth();
the_fifth();
}
*まとめ [#k872feae]
今回は、より安定した、より正確なライントレースを目指し...
そのため、私は今回の課題で「速く、正確に」の重要性を知...
今回、プログラミングが完成したのが本番ぎりぎりであった...
終了行:
目次
#contents
*課題の確認 [#rcb738e9]
&ref(2017b/Member/yuitom/Mission2/rob_mission2.png,70%,コ...
今回私が担当するコースは第3コースである。尚、第3コース...
(1)Aをスタート(2)Bを直進(3)Cを直進
(4)D地点の紙コップを取得して来たコース戻りCへ向かう
(5)Cを左折(6)Fを直進(7)Rを左折(一時停止)(8)Pを直進
(9)X地点に紙コップを置いてコースに戻る
(10)Qを左折(11)Sを右折(一時停止)(12)Fを左折(一時停...
*ロボットの説明 [#k049917e]
**ロボット作成に向けて [#m59a7d6d]
正確にミッションをクリアするために必要になる6つの課題
? ラインの端を正確にたどる
→? より小回りがきくようにするために、センサと動力の位置...
? 紙の凹凸、ラインの塗りの粗さなどで動作に支障をきたさ...
? コップの入手とリリース
→? コップの位置が多少ずれていても入手できるアームを作成...
? コップの入手とリリースの動作を電池残量に左右されない...
? 正確に交差点を見極める(交差点以外での誤認を無くす)
→? 交差点以外で「ここは交差点だ」と誤認しないようなプロ...
? 交差点後の動作を電池残量によって変化しないようにする...
私達のグループでは、以上の6点の課題を解決することで今回の...
**ロボットの作成 [#y629d004]
&ref(2017b/Member/yuitom/Mission2/robo1.jpg,70%,ローバー...
今回は「ロボットの作成に向けて」であげた6つの課題の中のロ...
課題? センサと動力の位置をできるだけ近づける。
課題? センサと地面の位置の調節する。
-試作1 (センサを地面に対し斜めに配置する。)
調度良い位置だったらしく、ライントレースはスムーズに出来...
このことから、センサは地面と垂直になるように設置すること...
-試作2 (センサを地面に対し垂直になるように設置する)
突然カーブしてしまうと言ったおかしな動きをすることが増え...
地面と、ある程度離れた位置にセンサを配置しないと、正確な...
-試作3(本番で使用)
&ref(2017b/Member/yuitom/Mission2/robo1_sisaku2.jpg,50%,...
試作2よりもセンサの位置を地面から離すことで、試作1のよう...
課題? コップの位置が多少ずれていても入手できるアームの作...
&ref(2017b/Member/yuitom/Mission2/robo1_sisaku1.1.jpg,50%...
&ref(2017b/Member/yuitom/Mission2/robo1_sisaku1.2.jpg,50%...
今回私達のグループでは、コップの入手とリリースが容易にで...
これにより、画像のように多少コップに位置がずれていても、...
*プログラミングの説明 [#n5896b66]
**定義 [#vc306296]
私達のグループでは、より滑らかなライントレースを行うため...
これらの問題点を解決するために、私たちのグループではプロ...
-ラインの基準
ライントレースを行う際に非常に大切な値となるものが、ライ...
#define black 30 // 黒基準
#define white 58 // 白基準
#define threshold (black+white)/2 // 基準線の明るさ
-速度の基準
#define speed_standardA 35 // モータA基準速度
#define speed_standardB 35 // モータB基準速度
#define corner_standardA 27 // モータA交差点基準速度
#define corner_standardB 27 // モータB交差点基準速度
-比例制御に必要な定義
私達のグループでは比例5段階制御を行っている。その際「基準...
また ?_speed? としたとき、?はf→forward(前進用)、c→cor...
#define sensor2 SENSOR_2
#define f_speedA (sensor2-threshold)*1 // 直進 モータA
#define c_speedA (sensor2-threshold)*1.5 // corner モー...
#define t_speedA (sensor2-threshold)*2 // turning モータA
#define f_speedB (sensor2-threshold)*1 // 直進 モータB
#define c_speedB (sensor2-threshold)*1.5 // corner モー...
#define t_speedB (sensor2-threshold)*2 // turning モータB
-交差点の識別
私達のグループでは、交差点の識別を「どれほどの時間曲がり...
また、交差点の識別時間が110と非常に短く設定されている理由...
#define corner_time 110 // 交差点判別時間
#define corner_wait 1000 // 交差点待機時間
#define afterselect_time 750 // 交差点通過後左右ライン選...
-コップの入手とリリース
私達のグループでは、コップの入手とリリースが電池残量によ...
#define catch RotateMotor(OUT_C,50,-400);Wait(1000); // ...
#define release RotateMotor(OUT_C,50,400);Wait(1000); //...
#define finish OnFwd(OUT_AB,30);Wait(2500);Off(OUT_AB); ...
**比例制御と5段階制御を組み合わせるために… [#n52315c7]
私達のグループでは、より滑らかな、より安定感のあるライ...
それは「ある程度のカーブであれば対応できるが、急カーブ...
この課題を、解決するために私達が考えた解決策が「比例5段...
-3つの比例制御プログラム
「比例5段階制御」を行うためには、3段階に分けた比例制御...
また、?_proportion(int ?)としたとき、?はf→forward(前進...
例)右側のラインを走行中でカーブしている場合 forward_...
比例制御の方法については次のような計算法で行っている。
モータA(基準速度)+(現在の明るさ−基準の明るさ)×曲が...
モータB(基準速度)−(現在の明るさ−基準の明るさ)×曲が...
sub forward_proportion(int lineselect) // 前進の比例制御
{
OnFwd(OUT_A,(speed_standardA)+f_speedA*lineselect);
OnFwd(OUT_B,(speed_standardB)-f_speedB*lineselect);
}
sub corner_proportion(int lineselect) // 曲がり道の比例...
{
OnFwd(OUT_A,(speed_standardA-12)+c_speedA*lineselect);
OnFwd(OUT_B,(speed_standardB-12)-c_speedB*lineselect);
}
sub turnning_proportion(int lineselect) // 急カーブの比...
{
OnFwd(OUT_A,(speed_standardA-30)+t_speedA*lineselect);
OnFwd(OUT_B,(speed_standardB-30)-t_speedB*lineselect);
}
-5段階の比例制御プログラムとライン選択
「3つの比例制御プログラム」を用いて実際に5段階の比例制...
&ref(2017b/Member/yuitom/Mission2/robo_line1.png,70%,5段...
この時、基準線から±10以上値が離れていた場合(画像の?と?...
また、linetrace_restriction(int ?)としたとき、?はライン...
このサブルーチンは交差点にあたると停止するように制限さ...
例)左側をライントレースする。 linetrace_restriction(...
sub linetrace_restriction(int lineselect) // ライントレ...
{
long t0=CurrentTick();
while(CurrentTick()-t0<=corner_time){
if(sensor2<threshold-10){
turnning_proportion(lineselect);
}else if(sensor2<threshold-7){
corner_proportion(lineselect);
t0=CurrentTick();
}else if(sensor2<threshold+7){
forward_proportion(lineselect);
t0=CurrentTick();
}else if(sensor2<threshold+10){
corner_proportion(lineselect);
t0=CurrentTick();
}else{
turnning_proportion(lineselect);
t0=CurrentTick();
}
Wait(10);
}
Off(OUT_AB);
PlaySound(SOUND_DOUBLE_BEEP);
}
しかし、交差点にあたると停止する上のサブルーチン「linet...
-s字カーブに対応するために…
新しくs字カーブ用に作成したサブルーチンは、指定した時間...
このサブルーチンは、指定した時間の間ライントレースを続...
また、linetrace_release(int ?,int ?)としたとき、?は交差...
このサブルーチンは、指定した時間の間交差点の識別から解...
例)左側を10秒間ライントレース(ただし交差点識別は無し...
sub linetrace_release(int timelimit,int lineselect) // ...
ライン選択)
{
long t0=CurrentTick();
while(CurrentTick()-t0<=timelimit){
if(sensor2<threshold-10){
turnning_proportion(lineselect);
}else if(sensor2<threshold-7){
corner_proportion(lineselect);
}else if(sensor2<threshold+7){
forward_proportion(lineselect);
}else if(sensor2<threshold+10){
corner_proportion(lineselect);
}else{
turnning_proportion(lineselect);
}
Wait(10);
}
}
**電池残量に左右されない交差点の通過 [#x03dbd0d]
ここでは「課題? 交差点後の動作を電池残量によって変化し...
今回は、交差点識別後に以下の3つの行動が必要となる。
? 交差点識別後、前進しライントレースを開始する。
? 交差点識別後、右折しライントレースを開始する。
? 交差点識別後、左折しライントレースを開始する。
この時、「指定された速度で指定された時間前進する」とい...
また、それにより黒線の中にセンサがある状態でライントレ...
この問題を解決するために私たちのグループでは、光センサ...
? 交差点識別後、前進しライントレースを開始する。
&ref(2017b/Member/yuitom/Mission2/robo_map2.png,50%,交差...
交差点を識別→交差点で停止するかしないか→白い部分に出るま...
以上のような流れで交差点を通過する。
また、go_corner(int ?)としたとき、?は交差点認識時に1秒...
例)交差点識別後、1秒間停止後、前進し交差点を通過する。...
sub go_corner(int cornerselect) // wait→「1」 through→「...
{
Wait(corner_wait*cornerselect); // 交差点で停止...
while(sensor2<white-3){ // 白い部分に出...
OnFwd(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500); // 基準線に乗る...
while(sensor2>threshold){
OnFwd(OUT_A,corner_standardA);
OnRev(OUT_B,corner_standardB*0.5);
}
Off(OUT_AB);
Wait(500);
}
? 交差点識別後、右折しライントレースを開始する。
&ref(2017b/Member/yuitom/Mission2/robo_map3.png,50%,交差...
交差点を識別→交差点で停止するかしないか→白い部分に出るま...
以上のような流れで交差点を右折する。
また、turn_right(int ?,int ?)としたとき、?は交差点認識...
例)交差点識別後、停止せずに交差点を右折し右側のライン...
turn_right(0,1);
sub turn_right(int cornerselect,int after_lineselect) //...
{
Wait(corner_wait*cornerselect);
while(sensor2<white-3){
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
while(sensor2>threshold){
OnFwd(OUT_A,corner_standardA);
OnRev(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
linetrace_release(afterselect_time,after_lineselect);
}
? 交差点識別後、左折しライントレースを開始する。
流れ、動作ともに、「? 交差点識別後、右折しライントレー...
sub turn_left(int cornerselect, int after_lineselect) //...
{
Wait(corner_wait*cornerselect);
while(sensor2<white-3){
OnFwd(OUT_A,corner_standardA);
OnRev(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
while(sensor2>threshold){
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
linetrace_release(afterselect_time,after_lineselect);
}
●交差点通過後ライン選択について(課題?の解決)
何度も述べているように、このプログラム上では交差点識別...
交差点通過後ライン選択とは、交差点を通過した後に左右ど...
-交差点通過後ライン選択の仕方
交差点通過後ライン選択では、「比例制御と5段階制御を組み...
「linetrace_release」では指定した時間の間、交差点認識の...
-結果
結果は、それまで交差点を通過した後に交差点だと誤認する...
**コップを入手する [#ofaf6564]
第3コースではコップを入手しライントレースに復帰するため...
今回、Uターンにおいても「電池残量に左右されない交差点の...
-動作の流れ
&ref(2017b/Member/yuitom/Mission2/robo_map5.jpg,80%,コッ...
コップを入手(画像での?)→基準線の乗るまで左へ曲がる(画...
以上のような、左回りの流れでUターンしていく。また、この...
sub get_cup() // コップの獲得
{
OnRev(OUT_A,corner_standardA); // 機首をコップに向ける
OnFwd(OUT_B,corner_standardB);
Wait(corner_time+120);
Off(OUT_AB);
Wait(1000);
catch // コップの獲得
PlaySound(SOUND_UP);
U_turn(); // Uターン
}
sub U_turn() // Uターン
{
while(sensor2<threshold){ // 基準線の乗るまで左へ曲...
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,20);
}
Off(OUT_AB);
Wait(500);
linetrace_release(500,1); // 少し前へ進む
while(sensor2<white-2){ // 白い部分に出るまで左旋回
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
while(sensor2>threshold){ // 基準線に乗るまで左旋回
OnRev(OUT_A,corner_standardA);
OnFwd(OUT_B,corner_standardB);
}
Off(OUT_AB);
Wait(500);
}
**コップのリリース [#nba6760a]
第三コースではX地点にコップを運搬し円の中にコップを配置...
また、この際も他のプログラムと同様に「電池残量に左右され...
-動作の流れ
&ref(2017b/Member/yuitom/Mission2/robo_map4.jpg,80%,コッ...
円の内側をたどりライントレース(時間制限)→白の部分に出る...
→黒のラインに完全に乗るまで後ろへ下がりつつ右回転(画像で...
→黒のラインに完全に乗るまで後退(画像での?)→白の部分に出...
という流れでコップを置いている。
sub put_cup(int after_lineselect) // コップリリース(行...
{
while(sensor2<white-2){ // 白の部分に出るまで後ろへ...
OnRev(OUT_A,corner_standardA);
}
Off(OUT_B);
Wait(250);
while(sensor2>threshold-10){ // 黒のラインに完全に乗...
OnRev(OUT_A,corner_standardA);
}
Off(OUT_AB);
Wait(250);
OnFwd(OUT_A,30); // 指定時間前進
OnFwd(OUT_B,30);
Wait(500);
Off(OUT_AB);
Wait(500);
release // コップのリリース
PlaySound(SOUND_DOWN);
while(sensor2>threshold-10){ // 黒のラインに完全に乗...
OnRev(OUT_A,30);
OnRev(OUT_B,30);
}
Off(OUT_AB);
while(sensor2<white-2){ // 白の部分に出るまで右回転
OnFwd(OUT_A,corner_standardA);
}
Off(OUT_B);
Wait(250);
while(sensor2>threshold){ // 基準線に乗るまで右回転
OnFwd(OUT_A,corner_standardA);
}
Off(OUT_AB);
linetrace_release(afterselect_time,after_lineselect)...
}
*第三コース攻略 [#z909bd72]
**コースの区画分け [#af3f5718]
&ref(2017b/Member/yuitom/Mission2/robo_map6.jpg,80%,コー...
今回、プログラミングをより訂正のしやすく、より見やすく...
? 第1ステージ(A→D→C→D) ポイント「コップの取得とUター...
? 第2ステージ(D→C→F) ポイント「F交差点の直進」
? 第3ステージ(F→E→R) ポイント「FE区間のs字カーブ」
? 第4ステージ(R→P→Q) ポイント「コップのリリース」
? 最終ステージ(Q→S→F→C→D) ポイント「4連続の直角カーブ」
それぞれのステージでの難点とそれに対する解決策を見てい...
? 第1ステージ(A→D→C→D)
-A→D 難点:A→B→C→Dのようにたどると、合計2つもの交差点が...
解決策:ラインの右側でなく左側をたどることで、A→Dまで一...
-D 難点:コップの取得とUターン
解決策:電池残量で動作に影響を及ぼさないようなプログラ...
sub the_first() // 第1ステージ コップの取得「A→D→C→D」
{
linetrace_restriction(-1); // A→D
get_cup(); // コップの獲得
}
? 第2ステージ(D→C→F)
-C 難点:DC区間の短さによるUターンの失敗
解決策:Uターンプログラムの改良(「少しの前進」を加える)
-F 難点:交差点直進後の動作の停止
解決策:原因はわからなかったが、おそらく電池の消耗によ...
sub the_second() // 第2ステージ コップの運搬「D→C→F」
{
linetrace_restriction(-1);
turn_left(0,1); // C
linetrace_restriction(1);
go_corner(1); // F
}
? 第3ステージ(F→E→R)
-F→E 難点:s字カーブでの交差点誤認識
解決策:「linetrace_release」を作成することで、指定した...
-E 難点:E左折後に毎回発生する交差点誤認識
解決策:「linetrace_release」を用いた行動終了後ライン選...
sub the_third() // 第3ステージ コップの運搬「F→E→R」
{
PlaySound(SOUND_CLICK);
linetrace_release(15000,1); // F→E途中地点
PlaySound(SOUND_LOW_BEEP);
linetrace_restriction(1); // E途中地点→E
turn_right(0,1); // E
linetrace_restriction(1);
OnFwd(OUT_AB,-30); // F
Wait(50);
Off(OUT_AB);
turn_left(1,1);
}
? 第4ステージ(R→P→Q)
-P 難点:Pの交差点での交差点識別機能の未反応
解決策:R→P→Qと円の外を回るのではなく、R→Qと円の内側を...
-P→Q 難点:コップのリリース
解決策:電池残量で動作に影響を及ぼさないようなプログラ...
sub the_fourth() // 第4ステージ コップの配置「R→P→Q」
{
PlaySound(SOUND_CLICK);
linetrace_release(5000,1); // R→コップ配置場所
Off(OUT_AB);
PlaySound(SOUND_LOW_BEEP);
Wait(500);
put_cup(-1); // コップの配置
linetrace_restriction(-1); // コップ配置場所→Q
}
? 最終ステージ(Q→S→F→C→D)
-Q,S,F,C 難点:交差点の右折左折後に頻繁に発生する交差点...
解決策:第3ステージと同様に、「linetrace_release」を用...
sub the_fifth() // 最終ステージ ゴール地点への移動「Q→S...
{
turn_left(0,-1); // Q
linetrace_restriction(-1);
turn_right(1,1); // S
linetrace_restriction(1);
turn_left(1,-1); // F
linetrace_restriction(-1);
turn_right(1,1); // C
linetrace_release(500,1);
finish // D ゴール
}
**task main()第三コース攻略 [#r927da9c]
上記の区画分け(第1〜最終ステージ)までを合わせたものが...
task main()
{
SetSensorLight(S2);
the_first();
the_second();
the_third();
the_fourth();
the_fifth();
}
*まとめ [#k872feae]
今回は、より安定した、より正確なライントレースを目指し...
そのため、私は今回の課題で「速く、正確に」の重要性を知...
今回、プログラミングが完成したのが本番ぎりぎりであった...
ページ名: