예제 #1
0
    void setAngle(bool lft, float angle, m3piComm m3piCtrl)
    {
        if (angle < 0)
        {
            lft = !lft;
        }
        angle = Mathf.Abs(angle);

//		setAngleHelp (m3piCtrl, ref angle, 21.0f, 6, 1, lft);
//		setAngleHelp (m3piCtrl, ref angle, 15.0f, 4, 1, lft);
//		setAngleHelp (m3piCtrl, ref angle, 8.0f, 1, 1, lft);

//		setAngleHelp (m3piCtrl, ref angle, 51.0f, 15, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 35.0f, 10, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 28f, 8, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 20f, 6, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 16f, 5, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 8f, 3, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 3.4f, 2, 2, lft);

        for (int i = 0; i < m3piCtrl.angleHelpArray.Length; i++)
        {
            setAngleHelp(m3piCtrl, ref angle,
                         m3piCtrl.angleHelpArray [i].angle, m3piCtrl.angleHelpArray [i].sp, m3piCtrl.angleHelpArray [i].wt, lft);
        }

        m3piCtrl.run2(Time.time);
    }
예제 #2
0
    // same as other control code
    bool goStraight(GameObject local, Vector3 remotePos, m3piComm m3piCtrl)
    {
        Vector3 localPos = local.transform.position;

        localPos.y = 0;

        Vector3 dis = remotePos - localPos;

        print("goStraight\tdis:\t" + dis.magnitude.ToString("F3") + "\tref:\t" +
              remotePos.ToString("F3") + "\tcur:\t" + localPos.ToString("F3"));

        if (dis.magnitude > (Utility.getInst().disError * 1.5f))
        {
            Vector3 vCur      = local.transform.rotation * Vector3.forward;
            float   angle     = Vector3.Angle(vCur, dis);
            bool    isForward = (vCur.x * dis.x >= 0) || (vCur.z * dis.z >= 0);
            if ((angle > 90.0f) || (angle < -90.0f))
            {
                isForward = false;
            }
            else
            {
                isForward = true;
            }
            setSpeedWait(dis.magnitude, isForward, m3piCtrl);
            return(false);
        }
        else
        {
            return(true);
        }
    }
예제 #3
0
    // Use this for initialization
    void Start()
    {
        m3piCtrls     = new m3piComm[2];
        m3piCtrls [0] = new m3piComm();
        m3piCtrls [0].setName("A");
        m3piCtrls [1] = new m3piComm();
        m3piCtrls [1].setName("B");
        print("create 2 ctrls");

        count     = new int[2];
        count [0] = count [1] = 0;
        countNo   = 20;

//		steps = new int[2];
//		steps [0] = steps [1] = 1;
        step = 1;

        isFirst     = new int[2];
        isFirst [0] = isFirst [1] = 0;

        lastPos        = new Vector3[2];
        lastPos [0]    = lastPos [1] = new Vector3();
        defaultRBT     = new Vector3[2];
        defaultRBT [0] = defaultRBT [1] = new Vector3();

        yThreshold = 0.07f;
        lastIdx    = 1;
        m_bRbtConn = false;

        carRbts     = new GameObject[2];
        carRbts [0] = carRbtB;          //old
        carRbts [1] = carRbtA;          //new

        print("after start");
    }
예제 #4
0
    public bool checkRtnMsg(m3piComm ctrl)
    {
        // check if there is return msg already
        if (!ctrl.m_bRtn)
        {
            float executeTime = Time.time - ctrl.m_runTime;
            // check if it is already too long then return and sync up them again
            if (executeTime < (ctrl.m_cmdTime + 0.5f))
            {
                return(false);
            }
            Debug.Log("exe:\t" + executeTime + "\test:\t" + ctrl.m_cmdTime);
            Debug.Log("wait too long:\t" + executeTime);
            ctrl.m_exStop = true;
            return(true);
        }

        if (ctrl.m_returnMsg.Length > 0)
        {
            Debug.Log(ctrl.m_returnMsg);
        }
        ctrl.m_returnMsg = "";
        if (StreamSingleton.getInst().getReceiveThread() != null)
        {
            //Debug.Log ("abort in checkRtnMsg and return true" + ctrl.receiveThread.ThreadState);
            StreamSingleton.getInst().getReceiveThread().Abort();
        }
        return(true);
    }
예제 #5
0
    void setAngle(bool lft, float angle, m3piComm m3piCtrl)
    {
        if (angle < 0)
        {
            lft = !lft;
        }
        angle = Mathf.Abs(angle);
        for (int i = 0; i < m3piCtrl.angleHelpArray.Length; i++)
        {
            setAngleHelp(m3piCtrl, ref angle, m3piCtrl.angleHelpArray [i].angle, m3piCtrl.angleHelpArray [i].sp, m3piCtrl.angleHelpArray [i].wt, lft);
        }
//		setAngleHelp (m3piCtrl, ref angle, 55.0f, 5, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 44.0f, 3, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 34.7f, 2, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 24.7f, 5, 1, lft);
//		setAngleHelp (m3piCtrl, ref angle, 17.98f, 3, 1, lft);
//		setAngleHelp (m3piCtrl, ref angle, 9.6f, 1, 1, lft);
//		setAngleHelp (m3piCtrl, ref angle, 5.0f, 0, 1, lft);
//		setAngleHelp (m3piCtrl, ref angle, 51.0f, 15, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 35.0f, 10, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 28f, 8, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 20f, 6, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 16f, 5, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 8f, 3, 2, lft);
//		setAngleHelp (m3piCtrl, ref angle, 3.4f, 2, 2, lft);
        m3piCtrl.run2(Time.time);
        //m_returnMsg = m3piCtrlB.m_returnMsg;
        //Debug.Log ("receive from m3pi:\t" + m_returnMsg);
    }
예제 #6
0
 static public m3piComm getInst()
 {
     if (m_inst == null)
     {
         m_inst = new m3piComm();
     }
     return(m_inst);
 }
예제 #7
0
 void createM3pi()
 {
     m3piCtrls     = new m3piComm[2];
     m3piCtrls [0] = new m3piComm();
     m3piCtrls [0].setName("A");
     m3piCtrls [1] = new m3piComm();
     m3piCtrls [1].setName("B");
     print("create 2 ctrls");
 }
예제 #8
0
 // Use this for initialization
 void Start()
 {
     m_inst = m3piComm.getInst();
     m_inst.open();
     m_inst.setName(robotName);
     rot = this.transform.rotation;
     pos = this.transform.position;
     //Debug.Log (pos);
 }
예제 #9
0
    void setSpeedWait(float dis, bool fw, m3piComm m3piCtrl)
    {
        for (int i = 0; i < m3piCtrl.posHelpArray.Length; i++)
        {
            setSpeedWaitHelp(m3piCtrl, ref dis,
                             m3piCtrl.posHelpArray [i].dis, m3piCtrl.posHelpArray [i].sp, m3piCtrl.posHelpArray [i].wt, fw);
        }

        m3piCtrl.run2(Time.time);
    }
예제 #10
0
 // Use this for initialization
 void Start()
 {
     _destination = new Vector3();
     if (!_isViewer)
     {
         _robotCtrl = new m3piComm();
         _robotCtrl.setName("B");
     }
     step  = 1;
     wCtrl = stylus.GetComponent <wandCtrl> ();
 }
예제 #11
0
    void setSpeedWait(float dis, bool fw, m3piComm m3piCtrl)
    {
        for (int i = 0; i < m3piCtrl.posHelpArray.Length; i++)
        {
            setSpeedWaitHelp(m3piCtrl, ref dis,
                             m3piCtrl.posHelpArray[i].dis, m3piCtrl.posHelpArray[i].sp, m3piCtrl.posHelpArray[i].wt, fw);
        }

        m3piCtrl.run2(Time.time);
        //m_returnMsg = m3piCtrlB.m_returnMsg;
        //Debug.Log ("receive from m3pi:\t" + m_returnMsg);
    }
예제 #12
0
    // Use this for initialization
    void Start()
    {
        m3piCtrls     = new m3piComm[2];
        m3piCtrls [0] = new m3piComm();
        m3piCtrls [0].setName("A");
        m3piCtrls [1] = new m3piComm();
        m3piCtrls [1].setName("B");

        count     = new int[2];
        count [0] = count [1] = 0;
        countNo   = 20;

        step     = new int[2];
        step [0] = step [1] = 0;
    }
예제 #13
0
    void setAngle(bool lft, float angle, m3piComm m3piCtrl)
    {
        if (angle < 0)
        {
            lft = !lft;
        }
        angle = Mathf.Abs(angle);

        for (int i = 0; i < m3piCtrl.angleHelpArray.Length; i++)
        {
            setAngleHelp(m3piCtrl, ref angle,
                         m3piCtrl.angleHelpArray [i].angle, m3piCtrl.angleHelpArray [i].sp, m3piCtrl.angleHelpArray [i].wt, lft);
        }

        m3piCtrl.run2(Time.time);
    }
예제 #14
0
    protected bool turnAround(GameObject local, GameObject remote, m3piComm m3piCtrl, bool isLocal = false)
    {
        Vector3 vFacing, vCur;

        if (isLocal)
        {
            vFacing = remote.transform.localPosition - local.transform.localPosition;
            vCur    = local.transform.localRotation * Vector3.forward;
        }
        else
        {
            vFacing = remote.transform.position - local.transform.position;
            vCur    = local.transform.rotation * Vector3.forward;
        }

        vCur.y    = 0;
        vFacing.y = 0;
        float angle = Vector3.Angle(vCur, vFacing);

        if (angle > 90.0f)
        {
            angle = angle - 180.0f;
        }

        if (Mathf.Abs(angle) % 180.0f > Utility.getInst().angleError)
        {
            Vector3 vUp = Vector3.Cross(vCur, vFacing);
//			print ("turnAround:\t" + angle + "\tupVector:\t" + vUp.ToString ("F2"));
            if (vUp.y > 0.00005)
            {
                setAngle(false, angle, m3piCtrl);
            }
            else if (vUp.y < -0.00005)
            {
                setAngle(true, angle, m3piCtrl);
            }
            else
            {
                return(true);
            }
            return(false);
        }
        else
        {
            return(true);
        }
    }
예제 #15
0
 void setSpeedWaitHelp(m3piComm m3piCtrl, ref float dis, float thres, int sp, int wt, bool fw)
 {
     while (dis > thres)
     {
         m3piCtrl.setSpeed(sp);
         m3piCtrl.setWaitTime(wt);
         if (fw)
         {
             m3piCtrl.forward();
         }
         else
         {
             m3piCtrl.backward();
         }
         dis -= thres;
     }
 }
예제 #16
0
 void setAngleHelp(m3piComm m3piCtrl, ref float angle, float thres, int sp, int wt, bool lft)
 {
     while (angle > thres)
     {
         m3piCtrl.setSpeed(sp);
         m3piCtrl.setWaitTime(wt);
         if (lft)
         {
             m3piCtrl.left();
         }
         else
         {
             m3piCtrl.right();
         }
         angle -= thres;
     }
 }
예제 #17
0
    protected bool goStraight(GameObject local, GameObject remote, m3piComm m3piCtrl, bool isLocal = false)
    {
        Vector3 localPos, remotePos;

        if (isLocal)
        {
            localPos  = local.transform.localPosition;
            remotePos = remote.transform.localPosition;
        }
        else
        {
            localPos  = local.transform.position;
            remotePos = remote.transform.position;
        }

        localPos.y  = 0;
        remotePos.y = 0;

        Vector3 dis = remotePos - localPos;

//		print ("goStraight\tdis:\t" + dis.magnitude.ToString ("F3") + "\tref:\t" +
//			remotePos.ToString ("F3") + "\tcur:\t" + localPos.ToString ("F3"));

        if (dis.magnitude > Utility.getInst().disError)
        {
            Vector3 vCur = local.transform.rotation * Vector3.forward;
            //Vector3 vUp = Vector3.Cross (dis, vCur);//print ("goStraight\tvCur:\t" + vCur.ToString ("F2") + "\tvUp:\t" + vUp.ToString ("F2"));
            float angle     = Vector3.Angle(vCur, dis);
            bool  isForward = (vCur.x * dis.x >= 0) || (vCur.z * dis.z >= 0);
            if ((angle > 90.0f) || (angle < -90.0f))
            {
                isForward = false;
            }
            else
            {
                isForward = true;
            }
            setSpeedWait(dis.magnitude, isForward, m3piCtrl);
            return(false);
        }
        else
        {
            return(true);
        }
    }
예제 #18
0
    void setAngle(bool lft, float angle, m3piComm m3piCtrl)
    {
        if (angle < 0)
        {
            lft = !lft;
        }
        angle = Mathf.Abs(angle);

        for (int i = 0; i < m3piCtrl.angleHelpArray.Length; i++)
        {
            setAngleHelp(m3piCtrl, ref angle,
                         m3piCtrl.angleHelpArray[i].angle, m3piCtrl.angleHelpArray[i].sp, m3piCtrl.angleHelpArray[i].wt, lft);
        }

        m3piCtrl.run2(Time.time);
        //m_returnMsg = m3piCtrlB.m_returnMsg;
        //Debug.Log ("receive from m3pi:\t" + m_returnMsg);
    }
예제 #19
0
    // Use this for initialization
    void Start()
    {
        m3piCtrler = new m3piComm();
        m3piCtrler.setName(robotName);
        count   = 0;
        step    = 1;
        countNo = 40;

        // initialize
        isLastRound    = false;
        isLastStraight = false;
        lastPos        = new Vector3();
        lastRot        = Quaternion.identity;


        yThreshold = 0.07f;
        //sync (carB2, carA2);

        carB2ref.SetActive(false);
        //enableTest = true;
    }
예제 #20
0
    void setSpeedWait(float dis, bool fw, m3piComm m3piCtrl)
    {
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.25f, 7, 8, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.13f, 6, 6, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.06f, 4, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.022f, 3, 2, fw);

//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.19f, 25, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.167f, 20, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.126f, 15, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.093f, 10, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.06f, 6, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.033f, 3, 3, fw);

        for (int i = 0; i < m3piCtrl.posHelpArray.Length; i++)
        {
            setSpeedWaitHelp(m3piCtrl, ref dis,
                             m3piCtrl.posHelpArray [i].dis, m3piCtrl.posHelpArray [i].sp, m3piCtrl.posHelpArray [i].wt, fw);
        }

        m3piCtrl.run2(Time.time);
    }
예제 #21
0
    void setSpeedWait(float dis, bool fw, m3piComm m3piCtrl)
    {
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.21f, 20, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.17f, 15, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.11f, 15, 2, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.074f, 10, 2, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.04f, 5, 2, fw);
        for (int i = 0; i < m3piCtrl.posHelpArray.Length; i++)
        {
            setSpeedWaitHelp(m3piCtrl, ref dis, m3piCtrl.posHelpArray [i].dis, m3piCtrl.posHelpArray [i].sp, m3piCtrl.posHelpArray [i].wt, fw);
        }

//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.19f, 25, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.167f, 20, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.126f, 15, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.093f, 10, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.06f, 6, 3, fw);
//		setSpeedWaitHelp (m3piCtrl, ref dis, 0.033f, 3, 3, fw);

        m3piCtrl.run2(Time.time);
        //m_returnMsg = m3piCtrlB.m_returnMsg;
        //Debug.Log ("receive from m3pi:\t" + m_returnMsg);
    }
예제 #22
0
    // new version for sharing thread
    public bool checkRtnMsg2(m3piComm ctrl)
    {
        //if (ctrl.m_runTime < 0.1f || ctrl.m_bRtn)
        if (ctrl.m_bRtn)
        {
            return(true);               // just started
        }
        // check if the command is matched with one of the received msg and will discard unused msg
        int matchResult = StreamSingleton.getInst().match(ctrl.m_command);

        if (matchResult == 0)
        {
            // matched
            StreamSingleton.getInst().minusThread();
            ctrl.m_bRtn = true;
            return(true);
        }
        // then check if it waits not too long
        else        //(matchResult == 2)
        {
            float executeTime = Time.time - ctrl.m_runTime;
            if (executeTime < (ctrl.m_cmdTime + 0.8f))
            {
                return(false);
            }
            else
            {
                // too long then stop one, if it is 0 for link count, kill the thread
                Debug.Log("wait too long:\t" + ctrl.m_cmdTime + "\t" + executeTime);
                //StreamSingleton.getInst ().setExstop (true);
                StreamSingleton.getInst().minusThread();
                ctrl.m_bRtn = true;                             // do not need to wait for next return msg
                return(true);
            }
        }
        //return false;
    }
예제 #23
0
    bool turnAround(GameObject local, Vector3 remotePos, m3piComm m3piCtrl)
    {
        Vector3 vFacing = remotePos - local.transform.position;
        Vector3 vCur    = local.transform.rotation * Vector3.forward;

        vCur.y    = 0;
        vFacing.y = 0;
        float angle = Vector3.Angle(vCur, vFacing);

        if (angle > 90.0f)
        {
            angle = angle - 180.0f;
        }

        if (Mathf.Abs(angle) % 180.0f > 8.0f)
        {
            Vector3 vUp = Vector3.Cross(vCur, vFacing);
            print("turnAround:\t" + angle + "\tupVector:\t" + vUp.ToString("F2"));
            if (vUp.y > 0.00005)
            {
                setAngle(false, angle, m3piCtrl);
            }
            else if (vUp.y < -0.00005)
            {
                setAngle(true, angle, m3piCtrl);
            }
            else
            {
                return(true);
            }
            return(false);
        }
        else
        {
            return(true);
        }
    }
예제 #24
0
    void setSpeedWaitHelp(m3piComm m3piCtrl, ref float dis, float thres, int sp, int wt, ref bool fw, bool abs = false)
    {
        while ((!abs && (dis > thres)) ||
               (abs && (Mathf.Abs(dis - thres) < dis)))
        {
//		while (dis > thres) {
            m3piCtrl.setSpeed(sp);
            m3piCtrl.setWaitTime(wt);
            if (fw)
            {
                m3piCtrl.forward();
            }
            else
            {
                m3piCtrl.backward();
            }
            dis -= thres;
            if (dis < 0)
            {
                fw = !fw;
            }
            dis = Mathf.Abs(dis);
        }
    }
예제 #25
0
//	protected void ignoreYPos (GameObject local, GameObject remote, ref Vector3 localPos, ref Vector3 remotePos)
//	{
//		// get local position
//		localPos = local.transform.localPosition;
//		remotePos = remote.transform.localPosition;
//		// ignore y information
//		localPos.y = 0;
//		remotePos.y = 0;
//	}
//
//	protected void sync (GameObject local, GameObject remote, m3piComm m3piCtrl, ref int step, int index = 0)
//	{
//		if (!Utility.getInst ().checkRtnMsg2 (m3piCtrl))
//			return;
//
//		//		print ("local\t" + local.transform.position + "\t" + local.transform.localPosition);
//		//		print ("remote\t" + remote.transform.position + "\t" + remote.transform.localPosition);
//		Utility.getInst ().drawRays (local.transform, remote.transform, true);
//
//		Vector3 localPos = new Vector3 (), remotePos = new Vector3 ();
//		ignoreYPos (local, remote, ref localPos, ref remotePos);
//
//		m3piCtrl.clear ();
//
//		// send command
//		if (step != 0) {
//			print ("move index:\t" + index + "\tstep:\t" + step);
//			switch (step) {
//			case 1:
//				// check distance first
//				if (Utility.getInst ().checkMatchV2 (localPos, remotePos)) {
//					step = 0;
//				} else {
//					if (turnAround (local, remote, m3piCtrl, true)) {
//						//						print ("move index:\t" + index + "\tstep:\t" + step);
//						goStraight (local, remote, m3piCtrl, true);
//						step = 2;
//					}
//				}
//				break;
//			case 2:
//				// moved car with going straight
//				if (goStraight (local, remote, m3piCtrl, true)) {
//					step = 0;
//					//print ("move index:\t" + index + "\tstep:\t" + step);
//				} else {
//					step = 1;
//					//print ("move index:\t" + index + "\tstep:\t" + step);
//				}
//				break;
//			default:
//				break;
//			}
//		}
//	}

    void setAngleHelp(m3piComm m3piCtrl, ref float angle, float thres, int sp, int wt, ref bool lft, bool abs = false)
    {
        //while (angle > thres) {
        while ((!abs && (angle > thres)) ||
               (abs && (Mathf.Abs(angle - thres) < angle)))
        {
            m3piCtrl.setSpeed(sp);
            m3piCtrl.setWaitTime(wt);
            if (lft)
            {
                m3piCtrl.left();
            }
            else
            {
                m3piCtrl.right();
            }
            angle -= thres;
            if (angle < 0)
            {
                lft = !lft;
            }
            angle = Mathf.Abs(angle);
        }
    }
예제 #26
0
 void createM3pi()
 {
     m3piCtrl = new m3piComm();
     m3piCtrl.setName("B");
     print("create ctrl");
 }