← 技術ノート一覧

ROBOTICS · PATH PLANNING

A*経路探索を、障害物グリッドで一手ずつ見る

ゴールへ向かう見込みを使うと、探索はどれだけ絞られるのか。壁を置き、A*とDijkstraを切り替え、展開ノード数と経路長を自分の目で比べます。

一次情報の確認日:2026年8月31日

01

探索の広がり方を動かす

セルを押して壁を編集できます。Stepで1ノードずつ、Runで最後まで進めます。

展開済み
0
候補
1
経路長
—

緑が開始、赤が目標。濃紺が確定済み、黄が探索候補、白線が最終経路です。

02

A*が足しているのは、残り距離の見積もり

Dijkstra法は、開始点からの実コスト g が小さい場所から均等に調べます。A*はそこへ、目標までの見積もり h を足した f = g + h で次の場所を選びます。

この図解では上下左右にだけ動くため、hにマンハッタン距離を使います。hを0にするとDijkstraと同じ動きになります。経路長が同じでも、調べたセル数が変わるところを見てください。

03

ヒューリスティックは“近道の保証”ではない

hが実際の残りコストを過大評価しない条件では、A*は最短経路を保ちながら探索を絞れます。ただし地図の表現、移動モデル、コスト設計が変われば、適切なhも変わります。

実機ではロボットの幅、旋回半径、コストマップの膨張、動く障害物、再計画が必要です。Nav2のSmac Plannerには2D A*、Hybrid-A*、State Latticeなどがあり、この学習用4近傍グリッドとは役割が違います。

04

最小のPython実装

標準ライブラリheapqだけを使います。戻り値は開始点から目標までのセル列です。

Python 3a_star_grid.py
from heapq import heappop, heappush

def astar(grid, start, goal):
    """4-neighbour A* for a grid where 1 means blocked."""
    height, width = len(grid), len(grid[0])
    frontier = [(0, start)]
    came_from = {start: None}
    cost = {start: 0}

    def heuristic(cell):
        return abs(cell[0] - goal[0]) + abs(cell[1] - goal[1])

    while frontier:
        _, current = heappop(frontier)
        if current == goal:
            break

        row, col = current
        for next_cell in ((row-1, col), (row+1, col),
                          (row, col-1), (row, col+1)):
            r, c = next_cell
            if not (0 <= r < height and 0 <= c < width):
                continue
            if grid[r][c] == 1:
                continue

            new_cost = cost[current] + 1
            if next_cell not in cost or new_cost < cost[next_cell]:
                cost[next_cell] = new_cost
                priority = new_cost + heuristic(next_cell)
                heappush(frontier, (priority, next_cell))
                came_from[next_cell] = current

    if goal not in came_from:
        return []

    path, current = [], goal
    while current is not None:
        path.append(current)
        current = came_from[current]
    return path[::-1]

05

このサンプルに入っていないもの

06

確認した一次情報

  1. Hart, Nilsson, Raphael (1968), A Formal Basis for the Heuristic Determination of Minimum Cost Paths

    A*の原論文。評価関数と最適性の基礎を確認。

  2. ROS 2 Navigation2 — Smac Planner

    現在の2D A*、Hybrid-A*、State Lattice実装の範囲を確認。

  3. Navigation2 Planner Server

    ROS 2でプランナを実行する構成上の位置づけを確認。