Beispiel #1
0
 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";
 }
Beispiel #2
0
            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);
            }
Beispiel #3
0
        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);
        }
Beispiel #4
0
    // 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();
    }
Beispiel #5
0
        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;
                    }
                }
            }
        }
Beispiel #6
0
        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);
            }
        }