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机器人通常取“肘上”解(即从动臂向上弯折),因为这样工作空间更大,且不易与底座干涉。
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
3.2 工作空间分析:机器人能碰到哪儿?
逆运动学算出来了,但并不是每个点都能算出一个有效解。这就引出了工作空间的问题——Delta机器人到底能覆盖多大范围?
我个人习惯把工作空间分成两部分来看:
- 可达工作空间:机器人末端能到达的所有点的集合
- 灵活工作空间:机器人能以任意姿态到达的点的集合(Delta的动平台姿态固定,所以两者基本重合)
3.2.1 工作空间的形状与影响因素
Delta机器人的工作空间,说白了就是一个倒扣的碗状区域。顶部平坦,底部收缩,边缘圆润。为什么是这个形状?
影响因素主要有三个:
- 主动臂长度 La:越长,工作空间半径越大,但高度会降低
- 从动臂长度 Lb:越长,工作空间越深,但水平范围会缩小
- 静/动平台半径比 R/r:比值越大,工作空间越“瘦高”,反之越“矮胖”
我记得有一次给客户设计分拣方案,对方要求工作空间直径800mm,高度300mm。我按经验选了 La=250mm, Lb=600mm,结果仿真出来高度只有200mm。后来把 La 改到200mm,Lb 改到650mm,才满足要求。所以,设计时一定要做参数敏感性分析。
3.2.2 工作空间的数值求解方法
解析法求工作空间边界太复杂,工程上常用蒙特卡洛法:
- 在预估范围内随机采样大量点
- 对每个点求解逆运动学
- 记录有解的点,形成点云
- 点云的边界就是工作空间边界
代码实现很简单:
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
3.2.3 工作空间的可视化
光有数据不够,得画出来才能直观判断。下面这张SVG图展示了Delta机器人工作空间的典型形状:
从图上能清楚看到:顶部平坦区域适合做水平分拣,底部收缩区域则限制了机器人的向下伸展。实际应用中,我们通常把物料放在顶部平坦区,这样运动最平稳、速度最快。
3.3 逆运动学在工作空间分析中的应用
有了逆运动学,工作空间分析就变成了一个“试错”游戏。你给一个点,逆运动学告诉你“能到”或“不能到”。把所有“能到”的点画出来,就是工作空间。
这里有个实用技巧:边界搜索法。不用全空间采样,只沿着径向和轴向搜索边界点,效率高得多。我常用的方法是:
- 固定一个高度 Z,从中心沿径向向外搜索
- 找到第一个无解的点,记录为边界
- 改变 Z,重复步骤1-2
- 连接所有边界点,得到工作空间轮廓
这个方法在实时系统中特别有用。比如在分拣过程中,如果目标点突然超出工作空间,控制器能立刻检测到并报警,而不是等电机硬顶到限位才停下来。
好了,这一节的内容就到这儿。逆运动学的公式看着复杂,但多推几遍就熟了。工作空间分析更是熟能生巧——多跑几次仿真,你就能凭经验预估出参数该怎么调。