MATLAB仿真 delta并联机器人 simulink/simscape仿真 正逆运动学
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模型,按这个结构搭:
- 添加三个Revolute Joint表示电机轴
- 每个支链用四个Cylinder刚体模拟平行四边形
- 上平台用Bushing连接降低计算刚度
- 最后加个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做接触力仿真会卡爆,改成简化版的碰撞盒才勉强能跑。不过对于运动学验证来说,其实把约束条件设对就够了,动力学参数可以后面慢慢调。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)