[2011 年 2 月号] |
[レポート]
ETロボコン2010において、9月5日に行われた東京地区大会2日目で総合優勝、12月1日のチャンピオンシップ大会で総合10位という、
新人チームとしては大きな成果を残した芝浦雑伎団。
本記事では、芝浦雑伎団のメンバがその舞台裏・エピソードを紹介します。
ETロボコンに参加された方以外にも、その面白みや参加する意義が伝われば幸いです。
ETロボコン2010というイベントについてご存じでない方は、ETロボコン2010公式サイトをご覧ください。また、ETロボコンの競技規約についてご存じない方は、公式サイトの競技規約のページをご覧ください。
なお、本記事では技術的な解説よりも、チームの雰囲気を伝える文章になっていますので、楽しくお読みください。それではどうぞ!
チームを構成するのは、集合研修を終えて7月からロボコンに取り組むことになった組み込み部の新人3人。
3人とも制御理論は素人。C++初心者が2人。共通点は、自己主張が強いこと。
…そんな装備で大丈夫か?
7月に開発をスタートしたためあまり時間がないので、とりあえず動くものを作りつつ、モデルシートを作成。 モデルが固まり次第、実装をモデルに沿ったものに変更した。
チャンピオンシップまでの間は、モデルシートの見直しと難所の攻略にほぼ費やされた。
7月1日 | 組み込みソリューション部配属、開発スタート |
7月24日 | 東京地区 第1回 試走会 |
8月20日 | モデル提出 |
8月21日 | 東京地区 第2回 試走会 |
9月5日 | 東京地区大会・モデルワークショップ |
11月15日 | チャンピオンシップ大会試走会・モデル提出 |
12月1日 | チャンピオンシップ大会 |
12月2日 | モデルワークショップ |
そもそも、ロボット(走行体)をどうやって動かせばいいのか、まず調べる必要があった。
ロボットは倒立振子というもので、2輪で前後のバランスをとりながら進むのだが、
そのバランスを取る部分はライブラリ化されていて、forward(前進)とturn(旋回)という2つの値を与えると走行する。
幸い、サンプルコードが提供されているので、早速、動かしてみる。
すると、ぎこちない動きでラインをトレースする。おお、すごい。
でも、去年の動画を見るともっと滑らかに走っていなかったっけ?
…ということで調べてみると、PID制御というものを使っているらしい。何それおいしいの?
微積分が苦手な島崎は江藤にバトンタッチ。アルゴリズムを調べて、サンプルコードの中にゴリゴリと実装。
パラメータの加減がなかなか分からなかったが、なんだか滑らかに走るようになってきた。
直線は速く、カーブは安全に曲がりたい。コースの途中で速さを変えるにはどうしよう?
今どの区間を走っているかを表す変数を作り、その変数の値で動作を切り替えるように、これまたswitch文でゴリゴリと実装。
でも、区間を追加するたびにcaseが増えるし、breakの書き忘れによるバグが多発していた。
そんな中、7月も後半に差し掛かっていた。そろそろモデリングもしないと…
所属部署の集合研修ではビジネス系のモデリングは習ったけれど、組み込み系のモデリングって、一体どうすればいいの?
ETロボコンの公式技術教育を受けていないこともあり、戸惑いを隠せない3人。
部内の研修を受けるうちに、なんとなく感覚がつかめてきたので、モデリングを開始。
モデリングでは、どんな視点で考えたかが大事。そこで、まずは方針やコンセプトを決めるため、話し合う。
東京大会の会場では外乱光が入り、それでコースアウトをするチームが例年後を絶たないらしい。
じゃあ、「スピードを上げずに難所も回避し、地味にゴール」にしよう。よしこれに決まり!
…のはずだったが、翌週のミーティングでは「ロボコンの醍醐味は難所を攻略することだろう」という意見が噴出。
メンバー間でコンセプトが違っていることが発覚。自分たちがやりたいことって何だろう?
「考える人」のようになって考えても一向に答えは出ない。
もう地獄の門が開きそうだ。
議論の末、「優勝する」というゴールを中心に分析することにした。
そこから生まれたのは、冒険するのも安全に行くのも選べるようにして、確実に勝ちに行くという方針。
つまり、安全な走りを優先しながら、必要に応じて難所やショートカットに挑戦して、好成績につなげるということだ。
必然的に、機能の着脱が容易なモデルにしようという流れができてきた。
東京地区大会で提出したモデルシート(PDF : 約700KB)
コース上の一部分に対応する「走行区間」、走り方を決める「走行法」、走り方を切り替えるタイミングを決める「終了条件」の3クラスに責務を分担させ、
そのサブクラスの組み合わせで機能を実現するモデルにした。
これなら、決められたインタフェースを守る限り各部品を自由に開発できるし、チューニングもしやすい。
このモデルを基に実装していくことで、switch文変更の苦行からついに逃れることができた。
本番3日前。モデルシートで挑戦すると宣言した難所、階段は結局攻略できず。
このままでは終われない! よし、ミステリーサークルをやろう。衝立の読み取りができれば、あとは難しくないはず…
ミステリーサークルとは…(詳しくは競技規約を参照)
指定された3箇所に衝立(ペットボトル)が置かれているかを認識し、4パターンのルートを選択するというもの。
間違ったルートを走るとリタイアとなってしまう。
まず、超音波で衝立を読み取る部分(エニグマ・デコーディング)を作る。これは、クラス図(図2の「エニグマ区間」)にも描いたように「走行区間」の一種にする。
「走行法」に実装すると、走り方が変えられないし、だいいち、衝立があるのはコース中の特定の部分なのだから、「走行区間」が適任だ。
超音波センサのAPI仕様は…っと、障害物までの距離を数値で返してくれるのか。意外とあっさりできた。
次に、ミステリーサークル部分。走行ルートを選択するということは、「走行区間」を複数用意して、そこにそれぞれのルートの走り方を組めば良いはず。
これも、あっさりできた。なかなか、妥当なモデルだったらしい。
問題はチューニング。4パターンをそれぞれ、こつこつチューニングするしかない。
この頃、すでにオフィスの戸締まりをマスターしていた。金曜日の23:00PM、ようやく完成宣言。
予備で、ミステリーサークルを通らないパターンも用意しておこう。終電だ!ダッシュ!
そ し て 、 当 日
試走時、やっぱりというか、なぜかミステリーサークルをうまく走れない。
なぜだ… これが本番に棲むという魔物か!
とりあえず、黒認識がうまく行かず、ショートカットに失敗することは分かった。
コードを変更する余裕はないので、強引に灰色を黒として認識させて対処する。
先に、アウトコースの走行(動画)。壇上で山本が「本日最速を目指す」宣言をして煽る。
宣言通り、早いペースで順調に走行。シーソー脇を華麗にスルーしてゴール。ガレージインには失敗したが、十分合格の走り。
問題はインコース。悔しいが不安定な状態で走行させ、失格になるわけにはいかない。予備のプログラムで走ろう。
え?予備が動かない? メンバー間に不穏な空気が漂う。もういやだ。
何度もビデオを見返して、原因を探る。もう試走できないので、脳内でシミュレーションするしかない。
もうなんとでもなれ。変更したコードを読み上げ3人でロジックを何度もチェックした。
緊張のインコース。頼む。うまく行ってくれ…(動画)
会場の注目が集まる中、なんとか成功!感動した。そして無事にゴール。危険な賭けだったが、やってよかった。
これが功を奏して、ぶっちぎりの競技優勝。
東京大会を競技・総合ダブル優勝という輝かしい成績で突破することができた芝浦雑伎団。(モデリングがウリの会社なのに、競技で進出していいのか?)
開発を始めたときには予想だにしていなかったが、チャンピオンシップに進出することに。
チャンピオンシップでは、これまで(鮮やかに)避けて通ってきた3D難所を攻略しなければ勝ち目は無い。
シーソーはなんとなく攻略できたが、2段ある階段が難題となっていた。1段目を登った勢いで、2段目にぶち当たって倒れてしまうのだ。
どうにか1段目で止まることはできないか。そんなとき…
島崎「forward(前後進の指令値)を急に-200とかにしてみたら、止まるんじゃない?」
山本・江藤「ねーよ!」
非難轟々であった。常識的な反応ともいえる。なにせ、動作が保障される範囲は-100~100とされている。
(とはいえ、forwardを150ぐらいにして高速化するのは、もはや普通になっていた)
実際にやってみたところ、失敗も多かったが確かに1段目で止まることができ、大きな進歩となった。
さらに調整を繰り返すことで、ほぼ確実に成功できるまでになった。
補足:
これぐらい極端な値にしなければ止まれないのは、倒立制御APIの仕様上、内部で指令値に対するローパスフィルタが掛けられているため。
モデルシートも納得できるレベルのものにするべく、全面改訂を決意した。 地区大会までの反省を活かし、こんな対策を立てた。
話し合いを繰り返すうち、「本当に自分たちが考えていること」が徐々に浮かび上がっていった。
そして、モデルシートは「今の実力を出し切った」とまで言い切れるものになった。
チャンピオンシップ大会で提出したモデルシート(PDF : 約1MB)
試走会当日。会場には強い日光が差し込み、そのままの設定ではコースアウトしてしまった。
走れなければ話にならないので、応急処置を施す。会場が明るいということは、ラインの境界も普段より白っぽいはず。
そこで、目標値が白寄りになるよう、テキトウに補正する。
このときの変更が後に大きな影響を及ぼすなどとは、当時知る由もない。ひたすら、実物の階段に取り組んだ。
同じ頃モデルの提出も締め切り。印刷トラブルはあったものの、試走会当日に手渡しで提出した。
当日までの間、試走の効率を上げるための工夫をいろいろ行った。作り掛けてやめていたコース選択を実装。
他のチームがやっていた、モータエンコーダをUIとして使って値を調節する手法も取り入れた。
これで、ガレージインの角度微調整も簡単にできるはず!
念入りに準備して迎えた当日。だが、試走させてみるとナンダカ動キガオカシイ…
異常は2つ、どちらもインコース。一つは、衝立が正常に読み取れていないこと。
もう一つは、ミステリーサークルの後でラインから離れがちなことだった。まずい!!
一つ目の問題は、超音波センサの値を確認するテストを用意していたのが報われた。走行自体に関係のない機能だが用意しておいて本当によかった!
どうやらセンサにホコリがついていて、障害物があるように認識されていたらしい。
もう一つの問題は、よく分からなかった。速度を上げすぎているのだと思い、念のため速度を落とすようにした。
頼む、これで直ってくれ…!
そして迎えた本番。先にアウトコースを走行(動画)。スタートは無事に成功。シーソーを抜け、心配な階段へ。
これも無事にクリアし、ラインにも復帰。ガレージインは失敗したが、好調な結果。
不安の残るインコースの走行(動画)。スタートは好調。ショートカットもきれいに決まった。ミステリーサークルも正常。
そして問題の箇所。ふわりとラインから離れていく。あああ、もうだめだ…
わかったぞ!P制御が足りなかったんだ!
今更分かってももう遅い。偶然ラインに戻るも、あらぬところでガレージイン。あーあ。
夏は終わった…(とっくに終わってるって!)
解説:何が起きていたの?
P制御は、目標値と現在値の差を元に制御量を決めるが、試走会のとき、応急処置として目標値を絶対値で白寄りにした。
ところが、当日の会場は比較的暗く、白と黒の差が小さかった。
そのため、白と目標値の差が小さくなり、ラインから離れた時に十分な制御量が得られなくなっていた。
Q. ロボコンやってみてどうでしたか?
島崎「結果に悔いは残るけれど、勉強になりましたね。C++のこともよくわかったし…」
山本「ちゃんとテストしなかったのは誰だよ…」
江藤「まあまあ、新人としては健闘したってことで。(誌上でもめるなっつの)」
Q. 来年参加するチームへのアドバイスは?
山本「走行体の基本性能調査はしっかりしたほうが良いと思います。シーソー上停止に光センサを使っているチームがありました。
そのアイデアはあったのですが、ろくに実現性を調査していなかったため着手しなかったところ、見事に決められてしまいました。」
島崎「出力している制御量を数値でしっかり把握すること、先入観で試す値の範囲を狭めないことが大事だと思いますね。
それから、何としてもゴールにたどり着く工夫はやはりする価値があると思います。ガレージイン後、コースに復帰したら面白いとか冗談で言っていたのですが、やっておけばゴールできたかもしれません。」
江藤「問題はチームでどんどん共有すべきです。お互いに問題を知ることで、新たな解決方法が浮かんだり、今までになかった考えが浮かんだりします。
初めは問題だらけで大変かと思いますが、チーム全体で徐々に前進しつつ頑張ってほしいと思います。」
東京大会提出のモデルシートと、チャンピオンシップ大会提出のものを見比べれば、成長を感じていただけるかと思います。
このロボコン参加を通じて、C++やモデルの実装に親しむことはもちろん、設計を人に伝えるという点でとても勉強になりました。
田町レーシングのモデルとほんのり似ていたけれど、それは先輩の教えを忠実に守った結果のはず。最初は型を学ぶのが大切ですよね。
来年もなんらかの形でETロボコンに関わりたいと思っています。「東京連合」の活動も引き継いで行きたいですね。
© 2011 OGIS-RI Co., Ltd. |
|