8.6 KiB
8.6 KiB
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:
- T1 -> T2(西路口)
- T2 -> T4
- 到达T4后返回T1
-
QN002:
- T12 -> T8
- 到达T8后返回T12
-
TQ001(特勤车):
- T4 -> T2(西路口)
- T2 -> T3
- 到达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. 指令优先级
车辆控制指令按以下优先级处理:
-
ALERT (5):告警指令,最高优先级
- 用于紧急情况,如碰撞风险
- 可以覆盖所有其他指令
- 收到后车辆立即停止
-
RED (4):红灯指令,次高优先级
- 用于红绿灯控制
- 可以覆盖预警、绿灯和恢复指令
- 红灯时车辆停止,绿灯时可能恢复(取决于是否有更高优先级指令)
-
WARNING (3):预警指令,中等优先级
- 用于提前预警可能的风险
- 可以覆盖绿灯和恢复指令
- 收到后车辆减速或停止
-
GREEN (2):绿灯状态
- 系统内部状态,不是外部指令
- 可以覆盖恢复指令
- 只有在没有更高优先级指令时才生效
-
RESUME (1):恢复指令,最低优先级
- 用于恢复正常行驶
- 不能覆盖其他指令
- 只有在没有任何其他指令时才生效
5.1 优先级规则
- 高优先级指令可以覆盖低优先级指令
- 相同优先级的新指令可以覆盖旧指令
- 低优先级指令不能覆盖高优先级指令
- 恢复行驶需要满足个条件:
- 收到 RESUME 指令
- 没有任何更高优先级的指令
5.2 状态转换
-
收到告警指令 (ALERT):
- 立即停止
- 忽略所有低优先级指令
- 只能通过 RESUME 指令恢复(且无其他高优先级指令)
-
收到红灯指令 (RED):
- 红灯:停止
- 绿灯:如果没有更高优先级指令(ALERT)则恢复行驶
-
收到预警指令 (WARNING):
- 减速或停止
- 可被告警或红灯指令覆盖
- 可通过绿灯或恢复指令解除(如无更高优先级指令)
-
遇到绿灯 (GREEN):
- 如果没有 ALERT、SIGNAL 或 WARNING 指令,则恢复行驶
- 否则保持当前状态
-
收到恢复指令 (RESUME):
- 检查是否有任何更高优先级指令
- 如果没有,则恢复正常行驶速度
- 如果有,则保持当前状态
5.3 使用示例
-
告警指令覆盖其他指令:
{ "vehicleId": "QN001", "type": "ALERT", "reason": "COLLISION_RISK", "timestamp": 1733741411167 } -
红灯指令(但不会覆盖告警):
{ "vehicleId": "QN001", "type": "SIGNAL", "reason": "TRAFFIC_LIGHT", "signalState": "RED", "timestamp": 1733741411167 } -
预警指令(可被告警和红灯覆盖):
{ "vehicleId": "QN001", "type": "WARNING", "reason": "APPROACHING_INTERSECTION", "timestamp": 1733741411167 } -
恢复指令(需要无更高优先级指令):
{ "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
服务默认监听在:
- HTTP 服务:http://localhost:8081
8. 注意事项
-
位置更新
- 位置更新频率:1秒一次
- 坐标系统:WGS84
- 速度单位:km/h(内部计算使用 m/s)
-
车辆控制
- 车辆收到停止指令后会立即停止位置更新
- 只有收到 RESUME 指令且没有更高优先级的指令时才会恢复运动
- 每个指令都必须包含时间戳
-
错误处理
- 无效的车辆ID:返回 404 错误
- 无效的指令格式:返回 400 错误
- 服务器内部错误:返回 500 错误