- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*課題について [#a47a085e]
詳細はこちら[[2019a/Mission3]]
*ロボットについて [#gb9d2e77]
**ピンポン玉を運ぶ [#u59512b4]
アームはL(L')のボールを直接つかむものとGHIJ(G'H'I'J')のボールをプラ容器ごとつかむものの2つとした.
#ref(IMG_4076.jpeg)
#ref()
**線に沿っての移動 [#b3b16030]
センサを2つ前部に設置し,またその2つのセンサ同士の距離もできるだけ狭めることでより精密にフィールドの線を辿るようにした.
#ref(IMG_4075.jpg)
*プログラムについて [#edc022db]
**基本動作の定義 [#xf9a2829]
課題3において必要となる基本動作のプログラムを以下のように定義した.
**玉を運ぶ [#u59512b4]
玉を運ぶためには
設置された玉を拾い運ぶためにはフィールド上での移動を停止したところでアームを動かし,玉を掴み終えた時点で再び移動し始める必要がある.そのためタイヤを動かすNXTとアームを動かすNXTで連携させる必要がある.
**線に沿っての移動 [#b3b16030]
まずロボットの基本的な動きを以下のように定義する
まず数値・ロボットの基本的な動きを以下のように定義する
#define step1 38
#define step2 45
#define step3 53
#define step4 60
#define step5 68
#define left0 OnFwd(OUT_A,60);OnRev(OUT_B,60);
#define left1 OnFwd(OUT_A,60);Off(OUT_B);
#define right0 OnFwd(OUT_B,60);OnRev(OUT_A,90);
#define right1 OnFwd(OUT_B,60);Off(OUT_A);
#define forward OnFwd(OUT_AB,60);
#define back OnRev(OUT_AB,60);
sub follow_line_left()
{
SetSensorLight(S1);
SetSensorLight(S2);
long t0=0,t1=0,st=1;
定義した動作をまとめると下の通りになる.
while(t1-t0<st){
if((SENSOR_1<step1)&&(SENSOR_2<step1)){
t0=CurrentTick();
forward;
until((SENSOR_1<step3)&&(SENSOR_2<step3));
t1=CurrentTick();
}else if(SENSOR_1<step1){
left0;
}else if(SENSOR_1<step2){
left1;
}else if(SENSOR_1<step3){
forward;
}else if(SENSOR_1<step4){
right1;
}else if(SENSOR_1<step5){
right0;
}
}
Off(OUT_AB);
Wait(1000);
}
|プログラム名|内容|
|left0|左旋回|
|left1|左折|
|right0|右旋回|
|right1|右折|
|forward|直進|
sub follow_line_right()
{
SetSensorLight(S1);
SetSensorLight(S2);
long t0=0,t1=0,st=1;
while(t1-t0<st){
if((SENSOR_1<step1)&&(SENSOR_2<step1)){
t0=CurrentTick();
forward;
until((SENSOR_1<step3)&&(SENSOR_2<step3));
t1=CurrentTick();
}else if(SENSOR_2<step1){
right0;
}else if(SENSOR_2<step2){
right1;
}else if(SENSOR_2<step3){
forward;
}else if(SENSOR_2<step4){
left1;
}else if(SENSOR_2<step5){
left0;
}
}
Off(OUT_AB);
Wait(1000);
}
#define step1 45
#define step2 53
#define step3 61
#define step4 69
#define step5 75
sub follow_line_back()
{
SetSensorLight(S1);
SetSensorLight(S2);
long t0=0,t1=0,st=1;
while(t1-t0<st){
if((SENSOR_1<step1)&&(SENSOR_2<step1)){
t0=CurrentTick();
back;
until((SENSOR_1<step3)&&(SENSOR_2<step3));
t1=CurrentTick();
}else if(SENSOR_2<step1){
right0;
}else if(SENSOR_2<step2){
right1;
}else if(SENSOR_2<step3){
back;
}else if(SENSOR_2<step4){
left1;
}else if(SENSOR_2<step5){
left0;
}
}
Off(OUT_AB);
Wait(1000);
}
線の左右の淵に沿って移動するプログラムは以下のとおりである.ミッションより丁字路でロボットは一時停止しなければならないため,コース上ロボットは場所によって線の左右どちらの境界も辿れるようにしなければならない.ここでは線の左側を辿るサブルーチンをline_left,右側を辿るサブルーチンをline_rightとした.
sub start_right()
{
right;
Wait(100);
}
sub start_left()
{
left;
Wait(100);
}
sub across()
{
SetSensorLight(S1);
SetSensorLight(S2);
long t0=0,t1=0,st=1;
while(t1-t0<st){
if((SENSOR_1<step1)&&(SENSOR_2<step1)){
t0=CurrentTick();
forward;
until((SENSOR_1<step3)&&(SENSOR_2<step3));
t1=CurrentTick();
}else if(SENSOR_1<step5){
forward;
}
}
Off(OUT_AB);
Wait(1000);
}
.
sub line_left() //線の左側を走行するプログラム
{
SetSensorLight(S3);//光センサを起動
long t0=0,t1=0,tm=1;//交差点認識の為に時間を定義
while(t1-t0<tm){ //交差点でない時は実行するプログラム
if(SENSOR_3<step1){ //線中央にあるとき
left0;t0=CurrentTick(); //左旋回し時間を計測
until(SENSOR_3<step3); //境界を認識するまで続ける
t1=CurrentTick(); //旋回した時間を計測
}else if(SENSOR_3<step2){ //線上に入ったとき
left1; //左折する
}else if(SENSOR_3<step3){ //境界上にあるとき
forward; //直進する
}else if(SENSOR_3<step4){ //線から外れたとき
right1; //右折する
}else if(SENSOR_3<step5){ //完全に線から外れたとき
right0; //右折する
}
} //交差点に入ったとき
Off(OUT_AB); //停止する(1秒間)
Wait(1000);
}
sub line_right() //線の右側を走行するプログラム
{
SetSensorLight(S3);//光センサを起動
long t0=0,t1=0,tm=1;//交差点認識の為に時間を定義
while(t1-t0<tm){ //交差点でない時は実行するプログラム
if(SENSOR_3<step1){ //線中央にあるとき
right0; t0=CurrentTick(); //右旋回し時間を計測
until(SENSOR_3<step3); //境界を認識するまで続ける
t1=CurrentTick(); //旋回した時間を計測
}else if(SENSOR_3<step2){ //線上にあるとき
right1; //右折する
}else if(SENSOR_3<step3){ //境界上にあるとき
forward; //直進する
}else if(SENSOR_3<step4){ //線から外れたとき
left1; //左折する
}else if(SENSOR_3<step5){ //完全に線から離れたとき
left0; //左旋回する
}
} //交差点にある時
Off(OUT_AB); //停止する(1秒間)
Wait(1000);
}
**コースを走るプログラム [#c80fddce]
#define step1 45
#define step2 53
#define step3 61
#define step4 69
#define step5 75
#define left0 OnFwd(OUT_A,20);OnRev(OUT_B,20);
#define left1 OnFwd(OUT_A,20);Off(OUT_B);
#define right0 OnFwd(OUT_B,20);OnRev(OUT_A,20);
#define right1 OnFwd(OUT_B,20);Off(OUT_A);
#define forward OnFwd(OUT_AB,20);
#define up OnRev(OUT_C,20);Wait(500);Off(OUT_C);
#define down OnFwd(OUT_C,20);Wait(500);Off(OUT_C);
sub line_left()
{
SetSensorLight(S3);
long t0=0,t1=0,tm=15;
while(t1-t0<tm){
if(SENSOR_3<step1){
t0=CurrentTick();
left0;until(SENSOR_3<step3);
t1=CurrentTick();
}else if(SENSOR_3<step2){
left1;
}else if(SENSOR_3<step3){
forward;
}else if(SENSOR_3<step4){
right1;
}else if(SENSOR_3<step5){
right0;
}
}
Off(OUT_AB);
Wait(1000);
}
sub line_right()
{
SetSensorLight(S3);
long t0=0,t1=0,tm=15;
while(t1-t0<tm){
if(SENSOR_3<step1){
t0=CurrentTick();
right0; until(SENSOR_3<step3);
t1=CurrentTick();
}else if(SENSOR_3<step2){
right1;
}else if(SENSOR_3<step3){
forward;
}else if(SENSOR_3<step4){
left1;
}else if(SENSOR_3<step5){
left0;
}
}
Off(OUT_AB);
Wait(1000);
}
task main()
{
long t=1000; //交差点で停止後に進む時間をt=1秒とする
forward; //Aから出発
Wait(1000);
line_left(); //MからKまで進みKで停止
forward; //交差点を直進
Wait(t);
line_left(); //KからLまで進みKで停止
up; //ピンポン玉を拾う
left0; //Lで回転し方向転換
Wait(2000);
line_right(); //LからKまで進みKで停止
right0; //Lで回転し方向転換
Wait(t);
line_right(); //KからJまで進みJで停止
left1; //Jで回転
Wait(t);
line_left(); //JからIまで進みIで停止
repeat(2){
forward; //丁字路を直進
Wait(t);
line_left(); //コースを進む
} //IからH,HからGまで進みGで停止
forward; //丁字路を直進
Wait(t);
line_right(); //GからF,Eを通りDまで進みDで停止
forward; //交差点を直進
line_right(); //DからCを通りBまで進みBで停止
down; //ピンポン玉を置く
OnRev(OUT_AB,20); //後進
Wait(500);
OnFwd(OUT_AB,100); //勢いをつけてボールに接触,シュート
Wait(t);
Off(OUT_AB);//静止
}
*まとめ [#b0ca178b]