Ejemplo n.º 1
0
    bool compare(int num)
    {
        var res    = FanucModel.GetCoordsFromMat(model.ForwardTask(coords[num]));
        var resInv = model.InverseTask(ref res);

        bool[] f = new bool[resInv.Length / 6];
        for (int i = 0; i < resInv.Length / 6; ++i)
        {
            f[i] = true;
            for (int j = 0; j < 6; ++j)
            {
                if (Mathf.Abs(resInv[i, j] - coords[num][j]) > 0.5)
                {
                    f[i] = false;
                }
            }
        }
        bool finalF = false;

        for (int i = 0; i < resInv.Length / 6; ++i)
        {
            finalF = f[i] || finalF;
        }
        return(finalF);
    }
Ejemplo n.º 2
0
    void FixedUpdate()
    {
        A = PointA.transform.position;
        B = PointB.transform.position;
        if (Camera.GetComponent <raycast>().aims.Count > 0)
        {
            C   = Camera.GetComponent <raycast>().aims[0];
            C.y = teleg.transform.position.y;
        }
        else
        {
            C   = A;
            C.y = teleg.transform.position.y;
        }

        a = B - A;
        b = C - A;

        if (Math.Abs(A.x - C.x) < step && (Math.Abs(A.z - C.z) < step))
        {
            if (Camera.GetComponent <raycast>().aims.Count > 0)
            {
                isMoved = true;
                Camera.GetComponent <raycast>().aims.RemoveAt(0);
                Destroy(Camera.GetComponent <raycast>().balls[0]);
                Camera.GetComponent <raycast>().balls.RemoveAt(0);
                if (Camera.GetComponent <raycast>().aims.Count > 0)
                {
                    C   = Camera.GetComponent <raycast>().aims[0];
                    C.y = teleg.transform.position.y;
                }
            }
            else
            {
                isMoved = false;
            }
        }

        switch (Type)
        {
        case MoveType.RotateTeleguAndMove:
            Directional();
            break;

        case MoveType.RotateBarsAndMove:
            Parallel();
            break;
        }
        float[] coord = FanucModel.GetCoordsFromMat(CoordTransformation.UnityToRobot(FanucModel.coordMatrixDegrees(teleg.transform.position, teleg.transform.eulerAngles)));
        curPosText.text = coord[0].ToString("0.00") + " " + coord[1].ToString("0.00") + " " + coord[5].ToString("0.00");
    }
Ejemplo n.º 3
0
    // coords: x y z w p r
    public override float[] CalculateWrist(ref float[] coords)
    {
        var       param = KinematicChain;
        Matrix4x4 rot   = FanucModel.rotMatrixDegrees(coords[3], coords[4], coords[5]);

        float[] coord = new float[]
        {
            coords[0] - rot[0, 2] * param[5]._dParam,
            coords[1] - rot[1, 2] * param[5]._dParam,
            coords[2] - rot[2, 2] * param[5]._dParam,
            coords[3],
            coords[4],
            coords[5]
        };
        return(coord);
    }
Ejemplo n.º 4
0
    void FixedUpdate()
    {
        if (Input.anyKey)
        {
            first.transform.localRotation  = Quaternion.Euler(0, 0, -jointAngles[0]);
            second.transform.localRotation = Quaternion.Euler(0, -jointAngles[1], 0);
            third.transform.localRotation  = Quaternion.Euler(0, jointAngles[2] + jointAngles[1], 0);
            fourth.transform.localRotation = Quaternion.Euler(-jointAngles[3], 0, 0);
            fifth.transform.localRotation  = Quaternion.Euler(0, jointAngles[4], 0);
            sixth.transform.localRotation  = Quaternion.Euler(jointAngles[5], 0, 0);
            for (int i = 0; i < 6; ++i)
            {
                jointAnglesInc[i] = Input.GetAxis(Axis[i]) * speed * Time.deltaTime;
                jointAngles[i]   += jointAnglesInc[i];
            }
            //jointAngles[0] += Input.GetAxis("First") * speed * Time.deltaTime;
            //jointAngles[1] += Input.GetAxis("Second") * speed * Time.deltaTime;
            //jointAngles[2] += Input.GetAxis("Third") * speed * Time.deltaTime;
            //jointAngles[3] += Input.GetAxis("Fourth") * speed * Time.deltaTime;
            //jointAngles[4] += Input.GetAxis("Fifth") * speed * Time.deltaTime;
            //jointAngles[5] += Input.GetAxis("Sixth") * speed * Time.deltaTime;
        }



        string outputAngles      = "";
        string outputForwardTask = "";
        var    res = FanucModel.GetCoordsFromMat(model.fanucForwardTask(ref jointAngles));

        foreach (float j in jointAngles)
        {
            outputAngles += (j.ToString("0.00") + ", ");
        }

        jointCoord.text = outputAngles;
        foreach (float r in res)
        {
            outputForwardTask += (r.ToString("0.00") + ", ");
        }

        worldCoord.text = outputForwardTask;
        //  Debug.Log(outputAngles + "| " + outputForwardTask);
    }
Ejemplo n.º 5
0
    //move to FanucScriptUI
    void CoordDisplayAndSave()
    {
        string outputAngles      = "";
        string outputForwardTask = "";

        worldPos = FanucModel.GetCoordsFromMat(model.ForwardTask(jointAngles));
        foreach (float j in jointAngles)
        {
            outputAngles += (j.ToString("0.00") + ", ");
        }

        jointCoord.text = outputAngles;
        foreach (float r in worldPos)
        {
            outputForwardTask += (r.ToString("0.00") + ", ");
        }

        worldCoord.text = outputForwardTask;
        //  Debug.Log(outputAngles + "| " + outputForwardTask);
    }
Ejemplo n.º 6
0
    // Use this for initialization
    void Start()
    {
        isMoved = false;
        rotstep = WheelAngleSpeed * WheelRadius / telegaRadius;
        Debug.Log(rotstep);
        //rotstep = 1e-3f;
        step = WheelAngleSpeed * WheelRadius * Mathf.Deg2Rad;

        C = PointA.transform.position;
        //Net = SceneManager.Net;
        //Net.gameObject.SetActive(true);
        Camera     = GameObject.Find("Camera");
        modeText   = GameObject.Find("Telega Mode Text").GetComponent <Text>();
        curPosText = GameObject.Find("Telega currnet position").GetComponent <Text>();
        Debug.Log(teleg.transform.position + " " + teleg.transform.eulerAngles);
        var res = FanucModel.GetCoordsFromMat(CoordTransformation.UnityToRobot(FanucModel.coordMatrixDegrees(teleg.transform.position, teleg.transform.eulerAngles)));

        Debug.Log(res[0] + " " + res[1] + " " + res[2] + " " + res[3] + " " + res[4] + " " + res[5]);
        modeText.text = "Directional";
    }
    void DropdownValueChanged(Dropdown change)
    {
        var obj = SceneManager.Pull.Find(change.value);

        //Debug.Log("ROT: " + obj.transform.rotation.eulerAngles);
        //Vector4 coordsPos = new Vector4 ( obj.transform.position[0], obj.transform.position[1], obj.transform.position[2], 1 );
        Debug.Log(obj.transform.eulerAngles);
        Matrix4x4 coords = FanucModel.rotMatrixDegrees(obj.transform.eulerAngles.x, obj.transform.eulerAngles.y, obj.transform.eulerAngles.z);

        coords[0, 3] = obj.transform.position[0];
        coords[1, 3] = obj.transform.position[1];
        coords[2, 3] = obj.transform.position[2];
        coords       = CoordTransformation.UnityToRobot(coords);
        var outCoords = FanucModel.GetCoordsFromMat(coords);

        outCoordsStr = outCoords[0] + " " + outCoords[1] + " " + (outCoords[2] + 190f) + " " + outCoords[3] + " "
                       + outCoords[4] + " " + outCoords[5];
        SceneManager.FanucSettingsPanel.coordField.text = outCoordsStr;

        //coordText.text = coordTrans.UnityToRobotPosOnly(coordsPos).ToString();
    }
Ejemplo n.º 8
0
    void FixedUpdate()
    {
        Debug.Log(semafor);
        if (Input.anyKey && !Input.GetMouseButton(0) && !Input.GetMouseButton(1) && !SceneManager.ObserverMode && !SceneManager.UserControlLock && !inputField.isFocused && !InputSpeedField.isFocused && !addPoint.input.isFocused)
        {
            Debug.Log("im in update");
            for (int i = 0; i < 6; ++i)
            {
                UpdateCoord(i);
                if (mode == 0)
                {
                    if (jointAngles[i] + jointAnglesInc[i] > model.limMin[i] && jointAngles[i] + jointAnglesInc[i] < model.limMax[i])
                    {
                        jointAngles[i] += jointAnglesInc[i];
                    }
                }
                if (mode == 2)
                {
                    worldPos[i] += worldPosInc[i];
                }
            }

            RotateFanuc(FanucColliders, jointAngles);
            if (NoCollisions)
            {
                RotateFanuc(Fanuc, jointAngles);
            }
            else
            {
                StopCoroutine("Move");
            }

            if (ReadytoSend)
            {
                StartCoroutine(CoordtoServer());
                ReadytoSend = false;
            }

            NoCollisions = true;

            if (mode == 2)
            {
                try
                {
                    var tmp = model.InverseTask(ref worldPos);

                    if (tmp.Length == 0)
                    {
                        Debug.Log("ZEROOOOOOOO");
                        float[] worldPosTmp = new float[] {
                            worldPos[0] - (worldPosInc[0] / 2.0f),
                            worldPos[1] - (worldPosInc[1] / 2.0f),
                            worldPos[2] - (worldPosInc[2] / 2.0f),
                            worldPos[3] - (worldPosInc[3] / 2.0f),
                            worldPos[4] - (worldPosInc[4] / 2.0f),
                            worldPos[5] - (worldPosInc[5] / 2.0f)
                        };
                        tmp = model.InverseTask(ref worldPosTmp);
                    }
                    jointAngles = FanucModel.chooseNearestPose(tmp, ref jointAngles);
                }
                catch (System.Exception)
                {
                    Debug.Log("GOT IT");
                }
                //RotateFanuc(Fanuc, jointAngles);
            }

            RotateFanuc(FanucColliders, jointAngles);
            if (NoCollisions)
            {
                RotateFanuc(Fanuc, jointAngles);
            }
            else
            {
                StopCoroutine("Move");
            }

            if (ReadytoSend)
            {
                StartCoroutine(CoordtoServer());
                ReadytoSend = false;
            }

            NoCollisions = true;

            //realize what the hell is going on here

            //move to FanucScriptUI
            CoordDisplayAndSave();
        }
    }
Ejemplo n.º 9
0
    public IEnumerator Move(float[] newCoord)
    {
        semafor += 1;
        SceneManager.UserControlLock = true;
        Debug.Log(newCoord[0] + " " + newCoord[1] + " " + newCoord[2] + " " +
                  newCoord[3] + " " + newCoord[4] + " " + newCoord[5] + " " + mode + "--------------------------------------------------------");
        //Debug.Log(jointAngles[0] - newCoord[0]);
        float[] diff = new float[6];
        float   normCoef;

        if (mode == 0)
        {
            for (int i = 0; i < 6; ++i)
            {
                diff[i] = newCoord[i] - jointAngles[i];
            }
            normCoef = Mathf.Sqrt(diff[0] * diff[0] + diff[1] * diff[1] + diff[2] * diff[2] +
                                  diff[3] * diff[3] + diff[4] * diff[4] + diff[5] * diff[5]);
        }
        else
        {
            float[] newCoordTmp = FanucModel.chooseNearestPose(model.InverseTask(ref newCoord), ref jointAngles);
            newCoord = newCoordTmp;
            for (int i = 0; i < 6; ++i)
            {
                diff[i] = newCoord[i] - jointAngles[i];
            }
            normCoef = Mathf.Sqrt(diff[0] * diff[0] + diff[1] * diff[1] + diff[2] * diff[2] +
                                  diff[3] * diff[3] + diff[4] * diff[4] + diff[5] * diff[5]);
        }

        float[] diff2 = new float[6];

        float error = normCoef;

        while (error > 1 + speed * 0.02 && NoCollisions)
        {
            for (int i = 0; i < 6; ++i)
            {
                diff2[i] = newCoord[i] - jointAngles[i];
            }
            error = Mathf.Sqrt(diff2[0] * diff2[0] + diff2[1] * diff2[1] + diff2[2] * diff2[2] +
                               diff2[3] * diff2[3] + diff2[4] * diff2[4] + diff2[5] * diff2[5]);

            //Debug.Log(error);
            for (int i = 0; i < 6; ++i)
            {
                jointAngles[i] += diff[i] * speed * Time.deltaTime / normCoef;
            }
            RotateFanuc(FanucColliders, jointAngles);
            //Debug.Log(NoCollisions);

            yield return(new WaitForFixedUpdate());

            RotateFanuc(Fanuc, jointAngles);
            CoordDisplayAndSave();
            if (ReadytoSend)
            {
                StartCoroutine(CoordtoServer());
                ReadytoSend = false;
            }
        }

        if (NoCollisions)
        {
            for (int i = 0; i < 6; ++i)
            {
                jointAngles[i] = newCoord[i];
            }
            CoordDisplayAndSave();
        }
        if (!SceneManager.ObserverMode)
        {
            SceneManager.UserControlLock = false;
        }
        semafor -= 1;
    }
Ejemplo n.º 10
0
    // coords: x y z w p r
    public float[,] InverseTask(ref float[] coordIn)
    {
        var param = KinematicChain;

        float[] coord = CalculateWrist(ref coordIn);

        float a = 2.0f * param[0]._aParam * coord[0];
        float b = 2.0f * param[0]._aParam * coord[1];
        float c = 2.0f * param[1]._aParam * param[2]._aParam - 2.0f * param[1]._dParam * param[3]._dParam *
                  Mathf.Sin(param[1]._alphaParam) * Mathf.Sin(param[2]._alphaParam);
        float d = 2.0f * param[2]._aParam * param[1]._dParam * Mathf.Sin(param[1]._alphaParam) + 2.0f * param[1]._aParam * param[3]._dParam
                  * Mathf.Sin(param[2]._alphaParam);
        float e = param[1]._aParam * param[1]._aParam + param[2]._aParam * param[2]._aParam + param[1]._dParam *
                  param[1]._dParam + param[2]._dParam * param[2]._dParam + param[3]._dParam * param[3]._dParam -
                  param[0]._aParam * param[0]._aParam - coord[0] * coord[0] - coord[1] * coord[1] -
                  (coord[2] - param[0]._dParam) * (coord[2] - param[0]._dParam) + 2.0f *
                  param[1]._dParam * param[2]._dParam * Mathf.Cos(param[1]._alphaParam) + 2.0f * param[1]._dParam * param[3]._dParam *
                  Mathf.Cos(param[1]._alphaParam) * Mathf.Cos(param[2]._alphaParam) + 2.0f * param[2]._dParam * param[3]._dParam * Mathf.Cos(param[2]._alphaParam);
        float f = coord[1] * Mathf.Sin(param[0]._alphaParam);
        float g = -coord[0] * Mathf.Sin(param[0]._alphaParam);
        float h = -param[3]._dParam * Mathf.Sin(param[1]._alphaParam) * Mathf.Sin(param[2]._alphaParam);
        float i = param[2]._aParam * Mathf.Sin(param[1]._alphaParam);
        float j = param[1]._dParam + param[2]._dParam * Mathf.Cos(param[1]._alphaParam) + param[3]._dParam *
                  Mathf.Cos(param[1]._alphaParam) * Mathf.Cos(param[2]._alphaParam) - (coord[2] - param[0]._dParam) *
                  Mathf.Cos(param[0]._alphaParam);
        float r = 4.0f * param[0]._aParam * param[0]._aParam * (j - h) * (j - h) + Mathf.Sin(param[0]._alphaParam) *
                  Mathf.Sin(param[0]._alphaParam) * (e - c) * (e - c)
                  - 4.0f * param[0]._aParam * param[0]._aParam * Mathf.Sin(param[0]._alphaParam) * Mathf.Sin(param[0]._alphaParam)
                  * (coord[0] * coord[0] + coord[1] * coord[1]);
        float s = 4.0f * (4.0f * param[0]._aParam * param[0]._aParam * i * (j - h) + Mathf.Sin(param[0]._alphaParam) *
                          Mathf.Sin(param[0]._alphaParam) * d *
                          (e - c));
        float t = 2.0f * (4.0f * param[0]._aParam * param[0]._aParam * (j * j - h * h + 2.0f * i * i) +
                          Mathf.Sin(param[0]._alphaParam) * Mathf.Sin(param[0]._alphaParam)
                          * (e * e - c * c + 2.0f * d * d) - 4.0f * param[0]._aParam * param[0]._aParam *
                          Mathf.Sin(param[0]._alphaParam) * Mathf.Sin(param[0]._alphaParam) *
                          (coord[0] * coord[0] + coord[1] * coord[1]));
        float u = 4.0f * (4.0f * param[0]._aParam * param[0]._aParam * i * (j + h) +
                          Mathf.Sin(param[0]._alphaParam) * Mathf.Sin(param[0]._alphaParam) * d * (e + c));
        float v = 4.0f * param[0]._aParam * param[0]._aParam * (h + j) * (h + j) + Mathf.Sin(param[0]._alphaParam) *
                  Mathf.Sin(param[0]._alphaParam) *
                  (e + c) * (e + c) - 4.0f * param[0]._aParam * param[0]._aParam * Mathf.Sin(param[0]._alphaParam) *
                  Mathf.Sin(param[0]._alphaParam) *
                  (coord[0] * coord[0] + coord[1] * coord[1]);

        float[] x             = new float[4];
        int     numberOfRoots = Poly34.SolveP4(ref x, s / r, t / r, u / r, v / r);

        if (numberOfRoots != 2 && numberOfRoots != 4)
        {
            Debug.Log("something is wrong with roots of equation");
            return(new float[0, 0]);
        }

        float[,] theta = new float[numberOfRoots, 3];

        for (int it = 0; it < numberOfRoots; ++it)
        {
            theta[it, 2] = 2.0f * Mathf.Atan(x[it]);
        }

        float costheta, sintheta;

        for (int it = 0; it < numberOfRoots; ++it)
        {
            costheta = (-g * (c * Mathf.Cos(theta[it, 2]) + d * Mathf.Sin(theta[it, 2]) + e) +
                        b * (h * Mathf.Cos(theta[it, 2]) + i * Mathf.Sin(theta[it, 2] + j))) / (a * g - f * b);
            sintheta = (f * (c * Mathf.Cos(theta[it, 2]) + d * Mathf.Sin(theta[it, 2]) + e) -
                        a * (h * Mathf.Cos(theta[it, 2]) + i * Mathf.Sin(theta[it, 2] + j))) / (a * g - f * b);

            theta[it, 0] = Mathf.Atan2(sintheta, costheta);
        }

        for (int it = 0; it < numberOfRoots; ++it)
        {
            float a11 = param[1]._aParam + param[2]._aParam * Mathf.Cos(theta[it, 2]) +
                        param[3]._dParam * Mathf.Sin(param[2]._alphaParam) * Mathf.Sin(theta[it, 2]);
            float a12 = -param[2]._aParam * Mathf.Cos(param[1]._alphaParam) *
                        Mathf.Sin(theta[it, 2]) + param[2]._dParam * Mathf.Sin(param[1]._alphaParam) + param[3]._dParam *
                        Mathf.Sin(param[2]._alphaParam) * Mathf.Cos(param[1]._alphaParam) * Mathf.Cos(theta[it, 2]) +
                        param[3]._dParam * Mathf.Sin(param[1]._alphaParam) * Mathf.Cos(param[2]._alphaParam);
            costheta = (a11 * (coord[0] * Mathf.Cos(theta[it, 0]) + coord[1] * Mathf.Sin(theta[it, 0]) - param[0]._aParam)
                        - a12 * (-coord[0] * Mathf.Cos(param[0]._alphaParam) * Mathf.Sin(theta[it, 0]) + coord[1] *
                                 Mathf.Cos(param[0]._alphaParam) * Mathf.Cos(theta[it, 0]) + (coord[2] - param[0]._dParam) * Mathf.Sin(param[0]._alphaParam)))
                       / (a11 * a11 + a12 * a12);
            sintheta = (a12 * (coord[0] * Mathf.Cos(theta[it, 0]) + coord[1] * Mathf.Sin(theta[it, 0]) - param[0]._aParam) + a11 *
                        (-coord[0] * Mathf.Cos(param[0]._alphaParam) * Mathf.Sin(theta[it, 0]) + coord[1] *
                         Mathf.Cos(param[0]._alphaParam) *
                         Mathf.Cos(theta[it, 0]) + (coord[2] - param[0]._dParam) * Mathf.Sin(param[0]._alphaParam))) / (a11 * a11 + a12 * a12);

            theta[it, 1] = Mathf.Atan2(sintheta, costheta);
        }

        List <int> ind = new List <int>();

        for (int it = 0; it < numberOfRoots; ++it)
        {
            bool    isOk   = true;
            float[] q      = { theta[it, 0], theta[it, 1], theta[it, 2], 0f, 0f, 0f };
            var     joints = JointsToQReverse(ref q);
            for (int jt = 0; jt < 3; ++jt)
            {
                if (joints[jt] > limMax[jt] * Mathf.Deg2Rad || joints[jt] < limMin[jt] * Mathf.Deg2Rad)
                {
                    isOk = false;
                }
            }

            if (!float.IsNaN(theta[it, 1]) && isOk)
            {
                ind.Add(it);
            }
        }

        if (ind.Count == 0)
        {
            Debug.Log("No solution for positioning task");
            return(new float[0, 0]);
        }
        //--------------------------------------------------------------

        int k = 2;

        float[,] thetaPrefinal = new float[ind.Count * k, 6];
        for (int it = 0; it < ind.Count; ++it)
        {
            for (int zt = 0; zt < k; ++zt)
            {
                thetaPrefinal[it * k + zt, 0] = theta[ind[it], 0];
                thetaPrefinal[it * k + zt, 1] = theta[ind[it], 1];
                thetaPrefinal[it * k + zt, 2] = theta[ind[it], 2];
            }
        }

        for (int it = 0; it < ind.Count; ++it)
        {
            Matrix4x4 r03 = FanucModel.qi(param[0]._alphaParam, thetaPrefinal[it * k, 0]) * FanucModel.qi(param[1]._alphaParam, thetaPrefinal[it * k, 1]) * FanucModel.qi(param[2]._alphaParam, thetaPrefinal[it * k, 2]);
            Matrix4x4 r36 = r03.inverse * FanucModel.rotMatrix(coord[3] * Mathf.Deg2Rad, coord[4] * Mathf.Deg2Rad, coord[5] * Mathf.Deg2Rad);

            float xi = r36[0, 2];
            float y  = r36[1, 2];
            float z  = r36[2, 2];

            float tau1 = (xi * Mathf.Sin(param[3]._alphaParam) + Mathf.Sqrt((xi * xi + y * y) * Mathf.Sin(param[3]._alphaParam) * Mathf.Sin(param[3]._alphaParam)
                                                                            - (Mathf.Cos(param[4]._alphaParam) - z * Mathf.Cos(param[3]._alphaParam)) * (Mathf.Cos(param[4]._alphaParam) - z * Mathf.Cos(param[3]._alphaParam))))
                         / (Mathf.Cos(param[4]._alphaParam) - z * Mathf.Cos(param[3]._alphaParam) - y * Mathf.Sin(param[3]._alphaParam));
            float tau2 = (xi * Mathf.Sin(param[3]._alphaParam) - Mathf.Sqrt((xi * xi + y * y) * Mathf.Sin(param[3]._alphaParam) * Mathf.Sin(param[3]._alphaParam)
                                                                            - (Mathf.Cos(param[4]._alphaParam) - z * Mathf.Cos(param[3]._alphaParam)) * (Mathf.Cos(param[4]._alphaParam) - z * Mathf.Cos(param[3]._alphaParam))))
                         / (Mathf.Cos(param[4]._alphaParam) - z * Mathf.Cos(param[3]._alphaParam) - y * Mathf.Sin(param[3]._alphaParam));

            thetaPrefinal[it * k, 3]     = 2.0f * Mathf.Atan(tau1);
            thetaPrefinal[it * k + 1, 3] = 2.0f * Mathf.Atan(tau2);

            float s51 = ((Mathf.Sin(param[5]._alphaParam) * r36[0, 1] + Mathf.Cos(param[5]._alphaParam) * r36[0, 2]) * Mathf.Cos(thetaPrefinal[it * k, 3])
                         + (Mathf.Sin(param[5]._alphaParam) * r36[1, 1] + Mathf.Cos(param[5]._alphaParam) * r36[1, 2]) * Mathf.Sin(thetaPrefinal[it * k, 3])) / Mathf.Sin(param[4]._alphaParam);

            float s52 = ((Mathf.Sin(param[5]._alphaParam) * r36[0, 1] + Mathf.Cos(param[5]._alphaParam) * r36[0, 2]) * Mathf.Cos(thetaPrefinal[it * k + 1, 3])
                         + (Mathf.Sin(param[5]._alphaParam) * r36[1, 1] + Mathf.Cos(param[5]._alphaParam) * r36[1, 2]) * Mathf.Sin(thetaPrefinal[it * k + 1, 3])) / Mathf.Sin(param[4]._alphaParam);

            float c51 = (-Mathf.Cos(param[3]._alphaParam) * (Mathf.Sin(param[5]._alphaParam) * r36[0, 1] + Mathf.Cos(param[5]._alphaParam) * r36[0, 2]) * Mathf.Sin(thetaPrefinal[it * k, 3] = 2.0f * Mathf.Atan(tau1))
                         + Mathf.Cos(param[3]._alphaParam) * (Mathf.Sin(param[5]._alphaParam) * r36[1, 1] + Mathf.Cos(param[5]._alphaParam) * r36[1, 2]) * Mathf.Cos(thetaPrefinal[it * k, 3] = 2.0f * Mathf.Atan(tau1))
                         + Mathf.Sin(param[3]._alphaParam) * (Mathf.Sin(param[5]._alphaParam) * r36[2, 1] + Mathf.Cos(param[5]._alphaParam) * r36[2, 2])) / (-Mathf.Sin(param[4]._alphaParam));

            float c52 = (-Mathf.Cos(param[3]._alphaParam) * (Mathf.Sin(param[5]._alphaParam) * r36[0, 1] + Mathf.Cos(param[5]._alphaParam) * r36[0, 2]) * Mathf.Sin(thetaPrefinal[it * k + 1, 3])
                         + Mathf.Cos(param[3]._alphaParam) * (Mathf.Sin(param[5]._alphaParam) * r36[1, 1] + Mathf.Cos(param[5]._alphaParam) * r36[1, 2]) * Mathf.Cos(thetaPrefinal[it * k + 1, 3])
                         + Mathf.Sin(param[3]._alphaParam) * (Mathf.Sin(param[5]._alphaParam) * r36[2, 1] + Mathf.Cos(param[5]._alphaParam) * r36[2, 2])) / (-Mathf.Sin(param[4]._alphaParam));

            thetaPrefinal[it * k, 4]     = (s51 >= 0 ? Mathf.Acos(c51) : -Mathf.Acos(c51));
            thetaPrefinal[it * k + 1, 4] = (s52 >= 0 ? Mathf.Acos(c52) : -Mathf.Acos(c52));

            float c61 = (r36[0, 0] * Mathf.Cos(thetaPrefinal[it * k, 3]) + r36[1, 0] * Mathf.Sin(thetaPrefinal[it * k, 3])) * Mathf.Cos(thetaPrefinal[it * k, 4])
                        + (-Mathf.Cos(param[3]._alphaParam) * (r36[0, 0] * Mathf.Sin(thetaPrefinal[it * k, 3]) - r36[1, 0] * Mathf.Cos(thetaPrefinal[it * k, 3])) + Mathf.Sin(param[3]._alphaParam) * r36[2, 0])
                        * Mathf.Sin(thetaPrefinal[it * k, 4]);

            float c62 = (r36[0, 0] * Mathf.Cos(thetaPrefinal[it * k + 1, 3]) + r36[1, 0] * Mathf.Sin(thetaPrefinal[it * k + 1, 3])) * Mathf.Cos(thetaPrefinal[it * k + 1, 4])
                        + (-Mathf.Cos(param[3]._alphaParam) * (r36[0, 0] * Mathf.Sin(thetaPrefinal[it * k + 1, 3]) - r36[1, 0] * Mathf.Cos(thetaPrefinal[it * k + 1, 3])) + Mathf.Sin(param[3]._alphaParam) * r36[2, 0])
                        * Mathf.Sin(thetaPrefinal[it * k + 1, 4]);

            float s61 = -Mathf.Cos(param[4]._alphaParam) * (r36[0, 0] * Mathf.Cos(thetaPrefinal[it * k, 3]) + r36[1, 0] * Mathf.Sin(thetaPrefinal[it * k, 3])) * Mathf.Sin(thetaPrefinal[it * k, 4])
                        + Mathf.Cos(param[4]._alphaParam) * (-Mathf.Cos(param[3]._alphaParam) * (r36[0, 0] * Mathf.Sin(thetaPrefinal[it * k, 3]) - r36[1, 0] * Mathf.Cos(thetaPrefinal[it * k, 3])) + Mathf.Sin(param[3]._alphaParam) * r36[2, 0])
                        * Mathf.Cos(thetaPrefinal[it * k, 4]) + (Mathf.Sin(param[3]._alphaParam) * (r36[0, 0] * Mathf.Sin(thetaPrefinal[it * k, 3]) - r36[1, 0] * Mathf.Cos(thetaPrefinal[it * k, 3])) + Mathf.Cos(param[3]._alphaParam) * r36[2, 0]) * Mathf.Sin(param[4]._alphaParam);

            float s62 = -Mathf.Cos(param[4]._alphaParam) * (r36[0, 0] * Mathf.Cos(thetaPrefinal[it * k + 1, 3]) + r36[1, 0] * Mathf.Sin(thetaPrefinal[it * k + 1, 3])) * Mathf.Sin(thetaPrefinal[it * k + 1, 4])
                        + Mathf.Cos(param[4]._alphaParam) * (-Mathf.Cos(param[3]._alphaParam) * (r36[0, 0] * Mathf.Sin(thetaPrefinal[it * k + 1, 3]) - r36[1, 0] * Mathf.Cos(thetaPrefinal[it * k + 1, 3])) + Mathf.Sin(param[3]._alphaParam) * r36[2, 0])
                        * Mathf.Cos(thetaPrefinal[it * k + 1, 4]) + (Mathf.Sin(param[3]._alphaParam) * (r36[0, 0] * Mathf.Sin(thetaPrefinal[it * k + 1, 3]) - r36[1, 0] * Mathf.Cos(thetaPrefinal[it * k + 1, 3])) + Mathf.Cos(param[3]._alphaParam) * r36[2, 0]) * Mathf.Sin(param[4]._alphaParam);

            thetaPrefinal[it * k, 5]     = Mathf.Atan2(s61, c61);
            thetaPrefinal[it * k + 1, 5] = Mathf.Atan2(s62, c62);
        }

        List <int> indFinal = new List <int>();

        for (int it = 0; it < ind.Count * k; ++it)
        {
            bool    isOk   = true;
            float[] q      = { thetaPrefinal[it, 0], thetaPrefinal[it, 1], thetaPrefinal[it, 2], thetaPrefinal[it, 3], thetaPrefinal[it, 4], thetaPrefinal[it, 5] };
            var     joints = JointsToQReverse(ref q);
            for (int jt = 0; jt < 6; ++jt)
            {
                thetaPrefinal[it, jt] = joints[jt] * Mathf.Rad2Deg;
            }

            for (int jt = 3; jt < 6; ++jt)
            {
                if (thetaPrefinal[it, jt] > limMax[jt] || thetaPrefinal[it, jt] < limMin[jt])
                {
                    isOk = false;
                }
            }

            if (isOk && !float.IsNaN(thetaPrefinal[it, 5]))
            {
                indFinal.Add(it);
            }
        }

        if (indFinal.Count == 0)
        {
            Debug.Log("No solution");
            return(new float[0, 0]);
        }

        float[,] thetaFinal = new float[indFinal.Count, 6];
        for (int it = 0; it < indFinal.Count; ++it)
        {
            for (int jt = 0; jt < 6; ++jt)
            {
                thetaFinal[it, jt] = thetaPrefinal[indFinal[it], jt];
            }
        }
        return(thetaFinal);
    }