有问题可以加我微信讨论
微信:origindoris
本项目是一个专业的无人机航线规划算法库,主要用于无人机摄影测量任务的路径规划。项目包含两个核心算法模块:
- RoutePathPlanner: 基础路径规划算法,用于在多边形区域内规划单方向航线
- ObliquePhotography5RouteAlgorithm: 倾斜摄影5航线算法,用于多方向倾斜摄影任务的智能航线规划
- 多边形区域航线规划: 在任意多边形区域内生成平行航线
- 智能起始点处理: 自动处理起始点不在多边形内的情况
- 多重覆盖优化: 支持多次分块规划,提高区域覆盖率
- 性能优化: 内置缓存机制和并行处理,提升计算效率
- 摄影测量计算: 支持GSD、飞行高度、照片覆盖范围等专业计算
- 平行航线生成: 根据航线方向和间距生成平行航线
- 航线优化: 使用TSP算法优化航线顺序,最小化飞行距离
- 覆盖率分析: 智能检测未覆盖区域并生成补充航点
- 几何计算: 点在多边形判断、线段相交检测等几何算法
- 智能航线数量优化: 根据云台俯仰角自动判断所需航线数量
- 多方向覆盖: 支持1-5个方向的航线规划
- 边缘扩展: 自动扩展作业区域确保边缘完全覆盖
- 覆盖率评估: 提供边缘覆盖率估算和优化建议
- 云台角度 < 15°: 单方向垂直摄影
- 云台角度 15°-30°: 3方向十字交叉摄影
- 云台角度 30°-45°: 4方向正交摄影
- 云台角度 > 45°: 完整5方向摄影
import com.tythin.route.path.RoutePathPlanner;
import com.tythin.route.path.LatLngPoint;
// 定义作业区域多边形
List<LatLngPoint> polygonPoints = Arrays.asList(
new LatLngPoint(39.9042, 116.4074),
new LatLngPoint(39.9052, 116.4084),
new LatLngPoint(39.9032, 116.4094),
new LatLngPoint(39.9022, 116.4064)
);
// 设置规划参数
LatLngPoint startPoint = new LatLngPoint(39.9042, 116.4074);
double direction = 0; // 航线方向(度)
double sideOverlapRate = 80; // 旁路覆盖率(%)
double forwardOverlapRate = 70; // 路线覆盖率(%)
double photoWidth = 100; // 照片宽度(米)
double photoLength = 80; // 照片长度(米)
double flightHeight = 120; // 飞行高度(米)
// 执行路径规划
RoutePathPlanner.RouteResult result = RoutePathPlanner.planRoute(
polygonPoints, direction, startPoint,
sideOverlapRate, forwardOverlapRate,
photoWidth, photoLength, flightHeight
);
// 获取结果
List<LatLngPoint> waypoints = result.waypoints; // 航点列表
double totalDistance = result.totalDistance; // 总距离
int totalLines = result.totalLines; // 航线数量// 使用多次分块规划提高覆盖率
RoutePathPlanner.RouteResult result = RoutePathPlanner.planRouteWithMultipleBlocks(
polygonPoints, direction, startPoint,
sideOverlapRate, forwardOverlapRate,
photoWidth, photoLength, flightHeight,
10 // 最大分块数量
);import com.tythin.route.path.ObliquePhotography5RouteAlgorithm;
import com.tythin.route.path.ObliquePhotography5RouteAlgorithm.ObliqueParams;
// 设置倾斜摄影参数
ObliqueParams params = new ObliqueParams();
params.mainDirection = 0; // 主航线方向(度)
params.sideOverlapRate = 80; // 旁路覆盖率(%)
params.forwardOverlapRate = 70; // 路线覆盖率(%)
params.photoWidth = 100; // 照片宽度(米)
params.photoLength = 80; // 照片长度(米)
params.gimbalPitch = -30; // 云台俯仰角(度,负值向下)
params.flightHeight = 120; // 飞行高度(米)
params.polygonPoints = polygonPoints; // 作业区域
params.startPoint = startPoint; // 起始点
// 执行倾斜摄影航线规划
ObliquePhotography5RouteAlgorithm.ObliqueRouteResult result =
ObliquePhotography5RouteAlgorithm.planObliqueRoutes(params);
// 获取结果
List<RouteDirection> routes = result.routes; // 各方向航线
double totalDistance = result.totalDistance; // 总距离
int routeCount = result.totalRouteCount; // 实际航线数量
boolean isOptimized = result.isOptimized; // 是否优化
String reason = result.optimizationReason; // 优化原因
double edgeCoverageRate = result.edgeCoverageRate; // 边缘覆盖率// 计算地面采样距离(GSD)
double gsd = RoutePathPlanner.calculateGSD(
23.5, // 传感器宽度(毫米)
120, // 飞行高度(米)
24, // 焦距(毫米)
4000 // 图像宽度(像素)
);
// 计算飞行高度
double height = RoutePathPlanner.calculateFlightHeight(
0.03, // GSD(米)
24, // 焦距(毫米)
4000, // 图像宽度(像素)
23.5 // 传感器宽度(毫米)
);
// 计算照片覆盖范围
double photoWidth = RoutePathPlanner.calculatePhotoWidth(
23.5, // 传感器宽度(毫米)
120, // 飞行高度(米)
24 // 焦距(毫米)
);-
参数验证与预处理
- 验证多边形有效性(至少3个顶点)
- 计算航线间距和航点间距
- 处理起始点位置
-
航线生成
- 根据航线方向生成平行线
- 计算航线与多边形的交点
- 生成航线内的航点序列
-
路径优化
- 使用贪心算法优化航线顺序
- 最小化航线间的连接距离
- 验证航点间距合理性
-
覆盖率优化
- 网格采样检测未覆盖区域
- 生成补充航点
- 多次迭代提高覆盖率
- 射线法: 判断点是否在多边形内
- 线段相交: 计算航线与多边形边界的交点
- TSP优化: 最小化航线间的飞行距离
- 自适应网格: 根据区域面积动态调整采样密度
倾斜摄影算法根据云台俯仰角度智能判断所需的航线数量:
- 垂直摄影模式 (角度 < 15°): 云台角度不足以产生有效的倾斜效果,采用单方向垂直摄影
- 十字交叉模式 (15° ≤ 角度 < 30°): 采用3个方向(0°、90°、180°)的十字交叉摄影
- 正交模式 (30° ≤ 角度 < 45°): 采用4个方向(0°、90°、180°、270°)的正交摄影
- 完整5方向模式 (角度 ≥ 45°): 采用标准的5方向摄影(0°、72°、144°、216°、288°)
- 计算扩展距离: 根据云台角度和飞行高度计算需要扩展的距离
- 多边形扩展: 使用法向量方法向外扩展多边形边界
- 覆盖验证: 确保扩展后的航线能完全覆盖原始区域
- 多级缓存: 距离计算、几何判断、边界计算等结果缓存
- 并行处理: 使用Java 8 Stream并行处理大量计算
- 智能采样: 根据区域面积自适应调整网格采样密度
- 内存管理: 自动清理缓存防止内存溢出
// 获取平均规划时间
double avgTime = RoutePathPlanner.getAveragePlanningTime();
// 重置性能统计
RoutePathPlanner.resetPerformanceStats();- 高精度计算: 使用球面几何算法,考虑地球曲率影响
- 智能优化: 多种优化策略,平衡计算效率和结果质量
- 容错处理: 完善的异常处理和边界情况处理
- 可扩展性: 模块化设计,易于扩展新的算法
- 专业性: 针对无人机摄影测量领域的专业算法
- Java 8+
- Lombok(用于数据类注解)
- 坐标系统: 使用WGS84地理坐标系(经纬度)
- 角度单位: 所有角度参数使用度(°)为单位
- 距离单位: 所有距离参数使用米(m)为单位
- 云台角度: 俯仰角使用负值表示向下
- 多边形方向: 算法会自动处理多边形的顺时针/逆时针方向
- 无人机航空摄影测量
- 倾斜摄影三维建模
- 农业植保作业规划
- 地形测绘任务规划
- 基础设施巡检路径规划
// 建议使用该方法进行规划
// 5航线算法是调用该方法的,会过滤掉冗余航点
com.origindoris.drone.RoutePathPlanner.planRouteWithMultipleBlocks
// 如果使用 该方法需要手动打开
// 新增:航点优化 - 合并同一直线上的冗余航点
// List<LatLngPoint> finalOptimizedRoute = optimizeWaypoints(validatedRoute);
com.origindoris.drone.RoutePathPlanner.planRoute// 建议使用该方法进行规划
// 5航线算法是调用该方法的,会过滤掉冗余航点
com.origindoris.drone.RoutePathPlanner.planRouteWithMultipleBlocks
// 如果使用 该方法需要手动打开
// 新增:航点优化 - 合并同一直线上的冗余航点
// List<LatLngPoint> finalOptimizedRoute = optimizeWaypoints(validatedRoute);
com.origindoris.drone.RoutePathPlanner.planRoute本算法库为无人机自动化作业提供了专业、高效、可靠的路径规划解决方案。