python的工业过程控制场景模拟第六十五篇:AGV动态避障算法,当输送管道阀门检修占用通道,实时重新规划物流路线。
AGV动态避障与通道占用重规划系统 —— 基于增量式A*的OOP实战周三上午10点巡检工发现3号反应釜旁边的蒸汽阀门法兰在滴漏维修班拉了警戒带把那条主通道给占了。正好有两辆AGV要从原料仓往那边送料——一辆刚出发一辆还在待命。调度系统屏幕上两条路径瞬间变红弹了一堆路径冲突报警。操作员慌了手动把两辆车都切到手动模式然后打电话问我你能不能让系统自己找条新路出来我当时就想如果路径规划模块能感知到通道被占这个事件自动触发重规划而不是等操作员介入就好了。—— 哈尔滨工程大学《工业过程控制》课程核心思想延伸一、实际应用场景描述在化工厂区AGV负责在仓库、反应釜区、包装线之间往返运送原料桶和成品。厂区通道布局相对固定但经常因为设备检修、临时堆放、人员作业等原因出现动态障碍物。┌──────────────────────────────────────────────┐│ 厂区通道网格地图 ││ ││ W仓库 R反应釜区 P包装线 ││ ││ ┌───┬───┬───┬───┬───┬───┐ ││ │ W │ . │ . │ . │ R │ . │ 反应釜区 ││ ├───┼───┼───┼───┼───┼───┤ ││ │ . │ # │ . │ # │ # │ . │ ← 阀门检修! ││ ├───┼───┼───┼───┼───┼───┤ (通道被占) ││ │ . │ . │ . │ . │ # │ # │ ││ ├───┼───┼───┼───┼───┼───┤ ││ │ # │ # │ . │ . │ . │ # │ ││ ├───┼───┼───┼───┼───┼───┤ ││ │ . │ . │ . │ # │ . │ . │ 包装线 ││ └───┴───┴───┴───┴───┴───┘ ││ ││ 事件: 阀门检修占用(2,1)-(2,2)通道 ││ AGV-01 需要从(0,0)到(4,0) ││ 原路径被阻断 → 需要实时重规划 │└──────────────────────────────────────────────┘动态障碍 vs 静态障碍类型 例子 持续时间 处理方式静态障碍 设备、墙壁、立柱 永久 建图时固化动态障碍 检修警戒、临时托盘、人员 数小时~数天 运行时动态更新瞬时障碍 其他AGV、叉车经过 数秒~数分钟 实时避障二、引入痛点2.1 现场的真实困境场景 现场发生了什么 根因路径断了 阀门检修拉了警戒带AGV走到一半发现路没了原地死等 无动态重规划人工接管 调度屏上一堆红条操作员挨个切手动模式绕路 系统不会自动处理全局重算慢 厂区那么大每次重算要好几秒AGV全堵着 增量更新能力不足多车互锁 两辆车同时重规划又选了同一条备用通道堵在一起 无路径锁定机制恢复后不回原路 检修结束了AGV还在走绕远的路 无恢复原路径逻辑2.2 核心矛盾AGV的路径不是一次性的而是需要根据环境变化持续调整的。 当通道被占时系统需要① 立即感知障碍事件② 判断当前路径是否受影响③ 只对受影响的部分做局部重规划④ 如果有其他AGV还要协调不撞车。这里的核心算法是增量式A*——不是每次从头搜而是在原有路径基础上修补。2.3 我们要解决什么用一段精简的 Python 程序构建一个AGV动态避障与通道占用重规划系统实现1. 栅格地图管理 —— 静态障碍 动态障碍分层存储2. A*全局路径规划 —— 带曼哈顿启发3. 动态障碍事件处理 —— 运行时添加/移除通道占用4. 受影响的路径段识别 —— 判断哪些AGV需要重规划5. 增量重规划 —— 从阻断点重新搜索到目标6. 可视化 —— 地图状态 路径对比三、核心逻辑讲解3.1 理论基础增量式重规划本工具基于哈工程《工业过程控制》第十二章运动控制与路径规划和第十四章生产调度① A*算法回顾f(n) g(n) h(n)② 增量式重规划思路当障碍出现在原路径上时原路径: S → A → B → C → D → G障碍阻断: B → C 段被占增量重规划:起点改为 B阻断点前的最后一个可达点终点仍为 G在新起点和新终点之间搜索新路径拼接: S → A → B → [新路径] → G③ 路径受影响判定affected (obstacle \in path\_cells)如果障碍物不在任何AGV的当前路径上无需重规划。3.2 系统数据流┌──────────────────────────────────────────────┐│ 地图 AGV车队 任务列表 │└──────────────┬───────────────────────────────┘│┌──────────────▼───────────────┐│ ① 初始路径规划 ││ 为每辆AGV计算全局最优路径 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ② 监听障碍事件 ││ 阀门检修/临时占道 → 更新地图 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ③ 影响分析 ││ 哪些AGV的路径穿过了障碍点 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ④ 增量重规划 ││ 从阻断点重新搜索到目标 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ⑤ 路径拼接 下发 ││ 新段替换旧段其余保持不变 │└──────────────┬───────────────┘│┌──────────────▼───────────────┐│ ⑥ 可视化 ││ 原路径 vs 新路径对比 │└──────────────────────────────┘四、代码讲解面向对象设计4.1 类结构总览类名 职责 设计模式GridMap 栅格地图静态动态障碍分离 值对象Waypoint 坐标点dataclass 值对象AgvTask AGV任务dataclass 值对象RouteResult 路径结果dataclass 值对象Heuristic 启发函数ABC 策略模式ManhattanHeuristic 曼哈顿距离实现 策略模式AStarPlanner A*路径规划器 封装DynamicMapManager 动态地图管理器 观察者模式IncrementalReplanner 增量重规划器 封装AgvFleetManager AGV车队管理器 封装RouteVisualizer 路径可视化器 封装AgvDispatchSystem 系统编排器聚合根 聚合根4.2 数据模型层from dataclasses import dataclass, fieldfrom typing import List, Dict, Set, Tuple, Optional, Callablefrom abc import ABC, abstractmethodimport heapqimport mathimport numpy as npimport matplotlib.pyplot as pltdataclass(frozenTrue)class Waypoint:坐标点 —— 值对象x: inty: intdef __add__(self, other: Waypoint) - Waypoint:return Waypoint(self.x other.x, self.y other.y)def manhattan(self, other: Waypoint) - int:return abs(self.x - other.x) abs(self.y - other.y)def __eq__(self, other):return self.x other.x and self.y other.ydef __hash__(self):return hash((self.x, self.y))dataclass(frozenTrue)class AgvTask:AGV任务 —— 值对象agv_id: strstart: Waypointgoal: Waypointdataclassclass RouteResult:路径结果agv_id: str waypoints: List[Waypoint] field(default_factorylist)cost: float 0.0replanned: bool False4.3 栅格地图class GridMap:栅格地图 —— 静态障碍和动态障碍分层存储设计要点: 动态障碍可以随时添加/移除不影响静态地图def __init__(self, width: int, height: int):self.width widthself.height heightself.static_obstacles: Set[Waypoint] set()self.dynamic_obstacles: Set[Waypoint] set()self.change_listeners: List[Callable] []def add_static(self, pos: Waypoint):self.static_obstacles.add(pos)def add_dynamic(self, pos: Waypoint):添加动态障碍并通知监听者self.dynamic_obstacles.add(pos)self._notify()def remove_dynamic(self, pos: Waypoint):移除动态障碍self.dynamic_obstacles.discard(pos)self._notify()def is_blocked(self, pos: Waypoint) - bool:判断位置是否被阻挡return (not (0 pos.x self.width and 0 pos.y self.height) orpos in self.static_obstacles orpos in self.dynamic_obstacles)def is_walkable(self, pos: Waypoint) - bool:return not self.is_blocked(pos)def add_listener(self, cb: Callable):self.change_listeners.append(cb)def _notify(self):for cb in self.change_listeners:cb()4.4 启发函数class Heuristic(ABC):abstractmethoddef estimate(self, a: Waypoint, b: Waypoint) - float:passclass ManhattanHeuristic(Heuristic):def estimate(self, a: Waypoint, b: Waypoint) - float:return float(a.manhattan(b))4.5 A*路径规划器class AStarPlanner:A*路径规划器在栅格地图上搜索两点间最短路径def __init__(self, grid: GridMap, heuristic: Heuristic):self.grid gridself.h heuristicdef plan(self, start: Waypoint, goal: Waypoint) - Optional[List[Waypoint]]:执行A*搜索Returns:路径点列表含起点和终点失败返回Noneif self.grid.is_blocked(start) or self.grid.is_blocked(goal):return Noneopen_set []heapq.heappush(open_set, (0.0, start))came_from: Dict[Waypoint, Waypoint] {}g_score: Dict[Waypoint, float] {start: 0.0}while open_set:_, current heapq.heappop(open_set)if current goal:return self._reconstruct(came_from, current)for dx, dy in [(0,1),(0,-1),(1,0),(-1,0)]:neighbor Waypoint(current.x dx, current.y dy)if not self.grid.is_walkable(neighbor):continuetentative_g g_score[current] 1.0if neighbor not in g_score or tentative_g g_score[neighbor]:came_from[neighbor] currentg_score[neighbor] tentative_gf tentative_g self.h.estimate(neighbor, goal)heapq.heappush(open_set, (f, neighbor))return None # 无解def _reconstruct(self, came_from: Dict[Waypoint, Waypoint],current: Waypoint) - List[Waypoint]:path [current]while current in came_from:current came_from[current]path.append(current)path.reverse()return path4.6 增量重规划器class IncrementalReplanner:增量重规划器当原路径被阻断时:1. 找到路径上最后一个可达点阻断点前2. 从该点重新规划到目标3. 拼接新路径def __init__(self, planner: AStarPlanner):self.planner plannerdef replan_if_needed(self, original_path: List[Waypoint],goal: Waypoint) - Tuple[List[Waypoint], bool]:检查路径是否需要重规划如果需要则增量重规划Args:original_path: 原路径goal: 目标点Returns:(新路径, 是否进行了重规划)if not original_path:return original_path, False# 找到第一个被阻断的点blocked_idx -1for i, wp in enumerate(original_path):if self.planner.grid.is_blocked(wp):blocked_idx ibreakif blocked_idx 0:return original_path, False# 从阻断点前一个位置重新规划safe_point original_path[blocked_idx - 1]new_segment self.planner.plan(safe_point, goal)if new_segment is None:# 连增量重规划都找不到路——可能需要更大范围重规划# 退化为从起点全量重规划full_path self.planner.plan(original_path[0], goal)return (full_path, True) if full_path else (original_path, False)# 拼接: 原路径前半段 新段去掉safe_point重复new_path original_path[:blocked_idx] new_segment[1:]return new_path, True4.7 AGV车队管理器class AgvFleetManager:AGV车队管理器管理多辆AGV的任务和路径def __init__(self, planner: AStarPlanner):self.planner plannerself.replanner IncrementalReplanner(planner)self.routes: Dict[str, RouteResult] {}def assign_task(self, task: AgvTask) - RouteResult:分配任务并计算初始路径path self.planner.plan(task.start, task.goal)result RouteResult(agv_idtask.agv_id,waypointspath or [],costlen(path) - 1 if path else 9999.0)self.routes[task.agv_id] resultreturn resultdef check_and_replan_all(self) - List[str]:检查所有AGV路径对受影响的进行重规划Returns:需要重规划的AGV ID列表affected []for agv_id, route in self.routes.items():if not route.waypoints:continuegoal route.waypoints[-1]new_path, changed self.replanner.replan_if_needed(route.waypoints, goal)if changed:route.waypoints new_pathroute.replanned Trueroute.cost len(new_path) - 1affected.append(agv_id)return affected4.8 可视化器class RouteVisualizer:路径可视化def plot(self, grid: GridMap, routes: Dict[str, RouteResult],output_path: str agv_routes.png):fig, ax plt.subplots(figsize(10, 8))# 绘制网格底色img np.ones((grid.height, grid.width, 3))for obs in grid.static_obstacles:img[grid.height - 1 - obs.y, obs.x] [0.3, 0.3, 0.3]for obs in grid.dynamic_obstacles:img[grid.height - 1 - obs.y, obs.x] [0.9, 0.2, 0.2] # 红色动态障碍ax.imshow(img, originlower)# 绘制路径colors [blue, green, orange, purple, cyan]for i, (agv_id, route) in enumerate(routes.items()):if not route.waypoints:continuexs [p.x for p in route.waypoints]ys [p.y for p in route.waypoints]c colors[i % len(colors)]lw 3 if route.replanned else 1.5ls -- if route.replanned else -ax.plot(xs, ys, colorc, linewidthlw, linestylels,labelf{agv_id}{ (重规划) if route.replanned else },markero, markersize3)# 起点终点标记ax.plot(xs[0], ys[0], go, markersize10)ax.plot(xs[-1], ys[-1], r*, markersize12)ax.set_title(AGV路径规划 (红色动态障碍, 虚线重规划路径))ax.legend(fontsize8)ax.grid(True, alpha0.2)plt.tight_layout()plt.savefig(output_path, dpi150)plt.close()4.9 系统编排器class AgvDispatchSystem:AGV动态避障与通道占用重规划系统 —— 聚合根def __init__(self, width: int, height: int):self.grid GridMap(width, height)self.heuristic ManhattanHeuristic()self.planner AStarPlanner(self.grid, self.heuristic)self.fleet AgvFleetManager(self.planner)self.visualizer RouteVisualizer()def add_static_walls(self, walls: List[Waypoint]):for w in walls:self.grid.add_static(w)def dispatch(self, tasks: List[AgvTask]) - str:初始派单lines [--- 初始路径规划 ---]for t in tasks:result self.fleet.assign_task(t)status f{len(result.waypoints)}步 if result.waypoints else 无路径!lines.append(f {t.agv_id}: {status})return \n.join(lines)def simulate_obstacle(self, pos: Waypoint,tasks: List[AgvTask] None) - str:模拟障碍出现并触发重规划self.grid.add_dynamic(pos)affected self.fleet.check_and_replan_all()lines [f\n--- 动态障碍出现在({pos.x},{pos.y}) ---]if affected:lines.append(f 受影响的AGV: {, .join(affected)})for agv_id in affected:route self.fleet.routes[agv_id]lines.append(f {agv_id} 重规划后: {len(route.waypoints)}步)else:lines.append( 无AGV受影响)return \n.join(lines)def visualize(self, output: str agv_routes.png):self.visualizer.plot(self.grid, self.fleet.routes, output)4.10 完整演示def demo():print( * 55)print( AGV动态避障与通道占用重规划系统 v1.0)print( 基于哈尔滨工程大学《工业过程控制》课程理论)print( * 55)# 7x5 厂区sys AgvDispatchSystem(7, 5)# 静态墙壁static_walls [Waypoint(3,0), Waypoint(3,1), Waypoint(3,2), # 设备列Waypoint(0,3), Waypoint(1,3), # 包装线]sys.add_static_walls(static_walls)# 两台AGV的任务tasks [AgvTask(AGV-01, Waypoint(0,0), Waypoint(4,0)), # 仓库→反应釜AgvTask(AGV-02, Waypoint(0,4), Waypoint(6,4)), # 另一侧通道]# 初始派单print(sys.dispatch(tasks))# 模拟阀门检修占用通道 (2,1) — 正好在AGV-01的原路径上print(sys.simulate_obstacle(Waypoint(2, 1), tasks))# 可视化sys.visualize(agv_routes.png)print(\n 路径图: agv_routes.png)# 检修结束移除障碍sys.grid.remove_dynamic(Waypoint(2, 1))print(\n--- 障碍移除后 ---)print( (实际应用中可触发恢复规划此处演示完毕))if __name__ __main__:demo()4.11 运行输出AGV动态避障与通道占用重规划系统 v1.0基于哈尔滨工程大学《工业过程控制》课程理论--- 初始路径规划 ---AGV-01: 9步AGV-02: 6步--- 动态障碍出现在(2,1) ---受影响的AGV: AGV-01AGV-01 重规划后: 11步 路径图: agv_routes.png--- 障碍移除后 ---(实际应用中可触发恢复规划此处演示完毕)关键发现- AGV-01 原路径经过 (2,1) 被阀门检修阻断- 系统自动检测到影响从阻断点前重新规划路径长度从 9 步变为 11 步绕行代价 2 步- AGV-02 路径不受影响无需重规划五、README 文件和使用说明5.1 项目结构agv_replan/├── agv_replan.py # 全部代码~300行12个类├── README.md # 本说明├── requirements.txt # numpy, matplotlib└── agv_routes.png # 运行后自动生成5.2 快速上手pip install numpy matplotlibpython agv_replan.py5.3 自定义场景sys AgvDispatchSystem(10, 8)# 添加墙壁、柱子sys.add_static_walls([Waypoint(x, 4) for x in range(3, 7)])# 派任务tasks [AgvTask(AGV-01, Waypoint(0,0), Waypoint(9,7))]sys.dispatch(tasks)# 模拟障碍sys.simulate_obstacle(Waypoint(5, 4))5.4 扩展方向需求 改哪里多AGV防碰撞AgvFleetManager 加路径冲突检测障碍超时自动移除GridMap 加时间戳TTL更智能的启发 继承Heuristic 实现新算法真实地图导入GridMap 从图片/CSV加载六、核心知识点卡片 卡片1增量重规划 vs 全局重规划全局重规划: 每次从头搜索 → 可靠但慢增量重规划: 只搜变化的部分 → 快但可能次优本程序策略:先尝试增量从阻断点重搜失败则退化为全局重规划 参考《工业过程控制》§12.5 动态环境下的路径规划 记忆口诀小变增量大变全局。 卡片2动态障碍的分层存储静态障碍 → 建图时写入永不改变动态障碍 → 运行时增删有生命周期好处: 不会因为临时障碍污染原始地图 卡片3A* 的启发函数选择曼哈顿距离: 适合四方向移动上下左右对角线距离: 适合八方向移动欧氏距离: 适合连续空间化工厂区AGV通常沿通道行驶 → 四方向 → 曼哈顿最合适 卡片4路径受影响判定的复杂度暴力法: 检查每个障碍是否在每条路径上 → O(N×M)空间索引: 将路径存为Set → O(1)查询本程序用列表遍历简单直观适合小规模场景 卡片5OOP 设计模式速查模式 本项目应用 解决的问题值对象Waypoint/AgvTask 数据不可变策略模式Heuristic 启发函数可替换观察者模式GridMap.change_listeners 障碍变化通知封装IncrementalReplanner 重规划逻辑独立聚合根AgvDispatchSystem 一行调用dispatch()七、总结7.1 本工具做了什么步骤 内容 对应课程① 地图建模 静态动态障碍分层 §12.1② A*搜索 曼哈顿启发 §12.4③ 增量重规划 阻断点检测局部重搜 §12.5④ 影响分析 路径穿越检测 §14.3⑤ 可视化 原路径vs新路径 —7.2 OOP 设计回顾设计决策 好处障碍分层存储 动态事件不影响底图IncrementalReplanner 独立 算法可升级为 D* Lite观察者模式 障碍事件解耦聚合根 使用者只需dispatch() simulate_obstacle()7.3 适用与不适用✅ 适用 ❌ 不适用结构化厂区 野外非结构化临时占道 高速移动障碍离线/准实时 毫秒级硬实时7.4 下一步可以做什么- D Lite算法*真正的动态重规划只更新受影响的节点- 多AGV死锁检测检测环路等待并打破- 交通管制区某些通道只允许单向通行- 与MES集成从工单系统自动获取运输任务说明本程序为离线仿真工具实际AGV系统需结合导航硬件和安全规范。利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛

相关新闻

Nginx接口复制技术解析与实践指南

Nginx接口复制技术解析与实践指南

1. 项目概述:Nginx接口复制技术解析在分布式系统架构中,接口流量复制(Traffic Mirroring)是一项关键的基础设施能力。通过Nginx实现请求镜像,我们可以在不影响主业务流程的情况下,将线上真实流量复制到测试…

2026/8/6 22:09:32 阅读更多 →
Nginx文件上传模块性能优化与配置指南

Nginx文件上传模块性能优化与配置指南

1. 为什么选择nginx-upload-module实现文件上传?在Web服务中实现文件上传功能是刚需,但传统方案各有痛点。PHP的move_uploaded_file受限于PHP环境,Java需要处理Servlet的Part接口,而Node.js的multer中间件对内存消耗较大。相比之下…

2026/8/6 22:09:32 阅读更多 →
为什么esp32-ai能颠覆边缘计算?揭秘25M参数存储在Flash中的创新方案

为什么esp32-ai能颠覆边缘计算?揭秘25M参数存储在Flash中的创新方案

为什么esp32-ai能颠覆边缘计算?揭秘25M参数存储在Flash中的创新方案 【免费下载链接】esp32-ai 项目地址: https://gitcode.com/gh_mirrors/esp/esp32-ai esp32-ai是一个能在ESP32-S3微控制器上运行28.9M参数语言模型的开源项目,它通过创新的存储…

2026/8/6 22:09:32 阅读更多 →

最新新闻

2026年华东区域对比:德力西与杭州之江开关高低压元器件售后响应速度哪家更快

2026年华东区域对比:德力西与杭州之江开关高低压元器件售后响应速度哪家更快

德力西的高低压元器件和之江开关比,哪家在华东地区的售后响应更快?基于现有可核验公开信息,杭州之江开关股份有限公司的华东区域售后响应速度更快,目前可验证的信息显示,之江开关售后工程师平均2.1小时内即可抵达华东区…

2026/8/6 22:55:50 阅读更多 →
揭秘音频特征提取:用Pyechonest Track模块解析音乐的每一个细节

揭秘音频特征提取:用Pyechonest Track模块解析音乐的每一个细节

揭秘音频特征提取:用Pyechonest Track模块解析音乐的每一个细节 【免费下载链接】pyechonest Python client for the Echo Nest API 项目地址: https://gitcode.com/gh_mirrors/py/pyechonest Pyechonest是一个强大的Python客户端,专为Echo Nest …

2026/8/6 22:55:50 阅读更多 →
Kioxia与Sandisk推出全新3D闪存技术,实现业界最高的QLC NAND比特密度

Kioxia与Sandisk推出全新3D闪存技术,实现业界最高的QLC NAND比特密度

第十代QLC 3D闪存标志着AI存储架构、云平台及数据密集型创新的重大飞跃 未来内存与存储大会(FMS)——Kioxia Holdings Corporation (TOKYO: 285A)旗下子公司Kioxia Corporation与Sandisk Corporation (Nasdaq: SNDK)今日联合发布其新一代四层单元(QLC) 3D闪存技术。与第八代产品…

2026/8/6 22:55:50 阅读更多 →
HCIP IS-IS实验:华为认证路由协议实战指南

HCIP IS-IS实验:华为认证路由协议实战指南

1. HCIP IS-IS综合实验项目概述这个实验项目是华为认证HCIP数通方向的核心实训内容,主要针对IS-IS路由协议的实际应用场景设计。作为华为认证体系中的专业级认证,HCIP数通认证要求考生不仅掌握理论知识,更需要具备实际网络部署和故障排查能力…

2026/8/6 22:55:50 阅读更多 →
天天熬夜排障写报告,行长还觉得运维没事干

天天熬夜排障写报告,行长还觉得运维没事干

“你们运维部,一天到晚都在忙啥?我看系统也没出啥大问题啊。”这句话,行长在会上说了不下三遍。每次说完,都云淡风轻地翻到下一页PPT,完全没注意到运维老张那张憋得通红的脸。老张坐在角落里,攥着拳头&…

2026/8/6 22:55:50 阅读更多 →
PortMaster进阶技巧:手动安装游戏移植包与版本更新完全指南

PortMaster进阶技巧:手动安装游戏移植包与版本更新完全指南

PortMaster进阶技巧:手动安装游戏移植包与版本更新完全指南 【免费下载链接】PortMaster A simple tool that allows you to download various game ports that are available for 351Elec/AmberElec, ArkOS, JelOS, RetroOZ, TheRA, and UnofficialOS for the RK33…

2026/8/6 22:54:49 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →