2018a/Member/Sato/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2018a/Member]]
目次
#contents
*課題 [#q37cb201]
缶を指定された場所に運ぶロボットを作り、プログラミングする。
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission3&openfile=2018a-mission3.png
**フィールド [#x922fd49]
-フィールドは課題2で使用した紙を使用する。
-2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。
-空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。
**ルール [#maaab090]
-競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
-図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
-Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。
-開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
*ロボット [#w3dc3fcb]
**全体 [#b3533487]
#ref(ロボ3.1.jpg)
-全体的にバランスが悪くなってしまった。
-そのままだと重心が前にいきすぎてしまうので、後ろ使わなくなった電池を積んでいる。(写真撮り忘れ)
**下の缶 [#a5aedd15]
#ref(ロボ3.2.jpg)
-このアームは下の缶を固定するためだけのもの
-ギアがなかなか噛み合わずギアの大きさの調整が少し大変だった。
**真ん中の缶 [#t0f3cbfe]
#ref(ロボ3.4.jpg)
-前に付いているタイヤで真ん中の缶を押し出す構造。
#ref(ロボ3.5.jpg)
-このギアが回って前後に動く仕組み。
-ギアとモータが直で繋がっているためプログラムでパワーを抑えないと思いっきり動いてしまう。
**上の缶 [#p61523dc]
#ref(ロボ3.3.jpg)
-上の缶を左のキャタピラで押さえて、右のキャタピラを動かして缶を上に上げる仕組み。
-最初は1番下から上に上げようとしたが、キャタピラの長さ的に無理だった。
*プログラム [#e72e0e22]
**下のRCX [#x901f19f]
#define LOWPOWER 1
#define HIGHPOWER 6
#define B 39 //黒
#define W 40 //白
#define turn_r
OnFwd(OUT_A);OnRev(OUT_C);SetPower(OUT_AC,HIGHPOWER); //右旋回
#define turn_l
OnFwd(OUT_C);OnRev(OUT_A);SetPower(OUT_AC,HIGHPOWER); //左旋回
#define go
OnFwd(OUT_AC);SetPower(OUT_AC,LOWPOWER);
//直進
#define catch_sita Off(OUT_B);SetPower(OUT_B,LOWPOWER);OnFwd(OUT_B); //下の缶を掴む
#define release Off(OUT_B);SetPower(OUT_B,LOWPOWER);OnRev(OUT_B); //下の缶を放す
#define stay Off(OUT_AC); //止まる
//通信用定義
#define CATCH_UE 11 //上の缶を掴ませる
#define STAY 12 //止まらせる
#define RELEASE 13 //上の缶を放させる
#define GO_TRACE 14& //トレースに戻る
#define PUSH 15 //真ん中の缶を落とさせる
#define DOWN 16 //上の缶を下ろさせる
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
ClearMessage();
int blackN = 0; //T字路の判断
while(blackN <= 1){
if(SENSOR_1 >= WHITE && SENSOR_3>= WHITE)
//トレース開始
go;
}else if(SENSOR_3 <= BLACK && blackN == 0){ //曲がり角判断
go;Wait(50);
stay;Wait(50);
turn_r;
Wait(125);
blackN++; //黒に入った回数をカウント
}else if(SENSOR_3 <= B && blackN == 1){//T字路判断
stay;
blackN++;
}
stay;Wait(30); //一時停止
}
catch_sita;Wait(60);Off(OUT_B); //下の缶を掴む
SendMessage(CATCH_UE);Wait(800); //上の缶を掴む命令を出す
while(Message() == GO_TRACE)
{SendMessage(STAY);
stay;Wait(50);
OnFwd(OUT_AC);Wait(300);stay;
ClearMessage();
}
}
**上のRCX [#q4b0578f]
#define LOWPOWER 2
#define catch_ue OnFwd(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100); //上の缶を掴む
#define release OnRev(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100);Off(OUT_C); //上の缶を放す
#define lift_up OnFwd(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(100);Off(OUT_A); //上の缶を上げる
#define lift_down OnRev(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(200);Off(OUT_A); //上の缶を下ろす
#define push OnFwd(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B); //真ん中の缶を落とす
#define reload OnRev(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B); //缶を落とす機構を戻す
#define stay Off(OUT_AC); //静止
//通信用
#define CATCH_UE 11 //上の缶を持ち上げる
#define STAY 12 //静止する
#define RELEASE 13 //上の缶を放す
#define GO_TRACE 14 //トレース動作に戻させる
#define PUSH 15& //真ん中の缶を落とす
#define LIFT_DOWN 16 //上の缶を下ろす
task main(){
ClearMessage();
int CT1=0; //缶のタワー1に対する動作の区別
while(CT1 == 0){
if(Message()==CATCH_UE)
{grip_ue; //上の缶を掴む
stay;Wait(50);
CT1++; //缶のタワー1に対する操作終わり
}else{
stay;
}
}
lift_up; //上の缶を持ち上げる
stay;Wait(50);
push; //缶を押し倒す
Wait(50);
reload; //落とすのに使った機構を戻す
stay;Wait(50);
lift_down; //上の缶を下ろす
SendMessage(GO_TRACE); //トレース再開
}
*まとめ [#t9cfe28c]
**結果 [#l9a5b72b]
-練習では確実に3点取れるようになっていたのだが、本番では思うように動かず0点だった。
**反省点 [#s14d4cb2]
-ロボットをもっとコンパクトにできれば良かった。
-ロボットを作る時間をかけすぎてしまって、プログラミングする時間があまりなかった。
-RCX同士の通信をもっと上手くできればよかった。
**感想 [#saffc580]
-課題1、2で習ったことを生かしてプログラミングできた気がするが、なかなか上手くいかなかった。
-ここで学んだプログラミングを少しでもこれからに生かしたい。
終了行:
[[2018a/Member]]
目次
#contents
*課題 [#q37cb201]
缶を指定された場所に運ぶロボットを作り、プログラミングする。
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission3&openfile=2018a-mission3.png
**フィールド [#x922fd49]
-フィールドは課題2で使用した紙を使用する。
-2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。
-空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。
**ルール [#maaab090]
-競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
-図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
-Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。
-開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
-途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
*ロボット [#w3dc3fcb]
**全体 [#b3533487]
#ref(ロボ3.1.jpg)
-全体的にバランスが悪くなってしまった。
-そのままだと重心が前にいきすぎてしまうので、後ろ使わなくなった電池を積んでいる。(写真撮り忘れ)
**下の缶 [#a5aedd15]
#ref(ロボ3.2.jpg)
-このアームは下の缶を固定するためだけのもの
-ギアがなかなか噛み合わずギアの大きさの調整が少し大変だった。
**真ん中の缶 [#t0f3cbfe]
#ref(ロボ3.4.jpg)
-前に付いているタイヤで真ん中の缶を押し出す構造。
#ref(ロボ3.5.jpg)
-このギアが回って前後に動く仕組み。
-ギアとモータが直で繋がっているためプログラムでパワーを抑えないと思いっきり動いてしまう。
**上の缶 [#p61523dc]
#ref(ロボ3.3.jpg)
-上の缶を左のキャタピラで押さえて、右のキャタピラを動かして缶を上に上げる仕組み。
-最初は1番下から上に上げようとしたが、キャタピラの長さ的に無理だった。
*プログラム [#e72e0e22]
**下のRCX [#x901f19f]
#define LOWPOWER 1
#define HIGHPOWER 6
#define B 39 //黒
#define W 40 //白
#define turn_r
OnFwd(OUT_A);OnRev(OUT_C);SetPower(OUT_AC,HIGHPOWER); //右旋回
#define turn_l
OnFwd(OUT_C);OnRev(OUT_A);SetPower(OUT_AC,HIGHPOWER); //左旋回
#define go
OnFwd(OUT_AC);SetPower(OUT_AC,LOWPOWER);
//直進
#define catch_sita Off(OUT_B);SetPower(OUT_B,LOWPOWER);OnFwd(OUT_B); //下の缶を掴む
#define release Off(OUT_B);SetPower(OUT_B,LOWPOWER);OnRev(OUT_B); //下の缶を放す
#define stay Off(OUT_AC); //止まる
//通信用定義
#define CATCH_UE 11 //上の缶を掴ませる
#define STAY 12 //止まらせる
#define RELEASE 13 //上の缶を放させる
#define GO_TRACE 14& //トレースに戻る
#define PUSH 15 //真ん中の缶を落とさせる
#define DOWN 16 //上の缶を下ろさせる
task main(){
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
ClearMessage();
int blackN = 0; //T字路の判断
while(blackN <= 1){
if(SENSOR_1 >= WHITE && SENSOR_3>= WHITE)
//トレース開始
go;
}else if(SENSOR_3 <= BLACK && blackN == 0){ //曲がり角判断
go;Wait(50);
stay;Wait(50);
turn_r;
Wait(125);
blackN++; //黒に入った回数をカウント
}else if(SENSOR_3 <= B && blackN == 1){//T字路判断
stay;
blackN++;
}
stay;Wait(30); //一時停止
}
catch_sita;Wait(60);Off(OUT_B); //下の缶を掴む
SendMessage(CATCH_UE);Wait(800); //上の缶を掴む命令を出す
while(Message() == GO_TRACE)
{SendMessage(STAY);
stay;Wait(50);
OnFwd(OUT_AC);Wait(300);stay;
ClearMessage();
}
}
**上のRCX [#q4b0578f]
#define LOWPOWER 2
#define catch_ue OnFwd(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100); //上の缶を掴む
#define release OnRev(OUT_C);SetPower(OUT_C,LOWPOWER);Wait(100);Off(OUT_C); //上の缶を放す
#define lift_up OnFwd(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(100);Off(OUT_A); //上の缶を上げる
#define lift_down OnRev(OUT_A);SetPower(OUT_A,LOWPOWER);Wait(200);Off(OUT_A); //上の缶を下ろす
#define push OnFwd(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B); //真ん中の缶を落とす
#define reload OnRev(OUT_B);SetPower(OUT_B,LOWPOWER);Wait(100);Off(OUT_B); //缶を落とす機構を戻す
#define stay Off(OUT_AC); //静止
//通信用
#define CATCH_UE 11 //上の缶を持ち上げる
#define STAY 12 //静止する
#define RELEASE 13 //上の缶を放す
#define GO_TRACE 14 //トレース動作に戻させる
#define PUSH 15& //真ん中の缶を落とす
#define LIFT_DOWN 16 //上の缶を下ろす
task main(){
ClearMessage();
int CT1=0; //缶のタワー1に対する動作の区別
while(CT1 == 0){
if(Message()==CATCH_UE)
{grip_ue; //上の缶を掴む
stay;Wait(50);
CT1++; //缶のタワー1に対する操作終わり
}else{
stay;
}
}
lift_up; //上の缶を持ち上げる
stay;Wait(50);
push; //缶を押し倒す
Wait(50);
reload; //落とすのに使った機構を戻す
stay;Wait(50);
lift_down; //上の缶を下ろす
SendMessage(GO_TRACE); //トレース再開
}
*まとめ [#t9cfe28c]
**結果 [#l9a5b72b]
-練習では確実に3点取れるようになっていたのだが、本番では思うように動かず0点だった。
**反省点 [#s14d4cb2]
-ロボットをもっとコンパクトにできれば良かった。
-ロボットを作る時間をかけすぎてしまって、プログラミングする時間があまりなかった。
-RCX同士の通信をもっと上手くできればよかった。
**感想 [#saffc580]
-課題1、2で習ったことを生かしてプログラミングできた気がするが、なかなか上手くいかなかった。
-ここで学んだプログラミングを少しでもこれからに生かしたい。
ページ名: