From 8f5e70b35293468691ec3f5b6f583f5f1f172d4d Mon Sep 17 00:00:00 2001 From: Tian jianyong <11429339@qq.com> Date: Mon, 30 Dec 2024 09:41:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- assistant_snippet_Wd4Hs2Iqxj.txt | 22 -- assistant_snippet_Yx5Hs2Iqxj.txt | 13 - docs/deployment_guide.md | 18 +- docs/deployment_guide_new.md | 172 ------------- docs/design.md | 229 ++++++++++++------ docs/mock_server.md | 66 ++--- docs/traffic_light_api.md | 41 ---- docs/warning_strategy.md | 124 +++++++--- ...ld_package.sh => build_execute_package.sh} | 0 10 files changed, 304 insertions(+), 385 deletions(-) delete mode 100644 assistant_snippet_Wd4Hs2Iqxj.txt delete mode 100644 assistant_snippet_Yx5Hs2Iqxj.txt delete mode 100644 docs/deployment_guide_new.md delete mode 100644 docs/traffic_light_api.md rename scripts/{build_package.sh => build_execute_package.sh} (100%) diff --git a/README.md b/README.md index 327320f..01b9890 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/assistant_snippet_Wd4Hs2Iqxj.txt b/assistant_snippet_Wd4Hs2Iqxj.txt deleted file mode 100644 index b2abf86..0000000 --- a/assistant_snippet_Wd4Hs2Iqxj.txt +++ /dev/null @@ -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 \ No newline at end of file diff --git a/assistant_snippet_Yx5Hs2Iqxj.txt b/assistant_snippet_Yx5Hs2Iqxj.txt deleted file mode 100644 index 98aa5a3..0000000 --- a/assistant_snippet_Yx5Hs2Iqxj.txt +++ /dev/null @@ -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 \ No newline at end of file diff --git a/docs/deployment_guide.md b/docs/deployment_guide.md index fd15541..d59e3b6 100644 --- a/docs/deployment_guide.md +++ b/docs/deployment_guide.md @@ -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 启动失�� - 检查 Python 和依赖包是否正确安装 - 确认端口 8081 未被占用 @@ -138,7 +138,13 @@ firewall-cmd --reload ### 3. 防火墙配置 - 如果使用其他防火墙,需要手动开放 8010 和 8081 端口 -- 确认防火墙规���是否生效:`firewall-cmd --list-all` +- 确认防火墙规则是否生效:`firewall-cmd --list-all` + +### 4. 依赖包安装问题 + +- 如果遇到依赖包冲突,检查是否有 i686 架构的包未被删除 +- 使用 `rpm -qa | grep i686` 命令检查系统中的 32 位包 +- 如果发现 i686 包,使用 `rpm -e` 命令删除它们 ## 卸载 diff --git a/docs/deployment_guide_new.md b/docs/deployment_guide_new.md deleted file mode 100644 index 83a6c7b..0000000 --- a/docs/deployment_guide_new.md +++ /dev/null @@ -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 启动失�� - -- 检查 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. 联系技术支持团队 diff --git a/docs/design.md b/docs/design.md index 1839a97..7064ef6 100644 --- a/docs/design.md +++ b/docs/design.md @@ -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 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. 数据有效性测试 - - 测试航��器数据 + - 测试航空器数据 - 测试车辆数据 - 验证速度和位置限制 diff --git a/docs/mock_server.md b/docs/mock_server.md index b2225b9..77709a7 100644 --- a/docs/mock_server.md +++ b/docs/mock_server.md @@ -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. 使用示例 diff --git a/docs/traffic_light_api.md b/docs/traffic_light_api.md deleted file mode 100644 index fdc2740..0000000 --- a/docs/traffic_light_api.md +++ /dev/null @@ -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 时间戳 | diff --git a/docs/warning_strategy.md b/docs/warning_strategy.md index ad4798e..717b3b8 100644 --- a/docs/warning_strategy.md +++ b/docs/warning_strategy.md @@ -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 时有效) +}; +``` diff --git a/scripts/build_package.sh b/scripts/build_execute_package.sh similarity index 100% rename from scripts/build_package.sh rename to scripts/build_execute_package.sh