2018b/Member/Daisuke/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*課題2(第1コース) [#n2ab6bc0]
#contents
下の図のようなコースを各チームで作成し、「ミッション」を...
**ミッション [#j6a6c3cd]
次のいずれかのコースで黒い線に沿って動き、途中でボールを...
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=...
+ロボットを長方形X内におき、Aをスタート
+Bを右折
+Kで一時停止して左折
+Jを直進
+Iを直進
+Hを左折
+Gで一時停止して左折
+Eで一時停止して右折
+Lを経て正方形Y内に入って停止
(一時停止の指定がある場所は、1秒間停止すること)
ボールはロボットが弧IHKJ上にある時にQ地点の空き缶に当てる
*ロボットの説明[#sd3ebdf4]
**全体像 [#s5157bea]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pc...
***説明(工夫した点や反省点) [#x078071a]
車体自体は参考書のサンプルを基本とすることで安定した動き...
それによって急なカーブをより良い精度で通過できるようにな...
**各種センサーの位置 [#a9f92a47]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pc...
***説明(工夫した点や反省点) [#a51e9743]
超音波センサーをアームや光センサーの邪魔にならない程度で...
光センサーをタイヤの近くに設置することで急なカーブの成功...
タッチセンサーは、今回の課題においてボールを探すことから...
**ボールを缶に充てる方法 [#veba20c6]
缶の方向を向いた後にアームを上げ、少しスピードをつけて前...
***ほかのグループの方法を見て
ボールを車体に乗せて、ボールを保持している位置と地面との...
*プログラムについて [#t8183ddf]
**基本動作に関する定義 [#gd0a5a5e]
#define THRESHOLD 54 [#o897b273]
#define SPEED 30
#define speed 20
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT...
#define LEFT OnRL(speed,-speed);
#define left OnRL(speed,0);
#define straight OnRL(SPEED,SPEED);
#define right OnRL(0,speed);
#define RIGHT OnRL(-speed,speed);
#define STEP 1
#define nMAX 300
#define short_break Off(OUT_BC);Wait(1000);
#define CROSS_TIME 700
#define cross_line OnFwd(OUT_BC,speed);Wait(CROSS_TIME);s...
#define turn_time 3000
#define turn_left LEFT;Wait(turn_time);short_break;
#define turn_right RIGHT;Wait(turn_time);short_break;
#define kaiten OnRL(SPEED,-SPEED);
#define kaiten_time 5500
#define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A);
**まとまった動作に関する定義 [#ja1f6d69]
***ラインの右側トレース時に交差点を判断して一時停止した後...
sub kousaten_trace()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) { //黒...
if (SENSOR_3 < THRESHOLD-10) {
RIGHT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {right;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {left;}
else {LEFT;}
nOnline=0;}
Wait(STEP);
}
short_break;
LEFT;
Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
***ラインの左側トレース時に交差点を判断して一時停止した後...
sub kousaten_usetsu(){
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) { //黒を認識...
if (SENSOR_3 < THRESHOLD-8) {
LEFT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {left;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {right;}
else {RIGHT;}
nOnline=0;}
Wait(STEP);
}
short_break;
RIGHT;
Wait(nMAX*STEP);
turn_right;
nOnline=0;
}
***ラインの左側トレース時に交差点を判断したら1秒間停止し...
sub kousaten_teishi()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-8) {
LEFT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {left;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {right;}
else {RIGHT;}
nOnline=0;}
Wait(STEP);
}
short_break;
nOnline=0;
}
***360°回転して障害物(缶)を見つけ出しその方向に向かうサブ...
sub serch_kan()
{
SetSensorLowspeed(S4);
long t10,t11;
int L=10000; //仮の最小値
t10=CurrentTick(); //回転前の時刻
while(CurrentTick()-t10<=kaiten_time){
OnRL(speed,-speed);
if(SensorUS(S4)<L)
{
L=SensorUS(S4);
t11=CurrentTick()-t10; //仮の最小値より近いものを...
}
}
OnRL(-speed,speed);
Wait(kaiten_time-t11);
Off(OUT_BC);
}
***シュート(体当たり)をするサブルーチン関数 [#lb6d2652]
sub shoot(){
arm_up;
OnFwd(OUT_BC,100);
Wait(200);
Off(OUT_BC);
}
**今後このプログラムを簡単に、見やすく、効率的なものに書...
※このサブルーチン関数はチームで話し合われた結果、結局使用...
***黒線の右側をトレースするサブルーチン関数[#mc631e28]
sub line_trace_R()
{
while (true) {
if(SENSOR_3<THRESHOLD-8){RIGHT;}
else if(SENSOR_3<THRESHOLD-3){right;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){left;}
else{LEFT;}
Wait(STEP);
}
***黒線の左側をトレースするサブルーチン関数[#m060bc2b]
sub line_trace_L()
{
while (true) {
if(SENSOR_3<THRESHOLD-8){LEFT;}
else if(SENSOR_3<THRESHOLD-3){left;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){right;}
else{RIGHT;}
Wait(STEP);
}
***黒線の右側トレース時に交差点で一時停止して横断するサブ...
sub kousaten_trace_R()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-10) {
RIGHT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {right;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {left;}
else {LEFT;}
nOnline=0;}
Wait(STEP);
}
short_break;
LEFT;
Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
***黒線の左側トレース時に交差点で一時停止して横断するサブ...
sub kousaten_trace_L()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-10) {
LEFT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {left;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {right;}
else {RIGHT;}
nOnline=0;}
Wait(STEP);
}
short_break;
RIGHT;
Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
***黒線の右側トレース時に一時停止して左折するサブルーチン...
sub kousaten_sasetsu_R()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-8) {
RIGHT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {right;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {left;}
else {LEFT;}
nOnline=0;}
Wait(STEP);
}
short_break;
LEFT;
Wait(nMAX*STEP);
turn_left;
nOnline=0;
}
***黒線の左側トレース時に一時停止して右折するサブルーチン...
sub kousaten_usetsu_L()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-8) {
LEFT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {left;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {right;}
else {RIGHT;}
nOnline=0;}
Wait(STEP);
}
short_break;
RIGHT;
Wait(nMAX*STEP);
turn_right;
nOnline=0;
}
**メインのプログラム [#g73aba0b]
task main()
{
SetSensorLight(S3);
SetSensorLowspeed(S4);
long t0,t1,t2,t3; //それぞれの時間を定義
t0=CurrentTick(); //スタートした時間をt0とする
while(CurrentTick()-t0<=15000){ //15秒間ライ...
if(SENSOR_3<THRESHOLD-8){RIGHT;}
else if(SENSOR_3<THRESHOLD-3){right;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){left;}
else{LEFT;}
Wait(STEP);
}
kousaten_trace(); //交差点Kを発見したら横断
t1=CurrentTick(); //K地点を横断したらその時間をt1...
while(CurrentTick()-t1<=15000){ //15秒間ライ...
if(SENSOR_3<THRESHOLD-8){RIGHT;}
else if(SENSOR_3<THRESHOLD-3){right;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){left;}
else{LEFT;}
Wait(STEP);
}
serch_kan(); //缶を探す。見つけたらボールに体当た...
shoot();
t2=CurrentTick();
while(CurrentTick()-t2<=18000){
if(SENSOR_3<THRESHOLD-8){LEFT;}
else if(SENSOR_3<THRESHOLD-3){left;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){right;}
else{RIGHT;}
Wait(STEP);
}
kousaten_teishi(); //交差点Gを発見したら一時停止
t3=CurrentTick(); //地点Gを出発する時間をt3とする
while(CurrentTick()-t3<=40000){ //40秒間ライ...
if(SENSOR_3<THRESHOLD-8){LEFT;}
else if(SENSOR_3<THRESHOLD-3){left;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){right;}
else{RIGHT;}
Wait(STEP);
}
kousaten_usetsu(); //交差点Eを発見したら右折
kousaten_trace(); //交差点Lを発見したら横断
OnFwd(OUT_BC,SPEED); 前進して枠内に入る
Wait(2000);
Off(OUT_BC);
}
**右側トレースと左側トレースの分割図 [#tf38eae7]
#ref(IMG_4977_LI.jpg)
**ライントレースのプログラムに関する説明 [#ha70b48b]
交差点判断をしないライントレースについては白から黒の色の...
**プログラムに関する説明と反省 [#e79adcd4]
結局チームで話し合った結果、ラインの右側をトレースするサ...
基本的にはタイマーで時間を計りながら交差点判断をするかし...
*感想 [#z1ea2fc1]
課題1の時と比べてかなりプログラムも改善されたとは思うが...
終了行:
*課題2(第1コース) [#n2ab6bc0]
#contents
下の図のようなコースを各チームで作成し、「ミッション」を...
**ミッション [#j6a6c3cd]
次のいずれかのコースで黒い線に沿って動き、途中でボールを...
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=...
+ロボットを長方形X内におき、Aをスタート
+Bを右折
+Kで一時停止して左折
+Jを直進
+Iを直進
+Hを左折
+Gで一時停止して左折
+Eで一時停止して右折
+Lを経て正方形Y内に入って停止
(一時停止の指定がある場所は、1秒間停止すること)
ボールはロボットが弧IHKJ上にある時にQ地点の空き缶に当てる
*ロボットの説明[#sd3ebdf4]
**全体像 [#s5157bea]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pc...
***説明(工夫した点や反省点) [#x078071a]
車体自体は参考書のサンプルを基本とすることで安定した動き...
それによって急なカーブをより良い精度で通過できるようにな...
**各種センサーの位置 [#a9f92a47]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pc...
***説明(工夫した点や反省点) [#a51e9743]
超音波センサーをアームや光センサーの邪魔にならない程度で...
光センサーをタイヤの近くに設置することで急なカーブの成功...
タッチセンサーは、今回の課題においてボールを探すことから...
**ボールを缶に充てる方法 [#veba20c6]
缶の方向を向いた後にアームを上げ、少しスピードをつけて前...
***ほかのグループの方法を見て
ボールを車体に乗せて、ボールを保持している位置と地面との...
*プログラムについて [#t8183ddf]
**基本動作に関する定義 [#gd0a5a5e]
#define THRESHOLD 54 [#o897b273]
#define SPEED 30
#define speed 20
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT...
#define LEFT OnRL(speed,-speed);
#define left OnRL(speed,0);
#define straight OnRL(SPEED,SPEED);
#define right OnRL(0,speed);
#define RIGHT OnRL(-speed,speed);
#define STEP 1
#define nMAX 300
#define short_break Off(OUT_BC);Wait(1000);
#define CROSS_TIME 700
#define cross_line OnFwd(OUT_BC,speed);Wait(CROSS_TIME);s...
#define turn_time 3000
#define turn_left LEFT;Wait(turn_time);short_break;
#define turn_right RIGHT;Wait(turn_time);short_break;
#define kaiten OnRL(SPEED,-SPEED);
#define kaiten_time 5500
#define arm_up OnRev(OUT_A,SPEED);Wait(500);Off(OUT_A);
**まとまった動作に関する定義 [#ja1f6d69]
***ラインの右側トレース時に交差点を判断して一時停止した後...
sub kousaten_trace()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) { //黒...
if (SENSOR_3 < THRESHOLD-10) {
RIGHT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {right;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {left;}
else {LEFT;}
nOnline=0;}
Wait(STEP);
}
short_break;
LEFT;
Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
***ラインの左側トレース時に交差点を判断して一時停止した後...
sub kousaten_usetsu(){
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) { //黒を認識...
if (SENSOR_3 < THRESHOLD-8) {
LEFT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {left;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {right;}
else {RIGHT;}
nOnline=0;}
Wait(STEP);
}
short_break;
RIGHT;
Wait(nMAX*STEP);
turn_right;
nOnline=0;
}
***ラインの左側トレース時に交差点を判断したら1秒間停止し...
sub kousaten_teishi()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-8) {
LEFT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {left;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {right;}
else {RIGHT;}
nOnline=0;}
Wait(STEP);
}
short_break;
nOnline=0;
}
***360°回転して障害物(缶)を見つけ出しその方向に向かうサブ...
sub serch_kan()
{
SetSensorLowspeed(S4);
long t10,t11;
int L=10000; //仮の最小値
t10=CurrentTick(); //回転前の時刻
while(CurrentTick()-t10<=kaiten_time){
OnRL(speed,-speed);
if(SensorUS(S4)<L)
{
L=SensorUS(S4);
t11=CurrentTick()-t10; //仮の最小値より近いものを...
}
}
OnRL(-speed,speed);
Wait(kaiten_time-t11);
Off(OUT_BC);
}
***シュート(体当たり)をするサブルーチン関数 [#lb6d2652]
sub shoot(){
arm_up;
OnFwd(OUT_BC,100);
Wait(200);
Off(OUT_BC);
}
**今後このプログラムを簡単に、見やすく、効率的なものに書...
※このサブルーチン関数はチームで話し合われた結果、結局使用...
***黒線の右側をトレースするサブルーチン関数[#mc631e28]
sub line_trace_R()
{
while (true) {
if(SENSOR_3<THRESHOLD-8){RIGHT;}
else if(SENSOR_3<THRESHOLD-3){right;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){left;}
else{LEFT;}
Wait(STEP);
}
***黒線の左側をトレースするサブルーチン関数[#m060bc2b]
sub line_trace_L()
{
while (true) {
if(SENSOR_3<THRESHOLD-8){LEFT;}
else if(SENSOR_3<THRESHOLD-3){left;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){right;}
else{RIGHT;}
Wait(STEP);
}
***黒線の右側トレース時に交差点で一時停止して横断するサブ...
sub kousaten_trace_R()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-10) {
RIGHT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {right;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {left;}
else {LEFT;}
nOnline=0;}
Wait(STEP);
}
short_break;
LEFT;
Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
***黒線の左側トレース時に交差点で一時停止して横断するサブ...
sub kousaten_trace_L()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-10) {
LEFT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {left;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {right;}
else {RIGHT;}
nOnline=0;}
Wait(STEP);
}
short_break;
RIGHT;
Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
***黒線の右側トレース時に一時停止して左折するサブルーチン...
sub kousaten_sasetsu_R()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-8) {
RIGHT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {right;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {left;}
else {LEFT;}
nOnline=0;}
Wait(STEP);
}
short_break;
LEFT;
Wait(nMAX*STEP);
turn_left;
nOnline=0;
}
***黒線の左側トレース時に一時停止して右折するサブルーチン...
sub kousaten_usetsu_L()
{
SetSensorLight(S3);
int nOnline=0;
while (nOnline < nMAX) {
if (SENSOR_3 < THRESHOLD-8) {
LEFT;
nOnline++;}
else {
if (SENSOR_3 < THRESHOLD-3) {left;}
else if (SENSOR_3 < THRESHOLD+2) {straight;}
else if (SENSOR_3 < THRESHOLD+6) {right;}
else {RIGHT;}
nOnline=0;}
Wait(STEP);
}
short_break;
RIGHT;
Wait(nMAX*STEP);
turn_right;
nOnline=0;
}
**メインのプログラム [#g73aba0b]
task main()
{
SetSensorLight(S3);
SetSensorLowspeed(S4);
long t0,t1,t2,t3; //それぞれの時間を定義
t0=CurrentTick(); //スタートした時間をt0とする
while(CurrentTick()-t0<=15000){ //15秒間ライ...
if(SENSOR_3<THRESHOLD-8){RIGHT;}
else if(SENSOR_3<THRESHOLD-3){right;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){left;}
else{LEFT;}
Wait(STEP);
}
kousaten_trace(); //交差点Kを発見したら横断
t1=CurrentTick(); //K地点を横断したらその時間をt1...
while(CurrentTick()-t1<=15000){ //15秒間ライ...
if(SENSOR_3<THRESHOLD-8){RIGHT;}
else if(SENSOR_3<THRESHOLD-3){right;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){left;}
else{LEFT;}
Wait(STEP);
}
serch_kan(); //缶を探す。見つけたらボールに体当た...
shoot();
t2=CurrentTick();
while(CurrentTick()-t2<=18000){
if(SENSOR_3<THRESHOLD-8){LEFT;}
else if(SENSOR_3<THRESHOLD-3){left;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){right;}
else{RIGHT;}
Wait(STEP);
}
kousaten_teishi(); //交差点Gを発見したら一時停止
t3=CurrentTick(); //地点Gを出発する時間をt3とする
while(CurrentTick()-t3<=40000){ //40秒間ライ...
if(SENSOR_3<THRESHOLD-8){LEFT;}
else if(SENSOR_3<THRESHOLD-3){left;}
else if(SENSOR_3<THRESHOLD+2){straight;}
else if(SENSOR_3<THRESHOLD+6){right;}
else{RIGHT;}
Wait(STEP);
}
kousaten_usetsu(); //交差点Eを発見したら右折
kousaten_trace(); //交差点Lを発見したら横断
OnFwd(OUT_BC,SPEED); 前進して枠内に入る
Wait(2000);
Off(OUT_BC);
}
**右側トレースと左側トレースの分割図 [#tf38eae7]
#ref(IMG_4977_LI.jpg)
**ライントレースのプログラムに関する説明 [#ha70b48b]
交差点判断をしないライントレースについては白から黒の色の...
**プログラムに関する説明と反省 [#e79adcd4]
結局チームで話し合った結果、ラインの右側をトレースするサ...
基本的にはタイマーで時間を計りながら交差点判断をするかし...
*感想 [#z1ea2fc1]
課題1の時と比べてかなりプログラムも改善されたとは思うが...
ページ名: