Ejemplo n.º 1
0
        static void Simulate(PDController controller, ref Trajectory traj, Vector3d r, Vector3d v, Vector3d g, double dt, double maxT, string tgtLogFilename = "target.dat")
        {
            double   t = 0;
            double   throttle;
            Vector3d thrustV = Vector3d.zero;
            Vector3d dr, dv, da; // desired values on trajectory

            var tgtWriter = new System.IO.StreamWriter(tgtLogFilename);

            tgtWriter.WriteLine("time x y z vx vy vz ax ay az att_err");

            System.Console.WriteLine("time x y z vx vy vz ax ay az att_err");
            while ((t < maxT) && (r.y > 0))
            {
                System.Console.WriteLine("{0:F2} {1:F2} {2:F2} {3:F2} {4:F2} {5:F2} {6:F2} {7:F2} {8:F2} {9:F2} 0", t, r.x, r.y, r.z, v.x, v.y, v.z, thrustV.x, thrustV.y, thrustV.z);
                // Equations of motion
                r = r + v * dt;
                v = v + g * dt;

                // Control loop
                float    att_err;
                bool     shutdownEnginesNow = false;
                Vector3d att = new Vector3d(0, 1, 0); // TODO: Fake attitude
                controller.GetControlOutputs(traj, r, v, att, g, (float)t, out dr, out dv, out da, out throttle, out thrustV, out att_err, out shutdownEnginesNow);
                tgtWriter.WriteLine("{0:F2} {1:F2} {2:F2} {3:F2} {4:F2} {5:F2} {6:F2} {7:F2} {8:F2} {9:F2} {10:F2}", t, dr.x, dr.y, dr.z, dv.x, dv.y, dv.z, da.x, da.y, da.z, att_err);
                // Make engine thrust have effect
                v = v + thrustV * dt;

                t = t + dt;
            }
            tgtWriter.Close();
        }
 public override void OnAttachToKoboto(Koboto koboto)
 {
     base.OnAttachToKoboto(koboto);
     motorControl            = new PDController(motorP, motorD);
     bladeTransform.rotation = Quaternion.identity;
     resetMotor = true;
     dustVFX.SetActive(false);
 }
Ejemplo n.º 3
0
    // Update is called once per frame
    void Update()
    {
        //First, analyze other robots to see which ones are too close
        GameObject[] objects = GameObject.FindGameObjectsWithTag ("robot");
        int ownID = this.gameObject.GetInstanceID ();

        float minDistance = 10000;
        float[] distances = new float[objects.Length];
        //First compute minimum distance
        for(int i=0;i<objects.Length;i++){
            GameObject g = objects[i];
            if (g.GetInstanceID () != ownID) { //Track others, not itself
                float d = Vector3.Distance(transform.position,g.transform.position);
                distances[i] = d;
                if(d<minDistance)
                    minDistance = d;
            }
        }
        //Update considering only closest neigbours
        int j = 0;
        lines.SetVertexCount (0); //Remove old lines
        lines.SetVertexCount (6);
        for (int i=0;i<objects.Length;i++){
            GameObject g = objects[i];
            int gID = g.gameObject.GetInstanceID();
            AbstractController controller;
            //See if we already have this controller in the dictionary
            bool haveController = controllers.TryGetValue(gID,out controller);
            if(!haveController){//If not, we include it
                controller = new PDController(control);
                controllers.Add(gID,controller);
            }
            if (g.GetInstanceID () != ownID) { //Track others, not itself
                if(distances[i]<minDistance*(1+distanceEpsilon)){
                    Debug.DrawLine(transform.position,g.transform.position);
                    if(drawLines){
                        lines.SetPosition(j,transform.position);
                        j++;
                        lines.SetPosition(j,g.transform.position);
                        j++;
                    }
                    controller.controlFunction (transform, g.transform.position, targetDistance, Mathf.Deg2Rad*(-1), GlobalControl.motionModels.DYNAMIC);
                }else{
                    //Reset controller
                    controller.setControl(control);
                }
            }
        }
    }
Ejemplo n.º 4
0
    void Start()
    {
        myRigidbody = GetComponent <Rigidbody>();
        controller  = GetComponent <PDController>();

        var speed = new LinguisticVariable("Speed");
        //var slow = speed.MembershipFunctions.AddTrapezoid("Slow", 0, 0, 5, 10);
        //var average = speed.MembershipFunctions.AddTrapezoid("Average", 10, 15, 20, 25);
        //var fast = speed.MembershipFunctions.AddTrapezoid("Fast", 5, 15, 100, 100);

        var slow = speed.MembershipFunctions.AddTriangle("Slow", 0, 5, 10);
        var fast = speed.MembershipFunctions.AddTriangle("Fast", 7.5, 20, 50);

        var distance = new LinguisticVariable("Distance");

        /*
         * var low = distance.MembershipFunctions.AddTrapezoid("Low", 0, 0, 2.5, 5);
         * var medium = distance.MembershipFunctions.AddTrapezoid("Medium", 2.5, 5, 12.5, 20);
         * var high = distance.MembershipFunctions.AddTrapezoid("High", 12.5, 20, 38, 50);
         */

        var low  = distance.MembershipFunctions.AddTriangle("Low", 0, 10, 20);
        var high = distance.MembershipFunctions.AddTriangle("High", 10, 20, 55);

        var variability = new LinguisticVariable("Variability");
        var varH        = variability.MembershipFunctions.AddTrapezoid("VarH", 1.5, 2, 5, 20);
        var varL        = variability.MembershipFunctions.AddTrapezoid("VarL", 0, 0, 1.5, 2);

        fuzzyEngine = new FuzzyEngineFactory().Default();

        var rule1 = Rule.If(speed.Is(slow)).Then(distance.Is(low));
        //var rule2 = Rule.If(speed.Is(average)).Then(distance.Is(medium));
        var rule3 = Rule.If(speed.Is(fast)).Then(distance.Is(high));
        var rule4 = Rule.If(variability.Is(varL)).Then(distance.Is(low));
        var rule5 = Rule.If(variability.Is(varH)).Then(distance.Is(high));

        fuzzyEngine.Rules.Add(rule1);
        //fuzzyEngine.Rules.Add(rule2);
        fuzzyEngine.Rules.Add(rule3);
        fuzzyEngine.Rules.Add(rule4);
        fuzzyEngine.Rules.Add(rule5);

        StartCoroutine(CycleAI());
    }
Ejemplo n.º 5
0
 public override void OnAttachToKoboto(Koboto koboto)
 {
     base.OnAttachToKoboto(koboto);
     dragControl = new PDController(dragP, dragD);
     chute.SetActive(false);
 }
Ejemplo n.º 6
0
 // Start is called before the first frame update
 void Start()
 {
     myRigidbody = GetComponent <Rigidbody>();
     controller  = GetComponent <PDController>();
 }
Ejemplo n.º 7
0
        static int Main(string[] mainargs)
        {
            if (mainargs.Length == 0)
            {
                System.Console.Error.WriteLine("usage: VesselSim.exe  - computes a solution given initial conditions like SolveText.exe but also simulates a vessel like running inside KSP");
                System.Console.Error.WriteLine("vessel options:  r0offset=<float>");
                System.Console.Error.WriteLine("                 v0offset=<float>");
                System.Console.Error.WriteLine("                 maxT=<float>");
                return(1);
            }
            var                solver     = new Solve();
            var                result     = new SolveResult();
            var                traj       = new Trajectory();
            var                controller = new PDController();
            bool               correct    = false;
            Vector3d           r0         = Vector3d.zero;
            Vector3d           v0         = Vector3d.zero;
            Vector3d           rf         = Vector3d.zero;
            Vector3d           vf         = Vector3d.zero;
            Vector3d           r0offset   = Vector3d.zero; // move away from compute solution at start
            Vector3d           v0offset   = Vector3d.zero;
            int                rfaxes     = 0;
            int                vfaxes     = 0;
            double             dt         = 0.1;
            double             maxT       = 0;
            List <SolveTarget> targets    = new List <SolveTarget>();

            foreach (var arg in HGUtils.ToKeyValuePairs(mainargs))
            {
                bool used = solver.Set(arg.Item1, arg.Item2);
                if (controller.Set(arg.Item1, arg.Item2))
                {
                    used = true;
                }
                if (SetTargets(arg.Item1, arg.Item2, ref r0, ref v0, ref rf, ref vf, ref rfaxes, ref vfaxes, ref targets, ref correct))
                {
                    used = true;
                }
                if (Set(arg.Item1, arg.Item2, ref dt, ref maxT, ref r0offset, ref v0offset))
                {
                    used = true;
                }
                if (!used)
                {
                    throw new System.ArgumentException("Unexpected argument: " + arg.Item1 + "=" + arg.Item2);
                    return(1);
                }
            }
            SetFinalTarget(rf, vf, rfaxes, vfaxes, ref targets);

            if (targets.Count == 0)
            {
                System.Console.Error.WriteLine("Error! You must specify targets with either target=[x,y,z], rf=[x,y,z] or vf=[x,y,z]");
                return(1);
            }

            result = MainProg.MultiPartSolve(ref solver, ref traj, r0, v0, ref targets, (float)solver.g, solver.extendTime, correct);
            if (result.isSolved())
            {
                List <string> comments = new List <string>();
                System.Console.Error.WriteLine("Writing solution to: solution.dat");
                traj.Write("solution.dat", comments);
                if (traj.T > maxT)
                {
                    maxT = traj.T;
                }
                r0 = r0 + r0offset;
                v0 = v0 + v0offset;
                Simulate(controller, ref traj, r0, v0, new Vector3d(0, -solver.g, 0), dt, maxT);
            }
            return(0);
        }
Ejemplo n.º 8
0
 private void Start()
 {
     controller = GetComponent <PDController>();
 }