2018b/Member/twinrabi/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題2 [#k06b9c99]
-指定課題
--次のいずれかのコースで黒い線に沿って動き、途中でボール...
---使用コース見本
#ref(2018b-mission2.png,,コース見本[単位はcm]);
--第1コース
---ロボットを長方形X内におき、Aをスタート&br;Bを右折&br;K...
---(一時停止の指定がある場所は、1秒間停止すること)
---ボールはロボットが弧KJIH上にある時にQ地点の空き缶に当...
--第2コース
---ロボットを正方形X内におき、Lをスタート&br;Eを一時停止...
---(一時停止の指定がある場所は、1秒間停止すること)
---ボールはロボットが弧IHKJ上にある時にP地点の空き缶に当...
*実施コース [#pda1678f]
-自分は第1コースを選択したため、以下の赤線で示した道順を...
-また、課題で指定されている地点(矢印の終点)で1秒間停止す...
#ref(course-1.jpeg,,作成コース);
*作成ロボット [#v39571c6]
**全体像 [#t0addae2]
#ref(rbot-f-l.jpeg,,前 赤丸:超音波センサ 緑丸:光センサ):
#ref(robot-b-r.jpeg,,後):
モーターAで前方のアーム、モーターB・Cでそれぞれ右前輪・左...
-ライントレース部分
--固定前輪2輪と駆動後輪1輪の計3輪でライン上を移動する。
--車体前方下部に光センサを取り付け、明暗を測定する。&br;
-ボール投射部分
--車体前方上部に前方を向くように超音波センサを取り付け、...
--ボールをアームで固定し、投射時にはアームを上げることで...
#ref(throw-befor.jpeg,,保持状態);
CENTER:&size(30){ ⇓ };
#ref(throw-after.jpeg,,投射後);
-工夫
--最初の構想では、超音波センサ・ボール投射部分ともにロボ...
--時間で一回転旋回させるのは安定しなかったため、角度で行...
*動作説明 [#xb9cfeac]
**ライントレース [#ta649075]
今回は「光センサが線外に出た時線上に戻る」「光センサが線...
自分の実施コースにおいて光センサの値はおよそ[線外:55][線...
ゆえに、左の境目をトレースしている場合、線上に戻る時は右...
#ref(line.jpg,,線の拡大図 赤矢印:光センサの移動);
また、交差点や急なカーブにおいては片方の前輪を動かすだけ...
加えて交差点と急なカーブでは、交差点の方がより長く光セン...
**障害物探知 [#fa7737ae]
今回はボールを当てる空き缶がロボットに一番近い障害物であ...
ロボットを一回転させる方法として、まずロボットの前輪間の...
#ref(robot-over.jpeg,,青線:前輪間の距離 赤線:前輪が通る円...
そのようにしてロボットを回転させていき超音波センサが物体...
**動作時間の測定 [#i0ec7c09]
今回のプログラムでは3つの時間関数 t00,t0,t1 を定義、使用...
まず、t00にはロボットがライントレースを開始した時刻が代入...
次に、t0はロボットが直進を行うたびにその現在時刻が代入さ...
以上のように時間関数を定義し更新することで、各動作を持続...
このように{t1-t0}はロボットが右左折(旋回を含む)を継続し...
そのほかにも今回は{t00-t1}という式も使用しており、これ...
*使用プログラム [#peb4efde]
-使用マクロ
:#define fw Off(OUT_BC);OnFwd(OUT_BC,40);|直進する
:#define lt Off(OUT_BC);OnFwd(OUT_B,40);|左に曲がる
:#define rt Off(OUT_BC);OnFwd(OUT_C,40);|右に曲がる
:#define rrt Off(OUT_BC);OnFwd(OUT_C,25);OnFwd(OUT_B,-55)...
:#define llt Off(OUT_BC);OnFwd(OUT_B,25);OnFwd(OUT_C,-55)...
:#define throw_a RotateMotor(OUT_A,20,-40);Off(OUT_A);|ア...
-定義関数
:const float tire_diameter = 5.75;|前輪タイヤの直径
:const float tire_axis = 11.5;|前輪タイヤ間の距離
:long t0,t1,t00;|時間関数
:long ang_min,angle;|角度関数
**ライントレース [#l0c7c2b6]
左の境目をトレースする動作をl_line_trace、右の境目をトレ...
動作説明の通り{t1-t0}は右左折持続時間を示すので、その値...
void l_line_trace(long min){
t1=CurrentTick(); // 今その時の時刻
t0=CurrentTick(); // 直進終了・右左折開始時刻
SetSensorLight(S1); // 光センサ定義
SetSensorLowspeed(S2); // 超音波センサ定義
while(t1-t0<250|t1-t00<min){ // 光センサが一方に...
// 動き始めてからmin以...
if (SENSOR_1>50){ // 線外:白
if (t1-t0>150){ // 光センサが0.15s以上...
rrt;
}else{ // 右に曲がる
rt;}
}else if (SENSOR_1>40){ // 線の境目:灰
fw;
t0=CurrentTick(); // 曲がる時の初期時間...
}else{ // 線上:黒
if (t1-t0>150){ // 光センサが0.15s以上線...
llt;
}else{ // 左に曲がる
lt;}
}
t1=CurrentTick(); //今その時の時刻
}
Off(OUT_BC);
}
void r_line_trace(long min){
t1=CurrentTick(); // 今その時の時刻
t0=CurrentTick(); // 直進終了・右左折開始時刻
SetSensorLight(S1); // 光センサ定義
SetSensorLowspeed(S2); // 超音波センサ定義
while(t1-t0<250||t1-t00<min){ // 光センサが一方...
// 動き始めてからmin以...
if (SENSOR_1>50){ // 線外:白
if (t1-t0>150){ // 光センサが0.15s以上線...
llt;
}else{ // 左に曲がる
lt;}
}else if (SENSOR_1>40){ // 線の境目:灰
fw;
t0=CurrentTick(); // 曲がる時の初期時間...
}else{ // 線上:黒
if (t1-t0>150){ // 光センサが0.15s以上...
rrt;
}else{ // 右に曲がる
rt;}
}
t1=CurrentTick(); //今その時の時刻
}
Off(OUT_BC);
}
**障害物探知及びボール投射 [#i6942163]
暫定的に物体までの距離の最小値[int d_min]を長めに取ってお...
void search_throw(){
SetSensorLowspeed(S2);
int d_min=1000; //物体までの最小値
動作説明の通り(タイヤ間の距離[tire_diameter]/タイヤの直径...
ResetTachoCount(OUT_BC); //回転角リセット
OnFwdSync(OUT_BC,40,100); //時計回りに旋回
while(((tire_diameter/tire_axis)*MotorTachoCount(...
if(d_min>SensorUS(S2)){ //最小値が更新された時
d_min=SensorUS(S2); //最小値更新
angle=MotorTachoCount(OUT_C);//タイヤ回転...
}
}
Off(OUT_BC);
旋回開始を基準として、360度旋回するまでのタイヤの回転角度...
#ref(angle.jpg,,赤円:前輪が通る円 黄線:前輪が[angle]回転...
ang_min=MotorTachoCount(OUT_C)-angle;
ResetTachoCount(OUT_BC);
RotateMotorEx(OUT_BC, 40, ang_min, -100, true, tr...
Off(OUT_BC);
throw_a; //ボールを投げる
向きをもとに戻すときには旋回時とタイヤの回転を逆にしてい...
ResetTachoCount(OUT_BC);
RotateMotorEx(OUT_BC, 40, angle, -100, true, true...
Off(OUT_BC);
}
**プログラム全体 [#y108a7b0]
task main ()
{
t00=CurrentTick(); //ライントレース開始時刻
OnFwd(OUT_BC,20); //X内から出る
until(SENSOR_1<40);
Off(OUT_BC);
RotateMotor(OUT_BC,30,100); //線AB上に乗る
r_line_trace(7000); //右の境目を伝ってBを曲が...
llt; //Hの方を向いているのでIの方を向くように...
until(SENSOR_1<40);
Off(OUT_BC);
Wait(1000); //Kで一時停止
fw;
until(SENSOR_1>50);
Off(OUT_BC);
lt; //Jの方を向く
until(SENSOR_1<40);
Off(OUT_BC);
t00=CurrentTick(); //ライントレース開始時刻を...
r_line_trace(6500); //右の境目を伝って円を回る(...
search_throw(); //障害物探知及びボール投射
lt; //左の境目に移動
until(SENSOR_1<40); //線上
Off(OUT_BC);
lt;
until(SENSOR_1>50); //線外
Off(OUT_BC);
t00=CurrentTick();
l_line_trace(4000); //左の境目を伝ってHを左折...
Wait(1000); //Gで一時停止
fw; //Gを左折
until(SENSOR_1<40);
Off(OUT_BC);
rt;
until(SENSOR_1>50);
Off(OUT_BC);
t00=CurrentTick();
r_line_trace(26000); //右の境目を伝って急カー...
Wait(1000); //Eで一時停止
t00=CurrentTick();
r_line_trace(4000); //右の境目を伝ってEを右折...
lt; //Y内に入るため向きを調整
until(SENSOR_1<40);
Off(OUT_BC);
fw; //Y内に入る
Wait(1500);
Off(OUT_BC);
}
*感想 [#u05ba90a]
前回の課題1に比べて順調に進み、発表にも間に合い成功できた...
電池出力変動によってロボットの速度が変化することで、{一定...
ロボットを一回転旋回させるプログラムは相棒に頼り切りにな...
見返してみるとプログラム内のt00の更新は、void関数内に組み...
次回の課題はロボコンで、今回の課題の発展的なことを行うよ...
終了行:
目次
#contents
*課題2 [#k06b9c99]
-指定課題
--次のいずれかのコースで黒い線に沿って動き、途中でボール...
---使用コース見本
#ref(2018b-mission2.png,,コース見本[単位はcm]);
--第1コース
---ロボットを長方形X内におき、Aをスタート&br;Bを右折&br;K...
---(一時停止の指定がある場所は、1秒間停止すること)
---ボールはロボットが弧KJIH上にある時にQ地点の空き缶に当...
--第2コース
---ロボットを正方形X内におき、Lをスタート&br;Eを一時停止...
---(一時停止の指定がある場所は、1秒間停止すること)
---ボールはロボットが弧IHKJ上にある時にP地点の空き缶に当...
*実施コース [#pda1678f]
-自分は第1コースを選択したため、以下の赤線で示した道順を...
-また、課題で指定されている地点(矢印の終点)で1秒間停止す...
#ref(course-1.jpeg,,作成コース);
*作成ロボット [#v39571c6]
**全体像 [#t0addae2]
#ref(rbot-f-l.jpeg,,前 赤丸:超音波センサ 緑丸:光センサ):
#ref(robot-b-r.jpeg,,後):
モーターAで前方のアーム、モーターB・Cでそれぞれ右前輪・左...
-ライントレース部分
--固定前輪2輪と駆動後輪1輪の計3輪でライン上を移動する。
--車体前方下部に光センサを取り付け、明暗を測定する。&br;
-ボール投射部分
--車体前方上部に前方を向くように超音波センサを取り付け、...
--ボールをアームで固定し、投射時にはアームを上げることで...
#ref(throw-befor.jpeg,,保持状態);
CENTER:&size(30){ ⇓ };
#ref(throw-after.jpeg,,投射後);
-工夫
--最初の構想では、超音波センサ・ボール投射部分ともにロボ...
--時間で一回転旋回させるのは安定しなかったため、角度で行...
*動作説明 [#xb9cfeac]
**ライントレース [#ta649075]
今回は「光センサが線外に出た時線上に戻る」「光センサが線...
自分の実施コースにおいて光センサの値はおよそ[線外:55][線...
ゆえに、左の境目をトレースしている場合、線上に戻る時は右...
#ref(line.jpg,,線の拡大図 赤矢印:光センサの移動);
また、交差点や急なカーブにおいては片方の前輪を動かすだけ...
加えて交差点と急なカーブでは、交差点の方がより長く光セン...
**障害物探知 [#fa7737ae]
今回はボールを当てる空き缶がロボットに一番近い障害物であ...
ロボットを一回転させる方法として、まずロボットの前輪間の...
#ref(robot-over.jpeg,,青線:前輪間の距離 赤線:前輪が通る円...
そのようにしてロボットを回転させていき超音波センサが物体...
**動作時間の測定 [#i0ec7c09]
今回のプログラムでは3つの時間関数 t00,t0,t1 を定義、使用...
まず、t00にはロボットがライントレースを開始した時刻が代入...
次に、t0はロボットが直進を行うたびにその現在時刻が代入さ...
以上のように時間関数を定義し更新することで、各動作を持続...
このように{t1-t0}はロボットが右左折(旋回を含む)を継続し...
そのほかにも今回は{t00-t1}という式も使用しており、これ...
*使用プログラム [#peb4efde]
-使用マクロ
:#define fw Off(OUT_BC);OnFwd(OUT_BC,40);|直進する
:#define lt Off(OUT_BC);OnFwd(OUT_B,40);|左に曲がる
:#define rt Off(OUT_BC);OnFwd(OUT_C,40);|右に曲がる
:#define rrt Off(OUT_BC);OnFwd(OUT_C,25);OnFwd(OUT_B,-55)...
:#define llt Off(OUT_BC);OnFwd(OUT_B,25);OnFwd(OUT_C,-55)...
:#define throw_a RotateMotor(OUT_A,20,-40);Off(OUT_A);|ア...
-定義関数
:const float tire_diameter = 5.75;|前輪タイヤの直径
:const float tire_axis = 11.5;|前輪タイヤ間の距離
:long t0,t1,t00;|時間関数
:long ang_min,angle;|角度関数
**ライントレース [#l0c7c2b6]
左の境目をトレースする動作をl_line_trace、右の境目をトレ...
動作説明の通り{t1-t0}は右左折持続時間を示すので、その値...
void l_line_trace(long min){
t1=CurrentTick(); // 今その時の時刻
t0=CurrentTick(); // 直進終了・右左折開始時刻
SetSensorLight(S1); // 光センサ定義
SetSensorLowspeed(S2); // 超音波センサ定義
while(t1-t0<250|t1-t00<min){ // 光センサが一方に...
// 動き始めてからmin以...
if (SENSOR_1>50){ // 線外:白
if (t1-t0>150){ // 光センサが0.15s以上...
rrt;
}else{ // 右に曲がる
rt;}
}else if (SENSOR_1>40){ // 線の境目:灰
fw;
t0=CurrentTick(); // 曲がる時の初期時間...
}else{ // 線上:黒
if (t1-t0>150){ // 光センサが0.15s以上線...
llt;
}else{ // 左に曲がる
lt;}
}
t1=CurrentTick(); //今その時の時刻
}
Off(OUT_BC);
}
void r_line_trace(long min){
t1=CurrentTick(); // 今その時の時刻
t0=CurrentTick(); // 直進終了・右左折開始時刻
SetSensorLight(S1); // 光センサ定義
SetSensorLowspeed(S2); // 超音波センサ定義
while(t1-t0<250||t1-t00<min){ // 光センサが一方...
// 動き始めてからmin以...
if (SENSOR_1>50){ // 線外:白
if (t1-t0>150){ // 光センサが0.15s以上線...
llt;
}else{ // 左に曲がる
lt;}
}else if (SENSOR_1>40){ // 線の境目:灰
fw;
t0=CurrentTick(); // 曲がる時の初期時間...
}else{ // 線上:黒
if (t1-t0>150){ // 光センサが0.15s以上...
rrt;
}else{ // 右に曲がる
rt;}
}
t1=CurrentTick(); //今その時の時刻
}
Off(OUT_BC);
}
**障害物探知及びボール投射 [#i6942163]
暫定的に物体までの距離の最小値[int d_min]を長めに取ってお...
void search_throw(){
SetSensorLowspeed(S2);
int d_min=1000; //物体までの最小値
動作説明の通り(タイヤ間の距離[tire_diameter]/タイヤの直径...
ResetTachoCount(OUT_BC); //回転角リセット
OnFwdSync(OUT_BC,40,100); //時計回りに旋回
while(((tire_diameter/tire_axis)*MotorTachoCount(...
if(d_min>SensorUS(S2)){ //最小値が更新された時
d_min=SensorUS(S2); //最小値更新
angle=MotorTachoCount(OUT_C);//タイヤ回転...
}
}
Off(OUT_BC);
旋回開始を基準として、360度旋回するまでのタイヤの回転角度...
#ref(angle.jpg,,赤円:前輪が通る円 黄線:前輪が[angle]回転...
ang_min=MotorTachoCount(OUT_C)-angle;
ResetTachoCount(OUT_BC);
RotateMotorEx(OUT_BC, 40, ang_min, -100, true, tr...
Off(OUT_BC);
throw_a; //ボールを投げる
向きをもとに戻すときには旋回時とタイヤの回転を逆にしてい...
ResetTachoCount(OUT_BC);
RotateMotorEx(OUT_BC, 40, angle, -100, true, true...
Off(OUT_BC);
}
**プログラム全体 [#y108a7b0]
task main ()
{
t00=CurrentTick(); //ライントレース開始時刻
OnFwd(OUT_BC,20); //X内から出る
until(SENSOR_1<40);
Off(OUT_BC);
RotateMotor(OUT_BC,30,100); //線AB上に乗る
r_line_trace(7000); //右の境目を伝ってBを曲が...
llt; //Hの方を向いているのでIの方を向くように...
until(SENSOR_1<40);
Off(OUT_BC);
Wait(1000); //Kで一時停止
fw;
until(SENSOR_1>50);
Off(OUT_BC);
lt; //Jの方を向く
until(SENSOR_1<40);
Off(OUT_BC);
t00=CurrentTick(); //ライントレース開始時刻を...
r_line_trace(6500); //右の境目を伝って円を回る(...
search_throw(); //障害物探知及びボール投射
lt; //左の境目に移動
until(SENSOR_1<40); //線上
Off(OUT_BC);
lt;
until(SENSOR_1>50); //線外
Off(OUT_BC);
t00=CurrentTick();
l_line_trace(4000); //左の境目を伝ってHを左折...
Wait(1000); //Gで一時停止
fw; //Gを左折
until(SENSOR_1<40);
Off(OUT_BC);
rt;
until(SENSOR_1>50);
Off(OUT_BC);
t00=CurrentTick();
r_line_trace(26000); //右の境目を伝って急カー...
Wait(1000); //Eで一時停止
t00=CurrentTick();
r_line_trace(4000); //右の境目を伝ってEを右折...
lt; //Y内に入るため向きを調整
until(SENSOR_1<40);
Off(OUT_BC);
fw; //Y内に入る
Wait(1500);
Off(OUT_BC);
}
*感想 [#u05ba90a]
前回の課題1に比べて順調に進み、発表にも間に合い成功できた...
電池出力変動によってロボットの速度が変化することで、{一定...
ロボットを一回転旋回させるプログラムは相棒に頼り切りにな...
見返してみるとプログラム内のt00の更新は、void関数内に組み...
次回の課題はロボコンで、今回の課題の発展的なことを行うよ...
ページ名: