■ はじめに

前回、PixelCartpoleを使ってSLAMの復習をしまたとき、ふと考えました。

「これって、CNNをLiDAR代わりにしたSLAMじゃない? なら、SLAMでもっと簡単に解けるよね」

という事でChatGPTさんに聞いてみました。

>「それは、難易度が爆下がりするよ!まあ、それMiniGridじゃないけどね」

よく聞くと、MiniGridはロボットにメモリーを持たせない事が条件らしく、確かに地図情報をガッツリもたせるSLAMでは、この条件は満たせません。
それに…

>「だいたい、何を強化学習するん?」

確かに地図持ってナビゲーションしたら終わるな。

…待てよ。
前やったときは、壁に当たったら方法ランダムで回転にしたから、ここを学習にすればいいんじゃない?

と言う事で、MiniGrid(ドアあり鍵あり)にSLAMで再チャレンジします。

今回は、ちょっとイレギュラーなSLAM型MiniGridをやります。
ロボット開発としては「あり」らしいから良かったら見てってね。




■ MiniGridをSLAM風にみると…

改めてMiniGridの仕様を見直すと、デバッグ用 SLAM 環境として超優秀にできている事がわかります。

⚫SLAM っぽい点

① 回転すると見え方が変わる

これはカメラや LiDAR と同じ
ワールド座標ではなく ロボット座標

② 見えた所しか更新できない

壁の向こうは分からない
未探索領域が自然に残る

③ 自分が動かないと情報が増えない

探索しないと地図が埋まらない

⚫比較

・MiniGrid は「理想センサ」
  ノイズなし
  誤差累積なし
  真値が内部にある
  データ型対応が必要

SLAMは 「現実センサ」
  ノイズあり
  誤差累積あり
  自己位置推定が必要
  データ型対応が不要

こうやってまとめると、やれる気になって来ますね。

■報酬設計について

報酬はこうしてみました:

✅ 新規報酬は初回のみ
 これを入れ忘れて何度回転するだけだったり、止まったまま何もしないAIを作ったことか(T_T)
✅ 時間(行動)にコストを課す
 急いで動いてね
✅ 状態変化がない行動は報酬マイナス
 意味のないことはしないでね
✅ 探索と達成のフェーズを分ける
 ゴールをちゃんと調べてね

これを少しコードに近づけます。

① 情報獲得報酬(R_info)
意味:
未知 → 既知 に変わった分だけ褒める
R_info = α × ( 新しく観測したセル数 )
α:小さい定数(例:0.01)
初回のみカウント

② 行動コスト(R_cost)
意味:
時間や無駄な動きを罰する
R_cost = - β
β:小さい正の数(例:0.001)
毎ステップ必ず引かれる

③ ゴール報酬(R_goal)
意味:
目的を達成したら大きく褒める
R_goal = γ × 𝟙[goal]
γ:大きめ(例:1.0)
𝟙[goal]:ゴールしたら1、してなければ0

④それを「全部足す」
R = R_info + R_cost + R_goal

ここまで来たら、後はコーディングかな?

■コーディング頑張ります!

①やっぱり、環境は壊れますので、これを入れておきます。

!pip -q install gymnasium minigrid matplotlib numpy

②SLAMぽく扇型の観測にします。当然ですか、壁の向う側は見えなくします。

③記憶したマップで動く様にします。ここまで来てやっと学習が出てきます。

学習中に起きる変化

🐣 初期
・壁にぶつかる
・同じ場所をウロウロ
🧠 数万 step 後
・未探索方向へ向かう
・行き止まりを避ける
・地図を埋めにいく動き

👉 ゴール報酬なしでも動き出すのがポイントです。

④探索完了率で評価します

探索完了率とは、地図のうち、どれだけ未知(-1)を減らせたかと言うことです。

探索完了率 = 1 - (unknownマス数 / 全マップ数)

■こんな感じの評価結果です




このままですと、永遠に探索しているのでフェーズに切り分けます。

探索フェーズ
・ゴール未発見
・未探索マス発見で報酬
 ダラダラ動きで小ペナルティ

ナビフェーズ
・ゴール発見後切り替わる
・ゴール接近報酬
 ステップを減らしたいので小ペナルティ

終了フェーズ
・ゴール到達
・大報酬

ついでに評価方法もよりシンプルに、ゴールまでのステップ数に変えておきます。

200K回した結果です。




コードはコチラ→Githubにリンク
青が真値でオレンジが移動平均です。
かなり爆速で解いてますね。

なぜ「異様に速く」学習できたのか?
こう考えています。

① 探索報酬 → ナビ報酬の切替が自然
探索中:未踏マス = 報酬
ゴール後:最短距離 = 報酬

👉 人間の行動戦略と一致

② MemoryMap が「状態」として入力されている
単なる履歴ではなく、PPOが「地図を使う価値」を学習している

👉 これが“真SLAM”

■ 結果:

今回は、MiniGridをSLAMに解いてみましたが、いかがだったでしょうか?

計算量も、だだ下がりなのでロボットの開発方法としては、「SLAM超優秀」ですね。

最初の段階でMiniGridの条件を破ってるので、「解いた!」とは言いません。

■ 今回の学び:

今回、ちょっとした思い付きで「SLAM使ったMiniGrid」をやってみました。

1番の悩みどころの
「何を強化学習するか?」
は、本当に苦しんだどころですね。

強化学習の勉強するはずなのに、1番の悩みどころが、何を学習するか。

哲学的なテーマですね。

■ まとめ

SLAM使ったMiniGridは、ドアなしキーなしで、8×8を確認しました。

ドアあり鍵ありにすると、細かい調整が必要になりそうです。

自分的には今回ので満足したので、ひとまず、手を引きます。

次は何をやろうかな?