【EF Core】级联删除行为
二.引言无人机在复杂城市环境中的自主导航离不开高效、平滑的三维路径规划。传统的RRT算法虽然应用广泛但依赖随机采样导致路径结果不确定、平滑性差A*算法虽能保证最优性但计算量随环境分辨率快速增长。2026年Cheriet等人在《IEEE Open Journal of Vehicular Technology》上发表了TIG*算法Tangent Intersection Guidance Star提出了一种基于几何推理的路径规划新方法。该算法通过计算无人机与障碍物之间的切线交点直接生成航点以几何计算替代随机采样在路径平滑度和计算效率上都有显著提升。本文复现该算法在MATLAB R2022b环境下完成仿真实验并分享完整的配置、运行和结果分析过程。三.算法原理回到顶部3.1核心思想TIG*算法的核心思想是用几何计算替代随机采样。当无人机前方遇到障碍物时算法不依赖随机试探而是精确计算绕行所需的切点将这些切点作为候选航点再通过A式搜索选择最优路径。TIG*分为两种规划模式S-TIG*静态规划和O-TIG*在线规划模式全程运用环境S-TIG*静态切线交点制导环境完全已知的情况O-TIG*在线切线交点制导环境并非完全已知需要在线计算S-TIG*利用全局地图信息一次性规划出完整路径O-TIG*依靠机载传感器局部感知遇到未知障碍时动态重规划。回到顶部3.2障碍物建模与原始TIG算法使用椭圆不同TIG*采用凸多边形棱柱表示障碍物。算法首先对不规则障碍物应用凸包算法Convex Hull将其转换为凸多边形再向上拉伸形成3D棱柱。每个障碍物定义为论文指出Section IV“Polygonal representations provide a more accurate and flexible way to capture the complex geometries of real-world obstacles.”说明多边形表示法能更准确、更灵活地描述真实世界障碍物的复杂几何形状。回到顶部3.3虚拟椭圆与安全距离为了确保无人机飞行安全TIG*算法在真实障碍物周围构建“虚拟椭圆”引入安全距离余量其中d表示安全距离即UAV与障碍物之间保持的最小间距。这种设计的核心思想是让无人机沿着虚拟椭圆的边界飞行而非真实的障碍物边界从而保证足够的安全余量。回到顶部3.4航点生成策略TIG*算法的核心在于航点的几何生成方法。当从当前节点N到目标点T的直线被障碍物阻挡时算法会通过切线交点来生成绕行航点其基本原理如下1.从当前节点N向首个碰撞的障碍物绘制两条切线2.从目标点T向同一障碍物绘制两条切线3.不同切线的交点构成候选航点。针对可能出现的几种不可行情况例如切线平行、无交点等算法采用虚拟椭圆技术即航点被定义为虚拟椭圆与切线的交点并选择距离当前节点较远的交点作为实际航点。设从当前节点N出发的切线交虚线椭圆与两点、其中比更接近N所以选择较远点作为航点即这种“故意绕远路”的策略可以避免无人机在飞行过程中出现急转弯让飞行轨迹在绕过障碍物后更加平缓流畅做到“平滑”。回到顶部3.5启发式函数为了在多个候选航点中选择最优者TIG*算法定义了如下启发式函数其中1.D(N,W)从当前节点N到候选航点W的路径长度2.P从N到W的切线段上穿过的障碍物数量3.α障碍物数量的权重系数用于衡量路径长度与安全性4.D(W,T)从W到目标点T的欧式距离估计。启发式函数H(W)的设计体现了三个优化目标1.最短路径通过D(N,W)D(W,T)实现2.最少障碍交互通过实现减少绕行次数3.高计算效率启发式引导搜索向目标方向迅速收敛。回到顶部3.6路径平滑处理TIG*算法生成的原始路径由直线段连接各航点构成在航点处存在转角。这些转角无法被无人机直接执行因此需要平滑处理。TIG*算法采用二次贝塞尔曲线对每三个连续节点进行平滑处理其中、、为三个连续的控制点航点。经过平滑处理后还需验证一下性能指标路径长度目标函数转弯角度目标函数回到顶部3.7算法流程四.仿真实现回到顶部4.1开发环境与工具本研究的仿真实验采用以下开发环境项目配置操作系统Windows11编程环境MATLAB R2022b核心依赖TIG-3D-UAV-Planning开源框架可视化工具MATLAB plot3三位绘图在MATLAB R2022b环境中TIG-3D-UAV-Planning框架的代码结构如下- main/主入口文件run_static.m用于静态规划run_unknown.m用于在线规划- algorithms/S-TIG*和O-TIG*核心算法- geometry/碰撞检测、切线生成等几何计算- waypoint_generation/虚拟椭圆与航点生成- visualization/3D可视化绘图- evaluation/性能指标计算- maps/预定义测试地图本报告使用run_static.m和map_city.mat进行仿真实验。回到顶部4.2核心代码实现4.2.1虚拟椭圆计算虚拟椭圆与安全距离matlabfunction inflated_obstacles inflate_obstacles(obstacles, safety_distance) % ------------------------------------------------------------ % Inflates polygonal prism obstacles by safety_distance % in XY plane and Z direction. % ------------------------------------------------------------ inflated_obstacles obstacles; for i 1:length(obstacles) prism obstacles{i}; vertices prism.vertices; % --- Inflate polygon in XY --- inflated_vertices inflate_polygon(vertices, safety_distance); % --- Inflate in Z --- z_min prism.z_range(1) - safety_distance; z_max prism.z_range(2) safety_distance; prism.vertices inflated_vertices; prism.z_range [z_min z_max]; prism.height z_max; inflated_obstacles{i} prism; end end function inflated_vertices inflate_polygon(vertices, d) % ------------------------------------------------------------ % Inflates convex polygon outward by distance d % ------------------------------------------------------------ centroid mean(vertices,1); inflated_vertices zeros(size(vertices)); for i 1:size(vertices,1) direction vertices(i,:) - centroid; direction direction / norm(direction eps); inflated_vertices(i,:) vertices(i,:) d * direction; end end4.2.2计算转弯角度matlabfunction angle calculate_angle(A, B, C) % Calculate vectors AB and BC in 3D AB A - B; BC C - B; % Check if any two points are the same if all(round(A,6) round(B,6)) || all(round(B,6) round(C,6)) angle 180; else % Calculate dot product and magnitudes of the vectors dotProduct dot(AB, BC); magAB norm(AB); magBC norm(BC); % Calculate the cosine of the angle between AB and BC cosTheta dotProduct / (magAB * magBC); % Ensure the cosine value is within the valid range for acos cosTheta max(min(cosTheta, 1), -1); % Calculate the angle in radians and convert to degrees angle acosd(cosTheta); end end4.2.3获取感知内障碍物matlabfunction in_range_indices obstacles_in_range(uav_pos, polygons, r) % polygons: array of structs with fields vertices (Nx2) and height % uav_pos: 1x3 [x, y, z] % r: sensing radius (scalar) in_range_indices {}; for i 1:length(polygons) if is_obstacle_in_range(polygons{i}, uav_pos, r) in_range_indices [in_range_indices polygons{i}] ; %#okAGROW end end end function in_range is_obstacle_in_range(polygon, uav_pos, r) % UAV position and sensing radius x_uav uav_pos(1); y_uav uav_pos(2); z_uav uav_pos(3); % Polygon base and height base_xy polygon.vertices; % Nx2 z_min 0; z_max polygon.height; % 1. Project UAV to polygon base plane (2D) dist_xy point2poly_distance([x_uav, y_uav], base_xy); % 2. Compute vertical (z) distance to polygon if z_uav z_min dz z_min - z_uav; elseif z_uav z_max dz z_uav - z_max; else dz 0; end % 3. Euclidean distance to polygon prism d sqrt(dist_xy^2 dz^2); % 4. Check if within sensing range in_range d r; end function d point2poly_distance(p, poly) % Compute shortest distance from point to 2D polygon if inpolygon(p(1), p(2), poly(:,1), poly(:,2)) d 0; else % Distance to polygon edges d inf; n size(poly,1); for i 1:n v1 poly(i,:); v2 poly(mod(i,n)1,:); d min(d, point2segment_dist(p, v1, v2)); end end end function d point2segment_dist(p, a, b) % Distance from point p to segment ab ap p - a; ab b - a; t dot(ap, ab) / dot(ab, ab); t max(0, min(1, t)); proj a t * ab; d norm(p - proj); end4.2.4计算感知内航点matlabfunction waypoint calculate_inrange_waypoint(waypoint,current_point,range) [x,y,z] lineCircleIntersection(current_point.coor, waypoint.coor,range); %disp([x and y,num2str([x,y])]) %disp([current_point.coor,waypoint.coor,[range.x range.y]]) if(length(x)2) d1 norm([x(1) y(1) z(1)]-waypoint.coor); d2 norm([x(2) y(2) z(2)]-waypoint.coor); if(d1d2) waypoint.coor [x(1),y(1),z(1)] ; else waypoint.coor [x(2),y(2),z(2)] ; end else waypoint.coor [x,y,z] ; end waypoint.tang [-1 -1 -1]; waypoint.istop current_point.istop; waypoint.currobs current_point.currobs; end function [x_intersect, y_intersect z_intersect] lineCircleIntersection(A, B,range) % Calculate direction vector of the line segment h range.x; k range.y; v range.z; r range.radius; x1 A(1); x2 B(1); y1 A(2); y2 B(2); z1 A(3); z2 B(3); dx x2 - x1; dy y2 - y1; dz z2 - z1; % Calculate parameters for quadratic equation A dx^2 dy^2 dz^2; B 2 * (dx * (x1 - h) dy * (y1 - k) dz * (z1 - v)); C (x1 - h)^2 (y1 - k)^2 (z1 - v)^2 - r^2; % Calculate discriminant discriminant B^2 - 4 * A * C; if discriminant 0 % No intersection x_intersect []; y_intersect []; z_intersect []; elseif discriminant 0 % One intersection t -B / (2 * A); x_intersect x1 t * dx; y_intersect y1 t * dy; z_intersect z1 t * dz; if ~isBetween(x_intersect, x1, x2) || ~isBetween(y_intersect, y1, y2) || ~isBetween(z_intersect, z1, z2) % Intersection point lies outside the line segment x_intersect []; y_intersect []; z_intersect []; end else % Two intersections t1 (-B sqrt(discriminant)) / (2 * A); t2 (-B - sqrt(discriminant)) / (2 * A); x_intersect [x1 t1 * dx, x1 t2 * dx]; y_intersect [y1 t1 * dy, y1 t2 * dy]; z_intersect [z1 t1 * dz, z1 t2 * dz]; % Filter out points outside the line segment outside_idx ~isBetween(x_intersect, x1, x2) | ~isBetween(y_intersect, y1, y2)| ~isBetween(z_intersect, z1, z2); x_intersect(outside_idx) []; y_intersect(outside_idx) []; z_intersect(outside_idx) []; end end function inside isBetween(value, lowerBound, upperBound) inside value min(lowerBound, upperBound) value max(lowerBound, upperBound); end回到顶部4.3多环境仿真4.3.1S-TIG*静态规划仿真TIG*算法作者在提供的资料中包含了一个完整S-TIG*静态规划仿真仿真代码。matlab% ------------------------------------------------------------ % TIG*3D Planner % % Author: H. Cheriet % Affiliation: USTO-MB % Year: 2026 % ------------------------------------------------------------ clc; clear; close all; % ------------------------------------------------------------ % Setup Paths % ------------------------------------------------------------ currentFolder fileparts(mfilename(fullpath)); projectRoot fileparts(currentFolder); addpath(genpath(projectRoot)); % ------------------------------------------------------------ % Load Environment % ------------------------------------------------------------ load(fullfile(projectRoot, maps, short1.mat)); safety_distance 2; % meters % ------------------------------------------------------------ % Run Planner % ------------------------------------------------------------ [path, elapsedTime] stig3d_planner(start, goal, mapSize, polygons, safety_distance); fprintf(Computation Time: %.4f s\n, elapsedTime); % ------------------------------------------------------------ % Metrics % ------------------------------------------------------------ ds 1.0; metrics compute_path_metrics(path, ds); disp(--- Static TIG* ---) disp(metrics) % ------------------------------------------------------------ % Visualization % ------------------------------------------------------------ env.start start; env.goal goal; env.polygons polygons; env.mapSize mapSize; results.path path; results.path_smoothed []; results.algorithm_name S-TIG*; options.show_index false; options.highlight_obstacle -1; display_environment_3d(env, results, options); % ------------------------------------------------------------ % Animate UAV Motion % ------------------------------------------------------------ anim_options.speed 1; % smaller faster anim_options.trail false; % leave red trail %animate_path(path, anim_options);在MATLAB R2022b中的运行结果如下图其路径呈现平滑、避障合理的特点4.3.2O-TIG*静态规划仿真TIG*算法作者在提供的资料中包含了一个完整O-TIG*在线规划仿真仿真代码。matlab% ------------------------------------------------------------ % TIG*3D Planner % % Author: H. Cheriet % Affiliation: USTO-MB % Year: 2026 % ------------------------------------------------------------ clc; clear; close all; % ------------------------------------------------------------ % Setup Paths % ------------------------------------------------------------ currentFolder fileparts(mfilename(fullpath)); projectRoot fileparts(currentFolder); addpath(genpath(projectRoot)); % ------------------------------------------------------------ % Load Environment % ------------------------------------------------------------ load(fullfile(projectRoot, maps, short3.mat)); safety_distance 2; % meters UAV_range.x start(1); UAV_range.y start(2); UAV_range.z start(3); UAV_range.radius 100; % meters % ------------------------------------------------------------ % Run Planner % ------------------------------------------------------------ [path, elapsedTime] otig3d_unknown_planner(start, goal, mapSize, polygons,safety_distance, UAV_range); fprintf(Computation Time: %.4f s\n, elapsedTime); % ------------------------------------------------------------ % Metrics % ------------------------------------------------------------ ds 1.0; metrics compute_path_metrics(path, ds); disp(--- Unknown D-TIG* ---) disp(metrics) % ------------------------------------------------------------ % Visualization % ------------------------------------------------------------ env.start start; env.goal goal; env.polygons polygons; env.mapSize mapSize; results.path path; results.path_smoothed []; results.algorithm_name D-TIG*; options.show_index false; options.highlight_obstacle -1; display_environment_3d(env, results, options); % ------------------------------------------------------------ % Animate UAV Motion % ------------------------------------------------------------ anim_options.speed 1; % smaller faster anim_options.trail false; % leave red trail %animate_path(path, anim_options);在运行该代码的朋友一定要注意一下第三十三行代码中原作者有一个书写错误想要运行成功需要将这一行的“dtig3d_unknown_planner”改为“otig3d_unknown_planner”对应algorithms文件夹里的static文件夹的otig3d_unknown_planner.m文件。

相关新闻

给Agent写快照测试,改一版prompt一眼看出回归

给Agent写快照测试,改一版prompt一眼看出回归

调 prompt 最怕的不是改了没效果,是改这处、悄悄崩了那处。你为了修 A 问题动了一句话,结果 B、C 两类问题的回答跟着变差了,自己还没察觉就上线了。我治这个的办法很土但很顶用:给 Agent 套一层快照测试——把一批固定输入的输出…

2026/6/30 3:08:13阅读更多 →
六轴机器人-电山派SCH1

六轴机器人-电山派SCH1

################################################## 此处来自立创开源机器人:https://oshwhub.com/gshaoburuchuan/project_oajuxfqg 本文只做深度解析,不作任何商业用途,详情请看以上链接, ##################################…

2026/6/30 3:08:13阅读更多 →
零基础学习C++逆向日记 Day.4

零基础学习C++逆向日记 Day.4

学到汇编指令了,感觉有点卡脖子,重新梳理一下基础,这两天好好复习一下,暂时不更新了,没有放弃,一定会成功的。

2026/6/30 3:08:13阅读更多 →
HVV应急响应靶机Web1实战:从入侵检测到系统恢复全流程解析

HVV应急响应靶机Web1实战:从入侵检测到系统恢复全流程解析

1. 项目概述:从靶机到实战的桥梁“Hvv-知攻善防应急响应靶机--Web1”这个标题,对于任何一个在网络安全领域摸爬滚打过的从业者来说,都像是一份熟悉的“老朋友”发来的挑战书。它不是一个简单的虚拟机镜像,而是一个精心设计的、高度…

2026/6/30 4:03:16阅读更多 →
大模型招聘疯了吧?128万年薪背后,到底谁在抢人

大模型招聘疯了吧?128万年薪背后,到底谁在抢人

128万!!这是字节跳动给「大模型应用架构专家」开出的年薪。与此同时,松延动力、银河通用的机器人算法岗年薪也双双破百万。脉脉的数据更直接——2026年春招,AI相关岗位同比增长14倍。 你可能觉得这些数字跟你没关系,毕…

2026/6/30 4:03:16阅读更多 →
2026年零基础学量化开发,先把大任务拆小

2026年零基础学量化开发,先把大任务拆小

没有编程和交易经验的人进入量化学习时,最容易把所有问题看成同一个大问题:既要懂市场,又要会写代码,还要知道系统怎么运行。更合适的起点,是先承认自己需要一个学习顺序,而不是急着证明自己能不能做出完整…

2026/6/30 4:03:16阅读更多 →
如何在Kodi实现云端观影:小白也能轻松上手的115网盘插件终极指南

如何在Kodi实现云端观影:小白也能轻松上手的115网盘插件终极指南

如何在Kodi实现云端观影:小白也能轻松上手的115网盘插件终极指南 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 还在为本地硬盘空间告急而烦恼吗?想要在Kodi媒体中…

2026/6/30 4:03:16阅读更多 →
安达发|疯了!aps软件让电器生产效率提升到“变态”级别

安达发|疯了!aps软件让电器生产效率提升到“变态”级别

安达发APS高级生产计划智能排产排程自动排单软件系统推荐_MES 在电器行业竞争日益激烈的今天,如何提高生产效率、降低成本、优化供应链,成为了每个电器企业亟待解决的问题。而aps软件,正逐渐成为电器行业实现这些目标的秘密武器。 什么是ap…

2026/6/30 4:03:16阅读更多 →
GitHub 今日 +2299 Star,这个工具让 AI 读代码不再像翻字典

GitHub 今日 +2299 Star,这个工具让 AI 读代码不再像翻字典

两周前,一个叫 Understand-Anything 的项目在 GitHub 单日涨了 2,299 个 Star,总 Star 数达到 22,600,登上 TypeScript Trending 榜首。它的核心主张只有一句话:图谱会教你代码,而不只是展示代码。 这篇文章想搞清楚的…

2026/6/30 3:58:15阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/30 4:03:30阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/6/29 2:19:08阅读更多 →
为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南 【免费下载链接】Destiny-2-Solo-Enabler Repo containing the C# and XAML code for the D2SE program. Included is also the dependency for the program, and image asset. 项目地址: https://gitcode…

2026/6/30 0:02:58阅读更多 →
第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

1. PowerPoint 2010基础操作全攻略 刚接触PowerPoint 2010时,很多人会被它复杂的界面吓到。其实只要掌握几个核心区域,就能快速上手。我最开始用PPT时,经常找不到功能按钮在哪,后来发现主要操作都集中在顶部功能区。 工作窗口主要…

2026/6/30 0:02:58阅读更多 →
XGBoost超参数实战:从理论到调优策略

XGBoost超参数实战:从理论到调优策略

1. XGBoost超参数基础认知 第一次接触XGBoost时,我被它那密密麻麻的参数列表吓到了。这感觉就像面对一架波音747的驾驶舱——每个按钮都可能有神奇的效果,但按错了就可能坠机。经过多年实战,我发现其实掌握十几个核心参数就能解决90%的问题。…

2026/6/30 0:02:59阅读更多 →