QDAirPortTestSystemBackend/docs/mock_server.md
2026-01-27 15:24:05 +08:00

8.6 KiB
Raw Blame History

Mock 服务设计与使用说明

1. 概述

Mock 服务用于模拟机场场面的移动物体(航空器和车辆),提供位置更新和响应控制指令的功能。服务包含两个主要部分:

  • HTTP API 服务:提供位置查询和车辆控制接口
  • 位置更新模拟:定期更新各个移动物体的位置

2. 移动物体配置

2.1 航空器配置

{
    "flightNo": "AC001",  # 航班号
    "latitude": 36.362647780875804,  # 纬度
    "longitude": 120.088303,  # 经度
    "direction": {  # 使用方向向量
        "lat": initial_target_lat,
        "lon": initial_target_lon
    },
    "speed": 50.0  # 滑行速度 50km/h
}

2.2 车辆配置

{
    "vehicleNo": "QN001",  # 无人车1西路口
    "latitude": WEST_INTERSECTION["latitude"],  # 纬度
    "longitude": WEST_INTERSECTION["longitude"],  # 经度
    "direction": 1,  # 1表示向东-1表示向西
    "speed": 36.0  # 行驶速度 36km/h
}

2.3 关键坐标点

  • T1 (120.0868853, 36.35496367): 无人车1起点
  • T2 (120.08502054, 36.35448347): 冲突点1西路口
  • T3 (120.08341044, 36.35406879): 特勤车终点
  • T4 (120.08558121, 36.35305878): 无人车1终点/无人车2起点/特勤车起点
  • T5 (120.08400957, 36.35265197)
  • T6 (120.08649105, 36.35074527): 冲突点2东路口
  • T7 (120.08562915, 36.35052372): 航空器1终点
  • T8 (120.08676664, 36.35004529): 无人车2终点
  • T9 (120.08520616, 36.34964473)
  • T10 (120.08710569, 36.34917893)
  • T11 (120.0873865, 36.3509885): 航空器1终点
  • T12 (120.08603613, 36.35190217): QN002新起点距T6路口150米

3. 运动模式

3.1 航空器运动

  • 沿跑道南北方向移动
  • 到达边界时自动调头
  • 保持恒定速度 50km/h

3.2 无人车运动

  • QN001

    1. T1 -> T2西路口
    2. T2 -> T4
    3. 到达T4后返回T1
  • QN002

    1. T12 -> T8
    2. 到达T8后返回T12
  • TQ001特勤车

    1. T4 -> T2西路口
    2. T2 -> T3
    3. 到达T3后返回T4

3.3 配置参数

  • 距离阈值:

    • 300米DIST_300M
    • 200米DIST_200M
    • 150米DIST_150M
    • 100米DIST_100M
    • 50米DIST_50M
  • 时间配置:

    • 返回等待时间10秒
    • 位置更新间隔1秒
    • 红绿灯切换间隔10秒
  • 速度配置:

    • 默认车辆速度18.0 km/h
    • 紧急制动减速度80%/更新
    • 正常制动减速度20%/更新

4. HTTP API 接口

4.1 航空器位置查询接口

GET /api/getCurrentFlightPositions

返回所有移动物体的当前位置信息:

[
    {
        "flightNo": "AC001",
        "latitude": 36.362647780875804,
        "longitude": 120.088303,
        "direction": {
            "lat": 0.707,
            "lon": 0.707
        },
        "speed": 36.0,
        "time": 1733741411167
    }
]

4.2 车辆位置查询接口

GET /api/getCurrentVehiclePositions

返回所有车辆的当前位置信息:

[
    {
        "vehicleNo": "QN001",
        "latitude": 36.362448155990975,
        "longitude": 120.08844920958369,
        "direction": -1,
        "speed": 18.0,
        "time": 1733741411168,
        "phase": 0
    }
]

4.3 红绿灯状态查询接口

GET /api/getTrafficLightSignals

返回所有红绿灯的当前状态:

[
    {
        "id": "TL001",
        "state": 1,
        "timestamp": 1733741411167,
        "intersection": "INT001",
        "position": {
            "latitude": 36.35448347,
            "longitude": 120.08502054
        }
    }
]

4.4 车辆控制接口

POST /api/vehicle/command
Content-Type: application/json

请求格式:

{
    "vehicleId": "QN001",
    "type": "SIGNAL",           // SIGNAL, ALERT, WARNING, RESUME
    "reason": "TRAFFIC_LIGHT",  // TRAFFIC_LIGHT, AIRCRAFT_CROSSING, SPECIAL_VEHICLE, AIRCRAFT_PUSH, RESUME_TRAFFIC
    "timestamp": 1733741411167,
    "signalState": "RED",       // 可选,仅当 type 为 SIGNAL 时需要
    "targetPosition": {         // 可选
        "x": 100.0,
        "y": 200.0
    },
    "speed": 0.0,              // 可选
    "distance": 0.0            // 可选
}

响应格式:

{
    "status": "ok",            // ok 或 error
    "message": "Command executed successfully"
}

5. 指令优先级

车辆控制指令按以下优先级处理:

  1. ALERT (5):告警指令,最高优先级

    • 用于紧急情况,如碰撞风险
    • 可以覆盖所有其他指令
    • 收到后车辆立即停止
  2. RED (4):红灯指令,次高优先级

    • 用于红绿灯控制
    • 可以覆盖预警、绿灯和恢复指令
    • 红灯时车辆停止,绿灯时可能恢复(取决于是否有更高优先级指令)
  3. WARNING (3):预警指令,中等优先级

    • 用于提前预警可能的风险
    • 可以覆盖绿灯和恢复指令
    • 收到后车辆减速或停止
  4. GREEN (2):绿灯状态

    • 系统内部状态,不是外部指令
    • 可以覆盖恢复指令
    • 只有在没有更高优先级指令时才生效
  5. RESUME (1):恢复指令,最低优先级

    • 用于恢复正常行驶
    • 不能覆盖其他指令
    • 只有在没有任何其他指令时才生效

5.1 优先级规则

  1. 高优先级指令可以覆盖低优先级指令
  2. 相同优先级的新指令可以覆盖旧指令
  3. 低优先级指令不能覆盖高优先级指令
  4. 恢复行驶需要满足个条件:
    • 收到 RESUME 指令
    • 没有任何更高优先级的指令

5.2 状态转换

  1. 收到告警指令 (ALERT)

    • 立即停止
    • 忽略所有低优先级指令
    • 只能通过 RESUME 指令恢复(且无其他高优先级指令)
  2. 收到红灯指令 (RED)

    • 红灯:停止
    • 绿灯如果没有更高优先级指令ALERT则恢复行驶
  3. 收到预警指令 (WARNING)

    • 减速或停止
    • 可被告警或红灯指令覆盖
    • 可通过绿灯或恢复指令解除(如无更高优先级指令)
  4. 遇到绿灯 (GREEN)

    • 如果没有 ALERT、SIGNAL 或 WARNING 指令,则恢复行驶
    • 否则保持当前状态
  5. 收到恢复指令 (RESUME)

    • 检查是否有任何更高优先级指令
    • 如果没有,则恢复正常行驶速度
    • 如果有,则保持当前状态

5.3 使用示例

  1. 告警指令覆盖其他指令:

    {
        "vehicleId": "QN001",
        "type": "ALERT",
        "reason": "COLLISION_RISK",
        "timestamp": 1733741411167
    }
    
  2. 红灯指令(但不会覆盖告警):

    {
        "vehicleId": "QN001",
        "type": "SIGNAL",
        "reason": "TRAFFIC_LIGHT",
        "signalState": "RED",
        "timestamp": 1733741411167
    }
    
  3. 预警指令(可被告警和红灯覆盖):

    {
        "vehicleId": "QN001",
        "type": "WARNING",
        "reason": "APPROACHING_INTERSECTION",
        "timestamp": 1733741411167
    }
    
  4. 恢复指令(需要无更高优先级指令):

    {
        "vehicleId": "QN001",
        "type": "RESUME",
        "reason": "RESUME_TRAFFIC",
        "timestamp": 1733741411167
    }
    

6. 使用示例

6.1 发送红绿灯指令

curl -X POST http://localhost:8081/api/vehicle/command \
  -H "Content-Type: application/json" \
  -d '{
    "vehicleId": "QN001",
    "type": "SIGNAL",
    "reason": "TRAFFIC_LIGHT",
    "timestamp": 1733741411167,
    "signalState": "RED"
  }'

6.2 发送碰撞预警指令

curl -X POST http://localhost:8081/api/vehicle/command \
  -H "Content-Type: application/json" \
  -d '{
    "vehicleId": "QN001",
    "type": "WARNING",
    "reason": "AIRCRAFT_CROSSING",
    "timestamp": 1733741411167,
    "distance": 25.5
  }'

6.3 发送恢复指令

curl -X POST http://localhost:8081/api/vehicle/command \
  -H "Content-Type: application/json" \
  -d '{
    "vehicleId": "QN001",
    "type": "RESUME",
    "reason": "RESUME_TRAFFIC",
    "timestamp": 1733741411167
  }'

7. 启动服务

# 安装依赖
pip install flask

# 启动服务
python tools/mock_server.py

服务默认监听在:

8. 注意事项

  1. 位置更新

    • 位置更新频率1秒一次
    • 坐标系统WGS84
    • 速度单位km/h内部计算使用 m/s
  2. 车辆控制

    • 车辆收到停止指令后会立即停止位置更新
    • 只有收到 RESUME 指令且没有更高优先级的指令时才会恢复运动
    • 每个指令都必须包含时间戳
  3. 错误处理

    • 无效的车辆ID返回 404 错误
    • 无效的指令格式:返回 400 错误
    • 服务器内部错误:返回 500 错误