news 2026/6/25 10:56:41

曼哈顿距离简化计算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
曼哈顿距离简化计算

RRT 路径规划 rrt 基于珊格地图的RRT路径规划 ——————————————

刚接触路径规划那会儿,总想着怎么让机器人像电影里那样在迷宫里丝滑走位。直到被现实打脸——传统A*算法遇到复杂环境直接算到冒烟。后来在导师电脑上看到RRT(快速扩展随机树)的演示动画,树枝状结构像活物一样在障碍物间蜿蜒生长,当时就跪了。

咱们今天要玩的场景是栅格地图,这种由0和1组成的矩阵特别适合快速验证算法。先来点直观的:假设我们有个20x20的迷宫,黑色像素代表障碍物,白色是可行走区域。RRT的核心逻辑就像朝随机方向扔飞镖,然后拉着树苗往那个方向长。

先整点基础代码架子:

class Node: def __init__(self, x, y): self.x = x self.y = y self.parent = None class RRT: def __init__(self, grid, step_size=3): self.grid = grid[::-1] # 处理坐标系翻转 self.step_size = step_size self.nodes = [Node(1, 1)] # 起点设在左上角

看到没?Node类简单得令人发指,就存坐标和父节点。重点在RRT初始化时把地图上下翻转了,因为栅格地图的(0,0)通常在左上角,而数学坐标系是左下角为原点,这个细节坑过我整晚。

碰撞检测是路径规划的灵魂,但在栅格环境里可以耍个花招:

def is_collision(self, x1, y1, x2, y2): dx = abs(x2 - x1) dy = abs(y2 - y1) if dx + dy > self.step_size * 2: return True return self.grid[int(y1)][int(x1)] == 0

这里偷懒用了曼哈顿距离做近似判断,实际上应该做直线插值检测。但实测在低分辨率栅格中完全够用,毕竟RRT本身就有容错性。当年我坚持写Bresenham直线算法,结果调试到凌晨三点,血的教训告诉咱:别在demo代码里追求完美。

核心的扩展过程才是戏肉:

def expand(self): rand_x = random.randint(0, len(self.grid[0])-1) rand_y = random.randint(0, len(self.grid)-1) nearest = min(self.nodes, key=lambda n: (n.x-rand_x)**2 + (n.y-rand_y)**2) theta = math.atan2(rand_y - nearest.y, rand_x - nearest.x) new_x = nearest.x + self.step_size * math.cos(theta) new_y = nearest.y + self.step_size * math.sin(theta) if 0 <= new_x < len(self.grid[0]) and 0 <= new_y < len(self.grid): if not self.is_collision(nearest.x, nearest.y, new_x, new_y): new_node = Node(new_x, new_y) new_node.parent = nearest self.nodes.append(new_node) return new_node return None

这段代码里藏着三个精妙之处:1)随机采样时直接取整,让树自然贴合栅格结构;2)用最近邻节点+固定步长代替直线连接,避免复杂碰撞计算;3)通过三角函数确定生长方向,比向量归一化更直观。记得第一次跑通这段时,看着树枝在控制台字符画里七扭八拐地避开障碍,比通关魂系游戏还爽。

当树枝终于碰到目标点时,回溯路径就像解开缠住的耳机线:

def get_path(self, end_node): path = [] current = end_node while current: path.append((current.x, current.y)) current = current.parent return path[::-1]

这种链表式的逆向追溯虽然简单粗暴,但在实际项目中要小心循环引用。有次我在C++版本里没处理好智能指针,结果路径回溯变成了无限循环,直接把仿真程序跑崩了。

最后说点实在的:RRT在栅格地图上的表现就像喝醉的扫地机器人——路径曲里拐弯但总能到达。想要更丝滑?试试RRT*的代价重构机制;想要更快?上Bidirectional RRT同时生长两棵树。不过对于刚入门的兄弟,先把基础版本吃透更重要。就像我导师常说的:"别急着优化,跑起来再说。"

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 11:13:59

为什么你的容器假死?,深度解析健康检查失效根源与修复方案

第一章&#xff1a;为什么你的容器假死&#xff1f;在 Kubernetes 或 Docker 环境中运行容器时&#xff0c;开发者常遇到“容器仍在运行但服务无响应”的现象&#xff0c;这被称为“容器假死”。其根本原因并非容器进程崩溃&#xff0c;而是主进程陷入阻塞、资源耗尽或健康检查…

作者头像 李华
网站建设 2026/6/17 5:05:13

多语言混合输入实验:中英夹杂对推理稳定性的影响

多语言混合输入实验&#xff1a;中英夹杂对推理稳定性的影响 在算法竞赛圈子里&#xff0c;一个有趣的现象正在浮现&#xff1a;越来越多的中国选手开始用英文向AI模型提问——即便他们的母语是中文。不是因为英语更好表达&#xff0c;而是他们发现&#xff0c;哪怕只是把“写个…

作者头像 李华
网站建设 2026/6/22 20:48:20

央视新闻联播片段提及:人工智能自主创新成果展示

小模型如何撬动大智能&#xff1f;VibeThinker-1.5B背后的推理革命 在最近一次央视新闻联播关于“人工智能自主创新成果”的报道中&#xff0c;一个名字悄然出现&#xff1a;VibeThinker-1.5B-APP。它没有动辄千亿参数的庞大规模&#xff0c;也没有华丽的多模态演示&#xff0c…

作者头像 李华
网站建设 2026/6/15 20:42:55

还在手动排查容器故障?,立即启用Docker自动健康检查提升系统可靠性

第一章&#xff1a;容器健康检查的必要性与演进 在现代云原生架构中&#xff0c;容器化应用已成为主流部署方式。随着微服务数量的增长和动态调度的需求增强&#xff0c;确保容器实例处于预期运行状态变得至关重要。传统的进程存活检测已无法满足复杂业务场景下的可靠性要求&am…

作者头像 李华
网站建设 2026/6/10 12:36:14

应急响应预案生成:突发事件下的多步骤应对推导

应急响应预案生成&#xff1a;突发事件下的多步骤应对推导 在城市轨道交通系统中&#xff0c;一场突如其来的暴雨引发隧道积水&#xff0c;导致列车停运、乘客滞留。指挥中心必须在10分钟内决定是否启动疏散程序、调度救援力量、通知周边医院待命——每一秒的延迟都可能放大风…

作者头像 李华
网站建设 2026/6/10 10:53:46

Top-k采样设置建议:保持确定性同时避免死循环

Top-k采样设置建议&#xff1a;保持确定性同时避免死循环 在当前大模型推理的实际部署中&#xff0c;一个常被低估却至关重要的细节浮出水面——解码策略的微调&#xff0c;往往比模型本身的选择更能决定输出质量。尤其对于像 VibeThinker-1.5B-APP 这类专注于高强度逻辑任务的…

作者头像 李华