MATLAB仿真 delta并联机器人 simulink/simscape仿真 正逆运动学

最近在折腾delta并联机器人的仿真,这玩意儿在工业上用得挺多,抓取分拣场景里特别常见。直接用实物调试成本太高,先在MATLAB里搭个仿真环境明显更划算。今天主要聊聊怎么用Simulink和Simscape搞运动学仿真,重点会穿插些实现代码和调试时踩过的坑。

先说说正运动学。三组平行四边形结构决定了动平台位姿,推导公式的时候注意杆长约束条件。在MATLAB里可以直接用几何法实现:

function [x,y,z] = delta_forward(theta1, theta2, theta3)
    L = 0.5; % 驱动臂长度
    l = 1.2; % 从动臂长度
    Rb = 0.3; % 静平台半径
    Rm = 0.1; % 动平台半径
    
    % 三个电机转角转换坐标系
    theta = [theta1, theta2-120*pi/180, theta3+120*pi/180];
    
    % 各支链端点坐标
    for i=1:3
        x0(i) = Rb * cos(theta(i));
        y0(i) = Rb * sin(theta(i));
        z0(i) = 0;
    end
    
    % 这里需要解三元二次方程组
    % 实际代码中应该用数值解法,比如牛顿迭代
    % 下面展示核心方程建立过程
    syms x y z real
    eqns = [];
    for j=1:3
        eqns = [eqns; 
            (x - x0(j))^2 + (y - y0(j))^2 + (z - z0(j))^2 == l^2];
    end
    S = solve(eqns,[x y z]);
    % 取z坐标最小的解(工作空间下限)
    z_values = double([S.z]);
    valid_id = find(z_values == min(z_values));
    x = double(S.x(valid_id));
    y = double(S.y(valid_id)); 
    z = double(S.z(valid_id));
end

这个函数里用了符号计算,实际跑仿真的时候得换成数值解法。重点注意三个球面方程联立求解时会出现多个解,需要根据机械结构约束筛选合理解。

逆运动学相对简单些,给定末端坐标反推电机转角。这里有个技巧:把空间问题投影到平面处理:

function angles = delta_inverse(x,y,z)
    L = 0.5; 
    l = 1.2;
    Rb = 0.3;
    Rm = 0.1;
    
    % 动平台铰链点坐标
    phi = [0, 120, 240] * pi/180;
    px = x + Rm * cos(phi);
    py = y + Rm * sin(phi);
    pz = z * ones(1,3);
    
    angles = zeros(1,3);
    for k = 1:3
        % 向量法求解
        A = [Rb, 0, 0];
        B = [px(k), py(k), pz(k)];
        AB = B - A;
        AB_proj = AB(1:2); % 投影到XY平面
        theta = atan2(norm(cross([0,0,1],AB_proj)), dot([1,0],AB_proj));
        angles(k) = real(asin( (AB(3))/l )); % 几何关系
    end
end

注意这里用了近似处理,实际要考虑杆件干涉问题。调试时发现当z坐标超过工作空间时会出虚数解,需要加real()函数取实部避免报错。

MATLAB仿真 delta并联机器人 simulink/simscape仿真 正逆运动学

Simscape建模部分更有意思。在Simulink里新建Simscape Multibody模型,按这个结构搭:

  1. 添加三个Revolute Joint表示电机轴
  2. 每个支链用四个Cylinder刚体模拟平行四边形
  3. 上平台用Bushing连接降低计算刚度
  4. 最后加个Transform Sensor测量末端位姿

参数设置要注意质量属性。刚开始跑仿真时动平台抖得跟筛糠似的,后来在关节属性里加了阻尼系数才好些:

% 设置旋转关节参数
joint = simscape.Value(5,'N*m/(rad/s)'); % 阻尼系数
set_param('delta_model/Revolute_Joint1','Damping',joint);

仿真跑起来后可以用MATLAB的inverseKinematics函数验证结果。遇到过特别坑的情况:当末端点接近奇异位形时,逆解会突然跳变,这时候需要加个低通滤波器平滑输出角度。

最后分享个调试技巧:在Simscape的Solver Configuration里把仿真模式改成local solver能显著加快速度。另外,可视化窗口里右键点选Show Frames能看到每个连杆的坐标系走向,对理解运动关系帮助很大。

整个过程最费时间的是调整几何参数和碰撞检测。后来发现直接用MATLAB的Contact Forces Library做接触力仿真会卡爆,改成简化版的碰撞盒才勉强能跑。不过对于运动学验证来说,其实把约束条件设对就够了,动力学参数可以后面慢慢调。

Logo

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

更多推荐