SGノート

ものづくり、ロボット、メイカー、バイク、

2019全国大会の感想&機械学習(ロジスティック回帰分析)を用いたマイクロマウスの壁判断

はじめに

 この記事はマイクロマウスAdvent Calender2019 4日目 12/4のものになります。昨日 12/3はあささんの「全日本マイクロマウス大会2019クラシック競技優勝!」でした。

 優勝おめでとうございます。ものすごいパラメータで走っているのですね。宇宙人はすごい!吸引マウスの動きはクラシックもハーフも目を見張るものがあります。あささんのマウス、壁センサの向きが面白いですね。私はあまり見たことがない配置です。クラシックの場合、壁が遠のいてもよく見えるのでしょうか。きれいにまとまっていてかっこいい。APECでのご活躍を期待します。

2019全国大会の感想

 さて、12/1 神奈川県にある東京工芸大学厚木キャンパスにてマイクロマウスの全国大会が開催されました。マイクロマウス(ハーフサイズ)のファイナル 32x32区画の迷路の探索と最短走行を成功させることができました。探索があまり早くないプログラムではありましたが1度も壁に衝突などすることなく6min以上探索し続けることができました。最短走行は直線0.8m/s, ターン0.3m/sの最も遅いパラメータで完走しました。それ以外は斜め走行に挑戦したのですが、斜め進入にて壁に衝突してしまいました。壁切れ補正などの導入が必要になってきそうです。残念な結果ではありましたが、今年の目標であった「最短走行完走」は実現でき、腹1分目位は満足しています。

 6min以上探索はできたのですが、なぜだか壁の情報を間違って記憶してしまっているようで、探索した全ての結果を使って最短走行することはできませんでした。一度更新していた壁情報は更新しないようにしていたつもりなのですが変わってしまったようです。全面探索プログラムに虫が湧いているようです。ゴ〇ジェットで的確に狙い打ってやる。精進しましょう。

 例年であれば、これにて年度内のマイクロマウス大会は締めくくりとなりますが、本年度は3月に某所にて大会が開催されることになっております。そこにレベルアップしてのぞみます。皆さん当日お会いしましょう。(正直、私にとっては全国大会よりも心に余裕が持てない予感バリバリではありますが)

f:id:sglab:20191203222914p:plain

マイクロマウス(ハーフサイズ)ARROWHEAD

f:id:sglab:20191202231515p:plain

探索結果(行きのみ)と最短走行経路

f:id:sglab:20191203215351p:plain

探索結果(行き&帰り)と第2走行目で壁激突した経路

今回のテーマと背景

 さて、今回は壁判断について書きたいと思います。マイクロマウスのスタンダードと思われる壁判断の方法に加え、先月読んだ本に記載されていたロジスティック回帰分析を用いて、マイクロマウスの壁判断を行った方法について記載したいと思います。全国大会でロジスティック回帰分析による方法は実装はしておりましたが、あまり自信がなかったこと+まだ作りが甘い部分もあったため本番では使用しませんでした。
 壁検出と判断は重要です。誤判断すると上記で示したよう正しく走ることができなくなってしまいます。

見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑

見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑

 

壁検出動作(固定したセンサ閾値による判断)

 大多数のマイクロマウスはLEDとフォトトランジスタなどを用いたフォトインタラプタを構成しています。壁に向かってLEDを発光、反射して返ってくる強度を測定しています。壁から反射してきた光の強度のみを測定できるようにすることである程度安定した値を手に入れることができます。(環境光の排除については、前々回の記事を参照:

壁検出赤外線センサの環境光による影響 - SGノート)これにより壁がある/ない場合で強度が異なるため、壁の有無を判断する材料にできます。壁有無を判断するのに最も簡単に実現するのは下記だと思います。

  • 車体が迷路中央にあり、壁がある状態で、事前に左右のセンサ値をそれぞれ取得
  • そのセンサ値より少し小さい値を閾値として設定する。
  • 走行中に左右それぞれのセンサ値を取得し、閾値との大小を判断し壁有無を判断
     右壁あり:右センサ値 > 右壁の閾値
     左壁あり:左センサ値 > 左壁の閾値

 事前に取得したセンサ値よりどれだけ低い閾値にするかは、機体が片方の壁に寄っていた入り、機体が傾いたりした場合でも検出できるような数値に設定します。但し、閾値を低くしすぎると、壁がないのに壁があると検出してしまう等誤判定が発生するため閾値の見極めが重要です。

f:id:sglab:20190922192444p:plain

センサ値が変化する

  実際問題として、この閾値をチューニングしてしまえば、ほとんど問題なく壁検出できてしまいます。特に車両制御がしっかりしている場合は基本的に迷路中央を走ることができるため問題なく動作します。

 しかし、4輪など旋回中心ずれが顕著に表れる機体では、各タイヤにかかる荷重違いやスリップによりターン半径が変わったりしており、意図せず壁に寄ってしまったり、機体が傾いたりする可能性があります。このような状態に機体がなっていたとしても、正しく壁有無を判断する必要があります。

壁検出動作(車両角度を考慮したセンサ値による判断)

  そこで、機体が傾くのであれば、その傾きを検出(ジャイロ等)し、センサ値を傾きに合わせ補正しまえばいいと考えます。私がやっている方法は、機体角度に合わせて検出したセンサ値にある倍率をかけています。そうすることで機体が傾いたことによるセンサ値の減少分を補填します。これにより、機体が少し傾いた状態で壁検出を行っても、正しい壁情報が得られています。

f:id:sglab:20190922204924p:plain

機体角度による検出センサ値の底上げ

壁検出動作(ロジスティック回帰分析を用いた確率による判断)

 左右のセンサを一つ一つそれぞれ左右の壁に対応させ検出を行っているので、上記の2つの方法を使って各センサの値を閾値を使って評価すれば壁の有無が判断できます。

 一方、今回ロジスティック回帰分析(分類)では、複数の数値から確率的に壁の状態を推定します。 ※ロジスティック回帰分析の使い方が間違っている等は目をつぶってもらい、ひとまず試したというところです。専門の方がいましたらご教授いただければと思います。

 教師データの作成は走行中の壁情報取得値をかたっぱしから保存して作るべきだとは思うのですが、とりあえずの実験でしたので次のように適当に行いました。

  • ロボットを迷路内に置く(中央にいるとき or 右壁(左壁)に寄っているとき)
  • 角度を約±5°でロボットを回転させ、センサ値とロボットの角度を取得する
  • 上記を左右の壁有無の4パターン全てで取得する(両壁有、左/右有 and 右/左無、両壁無)

f:id:sglab:20191203234502p:plain

壁有無でセンサ値を車両角度を変え取得

 上記で取得したセンサ値をpythonのseabornを使ってグラフ化すると下記のようになります。(下図は右の壁有無について分類しています)

f:id:sglab:20191203225049p:plain

右壁有無での分類

 結果は何の不思議もなく、右センサの値が大きければ壁ありになります。このデータを教師データとして、pythonのsklearnを使用してロジスティック回帰分析を行います。前述している閾値を使った方法の場合、得たセンサ値からうまく分類できそうな値を探し余裕をもって設定します。ロジスティック回帰分析ではデータを探すようなことはしません。pythonのプログラムに食わせるだけです。(考えなくても数字が出る:楽)

 今回は、右壁のあり/なしの2分類をしてみます。

 これにより各データxに対する係数(w:coefficient)と切片(w0:intercept)が得られ、それらをシグモイド関数に入れることで、壁有無の確率を算出することができます。

(壁の状態確率) =  1 / (1 + exp(-Σwx -w0))

f:id:sglab:20191203230521p:plain

ロジスティック回帰分析 学習結果

 上記の学習結果を使って、教師データとして使っていないデータを分類した結果全て正しく分類することができています。

 confusion matrixの見方:

 39(左上):分類が壁ありで正解の数
 0(右上) :分類が壁ありで不正解の数
 0(左下) :分類が壁なしで不正解の数
 41(右下):分類が壁なしで正解の数

 今回使用したデータは399個ありました。このデータを通常のセンサ閾値を用いて壁有無を判断すると3個のデータが誤分類となりました。どれも壁に近づいていて車両角度がついてしまっているときです。この結果からロボットが普通に走っていれば、単純に閾値を設けるだけでも正しく壁を検出し走行することができます。

 しかし、シグモイド関数を使うと壁の情報を確率的に手に入れることができます(ex. 95%壁あり、5%壁なしの状態など)。この数字を使って動作を変化させるなどすると面白いかもしれません。

 ロジスティック回帰分析は2分類だけではありません。多分類もすることができます。下記は次の4分類で行ったときのグラフと結果になります。参考に分類してみました。

 ラベル:「左右壁あり」「左右壁なし」「左壁のみあり」「右壁のみあり」

f:id:sglab:20191203233010p:plain

左右の壁状態毎の分類

f:id:sglab:20191203233059p:plain

4分類でのロジスティック回帰分析結果

 上記の結果にあるように分類をすると、confusion matrixに記載されているように、左右壁あり時の分類で誤判定が4個発生しています。(3個:"左右壁ありを左壁のみ", 1個:"左右壁ありを右壁のみ"と判断)

 誤判定がでてしまっていますが、同時に左右の壁を分類をできるのは面白いのではないでしょうか。(面白いは重要)
(左右壁ありの確率、左壁だけの確率、右壁だけの確率、左右壁なしの確率がそれぞれ得られる)

終わりに

 以上、検出したセンサ値を用いた壁情報の分類についてでした。少し真面目に書いてしまった(つまらない。。。)。どなたかの参考になれば幸い。

  皆様、本年の大会お疲れ様でした。レベルの高い大会でしたね。来年の大会でまたお会いしましょう。

 Advent Calender 次はジャッジ―さんにバトンタッチです。タイトル「ジャイロの話と哺乳瓶でモンスターを飲むと不味くなる話」になります。
 哺乳瓶でモンスター。。。どういうこっちゃ。ジャイロの話も気になります。楽しみです。よろしくお願いします。

 おわり