3、运动学基础(下):Delta机器人逆运动学推导(解析法)、工作空间分析

好,咱们接着聊。上一节我们把Delta机器人的正运动学捋了一遍,知道了末端位置怎么算出来。但实际干活的时候,我们更关心的是反过来的问题:想让末端走到某个点,三个电机的角度该是多少? 这就是逆运动学。

说白了,逆运动学才是控制的核心。你给机器人一个目标位置,它得自己算出关节角度,然后电机才能动。我刚开始做Delta项目时,总觉得正运动学公式漂亮,逆运动学就是反解嘛,能有多难?结果第一次调试时,机器人直接往反方向跑……嗯,这里面的坑,咱们今天一并填上。

3.1 逆运动学:从目标位置到关节角度

Delta机器人的逆运动学推导,我个人习惯用解析法。为什么?因为解析法快,适合实时控制。数值迭代法虽然通用,但在高速分拣场景下,每多一毫秒计算,都可能丢一个物料。

推导思路其实很直接:

  • 已知末端中心点 \( P \) 的坐标 \((x, y, z)\)
  • 已知三条臂的几何参数(主动臂长 \( L_a \),从动臂长 \( L_b \),静平台半径 \( R \),动平台半径 \( r \))
  • 求三个主动关节角 \(\theta_1, \theta_2, \theta_3\)

核心思想是:把空间问题拆成三个平面问题。每条支链单独解算,互不干扰。你想想看,Delta的三条臂是120度对称分布的,每条臂的运动都限制在一个垂直平面内。这就好办了。

3.1.1 单条支链的几何约束

以第一条支链为例(位于XZ平面,方位角 \(\phi_1 = 0^\circ\))。

静平台上的铰点 \( A_1 \) 坐标为:

A1 = (R, 0, 0)

动平台上的铰点 \( B_1 \) 坐标,需要从末端中心 \( P \) 换算过来:

B1 = (x + r·cos(φ1), y + r·sin(φ1), z)
    = (x + r, y, z)

主动臂末端 \( C_1 \) 的位置由关节角 \(\theta_1\) 决定:

C1 = (R + La·cos(θ1), 0, -La·sin(θ1))

从动臂的长度约束给出了关键方程:

|C1 - B1|² = Lb²

展开后,得到一个关于 \(\theta_1\) 的三角函数方程。我记得第一次手动推导时,算到这一步卡了半天,后来发现其实可以整理成标准形式:

A·sin(θ1) + B·cos(θ1) = C

其中:

A = 2·La·(z)
B = 2·La·(R - x - r)
C = Lb² - La² - (R - x - r)² - z²

这个方程的解,就是咱们要的关节角。

3.1.2 求解关节角

对于 \( A \sin\theta + B \cos\theta = C \) 这种形式,标准解法是用辅助角公式:

令:sin(θ + φ) = C / √(A² + B²)
其中:φ = atan2(B, A)

于是:

θ = arcsin(C / √(A² + B²)) - atan2(B, A)

注意! 这里有两个解,对应“肘上”和“肘下”两种姿态。Delta机器人通常取“肘上”解(即从动臂向上弯折),因为这样工作空间更大,且不易与底座干涉。

我曾经踩过的坑: 第一次写代码时,直接取了 arcsin 的主值,结果机器人姿态反了。后来加了姿态判断逻辑,才搞定。建议你在代码里显式判断 θ 的范围,Delta 的主动臂通常只在 -45° 到 +45° 之间摆动。

3.1.3 三条支链的完整解

第一条支链算完了,剩下两条同理,只是方位角不同:

φ2 = 120°  →  (cos120°, sin120°) = (-1/2, √3/2)
φ3 = 240°  →  (cos240°, sin240°) = (-1/2, -√3/2)

把坐标旋转到对应平面,套用同样的公式即可。代码实现时,我习惯写一个通用函数,传入方位角参数,循环三次搞定:

def inverse_kinematics(x, y, z, params):
    La, Lb, R, r = params
    angles = []
    for i in range(3):
        phi = i * 2*pi/3
        # 计算B点坐标(动平台铰点)
        Bx = x + r * cos(phi)
        By = y + r * sin(phi)
        Bz = z
        # 计算A、B、C系数
        A = 2 * La * Bz
        B = 2 * La * (R - Bx * cos(phi) - By * sin(phi))
        C = Lb**2 - La**2 - (R - Bx*cos(phi) - By*sin(phi))**2 - Bz**2
        # 求解
        D = sqrt(A**2 + B**2)
        theta = asin(C / D) - atan2(B, A)
        angles.append(theta)
    return angles
小技巧: 实际项目中,我建议在求解前先检查 C/D 的绝对值是否 ≤ 1。如果大于1,说明目标点超出了工作空间,直接返回错误,避免电机硬顶。

3.2 工作空间分析:机器人能碰到哪儿?

逆运动学算出来了,但并不是每个点都能算出一个有效解。这就引出了工作空间的问题——Delta机器人到底能覆盖多大范围?

我个人习惯把工作空间分成两部分来看:

  • 可达工作空间:机器人末端能到达的所有点的集合
  • 灵活工作空间:机器人能以任意姿态到达的点的集合(Delta的动平台姿态固定,所以两者基本重合)

3.2.1 工作空间的形状与影响因素

Delta机器人的工作空间,说白了就是一个倒扣的碗状区域。顶部平坦,底部收缩,边缘圆润。为什么是这个形状?

影响因素主要有三个:

  1. 主动臂长度 La:越长,工作空间半径越大,但高度会降低
  2. 从动臂长度 Lb:越长,工作空间越深,但水平范围会缩小
  3. 静/动平台半径比 R/r:比值越大,工作空间越“瘦高”,反之越“矮胖”

我记得有一次给客户设计分拣方案,对方要求工作空间直径800mm,高度300mm。我按经验选了 La=250mm, Lb=600mm,结果仿真出来高度只有200mm。后来把 La 改到200mm,Lb 改到650mm,才满足要求。所以,设计时一定要做参数敏感性分析

3.2.2 工作空间的数值求解方法

解析法求工作空间边界太复杂,工程上常用蒙特卡洛法

  1. 在预估范围内随机采样大量点
  2. 对每个点求解逆运动学
  3. 记录有解的点,形成点云
  4. 点云的边界就是工作空间边界

代码实现很简单:

import random
import numpy as np

def workspace_sampling(params, num_samples=10000):
    points = []
    for _ in range(num_samples):
        # 在圆柱范围内随机采样
        r = random.uniform(0, R_max)
        theta = random.uniform(0, 2*pi)
        z = random.uniform(Z_min, Z_max)
        x = r * cos(theta)
        y = r * sin(theta)
        # 尝试求解逆运动学
        try:
            angles = inverse_kinematics(x, y, z, params)
            points.append((x, y, z))
        except:
            pass
    return points
关键点: 采样点越多,边界越精确。我一般取5万到10万个点,耗时约1-2秒,足够工程设计用了。

3.2.3 工作空间的可视化

光有数据不够,得画出来才能直观判断。下面这张SVG图展示了Delta机器人工作空间的典型形状:

Delta机器人工作空间示意图 R (mm) Z (mm) 可达工作空间 R_max Z_max 顶部平坦区 底部收缩区 工作空间边界 内部可达区域

从图上能清楚看到:顶部平坦区域适合做水平分拣,底部收缩区域则限制了机器人的向下伸展。实际应用中,我们通常把物料放在顶部平坦区,这样运动最平稳、速度最快。

3.3 逆运动学在工作空间分析中的应用

有了逆运动学,工作空间分析就变成了一个“试错”游戏。你给一个点,逆运动学告诉你“能到”或“不能到”。把所有“能到”的点画出来,就是工作空间。

这里有个实用技巧:边界搜索法。不用全空间采样,只沿着径向和轴向搜索边界点,效率高得多。我常用的方法是:

  1. 固定一个高度 Z,从中心沿径向向外搜索
  2. 找到第一个无解的点,记录为边界
  3. 改变 Z,重复步骤1-2
  4. 连接所有边界点,得到工作空间轮廓

这个方法在实时系统中特别有用。比如在分拣过程中,如果目标点突然超出工作空间,控制器能立刻检测到并报警,而不是等电机硬顶到限位才停下来。

总结一下: 逆运动学是Delta机器人的“大脑”,工作空间分析是“体检报告”。两者结合,才能设计出既高效又安全的机器人系统。我见过太多项目,光顾着算运动学,忽略了工作空间验证,结果装到现场才发现机器人够不着物料……那叫一个尴尬。

好了,这一节的内容就到这儿。逆运动学的公式看着复杂,但多推几遍就熟了。工作空间分析更是熟能生巧——多跑几次仿真,你就能凭经验预估出参数该怎么调。


专注资料整理