修改文档
This commit is contained in:
parent
fe0ebce926
commit
8f5e70b352
@ -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
|
||||
|
||||
@ -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
|
||||
@ -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
|
||||
@ -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` 命令删除它们
|
||||
|
||||
## 卸载
|
||||
|
||||
|
||||
@ -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. 联系技术支持团队
|
||||
229
docs/design.md
229
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<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>器数据
|
||||
- 测试航空器数据
|
||||
- 测试车辆数据
|
||||
- 验证速度和位置限制
|
||||
|
||||
|
||||
@ -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. 使用示例
|
||||
|
||||
|
||||
@ -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 时间戳 |
|
||||
@ -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 时有效)
|
||||
};
|
||||
```
|
||||
|
||||
Loading…
Reference in New Issue
Block a user