367 lines
11 KiB
C#
367 lines
11 KiB
C#
using System;
|
||
using ActiveProtect.SimulationEnvironment;
|
||
|
||
namespace ActiveProtect.Models
|
||
{
|
||
/// <summary>
|
||
/// 定义传感器的基本接口
|
||
/// </summary>
|
||
public interface ISensor
|
||
{
|
||
/// <summary>
|
||
/// 获取或设置传感器是否处于激活状态
|
||
/// </summary>
|
||
bool IsActive { get; set; }
|
||
|
||
/// <summary>
|
||
/// 激活传感器
|
||
/// </summary>
|
||
void Activate();
|
||
|
||
/// <summary>
|
||
/// 停用传感器
|
||
/// </summary>
|
||
void Deactivate();
|
||
|
||
/// <summary>
|
||
/// 更新传感器状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">自上次更新以来的时间间隔</param>
|
||
void Update(double deltaTime);
|
||
|
||
/// <summary>
|
||
/// 获取传感器数据
|
||
/// </summary>
|
||
/// <returns>传感器采集的数据</returns>
|
||
SensorData GetSensorData();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 传感器的抽象基类,实现了ISensor接口的基本功能
|
||
/// </summary>
|
||
public abstract class Sensor : ISensor
|
||
{
|
||
/// <summary>
|
||
/// 获取或设置传感器是否处于激活状态
|
||
/// </summary>
|
||
public bool IsActive { get; set; }
|
||
|
||
/// <summary>
|
||
/// 传感器的位置
|
||
/// </summary>
|
||
protected Vector3D Position { get; set; }
|
||
|
||
/// <summary>
|
||
/// 传感器的朝向
|
||
/// </summary>
|
||
protected Orientation Orientation { get; set; }
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
/// <param name="position">传感器的初始位置</param>
|
||
/// <param name="orientation">传感器的初始朝向</param>
|
||
protected Sensor(Vector3D position, Orientation orientation)
|
||
{
|
||
Position = position;
|
||
Orientation = orientation;
|
||
IsActive = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 激活传感器
|
||
/// </summary>
|
||
public virtual void Activate()
|
||
{
|
||
IsActive = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 停用传感器
|
||
/// </summary>
|
||
public virtual void Deactivate()
|
||
{
|
||
IsActive = false;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新传感器状态(需要在子类中实现)
|
||
/// </summary>
|
||
/// <param name="deltaTime">自上次更新以来的时间间隔</param>
|
||
public abstract void Update(double deltaTime);
|
||
|
||
/// <summary>
|
||
/// 获取传感器数据(需要在子类中实现)
|
||
/// </summary>
|
||
/// <returns>传感器采集的数据</returns>
|
||
public abstract SensorData GetSensorData();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 红外探测器类
|
||
/// </summary>
|
||
public class InfraredDetector : Sensor
|
||
{
|
||
/// <summary>
|
||
/// 探测范围
|
||
/// </summary>
|
||
public double DetectionRange { get; set; }
|
||
|
||
/// <summary>
|
||
/// 视场角
|
||
/// </summary>
|
||
public double FieldOfView { get; set; }
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
/// <param name="position">探测器的位置</param>
|
||
/// <param name="orientation">探测器的朝向</param>
|
||
/// <param name="detectionRange">探测范围</param>
|
||
/// <param name="fieldOfView">视场角</param>
|
||
public InfraredDetector(Vector3D position, Orientation orientation, double detectionRange, double fieldOfView)
|
||
: base(position, orientation)
|
||
{
|
||
DetectionRange = detectionRange;
|
||
FieldOfView = fieldOfView;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新红外探测器的状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">自上次更新以来的时间间隔</param>
|
||
public override void Update(double deltaTime)
|
||
{
|
||
// 实现红外探测器的更新逻辑
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取红外探测器的数据
|
||
/// </summary>
|
||
/// <returns>红外探测器采集的数据</returns>
|
||
public override SensorData GetSensorData()
|
||
{
|
||
// 返回红外探测器的数据
|
||
return new InfraredSensorData();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 毫米波辐射计类
|
||
/// </summary>
|
||
public class MillimeterWaveRadiometer : Sensor
|
||
{
|
||
/// <summary>
|
||
/// 工作频率(3mm 或 8mm)
|
||
/// </summary>
|
||
public double Frequency { get; set; }
|
||
|
||
/// <summary>
|
||
/// 辐射温度差检测阈值,辐射计高温物体与低温物体的检测温差,单位K,默认 50K
|
||
/// </summary>
|
||
public double DetectionTemperatureDifferenceThreshold { get; set; } = 50;
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
/// <param name="position">辐射计的位置</param>
|
||
/// <param name="orientation">辐射计的朝向</param>
|
||
/// <param name="frequency">工作频率</param>
|
||
/// <param name="detectionTemperatureDifferenceThreshold">辐射温差检测阈值</param>
|
||
public MillimeterWaveRadiometer(Vector3D position, Orientation orientation, double frequency, double detectionTemperatureDifferenceThreshold)
|
||
: base(position, orientation)
|
||
{
|
||
Frequency = frequency;
|
||
DetectionTemperatureDifferenceThreshold = detectionTemperatureDifferenceThreshold;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新毫米波辐射计的状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">自上次更新以来的时间间隔</param>
|
||
public override void Update(double deltaTime)
|
||
{
|
||
// 实现毫米波辐射计的更新逻辑
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取毫米波辐射计的数据
|
||
/// </summary>
|
||
/// <returns>毫米波辐射计采集的数据</returns>
|
||
public override SensorData GetSensorData()
|
||
{
|
||
// 返回毫米波辐射计的数据
|
||
return new RadiometerSensorData();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 毫米波测高雷达类
|
||
/// </summary>
|
||
public class MillimeterWaveAltimeter : Sensor
|
||
{
|
||
private double currentAltitude;
|
||
|
||
private readonly TerminalSensitiveSubmunition submunition;
|
||
|
||
/// <summary>
|
||
/// 最大测量高度
|
||
/// </summary>
|
||
public double MaxAltitude { get; set; }
|
||
|
||
/// <summary>
|
||
/// 测量精度
|
||
/// </summary>
|
||
public double Accuracy { get; set; }
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
/// <param name="position">测高雷达的位置</param>
|
||
/// <param name="orientation">测高雷达的朝向</param>
|
||
/// <param name="maxAltitude">最大测量高度</param>
|
||
/// <param name="accuracy">测量精度</param>
|
||
public MillimeterWaveAltimeter(TerminalSensitiveSubmunition submunition, double maxAltitude, double accuracy)
|
||
: base(submunition.Position, submunition.Orientation)
|
||
{
|
||
MaxAltitude = maxAltitude;
|
||
Accuracy = accuracy;
|
||
currentAltitude = 0;
|
||
this.submunition = submunition;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新毫米波测高雷达的状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">自上次更新以来的时间间隔</param>
|
||
public override void Update(double deltaTime)
|
||
{
|
||
// 更新当前高度,考虑测量精度
|
||
currentAltitude = submunition.Position.Y + Accuracy * new Random().NextDouble();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取毫米波测高雷达的数据
|
||
/// </summary>
|
||
/// <returns>毫米波测高雷达采集的数据</returns>
|
||
public override SensorData GetSensorData()
|
||
{
|
||
// 返回毫米波测高雷达的数据
|
||
AltimeterSensorData altimeterSensorData = new AltimeterSensorData
|
||
{
|
||
Altitude = currentAltitude
|
||
};
|
||
return altimeterSensorData;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 激光测距仪类
|
||
/// </summary>
|
||
public class LaserRangefinder : Sensor
|
||
{
|
||
/// <summary>
|
||
/// 最大测量距离
|
||
/// </summary>
|
||
public double MaxRange { get; set; }
|
||
|
||
/// <summary>
|
||
/// 脉冲频率
|
||
/// </summary>
|
||
public double PulseRate { get; set; }
|
||
|
||
/// <summary>
|
||
/// 构造函数
|
||
/// </summary>
|
||
/// <param name="position">测距仪的位置</param>
|
||
/// <param name="orientation">测距仪的朝向</param>
|
||
/// <param name="maxRange">最大测量距离</param>
|
||
/// <param name="pulseRate">脉冲频率</param>
|
||
public LaserRangefinder(Vector3D position, Orientation orientation, double maxRange, double pulseRate)
|
||
: base(position, orientation)
|
||
{
|
||
MaxRange = maxRange;
|
||
PulseRate = pulseRate;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新激光测距仪的状态
|
||
/// </summary>
|
||
/// <param name="deltaTime">自上次更新以来的时间间隔</param>
|
||
public override void Update(double deltaTime)
|
||
{
|
||
// 实现激光测距仪的更新逻辑
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取激光测距仪的数据
|
||
/// </summary>
|
||
/// <returns>激光测距仪采集的数据</returns>
|
||
public override SensorData GetSensorData()
|
||
{
|
||
// 返回激光测距仪的数据
|
||
return new RangefinderSensorData();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 传感器数据的抽象基类
|
||
/// </summary>
|
||
public abstract class SensorData
|
||
{
|
||
/// <summary>
|
||
/// 数据采集的时间戳
|
||
/// </summary>
|
||
public DateTime Timestamp { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 红外传感器数据类
|
||
/// </summary>
|
||
public class InfraredSensorData : SensorData
|
||
{
|
||
/// <summary>
|
||
/// 探测到的温度
|
||
/// </summary>
|
||
public double Temperature { get; set; }
|
||
|
||
/// <summary>
|
||
/// 目标方向(如果检测到目标)
|
||
/// </summary>
|
||
public Vector3D? TargetDirection { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 辐射计传感器数据类
|
||
/// </summary>
|
||
public class RadiometerSensorData : SensorData
|
||
{
|
||
/// <summary>
|
||
/// 探测到的辐射强度
|
||
/// </summary>
|
||
public double RadiationIntensity { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 测高仪传感器数据类
|
||
/// </summary>
|
||
public class AltimeterSensorData : SensorData
|
||
{
|
||
/// <summary>
|
||
/// 测量的高度
|
||
/// </summary>
|
||
public double Altitude { get; set; }
|
||
}
|
||
|
||
/// <summary>
|
||
/// 测距仪传感器数据类
|
||
/// </summary>
|
||
public class RangefinderSensorData : SensorData
|
||
{
|
||
/// <summary>
|
||
/// 测量的距离
|
||
/// </summary>
|
||
public double Distance { get; set; }
|
||
}
|
||
}
|