ActiveProtect/DesignMissile.md

106 lines
3.3 KiB
Markdown
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.

# 实体设计
在仿真环境中,每个实体(如导弹)有几类参数:
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. 预测控制:
基于当前状态预测未来的位置,提前做出调整。