第29回マイクロマウス東北地区大会で足立法を実装した話

東北大会

マイクロマウス東北地区大会は,我々Miceが毎年大変お世話になっている大会です.
毎年多くのフレッシュマンが精神と時の部屋でとてつもない成長を遂げます.

本年度も6人のフレッシュマンがエントリーし,うち3名が完走.そしてその3名が上位1〜3位を独占という結果になりました! まずは良い結果になり,ホッとしています.正直自分の出走より何倍もドキドキしていました.

反省点も色々と考えているようなので,次の大会も期待しています.博多ラーメン食べられるのが今週の活力.

精神と時の部屋での成長

調整時間にあまり他の人に構えなくて申し訳なく思っていますが,なんせ自分の進捗が怪しいので頑張っていました.

今年のマウスはマイコンを変えただけでなく,プログラムをイチから書き直しています.というのも,コンパイラを変えたことでC++14が使えるようになったので,色々と直したいところが出てきたためです.
ついでにクラス設計も考え直しました.今のところ,いい感じにコードが動いているように思います.

さて,そのせいもあり,容易には昨年度のプログラムを流用することができなくなっています.
精神と時の部屋では,壁情報の保存,歩数マップの展開,足立法の実装を終えることができました.(あれっ,進捗遅くない???)
そういえばモードを実装しようと思っていましたが,間に合いませんでした.そのうちがんばります.

さて,ここからは技術的な話.毎度言っていますが,参考にするときは完全に自己責任で.より良い方法があればご教示いただきたいです.
足立法で走行するプログラムは,こんな感じになっています.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
VelocityControl vc;
Position pos;

Adachi adachi;
Map map;
Walldata walldata;
WallSensor wall;

adachi.setGoal(11, 11);
vc->runTrapAccel(0.0f, 0.25f, 0.25f, 0.045f, 2.0f); while(vc->isRunning());

while(true){
walldata = wall->getWall();
map.addWall(pos.getPositionX(), pos.getPositionY(), pos.getAngle(), walldata);

adachi.setMap(map);
adachi.renewFootmap();
slalomparams::RunType runtype = adachi.getNextMotion(pos.getPositionX(), pos.getPositionY(), pos.getAngle(), walldata);

if(runtype == slalomparams::RunType::TRAPACCEL){
vc->runTrapAccel(0.25f, 0.25f, 0.25f, 0.078f, 2.0f); while(vc->isRunning());
} else if(runtype == slalomparams::RunType::PIVOTTURN){
vc->runTrapAccel(0.25f, 0.25f, 0.0f, 0.045f, 2.0f); while(vc->isRunning());
vc->runPivotTurn(360, 180, 1000); while(vc->isRunning());
vc->runTrapAccel(0.0f, 0.25f, 0.25f, 0.045f, 2.0f); while(vc->isRunning());
} else if(runtype == slalomparams::RunType::SLALOM90SML_RIGHT){
vc->runSlalom(RunType::SLALOM90SML_RIGHT, 0.25f); while(vc->isRunning());
} else if(runtype == slalomparams::RunType::SLALOM90SML_LEFT){
vc->runSlalom(RunType::SLALOM90SML_LEFT, 0.25f); while(vc->isRunning());
} else {
vc->runTrapAccel(0.25f, 0.25f, 0.0f, 0.045f, 2.0f); while(vc->isRunning());
break;
}

pos.setNextPosition(runtype);

if(pos.getPositionX() == 11 && pos.getPositionY() == 11){
vc->runTrapAccel(0.25f, 0.25f, 0.0f, 0.045f, 2.0f); while(vc->isRunning());
break;
}
}
adachi.setMap(map);

壁情報を Walldata クラスでやり取りできるので,記述がなかなか楽になっています.
それから,足立法と座標管理部分と実際のセンサやモータ駆動部分を分離したため,シミュレータにそのまま移植できるはずです.