さすまた報告書
さすまた報告書
まえがき
私たちはロボット“研究会”ですから、既存の技術で既存の大会に出場し、よい成績を残すことは必要条件ですが十分条件ではありません。他大学の同様なサークルとの差別化を図り、国立大学法人化という荒波の中を生き残っていくためには、研究会という名に恥じない“研究成果”を外部に示すことは私たちの至上命題なのです。
こうした理念に則って、2006年知能ロボットコンテストにおいて「地に足のつかないロボット」で優勝を狙う私としては、いわゆる慣性センサと総称される加速度センサ、ジャイロセンサについての研究開発、実績の蓄積は避けては通れない道です。私としてはむしろそちらに専念していたほうが楽しいのですが、組織に属している以上必要条件を満たさないわけにも行きません。そこで今回、この研究活動の一環としてマイクロクリッパ2004に出場することとしました。
クリッパの製作に入る前に、NHK2004が終わった直後から夏休み期間中を通して、クリッパ本体の製作に費やした時間以上の時間をかけて加速度センサ、ジャイロセンサそのものについての下調べ、入手可能なセンサとその性能の調査、さらに実際に購入したセンサを使っての実験をしました。これについての報告は後日、資料がまとまり次第アップロードします。ここではクリッパの設計段階からの報告とします。
マシンの設計
実験に使用した秋月の加速度センサでは迷路を走れるレベルの位置制御が困難であると判断したため、今回のクリッパでは実装を見送り、ジャイロセンサのみを使うことにしました。ジャイロセンサを使うからには、これがないと絶対に制御不可能なマシンにしなければなりません。なぜなら、中途半端にジャイロなしでも動かせるようなマシンにしてしまうと、大会直前になって、もろもろの重圧により自分がジャイロから逃げてしまう可能性があるからです。そうなると今回の目的に反してしまいます。はじめから逃げられないように壁を作っておくわけです。
というわけでどんな構造が良いかといろいろ考えた結果が操舵装置なしの4輪車です。左右2つずつの車輪の速度差で旋回します。ちょうどクローラからベルトをはずしたようなものだと思えばよいです。旋回時にはすべての車輪がスリップするので、従来のエンコーダやステッピングモータでは制御できません。この走行方式は一部の農作業用や建築用の特殊車両にも採用されています。4輪駆動の駆動力とその場旋回が可能という小回りのよさをあわせ持ち、かつ機構が単純であるというのが特長です。ただし、この方式は不整地を走ることを前提としており、タイヤと地面の間の摩擦が小さくないとスムーズに旋回できません。ある程度スピードを出して走りたい場合には摩擦は大きいほうがいいので、旋回性能と加速性能を両立することは不可能です。また、旋回中心が地面の状況によって大きく左右されるため、迷路のような狭い空間で壁にぶつからずに正確な旋回をすることは困難を極めます。つまり、この走行方式は普通に競技に参加して勝とうとしている人たちから見ると、何を考えているのかと不思議がられるほど競技的に不利です。しかし、ジャイロがないと制御不能な走行方式という縛りの中では、比較的実用に耐えるものと判断して、この走行方式に決定しました。
加速度センサによる位置制御を断念しているので、この役割を担う何らかの代替センサを使用する必要があります。旋回で苦労することは覚悟していたので、ここは確実にいってもいいだろうということで、ステッピングモータかDCモータ+エンコーダの選択肢をとることとしました。ステッピングモータではあまりにも確実すぎるので、今回はDCでいくことにしました。マブチの130~260クラスをベースにギア比は50:1前後で一番バランスがよさそうであるという計算結果を元にギアボックスとモータの選定に入りました。今回はジャイロセンサの性能評価が主たる目的なので、マシンそのものはできるだけコストを抑えて、動くために必要最小限の安いもので構成します。コストパフォーマンスでタミヤのツインモータギアボックスに勝るものはなかったので、これを使うこととしました。また、モータはノーマルの130では味がないので、前々から使ってみたかったクラス最強のプラズマダッシュを使うことにしました。プラズマダッシュになるとモータードライバICは使えませんので、FETアレイを使ってHブリッジを組みました。FETアレイは部室の机の引出しの中に転がっていた4AM12です。これはすでに製造終了しています。データシートを見つけるのに苦労しました。もちろん現行モデルも入手できましたが、せっかくあるものは使わないと部品がかわいそうです。
アーム周りはふつうにラジコンサーボを使いました。ただし、自分で買うお金はないので、部にあるやつを使いました。また、従来のクリッパではアームの根元は2本で、先端でつながっているという形が多かったので、今回は根元から1本にしました。
壁センサは去年と同じ回路で、1区画分離れた缶を確実に読むため、より発光強度の強い赤外LEDを選択しました。受光は安いTPS601です。去年との一番の違いはその数です。前回の教訓を元に、缶センサは前と右と左で3つ、前壁センサが1つ、横壁センサが片側に3つずつあります。なぜ横壁センサが3つもあるかというと、壁の切れ目を読むためです。横壁センサは迷路の真中に自分を持ってくるための姿勢情報を読み取るため、壁に対して斜めにつけるのが有効です。しかしそのつけかたで壁の切れ目も読もうとすると、誤差が大変大きくなり、補正には使えません。そこで切れ目を読むセンサと姿勢を読むセンサを分けたわけです。さらに、切れ目の読み取りを確実にするためマシンの前後に切れ目読み取りセンサをつけました。これで片側につき3つです。実際には切れ目読み取りセンサからの情報も姿勢制御に加えたので、完全に役割分担していたわけではありません。また、今回は前缶用センサをアームの両側に受光と発光を分けてつけて、缶がアームの中に入ってきたら光をさえぎるという形にしました。これで一番読み取りが難しい前缶の検知を確実なものにしました。ただし、こうすると常にアームをたおして走らなければならないので、不恰好です。横缶センサは赤外LEDの発光強度を高めたおかげで、PSD以上の精度で検知できるようになりました。
マシンの製作
アルミ板のシャーシを複数スペーサーでつないで積層構造にしています。ギアボックスが載ったシャーシの上にマザーボード、アームのサーボ、ジャイロセンサ、LCDがあり、その上に全体を覆うカバーをつけてあります。ギアボックスの下にはその他の回路、エンコーダがあります。バッテリーは背中に背負うようにして取り付けます。
最初に手をつけたのは足回りです。ツインモータギアボックスの出力軸は2つなので、左右それぞれで前後の車輪を連動して動くようにしなければなりません。長いベルト状のものをキャタピラのようにつなげる方法と、プロペラシャフトで動力を伝える方法で迷っていたのですが、ツインモータギアボックスの軸の強度と精度の問題でベルトをつなげる方法は断念しました。プロペラシャフト方式はミニ四駆で駆動力を前輪あるいは後輪に伝える機構と同じ、クラウンギヤを使うことにしました。傘歯車は高いのと、ミニ四駆の部品を流用すれば安くできるかと思っていたのですが、今時ミニ四駆を売っている店などそうあるはずもなく、かなり苦労してしまいました。ミニ四駆を見つけた後で気づいたのですが、安いプラスチックの小型ギアは東急ハンズにわりと多種類おいてありますので、利用するといいでしょう。
車輪はツクモにあったプラスチックのOリングタイプです。ただ、今回の走行方式ではグリップ力が強すぎました。もう少し幅のあるタイヤにすればよかったと後から思いました。旋回性能を上げるため、最終的にはグリップ力を減らすためにタイヤのゴムにテープを巻きました。
アームの根元を1本にするには車体の中心からアームを出す必要があり、スペースの有効利用の観点から見ると無駄が多いです。いろいろ考えた結果、サーボに直接アームをつけるのではなく、ギアを介することでサーボをアーム軸の下に埋め込み、アームを車体の天井部から出す形にしました。先端のハンドは橋本さんのミニCNCで加工していただきました。手で加工できないものでもなかったのですが、新しい物好きの私としてはどんなものなのか興味があったので、この機会にぜひということでやっていただきました。橋本さんにはいろいろ面倒をかけてしまいまして、感謝しております。ハンドのサーボは部室に転がっていた20gほどのミニサーボを使っていたのですが、大会の数日前のデバッグ中に私のミスでギアをとばしてしまい、最終的には3003を使いました。このサーボの変更だけで缶1つ分の重量が先端に増したことになり、マシン重量が軽かったのとトルク20kg・cmのサーボを最高速で動かしていたのもあいまって、缶を返すときにかなりオーバーに車体が浮くようになってしまいました。改善のしようがなかったわけではないのですが、これはこれで面白いかなということでそのままにしました。車体が浮くのでそのたびに位置が少しずれます。これをエンコーダとジャイロで検出し、補正してあります。そんなに正確に補正できるわけではないのですが、やらないよりはましでした。ところが、本番の迷路では床がよく滑るので、この補正のおかげでだいぶ助かりました。
エンコーダは1つで動輪とは独立して車体の真中に収められています。エンコーダをつけたいところにはちょうどギアボックスがあるので、ギアボックスの位置を上にずらして、空いた下のスペースにエンコーダを収めてしまおうということにしました。あまり大きく上にずらすとその分車軸の高さが上がりますから、タイヤの径を大きくしなければなりません。タイヤが先にあったので、自動的にエンコーダの目標サイズは決められます。小さいエンコーダはないかということで探した結果、ネミコンのOMSシリーズを使用することにしました。このエンコーダはなんと外径12mmです。これにぴったりの車輪は市販品ではないだろうということで、旋盤で作るつもりだったのですが、ちょうどクラウンギアのために買ってあったミニ四駆のサイドのローラーが使えることに気づき、使用しました。
せっかく作った車体下のスペースをエンコーダのためだけに使うのはもったいないので、回路を下に置くことにしました。モータードライブ用のHブリッジ、信号入力用の論理IC、センサ10組分の回路、エンコーダの擬似正弦波出力を方形波に直すためのコンパレータが1枚のユニバーサル基板に載っています。エンコーダとコネクタ関連の分のスペースもあるので、相当密に詰め込まないと全部載りません。また、全部の回路が1つの基板に載っているので、例えばモータードライバ回路が故障したからといってそれだけを取り替えることはできません。これはロボコン的にはやってはいけないことですが、過去に作った経験のある回路ばかりで壊れないように作る自信があったのと、全機能を1枚の基板にまとめることに一種の憧れを抱いていたので、今回は思い切って賭けに出ました。結局回路的にはこれといって致命的な不具合もなく、大会まできちんと動いてくれました。この基板において一番苦労したのは高さ制限です。12mmのエンコーダをつけられるだけのスペースしか空けていないので、基板もほぼこの高さに収める必要があります。設計段階ではすべての素子が基板に実装した状態でこの高さ制限をクリアするはずだったのですが、一番大きなコンデンサの頭の高さを誤って考えていたため、上のシャーシと干渉してしまいました。これを解消するためにシャーシを一部削ることにしたのですが、もともと必要な強度ぎりぎりまで削って軽量化してあるので、部分的に強度不足になってしまい、上から押さえるとばねのようにしなります。何も知らずに見るとショックアブソーバーでもつけてあるかのようにタイヤと車体が別々に動きます。実用上問題はなかったのでそのままにしました。
ハードウェアを通して一番の失敗はエンコーダを壊したことです。今回使用したエンコーダはLEDとフォトトランジスタがそのまま入っているだけです。それぞれA相とB相がありますが、発光側は常時点灯でいいので最初は2つまとめて並列つなぎにして、2つ分の大きさの抵抗を1つつけていました。電流は推奨定格の通りに流していました。ところがある日突然1つのLEDがつかなくなってしまいました。原因はそれぞれにちゃんと抵抗をつけなかったことだと思われます。並列だと2つのLEDの個体差で一つの方に余計に電流が流れてしまう可能性があります。これまであまりそういうことは気にかけていませんでした。やはり横着はせずに基本に中実である方が痛い思いをせずにすみます。おかげで6000円が飛んでいきました。余談ですが、今回このエンコーダの故障関連でテスターの電流測定機能を使う機会があったのですが、レンジの小さい電流はほとんどのテスターで測れませんでした。内部のヒューズが飛んでいるためです。確かにあまり使うものではありませんが、使いたい時に使えないのは不便なので、ヒューズは用意しておくべきです。
H8はさすがに下に収まらないので、ギアボックスの上、アームのサーボとジャイロの隣につけました。その上には秋月のバックライト付2行16列のLCDがあります。
プログラム
アルゴリズム自体は何の工夫もないただの拡張左手法です。全部の区画をまわって、缶があれば返していくだけです。外から見た動きに関しては去年のものよりも単純です。センサが去年よりも増えているので、姿勢制御に関しては去年よりも複雑なことをやっています。というより、制御しにくい構造なので複雑にならざるを得なかったと言ったほうが正しいかもしれません。今回この逆境で培った制御技術を使って制御しやすい構造のマシンをつくれば、去年よりもはるかに正確な走行ができると思います。両壁がある場所を直進する場合は左右の光センサの値を読み取って真中を走ります。どちらかに壁がない場所を直進する場合はあるほうの壁を頼りに真中を走ります。壁がない場所ではジャイロセンサを頼りに走ります。壁がある場合でも光センサだけでなくジャイロからの情報を適当なゲインで混ぜてやることで、光センサのゲインをいじらなくても旋回直後などに余計なふらつきを防ぎつつすばやく姿勢をなおしてくれます。壁の切れ目は壁がある状態からなくなる場合、ない状態からある状態への変わり目、柱のみの場合の3通りについて読み、エンコーダの値を補正します。クリッパの場合はスタートからの16ます直進がお決まりになっているので、去年は壁の切れ目補正なしで相当苦労しましたが、今年はこの点心配いりませんでした。旋回については性能検証の段階で作ってあったプログラムがあったので、ほとんどそのまま利用しました。詳しくはジャイロセンサの報告書で述べます。しかし結局ジャイロセンサに100%頼った旋回は今回は無理と判断して、壁にお尻をぶつけて補正する形をとりました。そのため、4方に壁のない区画があるとかなりつらいです。歴代のクリッパの迷路を見ると簡単なものがほとんどで、こういう状況はほとんどないのではないかと甘く見ていたところ、本番で見事にあたってしまい、それが原因でクラッシュしてその先に進めませんでした。ジャイロによる角度取得についてはまだ開発段階で、センサの性能を出し切っているわけではありません。もう1歩挙動解析を進めればまだ精度がよくなる余地はあります。
1区画前進は最終的にはPD制御に落ち着きましたが、停止時に目標の停止位置から必ず少しずれて止まってしまう問題がなかなか解決できませんでした。一番この問題を解決しにくいものにしていた原因はプラズマダッシュモーターを選択したことにあると思われます。あのモータは低速域でPWMに素直に動いてくれません。特に動きはじめと止まる寸前が最も厄介です。もっともこれは私の知識と経験の不足によるもので、工夫次第でなんとでもなるものだとは思いますが、今回はプラズマダッシュをあきらめました。代わりに部室に転がっていたトルクチューンモータをつけて、通常走行については実用上問題のないレベルに持っていきました。また、速度は遅い方が格段に制御しやすいです。はじめはそれに気づかずにスリップしないぎりぎりの速度まで出していたのですが、そんな速度で走らせることは走行制御について熟練している者にしか許されないことであると後になってつくづく感じました。初心者は遅くても正確な走行を心がけるべきです。今回の私にはこの精神が欠けていました。
缶は前と右前、左前を読んで、自分の走っている区画の両脇の缶の有無も同時に読み取り、行く必要のない領域をできるだけ理解できるようにして行かないようにしたり、スラロームをしたり、直進で速度を上げたりといったことを考えていたのですが、結局そんなことをやっている時間はなく、そもそも基本的な走行もたどたどしいので今回はまったくあきらめて、前の缶しか読んでいません。
全くの余談でこれも計画倒になりましたが、マシンが記憶している迷路情報、缶情報、軌跡を読み込んでグラフィカルに表示するアプリケーションを作ってアルゴリズムを考える助けにしようと去年の大会が終わった後に思い立って、微妙に準備もしていたのですがそんなことをやっている余裕はありませんでした。
全体を通しての感想
一般の人がやらない新しいことをやるのは大いに結構ですし、そのために勝敗を度外視した設計をするのも、やる人さえ満足で楽しめるのであればいいでしょう。しかしそれをやって許されるのは、そういうことをやっていてもなお成績をきちんと残せる人だけです。成績を伴わなくてもいいのであれば、組織の名前でやる意味がありません。逆に、組織の名前を背負っている以上は自己満足で完結して、成績を伴わないのは許されません。私は今回別の目的のためにクリッパを利用した形となりましたが、なぜわざわざここでクリッパかというと、成績を残すためです。大会に参加せずに自分のやりたいことをやって下半期を過ごすこともできたわけですが、それではだめなのです。要するに私にとって今回のクリッパは研究目的以上に成績を残すためという意味合いが強いのです。私は昨年の経験から、クリッパに関する基本的なノウハウを身に付け、大会のレベルもわかっていました。それを踏まえると、今回のような形で参加しても優勝にからめるレベルのマシンには仕上がるだろうという考えを抱き、クリッパなら自分の個人的な目的と成績を両方達成できるだろうということで参加を決めました。
しかし、現実はそう甘くはありませんでした。大会の結果は返した缶3個でナムコ賞です。ナムコ賞は今回のような形で出てしまえばとって当然で、もともともらえると確信していました。問題は返した缶の個数です。これは当初の目標を大幅に下回る無残な結果となりました。今回私を一番苦しめたのは時間でした。本格的にクリッパの作業を始めたのが10月に入ってからでしたから始める時期も遅かったのですが、それはその時期から始めても間に合わせる自信があったからです。ところがRURよりも優先させなければならないことが昨年同時期よりも何かと多く、部室で作業できるのが週3日という状況で、昨年を基準に考えていた私の計画は大幅に崩されました。自分の作業スピード自体は昨年よりも早くなったかもしれませんが、やる内容も量も昨年を大きく上回るもので、とても週3日でできるようなことではありませんでした。もう10月の中頃には自分は間に合わないと感じるようになり、周囲に弱音や愚痴をもらすようなこともするようになりました。やる気と根性さえあれば時間の不足はカバーできるものだとこれまで信じて疑わなかった私でしたが、人間が決まった時間でできることには限界があり、その限界はどうがんばっても超えられるものではないと痛感させられました。同時に、自分の見込みの甘さと考えの未熟さを悔やみました。
これからクリッパをやる人へ
今回の私はマイクロクリッパの競技性というものを完全に無視して、自分の個人的な目的のためにマイクロクリッパを利用させてもらったわけですが、マイクロマウス・クリッパに関してはこういう利用方法はお勧めしません。まわりはみんな真剣に勝とうと思ってやっている人ばかりで、審査員も競技に勝てるマシンを評価してきます。そもそも今回の私のようなことを考える人はそうはいないと思いますが、数年ごとに現れるかもしれない変な人向けに忠告しておきます。
真剣に勝とうと思ってクリッパをやる場合には、まず迷路を確実に走れることは大前提です。その上で、どういうところをがんばらなければならないのかを、情報の多いマイクロマウスと比較しながら述べていきたいと思います。
一つは速度です。マウスの場合は本気走行で速度が出せればそれでいいのですが、クリッパでは探索走行の速度が勝負です。クリッパでは1回の競技で走らなければならない範囲がマウスの5倍~10倍に上るため、時間内に缶をたくさん返すためにはそれだけ速度が必要です。速度を上げればそれだけクラッシュしやすくなりますから、結局は確実な走行制御が物を言います。
二つ目は能率的な缶の処理と走行に関するアルゴリズムの開発です。マイクロマウスでは迷路の最短経路攻略についてすでに先人によってある程度の型ができていますが、クリッパに関してはこれといってすぐれたアルゴリズムができていません。ちょっとしたアルゴリズムの工夫が賞に結びついている現状があるのはそのためです。クリッパが能率的な作業をするために必要なポイントは大きく分けて次の2つです。缶のないところにはなるべく行かないようにすること、それから取り上げた缶をなるべく次の作業の邪魔にならないような場所に置くことです。これらを考えていくのは何か一つ大きなひらめきがないとなかなか厳しいです。クリッパ人口が増えない要因の一つはこれだと思います。つまり、マウスのようにアルゴリズムをいじる楽しさを気軽に味わえないのです。
三つ目はアームの高速化と小型軽量化です。現在は優勝クラスになっても競技時間全体に占めるアーム動作の時間が半分以上あります。この時間はまだまだ短縮の余地があります。高速に動作させるためには小型軽量であるほうが有利です。
私の知る限り以上に述べた3つのうち1つでも満足しているマシンはいまだかつてありません。1つでも満足させたマシンを出していけば確実に優勝するでしょうし、これまでにない見ごたえのあるクリッパになることは間違いないと思います。