路径规划是无人机自主飞行的基础。A*算法作为一种启发式搜索,既不像Dijkstra那样盲目,也不会像贪心最佳优先那样错过最优解。它通过评估函数 f(n) = g(n) + h(n) 指引搜索方向,g(n) 是已走代价,h(n) 是预估剩余距离。选择合理的 h(n) 能大幅减少搜索节点,同时保证路径最优。
用 C 语言实现 A*,首先得想清楚怎么表示地图和节点。
数据结构和地图
定义节点结构体,存储坐标、代价和父指针:
typedef struct { int x, y; float g, h, f; int parent_x, parent_y; } Node;
这里我用整型存坐标,浮点存代价,父节点坐标用来回溯路径。如果想更灵活,可以换成指针,但嵌入式环境里用坐标索引更省内存。
开放列表需要频繁插入和取出 f 最小的节点。最小堆是常见选择,时间复杂度 O(log n):
typedef struct { int x, y; float f, g, h; } Node;
Node open_list[1000];
int size = 0;
配合上浮下沉操作维护堆序。关闭列表直接用二维布尔数组就能做到 O(1) 查找:
| 坐标 (x,y) | 状态 |
|---|---|
| (3,4) | 已访问 |
| (5,6) | 未访问 |
网格地图则用二维整型数组表示,0 代表可通行,1 代表障碍。初始化简单:
int grid_map[100][100]; // 100x100 地图
for(int i=0; i<100; i++) {
for(int j=0; j<100; j++) {
grid_map[i][j] = 0; // 默认自由
}
}
grid_map[50][50] = 1; // 设置一个障碍
如果需要处理传感器噪声,可以用概率占据栅格,每个格子存置信度,不过这会增加内存和计算开销。
启发式怎么选
f(n) = g(n) + h(n) 里最关键的就是 h(n)。常用的有两个:

