2018b/Member/Jerry/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題3:ボール運搬ロボット[#l3956274]
青と赤のボールを運搬して、それぞれ所定の350ml缶の上に乗せ...
&ref(2018b/Member/Jerry/Mission3/cource3.jpg,75%,課題3の...
-フィールドの説明
--フィールドは課題2で使用した紙を使用する。
--350ml缶(中が入っていても空でよい)は逆さまにして使い、ロ...
--その番号の次の番号のところにもダミーの缶を置くことがで...
--空き缶には色をつけたり文字や記号を書いてもよい。あるい...
--赤と青のボールは、図のように所定の場所に置いておく。そ...
**ルール [#vb163c4f]
-基本ルール
--競技時間は審判が続行不能と判断するまで、あるいはリタイ...
--図のX地点または(および)Y地点からスタートする。ただし...
--赤いボールを図のピンクのいずれかに置いた缶に、青いボー...
--開始の合図から5秒以内にスタートボタンを押す作業を完了...
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作...
--途中でうまく動かなくなった場合、1回限り再スタートする...
-基本得点の計算方法
--ボールを一つ乗せればそれぞれ10点、二つとも乗せればボー...
--ダミーの缶を設置した上で、正しい缶に乗せれば、それぞれ...
--ボールを目的の缶に当てることができれば、それぞれ4点。
--ボールを同じ領域内の間違った缶に乗せた場合は、それぞれ6...
--ボールを同じ領域内の間違った缶に当てた場合は、それぞれ2...
--ボールを違う領域内の缶に乗せた場合は、それぞれ2点。
--ボールを違う領域内の缶に当てた場合は、0点。
--目的の缶をもとの位置(直径7cmの円)から少し出してしまっ...
--ダミーの缶がもとの位置から移動しても減点はしない。
-技術点の計算方法
以下の動作の精度・スピード・確実性などを含めた技術的な工...
--ボール探し取りにいくまでの動作 (3点)
--ボール掴む動作 (3点)
--ボールを運ぶ動作 (2点)
--ボールを缶に置く動作 (2点)
--2台のNXT、EV3の連携の良さ(2点)
--自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
--その他 (3点)
*今回のロボットについて [#e2ba4992]
**今回のロボットに至った経緯 [#gd80fdde]
&ref(2018b/Member/Jerry/Mission3/3.jpg,50%,ロボット);
今回のロボットは2台のNXTを通信してプログラムを制御するの...
**ロボット作りで工夫した点 [#w6cbb8f6]
-光センサ
&ref(2018b/Member/Jerry/Mission3/5.jpg,40%,光センサ);
今回の課題では、光センサを2つ用いることができたので、私た...
-ボールを持ち上げる
今回のロボット作りで一番大変だったのが「ボールを持ち上げ...
次に思いついた方針は、写真のようにボールを掴んでいるモー...
&ref(2018b/Member/Jerry/Mission3/4.jpg,40%,ボールを持ち上...
私たちのグループでは、この問題を解決するための方法として...
-軽量化
「2台のNXTを1体化させて大きなロボットを作る」という方針を...
-コード
&ref(2018b/Member/Jerry/Mission3/2.jpg,40%,コード);
今までの課題と違い、光センサ2つ、超音波センサ、ボールを掴...
*ロボットを動かすためのプログラム [#t28312fb]
**ライントレース [#xad04020]
今回も課題2の時と同様に「黒と白の境界線をライントレース...
明るさの値が3段階でライントレースを行うことができた。
#define go_forward OnFwd(OUT_A,40);OnFwd(OUT_C,40) /...
#define turn_left1 OnFwd(OUT_A,35);OnFwd(OUT_C,-30) ...
#define turn_right1 OnFwd(OUT_C,35);OnFwd(OUT_A,-30) ...
白と黒の境界線の明るさの値が50だったので
#define THRESHOLD 50
と定義して、下図のように左側のライントレースだけを行うよ...
&ref(2018b/Member/Jerry/Mission3/line_trace.jpg,75%,左側...
***交差点を認識するライントレース [#g6bfc511]
void Lfollow_line(long min_t) //min_tにいれた時間分だけ...
{
long t0=CurrentTick(); //現在の時間を記録する。
while(CurrentTick()-t0<=min_t) //現在の時間とt0の時間...
if ((SENSOR_1<THRESHOLD-7)&&(SENSOR_4<THRESHO...
Off(OUT_AC);Wait(1000); //S1の明るさの値が4...
}
else if (SENSOR_1<THRESHOLD-7){
turn_left1; //明るさの値が43未満の時、turn_le...
}
else if (SENSOR_1<THRESHOLD+7){
go_forward; //明るさの値が43以上57未満の時、...
}
else {
turn_right1; //それ以外の時、turn_right1の動...
}
}
このプログラムは以下のように動く。
&ref(2018b/Member/Jerry/Mission3/stop.jpg,50%,交差点を認...
***交差点を横断するプログラム [#u785261f]
#define follow_intersection ResetTachoCount(OUT_AC);R...
#define follow_intersection2 ResetTachoCount(OUT_AC);...
このプログラムは交差点を横断するために用いる。2種類存在す...
***交差点を認識した後後退するプログラム [#s832d5d2]
#define Mfollow_intersection ResetTachoCount(OUT_AC);...
このプログラムは青のボールを掴むための距離を取るために用...
***交差点を認識しないライントレース [#qca2b6e4]
void follow_line(long min_t) //min_tにいれた時間分だけラ...
{
long t0=CurrentTick(); //現在の時間を記録する。
while(CurrentTick()-t0<=min_t) //現在の時間とt0の時間...
if (SENSOR_1<THRESHOLD-7){
turn_left1; //明るさの値が43未満の時、turn_le...
}
else if (SENSOR_1<THRESHOLD+7){
go_forward; //明るさの値が43以上57未満の時、g...
}
else {
turn_right1; //それ以外の時、turn_right1の動...
}
}
このプログラムは以下のように動く。
&ref(2018b/Member/Jerry/Mission3/left.jpg,50%,交差点を認...
**缶を認識し、缶に近づくためのプログラム(赤いボールをつ...
***缶を認識するためのプログラム [#ya1ed339]
#define SPEED 50
#define SPEED_SLOW 30
#define SPEED_MSLOW -30
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 10.35; //タイヤのトレッド幅(cm)
const float pi = 3.1415; //円周率
void turnAng(long ang) //角度 ang 度の時計回りの旋回
{
long angle;
angle = track/diameter*ang;
RotateMotorEx(OUT_AC, SPEED_SLOW, angle, 100, true, t...
}
int searchDirection(long ang)// 現在の方向を中心にang度...
// 障害物までの距離を返す。
{
long angle, tacho_min=0, tacho_corr;
int d_min;
d_min=300;
angle = (track/diameter)*ang;// 旋回角度からタイヤの...
turnAng(ang/2); // 旋回角度からタイヤの...
ResetTachoCount(OUT_AC); // 角度計測をリセットす...
OnFwdSync(OUT_AC,SPEED_SLOW,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(SensorUS(S2)<d_min){
d_min=SensorUS(S2); // 仮の最小値を更...
tacho_min=MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S2)...
Wait(14); //微調整
Off(OUT_AC);Wait(500);
return d_min;
ResetTachoCount(OUT_AC); // 角度計測をリセットする。
}
&ref(2018b/Member/Jerry/Mission3/find_d.jpg,40%,空き缶を...
***缶に近づくためのプログラム [#k02ee8ec]
void fwdDist(float d) //距離 d cm 前進する。
{
long angle;
angle = d/(diameter*pi)*360.0 ; //角度を計算する。
RotateMotorEx(OUT_AC,SPEED_SLOW,angle,0,true,true);
}
このプログラムにより、さきほどのsearchDirection()という関...
void MfwdDist(float d) //距離 d cm 後退する。
{
long angle;
angle = d/(diameter*pi)*360.0 ; ////角度を計算する。
RotateMotorEx(OUT_AC,SPEED_MSLOW,angle,0,true,true);
}
**缶を認識し、缶に近づくためのプログラム(青いボールをつ...
***缶を認識するためのプログラム [#t550e9de]
void turnAng2(long ang2) //角度 ang2 度の時計回りの旋回
{
long angle2;
angle2 = track/diameter*ang2;
RotateMotorEx(OUT_AC, SPEED_SLOW, angle2, 100, true, ...
}
int e_searchDirection(long ang2) //現在の方向を中心にan...
// 障害物までの距離を...
{
long angle2, tacho_min2=0, tacho_corr2;
int e_min; //仮の最小値
e_min=300;
angle2 = (track/diameter)*ang2; //旋回角度からタイヤ...
turnAng2(ang2/2); //指定された角度の半...
ResetTachoCount(OUT_AC); //角度計測をリセット...
OnFwdSync(OUT_AC,SPEED_SLOW,-100); //反時計回りに旋回...
while(MotorTachoCount(OUT_A)<=angle2){
if(SensorUS(S2)<e_min){
e_min=SensorUS(S2); //仮の最小値を...
tacho_min2=MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min2||SensorUS(S2...
Wait(14); 微調整
Off(OUT_AC);Wait(500);
return e_min;
ResetTachoCount(OUT_AC); //角度計測をリセット...
}
&ref(2018b/Member/Jerry/Mission3/find_e.jpg,40%,空き缶を...
***缶に近づくためのプログラム [#k000b718]
void e_fwdDist(float e) //距離 e cm 前進する。
{
long angle2;
angle2 = e/(diameter*pi)*360.0 ; //角度を計算する。
RotateMotorEx(OUT_AC,SPEED_SLOW,angle2,0,true,true);
}
このプログラムにより、さきほどのe_searchDirection()という...
void e_MfwdDist(float e) //距離 e cm 後退する。
{
long angle2;
angle2 = e/(diameter*pi)*360.0 ; //角度を計算する。
RotateMotorEx(OUT_AC,SPEED_MSLOW,angle2,0,true,true);
}
**ボールを掴むためのプログラム(子機への命令) [#kdc79699]
void Ball_catch()
{
RemoteStartProgram(1,"Last(S1).rxe"); //子機内にあるL...
while(msg != 11) //子機から「11」というメッセージが来...
ReceiveRemoteNumber(MAILBOX1,true,msg); //メールボッ...
}
Wait(3000);
}
ボールを掴む動作自体は子機が行うため、このプログラムは子...
int msg;// 子機のプログラムが終了したことを知らせるた...
#define CONN 1 // 子機の接続番号
**ボールを掴むためのプログラム(子機が動く) [#ba95a8da]
Last(S1)
#define Ball_catch ResetTachoCount(OUT_B);RotateMotor...
task main()
{
Ball_catch; //ボールを掴む。
SendResponseNumber(MAILBOX1,11); //親機に「11」とい...
Wait(1000);
}
これらのプログラムは下図のように進行する。
&ref(2018b/Member/Jerry/Mission3/11.jpg,25%,ボールを掴む...
**ボールを放出するためのプログラム(子機への命令) [#s718...
void Ball_release()
{
RemoteStartProgram(1,"Last(S2).rxe"); //子機内にあるL...
while(msg != 12) //子機から「12」というメッセージが来...
ReceiveRemoteNumber(MAILBOX1,true,msg); //メールボッ...
}
Wait(3000);
}
ボールを放出する動作自体は子機が行うため、このプログラム...
int msg;// 子機のプログラムが終了したことを知らせるた...
#define CONN 1 // 子機の接続番号
**ボールを放出するためのプログラム(子機が動く) [#b2fb03...
Last(S2)
#define Ball_release ResetTachoCount(OUT_B);RotateMot...
task main()
{
Ball_release; //ボール放出する。
SendResponseNumber(MAILBOX1,12); //親機に「12」という...
Wait(1000);
}
これらのプログラムは下図のように進行する。
&ref(2018b/Member/Jerry/Mission3/12.jpg,25%,ボールを放出...
**アームを上げるためのプログラム [#j88e765a]
#define Ball_up RotateMotor(OUT_B,-50,160);Wait(2000);
#define Ball_up2 RotateMotor(OUT_B,-50,50);Wait(2000);
初めのプログラムはボールを掴んだ後にNXT本体にアームを当て...
**アームを下げるためのプログラム [#p47e43bd]
#define Ball_down RotateMotor(OUT_B,30,60);Wait(2000);
#define Ball_down2 RotateMotor(OUT_B,30,150);Wait(200...
初めのプログラムは缶に近づいた後に、アームを下げてボール...
*全体のプログラム [#h97cd118]
task main()
{
SetSensorLight(S1); //左側のセンサ
SetSensorLowspeed(S2); //超音波センサ
SetSensorLight(S4); //右側のセンサ
Wait(2000); //スタートボタンを押してから、離れるまで...
Ball_catch(); //子機にボールを掴ませる。
follow_intersection; //スタートラインを横断する。
Lfollow_line(3000); //次の交差点(G地点)まで進んで停止...
follow_intersection; //交差点を横断する。
Ball_up; //アームをあげる。←このまま進行していくと青...
Lfollow_line(18000); //次の交差点(E地点)まで進んで停...
int d=searchDirection(120);//缶を探す。
fwdDist(d-18.0); //缶に近づく。
searchDirection(20); //缶にボールを乗せられるように微...
Ball_down; //アームを下げる。
Ball_release(); //子機で缶にボールを乗せる。
MfwdDist(d-17.0); //缶から離れる。←元の位置よりも1?下...
Ball_up2; //ライントレースを行う際に、ボールや缶にぶ...
follow_line(2000); //ライントレースに戻る。この時、E...
Lfollow_line(3000); //次の交差点(I地点)まで進んで停止...
Mfollow_intersection; //青いボールを確実につかむこと...
Ball_down2; //アームを下げる。
Ball_catch(); //子機にボールを掴ませる。
Ball_up; //アームをあげる。
follow_intersection2; //赤いボールを当てるための缶を...
int e=e_searchDirection(120); //缶を探す。
e_fwdDist(e-18.0); //缶に近づく。
e_searchDirection(20); //缶にボールを乗せられるように...
Ball_down; //アームを下げる。
Ball_release(); //子機で缶にボールを乗せる。
e_MfwdDist(e-18.0); //缶から離れてもとの位置に戻る。
}
*反省と考察 [#f94e2960]
今回の課題では、プログラム自体は簡単に作ることができたが...
&ref(2018b/Member/Jerry/Mission3/miss.jpg,25%,缶を正確に...
私は、缶がうまく認識できないのは、缶の側面が曲面で超音波...
終了行:
目次
#contents
*課題3:ボール運搬ロボット[#l3956274]
青と赤のボールを運搬して、それぞれ所定の350ml缶の上に乗せ...
&ref(2018b/Member/Jerry/Mission3/cource3.jpg,75%,課題3の...
-フィールドの説明
--フィールドは課題2で使用した紙を使用する。
--350ml缶(中が入っていても空でよい)は逆さまにして使い、ロ...
--その番号の次の番号のところにもダミーの缶を置くことがで...
--空き缶には色をつけたり文字や記号を書いてもよい。あるい...
--赤と青のボールは、図のように所定の場所に置いておく。そ...
**ルール [#vb163c4f]
-基本ルール
--競技時間は審判が続行不能と判断するまで、あるいはリタイ...
--図のX地点または(および)Y地点からスタートする。ただし...
--赤いボールを図のピンクのいずれかに置いた缶に、青いボー...
--開始の合図から5秒以内にスタートボタンを押す作業を完了...
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作...
--途中でうまく動かなくなった場合、1回限り再スタートする...
-基本得点の計算方法
--ボールを一つ乗せればそれぞれ10点、二つとも乗せればボー...
--ダミーの缶を設置した上で、正しい缶に乗せれば、それぞれ...
--ボールを目的の缶に当てることができれば、それぞれ4点。
--ボールを同じ領域内の間違った缶に乗せた場合は、それぞれ6...
--ボールを同じ領域内の間違った缶に当てた場合は、それぞれ2...
--ボールを違う領域内の缶に乗せた場合は、それぞれ2点。
--ボールを違う領域内の缶に当てた場合は、0点。
--目的の缶をもとの位置(直径7cmの円)から少し出してしまっ...
--ダミーの缶がもとの位置から移動しても減点はしない。
-技術点の計算方法
以下の動作の精度・スピード・確実性などを含めた技術的な工...
--ボール探し取りにいくまでの動作 (3点)
--ボール掴む動作 (3点)
--ボールを運ぶ動作 (2点)
--ボールを缶に置く動作 (2点)
--2台のNXT、EV3の連携の良さ(2点)
--自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
--その他 (3点)
*今回のロボットについて [#e2ba4992]
**今回のロボットに至った経緯 [#gd80fdde]
&ref(2018b/Member/Jerry/Mission3/3.jpg,50%,ロボット);
今回のロボットは2台のNXTを通信してプログラムを制御するの...
**ロボット作りで工夫した点 [#w6cbb8f6]
-光センサ
&ref(2018b/Member/Jerry/Mission3/5.jpg,40%,光センサ);
今回の課題では、光センサを2つ用いることができたので、私た...
-ボールを持ち上げる
今回のロボット作りで一番大変だったのが「ボールを持ち上げ...
次に思いついた方針は、写真のようにボールを掴んでいるモー...
&ref(2018b/Member/Jerry/Mission3/4.jpg,40%,ボールを持ち上...
私たちのグループでは、この問題を解決するための方法として...
-軽量化
「2台のNXTを1体化させて大きなロボットを作る」という方針を...
-コード
&ref(2018b/Member/Jerry/Mission3/2.jpg,40%,コード);
今までの課題と違い、光センサ2つ、超音波センサ、ボールを掴...
*ロボットを動かすためのプログラム [#t28312fb]
**ライントレース [#xad04020]
今回も課題2の時と同様に「黒と白の境界線をライントレース...
明るさの値が3段階でライントレースを行うことができた。
#define go_forward OnFwd(OUT_A,40);OnFwd(OUT_C,40) /...
#define turn_left1 OnFwd(OUT_A,35);OnFwd(OUT_C,-30) ...
#define turn_right1 OnFwd(OUT_C,35);OnFwd(OUT_A,-30) ...
白と黒の境界線の明るさの値が50だったので
#define THRESHOLD 50
と定義して、下図のように左側のライントレースだけを行うよ...
&ref(2018b/Member/Jerry/Mission3/line_trace.jpg,75%,左側...
***交差点を認識するライントレース [#g6bfc511]
void Lfollow_line(long min_t) //min_tにいれた時間分だけ...
{
long t0=CurrentTick(); //現在の時間を記録する。
while(CurrentTick()-t0<=min_t) //現在の時間とt0の時間...
if ((SENSOR_1<THRESHOLD-7)&&(SENSOR_4<THRESHO...
Off(OUT_AC);Wait(1000); //S1の明るさの値が4...
}
else if (SENSOR_1<THRESHOLD-7){
turn_left1; //明るさの値が43未満の時、turn_le...
}
else if (SENSOR_1<THRESHOLD+7){
go_forward; //明るさの値が43以上57未満の時、...
}
else {
turn_right1; //それ以外の時、turn_right1の動...
}
}
このプログラムは以下のように動く。
&ref(2018b/Member/Jerry/Mission3/stop.jpg,50%,交差点を認...
***交差点を横断するプログラム [#u785261f]
#define follow_intersection ResetTachoCount(OUT_AC);R...
#define follow_intersection2 ResetTachoCount(OUT_AC);...
このプログラムは交差点を横断するために用いる。2種類存在す...
***交差点を認識した後後退するプログラム [#s832d5d2]
#define Mfollow_intersection ResetTachoCount(OUT_AC);...
このプログラムは青のボールを掴むための距離を取るために用...
***交差点を認識しないライントレース [#qca2b6e4]
void follow_line(long min_t) //min_tにいれた時間分だけラ...
{
long t0=CurrentTick(); //現在の時間を記録する。
while(CurrentTick()-t0<=min_t) //現在の時間とt0の時間...
if (SENSOR_1<THRESHOLD-7){
turn_left1; //明るさの値が43未満の時、turn_le...
}
else if (SENSOR_1<THRESHOLD+7){
go_forward; //明るさの値が43以上57未満の時、g...
}
else {
turn_right1; //それ以外の時、turn_right1の動...
}
}
このプログラムは以下のように動く。
&ref(2018b/Member/Jerry/Mission3/left.jpg,50%,交差点を認...
**缶を認識し、缶に近づくためのプログラム(赤いボールをつ...
***缶を認識するためのプログラム [#ya1ed339]
#define SPEED 50
#define SPEED_SLOW 30
#define SPEED_MSLOW -30
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 10.35; //タイヤのトレッド幅(cm)
const float pi = 3.1415; //円周率
void turnAng(long ang) //角度 ang 度の時計回りの旋回
{
long angle;
angle = track/diameter*ang;
RotateMotorEx(OUT_AC, SPEED_SLOW, angle, 100, true, t...
}
int searchDirection(long ang)// 現在の方向を中心にang度...
// 障害物までの距離を返す。
{
long angle, tacho_min=0, tacho_corr;
int d_min;
d_min=300;
angle = (track/diameter)*ang;// 旋回角度からタイヤの...
turnAng(ang/2); // 旋回角度からタイヤの...
ResetTachoCount(OUT_AC); // 角度計測をリセットす...
OnFwdSync(OUT_AC,SPEED_SLOW,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(SensorUS(S2)<d_min){
d_min=SensorUS(S2); // 仮の最小値を更...
tacho_min=MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min||SensorUS(S2)...
Wait(14); //微調整
Off(OUT_AC);Wait(500);
return d_min;
ResetTachoCount(OUT_AC); // 角度計測をリセットする。
}
&ref(2018b/Member/Jerry/Mission3/find_d.jpg,40%,空き缶を...
***缶に近づくためのプログラム [#k02ee8ec]
void fwdDist(float d) //距離 d cm 前進する。
{
long angle;
angle = d/(diameter*pi)*360.0 ; //角度を計算する。
RotateMotorEx(OUT_AC,SPEED_SLOW,angle,0,true,true);
}
このプログラムにより、さきほどのsearchDirection()という関...
void MfwdDist(float d) //距離 d cm 後退する。
{
long angle;
angle = d/(diameter*pi)*360.0 ; ////角度を計算する。
RotateMotorEx(OUT_AC,SPEED_MSLOW,angle,0,true,true);
}
**缶を認識し、缶に近づくためのプログラム(青いボールをつ...
***缶を認識するためのプログラム [#t550e9de]
void turnAng2(long ang2) //角度 ang2 度の時計回りの旋回
{
long angle2;
angle2 = track/diameter*ang2;
RotateMotorEx(OUT_AC, SPEED_SLOW, angle2, 100, true, ...
}
int e_searchDirection(long ang2) //現在の方向を中心にan...
// 障害物までの距離を...
{
long angle2, tacho_min2=0, tacho_corr2;
int e_min; //仮の最小値
e_min=300;
angle2 = (track/diameter)*ang2; //旋回角度からタイヤ...
turnAng2(ang2/2); //指定された角度の半...
ResetTachoCount(OUT_AC); //角度計測をリセット...
OnFwdSync(OUT_AC,SPEED_SLOW,-100); //反時計回りに旋回...
while(MotorTachoCount(OUT_A)<=angle2){
if(SensorUS(S2)<e_min){
e_min=SensorUS(S2); //仮の最小値を...
tacho_min2=MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min2||SensorUS(S2...
Wait(14); 微調整
Off(OUT_AC);Wait(500);
return e_min;
ResetTachoCount(OUT_AC); //角度計測をリセット...
}
&ref(2018b/Member/Jerry/Mission3/find_e.jpg,40%,空き缶を...
***缶に近づくためのプログラム [#k000b718]
void e_fwdDist(float e) //距離 e cm 前進する。
{
long angle2;
angle2 = e/(diameter*pi)*360.0 ; //角度を計算する。
RotateMotorEx(OUT_AC,SPEED_SLOW,angle2,0,true,true);
}
このプログラムにより、さきほどのe_searchDirection()という...
void e_MfwdDist(float e) //距離 e cm 後退する。
{
long angle2;
angle2 = e/(diameter*pi)*360.0 ; //角度を計算する。
RotateMotorEx(OUT_AC,SPEED_MSLOW,angle2,0,true,true);
}
**ボールを掴むためのプログラム(子機への命令) [#kdc79699]
void Ball_catch()
{
RemoteStartProgram(1,"Last(S1).rxe"); //子機内にあるL...
while(msg != 11) //子機から「11」というメッセージが来...
ReceiveRemoteNumber(MAILBOX1,true,msg); //メールボッ...
}
Wait(3000);
}
ボールを掴む動作自体は子機が行うため、このプログラムは子...
int msg;// 子機のプログラムが終了したことを知らせるた...
#define CONN 1 // 子機の接続番号
**ボールを掴むためのプログラム(子機が動く) [#ba95a8da]
Last(S1)
#define Ball_catch ResetTachoCount(OUT_B);RotateMotor...
task main()
{
Ball_catch; //ボールを掴む。
SendResponseNumber(MAILBOX1,11); //親機に「11」とい...
Wait(1000);
}
これらのプログラムは下図のように進行する。
&ref(2018b/Member/Jerry/Mission3/11.jpg,25%,ボールを掴む...
**ボールを放出するためのプログラム(子機への命令) [#s718...
void Ball_release()
{
RemoteStartProgram(1,"Last(S2).rxe"); //子機内にあるL...
while(msg != 12) //子機から「12」というメッセージが来...
ReceiveRemoteNumber(MAILBOX1,true,msg); //メールボッ...
}
Wait(3000);
}
ボールを放出する動作自体は子機が行うため、このプログラム...
int msg;// 子機のプログラムが終了したことを知らせるた...
#define CONN 1 // 子機の接続番号
**ボールを放出するためのプログラム(子機が動く) [#b2fb03...
Last(S2)
#define Ball_release ResetTachoCount(OUT_B);RotateMot...
task main()
{
Ball_release; //ボール放出する。
SendResponseNumber(MAILBOX1,12); //親機に「12」という...
Wait(1000);
}
これらのプログラムは下図のように進行する。
&ref(2018b/Member/Jerry/Mission3/12.jpg,25%,ボールを放出...
**アームを上げるためのプログラム [#j88e765a]
#define Ball_up RotateMotor(OUT_B,-50,160);Wait(2000);
#define Ball_up2 RotateMotor(OUT_B,-50,50);Wait(2000);
初めのプログラムはボールを掴んだ後にNXT本体にアームを当て...
**アームを下げるためのプログラム [#p47e43bd]
#define Ball_down RotateMotor(OUT_B,30,60);Wait(2000);
#define Ball_down2 RotateMotor(OUT_B,30,150);Wait(200...
初めのプログラムは缶に近づいた後に、アームを下げてボール...
*全体のプログラム [#h97cd118]
task main()
{
SetSensorLight(S1); //左側のセンサ
SetSensorLowspeed(S2); //超音波センサ
SetSensorLight(S4); //右側のセンサ
Wait(2000); //スタートボタンを押してから、離れるまで...
Ball_catch(); //子機にボールを掴ませる。
follow_intersection; //スタートラインを横断する。
Lfollow_line(3000); //次の交差点(G地点)まで進んで停止...
follow_intersection; //交差点を横断する。
Ball_up; //アームをあげる。←このまま進行していくと青...
Lfollow_line(18000); //次の交差点(E地点)まで進んで停...
int d=searchDirection(120);//缶を探す。
fwdDist(d-18.0); //缶に近づく。
searchDirection(20); //缶にボールを乗せられるように微...
Ball_down; //アームを下げる。
Ball_release(); //子機で缶にボールを乗せる。
MfwdDist(d-17.0); //缶から離れる。←元の位置よりも1?下...
Ball_up2; //ライントレースを行う際に、ボールや缶にぶ...
follow_line(2000); //ライントレースに戻る。この時、E...
Lfollow_line(3000); //次の交差点(I地点)まで進んで停止...
Mfollow_intersection; //青いボールを確実につかむこと...
Ball_down2; //アームを下げる。
Ball_catch(); //子機にボールを掴ませる。
Ball_up; //アームをあげる。
follow_intersection2; //赤いボールを当てるための缶を...
int e=e_searchDirection(120); //缶を探す。
e_fwdDist(e-18.0); //缶に近づく。
e_searchDirection(20); //缶にボールを乗せられるように...
Ball_down; //アームを下げる。
Ball_release(); //子機で缶にボールを乗せる。
e_MfwdDist(e-18.0); //缶から離れてもとの位置に戻る。
}
*反省と考察 [#f94e2960]
今回の課題では、プログラム自体は簡単に作ることができたが...
&ref(2018b/Member/Jerry/Mission3/miss.jpg,25%,缶を正確に...
私は、缶がうまく認識できないのは、缶の側面が曲面で超音波...
ページ名: