✨ feat(*): 添加触发样本偏移与实发轨迹分析导出
* 为 RobotConfig 增加 trigger_sample_index_offset_cycles 配置 * 让 DO 事件携带示教点关节角并按最接近 sample 绑定触发 * 调整运行时 IO 地址位掩码映射并补充 ShotEvents 导出 * 新增 2026042802-1 抓包分析脚本、数据产物与结论文档 * 补齐配置兼容、规划绑定和运行时触发相关测试
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
using System.Text.Json;
|
||||
using Flyshot.Core.Domain;
|
||||
using Flyshot.Core.Planning.Sampling;
|
||||
|
||||
namespace Flyshot.Core.Tests;
|
||||
|
||||
@@ -164,7 +165,8 @@ public sealed class DomainModelTests
|
||||
triggerTime: 0.5,
|
||||
offsetCycles: 0,
|
||||
holdCycles: 1,
|
||||
addressGroup: new IoAddressGroup(new[] { 100 }))
|
||||
addressGroup: new IoAddressGroup(new[] { 100 }),
|
||||
referenceJointsDegrees: new[] { 12.5, -3.0 })
|
||||
},
|
||||
artifacts: new[]
|
||||
{
|
||||
@@ -176,7 +178,8 @@ public sealed class DomainModelTests
|
||||
failureReason: null,
|
||||
usedCache: true,
|
||||
originalWaypointCount: 4,
|
||||
plannedWaypointCount: 5);
|
||||
plannedWaypointCount: 5,
|
||||
triggerSampleIndexOffsetCycles: 7);
|
||||
|
||||
var json = JsonSerializer.Serialize(result);
|
||||
|
||||
@@ -184,6 +187,36 @@ public sealed class DomainModelTests
|
||||
Assert.Contains("\"method\":\"SelfAdaptIcsp\"", json);
|
||||
Assert.Contains("\"kind\":\"JointDenseTrajectory\"", json);
|
||||
Assert.Contains("\"usedCache\":true", json);
|
||||
Assert.Contains("\"triggerSampleIndexOffsetCycles\":7", json);
|
||||
Assert.Contains("\"referenceJointsDegrees\":[12.5,-3]", json);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 验证触发绑定允许在最佳 sample 基础上继续向后偏移固定命令周期。
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void TriggerSampleBinder_Bind_AppliesConfiguredSampleIndexOffset()
|
||||
{
|
||||
var trigger = new TrajectoryDoEvent(
|
||||
waypointIndex: 1,
|
||||
triggerTime: 0.008,
|
||||
offsetCycles: 0,
|
||||
holdCycles: 2,
|
||||
addressGroup: new IoAddressGroup([2, 4]),
|
||||
referenceJointsDegrees: [10.0, 20.0]);
|
||||
var samples = new[]
|
||||
{
|
||||
new J519SendSample(sampleIndex: 0, sendTime: 0.0, trajectoryTime: 0.0, speedRatio: 1.0, jointsDegrees: [0.0, 0.0]),
|
||||
new J519SendSample(sampleIndex: 1, sendTime: 0.008, trajectoryTime: 0.008, speedRatio: 1.0, jointsDegrees: [10.0, 20.0]),
|
||||
new J519SendSample(sampleIndex: 2, sendTime: 0.016, trajectoryTime: 0.016, speedRatio: 1.0, jointsDegrees: [11.0, 21.0]),
|
||||
new J519SendSample(sampleIndex: 3, sendTime: 0.024, trajectoryTime: 0.024, speedRatio: 1.0, jointsDegrees: [12.0, 22.0])
|
||||
};
|
||||
|
||||
var binding = Assert.Single(Flyshot.Core.Planning.Sampling.TriggerSampleBinder.Bind([trigger], samples, sampleIndexOffsetCycles: 2));
|
||||
|
||||
Assert.True(binding.FoundInWindow);
|
||||
Assert.Equal(3, binding.SampleIndex);
|
||||
Assert.Equal(0.024, binding.Sample.SendTime, precision: 6);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user