Update fleet manual remote scaling

This commit is contained in:
2026-07-15 14:01:46 +08:00
parent 68dd6fc061
commit 2ade94f196
8 changed files with 83 additions and 160 deletions
+9 -6
View File
@@ -89,22 +89,25 @@ public partial class CartDefinition : CartActivator.CartDefinition
[AsLowerIO(desc = "(手动)多车联动模式")]
public int MultiVehicleManualMode;
[AsLowerIO(desc = "多车联动:遥控器Vx")]
[AsLowerIO(desc = "多车联动:遥控器Vx比例")]
public float MultiVehicleManualVx;
[AsLowerIO(desc = "多车联动:遥控器Vy")]
[AsLowerIO(desc = "多车联动:遥控器Vy比例")]
public float MultiVehicleManualVy;
[AsLowerIO(desc = "多车联动:遥控器Vth")]
[AsLowerIO(desc = "多车联动:遥控器Vth比例")]
public float MultiVehicleManualVth;
[AsInitParam(desc = "手动最大速度(m/s)")]
[AsLowerIO(desc = "多车联动:遥控暂停")]
public bool MultiVehicleHold;
[AsInitParam(desc = "普通手动最大速度(m/s),车队联动不使用")]
public float MaxManualSpeed = 0.3f;
[AsInitParam(desc = "手动最大自旋角速度(deg/s)")]
[AsInitParam(desc = "普通手动最大自旋角速度(deg/s),车队联动不使用")]
public float MaxManualAngularSpeed = 45f;
[AsInitParam(desc = "手动最大转向角度(deg)")]
[AsInitParam(desc = "普通手动最大转向角度(deg),车队联动不使用")]
public float MaxManualTheta = 45f;
[AsInitParam(desc = "遥控转向输入幂数")]
+9 -24
View File
@@ -26,6 +26,7 @@ public partial class CartDefinition
MultiVehicleManualVx = 0;
MultiVehicleManualVy = 0;
MultiVehicleManualVth = 0;
MultiVehicleHold = false;
}
[IOObjectUtility]
@@ -43,7 +44,6 @@ public partial class CartDefinition
var crabOn = false; // 蟹行(四轮同向平移)
var rotateOn = false; // 原地旋转(绕车队中心)
// 速度比例 0~1,作用于摇杆输出的线速度/横移/角速度。
var speedRatio = 1f;
UseGesture? manip = null;
// 0=常规(前进+转向) 1=蟹行 2=原地旋转。crab 优先于 rotate(同时打开时蟹行生效)。
@@ -87,7 +87,6 @@ public partial class CartDefinition
return;
}
var ratio = Math.Clamp(speedRatio, 0, 1);
var px = Math.Clamp(pos.X, -1, 1);
var py = Math.Clamp(pos.Y, -1, 1);
var mode = CurrentMode();
@@ -95,31 +94,27 @@ public partial class CartDefinition
if (mode == 2)
{
// 原地旋转:pos.X(左右) → 角速度(deg/s),绕车队中心。
MultiVehicleManualVx = 0;
MultiVehicleManualVy = 0;
MultiVehicleManualVth = px * MaxManualAngularSpeed * ratio;
MultiVehicleManualVth = px;
}
else if (mode == 1)
{
// 蟹行:pos.Y → 前后向线速度,pos.X → 横向线速度(m/s)。
MultiVehicleManualVx = py * MaxManualSpeed * ratio;
MultiVehicleManualVy = px * MaxManualSpeed * ratio;
MultiVehicleManualVx = py;
MultiVehicleManualVy = px;
MultiVehicleManualVth = 0;
}
else
{
// 常规:pos.Y → 线速度(m/s)pos.X → 转向角(deg)。
MultiVehicleManualVx = py * MaxManualSpeed * ratio;
MultiVehicleManualVx = py;
MultiVehicleManualVy = 0;
MultiVehicleManualVth = px * MaxManualAngularSpeed * ratio;
MultiVehicleManualVth = px;
}
if ((DateTime.Now - _fleetDiagLastStick).TotalMilliseconds >= 200)
{
_fleetDiagLastStick = DateTime.Now;
FleetDiag($"STICK mode={mode} pos=({pos.X:0.00},{pos.Y:0.00}) manip={manipulating} ratio={ratio:0.00} " +
$"-> Vx={MultiVehicleManualVx:0.000} Vy={MultiVehicleManualVy:0.000} Vth={MultiVehicleManualVth:0.0} en={MultiVehicleManualEnabled}");
FleetDiag($"STICK mode={mode} pos=({pos.X:0.00},{pos.Y:0.00}) manip={manipulating} raw " +
$"-> Vx={MultiVehicleManualVx:0.000} Vy={MultiVehicleManualVy:0.000} Vth={MultiVehicleManualVth:0.000} en={MultiVehicleManualEnabled}");
}
}
});
@@ -169,15 +164,6 @@ public partial class CartDefinition
}
});
manip.AddWidget(new UseGesture.ThrottleWidget
{
name = "fleet_speed_ratio",
text = "速度比例",
position = "50%+10px, 64%+10px",
size = "37.5%-10px, 10%-10px",
bounceBack = false,
OnValue = (val, _) => speedRatio = Math.Clamp(val, 0, 1)
});
manip.AddWidget(new UseGesture.ButtonWidget
{
@@ -218,8 +204,7 @@ public partial class CartDefinition
pb.SeparatorText("状态");
var modeName = MultiVehicleManualMode == 2 ? "原地旋转" : MultiVehicleManualMode == 1 ? "蟹行" : "常规";
pb.Label($"车队联动: {MultiVehicleManualEnabled} 模式: {modeName}");
pb.Label($"速度比例: {speedRatio:0.00}");
pb.Label($"Vx={MultiVehicleManualVx:0.000} Vy={MultiVehicleManualVy:0.000} m/s, Vth={MultiVehicleManualVth:0.0}");
pb.Label($"VxRatio={MultiVehicleManualVx:0.000} VyRatio={MultiVehicleManualVy:0.000}, VthRatio={MultiVehicleManualVth:0.000}");
pb.Label($"优先级: {CartActivator.CartDefinition.currentPriority} ({CartActivator.CartDefinition.currentPriorityDesc})");
pb.Label("请勿同时打开「手动控制」面板");
pb.Panel.Repaint();