修改文档

This commit is contained in:
Tian jianyong 2024-12-30 09:41:17 +08:00
parent fe0ebce926
commit 8f5e70b352
10 changed files with 304 additions and 385 deletions

View File

@ -65,7 +65,7 @@ ctest --output-on-failure
```mermaid
graph TD
A[ObstacleAvoidance] --> B[src]
A[CollisionAvoidance] --> B[src]
A --> C[tests]
A --> D[tools]
A --> E[docs]
@ -125,7 +125,7 @@ FetchContent_MakeAvailable(json)
- 数据源配置:
- 主机localhost
- 端口8080
- 端口8081
- API路径
- /api/getCurrentFlightPositions
- /api/getCurrentVehiclePositions

View File

@ -1,22 +0,0 @@
1|# 运行时必需的包
2|- boost-system
3|- boost-filesystem
4|- boost-thread
5|- openssl-libs
6|- python3
7|- python3-libs
8|
9|# 安装 SCL 仓库
10|sudo yum install -y centos-release-scl
11|
12|# 安装 GCC 7
13|sudo yum install -y devtoolset-7-gcc devtoolset-7-gcc-c++
14|
15|# 启用 GCC 7
16|scl enable devtoolset-7 bash
17|
18|# 确保已启用 EPEL 仓库
19|sudo yum install -y epel-release
20|
21|# 安装 nlohmann-json-devel
22|sudo yum install -y nlohmann-json-devel

View File

@ -1,13 +0,0 @@
1|deploy/
2| ├── bin/ # 编译好的可执行文件
3| │ └── collision_avoidance
4| ├── lib/ # 必要的运行时库
5| │ ├── boost_system.so
6| │ ├── boost_filesystem.so
7| │ └── boost_thread.so
8| ├── python/ # Python 依赖包
9| │ ├── flask
10| │ └── werkzeug
11| └── config/ # 配置文件
12| ├── system_config.json
13| └── vehicle_control.json

View File

@ -56,7 +56,7 @@
脚本会自动完成:
- 下载所需的系统依赖
- 下载所需的系统依赖
- 下载 Python 依赖包
- 创建完整的项目归档文件
@ -89,9 +89,9 @@
4. 执行部署脚本
```bash
sudo ./scripts/deploy.sh
```
```bash
sudo ./scripts/deploy.sh
```
## 部署后配置
@ -129,7 +129,7 @@ firewall-cmd --reload
- 确认配置文件权限正确
- 验证端口 8010 和 8081 是否被占用
### 2. Mock Server 启动失
### 2. Mock Server 启动失<EFBFBD><EFBFBD>
- 检查 Python 和依赖包是否正确安装
- 确认端口 8081 未被占用
@ -138,7 +138,13 @@ firewall-cmd --reload
### 3. 防火墙配置
- 如果使用其他防火墙,需要手动开放 8010 和 8081 端口
- 确认防火墙规<E5A299><E8A784><EFBFBD>是否生效`firewall-cmd --list-all`
- 确认防火墙规则是否生效:`firewall-cmd --list-all`
### 4. 依赖包安装问题
- 如果遇到依赖包冲突,检查是否有 i686 架构的包未被删除
- 使用 `rpm -qa | grep i686` 命令检查系统中的 32 位包
- 如果发现 i686 包,使用 `rpm -e` 命令删除它们
## 卸载

View File

@ -1,172 +0,0 @@
# 部署指南
本文档详细说明了如何在 CentOS 系统上部署碰撞避免系统。支持在线和离线两种部署方式。
## 目录
- [系统要求](#系统要求)
- [在线部署](#在线部署)
- [离线部署](#离线部署)
- [部署后配置](#部署后配置)
- [常见问题](#常见问题)
## 系统要求
- CentOS 7 或更高版本
- 至少 2GB 可用内存
- 至少 10GB 可用磁盘空间
- root 权限
- Python 3.6 或更高版本
## 在线部署
如果服务器可以访问互联网,可以直接使用在线部署方式。
1. 获取项目代码
```bash
git clone [项目仓库地址]
cd CollisionAvoidance
```
2. 执行部署脚本
```bash
sudo ./scripts/deploy.sh
```
## 离线部署
如果服务器无法访问互联网,需要使用离线部署方式。
### 准备阶段(在有网络的环境中进行)
1. 在有网络的 CentOS 环境中,获取项目代码
```bash
git clone [项目仓库地址]
cd CollisionAvoidance
```
2. 执行离线包准备脚本
```bash
./scripts/prepare_offline_packages.sh
```
脚本会自动完成:
- 下载所需的系统依赖包
- 下载 Python 依赖包
- 创建完整的项目归档文件
### 部署步骤
1. 将生成的归档文件传输到目标服务器
```bash
scp ../CollisionAvoidance.tar.gz root@target-server:/tmp/
```
2. 在目标服务器上解压
```bash
cd /tmp
tar xzf CollisionAvoidance.tar.gz
cd CollisionAvoidance
```
3. 删除 32 位依赖包
> 注意:由于系统是 64 位架构,我们需要删除所有 32 位i686的依赖包以避免安装冲突。这些包是在准备离线包时自动下载的但在 64 位系统上不需要。
```bash
# 删除所有 i686 架构的包
cd packages
rm -f *i686.rpm
cd ..
```
4. 执行部署脚本
```bash
sudo ./scripts/deploy.sh
```
## 部署后配置
### 服务管理
- 启动服务:`systemctl start collision-avoidance`
- 停止服务:`systemctl stop collision-avoidance`
- 重启服务:`systemctl restart collision-avoidance`
- 查看状态:`systemctl status collision-avoidance`
- 查看日志:`journalctl -u collision-avoidance -f`
### 配置文件
- 配置文件位置:`/etc/collision_avoidance/`
- WebSocket 服务端口8010
- Mock Server 端口8081
### 防火墙配置
如果使用 firewalld
```bash
# 开放 WebSocket 端口
firewall-cmd --permanent --add-port=8010/tcp
# 开放 Mock Server 端口
firewall-cmd --permanent --add-port=8081/tcp
firewall-cmd --reload
```
## 常见问题
### 1. 服务启动失败
- 检查服务日志:`journalctl -u collision-avoidance -n 50`
- 确认配置文件权限正确
- 验证端口 8010 和 8081 是否被占用
### 2. Mock Server 启动失<E58AA8><E5A4B1>
- 检查 Python 和依赖包是否正确安装
- 确认端口 8081 未被占用
- 检查 Mock Server 日志输出
### 3. 防火墙配置
- 如果使用其他防火墙,需要手动开放 8010 和 8081 端口
- 确认防火墙规则是否生效:`firewall-cmd --list-all`
### 4. 依赖包安装问题
- 如果遇到依赖包冲突,检查是否有 i686 架构的包未被删除
- 使用 `rpm -qa | grep i686` 命令检查系统中的 32 位包
- 如果发现 i686 包,使用 `rpm -e` 命令删除它们
## 卸载
如需卸载系统:
```bash
sudo ./scripts/uninstall.sh
```
卸载脚本会:
- 停止并禁用服务
- 删除系统服务配置
- 删除程序文件
- 删除配置文件
- 关闭防火墙端口
## 技术支持
如遇到问题,请:
1. 查看服务日志
2. 检查系统日志
3. 检查 Mock Server 日志
4. 联系技术支持团队

View File

@ -34,10 +34,20 @@
### 3.1 基础数据类型
```cpp
// 移动物体类型
enum class MovingObjectType {
AIRCRAFT, // 航空器
SPECIAL, // 特勤车
UNMANNED // 无人车(可控车辆)
};
// 二维向量
struct Vector2D {
double x; // 东西方向(米)
double y; // 南北方向(米)
double magnitude() const; // 计算向量大小
double direction() const; // 计算向量方向
};
// 地理坐标
@ -46,32 +56,58 @@ struct GeoPosition {
double longitude; // 经度
};
// 基础移动物体
struct MovingObject {
std::string id; // 唯一标识
GeoPosition geo; // 地理坐标
Vector2D position; // 平面坐标
double heading; // 航向角(度)
uint64_t timestamp; // 时间戳
// 位置记录
struct PositionRecord {
GeoPosition geo; // 地理位置
uint64_t timestamp; // 时间戳
};
// 移动物体基类
class MovingObject {
public:
std::string id; // 唯一标识
Vector2D position; // 平面坐标
GeoPosition geo; // 地理坐标
double heading; // 航向角
double speed; // 速度
int64_t timestamp; // 时间戳
MovingObjectType type; // 物体类型
std::deque<PositionRecord> positionHistory; // 位置历史记录
virtual bool isValidPosition(const GeoPosition& newPos) const = 0;
virtual bool isValidSpeed(double speed) const = 0;
void updateMotion(const GeoPosition& newPos, uint64_t newTime);
};
```
### 3.2 业务数据类型
```cpp
// 航空器数据
struct Aircraft : MovingObject {
std::string flightNo; // 航班号
std::string trackNumber; // 航迹号
double altitude; // 高度(米)
// 航空器
class Aircraft : public MovingObject {
public:
std::string flightNo; // 航班号
std::string trackNumber; // 航迹号
double altitude; // 高度(米)
static constexpr double MAX_SPEED = 100.0; // 最大速度(米/秒)
static constexpr double MAX_POSITION_JUMP = 50.0; // 最大位置跳变(米)
bool isValidPosition(const GeoPosition& newPos) const override;
bool isValidSpeed(double speed) const override;
};
// 车辆数据
struct Vehicle : MovingObject {
std::string vehicleNo; // 车牌号
double speed; // 速度
double direction; // 方向
bool controllable; // 是否可控
// 车辆
class Vehicle : public MovingObject {
public:
std::string vehicleNo; // 车牌号
bool isControllable; // 是否可控
static constexpr double MAX_SPEED = 20.0; // 最大速度(米/秒)
static constexpr double MAX_POSITION_JUMP = 10.0; // 最大位置跳变(米)
bool isValidPosition(const GeoPosition& newPos) const override;
bool isValidSpeed(double speed) const override;
};
```
@ -108,64 +144,119 @@ class CollisionDetector {
## 5. 碰撞检测算法
### 5.1 基本原理
### 5.1 碰撞类型
碰撞检测基于以下三个核心要素
系统支持以下碰撞类型
1. 距离检测
2. 相对运动分析
3. 区域特定阈值
1. HEAD_ON相向碰撞航向差大于 150 度)
2. CROSSING交叉碰撞航向差在 15-165 度之间)
3. PARALLEL平行碰撞航向差小于 30 度)
4. STATIC静止碰撞双方速度接近 0
### 5.2 检测流程
#### 5.2.1 距离检测
1.直接报警条件:
### 5.2 风险等级
```cpp
if (distance < threshold * 0.5) { // 距离小于阈值的一半
return true; // 直接报警
}
enum class RiskLevel {
NONE = 0, // 无风险
WARNING = 1, // 预警:进入预警区域
CRITICAL = 2 // 告警:进入危险区域
};
enum class WarningZoneType {
NONE = 0, // 无风险区域
WARNING = 1, // 预警区域
DANGER = 2 // 危险区域
};
```
2.进一步检测条件:
### 5.3 碰撞检测流程
1. 距离检测:
```cpp
// 计算当前距离
double dx = obj2.position.x - obj1.position.x;
double dy = obj2.position.y - obj1.position.y;
double current_distance = std::sqrt(dx*dx + dy*dy);
// 如果当前距离大于警告区域,直接返回不会碰撞
if (current_distance > (warning_radius1 + warning_radius2)) {
return false;
}
```
2. 碰撞类型判断:
```cpp
double angle_diff = getAngleDifference(heading1, heading2);
if (angle_diff > 150.0) {
// 相向碰撞检测
type = CollisionType::HEAD_ON;
} else if (angle_diff > 15.0 && angle_diff < 165.0) {
// 交叉碰撞检测
type = CollisionType::CROSSING;
} else {
// 平行碰撞检测
type = CollisionType::PARALLEL;
}
```
3. 相对运动分析:
```cpp
// 计算速度分量
double vx1 = speed1 * std::cos((90.0 - heading1) * M_PI / 180.0);
double vy1 = speed1 * std::sin((90.0 - heading1) * M_PI / 180.0);
double vx2 = speed2 * std::cos((90.0 - heading2) * M_PI / 180.0);
double vy2 = speed2 * std::sin((90.0 - heading2) * M_PI / 180.0);
// 计算相对运动
double rel_vx = vx2 - vx1;
double rel_vy = vy2 - vy1;
double rel_speed = std::sqrt(rel_vx*rel_vx + rel_vy*rel_vy);
```
4. 碰撞预测:
```cpp
// 在时间窗口内采样检查
for (int i = 1; i <= STEPS; ++i) {
double t = i * dt;
// 计算t时刻的位置
Vector2D future1 = predictPosition(pos1, speed1, heading1, t);
Vector2D future2 = predictPosition(pos2, speed2, heading2, t);
// 计算t时刻的距离
double distance = calculateDistance(future1, future2);
// 检查是否会碰撞
if (distance <= safe_distance) {
return true;
}
}
```
### 5.4 碰撞记录管理
```cpp
if (distance < threshold) { // 距离在阈值范围内
// 进行相对运动分析
}
struct CollisionRecord {
Vector2D collisionPoint; // 冲突点位置
int64_t detectedTime; // 检测到冲突的时间
RiskLevel maxLevel; // 历史最高风险等级
bool resolved; // 是否已解除
};
```
#### 5.2.2 相对运动分析
碰撞解除条件:
1.速度分量计算:
1. 对于已通过交叉点的情况:
- 物体距离交叉点的距离大于安全距离
2. 对于未通过交叉点的情况:
- 两个物体都在安全距离之外
- 预测不会发生碰撞
```cpp
// 考虑航向角,转换为数学坐标系
double vx = speed * std::cos((90 - heading) * M_PI / 180.0);
double vy = speed * std::sin((90 - heading) * M_PI / 180.0);
```
2.相对运动计算:
```cpp
// 计算相对速度
double relativeVx = v1x - v2x;
double relativeVy = v1y - v2y;
// 计算相对运动
double relativeMotion = dx*relativeVx + dy*relativeVy;
```
3.碰撞判定:
```cpp
if (relativeMotion <= 0) { // 物体正在接近或相对静止
return true; // 报警
}
```
### 5.3 区域特定阈值
### 5.5 区域特定阈值
不同区域采用不同的安全距离阈值:
@ -176,7 +267,7 @@ if (relativeMotion <= 0) { // 物体正在接近或相对静止
| 停机位 | 40米 | 20米 |
| 服务区 | 30米 | 15米 |
### 5.4 空间优化
### 5.6 空间优化
使用四叉树进行空间索引,优化查询性能:
@ -195,7 +286,7 @@ auto nearbyVehicles = vehicleTree_.queryNearby(
);
```
### 5.5 性能考虑
### 5.7 性能考虑
1. 空间复杂度:
- 四叉树O(n),其中 n 为车辆数量
@ -205,7 +296,7 @@ auto nearbyVehicles = vehicleTree_.queryNearby(
- 四叉树查询O(log n)
- 总体碰撞检测O(m * log n)
### 5.6 安全保障
### 5.8 安全保障
1. 距离冗余:
- 使用阈值的一半作为直接报警条件
@ -219,7 +310,7 @@ auto nearbyVehicles = vehicleTree_.queryNearby(
- 当无法计算相对运动时,仅使用距离判断
- 保证基本的安全检测功能
### 5.7 碰撞检测主流程
### 5.9 碰撞检测主流程
```cpp
// 加载可控车辆配置
@ -248,7 +339,7 @@ for (const auto& aircraft : aircrafts) {
}
```
### 5.8 可控车辆配置加载
### 5.10 可控车辆配置加载
从配置文件加载可控车辆信息:
@ -615,7 +706,7 @@ while (total_read < content_length) {
- 验证位置历史记录
3. 数据有效性测试
- 测试航<EFBFBD><EFBFBD>器数据
- 测试航器数据
- 测试车辆数据
- 验证速度和位置限制

View File

@ -266,48 +266,48 @@ Content-Type: application/json
1. 告警指令覆盖其他指令:
```json
{
"vehicleId": "QN001",
"type": "ALERT",
"reason": "COLLISION_RISK",
"timestamp": 1733741411167
}
```
```json
{
"vehicleId": "QN001",
"type": "ALERT",
"reason": "COLLISION_RISK",
"timestamp": 1733741411167
}
```
2. 红灯指令(但不会覆盖告警):
```json
{
"vehicleId": "QN001",
"type": "SIGNAL",
"reason": "TRAFFIC_LIGHT",
"signalState": "RED",
"timestamp": 1733741411167
}
```
```json
{
"vehicleId": "QN001",
"type": "SIGNAL",
"reason": "TRAFFIC_LIGHT",
"signalState": "RED",
"timestamp": 1733741411167
}
```
3. 预警指令(可被告警和红灯覆盖):
```json
{
"vehicleId": "QN001",
"type": "WARNING",
"reason": "APPROACHING_INTERSECTION",
"timestamp": 1733741411167
}
```
```json
{
"vehicleId": "QN001",
"type": "WARNING",
"reason": "APPROACHING_INTERSECTION",
"timestamp": 1733741411167
}
```
4. 恢复指令(需要无更高优先级指令):
```json
{
"vehicleId": "QN001",
"type": "RESUME",
"reason": "RESUME_TRAFFIC",
"timestamp": 1733741411167
}
```
```json
{
"vehicleId": "QN001",
"type": "RESUME",
"reason": "RESUME_TRAFFIC",
"timestamp": 1733741411167
}
```
## 6. 使用示例

View File

@ -1,41 +0,0 @@
# 红绿灯信号接口文档
## 1. 上报接口定义
### 1.1 信号机实时状态上报
#### Topic
| Topic | cuse/v2/{tenantCode}/{deviceId}/data |
|-------|--------------------------------------|
| 消息发送方 | 设备 |
| 消息接收方 | 物联网平台 |
#### 参数说明
| 参数 | 必选/可选 | 类型 | 描述 |
|------|-----------|------|------|
| topic | 必选 | String | 设备参数上报固定为"deviceReq" |
| encryptFlag | 必选 | Short | 加密方式0-不加密 1-AES128 加密 |
| serviceId | 必选 | String | 上报服务的标识 |
| reportTime | 必选 | Long | 设备参数上报时间 |
| serviceType | 必选 | String | 服务类型(设备上报数据类型) 固定值"ras-traffic-lights" |
| serviceData | 必选 | Object | 具体上报的数据集合,若采用 SM4 加密方式,则进行数据加密 |
#### serviceData
| 参数 | 必选/可选 | 类型 | 描述 |
|------|-----------|------|------|
| collectTime | 必选 | Long | 上报时间 |
| deviceSn | 可选 | String | 终端设备序列号 |
| deviceName | 可选 | String | 终端设备名称 |
| manufacturer | 可选 | String | 厂商编码 |
| modelName | 可选 | String | 设备类型名称 |
| trafficLightId | 必选 | String | 红绿灯设备 ID |
| signalStatus | 必选 | String | 信号灯状态 |
| longitude | 必选 | Double | 经度坐标14位小数 |
| latitude | 必选 | Double | 纬度坐标14位小数 |
| altitude | 必选 | Double | 海拔高度6位小数 |
| areaId | 必选 | String | 信号机所处区域 ID |
| intersection | 必选 | String | 信号机所处路口名称 |
| generateTime | 必选 | Long | unix 时间戳 |

View File

@ -1,36 +1,65 @@
# 机场场景告警策略需求文档
# 机场场面告警策略文档
## 1. 控制指令定义
系统对无人车的控制分为三种指令类型:
系统对无人车的控制分为以下指令类型:
```cpp
// 指令类型
enum class CommandType {
ALERT, // 告警指令
SIGNAL, // 信号灯指令
WARNING, // 预警指令
RESUME // 恢复指令
};
// 指令原因
enum class CommandReason {
TRAFFIC_LIGHT, // 红绿灯控制
AIRCRAFT_CROSSING, // 航空器交叉
SPECIAL_VEHICLE, // 特勤车辆
AIRCRAFT_PUSH, // 航空器推出
RESUME_TRAFFIC // 恢复通行
};
// 信号灯状态
enum class SignalState {
RED, // 红灯
GREEN // 绿灯
};
```
### 1.1 信号灯指令SIGNAL
- **目的**:响应交通信号灯
- **触发条件**:接收到红绿灯状态变化
- **执行动作**:根据信号灯状态停车或通行
- **优先级**:高(最高优先级)
- **优先级**4最高优先级
- **原因**TRAFFIC_LIGHT
### 1.2 告警指令ALERT
- **目的**:应对紧急情况
- **触发条件**:检测到直接碰撞风险
- **执行动作**:强制停车或紧急避让
- **优先级**:中
- **优先级**3
- **原因**AIRCRAFT_CROSSING, SPECIAL_VEHICLE, AIRCRAFT_PUSH
### 1.3 预警指令WARNING
- **目的**:提前告知可能的风险
- **触发条件**:进入监测区域但尚未到达关键区域
- **执行动作**:降低速度,提高警惕
- **优先级**:低
- **优先级**2
- **原因**AIRCRAFT_CROSSING, SPECIAL_VEHICLE, AIRCRAFT_PUSH
### 1.4 恢复指令RESUME
- **目的**:恢复到正常行驶状态
- **触发条件**:航空器或特勤车辆通过后,距离路口 50 m后
- **执行动作**:恢复到正常行驶状态
- **优先级**:低
- **优先级**1最低优先级
- **原因**RESUME_TRAFFIC
## 2. 红绿灯条件下的告警策略
@ -46,8 +75,18 @@
- 在距离路口 50 米处为停车点
2. **信号灯状态响应**
- 红灯:持续发送 SIGNAL 指令,要求停车
- 绿灯:持续发送 SIGNAL 指令,允许通过
```cpp
struct VehicleCommand {
std::string vehicleId; // 车辆ID
CommandType type; // 指令类型SIGNAL
CommandReason reason; // 指令原因TRAFFIC_LIGHT
SignalState signalState; // 信号灯状态
std::string intersectionId; // 路口ID
double latitude; // 路口纬度
double longitude; // 路口经度
};
```
## 3. 航空器或特勤车辆,和无人车垂直经过交叉路口的告警策略
@ -62,13 +101,20 @@
- 航空器或特勤车辆通过路口无人车距离路口阈值100 米
2. **控制策略**
- 预警阶段100m-50m发送 WARNING 指令
- 告警阶段50m 以内):发送 ALERT 指令,要求立即停车
- 航空器或特勤车辆通过后,距离路口大于 50 m后发送 RESUME 指令,允许恢复正常行驶
3. **优先级规则**
- 航空器或特勤车辆具有绝对优先权
- 无人车必须避让航空器或特勤车辆
```cpp
struct VehicleCommand {
std::string vehicleId; // 车辆ID
CommandType type; // 指令类型WARNING/ALERT
CommandReason reason; // 指令原因AIRCRAFT_CROSSING/SPECIAL_VEHICLE
double latitude; // 目标位置纬度
double longitude; // 目标位置经度
double relativeSpeed; // 相对速度
double relativeMotionX; // 相对运动 X 分量
double relativeMotionY; // 相对运动 Y 分量
double minDistance; // 最小距离
};
```
## 4. 航空器出库时的告警策略
@ -83,36 +129,41 @@
- 航空器通过路口无人车距离路口阈值100 米
2. **控制策略**
- 预警阶段100m-50m发送 WARNING 指令
- 告警阶段50m 以内):发送 ALERT 指令,要求立即停车
- 航空器离开后,距离路口大于 50 m后发送 RESUME 指令,允许恢复正常行驶
### 4.3 特殊考虑
1. **多航空器情况**
- 就近原则处理
- 使用 ALERT 指令确保安全间距
```cpp
struct VehicleCommand {
std::string vehicleId; // 车辆ID
CommandType type; // 指令类型WARNING/ALERT
CommandReason reason; // 指令原因AIRCRAFT_PUSH
double latitude; // 目标位置纬度
double longitude; // 目标位置经度
double relativeSpeed; // 相对速度
double relativeMotionX; // 相对运动 X 分量
double relativeMotionY; // 相对运动 Y 分量
double minDistance; // 最小距离
};
```
## 5. 通用要求
### 5.1 指令优先级处理
1. SIGNAL 指令(最高优先级)
1. SIGNAL 指令(优先级 4
- 立即执行
- 覆盖其他所有指令
- 红绿灯控制具有最高优先级,确保交通安全
2. ALERT 指令(中等优先级)
2. ALERT 指令(优先级 3
- 可被 SIGNAL 指令覆盖
- 优先于 WARNING 指令
- 用于碰撞风险等紧急情况
3. WARNING 指令(最低优先级)
- 可被其他指令覆盖
3. WARNING 指令(优先级 2
- 可被 SIGNAL 和 ALERT 指令覆盖
- 用于预防性控制
- 在无更高优先级指令时执行
4. RESUME 指令(最低优先级)
4. RESUME 指令(优先级 1
- 可被其他指令覆盖
- 用于恢复到正常行驶状态
@ -131,3 +182,22 @@
- 无人车在距离路口 110 米处开始监测,提前 10 米发送 WARNING 指令
- 无人车在距离路口 60 米处开始监测,提前 10 米发送 ALERT 指令
### 5.5 指令格式
```cpp
struct VehicleCommand {
std::string vehicleId; // 车辆ID
CommandType type; // 指令类型
CommandReason reason; // 指令原因
uint64_t timestamp; // 时间戳
SignalState signalState; // 信号灯状态(仅当 type 为 SIGNAL 时有效)
std::string intersectionId; // 路口ID仅当 type 为 SIGNAL 时有效)
double latitude; // 目标位置纬度(路口/航空器/特勤车)
double longitude; // 目标位置经度(路口/航空器/特勤车)
double relativeSpeed; // 相对速度(仅当 type 为 ALERT/WARNING 时有效)
double relativeMotionX; // 相对运动 X 分量(仅当 type 为 ALERT/WARNING 时有效)
double relativeMotionY; // 相对运动 Y 分量(仅当 type 为 ALERT/WARNING 时有效)
double minDistance; // 最小距离(仅当 type 为 ALERT/WARNING 时有效)
};
```