19 KiB
碰撞避免系统数据处理模块设计文档
1. 模块概述
数据处理模块(DataProcessing)是碰撞避免系统的核心组件之一,负责对从数据采集模块获取的原始数据进行处理、转换和分析。该模块包含坐标转换、速度计算、数据预处理等功能,为后续的碰撞检测和避险决策提供高质量的数据支持。
1.1 功能职责
- 将全球地理坐标(WGS84)转换为机场局部坐标系
- 对移动物体的速度和加速度进行计算和分析
- 执行数据质量检测,识别和标记异常数据
- 进行数据平滑和滤波处理
- 维护各类移动物体的实时状态
- 执行碰撞风险评估和预警(计划实现)
1.2 模块结构
数据处理模块采用分层架构设计,主要包含以下组件:
dataProcessing/
├── config/ # 配置类,如坐标系统配置等
├── model/ # 数据模型,定义数据结构(如碰撞风险等级等)
├── service/ # 服务层,实现核心业务逻辑
│ ├── DataProcessor.java # 数据处理主服务
│ ├── CoordinateSystemService.java # 坐标转换服务
│ ├── SpeedCalculationService.java # 速度计算服务
│ ├── AirportCoordinateSystem.java # 机场坐标系统
│ └── CollisionDetectionService.java # 碰撞检测服务(待实现)
└── util/ # 工具类,提供辅助功能
2. 核心组件设计
2.1 DataProcessor(数据处理器)
DataProcessor是数据处理模块的核心组件,负责协调各种处理任务,管理数据流转,并确保数据的一致性和质量。
2.1.1 主要职责
- 接收来自数据采集模块的数据更新
- 调度不同类型数据的处理流程
- 维护处理过程中的数据一致性
- 将处理后的数据提供给其他模块使用
2.1.2 processLoop方法设计
processLoop方法是DataProcessor的核心循环,持续处理数据流。其主要业务逻辑如下:
private void processLoop() {
while (!Thread.currentThread().isInterrupted()) {
// 获取数据更新
Map<MovingObjectType, Set<String>> delta = movingObjectRepository.takeUpdate();
// 判断更新是否为空
if (delta == null || delta.isEmpty()) {
// 无数据更新,等待一段时间
Thread.sleep(500);
continue;
}
// 处理各类型的数据更新
delta.forEach((objectType, ids) -> {
// 获取该类型的数据快照
Map<String, MovingObject> snapshot = movingObjectRepository.getTypeMapDirect(objectType);
List<MovingObject> dataList = new CopyOnWriteArrayList<>(snapshot.values());
// 根据不同类型分别处理
switch (objectType) {
case AIRCRAFT -> processAircraftData(dataList);
case SPECIAL_VEHICLE -> processVehicleData(dataList);
case UNMANNED_VEHICLE -> processLocationData(dataList);
default -> log.warn("未支持的数据类型: {}", objectType);
}
});
}
}
processLoop方法的工作流程:
- 循环监听更新:持续检查是否有新的数据更新
- 获取变更数据:从数据仓库中获取已更新的对象ID集合
- 获取数据快照:基于更新的ID,获取完整的数据对象
- 类型分发处理:根据不同移动物体类型,调用相应的处理方法
- 异常处理:捕获并记录处理过程中的异常,确保主循环不会因异常而中断
2.1.3 数据类型处理方法
对于不同类型的移动物体,DataProcessor提供了专门的处理方法:
- processAircraftData:处理航空器数据
- processVehicleData:处理特种车辆数据
- processLocationData:处理无人车数据
这些方法执行类似的处理流程,主要包括:
- 坐标转换:调用
convertToLocalCoordinate将地理坐标转换为局部坐标 - 速度预处理:调用
speedCalculationService.preprocessData进行速度相关计算和质量检查
2.2 CoordinateSystemService(坐标系统服务)
负责执行坐标转换,将GPS或WGS84坐标系下的经纬度转换为以机场为中心的局部坐标系。
2.2.1 主要功能
- 根据机场中心点创建局部坐标系
- 执行地理坐标到局部坐标的转换
- 计算局部坐标系下的距离和方向
2.2.2 核心方法
public double[] convertToLocalCoordinate(double longitude, double latitude) throws Exception {
return airportCoordinateSystem.convertToLocal(longitude, latitude);
}
此方法将WGS84坐标系的经纬度转换为以机场中心为原点的UTM局部坐标系下的坐标,返回一个包含x(东向)和y(北向)坐标的数组。
2.3 SpeedCalculationService(速度计算服务)
负责计算和处理移动物体的速度、加速度等动力学参数,同时进行数据质量检查。
2.3.1 主要功能
- 计算移动物体的速度分量
- 执行异常值检测
- 应用数据质量标记
- 提供数据平滑和滤波
- 根据历史数据计算加速度
2.3.2 核心方法
public void preprocessData(List<MovingObject> dataList) {
// 遍历数据列表
for (MovingObject obj : dataList) {
// 初始化历史状态队列
if (obj.getStateHistory().isEmpty()) {
// 创建初始状态
// ...
continue;
}
// 获取最近的历史状态
MovementState lastState = obj.getStateHistory().getFirst();
// 异常值检测(位置跳变、时间异常、速度异常)
// ...
// 标记数据质量
// ...
}
}
preprocessData方法对数据进行预处理,主要包括:
- 历史状态初始化
- 异常值检测:检查位置跳变、时间异常和速度异常
- 数据质量标记:将异常数据标记为SUSPICIOUS
- 将处理后的状态添加到历史状态队列
3. 碰撞检测功能设计
3.1 功能需求
碰撞检测功能是碰撞避免系统的核心,需要实现以下功能:
- 实时检测不同移动物体之间的潜在碰撞风险
- 根据物体的当前位置、速度和轨迹预测未来可能的碰撞
- 计算碰撞风险等级,并发出预警
- 为避险决策提供准确的碰撞位置和时间预测
3.2 CollisionDetectionService设计
3.2.1 类结构
@Service
public class CollisionDetectionService {
// 碰撞风险阈值(米)
private static final double SEVERE_RISK_THRESHOLD = 50.0; // 严重风险
private static final double HIGH_RISK_THRESHOLD = 100.0; // 高风险
private static final double MEDIUM_RISK_THRESHOLD = 200.0; // 中等风险
private static final double LOW_RISK_THRESHOLD = 500.0; // 低风险
// 时间预测范围(秒)
private static final int PREDICTION_HORIZON = 30;
// 依赖注入
private final MovingObjectRepository repository;
private final WebSocketService webSocketService;
// 碰撞检测方法
public void detectCollisions() {
// 实现碰撞检测逻辑
}
// 两物体间碰撞风险计算
private CollisionRisk calculateCollisionRisk(MovingObject obj1, MovingObject obj2) {
// 计算当前距离
// 预测轨迹
// 计算最近接近点
// 评估风险等级
// 返回碰撞风险对象
}
// 轨迹预测方法
private List<PredictedPosition> predictTrajectory(MovingObject obj, int seconds) {
// 基于当前位置、速度和加速度预测未来轨迹
}
}
3.2.2 数据模型设计
// 碰撞风险模型
public class CollisionRisk {
private String id; // 风险ID
private String object1Id; // 第一个物体ID
private String object2Id; // 第二个物体ID
private MovingObjectType type1; // 第一个物体类型
private MovingObjectType type2; // 第二个物体类型
private double currentDistance; // 当前距离
private double minimumDistance; // 预测最小距离
private long timeToMinimumDistance; // 达到最小距离的时间(毫秒)
private RiskLevel riskLevel; // 风险等级
private PredictedPosition collisionPoint; // 潜在碰撞点
private long createdTime; // 创建时间
// getters and setters...
}
// 风险等级枚举
public enum RiskLevel {
SEVERE, // 严重风险(紧急)
HIGH, // 高风险
MEDIUM, // 中等风险
LOW, // 低风险
NONE // 无风险
}
// 预测位置
public class PredictedPosition {
private double x; // 局部坐标系x坐标
private double y; // 局部坐标系y坐标
private double z; // 局部坐标系z坐标(高度)
private long timestamp; // 预测时间戳
// getters and setters...
}
3.3 碰撞检测算法
3.3.1 基本碰撞检测算法
public void detectCollisions() {
// 获取所有活跃的移动物体
List<MovingObject> allObjects = getAllActiveObjects();
// 生成物体对组合
List<Pair<MovingObject, MovingObject>> objectPairs = generateObjectPairs(allObjects);
// 并行处理所有物体对
List<CollisionRisk> risks = objectPairs.parallelStream()
.map(pair -> calculateCollisionRisk(pair.getLeft(), pair.getRight()))
.filter(risk -> risk.getRiskLevel() != RiskLevel.NONE)
.collect(Collectors.toList());
// 处理检测到的风险
processDetectedRisks(risks);
}
private CollisionRisk calculateCollisionRisk(MovingObject obj1, MovingObject obj2) {
// 计算当前距离
double currentDistance = calculateDistance(obj1, obj2);
// 如果当前距离已经过远,可以直接排除
if (currentDistance > LOW_RISK_THRESHOLD &&
obj1.getVelocity().getSpeed() + obj2.getVelocity().getSpeed() < 50) {
return new CollisionRisk(obj1, obj2, currentDistance, RiskLevel.NONE);
}
// 预测未来30秒的轨迹
List<PredictedPosition> trajectory1 = predictTrajectory(obj1, PREDICTION_HORIZON);
List<PredictedPosition> trajectory2 = predictTrajectory(obj2, PREDICTION_HORIZON);
// 计算轨迹上所有点的距离,找出最小距离点
Pair<Double, Long> minDistanceAndTime = findMinimumDistance(trajectory1, trajectory2);
double minDistance = minDistanceAndTime.getLeft();
long timeToMinDistance = minDistanceAndTime.getRight();
// 确定风险等级
RiskLevel riskLevel = determineRiskLevel(minDistance);
// 创建并返回碰撞风险对象
return new CollisionRisk(obj1, obj2, currentDistance, minDistance,
timeToMinDistance, riskLevel,
findCollisionPoint(trajectory1, trajectory2, timeToMinDistance));
}
3.3.2 轨迹预测算法
private List<PredictedPosition> predictTrajectory(MovingObject obj, int seconds) {
List<PredictedPosition> trajectory = new ArrayList<>();
double deltaT = 1.0; // 时间步长(秒)
// 获取当前位置、速度
double x = obj.getVelocity().getX();
double y = obj.getVelocity().getY();
double z = obj.getCurrentPosition().getAltitude();
double vx = obj.getVelocity().getVx();
double vy = obj.getVelocity().getVy();
double vz = obj.getVelocity().getVz();
// 估计加速度(如果有历史数据)
double ax = 0, ay = 0, az = 0;
if (obj.getStateHistory().size() >= 2) {
// 计算加速度...
}
// 当前时间戳
long currentTime = obj.getTimestamp();
// 预测轨迹点
for (int i = 0; i <= seconds; i++) {
// 使用运动学公式预测位置
double predictedX = x + vx * i * deltaT + 0.5 * ax * Math.pow(i * deltaT, 2);
double predictedY = y + vy * i * deltaT + 0.5 * ay * Math.pow(i * deltaT, 2);
double predictedZ = z + vz * i * deltaT + 0.5 * az * Math.pow(i * deltaT, 2);
// 预测时间戳
long predictedTime = currentTime + (long)(i * deltaT * 1000);
// 添加到轨迹
trajectory.add(new PredictedPosition(predictedX, predictedY, predictedZ, predictedTime));
}
return trajectory;
}
3.4 集成到现有系统
要将碰撞检测功能集成到现有系统中,需要修改DataProcessor类以调用碰撞检测服务:
@Slf4j
@Component
public class DataProcessor {
@Autowired
private MovingObjectRepository movingObjectRepository;
@Autowired
private CoordinateSystemService coordinateSystemService;
@Autowired
private SpeedCalculationService speedCalculationService;
@Autowired
private CollisionDetectionService collisionDetectionService; // 新增
@Resource
private Executor processingExecutor;
// 修改processLoop方法
private void processLoop() {
// ... 现有代码 ...
delta.forEach((objectType, ids) -> {
// ... 现有代码 ...
// 数据处理完成后执行碰撞检测
collisionDetectionService.detectCollisions();
});
}
}
4. 性能优化策略
由于碰撞检测需要大量计算,可采用以下优化策略:
4.1 空间分区优化
使用空间分区(Spatial Partitioning)技术将整个坐标空间分成网格或四叉树,只检测同一区域或相邻区域的物体:
// 创建空间网格
private Map<GridCell, List<MovingObject>> createSpatialGrid(List<MovingObject> objects) {
Map<GridCell, List<MovingObject>> grid = new HashMap<>();
for (MovingObject obj : objects) {
GridCell cell = calculateGridCell(obj);
grid.computeIfAbsent(cell, k -> new ArrayList<>()).add(obj);
}
return grid;
}
// 获取需要比较的物体对
private List<Pair<MovingObject, MovingObject>> getPairsToCheck(Map<GridCell, List<MovingObject>> grid) {
List<Pair<MovingObject, MovingObject>> pairs = new ArrayList<>();
// 遍历每个网格及其相邻网格
for (Map.Entry<GridCell, List<MovingObject>> entry : grid.entrySet()) {
GridCell cell = entry.getKey();
List<MovingObject> objectsInCell = entry.getValue();
// 同一网格内的物体对比
for (int i = 0; i < objectsInCell.size(); i++) {
for (int j = i + 1; j < objectsInCell.size(); j++) {
pairs.add(Pair.of(objectsInCell.get(i), objectsInCell.get(j)));
}
}
// 与相邻网格的物体对比
for (GridCell neighbor : getNeighborCells(cell)) {
List<MovingObject> objectsInNeighbor = grid.get(neighbor);
if (objectsInNeighbor != null) {
for (MovingObject obj1 : objectsInCell) {
for (MovingObject obj2 : objectsInNeighbor) {
pairs.add(Pair.of(obj1, obj2));
}
}
}
}
}
return pairs;
}
4.2 多级碰撞检测
实现多级碰撞检测,从粗略到精细:
- 粗略检测:使用包围盒(Bounding Box)或包围球进行快速排除
- 中间检测:对可能碰撞的物体对进行简化轨迹预测
- 精细检测:只对高风险物体对进行精确轨迹预测和分析
private CollisionRisk calculateCollisionRisk(MovingObject obj1, MovingObject obj2) {
// 第一级:粗略检测
if (!couldPossiblyCollide(obj1, obj2)) {
return new CollisionRisk(obj1, obj2, Double.MAX_VALUE, RiskLevel.NONE);
}
// 第二级:中间检测
Pair<Double, Long> roughEstimate = estimateMinimumDistance(obj1, obj2);
if (roughEstimate.getLeft() > HIGH_RISK_THRESHOLD) {
return new CollisionRisk(obj1, obj2, roughEstimate.getLeft(), RiskLevel.LOW);
}
// 第三级:精细检测
return performDetailedCollisionAnalysis(obj1, obj2);
}
4.3 并行计算
利用多线程和并行计算技术提高处理速度:
- 使用Java的Stream API的并行处理能力
- 将碰撞检测任务拆分为多个子任务并行执行
- 利用线程池管理并优化线程资源
5. 日志记录和监控
在碰撞检测过程中,实现全面的日志记录和监控机制:
// 日志记录
private void logCollisionRisk(CollisionRisk risk) {
if (risk.getRiskLevel() == RiskLevel.SEVERE || risk.getRiskLevel() == RiskLevel.HIGH) {
log.warn("检测到高风险碰撞可能! 对象: {} 和 {}, 风险等级: {}, 最小距离: {}米, 预计时间: {}秒后",
risk.getObject1Id(), risk.getObject2Id(), risk.getRiskLevel(),
risk.getMinimumDistance(), risk.getTimeToMinimumDistance() / 1000);
} else {
log.info("检测到碰撞风险. 对象: {} 和 {}, 风险等级: {}, 最小距离: {}米",
risk.getObject1Id(), risk.getObject2Id(), risk.getRiskLevel(),
risk.getMinimumDistance());
}
}
// 性能监控
private void monitorPerformance(long startTime, int objectCount, int pairsChecked, List<CollisionRisk> risks) {
long endTime = System.currentTimeMillis();
long duration = endTime - startTime;
log.debug("碰撞检测完成. 处理时间: {}ms, 物体数: {}, 检查对数: {}, 发现风险: {}",
duration, objectCount, pairsChecked, risks.size());
// 记录性能指标到监控系统
// ...
}
6. 后续优化和扩展
6.1 机器学习增强
引入机器学习模型增强碰撞预测能力:
- 使用历史数据训练移动物体的轨迹预测模型
- 引入情境感知能力,识别特定场景下的常见模式
- 通过强化学习优化避险策略
6.2 多传感器数据融合
整合多种数据源提高预测准确性:
- 结合气象数据考虑环境因素对运动的影响
- 整合地面雷达、ADS-B和其他传感器数据
- 考虑地形和建筑物等静态障碍物
6.3 通信和响应机制
完善碰撞风险的通知和响应机制:
- 实现分级预警通知(WebSocket、移动应用推送等)
- 为不同类型的碰撞风险定制响应策略
- 提供碰撞避免的建议路径和操作
7. 总结
本文档详细描述了碰撞避免系统中数据处理模块的当前设计和processLoop方法的业务逻辑,并提出了碰撞检测功能的设计方案。通过实现高效的碰撞检测算法、多级优化策略和完善的监控机制,系统能够有效检测和预警潜在的碰撞风险,为机场安全运行提供保障。
随着系统的持续优化和功能扩展,碰撞避免系统将能够应对更复杂的场景和更高的安全需求,实现从被动监测到主动避险的演进。