2017b/Member/Yoshi/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
ホーム[[2017b/Member]]
*1課題 [#k51f0fe3]
以下は[[2017b/Mission3]]のからの引用です。
-------
** 課題:ピンポン玉&紙コップ回収ロボット [#hedbc5a6]
ピンポン玉と紙コップを別々に回収して所定の場所に運ぶ。
#ref(2017b/Mission3/2017b-mission3.png,80%,ロボコンのフィ...
:フィールドの説明 |
--フィールドは課題2で使用した紙を使用する。
--図のマジェンタの円に逆さまにした紙コップを置き、その中...
--図の黄色い円に紙コップを通常の向きに置き、障害物とする...
--紙コップには色をつけたり文字や記号を書いてもよい。
--%%RISのチームに限り図の緑ラインを引いてもよい。%%
--割り箸を使って一辺が14cmの正方形を作り、X地点を中心とし...
** ルール [#k6b5fbc8]
:基本ルール |
--競技時間は審判が続行不能と判断するまで、あるいはリタイ...
--図のA地点または(および)D地点からスタートする。ただし...
--ピンポン玉をX地点に運び、割り箸で正方形に囲まれた領域に...
--紙コップをY地点がある黒線に囲まれた領域に運ぶ。
--開始の合図から5秒以内にスタートボタンを押す作業を完了...
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作...
--途中でうまく動かなくなった場合、1回限り再スタートする...
:基本得点の計算方法 (片道) |
--運んだピンポン玉の数×3点
--運んだ紙コップの数×3点
--紙コップを2つ重ねて置くことができた場合はさらに3点加算...
--障害物の紙コップに接触して一部を円の外に移動した場合は...
--例:ピンポン玉を4個運び、紙コップを3個運んだ場合で、そ...
:技術点の計算方法|
以下の動作の精度・スピード・確実性などを含めた技術的な工...
得点の目安:
--紙コップとピンポン玉を探し取りにいくまでの動作 (2点)
--紙コップを掴む動作 (2点)
--紙コップを運ぶ動作 (2点)
--紙コップを置く (2点)
--ピンポン玉を拾う動作(2点)
--ピンポン玉を運ぶ動作(2点)
--ピンポン玉を目的に入れる動作(2点)
--2台のRCXまたはNXT、EV3の連携の良さ(2点)
--自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
--その他 (2点)
*2ロボットの紹介 [#hfe78483]
Aに置くロボットとDに置くロボットの2台作りました。基本構造...
**ロボット1(Dに置くもの) [#icd9446e]
&ref(2017b/Member/Yoshi/Mission3/r1ue.jpg,60%,ロボの全体...
&ref(2017b/Member/Yoshi/Mission3/r1naname.JPG,60%,ロボ全...
左の写真がロボットの全体を上から見た図、右の写真が斜め前...
明るさセンサーと接触センサーを取り付けています。パーツの...
**ロボット2(Aに置くもの) [#x24e0efa]
&ref(2017b/Member/Yoshi/Mission3/r2ue.jpg,60%,ロボの全体...
&ref(2017b/Member/Yoshi/Mission3/r2naname.JPG,60%,ロボ全...
左の写真がロボットの全体を上から見た図、右の写真が斜め前...
こちらは光センサーと接触センサーを付けていません。詳しく...
*3ロボット作成で工夫した点 [#r3f47f32]
**その1 [#e07aa323]
&ref(2017b/Member/Yoshi/Mission3/r1zennpou.jpg,60%,ロボ全...
超音波センサーと明るさセンサーがロボットの中心の延長線上...
**その2(アームの機構) [#o4d37ba6]
NXTは一つの本体につきモーターを3つまでしか接続できません...
&ref(2017b/Member/Yoshi/Mission3/a-mu_gainenn.JPG,60%,機...
モーターが回転した時にアームを閉じるか持ち上げるかのどち...
&ref(2017b/Member/Yoshi/Mission3/aeme.gif,60%,アームの動...
この画像の3番のようにアームを少し上げた状態にすることでピ...
*4プログラム [#t1f283c1]
**定義した定数 [#o1329b1a]
プログラムを簡略化し、開発しやすくするためにいくつか定数...
以下はその抜粋です
#define Apower 37
#define Bpower 34 //直進するのに必要な出力
#define ttime 695 //90度曲がるのに必要な時間
#define gotime 689 //20cm進むのに必要な時間
#define SPEED 50
#define SPEED_SLOW 30
まず上二つが移動用モーターの出力です。数値を左右で変えて...
またロボットの基礎データを固定された変数として定義しまし...
const float diameter=5.45;//タイヤの直径
const float track=11.35;//タイヤのトレット幅
const float pi=3.1415;//円周率
**定義したサブ関数 [#m9587eea]
定数と同様にいくつかサブ関数を定義しました。これにより可...
サブ関数の中には中にサブ関数を使用しているところがあるの...
***サブ関数その1 (基本動作)[#n49e72fe]
sub go_for()
{
OnFwd(OUT_A,Apower);
OnFwd(OUT_B,Bpower);
}
sub go_back()
{
OnFwd(OUT_A,-Apower);
OnFwd(OUT_B,-Bpower);
}
sub turnL(float c)
{
OnFwd(OUT_A,Apower);OnFwd(OUT_B,-Bpower);
Wait(c*ttime);
Float(OUT_AB); //左に曲がる(c×90)度
}
sub turnR(float c)
{
OnFwd(OUT_A,-Apower);OnFwd(OUT_B,Bpower);
Wait(c*ttime);
Float(OUT_AB); //右に曲がる(c×90)度
}
使用した変数
-c,float,旋回角度を指定するために使います。1で901度回転...
ここで上げたサブ関数はロボットを動かす基本動作です。先進...
***サブ関数その2(黒線の明るさの自動取得) [#d46bbd32]
int cyari(int lsw)
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);//明るさセンサを生...
SetSensorTouch(S4);
int i=1;
int lsb=SENSOR_1;
int lsb2=SENSOR_1-1;
while (i==1){
go_for();
lsb2=SENSOR_1;
NumOut(80,LCD_LINE4,lsb2);
if (lsb>lsb2) {
lsb=lsb2;
}
if (lsb+10<lsb2) {
i=10;
}
if (lsb>lsw-150) {
i=1;
}
}
Off(OUT_AB);
NumOut(80,LCD_LINE1,lsw);
NumOut(80,LCD_LINE2,lsb);
return lsb;
}
使用した変数
-lsw,int,自動取得した紙面上(白色)での明るさ。生データな...
-lsb,int,サブ関数のcyariにて最終的に黒線上での明るさにな...
-lsb2,int,サブ関数のcyariにてロボットが移動しているときの...
-i,int,黒線の明るさの計測が終わったか表す数値。1なら計測...
黒線の明るさの最低値を自動取得するプログラムです。進みな...
&ref(2017b/Member/Yoshi/Mission2/light2.gif,80%,光センサ...
実際のプログラムは黒線の明るさがわかった後は必要ないので...
本来は黒線の明るさを取得するプログラムですが、特定の明る...
***サブ関数その3(角度を指定して精密に動かす) [#bb5db48f]
void fwdDist(float d)
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,0,true,true);
}
void turnAng(long ang)
{
long angle=track/diameter*ang;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,100,true,true);
}
先生からもらったプリントをそのまま参考にして精密に移動で...
&ref(2017b/Member/Yoshi/Mission3/setumei.JPG,80%,資料の写...
***サブ関数その4(アームの制御) [#zf44c9aa]
sub arm(int c)
{
RotateMotor(OUT_C, 40,c);
Off(OUT_C);
}
アームのモーターが指定した角度だけ回転します。
**実行するプログラム [#t144e1c4]
ここまでで定義したものを使って次のようにtask mainを作りま...
task main ()
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);
SetSensorTouch(S4);
int lsw=SENSOR_1; //位置調整
int lsb=cyari(lsw);
while(SENSOR_4==0) {}//待機
fwdDist(15); //Q付近の紙コップまで行く
Wait(15000); //その間でロボット2と干渉を避けるため...
turnL(1.1);
PlaySound(SOUND_UP);
Wait(1000);
fwdDist(30);
Wait(1000);
turnAng(40);//ロボットを紙コップに向ける
PlaySound(SOUND_UP);
turnAng(180); //反転して後ろのアームを紙コップに向ける
Wait(1000);
fwdDist(15); //紙コップと少し距離をとる
Wait(1000);
arm(550); //アームを開いて最大限にまで下げる。
Wait(1000);
go_back();
Wait(2000); //近づいてアームの中に紙コップを入れる
Off(OUT_AB);
arm(-180); //アームを閉じる
Wait(1000);
arm(-45); //アームを少し持ち上げて割り箸を乗り越える...
Wait(1000);
turnL(1.05); //旋回して割りばしの中に行く
Wait(1000);
arm(-200); //アームを上げてピンポン玉を割りばしの中...
fwdDist(35); //Y地点に向かう
turnL(0.4);
Wait(1000);
arm(100); //紙コップを落とす
PlaySound(SOUND_UP);
SendRemoteNumber(1,MAILBOX1,1); //紙コップを運びおえ...
fwdDist(20); //Y地点から立ち去る
while(SENSOR_4==0) {} //終了
}
私が作ったロボットは紙コップを一つとって終了です。後述の...
*5実行結果 [#yce51899]
事前の試走ではうまく動作しましたが、本番では旋回角度が正...
右旋回は角度を指定して動けたのに対し、左旋回は時間によっ...
基本点は三回目の挑戦で5点を獲得しました。
*6ロボット2のプログラム [#v17ca8d4]
**定義した定数 [#m8dbe029]
#define SPEED_SLOW 25
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 10.91; //タイヤのトレッド幅(cm)
const float pi = 3.1415; //円周率
**定義したサブ関数 [#c60ab012]
void fwdDist(float d) //距離 d cm 前進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,0,true,true);
}
void baDist(float d) //距離 d cm 後進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, -angle,0,true,true);
}
void turnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang; //必要なタイヤの...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,100,true,true);
}
void nturnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang; //必要なタイヤの...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,0,true,true);
}
int searchDirection(long ang) //現在の方向を中心にang度...
//障害物までの距離を返す
{
long tacho_min ; //もっとも近い距離を実現するタイヤ...
int d_min = 300 ; //もっとも近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタ...
turnAng(ang/2); //指定された角度の半分を旋回
ResetTachoCount(OUT_AB); //角度計測をリセット
OnFwdSync(OUT_AB,SPEED_SLOW,-100); //反時計回りに旋回
while(MotorTachoCount(OUT_A)<=angle){
if (SensorUS(S1)<d_min){ //現在の距離が仮...
d_min = SensorUS(S1); //仮の最小値を更新
tacho_min = MotorTachoCount(OUT_A); //この時...
}
}
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min || SensorUS(S...
Wait(14); //微調整
Off(OUT_AB);Wait(500);
return d_min;
}
sub c_up(float d) //645で最大
{
RotateMotor(OUT_C,-30,d);
Off(OUT_C);
}
sub c_down(float d)
{
RotateMotor(OUT_C,30,d);
Off(OUT_C);
}
**実行するプログラム [#d16e94a6]
task main()
{
SetSensorLowspeed(S1);
//紙コップの方向を探した後、近づいて25cm手前で停止
int d = searchDirection(30);
if (d > 10){
fwdDist(d-25.0);
}
turnAng(200);
c_down(640);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(12.0);
c_up(260); //紙コップをつかむ
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(110);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(11.0);
c_up(330); //ピンポン玉をはなす
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(90);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(17.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(80);
ResetTachoCount(OUT_AB); //角度計測をリセット
int e = searchDirection(40);
int msg; // 受け取った値を格納する変数
while (true) {
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == 1){
break;
} else {
Off(OUT_AB);
}
Wait(100);
}
Off(OUT_AB);Wait(3000);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(30);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(15.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
int f = searchDirection(30);
if (f > 10){
fwdDist(f-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(8.0);
c_down(100);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(2.0);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE); //微...
Off(OUT_AB);
fwdDist(12.0);
c_up(100);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(230);
ResetTachoCount(OUT_AB); //角度計測をリセット
int g = searchDirection(20);
if (g > 10){
fwdDist(g-25.0);
}
turnAng(190);
c_down(630);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(16.0);
c_up(270);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(140);
c_up(340);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(290);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(12.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
int h = searchDirection(20);
if (h > 10){
fwdDist(h-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(8.0);
c_down(100);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(2.0);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(12.0);
}
残念ながら私はこのプログラムをつくっておらずあまり詳しく...
このプログラムは私のプログラムとは違って超音波センサーを...
*7私のプログラムはなぜ超音波センサーを使わなかったのかと...
元々はある程度近づいたら超音波センサーを使って正確に紙コ...
また正確に左旋回をするために
sub turnLg(long ang)
{
long angle = (track/diameter)*ang; //旋回角度からタイ...
ResetTachoCount(OUT_AB); //角度計測をリセット
OnFwdSync(OUT_AB,SPEED_SLOW,-100); // 反時計回りに旋回
until(MotorTachoCount(OUT_A)==angle);
Wait(20);
Off(OUT_AB);
}
というサブ関数を定義して動かしてみましたが、このサブ関数...
今回の課題はテスト期間と重なりかつ期間の短かったので十分...
終了行:
#contents
ホーム[[2017b/Member]]
*1課題 [#k51f0fe3]
以下は[[2017b/Mission3]]のからの引用です。
-------
** 課題:ピンポン玉&紙コップ回収ロボット [#hedbc5a6]
ピンポン玉と紙コップを別々に回収して所定の場所に運ぶ。
#ref(2017b/Mission3/2017b-mission3.png,80%,ロボコンのフィ...
:フィールドの説明 |
--フィールドは課題2で使用した紙を使用する。
--図のマジェンタの円に逆さまにした紙コップを置き、その中...
--図の黄色い円に紙コップを通常の向きに置き、障害物とする...
--紙コップには色をつけたり文字や記号を書いてもよい。
--%%RISのチームに限り図の緑ラインを引いてもよい。%%
--割り箸を使って一辺が14cmの正方形を作り、X地点を中心とし...
** ルール [#k6b5fbc8]
:基本ルール |
--競技時間は審判が続行不能と判断するまで、あるいはリタイ...
--図のA地点または(および)D地点からスタートする。ただし...
--ピンポン玉をX地点に運び、割り箸で正方形に囲まれた領域に...
--紙コップをY地点がある黒線に囲まれた領域に運ぶ。
--開始の合図から5秒以内にスタートボタンを押す作業を完了...
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作...
--途中でうまく動かなくなった場合、1回限り再スタートする...
:基本得点の計算方法 (片道) |
--運んだピンポン玉の数×3点
--運んだ紙コップの数×3点
--紙コップを2つ重ねて置くことができた場合はさらに3点加算...
--障害物の紙コップに接触して一部を円の外に移動した場合は...
--例:ピンポン玉を4個運び、紙コップを3個運んだ場合で、そ...
:技術点の計算方法|
以下の動作の精度・スピード・確実性などを含めた技術的な工...
得点の目安:
--紙コップとピンポン玉を探し取りにいくまでの動作 (2点)
--紙コップを掴む動作 (2点)
--紙コップを運ぶ動作 (2点)
--紙コップを置く (2点)
--ピンポン玉を拾う動作(2点)
--ピンポン玉を運ぶ動作(2点)
--ピンポン玉を目的に入れる動作(2点)
--2台のRCXまたはNXT、EV3の連携の良さ(2点)
--自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
--その他 (2点)
*2ロボットの紹介 [#hfe78483]
Aに置くロボットとDに置くロボットの2台作りました。基本構造...
**ロボット1(Dに置くもの) [#icd9446e]
&ref(2017b/Member/Yoshi/Mission3/r1ue.jpg,60%,ロボの全体...
&ref(2017b/Member/Yoshi/Mission3/r1naname.JPG,60%,ロボ全...
左の写真がロボットの全体を上から見た図、右の写真が斜め前...
明るさセンサーと接触センサーを取り付けています。パーツの...
**ロボット2(Aに置くもの) [#x24e0efa]
&ref(2017b/Member/Yoshi/Mission3/r2ue.jpg,60%,ロボの全体...
&ref(2017b/Member/Yoshi/Mission3/r2naname.JPG,60%,ロボ全...
左の写真がロボットの全体を上から見た図、右の写真が斜め前...
こちらは光センサーと接触センサーを付けていません。詳しく...
*3ロボット作成で工夫した点 [#r3f47f32]
**その1 [#e07aa323]
&ref(2017b/Member/Yoshi/Mission3/r1zennpou.jpg,60%,ロボ全...
超音波センサーと明るさセンサーがロボットの中心の延長線上...
**その2(アームの機構) [#o4d37ba6]
NXTは一つの本体につきモーターを3つまでしか接続できません...
&ref(2017b/Member/Yoshi/Mission3/a-mu_gainenn.JPG,60%,機...
モーターが回転した時にアームを閉じるか持ち上げるかのどち...
&ref(2017b/Member/Yoshi/Mission3/aeme.gif,60%,アームの動...
この画像の3番のようにアームを少し上げた状態にすることでピ...
*4プログラム [#t1f283c1]
**定義した定数 [#o1329b1a]
プログラムを簡略化し、開発しやすくするためにいくつか定数...
以下はその抜粋です
#define Apower 37
#define Bpower 34 //直進するのに必要な出力
#define ttime 695 //90度曲がるのに必要な時間
#define gotime 689 //20cm進むのに必要な時間
#define SPEED 50
#define SPEED_SLOW 30
まず上二つが移動用モーターの出力です。数値を左右で変えて...
またロボットの基礎データを固定された変数として定義しまし...
const float diameter=5.45;//タイヤの直径
const float track=11.35;//タイヤのトレット幅
const float pi=3.1415;//円周率
**定義したサブ関数 [#m9587eea]
定数と同様にいくつかサブ関数を定義しました。これにより可...
サブ関数の中には中にサブ関数を使用しているところがあるの...
***サブ関数その1 (基本動作)[#n49e72fe]
sub go_for()
{
OnFwd(OUT_A,Apower);
OnFwd(OUT_B,Bpower);
}
sub go_back()
{
OnFwd(OUT_A,-Apower);
OnFwd(OUT_B,-Bpower);
}
sub turnL(float c)
{
OnFwd(OUT_A,Apower);OnFwd(OUT_B,-Bpower);
Wait(c*ttime);
Float(OUT_AB); //左に曲がる(c×90)度
}
sub turnR(float c)
{
OnFwd(OUT_A,-Apower);OnFwd(OUT_B,Bpower);
Wait(c*ttime);
Float(OUT_AB); //右に曲がる(c×90)度
}
使用した変数
-c,float,旋回角度を指定するために使います。1で901度回転...
ここで上げたサブ関数はロボットを動かす基本動作です。先進...
***サブ関数その2(黒線の明るさの自動取得) [#d46bbd32]
int cyari(int lsw)
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);//明るさセンサを生...
SetSensorTouch(S4);
int i=1;
int lsb=SENSOR_1;
int lsb2=SENSOR_1-1;
while (i==1){
go_for();
lsb2=SENSOR_1;
NumOut(80,LCD_LINE4,lsb2);
if (lsb>lsb2) {
lsb=lsb2;
}
if (lsb+10<lsb2) {
i=10;
}
if (lsb>lsw-150) {
i=1;
}
}
Off(OUT_AB);
NumOut(80,LCD_LINE1,lsw);
NumOut(80,LCD_LINE2,lsb);
return lsb;
}
使用した変数
-lsw,int,自動取得した紙面上(白色)での明るさ。生データな...
-lsb,int,サブ関数のcyariにて最終的に黒線上での明るさにな...
-lsb2,int,サブ関数のcyariにてロボットが移動しているときの...
-i,int,黒線の明るさの計測が終わったか表す数値。1なら計測...
黒線の明るさの最低値を自動取得するプログラムです。進みな...
&ref(2017b/Member/Yoshi/Mission2/light2.gif,80%,光センサ...
実際のプログラムは黒線の明るさがわかった後は必要ないので...
本来は黒線の明るさを取得するプログラムですが、特定の明る...
***サブ関数その3(角度を指定して精密に動かす) [#bb5db48f]
void fwdDist(float d)
{
long angle=d/(diameter*pi)*360.0;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,0,true,true);
}
void turnAng(long ang)
{
long angle=track/diameter*ang;
RotateMotorEx(OUT_AB,SPEED_SLOW,angle,100,true,true);
}
先生からもらったプリントをそのまま参考にして精密に移動で...
&ref(2017b/Member/Yoshi/Mission3/setumei.JPG,80%,資料の写...
***サブ関数その4(アームの制御) [#zf44c9aa]
sub arm(int c)
{
RotateMotor(OUT_C, 40,c);
Off(OUT_C);
}
アームのモーターが指定した角度だけ回転します。
**実行するプログラム [#t144e1c4]
ここまでで定義したものを使って次のようにtask mainを作りま...
task main ()
{
ResetTachoCount(OUT_C);
SetSensorLight(S1);
SetSensorMode(S1,SENSOR_MODE_RAW);
SetSensorTouch(S4);
int lsw=SENSOR_1; //位置調整
int lsb=cyari(lsw);
while(SENSOR_4==0) {}//待機
fwdDist(15); //Q付近の紙コップまで行く
Wait(15000); //その間でロボット2と干渉を避けるため...
turnL(1.1);
PlaySound(SOUND_UP);
Wait(1000);
fwdDist(30);
Wait(1000);
turnAng(40);//ロボットを紙コップに向ける
PlaySound(SOUND_UP);
turnAng(180); //反転して後ろのアームを紙コップに向ける
Wait(1000);
fwdDist(15); //紙コップと少し距離をとる
Wait(1000);
arm(550); //アームを開いて最大限にまで下げる。
Wait(1000);
go_back();
Wait(2000); //近づいてアームの中に紙コップを入れる
Off(OUT_AB);
arm(-180); //アームを閉じる
Wait(1000);
arm(-45); //アームを少し持ち上げて割り箸を乗り越える...
Wait(1000);
turnL(1.05); //旋回して割りばしの中に行く
Wait(1000);
arm(-200); //アームを上げてピンポン玉を割りばしの中...
fwdDist(35); //Y地点に向かう
turnL(0.4);
Wait(1000);
arm(100); //紙コップを落とす
PlaySound(SOUND_UP);
SendRemoteNumber(1,MAILBOX1,1); //紙コップを運びおえ...
fwdDist(20); //Y地点から立ち去る
while(SENSOR_4==0) {} //終了
}
私が作ったロボットは紙コップを一つとって終了です。後述の...
*5実行結果 [#yce51899]
事前の試走ではうまく動作しましたが、本番では旋回角度が正...
右旋回は角度を指定して動けたのに対し、左旋回は時間によっ...
基本点は三回目の挑戦で5点を獲得しました。
*6ロボット2のプログラム [#v17ca8d4]
**定義した定数 [#m8dbe029]
#define SPEED_SLOW 25
const float diameter = 5.45; //タイヤの直径(cm)
const float track = 10.91; //タイヤのトレッド幅(cm)
const float pi = 3.1415; //円周率
**定義したサブ関数 [#c60ab012]
void fwdDist(float d) //距離 d cm 前進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,0,true,true);
}
void baDist(float d) //距離 d cm 後進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤ...
RotateMotorEx(OUT_AB,SPEED_SLOW, -angle,0,true,true);
}
void turnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang; //必要なタイヤの...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,100,true,true);
}
void nturnAng(long ang) //角度ang度の時計回りの旋回
{
long angle = track/diameter * ang; //必要なタイヤの...
RotateMotorEx(OUT_AB,SPEED_SLOW, angle,0,true,true);
}
int searchDirection(long ang) //現在の方向を中心にang度...
//障害物までの距離を返す
{
long tacho_min ; //もっとも近い距離を実現するタイヤ...
int d_min = 300 ; //もっとも近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタ...
turnAng(ang/2); //指定された角度の半分を旋回
ResetTachoCount(OUT_AB); //角度計測をリセット
OnFwdSync(OUT_AB,SPEED_SLOW,-100); //反時計回りに旋回
while(MotorTachoCount(OUT_A)<=angle){
if (SensorUS(S1)<d_min){ //現在の距離が仮...
d_min = SensorUS(S1); //仮の最小値を更新
tacho_min = MotorTachoCount(OUT_A); //この時...
}
}
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_A)<=tacho_min || SensorUS(S...
Wait(14); //微調整
Off(OUT_AB);Wait(500);
return d_min;
}
sub c_up(float d) //645で最大
{
RotateMotor(OUT_C,-30,d);
Off(OUT_C);
}
sub c_down(float d)
{
RotateMotor(OUT_C,30,d);
Off(OUT_C);
}
**実行するプログラム [#d16e94a6]
task main()
{
SetSensorLowspeed(S1);
//紙コップの方向を探した後、近づいて25cm手前で停止
int d = searchDirection(30);
if (d > 10){
fwdDist(d-25.0);
}
turnAng(200);
c_down(640);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(12.0);
c_up(260); //紙コップをつかむ
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(110);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(11.0);
c_up(330); //ピンポン玉をはなす
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(90);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(17.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(80);
ResetTachoCount(OUT_AB); //角度計測をリセット
int e = searchDirection(40);
int msg; // 受け取った値を格納する変数
while (true) {
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == 1){
break;
} else {
Off(OUT_AB);
}
Wait(100);
}
Off(OUT_AB);Wait(3000);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(30);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(15.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
int f = searchDirection(30);
if (f > 10){
fwdDist(f-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(8.0);
c_down(100);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(2.0);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE); //微...
Off(OUT_AB);
fwdDist(12.0);
c_up(100);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(230);
ResetTachoCount(OUT_AB); //角度計測をリセット
int g = searchDirection(20);
if (g > 10){
fwdDist(g-25.0);
}
turnAng(190);
c_down(630);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(16.0);
c_up(270);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(140);
c_up(340);
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(290);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(12.0);
ResetTachoCount(OUT_AB); //角度計測をリセット
int h = searchDirection(20);
if (h > 10){
fwdDist(h-25.0);
}
ResetTachoCount(OUT_AB); //角度計測をリセット
turnAng(156);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(8.0);
c_down(100);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
baDist(2.0);
OnFwdSyncEx(OUT_AB,SPEED_SLOW,100,RESET_NONE);
Off(OUT_AB);
fwdDist(12.0);
}
残念ながら私はこのプログラムをつくっておらずあまり詳しく...
このプログラムは私のプログラムとは違って超音波センサーを...
*7私のプログラムはなぜ超音波センサーを使わなかったのかと...
元々はある程度近づいたら超音波センサーを使って正確に紙コ...
また正確に左旋回をするために
sub turnLg(long ang)
{
long angle = (track/diameter)*ang; //旋回角度からタイ...
ResetTachoCount(OUT_AB); //角度計測をリセット
OnFwdSync(OUT_AB,SPEED_SLOW,-100); // 反時計回りに旋回
until(MotorTachoCount(OUT_A)==angle);
Wait(20);
Off(OUT_AB);
}
というサブ関数を定義して動かしてみましたが、このサブ関数...
今回の課題はテスト期間と重なりかつ期間の短かったので十分...
ページ名: