Advertisement
drabont

Space Engineers - Монокоптер, WIP, temp

Apr 29th, 2021 (edited)
1,166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.33 KB | None | 0 0
  1. //Евро-табурет v0.0 by swagman
  2. //Управляющий скрипт для монокоптера
  3. //пассажирское сидение как IMyShipController
  4. //инструкция: https://youtu.be/0Eohqz4PXKw
  5. /*gts wrapper*/List<T> gts<T>(Func<T, bool>b=null) where T:class {b=b??(x=>true);List<T>l=new List<T>();Func<T,bool>f=x=>((IMyTerminalBlock)x).IsSameConstructAs(Me);GridTerminalSystem.GetBlocksOfType(l,k=>f(k)&&b(k));return l;}
  6. Vector3D o_pos; public Program() { o_pos = Me.CubeGrid.GetPosition(); Runtime.UpdateFrequency = UpdateFrequency.Update10; }
  7.  
  8. bool forcer = false;
  9. bool damper = true;
  10.  
  11. public void Main(string arg) {/*mon init*/var m = Me.GetSurface(0); m.ContentType = ContentType.TEXT_AND_IMAGE; m.FontSize = 26.4f/12; m.TextPadding = 0;m.Font = "Monospace"; m.FontColor = Color.Gray; m.BackgroundColor = new Color(0,0,7);
  12.   var deg = (float)Math.PI / 180; //градус выраженный в радианах
  13.  
  14.   //берём нужные блоки
  15.   var gy = gts<IMyGyro>();                   // b.GridThrustDirection.Y == -1
  16.   var tr = gts<IMyThrust>(b => b.IsWorking && b.Orientation.Forward == Base6Directions.Direction.Down);
  17.   var sc = gts<IMyShipController>().First();
  18.  
  19.   //var sc = gts<IMyShipController>(b => b.CustomName.Contains("!")).First();
  20.   //берем центр планеты и переводим его в целочисленный вектор в пространстве сетки
  21.   var g_pos = Me.CubeGrid.GetPosition();
  22.   var p_cen = g_pos; var g_ovr = sc.TryGetPlanetPosition(out p_cen);
  23.   var cen = Me.CubeGrid.WorldToGridInteger( p_cen );
  24.   var spd = Me.CubeGrid.WorldToGridInteger( o_pos ); o_pos = g_pos;
  25.    
  26.   //вычисляем углы отклонения (-pi..pi)
  27.   var ax = (float) Math.Atan2( cen.X, -cen.Y );
  28.   var az = (float) Math.Atan2( cen.Z, -cen.Y );
  29.  
  30.   //триггеры
  31.   forcer = sc.MoveIndicator.Z==-1 ? sc.MoveIndicator.Y==1 ? true : forcer : false; //триггер усилителя разгона
  32.   damper = sc.MoveIndicator.Z==1 && sc.MoveIndicator.Y==1 ? true:forcer?false:damper; //триггер демпфера
  33.  
  34.   //формируем управляющие сигналы (-2pi..2pi)
  35.   var uv = new Vector3(0); uv.Y = sc.RollIndicator *deg*45;
  36.   uv.Z = -(ax *2 - spd.X*deg*3 - sc.MoveIndicator.X *deg*20 );
  37.   uv.X =  (az *2 - (damper? spd.Z *deg*5: 0) - sc.MoveIndicator.Z *(forcer?deg*90:deg*20) );
  38.  
  39.   //учитываем фактор коллизии
  40.   if ( Math.Abs(ax)>1 ) {uv.Z = 2 * Math.Sign(uv.Z); uv.X = 0;} else if ( Math.Abs(az)>1) {uv.X = 2 * Math.Sign(uv.X); uv.Z = 0;}
  41.  
  42.   //применяем сигналы к гироскопам
  43.   for (int j = 0; j<gy.Count; j++) {
  44.     Matrix ma; gy[j].Orientation.GetMatrix(out ma); var tv = Vector3.Transform( uv, Matrix.Transpose( ma ));
  45.     if ( gy[j].Pitch != (float)tv.X || gy[j].Yaw != (float)tv.Y || gy[j].Roll != (float)tv.Z ) {
  46.       gy[j].Pitch = (float)tv.X; gy[j].Yaw = (float)tv.Y; gy[j].Roll = (float)tv.Z;}
  47.     gy[j].GyroOverride = g_ovr;
  48.   }
  49.  
  50.   //Dampeners ассистент, включаем демпфирование на безопасной высоте
  51.   double alt; sc.TryGetPlanetElevation( MyPlanetElevation.Surface, out alt );
  52.   var tpow = 1f; foreach (var t in tr) tpow += t.MaxEffectiveThrust;
  53.   var sh = sc.GetShipSpeed(); sh = sh*sh/(tpow/sc.CalculateShipMass().PhysicalMass-sc.GetNaturalGravity().Length());
  54.   sc.DampenersOverride = sh>=alt | sc.DampenersOverride;
  55.  
  56.   //тяга зависания с учетом эффективности трастера
  57.   //var p = (float)(sc.GetNaturalGravity().Length() * sc.CalculateShipMass().PhysicalMass * tr[0].MaxThrust / tr[0].MaxEffectiveThrust);
  58.  
  59.   //управление высотой при включенном общем демпфировании
  60.   foreach (var t in tr) t.ThrustOverride = sc.MoveIndicator.Y==1?t.MaxThrust:sc.MoveIndicator.Y==-1 && sh<alt ?0.01f:0;
  61.  
  62.   m.WriteText($"{(sh<alt?0:1)}  {System.DateTime.Now:T}\nALT:{alt:f2}\nFRZ:{(forcer?1:0)} DMP:{(damper?1:0)}\naz:{az,8:f4}\nax:{ax,8:f4}\n Y:{uv.Y,8:f4}\n Z:{uv.Z,8:f4}\n X:{uv.X,8:f4}");
  63.  
  64. /*script monitor*/var і=Runtime;Echo($"{System.DateTime.Now}\nTime:{і.LastRunTimeMs:F2}:{і.TimeSinceLastRun.Milliseconds}ms\nInst:{і.CurrentInstructionCount}:{і.MaxInstructionCount}\nCall:{і.CurrentCallChainDepth}:{і.MaxCallChainDepth}\n"); }
  65.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement