逆运动学几何法求解theta23,初中三角函数!

img


三条边从左到右分别是a1,2,3。
题设为已知L,Z,X,a1,2,3,求解theta2,theta3的表达式。

可列公式为

eq1=a2*sin(thta2)-a3*sin(thta3-thta2)+A
eq2=a2*cos(thta2)+a3*cos(thta3-thta2)+B

这种一般求解析解都比较复杂,带入实际参数直接求结果好些 ,解析解为

thta3 =2*atan(((A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2)*(- A^2 - B^2 + a2^2 + 2*a2*a3 + a3^2))^(1/2)/(A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2))
thta2 = -2*atan((2*A*a2 - (A^2*((A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2)*(- A^2 - B^2 + a2^2 + 2*a2*a3 + a3^2))^(1/2))/(A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2) - (B^2*((A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2)*(- A^2 - B^2 + a2^2 + 2*a2*a3 + a3^2))^(1/2))/(A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2) + (a2^2*((A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2)*(- A^2 - B^2 + a2^2 + 2*a2*a3 + a3^2))^(1/2))/(A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2) + (a3^2*((A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2)*(- A^2 - B^2 + a2^2 + 2*a2*a3 + a3^2))^(1/2))/(A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2) - (2*a2*a3*((A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2)*(- A^2 - B^2 + a2^2 + 2*a2*a3 + a3^2))^(1/2))/(A^2 + B^2 - a2^2 + 2*a2*a3 - a3^2))/(A^2 + B^2 - 2*B*a2 + a2^2 - a3^2))

其中 A=L-Z
B=a1-X
解出来的thta2 ,thta3均是按照弧度表示的

首先,我们需要知道theta23的定义,即它是指两个关节之间的夹角。

然后,我们可以使用初中三角函数来求解theta23。根据正弦定理,我们可以得到:

sin(theta23) = a/c

其中a和c分别是两个关节之间的相对长度。因此,我们可以使用反正弦函数来求出theta23的值:

theta23 = arcsin(a/c)

img


其中,X、Y、Z为空间直角坐标系中的点,表示机械臂末端执行器的位置;1、2、3为三个旋转关节,它们的转轴分别与坐标轴X、Y、Z平行;a1、a2、a3为三条连杆的长度;$\theta_1$为关节1的转角;$\theta_2$和$\theta_3$为关节2和关节3的转角,它们的求解是本题的目标。

根据余弦定理,可以得到以下三个等式:

img


然后进行变换:

img


示例代码如下:


using System;

class Program {
    static void Main(string[] args) {
        // 从控制台读入 a1, a2, a3, X, Y, Z, L 的值
        Console.Write("a1 = ");
        double a1 = double.Parse(Console.ReadLine());
        Console.Write("a2 = ");
        double a2 = double.Parse(Console.ReadLine());
        Console.Write("a3 = ");
        double a3 = double.Parse(Console.ReadLine());
        Console.Write("X = ");
        double X = double.Parse(Console.ReadLine());
        Console.Write("Y = ");
        double Y = double.Parse(Console.ReadLine());
        Console.Write("Z = ");
        double Z = double.Parse(Console.ReadLine());
        Console.Write("L = ");
        double L = double.Parse(Console.ReadLine());

        // 计算 theta1 的值
        double theta1 = Math.Atan2(Y, X);

        // 计算 D, E 的值
        double D = (X * X + Y * Y - a2 * a2 - a3 * a3) / (2 * a2 * a3);
        double E = Math.Sqrt(1 - D * D);

        // 计算 theta3 的值
        double theta3 = Math.Atan2(E, D);

        // 计算 A, B, C 的值
        double A = a2 + a3 * D;
        double B = a3 * E;
        double C = Z - L - a1;

        // 计算 theta2 的值
        double theta2 = Math.Atan2(A * C - B * Math.Sqrt(A * A + B * B - C * C), A * A + B * B);

        // 将弧度转换为角度,并输出结果
        Console.WriteLine("theta1 = " + Rad2Deg(theta1));
        Console.WriteLine("theta2 = " + Rad2Deg(theta2));
        Console.WriteLine("theta3 = " + Rad2Deg(theta3));
    }

    // 将弧度转换为角度
    static double Rad2Deg(double rad) {
        return rad * 180 / Math.PI;
    }
}

根据题意,我们需要使用逆运动学的几何法,利用三角函数求解出 $\theta_2$ 和 $\theta_3$。下面是用c#和.net的求解过程:

using System;

class Program
{
    static void Main(string[] args)
    {
        // 已知 L、Z、X、a1、a2、a3
        double L = 5, Z = 4, X = 3;
        double a1 = 2, a2 = 3, a3 = 4;

        // 计算 cos(theta2)
        double cosTheta2 = (L * L + a1 * a1 - (a2 * a2 + a3 * a3 + 2 * a2 * a3)) / (2 * L * a1);

        // 计算 theta2
        double theta2 = Math.Sign(cosTheta2) * Math.Acos(cosTheta2);

        // 计算 sin(theta3)
        double sinTheta3 = Z * Math.Sin(theta2) / a2;

        // 计算 theta3
        double theta3 = Math.Sign(sinTheta3) * Math.Asin(sinTheta3);

        // 输出结果
        Console.WriteLine("theta2 = {0:F2},theta3 = {1:F2}", theta2, theta3);
    }
}

**根据题设,我们可以用余弦定理求出 a2 和 a3:

a2^2 = L^2 + Z^2 - 2LZcos(theta2)
a3^2 = X^2 + Z^2 - 2XZcos(theta3)

将题设中已知的 a1, a2, a3 带入以上两个式子,可以得到两个方程:

a1 = a2cos(theta2) + a3cos(theta3)
0 = a2sin(theta2) - a3sin(theta3)

我们可以通过将第二个方程两边同时除以 cos(theta2) 或 cos(theta3),然后代入第一个方程,得到:

tan(theta2) = (a1Z - sqrt(a1^2L^2 - (a1^2 + a2^2 - a3^2)Z^2)) / (a2L - a1Z)
tan(theta3) = (a1Z - sqrt(a1^2X^2 - (a1^2 + a3^2 - a2^2)Z^2)) / (a3X - a1Z)

其中 sqrt 表示平方根。这两个表达式可以用来计算 theta2 和 theta3 的值。注意,在计算过程中需要注意分母是否为 0 的情况,以及是否存在负数的情况(这可能意味着三角形无法形成)。**

方法一
L=a1+a2cos(theta2)+a3cos(theta2+theta3)
Z=a2sin(theta2)+a3sin(theta2+theta3)
X=a3cos(theta2+theta3)
由上面三式可得:
theta2=asin[(Z-a3
sin(theta3))/a2]
theta3=acos[(L-a1-a2*cos(theta2))/a3]

方法二
theta2=arccos((a1^2+2^2-3^2)/2a12)
theta3=arccos((a1^2+3^2-2^2)/2a1
3)

该回答引用ChatGPT
根据题设,可以将a1, a2, a3 分别表示为三角形的三条边长,而 L, Z, X 分别表示机械臂在三维空间中的位置。接下来,可以使用余弦定理和正切函数来求解 theta23。

首先,根据余弦定理可以得到:

cos(theta23) = (a1^2 + a2^2 - L^2) / (2 * a1 * a2)

然后,使用反正切函数求解 theta23:

theta23 = atan2(sqrt(1 - cos(theta23)^2), cos(theta23)) - atan2(Z, X)

其中,atan2 函数是一个带有两个参数的反正切函数,它可以根据参数的正负号来确定返回值在哪个象限。在这个问题中,Z 和 X 分别表示机械臂在三维空间中的位置,因此可以使用 atan2(Z, X) 来计算机械臂与水平方向的夹角,再用这个夹角减去 theta23,即可得到最终的 theta23 值。

需要注意的是,这个求解过程中所有的角度都需要使用弧度制,而非角度制。因此,在使用正切函数之前需要将角度转换为弧度。