Esempio n. 1
0
        public Form1()
        {
            InitializeComponent();

            //Create a list of waypoints
            List <Pose2d> waypoints = new List <Pose2d>(3);

            waypoints.Add(new Pose2d(new Translation2d(0, 0), Rotation2d.fromDegrees(0)));
            waypoints.Add(new Pose2d(new Translation2d(100, 20), Rotation2d.fromDegrees(0)));
            waypoints.Add(new Pose2d(new Translation2d(254.8, 50.87), Rotation2d.fromDegrees(45)));

            // For a reversed trajectory
            List <Pose2d> waypoints_maybe_flipped = waypoints;
            Pose2d        flip = Pose2d.fromRotation(new Rotation2d(-1, 0, false));

            if (false)
            {
                waypoints_maybe_flipped = new List <Pose2d>(waypoints.Count);
                for (int i = 0; i < waypoints.Count; ++i)
                {
                    waypoints_maybe_flipped.Add(waypoints[i].transformBy(flip));
                }
            }

            //Create a list of splines between each pair of waypoints
            List <QuinticSpline> splines = new List <QuinticSpline>(waypoints.Count - 1);

            for (int i = 1; i < waypoints.Count; ++i)
            {
                splines.Add(new QuinticSpline(waypoints[i - 1], waypoints[i]));
            }

            //Doesnt do much for simple curves
            //Optimize spline based on curvature
            QuinticSpline.optimizeSpline(ref splines);

            Console.WriteLine("Spline Unsegmented");
            foreach (QuinticSpline S in splines)
            {
                for (double t = 0; t <= 1; t += 1 / 100.0)
                {
                    Console.WriteLine(S.getPoint(t).x() + " , " + S.getPoint(t).y() + " , " + S.getHeading(t).getDegrees());
                }
            }

            Console.WriteLine("Spline Combined and Segmented");

            //Create the untimed trajectory (Splines into segment generator)
            UntimedTrajectory trajectory = new UntimedTrajectory(SegmentedSplineGenerator.parameterizeSplines(splines));

            for (int i = 0; i < trajectory.length(); i++)
            {
                double x            = trajectory.getState(i).getTranslation().x();
                double y            = trajectory.getState(i).getTranslation().y();
                double theta        = trajectory.getState(i).getRotation().getDegrees();
                double curvature    = trajectory.getState(i).getCurvature();
                double dCurvatureDs = trajectory.getState(i).getDCurvatureDs();

                Console.WriteLine(i + " , " + x + " , " + y + " , " + theta + " , " + curvature + " , " + dCurvatureDs);
            }

            //For a reversed trajectory
            if (false)
            {
                List <Pose2dWithCurvature> flipped = new List <Pose2dWithCurvature>(trajectory.length());
                for (int i = 0; i < trajectory.length(); ++i)
                {
                    flipped.Add(new Pose2dWithCurvature(trajectory.getState(i).getPose().transformBy(flip),
                                                        -trajectory.getState(i).getCurvature(), trajectory.getState(i).getDCurvatureDs()));
                }
                trajectory = new UntimedTrajectory(flipped);
            }

            Console.WriteLine("Trajectory");

            TrajectoryContainer final_trajectory = TrajectoryGenerator.parameterizeTrajectory(false, trajectory, 2.0, 0.0, 0.0, 120.0, 120.0, 24.0, 20);

            final_trajectory.setDefaultVelocity(72.0 / 150.0);

            for (int i = 0; i < final_trajectory.length(); i++)
            {
                double x        = final_trajectory.getState(i).get_state().getTranslation().x();
                double y        = final_trajectory.getState(i).get_state().getTranslation().y();
                double position = Math.Sqrt(x * x + y * y);
                double theta    = final_trajectory.getState(i).get_state().getRotation().getDegrees();
                double time     = final_trajectory.getState(i).get_t();
                double velocity = final_trajectory.getState(i).get_velocity();
                double accel    = final_trajectory.getState(i).get_acceleration();
                Console.WriteLine(time + " , " + position + " , " + velocity + " , " + accel);
            }
        }