■ はじめに
前回、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を確認しました。
ドアあり鍵ありにすると、細かい調整が必要になりそうです。
自分的には今回ので満足したので、ひとまず、手を引きます。
次は何をやろうかな?



