添加差速舵轮旋转中心前馈与遥控器模式防抖,并补充ParkingRobot解决方案
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -67,6 +67,8 @@ namespace MedullaAdapter
|
||||
[AsInitParam(desc = "MCU端口号")] public string MCUPort = "COM4";
|
||||
[AsInitParam(desc = "遥控器速度上限")] public float TransmitterSpeedUpperLimit = 1.0f;
|
||||
[AsInitParam(desc = "遥控器速度下限")] public float TransmitterSpeedLowerLimit = 0.0f;
|
||||
[AsInitParam(desc = "实体遥控器SB模式防抖时间,单位ms")]
|
||||
public int TransmitterModeDebounceMilliseconds = 200;
|
||||
[AsInitParam(desc = "手动控制夹臂速度系数")] public float ManualArmSpeedFac = 1.0f;
|
||||
[AsInitParam(desc = "遥控转弯舵角同步限速宽度,单位为度")]
|
||||
public float ManualSteeringAlignmentSigmaDegrees = 8.0f;
|
||||
|
||||
@@ -11,6 +11,10 @@ namespace MedullaAdapter
|
||||
{
|
||||
private bool _wasTransmitterControlling;
|
||||
private DateTime _lastMoveTime = DateTime.Now;
|
||||
private DiverCartDefinition.ManualControlMode?
|
||||
_pendingTransmitterControlMode;
|
||||
private DateTime _pendingTransmitterControlModeSince =
|
||||
DateTime.MinValue;
|
||||
public override void Operation(int iteration)
|
||||
{
|
||||
if (!cart.GhostMode && cart.State == -1) return;
|
||||
@@ -68,33 +72,81 @@ namespace MedullaAdapter
|
||||
// 更新红黄绿灯状态。
|
||||
UpdateLightMode();
|
||||
}
|
||||
// M层物理遥控器:只有SB档位连续稳定指定时间后才确认模式切换。
|
||||
private bool TryGetStableTransmitterControlMode(
|
||||
out DiverCartDefinition.ManualControlMode stableMode)
|
||||
{
|
||||
stableMode = cart.TransmitterControlMode;
|
||||
|
||||
DiverCartDefinition.ManualControlMode? requestedMode;
|
||||
|
||||
switch (cart.Transmitter_SB)
|
||||
{
|
||||
case TransmitterState.Mode0:
|
||||
requestedMode =
|
||||
DiverCartDefinition.ManualControlMode.Normal;
|
||||
break;
|
||||
|
||||
case TransmitterState.Mode1:
|
||||
requestedMode =
|
||||
DiverCartDefinition.ManualControlMode.Crab;
|
||||
break;
|
||||
|
||||
case TransmitterState.Mode2:
|
||||
requestedMode =
|
||||
DiverCartDefinition.ManualControlMode.Spin;
|
||||
break;
|
||||
|
||||
default:
|
||||
_pendingTransmitterControlMode = null;
|
||||
_pendingTransmitterControlModeSince =
|
||||
DateTime.MinValue;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_pendingTransmitterControlMode != requestedMode)
|
||||
{
|
||||
_pendingTransmitterControlMode = requestedMode;
|
||||
_pendingTransmitterControlModeSince = DateTime.Now;
|
||||
return false;
|
||||
}
|
||||
|
||||
var debounceMilliseconds = Math.Max(
|
||||
0,
|
||||
cart.TransmitterModeDebounceMilliseconds);
|
||||
|
||||
if ((DateTime.Now -
|
||||
_pendingTransmitterControlModeSince)
|
||||
.TotalMilliseconds < debounceMilliseconds)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
stableMode = requestedMode.Value;
|
||||
return true;
|
||||
}
|
||||
|
||||
// 物理遥控器设置
|
||||
public void TransmitterChassisControl()
|
||||
{
|
||||
var interval = DateTime.Now - cart.TransmitterLastTime;
|
||||
switch (cart.Transmitter_SB)
|
||||
|
||||
if (!TryGetStableTransmitterControlMode(
|
||||
out var stableControlMode))
|
||||
{
|
||||
case TransmitterState.Mode0:
|
||||
cart.TransmitterControlMode =
|
||||
DiverCartDefinition.ManualControlMode.Normal;
|
||||
break;
|
||||
case TransmitterState.Mode1:
|
||||
cart.TransmitterControlMode =
|
||||
DiverCartDefinition.ManualControlMode.Crab;
|
||||
break;
|
||||
case TransmitterState.Mode2:
|
||||
cart.TransmitterControlMode =
|
||||
DiverCartDefinition.ManualControlMode.Spin;
|
||||
break;
|
||||
default:
|
||||
cart.ManualControl(
|
||||
cart.TransmitterControlMode,
|
||||
0, 0, 0,
|
||||
cart.TransmitterSpeed,
|
||||
interval);
|
||||
StopClampArms();
|
||||
return;
|
||||
// SB处于中间档或尚未稳定时立即停车,
|
||||
// 保持当前模式,不下发新的模式目标角。
|
||||
cart.ManualControl(
|
||||
cart.TransmitterControlMode,
|
||||
0, 0, 0,
|
||||
cart.TransmitterSpeed,
|
||||
interval);
|
||||
StopClampArms();
|
||||
return;
|
||||
}
|
||||
|
||||
cart.TransmitterControlMode = stableControlMode;
|
||||
|
||||
// SA关闭后立即停车。
|
||||
if (!cart.Transmitter_SA)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user