using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Numerics; using System.Security.Cryptography.X509Certificates; using System.Text; using FundamentalLib; using Newtonsoft.Json; namespace CommonUsage.Chassis { public abstract class AbstractChassis { protected AbstractChassis() { Valid = false; } public abstract void Initialize(); public abstract void Visualize(); public abstract void AfterDirectionChanged(); /// /// 当前行进方向。 /// [Obsolete] public float DirectionAngle { get => _originBiasTh; set { _originBiasTh = value; if (_originBiasTh != _lastDirectionAngle) AfterDirectionChanged(); _lastDirectionAngle = _originBiasTh; } } protected float _originBiasX = 0f, _originBiasY = 0f, _originBiasTh; public Vector3 GetOriginBias() { return new Vector3(_originBiasX, _originBiasY, _originBiasTh); } public class CarSpeed { public float Vx,Vy,Vw; } public abstract CarSpeed GetCarSpeed(bool isActual = false); public List GetGeometricControlPoints() { return GeometricControlPoints; } public void ComputeWheelsGeometrically(float speed) { // 打印调用位置信息 var stackTrace = new StackTrace(true); var callerFrame = stackTrace.GetFrame(1); // 获取调用者的帧 if (callerFrame != null) { var fileName = callerFrame.GetFileName(); var lineNumber = callerFrame.GetFileLineNumber(); DLog.Log($"s:{speed:0.000} from {fileName} ln.{lineNumber}", $"WheelComputeCaller"); } DefineGeometricWheelComputation(speed); } protected abstract void DefineGeometricWheelComputation(float speed); public void DriveStop() { PredefinedDriveStop(); CustomDriveStop?.Invoke(); } public abstract void PredefinedDriveStop(); public Action CustomDriveStop; public abstract bool ComputeRotateWheels(float rotSpeed); public abstract float CalculateTurningSpeedDecayFac(float turn); public enum ChassisState { Standby, Running, AbnormalFeedback, ExceedMotionAbility, } protected ChassisState State; protected string StateDescription; public (ChassisState State, string Description) GetChassisState() { return (State, StateDescription); } public bool Debug = false; public float AccPerSecond = 0.2f; public float DeAccPerSecond = 0.2f; public float MaxSpeed = 1; // m/s public float MinTurnSpeedFac = 0.5f; public float MaxTurnThreshold = 90f; public float GcpThetaPerSecond = 10f; public DateTime LastMoveTime = DateTime.MinValue; protected bool Valid = false; protected List GeometricControlPoints = new(); protected bool RotatingActive = false; protected bool GoingActive = false; protected bool GoingWheelAligned = false; private float _lastDirectionAngle = 0; } }