三连杆串联机械臂运动 点击:81 | 回复:2



若此笔名未被注册

    
  • 精华:8帖
  • 求助:1帖
  • 帖子:276帖 | 3235回
  • 年度积分:0
  • 历史总积分:5713
  • 注册:2003年3月30日
发表于:2024-10-24 19:49:30
楼主

三连杆机械臂是一种常见的串联机械臂结构,它由三个旋转关节组成。这种机械臂的运动学分析可以分为正向运动学(Forward Kinematics)和逆向运动学(Inverse Kinematics)。

正向运动学

正向运动学是从关节变量(通常是角度)出发,计算末端执行器的位置和姿态。对于一个简单的平面三连杆机械臂,我们可以使用三角函数来推导出末端位置 (x, y) 与关节角度 (θ1, θ2, θ3) 之间的关系。

假设每个连杆的长度分别为 L1, L2 和 L3,并且所有的关节都位于同一个平面上。那么末端执行器的位置可以通过以下公式计算:

  • x=L1cos(θ1)+L2cos(θ1+θ2)+L3cos(θ1+θ2+θ3)

  • y=L1sin(θ1)+L2sin(θ1+θ2)+L3sin(θ1+θ2+θ3)

逆向运动学

逆向运动学则是给定末端执行器的目标位置和姿态,求解相应的关节角度。对于三连杆机械臂来说,逆向运动学通常有解析解,但可能有多组解或无解的情况,这取决于目标点是否在机械臂的工作空间内。

逆向运动学的问题稍微复杂一些,因为需要考虑方程组的求解。一般步骤如下:

  1. 首先确定从基座到末端执行器的距离 d。

  2. 利用余弦定理等几何方法求解中间关节的角度。

  3. 再通过已知的中间关节角度和连杆长度反推出其他关节角度。

示例:

考虑一个简单的平面三连杆机械臂,其中每个连杆的长度是已知的,并且所有旋转关节都在同一平面上。假设:

  • 第一连杆(基座到第一个关节)的长度为 L1 = 100 mm

  • 第二连杆(第一个关节到第二个关节)的长度为 L2 = 150 mm

  • 第三连杆(第二个关节到末端执行器)的长度为 L3 = 200 mm

下面将使用这些参数来进行正向运动学和逆向运动学的分析。

正向运动学示例

假设给定三个关节的角度分别为:

  • θ1 = 30° (π/6 弧度)

  • θ2 = 45° (π/4 弧度)

  • θ3 = 60° (π/3 弧度)



若此笔名未被注册

  • 精华:8帖
  • 求助:1帖
  • 帖子:277帖 | 3235回
  • 年度积分:0
  • 历史总积分:5716
  • 注册:2003年3月30日
发表于:2024-10-24 20:06:10
1楼

以下是伪代码实现正向运动和逆向运动的FB。

1、正向运动计算

FUNCTION_BLOCK FB_ForwardKinematics

VAR_INPUT

    theta1 : REAL; // 关节1角度 (弧度)

    theta2 : REAL; // 关节2角度 (弧度)

    theta3 : REAL; // 关节3角度 (弧度)

END_VAR

 

VAR_OUTPUT

    x : REAL; // 末端执行器x坐标

    y : REAL; // 末端执行器y坐标

END_VAR

 

VAR

    L1 : REAL := 100.0; // mm

    L2 : REAL := 150.0; // mm

    L3 : REAL := 200.0; // mm

    pi : REAL := 3.14159265358979323846;

END_VAR

 

// 计算末端执行器位置

x := L1 * COS(theta1) + L2 * COS(theta1 + theta2) + L3 * COS(theta1 + theta2 + theta3);

y := L1 * SIN(theta1) + L2 * SIN(theta1 + theta2) + L3 * SIN(theta1 + theta2 + theta3);

 

// 确保结果在合理的范围内

IF x < -1000.0 OR x > 1000.0 THEN

    x := 0.0;

END_IF;

 

IF y < -1000.0 OR y > 1000.0 THEN

    y := 0.0;

END_IF;

END_FUNCTION_BLOCK

 -------------------------------------

2、逆向运动学计算

FUNCTION_BLOCK FB_InverseKinematics

VAR_INPUT

    target_x : REAL; // 目标x坐标

    target_y : REAL; // 目标y坐标

END_VAR

 

VAR_OUTPUT

    theta1 : REAL; // 关节1角度 (弧度)

    theta2 : REAL; // 关节2角度 (弧度)

    theta3 : REAL; // 关节3角度 (弧度)

    is_reachable : BOOL; // 是否可达

    error_flag : BOOL; // 错误标志

END_VAR

 

VAR

    L1 : REAL := 100.0; // mm

    L2 : REAL := 150.0; // mm

    L3 : REAL := 200.0; // mm

    d, cos_theta2, sin_theta1, cos_theta1, tmp : REAL;

    pi : REAL := 3.14159265358979323846;

END_VAR

 

// 初始化输出

theta1 := 0.0;

theta2 := 0.0;

theta3 := 0.0;

is_reachable := FALSE;

error_flag := FALSE;

 

// 检查目标点是否可达

d := SQRT(target_x * target_x + target_y * target_y);

 

IF (d > (L1 + L2 + L3)) OR (d < ABS(L1 - (L2 + L3))) THEN

    error_flag := TRUE;

ELSE

    is_reachable := TRUE;

 

    // 使用余弦定理求解θ2

    cos_theta2 := (d * d - L1 * L1 - L2 * L2 - L3 * L3) / (2.0 * L2 * L3);

 

    IF (cos_theta2 >= -1.0) AND (cos_theta2 <= 1.0) THEN

        theta2 := ACOS(cos_theta2);

    ELSE

        error_flag := TRUE;

        is_reachable := FALSE;

    END_IF;

 

    IF is_reachable THEN

        // 使用正弦定理求解θ1

        sin_theta1 := (target_y * (L2 + L3 * COS(theta2)) - target_x * L3 * SIN(theta2)) / (d * (L2 + L3 * COS(theta2)));

        cos_theta1 := (target_x * (L2 + L3 * COS(theta2)) + target_y * L3 * SIN(theta2)) / (d * (L2 + L3 * COS(theta2)));

 

        IF (sin_theta1 >= -1.0) AND (sin_theta1 <= 1.0) AND (cos_theta1 >= -1.0) AND (cos_theta1 <= 1.0) THEN

            theta1 := ATAN2(sin_theta1, cos_theta1);

        ELSE

            error_flag := TRUE;

            is_reachable := FALSE;

        END_IF;

 

        IF is_reachable THEN

            // 计算θ3

            theta3 := ATAN2(target_y - L1 * SIN(theta1), target_x - L1 * COS(theta1)) - theta1 - theta2;

 

            // 确保关节角度在合理范围内

            IF (theta1 >= -pi) AND (theta1 <= pi) AND

               (theta2 >= -pi) AND (theta2 <= pi) AND

               (theta3 >= -pi) AND (theta3 <= pi) THEN

                // 输出最终解

            ELSE

                error_flag := TRUE;

            END_IF;

        END_IF;

    END_IF;

END_IF;

 

// 如果有错误发生,触发报警或者其他处理

IF error_flag THEN

    // 处理错误,比如停止机械臂,显示警告等

END_IF;

END_FUNCTION_BLOCK


回复本条

    

若此笔名未被注册

  • 精华:8帖
  • 求助:1帖
  • 帖子:277帖 | 3236回
  • 年度积分:0
  • 历史总积分:5716
  • 注册:2003年3月30日
发表于:2024-10-24 20:17:04
2楼

在以上伪代码基础上进一步完善修改可以直接用某一种PLC运动控制器语言实现计算。

以下说明和计算结果是通过几何余弦法利用PYTHON程序计算出来的。感兴趣的朋友可以用其它语言工程程序计算一下看看结果情况。

另外,因为涉及到代数和矩阵运算,PLC作为计算器编程直接计算不是最好的办法。

计算与结果---

正向运动学计算,给定关节角度 θ1 = 30°, θ2 = 45°, θ3 = 60° 的情况下,末端执行器的位置坐标大约是 (x, y) = (-16.00 mm, 336.31 mm)。

对于逆向运动学,我们需要给定一个目标位置 (x, y),然后解算出能够使机械臂达到该位置的关节角度 (θ1, θ2, θ3)。这个过程通常涉及到求解非线性方程组,并且可能有多个解或无解。

假设我们的目标位置是 (x, y) = (200 mm, 200 mm),我们可以尝试解算关节角度。用几何方法求解逆向运动学后,我们得到了一组可能的关节角度来达到目标位置 (200 mm, 200 mm):

  • θ1 ≈ -3.59°

  • θ2 ≈ 82.82°

  • θ3 ≈ -15.14°

角度是基于假设机械臂可以达到给定的目标点。在实际应用和产品设计中,需要确保这些角度符合机械臂的实际运动限制,并且可能还需要考虑其他因素,如避免奇异点和碰撞。

最后特别提醒,对三连杆机械臂来说,可能存在多组解,这取决于机械臂的具体结构以及每个关节的角度范围。


回复本条

    

热门招聘
相关主题

官方公众号

智造工程师