Esempio n. 1
0
        public static void Main(string[] args)
        {
            var circuitName = "simple-circuit";
            var circuitPath = Path.GetFullPath($"{assetsDirectoryPath}/tracks/{circuitName}");

            var perceptionPeriod = TimeSpan.FromSeconds(0.4);
            var simulationStep   = perceptionPeriod / 8;

            var track = Track.Load($"{circuitPath}/circuit_definition.json");
            var world = new StandardWorld(track, simulationStep);

            var planner = new HybridAStarPlanner(perceptionPeriod, world, world.WayPoints);

            //var planner = new WayPointFollowingRRTPlannerRRTPlanner(
            //    goalBias: 0.3,
            //    maximumNumberOfIterations: 100000,
            //    realVehicleModel,
            //    realMotionModel,
            //    track,
            //    new Random(),
            //    perceptionPeriod,
            //    actions,
            //    wayPoints);

            //var planner = new RRTPlanner(
            //    goalBias: 0.05,
            //    maximumNumberOfIterations: 20000,
            //    world,
            //    new Random(),
            //    perceptionPeriod,
            //    wayPoints.Last());

            var exploredStates = new List <VehicleState>();
            var lastFlush      = DateTimeOffset.Now;

            void flush()
            {
                Console.WriteLine($"Explored {exploredStates.Count} states");
                lastFlush = DateTimeOffset.Now;
                var data = JsonConvert.SerializeObject(exploredStates, new JsonSerializerSettings
                {
                    Formatting       = Formatting.Indented,
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                });

                File.WriteAllText("C:/Users/simon/Projects/racer-experiment/simulator/src/progress.json", data);
            }

            flush();

            planner.ExploredStates.Subscribe(state =>
            {
                exploredStates.Add(state);
                if (DateTimeOffset.Now - lastFlush > TimeSpan.FromSeconds(10))
                {
                    flush();
                }
            });

            var stopwatch = new System.Diagnostics.Stopwatch();

            stopwatch.Restart();

            var plan = planner.FindOptimalPlanFor(world.InitialState);

            stopwatch.Stop();

            flush();

            if (plan == null)
            {
                Console.WriteLine("Couldn't find any plan.");
                return;
            }

            Console.WriteLine($"Found a plan in {stopwatch.ElapsedMilliseconds}ms");

            var detailedPlan = plan.ToDetailedPlan(world);

            Plans.Store(detailedPlan, $"{assetsDirectoryPath}/plans/plan-{planner.GetType().Name}-{DateTimeOffset.Now.ToUnixTimeSeconds()}-{detailedPlan.TimeToGoal.TotalMilliseconds}.json");

            // store the result in a file so it can be replayed
            var summary = log(detailedPlan);

            //File.Copy($"{circuitPath}/visualization.svg", "C:/Users/simon/Projects/racer-experiment/simulator/src/visualization.svg", overwrite: true);
            IO.Simulation.StoreResult(track, world.VehicleModel, summary, $"{circuitPath}/visualization.svg", "C:/Users/simon/Projects/racer-experiment/simulator/src/report.json");
            Console.WriteLine($"Time to finish: {detailedPlan.TimeToGoal.TotalSeconds}s");
        }