Delta并联机器人 成品案例 学习设计不二之选 本文介绍了三自由度Delta机器人的描述,接着是运动学分析,包括逆位置运动解析解和正位置运动学问题的解析解,然后是这两个问题的示例,快照和轨迹 还推导了旋转输入和柱状输入Delta机器人的速度方程

Delta机器人这玩意儿在工业分拣线上简直是个明星选手,三个小爪子唰唰唰地抓取物料,速度快到肉眼都看不清。为啥它能这么灵活?秘密全藏在倒三角结构的并联设计里。今天咱们就手撕它的运动学内核,保准让你看完就能动手DIY个桌面级小Delta。

先看逆运动学——也就是已知末端位置求三个电机转角。这玩意儿用几何法就能暴力破解。假设爪子尖端坐标是(x,y,z),每个支链的几何关系可以用勾股定理硬算:

import numpy as np

def inverse_kinematics(x, y, z):
    theta = []
    L = 200  # 上臂长度
    l = 400  # 下臂长度
    R = 120  # 静平台半径
    r = 50   # 动平台半径
    
    for i in range(3):
        angle = np.deg2rad(120*i)
        base_x = R * np.cos(angle)
        base_y = R * np.sin(angle)
        
        # 目标点相对当前支链的位置
        target_x = x - r * np.cos(angle)
        target_y = y - r * np.sin(angle)
        
        # 关键几何关系计算
        dx = target_x - base_x
        dy = target_y - base_y
        dz = z
        
        C = dx**2 + dy**2 + dz**2 - L**2 + l**2
        B = 2 * L * dz
        theta_i = np.arcsin(C / (2 * L * np.sqrt(dx**2 + dy**2))) - np.arctan2(dz, np.sqrt(dx**2 + dy**2))
        theta.append(np.rad2deg(theta_i))
    
    return theta

这段代码里最骚的操作是用了极坐标展开,把三维空间问题转化到每个支链的二维平面。注意那个arcsin后面的修正项,这其实是补偿了z轴方向的位移影响。运行时会发现当z过低导致sqrt出现负数,这时候说明当前位置超出工作空间了。

正运动学刚好反过来——已知三个电机转角求末端位置。这里得祭出牛顿迭代法,先猜个初始位置然后逐步逼近:

def forward_kinematics(theta1, theta2, theta3):
    # 初始猜测点(通常取工作空间中点)
    x, y, z = 0, 0, -300
    max_iter = 100
    tolerance = 1e-6
    
    for _ in range(max_iter):
        # 计算每个支链的误差
        f = []
        for i, theta in enumerate([theta1, theta2, theta3]):
            angle = np.deg2rad(120*i)
            base_x = R * np.cos(angle)
            base_y = R * np.sin(angle)
            
            # 当前支链的预测位置
            joint_z = L * np.sin(theta) 
            joint_x = base_x + L * np.cos(theta) * np.cos(angle)
            joint_y = base_y + L * np.cos(theta) * np.sin(angle)
            
            # 下臂约束方程
            dx = x - joint_x
            dy = y - joint_y
            dz = z - joint_z
            f.append(dx**2 + dy**2 + dz**2 - l**2)
        
        # 雅可比矩阵计算
        J = np.array([
            [2*(x - joint_x1), 2*(y - joint_y1), 2*(z - joint_z1)],
            [2*(x - joint_x2), 2*(y - joint_y2), 2*(z - joint_z2)],
            [2*(x - joint_x3), 2*(y - joint_y3), 2*(z - joint_z3)]
        ])
        
        # 牛顿迭代步
        delta = np.linalg.pinv(J) @ (-np.array(f))
        x += delta[0]
        y += delta[1]
        z += delta[2]
        
        if np.linalg.norm(delta) < tolerance:
            break
    
    return x, y, z

这里雅可比矩阵的构造是关键,每次迭代都要重新计算三个支链的位置关系。实际调试时会发现初始点选不好容易发散,所以通常要结合逆解来生成靠谱的初始值。

想让机器人画个圆?把轨迹离散化后循环调用逆解就行:

import matplotlib.pyplot as plt

trajectory = []
for t in np.linspace(0, 2*np.pi, 100):
    x = 100 * np.cos(t)
    y = 100 * np.sin(t)
    z = -350 + 50 * np.sin(t*2)
    trajectory.append(inverse_kinematics(x, y, z))

# 绘制第一个电机的角度变化
angles = [q[0] for q in trajectory]
plt.plot(np.rad2deg(np.linspace(0,2*np.pi,100)), angles)
plt.title('Motor1 Angle Variation')
plt.xlabel('Time')
plt.ylabel('Degree')

看到生成的波形不是完美的正弦曲线就对了——Delta的耦合运动会引入非线性相位调制,这正是并联机构的有趣之处。实际控制时要注意角度变化率不能超过电机极限,否则轨迹会出现截断。

速度分析更刺激,得求雅可比矩阵的逆。这里有个偷懒技巧——直接对正运动学代码做数值微分:

def jacobian(theta1, theta2, theta3):
    J = np.zeros((3,3))
    delta = 0.01  # 微小扰动
    
    # 对每个电机角度求偏导
    for i in range(3):
        theta_perturbed = [theta1, theta2, theta3]
        theta_perturbed[i] += delta
        pos_plus = forward_kinematics(*theta_perturbed)
        
        theta_perturbed[i] -= 2*delta
        pos_minus = forward_kinematics(*theta_perturbed)
        
        J[:,i] = (np.array(pos_plus) - np.array(pos_minus)) / (2*delta)
    
    return J

这个方法虽然计算量大,但避免了解析求导的繁琐。测试时可以输入一组已知角度,检查雅可比矩阵是否满足[vx, vy, vz]^T = J * [ω1, ω2, ω3]^T 的关系。

玩转Delta机器人的精髓在于理解运动耦合——三个支链既相互制约又彼此配合。建议先用上面的代码跑仿真,再动手搭建实体,看着自己写的控制算法让机械臂舞动起来,那成就感可比通关魂系游戏爽多了!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐