ActiveProtect/Models/Sensors.cs

367 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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; }
}
}