// <summary>
    // Use this for initialization
    // </summary>
    void Start()
    {
        startTime = Time.realtimeSinceStartup;
        input     = GetComponent <GetInput> ();
        //GameObject o = GameObject.Find("Kart " + kartNum);
        Debug.Log("here");
        //Debug.Log("rrr"+o.transform);
        rb = GetComponent <Rigidbody> ();
        Debug.Log("rrr" + rb);
        boost      = 1f;
        fr         = GameObject.Find("wcfr " + kartNum).GetComponent <WheelCollider>();
        fl         = GameObject.Find("wcfl " + kartNum).GetComponent <WheelCollider>();
        br         = GameObject.Find("wcbr " + kartNum).GetComponent <WheelCollider>();
        bl         = GameObject.Find("wcbl " + kartNum).GetComponent <WheelCollider>();
        fr.enabled = true;
        fl.enabled = true;
        br.enabled = true;
        bl.enabled = true;

        if (isAI)
        {
            ItemsAI.updateItems();
            PathPlanningDataStructures.initializePathPlanning();
            kartp = GetComponentInChildren <PathPlanningKart> ();
            kartp.PathPlanInitialSegment();
            MAX_SPEED *= .8f;
        }
    }
    public float Estimate(Node n, bool useItems)
    {
        int numCarsClaiming = PathPlanningDataStructures.nodeToCount [n.position];

        if (numCarsClaiming > 0)
        {
            return(((numCarsClaiming * 0.1f) + 1.0f) * heuristicCost [n] /
                   (useItems ? ItemsAI.getReduction(n) : 1.0f));
        }
        else
        {
            return(heuristicCost [n] / (useItems ? ItemsAI.getReduction(n) : 1.0f));
        }
    }
예제 #3
0
    //movement variable descriptions

    //force from motor
    //	maxTourque (scaling for forward input)
    //	Effeciency (assume 1)
    //	Gear Ratio (1 - 150 some int)
    //	Angular speed (rpms)
    //	Wheel Radius

    //	uphill vs downhill (1 for uphill -1 for downhill)
    //	m =mass
    //	g = 9.8
    //	Gradient Angle (Gradient alpha) (angle of slope - 0)
    //
    //rolling resistance
    //	rolling resistance coeffecient (fr)
    //	wieight
    //	cos(alpha) slope
    //
    //drag force
    //	density of air (p=1.21 kg/m^3)
    //	drag coeffecient (cd=1.2)
    //	Area (cross sectional = .004 m^2)
    //	Velocity vector (y) squared magnitude
    //  Lw = car geoemetry = 0.15



    //mass m - ydot squared = velocity squared in forward direction
    //tan(phi) phi is max turning angle (30 degrees) * turning input to get current phi


    // Use this for initialization
    void Start()
    {
        input = GetComponent <GetInput>();
        position.Set(50, 50, 0);
        motorOutForce = (mTor * effec * gearRatio * angularSpeed / 60) / wheelRad;
        //resistForce = 0;
        rollingResistForce = rollResist * mass * g * Mathf.Cos(gradAngle);
        //rollingResistForce = 0;
        airResistForce   = .5f * airDensity * dragCoef * areaCross;
        centripetalForce = mass / lW;

        if (isAI)
        {
            ItemsAI.updateItems();
            PathPlanningKart k = GetComponent <PathPlanningKart> ();
            k.PathPlanInitialSegment();
            MAX_SPEED = MAX_SPEED * .95f;
        }
    }
예제 #4
0
    //uncomment for original movement code
    void FixedUpdate()
    {
        if (isAI)
        {
            PathPlanningKart k = GetComponent <PathPlanningKart>();
            k.PathPlanNextSegment();
            Tuple <float, float> t = carController.speedAndTurn(this.gameObject);
            turnInput    = (float)t.Second;
            forwardInput = (float)t.First;
            ItemsAI.updateItems();
            k.UseItem();
        }
        else if (Input.GetKeyUp(KeyCode.P))
        {
            Time.timeScale = paused ? 1 : 0;
            paused         = !paused;
        }
        else
        {
            turnInput    = input.getTurnInput();
            forwardInput = input.getForwardInput();
        }

        //how quickly do we want to turn
        currentDeltaTurn = DELTA_TURN * turnInput;
        //takes care of ideling to go back straight && also turning

        //Debug.Log ("(turnValue + currentDeltaTurn): "+(turnValue + currentDeltaTurn)+"  MAXTU: "+(MAX_TURN)+"  speed: "+speed);
        if (Mathf.Abs(turnInput) < .1 && turnValue > 0)
        {
            turnValue = 0;
            // Debug.Log("Idle Pos");
            if (turnValue < DELTA_TURN)
            {
                turnValue = 0;
            }
            else
            {
                turnValue -= DELTA_TURN;
            }
        }
        else if (Mathf.Abs(turnInput) < .1 && turnValue < 0)
        {
            turnValue = 0;
            // Debug.Log("Idle Neg");
            if (turnValue > -DELTA_TURN)
            {
                turnValue = 0;
            }
            else
            {
                turnValue += DELTA_TURN;
            }
        }
        else if ((turnValue + currentDeltaTurn) < (MAX_TURN) && (turnValue + currentDeltaTurn) > (-MAX_TURN))
        {
            // Debug.Log("Turn");
            turnValue += currentDeltaTurn;
        }
        //Debug.Log("DeltaTurn: " + currentDeltaTurn);
        //Debug.Log("turnValue: " + turnValue);

        //Debug.Log("Vert: "+Input.GetAxis(vertical));
        //which way do we want to go


        //takes care of ACCELeration
        speed += ACCEL * forwardInput;
        if (speed < -MAX_SPEED)
        {
            speed = -MAX_SPEED;
        }
        if (speed > MAX_SPEED)
        {
            speed = MAX_SPEED;
        }
        if (forwardInput == 1 && speed < MAX_SPEED)
        {
            speed += ACCEL;
        }
        else if (forwardInput == -1 && speed > -MAX_SPEED)
        {
            speed -= ACCEL;
        }
        else if (forwardInput == 0 && speed < 0)
        {
            if (speed > -IDLE_ACCEL)
            {
                speed = 0;
            }
            else
            {
                speed += IDLE_ACCEL;
            }
        }
        else if (forwardInput == 0 && speed > 0)
        {
            if (speed < IDLE_ACCEL)
            {
                speed = 0;
            }
            else
            {
                speed -= IDLE_ACCEL;
            }
        }
        else if (Mathf.Abs(speed) > MAX_SPEED)
        {
            speed = Mathf.Sign(speed) * MAX_SPEED;
        }

        //applies boost, if any
        speed = speed * boost;

        //calculates the direction displacement vector
        rotationVector.Set(0, turnValue * speed * Time.deltaTime, 0);
        direction = Quaternion.Euler(rotationVector) * direction;

        //Debug.Log ("Direction: "+ direction);
        //Debug.Log ("Speed: " +speed);

        transform.position += direction * (speed * Time.deltaTime);
        if (!goingBackwards)
        {
            transform.rotation = Quaternion.LookRotation(direction);
        }
        else
        {
            transform.rotation = Quaternion.LookRotation(-1 * direction);
        }
        //newEquations ();
        //equations();
        //updateLogVectors ();
        if (writePositionsToFile)
        {
            WriteToRepo();
        }
        //uncomment for original movement code
    }
    // <summary>
    // Update is called once per frame
    // </summary>
    void FixedUpdate()
    {
        if (Time.realtimeSinceStartup - startTime > 4.5f)
        {
            print("counting down");
            start = true;
        }

        if (start)
        {
            //Debug.Log("Delta Time: " + Time.deltaTime);
            Debug.Log("boost: " + boost);
            WheelHit hit;
            float    travelL  = 1.0f;
            float    travelR  = 1.0f;
            float    AntiRoll = 5000;

            bool groundedL = fl.GetGroundHit(out hit);
            if (groundedL)
            {
                travelL = (-fl.transform.InverseTransformPoint(hit.point).y - fl.radius) / fl.suspensionDistance;
            }

            bool groundedR = fr.GetGroundHit(out hit);
            if (groundedR)
            {
                travelR = (-fr.transform.InverseTransformPoint(hit.point).y - fr.radius) / fr.suspensionDistance;
            }

            var antiRollForce = (travelL - travelR) * AntiRoll;

            if (groundedL)
            {
                rb.AddForceAtPosition(fl.transform.up * -antiRollForce,
                                      fl.transform.position);
            }
            if (groundedR)
            {
                rb.AddForceAtPosition(fr.transform.up * antiRollForce,
                                      fr.transform.position);
            }

            bool bgroundedL = bl.GetGroundHit(out hit);
            if (bgroundedL)
            {
                travelL = (-bl.transform.InverseTransformPoint(hit.point).y - bl.radius) / bl.suspensionDistance;
            }

            bool bgroundedR = br.GetGroundHit(out hit);
            if (bgroundedR)
            {
                travelR = (-br.transform.InverseTransformPoint(hit.point).y - br.radius) / br.suspensionDistance;
            }


            if (bgroundedL)
            {
                rb.AddForceAtPosition(bl.transform.up * -antiRollForce,
                                      bl.transform.position);
            }
            if (bgroundedR)
            {
                rb.AddForceAtPosition(br.transform.up * antiRollForce,
                                      br.transform.position);
            }
            if (isAI)
            {
                //PathPlanningKart k = GetComponentInChildren<PathPlanningKart>();
                kartp.PathPlanNextSegment();
                Tuple <float, float> t = carController.speedAndTurn(this.gameObject);
                turnInput    = (float)t.Second;
                forwardInput = (float)t.First;
                //Debug.Log("Forward Input:" + forwardInput + " Turn Input:" + turnInput);
                ItemsAI.updateItems();
                kartp.UseItem();
            }
            else
            {
                turnInput    = input.getTurnInput();
                forwardInput = input.getForwardInput();
                //Debug.Log("Forward Input:" + forwardInput + " Turn Input:" + turnInput);
            }

            brakeInput = input.getBraking();
            if (rb.velocity.magnitude < MAX_SPEED && forwardInput != 0)
            {
                //print("Y" + rb.velocity.magnitude + " X:" + forwardInput + " Z:" + boost);

                br.motorTorque = forwardInput * motorForce * boost;
                bl.motorTorque = forwardInput * motorForce * boost;
            }
            else
            {
                br.motorTorque = 0;
                bl.motorTorque = 0;
            }
            //		} else {
            //			br.brakeTorque = -1*forwardInput * brakeForce;
            //			bl.brakeTorque = -1*forwardInput * brakeForce;
            //			fr.brakeTorque = -1*forwardInput * brakeForce;
            //			fl.brakeTorque = -1*forwardInput * brakeForce;
            //		}
            //		if (brakeInput > 0) {
            //			br.motorTorque = 0;
            //			bl.motorTorque = 0;
            //		}

            fr.steerAngle = turnInput * turnForce;
            fl.steerAngle = turnInput * turnForce;

            br.brakeTorque = brakeInput * brakeForce * boost;
            bl.brakeTorque = brakeInput * brakeForce * boost;
            fr.brakeTorque = brakeInput * brakeForce * boost;
            fl.brakeTorque = brakeInput * brakeForce * boost;

            br.brakeTorque += studder * brakeForce;
            bl.brakeTorque += studder * brakeForce;
            fr.brakeTorque += studder * brakeForce;
            fl.brakeTorque += studder * brakeForce;


            if (writePositionsToFile)
            {
                WriteToRepo();
            }

            Quaternion temp = transform.rotation;
            Vector3    tt   = temp.eulerAngles;
            if (tt.x > 300 && tt.x < 357)
            {
                tt.x = 359.5f;
            }
            if (tt.x < 50 && tt.x > .5f)
            {
                tt.x = .5f;
            }

            if (tt.z > 300 && tt.z < 359.5f)
            {
                tt.z = 359.5f;
            }
            if (tt.z < 50 && tt.z > .5f)
            {
                tt.z = .5f;
            }
            tt.Set(tt.x, tt.y, tt.z);
            temp.eulerAngles   = tt;
            transform.rotation = temp;
        }
    }