private String PoseOutput(vive_pose pose)
    {
        Vector3    goalPos    = pose.current_pose.position;
        Quaternion goalOrient = pose.current_pose.orientation;
        String     outStr     = String.Format("{0},{1},{2};", goalPos.x, goalPos.y, goalPos.z);

        outStr += String.Format("{0},{1},{2},{3};", goalOrient.w, goalOrient.x, goalOrient.y, goalOrient.z);
        return(outStr);
    }
    void Start()
    {
        sock   = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        sendEp = new IPEndPoint(IPAddress.Parse(IP), 11000);

        viveControllerL = GameObject.Find("Controller (left)");
        viveControllerR = GameObject.Find("Controller (right)");

        contrStatesL = viveControllerL.GetComponent <vive_buttons>();
        contrStatesR = viveControllerR.GetComponent <vive_buttons>();
        controllers  = new List <vive_buttons> {
            contrStatesL, contrStatesR
        };

        transformL = viveControllerL.transform;
        transformR = viveControllerR.transform;
        poseL      = new vive_pose(transformL);
        poseR      = new vive_pose(transformR);

        //VibrationState vibr_state = new VibrationState(IP, 11100);
        //vibr_state.sock.BeginReceiveFrom(vibr_state.buffer, 0, VibrationState.BUFFER_SIZE, SocketFlags.None,
        //ref vibr_state.temp_ep, new AsyncCallback(handleVibrationData), vibr_state);
        //print("Begin receive data");
    }