news 2026/4/11 0:09:47

曼哈顿距离简化计算

作者头像

张小明

前端开发工程师

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/4/9 4:35:00

合同条款冲突检测:自动识别潜在矛盾点

合同条款冲突检测&#xff1a;自动识别潜在矛盾点 在企业日常运营中&#xff0c;合同审查是一项高频且高风险的任务。一份看似普通的采购协议&#xff0c;可能因付款周期的细微差异引发后续纠纷&#xff1b;两个版本接近的框架协议&#xff0c;也可能在责任划分上埋下法律隐患。…

作者头像 李华
网站建设 2026/3/31 1:28:35

离线环境可用吗?完全本地化部署VibeThinker的技术路径

离线环境可用吗&#xff1f;完全本地化部署VibeThinker的技术路径 在教育机房、竞赛训练室甚至偏远地区的实验室里&#xff0c;网络不稳定、数据隐私敏感、云服务不可用——这些现实问题正不断挑战着AI技术的落地边界。当主流大模型还在依赖云端算力和持续联网时&#xff0c;有…

作者头像 李华
网站建设 2026/4/5 16:58:55

音乐作曲辅助工具:生成符合数学美感的旋律结构

音乐作曲辅助工具&#xff1a;生成符合数学美感的旋律结构 在当代音乐创作中&#xff0c;灵感与技术之间的界限正变得越来越模糊。当AI开始参与旋律生成时&#xff0c;我们不再满足于“听起来像某位作曲家”或“风格接近某种流派”的表面模仿——真正吸引人的&#xff0c;是那些…

作者头像 李华
网站建设 2026/4/8 10:39:32

新手如何快速制作GIF?GIF制作指南

在日常分享中&#xff0c;生动有趣的GIF总能比静态图片更抓眼球&#xff0c;不管是记录生活片段、制作工作表情包&#xff0c;还是给文案搭配动态素材&#xff0c;gif制作都是绝佳选择。其实不用复杂的专业软件&#xff0c;新手也能快速做出高质量GIF&#xff0c;下面就把详细步…

作者头像 李华
网站建设 2026/4/2 16:58:07

不适合通用任务?明确VibeThinker的应用边界避免误用

不适合通用任务&#xff1f;明确VibeThinker的应用边界避免误用 在AI模型“军备竞赛”愈演愈烈的今天&#xff0c;参数规模动辄数百亿甚至上万亿&#xff0c;训练成本直逼千万美元&#xff0c;大模型似乎成了智能能力的代名词。然而&#xff0c;在这样的背景下&#xff0c;微博…

作者头像 李华
网站建设 2026/4/10 7:19:07

从宕机到自愈:构建高可靠Docker环境的4个核心恢复脚本

第一章&#xff1a;从宕机到自愈&#xff1a;Docker高可靠环境的演进之路在传统部署模式中&#xff0c;服务一旦发生宕机&#xff0c;往往需要人工介入排查与恢复&#xff0c;导致系统可用性难以保障。随着容器化技术的普及&#xff0c;Docker 成为构建高可靠应用环境的核心工具…

作者头像 李华