namespace RobotNet10.RobotApp.Services.Navigation.CSharp; public enum ApproachResult { /// /// Approach waypoints đã sinh và prepend thành công /// ApproachGenerated, /// /// Robot đã trên path, không cần approach /// AlreadyOnPath, /// /// Robot quá xa path, fallback Rotate cũ /// TooFarFromPath, /// /// LocalPlanner tắt hoặc path quá ngắn /// Disabled } public class LocalPlannerConfig { /// /// Bật/tắt Local Planner /// public bool Enabled { get; set; } = true; /// /// Khoảng cách dưới mức này coi robot đã trên path, không cần approach (m) /// public double OnPathThreshold { get; set; } = 0.3; /// /// Khoảng cách trên mức này thì fallback Rotate cũ (m) /// public double MaxApproachDistance { get; set; } = 3.0; /// /// Hệ số tính merge distance: mergeDistance = MergeDistanceGain × distToPath /// public double MergeDistanceGain { get; set; } = 2.0; /// /// Merge distance tối thiểu (m) /// public double MergeDistanceMin { get; set; } = 0.3; /// /// Merge distance tối đa (m) /// public double MergeDistanceMax { get; set; } = 2.0; /// /// Tỷ lệ control arm phía robot (P1): d1 = ratio × dist(P0, P3) /// public double ControlArmRatioStart { get; set; } = 0.4; /// /// Tỷ lệ control arm phía path (P2): d2 = ratio × dist(P0, P3) /// public double ControlArmRatioEnd { get; set; } = 0.4; /// /// Bước sample approach curve (m), nên giống PurePursuitConfig.ResolutionSplit /// public double ResolutionSplit { get; set; } = 0.05; }