移动机器人路径规划实战:基于Dijkstra算法的栅格地图最优路径实现
移动机器人路径规划这件事只要做过的人都知道最头疼的不是算法本身有多难而是“原理懂了代码跑不通”“代码通了换张地图又挂了”这类问题。最近我在整理一个基于Dijkstra算法的移动机器人路径规划项目把原理、代码、调试心得一次性沉淀了下来。这个项目主要解决的是在已知静态栅格地图中如何让机器人从起点移动到目标点同时走出一条总代价最小的路径。如果你正在入门路径规划或者想从零把一个可运行的Dijkstra规划器落地这篇内容应该能帮你少踩不少坑。我会把完整的Python实现贴出来每一段关键代码都配上注释并把算法背后的“为什么”讲清楚。1. 整体设计与思路拆解1.1 为什么选Dijkstra而不是其他算法做路径规划市面上可选的方向很多BFS、DFS、Dijkstra、A*、RRT、PRM。我第一次做这个项目的时候其实也纠结过到底用哪个。后来想明白了一件事选算法不是选“最先进的”而是选“最匹配当前场景的”。Dijkstra是一个典型的单源最短路径算法它的核心特点是保证在非负权图中找到从起点到所有节点的最短路径。对于移动机器人来说我们最怕的就是规划出一条看似合理、实际绕远的路或者更严重的情况——规划出一条穿过障碍物的路。Dijkstra的完备性和最优性让它非常适合作为静态环境下的路径规划基线方案。对比一下BFS能找到最短路径但它把每条边的代价都当成1如果地图中不同区域通行成本不同比如草地、沙地、水泥路BFS就无能为力了。A*在Dijkstra的基础上加了启发式函数搜索效率更高但启发式函数设计不当会损失最优性。采样类算法RRT等适合高维空间和动态环境但在二维栅格地图上反而不如Dijkstra干脆利落。所以这个项目最终选了Dijkstra就是看中了它的三个点实现简单、保证最优、对地图形式没有特殊要求。特别是当你在做教学Demo或者给后续A*/D*做对照实验时Dijkstra就是一个绕不开的“锚点”。1.2 项目整体结构怎么搭整个项目的代码结构我拆成了三个模块这样逻辑清晰后续扩展也方便地图建模模块负责生成/加载栅格地图障碍物用1表示可通行区域用0表示。核心算法模块实现Dijkstra搜索逻辑输入地图、起点、终点输出最短路径和距离场。可视化模块用图形把地图、路径、搜索过程画出来方便验证算法行为和调参。这种分层方式还有一个额外的好处当你以后想换A或者D算法时只需要替换第二个模块地图和可视化部分完全不用动。我在实际项目中就是这么做的换算法基本半小时搞定。2. Dijkstra算法原理与关键概念2.1 核心思想一句话版本Dijkstra算法的本质是维护一张“从起点到每个节点的当前已知最短距离”表每次都从未处理的节点中挑一个距离最小的出来“确认”然后用它去尝试更新邻居的距离。这个过程反复进行直到目标节点被确认。听起来抽象但打个比方就很好懂。想象你在一个迷宫入口手里有一张表记着从入口到每个路口的“已知最短步数”。一开始除了入口是0其他都是无穷大。你选一个当前最近的路口走进去把周围能直接到达的路口步数更新一下然后把这个路口的“已知最短步数”锁定。反复这么做你最终能确定到任何一个路口的真实最短距离。整个过程有两个核心机制“贪心选最小”每次选择距离最小的节点进行处理这是Dijkstra能保证最优的关键。“松弛操作”用当前节点去更新邻居节点的距离如果发现更短路径就更新记录。2.2 为什么Dijkstra能保证最短路径这一点值得展开讲因为很多初学者做出来的Dijkstra“能跑通”但不理解为什么它不会出错。关键在于算法每次都选择“当前距离最小”的未处理节点。因为所有边的权重都是非负的所以当某个节点被选中时它的距离不可能再被其他节点更新得更小——任何其他未处理的节点到它的路径都必须经过一个当前距离不小于它的节点再加上非负边权结果不可能更小。换句话说一旦节点被“弹出来”它的最短距离就盖棺定论了。这个性质保证了算法的完备性和最优性。这里有个细节要特别提醒如果地图中出现了负权边这个逻辑就崩了。好在移动机器人路径规划中通行代价通常都是累积距离或时间天然是非负的所以Dijkstra在这种场景下非常稳。2.3 地图建模与栅格代价设定移动机器人路径规划里最常用的是栅格地图Grid Map。每格代表机器人在地理空间中的一块区域比如5厘米×5厘米。栅格有两种状态空闲可通过和占据障碍物。在这个项目中我把代价定义为“经过一个栅格所需付出的成本”。最简单的方式是统一为1也就是每走一格代价加1。但实际项目中你完全可以给不同的区域设置不同的代价。比如地形类型栅格值通行代价普通地面01.0沙地/泥地21.5草地32.0障碍物1无穷大不可通行这样做的好处是Dijkstra规划出来的路径不只是“几何上最短”而是“综合代价最小”。我在真实项目里就把代价图融入了超声传感器置信度靠近墙体区域代价略微调高机器人走出来的路线明显更安全。3. 核心代码实现与逐段注释3.1 算法主流程代码下面这段Python代码是项目的核心完整的注释我已经写在每一段旁边。import heapq import numpy as np import matplotlib.pyplot as plt from matplotlib import colors def dijkstra_planning(grid_map, start, goal): Dijkstra路径规划主函数 参数: grid_map: 二维numpy数组, 0可通行, 1障碍物 start: 起点坐标 (row, col) goal: 终点坐标 (row, col) 返回: path: 路径点列表, 从start到goal, 为空表示找不到路径 dist: 起点到每个栅格的最短距离矩阵 parent: 父节点字典, 用于回溯路径 rows, cols grid_map.shape # 距离数组, 初始化为无穷大, 表示尚不可达 dist np.full((rows, cols), np.inf) # 父节点字典, 记录当前节点的上一个节点 # 这个字典是路径回溯的唯一依据, 后续会重点讲解 parent {} # 起点距离设为0 dist[start] 0 # 优先队列, 元素格式为 (当前距离, 坐标) # 用堆实现每次取距离最小节点的操作, 时间复杂度 O(log N) pq [(0, start)] # 定义4邻域移动方向: 右、下、左、上 # 如果地图允许斜着走, 可以改成8邻域, 但代价需要乘以sqrt(2) directions [(0, 1), (1, 0), (0, -1), (-1, 0)] while pq: # 弹出当前距离最小的节点 cur_dist, cur_node heapq.heappop(pq) # 到达目标直接退出 if cur_node goal: break # 关键优化: 如果弹出的距离大于已记录的最短距离 # 说明这个节点已经被更短路径更新过了, 当前记录是过期数据, 直接跳过 if cur_dist dist[cur_node]: continue # 遍历四个方向的邻居 for dx, dy in directions: nx, ny cur_node[0] dx, cur_node[1] dy # 越界检查 if not (0 nx rows and 0 ny cols): continue # 障碍物检查: 值为1表示不可通行 if grid_map[nx, ny] 1: continue neighbor (nx, ny) # 每走一格代价为1 # 如果地图有地形代价, 这里可以替换为 grid_map[nx][ny] 对应的代价值 new_dist cur_dist 1 # 松弛操作: 发现更短路径则更新 if new_dist dist[neighbor]: dist[neighbor] new_dist parent[neighbor] cur_node heapq.heappush(pq, (new_dist, neighbor)) # 回溯路径 path [] # 注意: 如果goal等于start, 需要单独处理, 否则parent里没有起点 if goal start: return [start], dist, parent # 从goal开始, 沿着parent一路回退到start # 如果goal不在parent中, 说明搜索结束时并没有找到目标 if goal not in parent: return [], dist, parent node goal while node ! start: path.append(node) node parent[node] path.append(start) # 因为我们是从goal回溯到start, 需要反转才是正确顺序 path.reverse() return path, dist, parent这段代码其实只有40多行但涵盖了Dijkstra的所有关键要素优先队列、距离数组、父节点字典、松弛操作、过期节点跳过、路径回溯。3.2 容易踩坑的代码细节有几个细节我特别想强调因为这些都是在调试中实际踩过的坑。第一个是堆中“过期数据”的处理。很多教材实现会用一个visited数组来标记节点是否被处理过但优先队列中可能同时存在同一个节点的多条记录——因为一个节点可能在多个时间点被推入堆中。如果你不做“cur_dist dist[cur_node]”这个判断就会处理到过期的记录虽然结果不一定错但效率会明显下降。在1000×1000的大地图上这个优化能省下不少时间。第二个是路径回溯的边界情况。当起点和终点相邻时路径回溯只能回到起点当起点和目标点重合时parent字典里根本没有起点所以要单独处理。我见过好多个实现都在这个边界上挂了表现就是目标点明明在当前点旁边却报错“找不到路径”。第三个是坐标系的统一。我的实现用(row, col)表示第一个维度是行第二个维度是列。但很多人在画图时习惯用(x, y)一旦混用生成的地图和路径就是“转置关系”路线上会穿过看起来像障碍物的地方。这个问题的隐蔽性极高强烈建议从数据结构层面就统一命名规范。3.3 可视化与搜索过程回放光有路径没有可视化调试起来非常痛苦。我写了一个简单的可视化函数同时把搜索过程记录下来直观展示算法是如何“一圈一圈”向外扩展的。def visualize_search(grid_map, start, goal, path, dist): 可视化栅格地图、搜索过程距离场和最终路径 fig, ax plt.subplots(figsize(8, 8)) # 构建自定义色图: 障碍物黑色, 可通行白色 cmap colors.ListedColormap([white, black]) ax.imshow(grid_map, cmapcmap) # 绘制距离场, 颜色越深表示距离起点越远 dist_display np.where(np.isinf(dist), 0, dist) dist_display np.ma.masked_where(dist_display 0, dist_display) im ax.imshow(dist_display, cmapviridis, alpha0.6) plt.colorbar(im, axax, labelDistance from start) # 绘制路径 if path: path_x [p[1] for p in path] path_y [p[0] for p in path] ax.plot(path_x, path_y, colorred, linewidth3, labelPath) # 标记起点和终点 ax.plot(start[1], start[0], go, markersize12, labelStart) ax.plot(goal[1], goal[0], ro, markersize12, labelGoal) ax.grid(True, whichboth, colorgray, linewidth0.5) ax.set_title(Dijkstra Path Planning Result) ax.legend() plt.show()从可视化里你能非常直观地看到Dijkstra的搜索模式距离场从起点开始像水波一样向外扩散这就是“以起点为中心逐层扩展”的特征。这个特征既是Dijkstra的优点保证最优也是它的短板搜索区域大、效率低于A*。在后面的对比部分我会再展开。3.4 完整可运行示例把上面两个函数串起来一个完整的Demo就出来了。if __name__ __main__: # 构造一个带障碍物的20x20栅格地图 grid_map np.zeros((20, 20)) # 画一道垂直障碍墙 grid_map[5:15, 10] 1 # 加上一个水平障碍块 grid_map[10, 3:8] 1 start, goal (2, 2), (18, 18) path, dist, parent dijkstra_planning(grid_map, start, goal) if path: print(f路径点数: {len(path)}) print(f路径总代价: {dist[goal]:.1f}) print(路径坐标:, path[:5], ...) else: print(未找到可行路径!) visualize_search(grid_map, start, goal, path, dist)这个Demo建议直接跑一下几分钟就能复现。跑完后你可以在谷歌地图风格的大地图上换几个不同的障碍布局用肉眼验证埋在障碍后面的路径Dijkstra一定能绕出来而且路径是最短的。4. 实操中的常见问题与排查技巧4.1 路径“穿墙”问题我做项目时遇到最多的问题就是路径穿墙。排查后九成的原因是地图数组的行列顺序和路径坐标的解释方式不一致。比如地图是numpy数组grid_map[row, col]取的是第row行第col列但画图时如果你用(x, y)顺序且x对应列、y对应行比如plot(path_x, path_y)而path_x取的是col即ypath_y取的是row即x那么绘制时坐标就正确。如果取反了路径就会像“穿墙”一样。排查方法很简单在路径上随机抽几个点打印出它的坐标和该点的地图栅格值如果栅格值是1那肯定是坐标映射错了。不要相信肉眼观察用数据说话。4.2 搜索速度慢在大地图上怎么办Dijkstra在中小尺寸地图上表现很好20×20、500×500都很快。但到了几千点甚至上万点的地图如果直接用四邻域堆空间和时间消耗会明显增加。我实测过一个1000×1000的全空闲地图Dijkstra需要遍历大约一百万个节点耗时几秒到十几秒。针对这个情况有三个实用优化手段使用双向Dijkstra从起点和终点同时扩展相遇时停止能大幅减少搜索空间。实现起来就是在原算法上再加一个方向的搜索并处理两个方向的“会师”逻辑。牺牲最优性换取速度直接换A*。如果你的地图是通用的非负路网加一个欧几里得距离启发式就能在几乎不损失最优性的情况下提速数倍。抽象地图形变。先把稀疏路网或拓扑结构提取出来在图上做Dijkstra再把结果映射回栅格。这种方法在地形差异大的场景里特别有效。4.3 八邻域与四邻域的选择四邻域只允许上下左右移动路径看起来会比较“方正”总长度通常偏长因为不能斜走。八邻域允许斜向移动路径更自然但斜向的实际距离是√2个栅格单位代码里的代价不能简单写1否则路径会倾向于斜着走导致非最优。正确的做法是直行代价1斜行代价√2≈1.414。这样规划出来的路径在欧氏距离意义上才是真正最短的。我在一个50×50的地图上对比过四邻域得到的路径长度大约是62个栅格单位八邻域则只有45左右差距肉眼可见。4.4 地图数据从哪来做Demo时地图可以自己手写但真实机器人项目里地图通常来自SLAM构建的栅格占用图Occupancy Grid Map或者从CAD图纸转换而来。不管来源是什么进入算法前都必须做一次“像素值到二值图”的映射把可通行区域统一成0把占据区域统一成1不确定性区域根据膨胀半径处理。这里有个关键步骤是障碍物膨胀Inflation。真实机器人有物理尺寸路径不能贴着墙体走。我通常会用形态学膨胀把障碍物边界往外扩机器人半径对应的格子数再交给Dijkstra规划。这样做出来的路径才具有实际可执行性不然视觉上完美一到实机就频繁碰撞。5. 算法对比与工程选型建议5.1 Dijkstra与A*的取舍A*是Dijkstra的“加速版”区别只在于多了一个启发式函数每个节点的优先级从“起点到该节点的代价g(n)”变成“起点到该节点的代价g(n) 该节点到终点的估计代价h(n)”。这个启发式的作用是把搜索方向“拽”向目标点而不是在整张地图上均匀扩散。如果h(n)设计成永远不大于真实剩余代价即一致性/可采纳性A*得到的结果仍然是最优的。在工程上我建议的原则是地图小几百个栅格时直接上Dijkstra够用代码短、逻辑直观排查问题也方便。地图大、节点多且终点相对明确时上A*启发式用欧氏距离就足够。动态环境或需要反复重规划时考虑D* Lite这是Dijkstra思想在动态场景下的延伸。5.2 路径平滑处理Dijkstra输出的路径是离散栅格路径机器人直接跟踪的话会在拐角处出现“猛打方向”的问题。我自己的做法是先对路径做折线简化比如去掉共线的中间点再做贝塞尔曲线或样条插值平滑最后交给运动控制器跟踪。不过要提醒一句平滑后的路径可能偏离原来栅格路径、甚至切过障碍物角点。所以平滑之后一定要再做一次碰撞检测。这个坑我在项目里踩过后来每次在平滑阶段后都强制跑一遍碰撞校验才算彻底解决。5.3 工程化改造的扩展方向这个项目看起来简单但扩展空间其实很大。我后来在它基础上加了三个功能动态障碍物检测发现障碍后局部重新规划、代价地图API接收传感器数据实时更新代价、多目标点调度用Dijkstra计算多个目标间的距离矩阵配合排序算法安排访问顺序。如果读者想更深入建议往这些方向继续延伸把Dijkstra替换成A*做性能对照实验把栅格地图换成路网图做一个导航App的底层路径规划或者把距离场保存下来用于后续的梯度路径平滑处理。最后分享一个我实际操作中总结的经验这类算法项目真正的难点从来不是算法代码本身而是“数据的准确性和坐标的一致性”。你花在调试坐标映射、地图格式、边界条件上的时间往往比写算法代码多得多。所以做项目时先花30分钟把数据结构定义清楚再动手写算法看起来慢实际是最快的路。我在Dijkstra这个项目上就是这么做的后来扩展成A和D的时候几乎没有改过主体框架只换了搜索策略那一小部分。希望这几千字的内容对正在做路径规划项目的你有实实在在的帮助。

相关新闻

Bootstrap可视化布局工具全解析:从栅格原理到项目避坑指南

Bootstrap可视化布局工具全解析:从栅格原理到项目避坑指南

1. 可视化布局工具到底帮我们解决了什么问题我最早接触 Bootstrap 的时候&#xff0c;是还在用一个很传统的写法&#xff1a;打开编辑器&#xff0c;手写栅格<div class"row">、<div class"col-md-6">&#xff0c;写一个页面要反复查文档、算列…

2026/10/16 5:00:28 阅读更多 →
C++ static_cast 深度解析:编译期类型转换的边界与实战

C++ static_cast 深度解析:编译期类型转换的边界与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 5:00:28 阅读更多 →
AI终端时代合纵连横:四大芯片巨头站台PC厂商,护城河由什么构成

AI终端时代合纵连横:四大芯片巨头站台PC厂商,护城河由什么构成

“四个芯片巨头同框”这种事&#xff0c;往前数十年&#xff0c;几乎想都不敢想。但在刚过去的这场发布会上&#xff0c;GPU巨头掌门人、CPU巨头掌舵人、移动端芯片负责人、加上新任CEO&#xff0c;四个人前后脚为同一家PC厂商站台&#xff0c;而站在C位的是国内PC巨头掌门人杨…

2026/10/16 5:00:28 阅读更多 →

最新新闻

OpenSceneGraph 缩放平移实战:从原理到顺滑交互实现

OpenSceneGraph 缩放平移实战:从原理到顺滑交互实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 5:50:43 阅读更多 →
ASTER GDEM镶嵌全流程:从数据预处理到接边处理与质检

ASTER GDEM镶嵌全流程:从数据预处理到接边处理与质检

1. 为什么我要自己动手做ASTER GDEM镶嵌第一次接触ASTER GDEM是在做一个区域地形分析的小项目&#xff0c;当时需要覆盖三个省份的连续高程数据。我一开始想得很简单&#xff0c;直接去下载现成的分幅数据&#xff0c;用GIS软件拼一下不就完了。结果打开一看&#xff0c;每幅数…

2026/10/16 5:50:43 阅读更多 →
Dijkstra算法三步证明:从贪心选择到最优路径的完整推导

Dijkstra算法三步证明:从贪心选择到最优路径的完整推导

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 5:50:43 阅读更多 →
手写识别技术演进综述:从传统管道到Transformer的深度解读

手写识别技术演进综述:从传统管道到Transformer的深度解读

最近集中啃了一批手写识别相关的文献&#xff0c;这篇《Survey on Handwritten Recognition》算是我收获比较大的一篇。它收录在2022年IEEE旗下一个综合性研讨会上&#xff0c;虽然名字带Survey&#xff0c;但并不是那种罗列论文的流水账&#xff0c;而是把过去几十年的方法脉络…

2026/10/16 5:50:43 阅读更多 →
LAMMPS fix viscous/sphere 命令完全指南:有限尺寸球体角速度阻尼的实现、scale 缩放与实战应用

LAMMPS fix viscous/sphere 命令完全指南:有限尺寸球体角速度阻尼的实现、scale 缩放与实战应用

科研科学计算高性能计算 【免费下载链接】lammps Public development project of the LAMMPS MD software package 项目地址&#xff1a; https://gitcode.com/gh_mirrors/la/lammps 点击查看 免费下载 导读&#xff1a;fix viscous/sphere 是 LAMMPS 中专门面向有限尺寸球体…

2026/10/16 5:50:43 阅读更多 →
REA 逆向环境一次装对:装前三问、装中三步、装后一条命令

REA 逆向环境一次装对:装前三问、装中三步、装后一条命令

REA 逆向环境一次装对&#xff1a;装前三问、装中三步、装后一条命令 【免费下载链接】rea Reverse engineer anything with agents, from app behavior down to native binaries. 项目地址: https://gitcode.com/GitHub_Trending/rea2/rea 敲下 rea 的那一刻&#xff0…

2026/10/16 5:49:43 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课&#xff0c;其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置&#xff0c;通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测&#xff0c;本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章&#xff0c;跟着敲完了投票应用&#xff0c;大概会有一种"我好像会了&#xff0c;又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型&#xff0c;下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →