106 lines
3.3 KiB
Markdown
106 lines
3.3 KiB
Markdown
|
||
# 实体设计
|
||
|
||
在仿真环境中,每个实体(如导弹)有几类参数:
|
||
|
||
1. 固有属性参数:如弹长、弹径、质量,最大速度、最大飞行距离、发动机推力等
|
||
2. 运行时状态参数:如当前位置、速度、朝向、加速度,接收的辐射能量、导引头视野中目标角度等
|
||
|
||
为了设计一个结构清晰的实体类,我们采用组合模式和接口分离原则。这样可以将不同类型的参数和状态分开管理,同时保持良好的扩展性。
|
||
|
||
## 基础接口
|
||
|
||
首先,我们定义几个基础接口来表示不同类型的参数:
|
||
|
||
```csharp
|
||
|
||
public interface IProperties
|
||
{
|
||
double Length { get; }
|
||
double Diameter { get; }
|
||
double Mass { get; }
|
||
}
|
||
|
||
public interface IState
|
||
{
|
||
Vector3 Position { get; set; }
|
||
Vector3 Velocity { get; set; }
|
||
Vector3 Acceleration { get; set; }
|
||
double Heading { get; set; }
|
||
double ReceivedRadiation { get; set; }
|
||
double TargetDeviation { get; set; }
|
||
}
|
||
|
||
```
|
||
|
||
## 实现类
|
||
|
||
然后,我们为每个接口创建实现类:
|
||
|
||
public class MissileProperties : IProperties
|
||
{
|
||
public double Length { get; }
|
||
public double Diameter { get; }
|
||
public double Mass { get; }
|
||
}
|
||
|
||
public class MissileState : IState
|
||
{
|
||
public Vector3 Position { get; set; }
|
||
public Vector3 Velocity { get; set; }
|
||
public Vector3 Acceleration { get; set; }
|
||
public double Heading { get; set; }
|
||
public double ReceivedRadiation { get; set; }
|
||
public double TargetDeviation { get; set; }
|
||
}
|
||
|
||
## 导弹实体类
|
||
|
||
接下来,我们创建一个导弹实体类,它将实现上述接口:
|
||
|
||
```csharp
|
||
public class Missile : IProperties, IState
|
||
{
|
||
public MissileProperties Properties { get; set; }
|
||
public MissileState State { get; set; }
|
||
|
||
public Missile()
|
||
{
|
||
Properties = new MissileProperties();
|
||
State = new MissileState();
|
||
}
|
||
|
||
// 其他方法,如更新状态、执行导航等
|
||
public void Update(double deltaTime)
|
||
{
|
||
// 更新运行时状态和导引参数
|
||
}
|
||
public void Navigate()
|
||
{
|
||
// 执行导航逻辑
|
||
}
|
||
|
||
}
|
||
|
||
```
|
||
|
||
## 设计优点
|
||
|
||
1. 清晰的结构:每种类型的参数或状态都有自己的接口和实现类,使得结构非常清晰。
|
||
2. 高度的模块化:可以轻松地替换或修改某一类参数,而不影响其他部分。
|
||
3. 易于扩展:如果需要添加新的参数类型,只需创建新的接口和实现类,然后在 Missile 类中添加相应的属性。
|
||
4. 符合单一职责原则:每个类都只负责一种类型的参数。
|
||
5. 便于测试:可以轻松地为每种参数类型创建模拟对象,便于单元测试。
|
||
6. 灵活性:可以为不同类型的导弹创建不同的参数实现,而保持相同的接口。
|
||
|
||
## 在激光驾束制导中, 为了实现更平滑的控制,同时将加速度控制在25 m/s²以下,并保持偏移在1.5米以内,我们可以采用以下几种方法
|
||
|
||
1. 使用PID控制器:
|
||
PID(比例-积分-微分)控制器可以提供更平滑和精确的控制。它考虑了误差的历史、当前值和变化率。
|
||
2. 非线性增益:
|
||
使用非线性函数来计算增益,使得在接近目标时增益减小,远离目标时增益增大。
|
||
3. 低通滤波:
|
||
对计算出的加速度进行低通滤波,以减少高频振荡。
|
||
4. 预测控制:
|
||
基于当前状态预测未来的位置,提前做出调整。
|