Simplify fleet curve configuration

This commit is contained in:
2026-07-07 20:44:43 +08:00
parent 0d44fb8fde
commit 381ae3de76
7 changed files with 27 additions and 38 deletions
+4 -5
View File
@@ -452,12 +452,12 @@ namespace MultiWheelC
}
track.Speed = speed;
track.CarDirectionBias = PilotDefinition.Conf.FleetCurveCarDirectionBias;
track.CarDirectionBias = 0f;
DLog.Log(
$"call FleetCurveWalk(src=({srcX:0},{srcY:0},id:{srcId}), dst=({dstX:0},{dstY:0},id:{dstId}), " +
$"speed={speed:0.000}, trackType={trackType}, controls={controlPointNum}, track={track.GetType().Name}, " +
$"carDirectionBias={PilotDefinition.Conf.FleetCurveCarDirectionBias:0.0})",
$"carDirectionBias=0.0)",
"FleetCurveDbg");
if (dstId != -1)
@@ -473,8 +473,7 @@ namespace MultiWheelC
{
Track = track,
CurveSpeed = speed,
CarDirectionBias = PilotDefinition.Conf.FleetCurveCarDirectionBias,
BezierResolution = PilotDefinition.Conf.FleetCurveBezierResolution,
CarDirectionBias = 0f,
SlowDistance = PilotDefinition.Conf.FleetCurveSlowDistance,
FinishDistance = PilotDefinition.Conf.FleetCurveFinishDistance,
FinishSpeed = PilotDefinition.Conf.FleetCurveFinishSpeed,
@@ -492,7 +491,7 @@ namespace MultiWheelC
if (srcId != -1)
{
Leave(srcId);
DLog.Log($"閲婃斁鏀捐溅鐐箋srcId}", "FleetCurveDbg");
DLog.Log($"release srcId={srcId}", "FleetCurveDbg");
}
}
}
+1 -3
View File
@@ -287,9 +287,7 @@ public class FleetCrabWalk : MovementDefinition
"FleetCrabDbg");
var gcpLimit = Math.Max(1f, Math.Abs(GcpThetaThreshold));
var controlRadius = Math.Max(1f, Math.Abs(conf.MultiVehicleControlRadius > 0
? conf.MultiVehicleControlRadius
: conf.TestCarSyncDistance / 2f));
var controlRadius = Math.Max(1f, Math.Abs(conf.TestCarSyncDistance) / 2f);
ResolveCrabDriveEquivalent(0f, (float)CommonMath.ThDiff(phi, theta),
(float)CommonMath.ThDiff(phi, theta), gcpLimit, out _, out var holdFrontTh, out var holdRearTh,
out _, out _);
+1 -3
View File
@@ -289,9 +289,7 @@ public class FleetCurveWalk : MovementDefinition
var resolution = Math.Max(2, BezierResolution);
var speedFinish = Math.Min(baseSpeed, Math.Abs(FinishSpeed));
var gcpLimit = Math.Max(1f, Math.Abs(GcpThetaThreshold));
var controlRadius = Math.Max(1f, Math.Abs(conf.MultiVehicleControlRadius > 0
? conf.MultiVehicleControlRadius
: conf.TestCarSyncDistance / 2f));
var controlRadius = Math.Max(1f, Math.Abs(conf.TestCarSyncDistance) / 2f);
ApplyFleetControlPointRadius(chassis, controlRadius);
+15 -10
View File
@@ -9,6 +9,7 @@ using CommonUsage.Chassis;
using CommonUsage.Mathematics;
using MDCSToolBox.Clumsy.Movements;
using MDCSToolBox.Clumsy.Pilot;
using MDCSToolBox.Clumsy.Tracks;
namespace MultiWheelC;
@@ -441,21 +442,25 @@ public class FleetCurveWalkTest : MovementTest
return;
}
if (!FleetCurveWalk.TryParsePointList(PilotDefinition.Conf.FleetCurveControlPoints,
out var relativePoints, out var error))
var pointCount = Math.Max(3, PilotDefinition.Conf.FleetCurveTestControlPointCount);
var controlPoints = new List<Vector2>();
for (var i = 0; i < pointCount; i++)
controlPoints.Add(UI.GetPoint($"FleetCurve point {i + 1}/{pointCount}"));
var fleetCenter = new Vector2(x, y);
if (Vector2.Distance(fleetCenter, controlPoints[0]) >
Vector2.Distance(fleetCenter, controlPoints[controlPoints.Count - 1]))
controlPoints.Reverse();
var track = new BezierTrack(controlPoints)
{
DLog.Log($"FleetCurveWalkTest abort: {error}", "FleetCurveDbg");
Hedingben.ToastText(error, "FleetCurve");
return;
}
Speed = PilotDefinition.Conf.FleetCurveSpeed,
CarDirectionBias = 0f
};
var controlPoints = FleetCurveWalk.BuildRelativeControlPoints(new Vector2(x, y), th, relativePoints);
_proc = new FleetCurveWalk
{
ControlPoints = controlPoints,
Track = track,
CurveSpeed = PilotDefinition.Conf.FleetCurveSpeed,
CarDirectionBias = PilotDefinition.Conf.FleetCurveCarDirectionBias,
BezierResolution = PilotDefinition.Conf.FleetCurveBezierResolution,
CarDirectionBias = 0f,
SlowDistance = PilotDefinition.Conf.FleetCurveSlowDistance,
FinishDistance = PilotDefinition.Conf.FleetCurveFinishDistance,
FinishSpeed = PilotDefinition.Conf.FleetCurveFinishSpeed,
+2 -11
View File
@@ -46,9 +46,6 @@ public class PilotConfig : MultiWheelPilotConfig
[FieldMember(desc = "多车联动:启用互识别纠正")] public bool MultiVehicleUseDetect = false;
// E: 编队控制点半径(mm)。0 表示自动取 syncDistance/2(与 SetOriginBias 几何一致),>0 时按本值固定。
// 取代历史硬编码 510,避免改间距后控制点半径不跟随导致转向/补偿几何错位。
[FieldMember(desc = "多车联动:控制点半径(mm0=syncDistance/2)")] public float MultiVehicleControlRadius = 0f;
// B: 自动速度命令新鲜度(ms)。主车超过此时长未从路径控制器收到新速度命令(路径结束/早退/卡顿),
// 即视为失效并清零下发速度,避免车队按末速度滑行。0 表示自动取 max(200, interval*4)。
[FieldMember(desc = "多车联动:自动速度命令超时(ms0=auto)")] public int MultiVehicleAutoCmdTimeoutMs = 0;
@@ -204,18 +201,12 @@ public class PilotConfig : MultiWheelPilotConfig
public float FleetCrabStartWheelAlignDeg = 2f;
// ===== Fleet linked Bezier curve walk =====
[FieldMember(desc = "FleetCurve MovementTest control points relative to fleet start; format x,y;x,y;...")]
public string FleetCurveControlPoints = "0,0;1000,800;2000,800;3000,0";
[FieldMember(desc = "FleetCurve Bezier resolution")]
public int FleetCurveBezierResolution = 100;
[FieldMember(desc = "FleetCurve MovementTest Bezier control point count")]
public int FleetCurveTestControlPointCount = 4;
[FieldMember(desc = "FleetCurve speed(m/s)")]
public float FleetCurveSpeed = 0.2f;
[FieldMember(desc = "FleetCurve car direction bias(deg); body target follows tangent+bias")]
public float FleetCurveCarDirectionBias = 0f;
[FieldMember(desc = "FleetCurve slow distance(mm)")]
public float FleetCurveSlowDistance = 2000f;
+2 -4
View File
@@ -1098,10 +1098,8 @@ public class PilotDefinition : MultiWheelPilotDefinition<PilotConfig, PilotDefin
if (fleetReady && !fleetStopActive)
{
chassis.SetOriginBias(layoutX, layoutY, layoutTh);
// E: 统一控制点半径——配置 >0 用配置值,否则取 syncDistance/2与编队几何一致),不再硬编码 510
var controlRadius = Conf.MultiVehicleControlRadius > 0
? Conf.MultiVehicleControlRadius
: syncDistance / 2f;
// E: 统一控制点半径取 syncDistance/2与编队几何一致。
var controlRadius = syncDistance / 2f;
chassis.ControlPointRadius = controlRadius;
// #1 纠偏随旋转缩放:把每轮纠偏钳到旋转切向的比例,减速末段切向变小时纠偏同步缩小,杜绝轮向乱摆。
chassis.RotateCompTangentFrac = rotateParams.CompTangentFrac;