当前位置: 首页 > article >正文

机器人路径规划算法之A*算法详解+MATLAB代码实现

目录一、A*算法核心原理1. 算法概述2. 核心公式3. 启发函数 h(n) 的性质4. 常用启发函数二、A*算法步骤详解1. 算法流程2. 与Dijkstra的对比三、MATLAB实现A*算法一、A*算法核心原理1.算法概述A*算法是一种启发式搜索算法结合了Dijkstra的最优性保证和贪心搜索的高效性。它的核心思想是通过启发函数*引导搜索方向优先探索最有可能到达目标的节点。2.核心公式A*使用评价函数 f(n)*​ 来决定节点的优先级f(n) g(n) h(n)其中g(n)从起点到节点n的实际代价h(n)从节点n到终点的估计代价启发函数f(n)通过节点n的路径的总估计代价3.启发函数 h(n) 的性质可采纳性(Admissibility)h(n) ≤ 实际最短距离保证找到最优解一致性(Consistency)h(n) ≤ c(n, n) h(n)其中c是移动代价保证高效4.常用启发函数曼哈顿距离适用于4方向移动h |x1 - x2| |y1 - y2|欧几里得距离适用于8方向移动h sqrt((x1 - x2)² (y1 - y2)²)切比雪夫距离适用于国王移动8方向h max(|x1 - x2|, |y1 - y2|)二、A*算法步骤详解1.算法流程1. 初始化 - 将起点加入开放列表(open list) - g(起点)0, f(起点)h(起点) - 关闭列表(closed list)为空 2. 循环直到开放列表为空 a. 从开放列表中选择f值最小的节点作为当前节点 b. 将当前节点移到关闭列表 c. 如果当前节点是目标重建路径并返回 d. 对当前节点的每个邻居 - 如果邻居在关闭列表或不可通过跳过 - 计算临时g值 g(当前) 移动代价 - 如果邻居不在开放列表或临时g值 g(邻居) * 更新g(邻居) 临时g值 * 计算h(邻居) 启发函数(邻居, 目标) * 计算f(邻居) g(邻居) h(邻居) * 设置父节点为当前节点 * 如果邻居不在开放列表加入开放列表 3. 如果开放列表为空但未找到路径返回失败2.与Dijkstra的对比特性DijkstraA*搜索策略​均匀扩展所有方向向目标方向优先扩展启发函数​无(h0)有(h启发估计)效率​较低探索节点多较高启发式引导最优性​保证最优保证最优(启发函数可采纳)内存使用​高较低三、MATLAB实现A*算法%% A*算法路径规划MATLAB实现 clear; clc; close all; fprintf( A*算法路径规划演示 \n); %% 1. 创建网格地图 fprintf(1. 创建20x20网格地图...\n); map_size 20; grid_map zeros(map_size, map_size); % 添加障碍物 grid_map(8, 3:18) 1; % 水平墙 grid_map(5:15, 10) 1; % 垂直墙 grid_map(12:16, 15:18) 1; % 方块障碍 % 添加随机障碍物 rng(42); num_obstacles 30; for i 1:num_obstacles r randi([1, map_size]); c randi([1, map_size]); grid_map(r, c) 1; end % 设置起点和终点 start_pos [2, 2]; goal_pos [18, 18]; grid_map(start_pos(1), start_pos(2)) 0; grid_map(goal_pos(1), goal_pos(2)) 0; fprintf( 起点: (%d, %d)\n, start_pos(1), start_pos(2)); fprintf( 终点: (%d, %d)\n, goal_pos(1), goal_pos(2)); %% 2. 运行A*算法 fprintf(\n2. 运行A*算法...\n); fprintf( 启发函数: 曼哈顿距离\n); fprintf( 移动方式: 4方向\n); tic; [path, nodes_expanded, g_scores] a_star_4dir(grid_map, start_pos, goal_pos); plan_time toc; fprintf( 规划完成耗时: %.4f秒\n, plan_time); %% 3. 运行8方向A*算法对比 fprintf(\n3. 运行8方向A*算法对比...\n); fprintf( 启发函数: 对角线距离\n); tic; [path_8dir, nodes_expanded_8dir, g_scores_8dir] a_star_8dir(grid_map, start_pos, goal_pos); plan_time_8dir toc; fprintf( 规划完成耗时: %.4f秒\n, plan_time_8dir); %% 4. 可视化结果 fprintf(\n4. 可视化结果...\n); visualize_a_star_results(grid_map, start_pos, goal_pos, path, path_8dir, ... nodes_expanded, nodes_expanded_8dir, ... g_scores, g_scores_8dir, plan_time, plan_time_8dir); %% 4方向A*算法实现 function [path, nodes_expanded, g_scores] a_star_4dir(grid_map, start_pos, goal_pos) % A*算法实现4方向移动曼哈顿距离 % 输入grid_map - 网格地图0空闲1障碍物 % start_pos - 起点 [行, 列] % goal_pos - 终点 [行, 列] % 输出path - 路径坐标 % nodes_expanded - 扩展的节点数 % g_scores - 实际代价矩阵 [rows, cols] size(grid_map); % 初始化数据结构 open_list []; % 待探索节点列表 closed_list false(rows, cols); % 已探索节点标记 g_score inf(rows, cols); % 实际代价 f_score inf(rows, cols); % 估计总代价 parent zeros(rows, cols, 2); % 父节点坐标 % 设置起点 g_score(start_pos(1), start_pos(2)) 0; f_score(start_pos(1), start_pos(2)) heuristic_manhattan(start_pos, goal_pos); % 将起点加入开放列表 [f_score, g_score, row, col] open_list [open_list; f_score(start_pos(1), start_pos(2)), ... g_score(start_pos(1), start_pos(2)), ... start_pos(1), start_pos(2)]; % 4个移动方向 directions [-1, 0; 1, 0; 0, -1; 0, 1]; nodes_expanded 0; path []; while ~isempty(open_list) % 从开放列表中找到f值最小的节点 [~, min_idx] min(open_list(:, 1)); current_node open_list(min_idx, 3:4); current_g open_list(min_idx, 2); % 从开放列表移除 open_list(min_idx, :) []; % 如果已探索过跳过 if closed_list(current_node(1), current_node(2)) continue; end % 标记为已探索 closed_list(current_node(1), current_node(2)) true; nodes_expanded nodes_expanded 1; % 如果到达目标重建路径 if isequal(current_node, goal_pos) path reconstruct_path(parent, start_pos, goal_pos); break; end % 探索4个邻居方向 for d 1:4 neighbor_row current_node(1) directions(d, 1); neighbor_col current_node(2) directions(d, 2); % 检查边界 if neighbor_row 1 || neighbor_row rows || ... neighbor_col 1 || neighbor_col cols continue; end % 检查障碍物 if grid_map(neighbor_row, neighbor_col) 1 continue; end % 计算临时g值 tentative_g current_g 1; % 移动代价为1 % 如果找到更好路径 if tentative_g g_score(neighbor_row, neighbor_col) % 更新父节点 parent(neighbor_row, neighbor_col, :) current_node; % 更新g值和f值 g_score(neighbor_row, neighbor_col) tentative_g; h heuristic_manhattan([neighbor_row, neighbor_col], goal_pos); f tentative_g h; f_score(neighbor_row, neighbor_col) f; % 添加到开放列表 open_list [open_list; f, tentative_g, neighbor_row, neighbor_col]; end end end g_scores g_score; g_scores(g_scores inf) NaN; end %% 8方向A*算法实现 function [path, nodes_expanded, g_scores] a_star_8dir(grid_map, start_pos, goal_pos) % A*算法实现8方向移动对角线距离 % 输入grid_map - 网格地图 % start_pos - 起点 % goal_pos - 终点 % 输出路径、扩展节点数、代价矩阵 [rows, cols] size(grid_map); % 初始化 open_list []; closed_list false(rows, cols); g_score inf(rows, cols); f_score inf(rows, cols); parent zeros(rows, cols, 2); g_score(start_pos(1), start_pos(2)) 0; f_score(start_pos(1), start_pos(2)) heuristic_diagonal(start_pos, goal_pos); open_list [open_list; f_score(start_pos(1), start_pos(2)), ... g_score(start_pos(1), start_pos(2)), ... start_pos(1), start_pos(2)]; % 8个移动方向及其代价 % 前4个上下左右代价1 % 后4个对角线代价√2≈1.414 directions [-1, 0, 1.0; % 上 1, 0, 1.0; % 下 0, -1, 1.0; % 左 0, 1, 1.0; % 右 -1, -1, 1.414; % 左上 -1, 1, 1.414; % 右上 1, -1, 1.414; % 左下 1, 1, 1.414]; % 右下 nodes_expanded 0; path []; while ~isempty(open_list) % 找到f值最小的节点 [~, min_idx] min(open_list(:, 1)); current_node open_list(min_idx, 3:4); current_g open_list(min_idx, 2); open_list(min_idx, :) []; if closed_list(current_node(1), current_node(2)) continue; end closed_list(current_node(1), current_node(2)) true; nodes_expanded nodes_expanded 1; if isequal(current_node, goal_pos) path reconstruct_path(parent, start_pos, goal_pos); break; end % 探索8个邻居方向 for d 1:size(directions, 1) neighbor_row current_node(1) directions(d, 1); neighbor_col current_node(2) directions(d, 2); move_cost directions(d, 3); % 检查边界 if neighbor_row 1 || neighbor_row rows || ... neighbor_col 1 || neighbor_col cols continue; end % 检查障碍物 if grid_map(neighbor_row, neighbor_col) 1 continue; end % 对于对角线移动检查是否切角 if d 4 % 检查两个相邻单元格是否都是障碍物 if grid_map(current_node(1), neighbor_col) 1 ... grid_map(neighbor_row, current_node(2)) 1 continue; end end % 计算临时g值 tentative_g current_g move_cost; if tentative_g g_score(neighbor_row, neighbor_col) parent(neighbor_row, neighbor_col, :) current_node; g_score(neighbor_row, neighbor_col) tentative_g; h heuristic_diagonal([neighbor_row, neighbor_col], goal_pos); f tentative_g h; f_score(neighbor_row, neighbor_col) f; open_list [open_list; f, tentative_g, neighbor_row, neighbor_col]; end end end g_scores g_score; g_scores(g_scores inf) NaN; end %% 启发函数 function h heuristic_manhattan(pos1, pos2) % 曼哈顿距离4方向移动适用 h abs(pos1(1) - pos2(1)) abs(pos1(2) - pos2(2)); end function h heuristic_diagonal(pos1, pos2) % 对角线距离8方向移动适用 dx abs(pos1(1) - pos2(1)); dy abs(pos1(2) - pos2(2)); h 1.0 * (dx dy) (1.414 - 2 * 1.0) * min(dx, dy); end function h heuristic_euclidean(pos1, pos2) % 欧几里得距离 h sqrt((pos1(1) - pos2(1))^2 (pos1(2) - pos2(2))^2); end %% 工具函数 function path reconstruct_path(parent, start_pos, goal_pos) % 重建路径 path []; current goal_pos; while ~isequal(current, [0, 0]) path [current; path]; prev parent(current(1), current(2), :); current [prev(1), prev(2)]; end % 验证路径有效性 if isempty(path) || ~isequal(path(1, :), start_pos) path []; end end %% 可视化函数 function visualize_a_star_results(grid_map, start_pos, goal_pos, path_4dir, path_8dir, ... nodes_exp_4, nodes_exp_8, g_4, g_8, time_4, time_8) % 创建可视化窗口 figure(Position, [50, 50, 1400, 900]); % 子图14方向A*结果 subplot(2, 3, 1); imagesc(grid_map); colormap(gca, [1 1 1; 0.3 0.3 0.3]); hold on; plot(start_pos(2), start_pos(1), gs, MarkerSize, 12, MarkerFaceColor, g, LineWidth, 2); plot(goal_pos(2), goal_pos(1), rs, MarkerSize, 12, MarkerFaceColor, r, LineWidth, 2); if ~isempty(path_4dir) plot(path_4dir(:,2), path_4dir(:,1), b-, LineWidth, 2); plot(path_4dir(:,2), path_4dir(:,1), bo, MarkerSize, 5, MarkerFaceColor, b); end axis equal tight; grid on; set(gca, YDir, reverse); title(sprintf(4方向A*路径\n步数: %d, 扩展节点: %d, ... size(path_4dir,1)-1, nodes_exp_4), FontSize, 11, FontWeight, bold); xlabel(X); ylabel(Y); % 子图28方向A*结果 subplot(2, 3, 2); imagesc(grid_map); colormap(gca, [1 1 1; 0.3 0.3 0.3]); hold on; plot(start_pos(2), start_pos(1), gs, MarkerSize, 12, MarkerFaceColor, g, LineWidth, 2); plot(goal_pos(2), goal_pos(1), rs, MarkerSize, 12, MarkerFaceColor, r, LineWidth, 2); if ~isempty(path_8dir) plot(path_8dir(:,2), path_8dir(:,1), m-, LineWidth, 2); plot(path_8dir(:,2), path_8dir(:,1), mo, MarkerSize, 5, MarkerFaceColor, m); end axis equal tight; grid on; set(gca, YDir, reverse); title(sprintf(8方向A*路径\n步数: %d, 扩展节点: %d, ... size(path_8dir,1)-1, nodes_exp_8), FontSize, 11, FontWeight, bold); xlabel(X); ylabel(Y); % 子图3路径对比 subplot(2, 3, 3); imagesc(grid_map); colormap(gca, [1 1 1; 0.3 0.3 0.3]); hold on; plot(start_pos(2), start_pos(1), gs, MarkerSize, 12, MarkerFaceColor, g, LineWidth, 2); plot(goal_pos(2), goal_pos(1), rs, MarkerSize, 12, MarkerFaceColor, r, LineWidth, 2); if ~isempty(path_4dir) plot(path_4dir(:,2), path_4dir(:,1), b-, LineWidth, 2, DisplayName, 4方向); end if ~isempty(path_8dir) plot(path_8dir(:,2), path_8dir(:,1), m-, LineWidth, 2, DisplayName, 8方向); end axis equal tight; grid on; set(gca, YDir, reverse); title(路径对比, FontSize, 11, FontWeight, bold); xlabel(X); ylabel(Y); legend(Location, best); % 子图44方向代价地图 subplot(2, 3, 4); % 处理NaN值 g_4_plot g_4; g_4_plot(isnan(g_4_plot)) max(g_4_plot(~isnan(g_4_plot))) 1; imagesc(g_4_plot); colormap(gca, hot); colorbar; hold on; plot(start_pos(2), start_pos(1), gs, MarkerSize, 12, MarkerFaceColor, g, LineWidth, 2); plot(goal_pos(2), goal_pos(1), rs, MarkerSize, 12, MarkerFaceColor, r, LineWidth, 2); if ~isempty(path_4dir) plot(path_4dir(:,2), path_4dir(:,1), c-, LineWidth, 1.5); end axis equal tight; set(gca, YDir, reverse); title(4方向实际代价(g值), FontSize, 11, FontWeight, bold); xlabel(X); ylabel(Y); % 子图58方向代价地图 subplot(2, 3, 5); g_8_plot g_8; g_8_plot(isnan(g_8_plot)) max(g_8_plot(~isnan(g_8_plot))) 1; imagesc(g_8_plot); colormap(gca, hot); colorbar; hold on; plot(start_pos(2), start_pos(1), gs, MarkerSize, 12, MarkerFaceColor, g, LineWidth, 2); plot(goal_pos(2), goal_pos(1), rs, MarkerSize, 12, MarkerFaceColor, r, LineWidth, 2); if ~isempty(path_8dir) plot(path_8dir(:,2), path_8dir(:,1), c-, LineWidth, 1.5); end axis equal tight; set(gca, YDir, reverse); title(8方向实际代价(g值), FontSize, 11, FontWeight, bold); xlabel(X); ylabel(Y); % 子图6性能比较 subplot(2, 3, 6); categories {4方向A*, 8方向A*}; nodes_data [nodes_exp_4, nodes_exp_8]; time_data [time_4 * 1000, time_8 * 1000]; % 转换为毫秒 if ~isempty(path_4dir) ~isempty(path_8dir) path_len_data [size(path_4dir,1)-1, size(path_8dir,1)-1]; yyaxis left; bar(1:2, nodes_data, 0.6, FaceColor, [0.2 0.6 0.8]); ylabel(扩展节点数, FontSize, 10); hold on; yyaxis right; plot(1:2, path_len_data, r-o, LineWidth, 2, MarkerSize, 8, MarkerFaceColor, r); ylabel(路径长度步, FontSize, 10); set(gca, XTick, 1:2, XTickLabel, categories); grid on; title(性能对比, FontSize, 11, FontWeight, bold); % 添加数值标签 yyaxis left; for i 1:2 text(i, nodes_data(i), sprintf(%d, nodes_data(i)), ... HorizontalAlignment, center, VerticalAlignment, bottom, ... FontSize, 9, FontWeight, bold); end yyaxis right; for i 1:2 text(i, path_len_data(i), sprintf(%d, path_len_data(i)), ... HorizontalAlignment, center, VerticalAlignment, bottom, ... FontSize, 9, FontWeight, bold, Color, r); end legend({扩展节点数, 路径长度}, Location, best); else text(0.5, 0.5, 路径不存在无法比较, ... HorizontalAlignment, center, FontSize, 11, FontWeight, bold); axis off; end % 添加整体标题 sgtitle(A*算法路径规划结果对比, FontSize, 14, FontWeight, bold); fprintf( 可视化完成\n); fprintf(\n 结果对比 \n\n); fprintf(性能指标对比:\n); fprintf(%-15s %-15s %-15s\n, 算法, 4方向A*, 8方向A*); fprintf(%-15s %-15d %-15d\n, 扩展节点数:, nodes_exp_4, nodes_exp_8); fprintf(%-15s %-15.4f %-15.4f\n, 规划时间(s):, time_4, time_8); if ~isempty(path_4dir) ~isempty(path_8dir) fprintf(%-15s %-15d %-15d\n, 路径长度:, size(path_4dir,1)-1, size(path_8dir,1)-1); fprintf(%-15s %-15.1f%% %-15.1f%%\n, 效率提升:, 0, ... 100*(nodes_exp_4 - nodes_exp_8)/nodes_exp_4); end fprintf(\n 程序执行完成 \n\n); % 显示算法原理总结 fprintf(A*算法原理总结:\n); fprintf(1. 评价函数: f(n) g(n) h(n)\n); fprintf(2. g(n): 从起点到n的实际代价\n); fprintf(3. h(n): 从n到终点的启发估计曼哈顿/对角线距离\n); fprintf(4. 开放列表: 存储待探索节点按f值排序\n); fprintf(5. 关闭列表: 存储已探索节点\n); fprintf(6. 保证最优性: 启发函数h(n) ≤ 实际最短距离可采纳性\n); end输出内容命令行输出 A*算法路径规划演示 1. 创建20x20网格地图... 起点: (2, 2) 终点: (18, 18) 2. 运行A*算法... 启发函数: 曼哈顿距离 移动方式: 4方向 规划完成耗时: 0.0079秒 3. 运行8方向A*算法对比... 启发函数: 对角线距离 规划完成耗时: 0.0085秒 4. 可视化结果... 可视化完成 结果对比 性能指标对比: 算法 4方向A* 8方向A* 扩展节点数: 198 99 规划时间(s): 0.0079 0.0085 路径长度: 34 22 效率提升: 0.0 % 50.0 % 程序执行完成 A*算法原理总结: 1. 评价函数: f(n) g(n) h(n) 2. g(n): 从起点到n的实际代价 3. h(n): 从n到终点的启发估计曼哈顿/对角线距离 4. 开放列表: 存储待探索节点按f值排序 5. 关闭列表: 存储已探索节点 6. 保证最优性: 启发函数h(n) ≤ 实际最短距离可采纳性图形窗口6个子图4方向A*路径结果8方向A*路径结果两种路径对比4方向实际代价地图8方向实际代价地图性能对比柱状图A算法的优势*高效性通过启发函数引导搜索减少探索节点最优性在可采纳启发函数下保证找到最短路径灵活性可通过不同启发函数适应不同场景完备性如果存在路径一定能够找到4方向 vs 8方向4方向只允许上下左右移动路径可能更长但更符合某些机器人运动约束8方向允许对角线移动路径更短更自然但需要考虑切角问题机器人应用% 实际机器人路径规划考虑因素 % 1. 机器人尺寸将机器人膨胀到障碍物 % 2. 运动学约束考虑转弯半径 % 3. 动态障碍物结合D*或终身规划A*(LPA*) % 4. 多层规划全局A* 局部DWA避障

相关文章:

机器人路径规划算法之A*算法详解+MATLAB代码实现

目录 一、A*算法核心原理 1. 算法概述 2. 核心公式 3. 启发函数 h(n) 的性质 4. 常用启发函数 二、A*算法步骤详解 1. 算法流程 2. 与Dijkstra的对比 三、MATLAB实现A*算法 一、A*算法核心原理 1. 算法概述 A*算法是一种启发式搜索算法,结合了Dijkstra的最…...

2026年人事系统多少钱一套?

2026年人事系统多少钱一套?4类方案价格拆解选型攻略,帮你省30%预算做HR的小夏最近找我吐槽:“看了5家人事系统,价格从3000元/年到30万元不等,到底差在哪?难道贵的就一定好?”其实,人…...

Docker + Go 生产级实战:从本地开发到容器化部署的完整指南

Docker + Go 生产级实战:从本地开发到容器化部署的完整指南 摘要:本文从零开始,手把手教你如何将一个 Go Web 项目容器化。涵盖 Dockerfile 编写、多阶段构建、Docker Compose 编排、CI/CD 集成、性能优化等生产级实践。包含完整代码示例,可直接套用到你的项目中。 一、为什…...

Go 分布式事务实战:本地消息表、事务消息、SAGA、TCC 四大方案深度解析与选型指南

Go 分布式事务实战:本地消息表、事务消息、SAGA、TCC 四大方案深度解析与选型指南 摘要:在微服务架构中,分布式事务是无法回避的核心难题。本文深入剖析本地消息表、事务消息、SAGA、TCC 四种主流方案的实现原理,提供完整的 Go 语言代码示例,并结合电商、支付等真实场景给…...

基于单片机的瓦斯监测系统设计

收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...

求大佬帮忙解决问题

电脑突然不知道啥原因,安装程序的时候只能选择桌面目录进行安装,但是可以手动输入盘符安装到其他目录...

BNU-25硕信息学奥赛day2

2026.3.13学习笔记 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录2026.3.13学习笔记前言一、变量名和常量1.变量名案例2.规则3.常量名命名规则4.内置数据类型二、赋值与变量自增1.赋值语句2.自增2.1 自增/自减运算…...

DOM Element

DOM Element 引言 在Web开发中,DOM(Document Object Model)是描述HTML和XML文档的标准模型。DOM Element是DOM模型的核心组成部分,它代表了HTML或XML文档中的元素。本文将深入探讨DOM Element的概念、属性、方法以及在实际开发中的应用。 什么是DOM Element? DOM Elem…...

Julia 交互式命令详解

Julia 交互式命令详解 引言 Julia 是一种高性能的编程语言,广泛应用于科学计算、数据分析、机器学习等领域。在 Julia 中,交互式命令行(REPL)是一种非常方便的工具,它允许开发者直接在终端中运行代码并立即看到结果。本文将详细介绍 Julia 的交互式命令,帮助您更好地利…...

ionic 浮动框:实现与优化指南

ionic 浮动框:实现与优化指南 引言 在移动应用开发中,用户界面的设计对于提升用户体验至关重要。Ionic框架,作为一款流行的HTML5移动应用开发框架,提供了丰富的组件和功能,帮助开发者构建高性能、跨平台的应用。其中,浮动框(Floating Action Button,简称FAB)作为一种…...

金舟软件AI对话工具-20260313提问VLAN技术

嗯……用户突然问起了VLAN的定义,看来是想了解网络分段的基础知识。不过从之前的对话来看,ta似乎更关注的是Linux系统运维(CentOS 7命令),刚才又跳到AI年龄判断,跨度有点大啊。用户可能是刚开始学习网络技术…...

Java + OSHI 实战:从零搭建企业级电脑硬件信息检测

作为一名信息处理员,想必都遇到过这类 “重复劳动” 的场景: 经理:“小白,把公司所有电脑的硬件信息统计一下,做个固定资产盘点表。” 如果手动去每台电脑上看「设备管理器」「系统信息」,不仅要反复操作相同步骤,还容易漏记、错记,几百台设备得耗上几天,效率低到离谱…...

Oracle VM VirtualBox 虚拟机安装增强功能及共享粘贴板

在虚拟机设置中设置了剪切板及文件拖拽双向共享但是不起作用, 排查了下原因并记录以作备忘,具体步骤如下:首先,虚拟机关机状态设置共享:选择对应的虚拟机(关机状态)选择“设置” - "常规" - “高…...

科技中介如何优化技术转移服务流程?

观点作者:科易网-AI技术转移与科技创新数智化服务平台一、现状概述:成效与短板 在数智化转型浪潮下,科技成果转化正经历深刻变革。传统科技中介服务模式以线下对接、人工匹配为主,存在信息不对称、响应滞后、转化效率低等问题。尽…...

财务如何使用应收账款管理工具,避免一套数据录入两遍

一、应收账款管理工具的核心价值1. 应收账款管理的定义与重要性应收账款管理是指企业对因销售商品或提供服务而产生的未收回款项进行系统化追踪、记录和催收的过程。它是企业财务管理的重要组成部分,直接影响现金流健康和资金周转效率。数据显示,应收账款…...

工业物联网网关能够应用在哪些场景,发挥什么功能

数字化转型不是某一个行业、某一类设备的专属,而是全行业、全场景的共同趋势。对此,物通博联(WideIOT)推出工业物联网网关,具备多场景适配、多行业验证、全方案支撑等优势,广泛应用于智能制造、智慧能源、环…...

多模型聚合的AI图像生成工作台——椒图AI深度评测与实战:低成本实现无痕改字与8K高清放大

在当前的AIGC浪潮中,图像生成模型层出不穷。对于开发者、UI设计师以及泛内容创作者而言,单一模型往往难以满足全场景的需求。要么长于写实但短于文字生成,要么支持高清放大但推理效率极低。搭建本地环境不仅硬件成本高昂,且不同模…...

汽车制动噪声测试系统

一、BNA 系统概述车辆制动噪声测试(BNA)系统是汉航(北京)科技有限公司基于汉航NTS.LAB平台研发的综合性测试设备,专门应用于车辆道路试验,核心目标是实现对车辆制动噪声的全方位监测、精准分析与数据记录。…...

GB/T 40613-2021 虚拟电厂技术规范深度解读

1. 标准概述1.1 标准基本信息标准号GB/T 40613-2021标准名称虚拟电厂技术规范英文名称Technical specification for virtual power plant发布机构国家市场监督管理总局、国家标准化管理委员会发布日期2021-10-11实施日期2022-05-01标准状态现行有效归口单位全国电力需求侧管理标…...

标题:别卷了,GEO 这玩意儿到底是啥?给大伙儿盘盘道

嘿,各位老铁,今儿咱们不聊那些虚头巴脑的“颠覆行业”,也不整什么“三天速成”的营销套路。作为一个在搜索推荐和AI优化这个圈子里摸爬滚打快二十年的“老油条”,看着现在的年轻人天天把GEO(Generative Engine Optimiz…...

跟江协学32之GPIO介绍

GPIO简介这部分了解一下即可,GPIO是基本,后续会经常使用GPIO基本结构在STM32中,所有的GPIO的都是挂载在APB2总线上,每个GPIO都有16个引脚,编号0~15。内核通过APB2总线对寄存器进行读写,输出寄存器写1&#…...

能碳管理系统组成与原理解析:揭开绿色发展背后的 “神秘面纱”?

全面解读能碳管理系统:从原理到价值的深度剖析从 “感知” 到 “认知”:系统如何捕获能源与碳的踪迹要理解能碳管理系统,先得从它最基础的感知能力入手。这个系统可不是凭空运作的,它首先要解决一个根本问题:怎样精准、…...

从零搭建个人独立博客:Hexo + GitHub Pages 极速建站与踩坑实录

引言作为一名爱折腾的开发者,刚解决完一个极其棘手的 WebGL 3D 网页滚动陷阱 Bug,最爽的事情莫过于把这份血汗经验写成文章分享出来!这篇文章将为你带来一份实战教程,完整记录我是如何使用 Hexo 配合 GitHub Pages 建站&#xff0…...

好用的玉柴柴油发电机组哪个服务好

扬州量子电力设备有限公司:为玉柴发电机组提供专业的技术服务与方案解析玉柴柴油发电机组在长期高负荷运行下的功率稳定性与燃油经济性平衡,是当前行业普遍面临的技术挑战。这不仅关系到设备的使用寿命,更直接影响运营成本与供电可靠性。针对…...

平行链协议深度拆解 | 一个区块如何穿越六道关卡获得最终确认

原文作者:PaperMoon 团队一个平行链区块要想获得 Polkadot 网络的最终安全背书,需要经历候选、附议、可背书、已背书、待可用、已包含六个状态——任何一步失败都会被丢弃。这套机制的名字听起来很学术,但它解决的问题极其现实:几…...

全文 - Quantum error correction below the surface code threshold

低于表面码阈值的量子纠错 谷歌量子人工智能团队及合作者(2024 年 8 月 24 日) 摘要 量子纠错 [1,2,3,4] 通过将多个物理量子比特整合为一个逻辑量子比特,为实现实用化量子计算提供了路径:随着量子比特数量的增加,逻…...

aspnet_counters.dll文件彻底修复方法 附免费的下载解决办法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...

Burp Suite Professional 2026.3 for Windows x64 - 领先的 Web 渗透测试软件

Burp Suite Professional 2026.3 for Windows x64 - 领先的 Web 渗透测试软件 世界排名第一的 Web 渗透测试工具包 请访问原文链接:https://sysin.org/blog/burp-suite-pro-win/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.or…...

IsaacSim 安装与使用记录(8)

IsaacSim 安装与使用记录(8) 基于ROS2 Python自定义OmniGraph Node 打开Isaac Sim VS Code Edition(VS Code extension) 配置生成的OmniGraph Node 编辑extension.toml 编辑OmniGraph定义文件 CategoryDefinition.json 编辑OmniGraph Python源码 自定义控制器 使用自定义的…...

Ubuntu18.04 for Xilinx19.2 环境安装

Ubuntu18.04 for Xilinx19.2 ✉️ 安装目标: Ubuntu 18.04 虚拟机Vivado 19.2MATLAB 2018bSynopsys (VCS-MX Verdi)VCS Test Code 材料准备: Ubuntu 18.04 镜像Vivado 19.2 安装包MATLAB 2018b 安装包Synopsys 2018.09 安装包VMware16 Pro物理机一台 …...