- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*課題2 [#gc83284e]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
自分はコース1を選択した。
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=2018b-mission2.png&refer=2018b%2FMember%2Fyamada%2FMission2
*ロボットについて [#o99e9921]
ロボットの写真
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=C28CF2AD-EBF7-4DC6-BAD4-E41C3BCDE9D9.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2
前方から撮影したセンサー部分の写真
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=721D9563-2EBC-45A6-92F9-D74A4BE851C6.jpeg&refer=2018b%2FMember%2Fyamada%2FMission2
**ロボット本体への工夫 [#oac0b510]
カラーセンサーを設計図よりタイヤに近づけるためにできるだけ元の車体バランスを崩さないようにしながらNXTの真下の部品を1段分後ろに下げた。
それによって急なカーブをより良い精度で通過できるようになった。
**センサー部分への工夫 [#vab13230]
前述の通り設計図と比べてタイヤの近くに配置することで急なカーブの成功率を上げた。
**ボールを保持するための部分の説明 [#m5d5a43a]
3つ目のモーターで上下できる柵を取り付けた。
ボールをシュートした後も柵を完全に上げきることでちょうどNXTの上部に来るので柵の重さによって車体が傾き、地面とカラーセンサーの距離があまり変わらないようにした。
**ボールをシュートする方法 [#f7193112]
缶の方向を向いた後に柵を上げ前進することでボールに体当たりをする。ロボットの設計段階で道順の中でボールを拾うと勘違いしていたのでタッチセンサーがついているが修正する時間がなかったのでシュートするときにボールが当たる部分として使うことにした。
**改善点 [#q1c201c4]
シュートする部分に関して、他のグループが作っていたようにロボット上部から転がすという形を取っていればシュートの精度もプログラムの質も格段に上がったように思った。
*プログラムについて [#j8cc8344]
**実際のプログラム [#tae93a47]
#define THRESHOLD 54
#define SPEED 30
#define speed 20
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#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);short_break;
#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);
sub kousaten_trace()
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()
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;
}
sub kousaten_teishi()
sub kousaten_teishi() //交差点を判断したら1秒間停止した後再発進
{
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;
}
sub serch_kan()
sub serch_kan() 360°回転して障害物(缶)を見つけ出しその方向に向かう
{
SetSensorLowspeed(S4);
long t10,t11;
int L=10000;
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);
}
sub shoot()
sub shoot() //シュート(体当たり)をする
{
arm_up;
OnFwd(OUT_BC,100);
Wait(200);
Off(OUT_BC);
OnRev(OUT_BC,100);
Wait(100);
Off(OUT_BC);
}
task main()
{
SetSensorLight(S3);
SetSensorLowspeed(S4);
long t0,t1,t2,t3;
t0=CurrentTick();
while(CurrentTick()-t0<=15000){
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();
t1=CurrentTick();
while(CurrentTick()-t1<=15000){
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();
t3=CurrentTick();
while(CurrentTick()-t3<=50000){
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();
kousaten_trace();
OnFwd(OUT_BC,30);
Wait(2000);
Off(OUT_BC);
}
**プログラムの説明と反省 [#y27f08f7]
基本的にはタイマーで時間を計りながら交差点判断をするかしないかを決めているためこのコースでしか使えないうえに想定した以上にスムーズに進んだり時間がかかったりしてしまうとコースを間違えてしまうためコースを完走しないことが多くなってしまった。
基本的にはタイマーで時間を計りながら交差点判断をするかしないかを決めている。そのためこのコースでしか使えないうえに想定した以上にスムーズに進んだり時間がかかったりしてしまうとコースを間違えてしまうためコースを完走しないことが多くなってしまった。
時間ではなく、タイヤの回転角などで距離を測りながら進むと今よりは成功率の高いプログラムになったのではないだろうか。
*実際のコース攻略 [#udea7385]
**当初の計画 [#q9faae0e]
**失敗例 [#w1b2a956]
*全体を通して [#q23ba7ce]
前回のプログラムに比べればコンパクトで綺麗なプログラムに仕上がったと思うが、ほかのグループの人たちと比べるとプログラムやロボットへの工夫や綺麗さは劣っているので、ロボコンまでにできる限り同じレベルになれるように頑張りたい。
前回のプログラムに比べればコンパクトで綺麗なプログラムに仕上がったと思うが、ほかのグループの人たちと比べるとプログラム、ロボットへの工夫や綺麗さは劣っているので、ロボコンまでにできる限り同じレベルになれるように頑張りたい。また、前回に比べて綺麗に仕上がったといってもまだ無駄の多く回りくどい方法をとったプログラムであると思うのでもう少しコンパクトなプログラムを書けるように努力したい。