CollisionAvoidance/src/mock/MockDataService.cpp

168 lines
5.5 KiB
C++

#include "mock/MockDataService.h"
#include <format>
#include <sstream>
#include <iomanip>
MockDataService::MockDataService(const AirportBounds& bounds)
: bounds_(bounds)
{
}
std::vector<Aircraft> MockDataService::generateAircraftData() {
std::vector<Aircraft> aircraft;
// 生成跑道上的航空器
for (int i = 0; i < 5; ++i) {
Aircraft a;
a.flightNo = generateAircraftId();
a.position = generatePosition(AreaType::RUNWAY);
a.speed = generateSpeed(AreaType::RUNWAY);
a.heading = generateHeading(AreaType::RUNWAY);
a.altitude = generateAltitude(AreaType::RUNWAY);
aircraft.push_back(a);
}
// 生成滑行道上的航空器
for (int i = 0; i < 10; ++i) {
Aircraft a;
a.flightNo = generateAircraftId();
a.position = generatePosition(AreaType::TAXIWAY);
a.speed = generateSpeed(AreaType::TAXIWAY);
a.heading = generateHeading(AreaType::TAXIWAY);
a.altitude = generateAltitude(AreaType::TAXIWAY);
aircraft.push_back(a);
}
// 生成停机位的航空器
for (int i = 0; i < 15; ++i) {
Aircraft a;
a.flightNo = generateAircraftId();
a.position = generatePosition(AreaType::GATE);
a.speed = generateSpeed(AreaType::GATE);
a.heading = generateHeading(AreaType::GATE);
a.altitude = generateAltitude(AreaType::GATE);
aircraft.push_back(a);
}
return aircraft;
}
std::vector<Vehicle> MockDataService::generateVehicleData() {
std::vector<Vehicle> vehicles;
// 生成服务区的车辆
for (int i = 0; i < 20; ++i) {
Vehicle v;
v.vehicleNo = generateVehicleId();
v.position = generatePosition(AreaType::SERVICE);
v.speed = generateSpeed(AreaType::SERVICE);
v.heading = generateHeading(AreaType::SERVICE);
vehicles.push_back(v);
}
// 生成停机位的车辆
for (int i = 0; i < 15; ++i) {
Vehicle v;
v.vehicleNo = generateVehicleId();
v.position = generatePosition(AreaType::GATE);
v.speed = generateSpeed(AreaType::GATE);
v.heading = generateHeading(AreaType::GATE);
vehicles.push_back(v);
}
return vehicles;
}
Vector2D MockDataService::generatePosition(AreaType areaType) {
const auto& config = bounds_.getAreaConfig(areaType);
const auto& areaBounds = bounds_.getAreaBounds(areaType);
std::uniform_real_distribution<double> x_dist(areaBounds.x,
areaBounds.x + areaBounds.width);
std::uniform_real_distribution<double> y_dist(areaBounds.y,
areaBounds.y + areaBounds.height);
return {x_dist(rng_), y_dist(rng_)};
}
double MockDataService::generateSpeed(AreaType areaType) {
// 根据区域类型返回合适的速度范围
switch (areaType) {
case AreaType::RUNWAY:
return std::uniform_real_distribution<double>{30.0, 80.0}(rng_);
case AreaType::TAXIWAY:
return std::uniform_real_distribution<double>{5.0, 15.0}(rng_);
case AreaType::GATE:
return std::uniform_real_distribution<double>{0.0, 5.0}(rng_);
case AreaType::SERVICE:
return std::uniform_real_distribution<double>{0.0, 10.0}(rng_);
default:
return 0.0;
}
}
double MockDataService::generateHeading(AreaType areaType) {
// 根据区域类型返回合适的航向范围
switch (areaType) {
case AreaType::RUNWAY:
// 跑道通常只有两个方向
return std::uniform_int_distribution<int>{0, 1}(rng_) * 180.0;
default:
// 其他区域可以是任意方向
return std::uniform_real_distribution<double>{0.0, 360.0}(rng_);
}
}
double MockDataService::generateAltitude(AreaType areaType) {
// 根据区域类型返回合适的高度范围
switch (areaType) {
case AreaType::RUNWAY:
return std::uniform_real_distribution<double>{0.0, 15.0}(rng_);
case AreaType::TAXIWAY:
return std::uniform_real_distribution<double>{0.0, 5.0}(rng_);
default:
return 0.0;
}
}
std::string MockDataService::generateAircraftId() {
std::stringstream ss;
ss << "AC" << std::setw(4) << std::setfill('0') << ++aircraftCounter_;
return ss.str();
}
std::string MockDataService::generateVehicleId() {
std::stringstream ss;
ss << "VH" << std::setw(4) << std::setfill('0') << ++vehicleCounter_;
return ss.str();
}
std::vector<TrafficLightSignal> MockDataService::generateTrafficLightData() {
std::vector<TrafficLightSignal> signals;
// 生成 5-10 个红绿灯信号
std::uniform_int_distribution<> numSignals(5, 10);
int count = numSignals(rng_);
for (int i = 0; i < count; ++i) {
TrafficLightSignal signal;
signal.trafficLightId = generateTrafficLightId();
signal.status = generateTrafficLightState();
signal.timestamp = std::chrono::system_clock::now().time_since_epoch().count();
signals.push_back(signal);
}
return signals;
}
std::string MockDataService::generateTrafficLightId() {
std::stringstream ss;
ss << "TL" << std::setw(4) << std::setfill('0') << ++trafficLightCounter_;
return ss.str();
}
SignalStatus MockDataService::generateTrafficLightState() {
std::uniform_int_distribution<> dist(0, 2);
int state = dist(rng_);
return static_cast<SignalStatus>(state);
}