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
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