機械学習(ロジスティック回帰分析)によるマイクロマウスの壁判断

全国大会壁情報(行き)。正しく経路を出せている マイクロマウス

マイクロマウスの壁判断について、スタンダードに行われている方法とそこに車両角度を使ってアレンジを加えた方法について述べていきます。

加えて、先月読みました「見て試してわかる機械学習アルゴリズムの仕組み 機械学習図鑑 」で学んだ「ロジスティック回帰分析」を用いての壁判断に挑戦しましたので、その方法についても記載していきます。

スポンサーリンク

壁判断の重要さ

マイクロマウスにおいて壁検出と判断は重要です。当たり前ですが誤判断すると最短走行をするときに正しく経路で走行できなくなってしまいます。

マイクロマウスはスタートからゴールを目指して、探索走行というものをまず第1走目にするのが一般的です。一度ゴールした後、そのまままだ探索しきれていない区画を調べにいきます。

下記の図は2019年の全国大会の私のロボットの走行計画です。第1走目の探索に6分以上かけました。探索(少なくとも一つのスタート→ゴールの道筋がわかる)、最短(迷わずスタート→ゴール)を共に走行できています。

私のロボットは、行き(スタート→ゴール)で取得した壁情報と、帰り(ゴール後探索)で取得したものを分けて保存しており、次がその取得した情報です。※灰色は未探索壁になります。

全国大会壁情報(行き)。正しく経路を出せている
行きの探索結果と最短経路計画
帰りの探索を加えた迷路情報
ゴール後に探索した壁情報が加わった迷路

これからわかるように、帰りに壁情報がおかしくなってしまっています。これによって、より多くの壁情報から最短で走れる経路を見つけられなくなってしまいました。

今回の場合は他の経路が見つかるほど探索ができていませんでしたが、他に経路があった場合もっと早い経路を見つけて走行できたはずです。

このようなことにならないように正確な壁検出と判断は重要になってきます。

壁判断の方法1:固定したセンサ閾値による判断

大多数のマイクロマウスはLEDとフォトトランジスタなどを用いたフォトインタラプタを構成しています。

壁に向かってLEDを発光、反射して返ってくる強度を測定しています。壁から反射してきた光の強度のみを測定できるようにすることである程度安定した値を手に入れることができます。(環境光の排除については、壁検出赤外線センサの環境光による影響を参照ください)

これにより壁がある/ない場合で強度が異なるため、壁の有無を判断する材料にできます。壁有無を判断するのに最も簡単に実現するのは下記だと思います。

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

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

車両の位置とセンサ値
センサ値が変化する

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

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

壁判断の方法2:車両角度を考慮したセンサ閾値による判断

そこで、機体が傾くのであれば、その傾きを検出(ジャイロ等)し、センサ値を傾きに合わせ補正しまえばいいと考えます。

私がやっている方法は、機体角度に合わせて検出したセンサ値にある倍率をかけています。そうすることで機体が傾いたことによるセンサ値の減少分を補填します。

これにより、機体が少し傾いた状態で壁検出を行っても、正しい壁情報が得られています。

車両角度とセンサ値の倍率
機体角度による検出センサ値の底上げ

壁判断の方法3:ロジスティック回帰分析を用いた確率による判断

次にロジスティック回帰分析を使った壁判断について書きます。この方法は一般的ではありません。機械学習の本を読む機会があり、そこに載っていた手法を壁判断に応用してみました。

左右センサ値で、左壁・右壁の状態をそれぞれを分類する(2分類)

マイクロマウスは左右のセンサを一つ一つそれぞれ左右の壁に対応させ検出を行っているので、上記の2つの方法のように、「左右各センサの値をそれぞれ使って閾値で評価して、壁の有無を判断」できます。

  • 右センサ値を使って、右壁が「ある」 or 「ない」の2つを判断
  • 左センサ値を使って、左壁が「ある」 or 「ない」の2つを判断

一方、このロジスティック回帰分析(分類)では、「左右センサそれぞれではなく、複数のセンサ値の情報をまとめて使い、確率的に壁の状態を推定」します。

  • 左右センサ値を使って、右壁が「ある」 or 「ない」の2つを分類
  • 左右センサ値を使って、左壁が「ある」 or 「ない」の2つを分類

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

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

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

センサ値の分類
右壁有無での分類

結果は何の不思議もなく、右センサの値が大きければ壁ありになります。

このデータを教師データとして、pythonのsklearnを使用してロジスティック回帰分析を行います。

前述した閾値を使った2つの方法の場合、得たセンサ値からうまく分類できそうな値を探して、余裕をもった値を設定します。

ロジスティック回帰分析の場合は値を探すようなことはしません。pythonのプログラムに多数のデータを入力するだけです。

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

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

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

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

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

confusion matrixの見方:

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

今回学習に使ったデータは399個あり、このデータを前述した通常のセンサ閾値を用いて壁有無を判断する方法をとると、私のロボットの設定では3個のデータが誤判断となりました。

どれも車両が壁に近づいていて、ロボットの軌道を補正するため、車両角度がついてしまっているときです。

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

左右センサ値で、左壁・右壁の状態をまとめて分類する(4分類)

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

  • 左右センサ値を使って、「左右壁がある」「左右壁がない」「左壁のみある」「右壁のみある」の4つの状態を分類
ロジスティック回帰分析4分類
左右の壁状態毎の分類
4分類での結果
4分類でのロジスティック回帰分析結果

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

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

終わりに

マイクロマウスの壁判断について、検出したセンサ値を用いた壁情報の判定・分類を説明しました。誤判断をしないようにして迷路を確実に走れるようにしましょう。

タイトルとURLをコピーしました