ThreatSourceLibaray/RcsPattern_TestFixes.md

117 lines
11 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.

# 上下文
文件名:[RcsPattern_TestFixes.md]
创建于:[2024-07-30 10:00:00]
创建者:[AI]
关联协议RIPER-5 + Multidimensional + Agent Protocol
# 任务描述
用户要求运行 RcsPatternTests 中的所有测试,并解决测试暴露出的问题。
# 项目概述
项目涉及雷达散射截面 (RCS) 的计算,特别是 `RcsPattern`该类根据观察者的角度或矢量确定RCS值。测试失败表明在特定视角尤其是顶部和某些边界角度的象限确定逻辑存在问题。
---
*以下部分由 AI 在协议执行过程中维护*
---
# 分析 (由 RESEARCH 模式填充)
测试结果显示 `RcsPatternTests` 中有8个失败
1. `GetRcsAngleBased_TopAspect_ReturnsCorrectQuadrantValue` (Top_Az-90_Q2): 期望Q2, 实际Q3。原因角度法中Top/Bottom的 `-90` 度方位角边界条件判断错误。
2. `GetRcsAngleBased_BottomAspect_ReturnsCorrectQuadrantValue` (Bottom_Az-90_Q2): 期望Q2, 实际Q3。原因同上。
3. `GetRcsAngleBased_BackAspect_ReturnsCorrectQuadrantValue` (Back_Az180_El30_Q0_TopRight): 期望Q0, 实际Q1。原因角度法中后部视角对 `180` 度处理与测试期望不一致,归一化后 `-180` 的区分处理存在问题。
4. `GetRcsVectorBased_TopAspect_ReturnsCorrectQuadrantValue` (VectorTop_NearFwdSlightRight_Q0): 期望Q0, 实际Q3。原因向量法中Top视角的 `isLocallyTopQuadrant` 定义与 `localUp` 轴 (-forwardNorm) 不一致,而是错误地使用了 `forwardNorm`
5. `GetRcsVectorBased_TopAspect_ReturnsCorrectQuadrantValue` (VectorTop_FwdLeft_Q0): 期望Q0, 实际Q3。原因同上。
6. `GetRcsVectorBased_TopAspect_ReturnsCorrectQuadrantValue` (VectorTop_FwdRight_Q1): 期望Q1, 实际Q2。原因同上。
7. `GetRcsVectorBased_TopAspect_ReturnsCorrectQuadrantValue` (VectorTop_BackRight_Q2): 期望Q2, 实际Q1。原因同上。
8. `GetRcsVectorBased_TopAspect_ReturnsCorrectQuadrantValue` (VectorTop_BackLeft_Q3): 期望Q3, 实际Q0。原因同上。
计划修复问题1, 2, 4, 5, 6, 7, 8。问题3暂时不直接修改观察前述修复效果。
# 提议的解决方案 (由 INNOVATE 模式填充)
1. **针对 `GetRcsValueDbSm(double azimuthDeg, double elevationDeg)` (角度版本):**
* 对于 Top/Bottom 视角,修改 `azimuthDeg = -90` 的象限判断条件,从 `normalizedAzimuthDeg >= -90` 改为 `normalizedAzimuthDeg > -90`,使其落入正确的象限。
2. **针对 `GetRcsValueDbSm(Vector3D observerDirectionInTargetFrame, ...)` (矢量版本):**
* 对于 Top/Bottom 视角,修改 `isLocallyTopQuadrant` 的计算,使其使用在主方向确定步骤中定义的 `localUp` 向量 (对于Top是 `-forwardNorm`对于Bottom是 `forwardNorm`),而不是固定的 `forwardNorm`
# 实施计划 (由 PLAN 模式生成)
实施检查清单:
1. **修改 `GetRcsValueDbSm(double azimuthDeg, double elevationDeg)` 方法中 Top/Bottom 视角的象限确定逻辑:**
* 文件: `ThreatSource/src/Equipment/RcsPattern.cs`
* 目的: 修正 `azimuthDeg = -90` 时 Top 和 Bottom 视角的象限计算错误。
* 具体操作: 在 `if (normalizedElevationDeg > 70)``else if (normalizedElevationDeg < -70)` 的代码块中,将条件 `else if (normalizedAzimuthDeg < 0 && normalizedAzimuthDeg >= -90)` 修改为 `else if (normalizedAzimuthDeg < 0 && normalizedAzimuthDeg > -90)`
2. **修改 `GetRcsValueDbSm(Vector3D observerDirectionInTargetFrame, ...)` 方法中 `isLocallyTopQuadrant` 的确定逻辑 (针对 Top/Bottom 视角):**
* 文件: `ThreatSource/src/Equipment/RcsPattern.cs`
* 目的: 修正 Top 视角下使用矢量输入时所有象限计算错误,使其与局部坐标轴定义一致。
* 具体操作: 在该方法的步骤 4 中,当 `majorAspectRow == 4 || majorAspectRow == 5` (Top 或 Bottom 视角) 时,将 `isLocallyTopQuadrant` 的计算从 `Vector3D.DotProduct(observerDirNorm, forwardNorm) >= 0;` 修改为 `isLocallyTopQuadrant = Vector3D.DotProduct(observerDirNorm, localUp) >= 0;`
# 当前执行步骤 (由 EXECUTE 模式在开始执行某步骤时更新)
> 正在执行: "关于坐标系问题的分析和文档记录已完成。准备进入 REVIEW 阶段。"
# 任务进度 (由 EXECUTE 模式在每步完成后追加)
* [2024-07-30 10:00:01]
* 步骤:[1. 修改 GetRcsValueDbSm(double azimuthDeg, double elevationDeg) 方法中 Top/Bottom 视角的象限确定逻辑]
* 修改:
* `ThreatSource/src/Equipment/RcsPattern.cs`:
*`if (normalizedElevationDeg > 70)` 代码块 (Top aspect) 中,将 `else if (normalizedAzimuthDeg < 0 && normalizedAzimuthDeg >= -90)` 修改为 `else if (normalizedAzimuthDeg < 0 && normalizedAzimuthDeg > -90)`.
*`else if (normalizedElevationDeg < -70)` 代码块 (Bottom aspect) 中,将 `else if (normalizedAzimuthDeg < 0 && normalizedAzimuthDeg >= -90)` 修改为 `else if (normalizedAzimuthDeg < 0 && normalizedAzimuthDeg > -90)`.
* 更改摘要调整了基于角度的RCS获取方法中Top/Bottom视角的象限确定条件以正确处理-90度方位角的情况。
* 原因:执行计划步骤 [1]
* 阻碍:无
* 用户确认状态:[成功 - 基于后续测试结果推断]
* [2024-07-30 10:00:02]
* 步骤:[2. 修改 GetRcsValueDbSm(Vector3D observerDirectionInTargetFrame, ...) 方法中 isLocallyTopQuadrant 的确定逻辑 (针对 Top/Bottom 视角)]
* 修改:
* `ThreatSource/src/Equipment/RcsPattern.cs`:
*`GetRcsValueDbSm(Vector3D ...)` 方法的步骤 4 中,当 `majorAspectRow == 4 || majorAspectRow == 5` 时,将 `isLocallyTopQuadrant = Vector3D.DotProduct(observerDirNorm, forwardNorm) >= 0;` 修改为 `isLocallyTopQuadrant = Vector3D.DotProduct(observerDirNorm, localUp) >= 0;`.
* 更改摘要修正了基于矢量的RCS获取方法中Top/Bottom视角的 `isLocallyTopQuadrant` 判断逻辑,使其与局部坐标轴定义一致。
* 原因:执行计划步骤 [2]
* 阻碍:无
* 用户确认状态:[成功 - 基于后续测试结果推断]
* [2024-07-30 10:00:03]
* 步骤:[3. 修改 Back_Az180_El30_Q0_TopRight 测试用例的期望值 (方案1)]
* 修改:
* `ThreatSource.Tests/src/Equipment/RcsPatternTests.cs`:
*`[DataRow(180.0, 30.0, 0, DisplayName = "Back_Az180_El30_Q0_TopRight")]` 修改为 `[DataRow(180.0, 30.0, 1, DisplayName = "Back_Az180_El30_Q0_TopRight")]`.
* 更改摘要调整了特定测试用例的期望象限以匹配代码在180度方位角简化处理逻辑下的行为。
* 原因用户选择方案1处理剩余的测试失败。
* 阻碍:无
* 用户确认状态:[成功 - 基于最终测试结果推断]
* [2024-07-30 10:00:04]
* 步骤:[1. 更新任务文件 RcsPattern_TestFixes.md 以包含坐标系讨论的摘要。]
* 修改:
* `RcsPattern_TestFixes.md`:
* 追加了 ## 关于坐标系的讨论 部分总结了RcsPattern类与坐标系局部与世界相关的行为和依赖关系。
* 更改摘要:记录了用户关于坐标系问题的提问以及对此的分析结论。
* 原因:执行计划步骤 [1]
* 阻碍:无
* 用户确认状态:[待确认]
# 最终审查 (由 REVIEW 模式填充)
实施与最终计划包含用户选择的方案1来调整测试用例完全匹配。具体如下
1. **`GetRcsValueDbSm(double azimuthDeg, double elevationDeg)` 方法修改**: Top/Bottom 视角中针对 `-90` 度方位角的象限条件调整正确,符合计划,对应测试已通过。
2. **`GetRcsValueDbSm(Vector3D ...)` 方法修改**: Top/Bottom 视角中 `isLocallyTopQuadrant` 的计算已修正为使用正确的 `localUp` 向量,符合计划,对应测试已通过。
3. **测试用例 `Back_Az180_El30_Q0_TopRight` 修改**: 测试期望值已按照用户选择的方案1从 `0` 调整为 `1`,符合计划,对应测试已通过。
所有先前失败的测试现在均已通过。未发现与计划存在未报告的偏差。
**针对坐标系问题的补充审查 (2024-07-30):**
用户提出的关于坐标系使用的问题RcsPattern 是否使用世界坐标系)已得到解答。分析表明 `RcsPattern` 在目标局部坐标系下工作,不直接依赖世界坐标系。相应的分析和结论已作为补充信息记录在本文档的 `## 关于坐标系的讨论` 部分。此文档更新操作符合计划,内容准确。没有引入新的代码更改或偏差。
## 关于坐标系的讨论 (用户提问 - 2024-07-30)
用户提问:项目使用的坐标系是右手坐标系,+Y 轴向上。RCS 处理的过程中,有使用到世界坐标系吗?
**结论与分析摘要:**
1. **`RcsPattern` 类主要在目标自身(局部)坐标系下运作。** 它不直接与外部的世界坐标系交互或依赖其特定定义(如右手,+Y向上
2. 向量输入方法 `GetRcsValueDbSm(Vector3D observerDirectionInTargetFrame, Vector3D targetForwardVectorInTargetFrame, ...)` 的参数(如 `observerDirectionInTargetFrame` 和目标轴向量)明确要求是在**目标局部坐标系**中定义的。
3. 角度输入方法 `GetRcsValueDbSm(double azimuthDeg, double elevationDeg)` 中的方位角和俯仰角也是相对于**目标自身的参考轴**(如"全局前方参考线"和"全局水平面")定义的,这里的"全局"是指目标级的参考,而非世界坐标系。
4. **世界坐标系的角色**:调用 `RcsPattern` 的外部代码(即您的项目代码)负责处理从世界坐标系到目标局部坐标系的转换。这包括:
* 确定目标在世界坐标系中的姿态(旋转)。
* 计算观察者相对于目标的方向(可能先在世界坐标系中计算)。
* 将此观察方向向量从世界坐标系转换到目标局部坐标系中,然后传递给 `RcsPattern`
* 定义目标自身的 `Forward`、`Up`、`Right` 向量时,需要考虑目标模型本身的轴定义以及其在世界中的姿态,最终得到在目标局部坐标系下表示这些轴的向量(通常是单位向量,如 `(1,0,0)` 等,具体取决于局部坐标系的选取)。
5. **项目坐标系约定 (+Y 向上)**:这个约定主要影响您的项目代码如何进行上述的世界坐标到目标局部坐标的转换,以及如何定义目标的标准姿态或局部轴向。`RcsPattern` 类本身会正确处理您以其参数形式提供的任何(有效的)目标局部坐标系定义。
6. **无需修改 `RcsPattern`**:基于以上分析,`RcsPattern` 类的当前设计是合理的,不需要修改来"适应"特定的世界坐标系。关键在于调用方正确提供目标局部坐标系下的输入。