public void DisableLand() { autoMode = AutoMode.Off; if (_track_obj != null) { Destroy(_track_obj); _track_obj = null; } if (_thrusts_obj != null) { Destroy(_thrusts_obj); _thrusts_obj = null; } if (_align_obj != null) { Destroy(_align_obj); _align_obj = null; } if (_steer_obj != null) { Destroy(_steer_obj); _steer_obj = null; } _traj = null; LogStop(); if (vessel != null) { if (vessel.OnFlyByWire != null) { vessel.OnFlyByWire -= new FlightInputCallback(Fly); } if (vessel.Autopilot != null) { vessel.Autopilot.Disable(); } } Events["ToggleGuidance"].guiName = "Enable guidance"; }
public static void AdjustYLimit(AutoMode __instance, ref float gage) { gage = 0f; var instance = Traverse.Create(__instance); instance.Field("strokeMin").SetValue(-1f); instance.Field("strokeMax").SetValue(1f); }
public void Fly(FlightCtrlState state) { if ((vessel == null) || (vessel.checkLanded() && checkingLanded)) { ScreenMessages.PostScreenMessage("Landed!", 3.0f, ScreenMessageStyle.UPPER_CENTER); DisableLand(); // Shut-off throttle FlightCtrlState ctrl = new FlightCtrlState(); vessel.GetControlState(ctrl); ctrl.mainThrottle = 0; // Necessary on Realism Overhaul to shutdown engine as at throttle=0 the engine may still have // a lot of thrust if (_keepIgnited) { ShutdownAllEngines(); } autoMode = AutoMode.Off; return; } // Only start checking if landed when taken off if (!vessel.checkLanded()) { checkingLanded = true; } Vector3 r = vessel.GetWorldPos3D(); Vector3 v = vessel.GetSrfVelocity(); Vector3 tr = _transform.InverseTransformPoint(r); Vector3 tv = _transform.InverseTransformVector(v); float g = (float)FlightGlobals.getGeeForceAtPosition(r).magnitude; Vector3d dr, dv, da; double desired_t; // closest time in trajectory (desired) _traj.FindClosest(tr, tv, out dr, out dv, out da, out desired_t, 0.5f, 0.5f); // Uses transformed positions and vectors // sets throttle and desired attitude based on targets // F is the inital force (acceleration) vector AutopilotStepToTarget(state, tr, tv, dr, dv, da, g); }
// Use this for initialization void Start() { m_flgMatched = false; m_flgStart = false; m_flgFirst = false; m_time_elapsed = 0; m_turn = 0; GoodPiece = (GameObject)Resources.Load("GoodPrefab"); EvilPiece = (GameObject)Resources.Load("EvilPrefab"); UnknownPiece = (GameObject)Resources.Load("UnknownPrefab"); field = GameObject.Find("Canvas/Panel/Image_field/Panel_piece"); field_rect = field.GetComponent <RectTransform>(); Pieces = new GameObject[PIECE_NUM]; waiting = GameObject.Find("Canvas/Panel/Image_wait"); my_case = GameObject.Find("Canvas/Panel/Image_case_my/Panel").GetComponent <RectTransform>(); enemy_case = GameObject.Find("Canvas/Panel/Image_case_en/Panel").GetComponent <RectTransform>(); win_panel = GameObject.Find("Canvas/Panel/Image_Win"); lose_panel = GameObject.Find("Canvas/Panel/Image_Lose"); auto = GameObject.Find("Canvas/Panel/Toggle_Auto").GetComponent <AutoMode>(); win_panel.SetActive(false); lose_panel.SetActive(false); UserInfo.game_user_id = UserInfo.user_id; if (UserInfo.flg_spectator) { waiting.SetActive(false); } GetRoomInfo(); // Debug //InitPieces(); }
static void Main(string[] args) { // TODO: Use ComputeSharp to run code on GPU /* * using ReadWriteBuffer<float> buffer = Gpu.Default.AllocateReadWriteBuffer<float>(1000); * Gpu.Default.For(1000, id => buffer[id.X] = id.X); * float[] array = buffer.GetData(); */ var dataPath = FileHelper.FindAppFolder("Data"); int imageWidth, imageHeight; byte[][] images; byte[] labels; { var bytes = File.ReadAllBytes(Path.Combine(dataPath, "MNIST", "train-images.idx3-ubyte")); var reader = new PacketReader(); reader.Open(bytes); var magic = reader.ReadInt(); if (magic != 0x00000803) { throw new Exception("Wrong magic number"); } var imageCount = reader.ReadInt(); Trace.WriteLine($"Found {imageCount} images."); imageHeight = reader.ReadInt(); imageWidth = reader.ReadInt(); images = new byte[imageCount][]; for (var i = 0; i < imageCount; i++) { images[i] = reader.ReadBytes(imageHeight * imageWidth).ToArray(); } } { var bytes = File.ReadAllBytes(Path.Combine(dataPath, "MNIST", "train-labels.idx1-ubyte")); var reader = new PacketReader(); reader.Open(bytes); var magic = reader.ReadInt(); if (magic != 0x00000801) { throw new Exception("Wrong magic number"); } var itemCount = reader.ReadInt(); Trace.WriteLine($"Found {itemCount} labels."); labels = new byte[itemCount]; for (var i = 0; i < itemCount; i++) { labels[i] = reader.ReadByte(); } } { var displayedImageIndex = 0; var layerSetup = new int[] { imageWidth *imageHeight, 600, 400, 200, 100, 10 }; var net = new NeuralNet(layerSetup); var netInputs = new float[imageWidth * imageHeight]; var netLearningRate = 0.1f; var netResult = -1; void ResetNetwork() { net = new NeuralNet(layerSetup); RunNetworkAndRenderImage(displayedImageIndex); } void RunNetwork(int imageIndex) { for (var i = 0; i < netInputs.Length; i++) { netInputs[i] = images[imageIndex][i] / (float)byte.MaxValue; } var output = net.Compute(netInputs); Debug.Assert(output.Length == 10); // Get the digit the network has seen var max = 0f; for (var i = 0; i < output.Length; i++) { if (output[i] > max) { max = output[i]; netResult = i; } } var expectedOutput = new float[10]; expectedOutput[labels[imageIndex]] = 1f; net.BackpropagateError(expectedOutput); } var windowWidth = 1280; var windowHeight = 720; var imageScale = 8; var labelText = ""; var imageText = ""; var statusText = ""; SDL.SDL_Init(SDL.SDL_INIT_VIDEO); SDL.SDL_CreateWindowAndRenderer(windowWidth, windowHeight, 0, out var window, out var renderer); SDL.SDL_SetWindowTitle(window, "Neural"); var font = Font.LoadFromChevyRayFolder(renderer, Path.Combine(dataPath, "Fonts", "ChevyRay - Softsquare Mono")); var fontStyle = new FontStyle(font) { Scale = 2, LetterSpacing = 1 }; var smallFontStyle = new FontStyle(font) { Scale = 1, LetterSpacing = 1 }; var imageTexture = IntPtr.Zero; var imageSourceRect = new SDL.SDL_Rect { x = 0, y = 0, w = imageWidth, h = imageHeight }; var imageDestRect = new SDL.SDL_Rect { x = windowWidth / 2 - (imageWidth / 2 * imageScale), y = windowHeight / 2 - (imageHeight / 2 * imageScale), w = imageWidth * imageScale, h = imageHeight * imageScale }; void LoadImageForRender(int imageIndex) { if (imageTexture != IntPtr.Zero) { SDL.SDL_DestroyTexture(imageTexture); } var pixels = new byte[imageWidth * imageHeight * 4]; for (var i = 0; i < imageWidth * imageHeight; i++) { pixels[i * 4 + 0] = pixels[i * 4 + 1] = pixels[i * 4 + 2] = images[imageIndex][i]; pixels[i * 4 + 3] = 0xff; } unsafe { fixed(byte *pixelsPointer = pixels) { var surface = SDL.SDL_CreateRGBSurfaceWithFormatFrom((IntPtr)pixelsPointer, imageWidth, imageHeight, 24, imageWidth * 4, SDL.SDL_PIXELFORMAT_ARGB8888); imageTexture = SDL.SDL_CreateTextureFromSurface(renderer, surface); SDL.SDL_FreeSurface(surface); } } labelText = $"Label: {labels[imageIndex]}, Network output: {netResult}"; imageText = $"({imageIndex}/{images.Length})"; } void RunNetworkAndRenderImage(int imageIndex) { RunNetwork(imageIndex); LoadImageForRender(imageIndex); } RunNetworkAndRenderImage(displayedImageIndex); var running = true; AutoMode autoMode = AutoMode.None; var autoImageIndex = 0; var correctlyPredicted = 0; while (running) { while (running && SDL.SDL_PollEvent(out var @event) != 0) { switch (@event.type) { case SDL.SDL_EventType.SDL_QUIT: running = false; break; case SDL.SDL_EventType.SDL_WINDOWEVENT: switch (@event.window.windowEvent) { case SDL.SDL_WindowEventID.SDL_WINDOWEVENT_CLOSE: running = false; break; } break; case SDL.SDL_EventType.SDL_KEYDOWN: switch (@event.key.keysym.sym) { case SDL.SDL_Keycode.SDLK_RIGHT: if (displayedImageIndex < images.Length - 1) { displayedImageIndex++; RunNetworkAndRenderImage(displayedImageIndex); } break; case SDL.SDL_Keycode.SDLK_LEFT: if (displayedImageIndex > 0) { displayedImageIndex--; RunNetworkAndRenderImage(displayedImageIndex); } break; case SDL.SDL_Keycode.SDLK_p: if (autoMode == AutoMode.Train) { autoMode = AutoMode.None; } else { autoMode = AutoMode.Train; autoImageIndex = 0; } break; /* case SDL.SDL_Keycode.SDLK_t: * net.Train(netLearningRate, netInputs); * RunNetworkAndRenderImage(displayedImageIndex); * break; */ case SDL.SDL_Keycode.SDLK_c: if (autoMode == AutoMode.Check) { autoMode = AutoMode.None; } else { autoMode = AutoMode.Check; autoImageIndex = 0; correctlyPredicted = 0; } break; case SDL.SDL_Keycode.SDLK_r: if (autoMode == AutoMode.None) { ResetNetwork(); statusText = ""; } break; } break; } } if (!running) { break; } SDL.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL.SDL_RenderClear(renderer); // Draw image SDL.SDL_RenderCopy(renderer, imageTexture, ref imageSourceRect, ref imageDestRect); // Draw network { var start = new Point(10, 10); var size = 4; var spacing = 2; var columnOffset = -1; var maxPerColumn = 50; for (var i = 0; i < net.Layers.Length; i++) { var layer = net.Layers[i]; for (var j = 0; j < layer.Outputs.Length; j++) { if (j % maxPerColumn == 0) { columnOffset++; } var value = Math.Clamp(layer.Outputs[j], 0f, 1f); SDL.SDL_SetRenderDrawColor(renderer, (byte)(0xff * (1f - value)), (byte)(0xff * value), 0x00, 0xff); var rect = new SDL.SDL_Rect { x = start.X + (i + columnOffset) * (size + spacing), y = start.Y + (j % maxPerColumn) * (size + spacing), w = size, h = size }; SDL.SDL_RenderFillRect(renderer, ref rect); } } } // Draw info fontStyle.DrawText(8, windowHeight - fontStyle.Size - 8, "Left/Right to navigate, P to train, C to check accuracy, R to reset network"); fontStyle.DrawText(windowWidth / 2 - fontStyle.MeasureText(labelText) / 2, imageDestRect.y + imageDestRect.h + 8, labelText); fontStyle.DrawText(windowWidth - fontStyle.MeasureText(imageText) - 8, windowHeight - fontStyle.Size - 8, imageText); fontStyle.DrawText(windowWidth - fontStyle.MeasureText(statusText) - 8, 8, statusText); smallFontStyle.DrawText(8, windowHeight - fontStyle.Size * 4 - 12, "Written by Elisee Maurer (@elisee)"); smallFontStyle.DrawText(8, windowHeight - fontStyle.Size * 3 - 12, "MNIST database: yann.lecun.com/exdb/mnist/"); smallFontStyle.DrawText(8, windowHeight - fontStyle.Size * 2 - 12, "Font by Chevy Ray - pixel-fonts.com"); SDL.SDL_RenderPresent(renderer); // Thread.Sleep(1); switch (autoMode) { case AutoMode.Train: for (var i = 0; i < 10; i++) { RunNetwork(autoImageIndex); net.Train(netLearningRate, netInputs); autoImageIndex++; if (autoImageIndex == images.Length) { autoMode = AutoMode.None; break; } } statusText = $"Trained on {autoImageIndex} images."; RunNetworkAndRenderImage(displayedImageIndex); break; case AutoMode.Check: for (var i = 0; i < 10; i++) { RunNetwork(autoImageIndex); if (labels[autoImageIndex] == netResult) { correctlyPredicted++; } autoImageIndex++; if (autoImageIndex == images.Length) { autoMode = AutoMode.None; break; } } var percent = Math.Round(100f * correctlyPredicted / autoImageIndex, 2, MidpointRounding.AwayFromZero); statusText = $"Correctly predicted {percent:0.00}% ({correctlyPredicted}/{autoImageIndex})"; break; } } } }
public void EnableLandAtTarget() { if (_tgts.Count == 0) { ScreenMessages.PostScreenMessage("No targets", 3.0f, ScreenMessageStyle.UPPER_CENTER); autoMode = AutoMode.Off; return; } checkingLanded = false; // stop trajectory being cancelled while on ground lowestY = FindLowestPointOnVessel(); Vector3d r0 = vessel.GetWorldPos3D(); Vector3d v0 = vessel.GetSrfVelocity(); Vector3d g = FlightGlobals.getGeeForceAtPosition(r0); Vector3d vf = new Vector3d(0, -touchDownSpeed, 0); ComputeMinMaxThrust(out _minThrust, out _maxThrust); if (_maxThrust == 0) { ScreenMessages.PostScreenMessage("No engine thrust (activate engines)", 3.0f, ScreenMessageStyle.UPPER_CENTER); autoMode = AutoMode.Off; return; } _startTime = Time.time; double amin = _minThrust / vessel.totalMass; double amax = _maxThrust / vessel.totalMass; if (amin > g.magnitude) { ScreenMessages.PostScreenMessage("Difficult to land as thrust of engine is greater than gravity", 3.0f, ScreenMessageStyle.UPPER_CENTER); } if (amin > amax * 0.95) { ScreenMessages.PostScreenMessage("Engine doesn't appear to be throttleable. This makes precision guidance impossible", 3.0f, ScreenMessageStyle.UPPER_CENTER); autoMode = AutoMode.Off; return; } solver = new Solve(); solver.Tmin = 1; solver.tol = 0.5; solver.vmax = maxV; solver.amin = amin * (1 + errMargin); solver.amax = amax * (1 - errMargin); solver.minDurationPerThrust = 4; solver.maxThrustsBetweenTargets = 3; solver.g = g.magnitude; solver.minDescentAngle = minDescentAngle; solver.maxThrustAngle = maxThrustAngle * (1 - 2 * errMargin); solver.maxLandingThrustAngle = 0.1f * maxThrustAngle; // 10% of max thrust angle // hack for large craft to allow extra slowdown time at target to prepare for next target // where thrust is just over gravity give 5 seconds extra time // where thrust is double gravity than use 0.5 secs extra time solver.extraTime = (float)(2.5 - 2 * Math.Min(0.5 * (amax / g.magnitude), 1)); // Shut-off throttle FlightCtrlState ctrl = new FlightCtrlState(); vessel.GetControlState(ctrl); ctrl.mainThrottle = (_keepIgnited)?0.01f:0; // Compute trajectory to landing spot List <SolveTarget> targets = new List <SolveTarget>(); Vector3d tr0 = _transform.InverseTransformPoint(r0); tr0.y += 0.1f; // move up slightly to ensure above ground plane Vector3d tv0 = _transform.InverseTransformVector(v0); // Create list of solve targets double d = 0; Vector3 cr = tr0; Vector3d wrf = Vector3d.zero; Vector3d wvf = Vector3d.zero; for (int i = 0; i < _tgts.Count; i++) { SolveTarget tgt = new SolveTarget(); Vector3d pos = vessel.mainBody.GetWorldSurfacePosition(_tgts[i].lat, _tgts[i].lon, _tgts[i].alt + _tgts[i].height); tgt.r = _transform.InverseTransformPoint(pos); // convert to local (for orientation) tgt.raxes = SolveTarget.X | SolveTarget.Y | SolveTarget.Z; if (i == _tgts.Count - 1) // final target { tgt.r.y += -lowestY; wrf = _transform.TransformPoint(tgt.r); tgt.vaxes = SolveTarget.X | SolveTarget.Y | SolveTarget.Z; tgt.v = vf; wvf = _transform.TransformVector(tgt.v); // to correct final later } tgt.t = -1; d = d + (cr - tgt.r).magnitude; cr = tgt.r; targets.Add(tgt); } solver.Tmax = -1; // Forces estimation given initial position, velocity and targets solver.apex = targets[targets.Count - 1].r; _traj = new Trajectory(); SolveResult result = MainProg.MultiPartSolve(ref solver, ref _traj, tr0, tv0, ref targets, (float)g.magnitude, extendTime); Log(solver.DumpString() + " " + result.DumpString()); if (result.isSolved()) // solved for complete path? { string msg = String.Format("Found solution T={0:F1} Fuel={1:F1}", result.T, result.fuel); Log(msg, true); // Enable autopilot _pid3d.Init(corrFactor, ki1, 0, corrFactor * kP2Scale, ki2, 0, maxV, (float)amax, yMult); // TODO - Testing out using in solution co-ordinates DrawTargets(_tgts, _transform, targetcol, tgtSize); vessel.Autopilot.Enable(VesselAutopilot.AutopilotMode.StabilityAssist); vessel.OnFlyByWire += new FlightInputCallback(Fly); // Write solution if (_logging) { List <string> comments = new List <string>(); comments.Add(result.DumpString()); // Thrusts List <float> thrust_times = new List <float>(); for (int i = 0; i < result.thrusts.Length; i++) { thrust_times.Add(result.thrusts[i].t); } comments.Add("thrust_times=" + String.Join(",", thrust_times)); if (result.checktimes != null) { comments.Add("check_times=" + String.Join(",", result.checktimes)); } _traj.Write(_solutionLogFilename, comments); } autoMode = AutoMode.LandAtTarget; Events["ToggleGuidance"].guiName = "Cancel guidance"; } else { DisableLand(); Events["ToggleGuidance"].guiName = "Failed! - Cancel guidance"; string msg = "Failure to find solution as "; // Do some checks if (v0.magnitude > maxV) { msg = msg + " velocity over " + maxV + " m/s"; } else if (amax < g.magnitude) { msg = msg + "engine has insufficient thrust, no engines active or no fuel"; } else if (amin > g.magnitude) { msg = msg + "can't throttle engine low enough to descent"; } else { msg = msg + "impossible to reach target within constraints"; } Log(msg, true); autoMode = AutoMode.Failed; } if (result.isSolved()) // solved for complete path? - show partial? { DrawTrack(_traj, _transform); } }