1. MK2三自由度机械臂项目概述
EEZYbotARM MK2是一款入门级三自由度机械臂套件,因其结构简单、成本低廉而成为机器人学习者的理想实验平台。这个看起来萌萌的机械臂,实际上包含了工业机器人研发中的完整技术链条。我在实验室里花了三个月时间,从零开始完成了它的运动学建模、轨迹规划和控制系统设计,期间踩过的坑比机械臂的零件还多。
MK2机械臂的三个旋转关节分别对应基座、肩部和肘部运动,最大工作半径约260mm,有效负载200g。虽然自由度有限,但已经能够完成平面内的精确点位运动和简单轨迹跟踪。本项目使用MATLAB Robotics Toolbox作为主要开发工具,配合Simulink进行控制器仿真,这种组合既能快速验证算法,又能深入理解底层原理。
特别提示:虽然MK2套件价格亲民(约500元),但建议购买金属齿轮版本的舵机,塑料齿轮在反复调试中容易损坏,别问我怎么知道的。
2. 机械臂运动学建模
2.1 D-H参数表建立
机械臂运动学的核心是建立正确的D-H参数表。对于MK2机械臂,经过实际测量和结构分析,我们得到如下参数:
matlab复制% D-H参数表 [alpha a theta d]
L(1) = Link('d', 103.5, 'a', 0, 'alpha', pi/2);
L(2) = Link('d', 0, 'a', 105, 'alpha', 0);
L(3) = Link('d', 0, 'a', 155, 'alpha', 0);
robot = SerialLink(L, 'name', 'MK2');
每个参数都有明确的物理意义:
d参数表示沿z轴的连杆偏移量a参数表示沿x轴的连杆长度alpha表示绕x轴的连杆扭转角theta是关节变量(旋转关节)
注意事项:测量实际机械臂时,务必确认各关节的零位位置。MK2的第二个关节在零位时臂杆是水平向前的,这与许多工业机器人不同。
2.2 正运动学计算
正运动学解决"给定关节角度,求末端位姿"的问题。使用Robotics Toolbox的fkine方法可以轻松实现:
matlab复制T = robot.fkine([pi/6 pi/4 0]); % 输入三个关节角度
disp(T.T) % 输出4x4齐次变换矩阵
齐次变换矩阵T包含了末端执行器的位置和姿态信息。前3列是旋转矩阵,最后一列的前三个元素是位置坐标。
2.3 逆运动学求解
逆运动学是机械臂控制的核心难点。对于三自由度机械臂,我们采用解析法与数值法结合的方式:
matlab复制q_sol = robot.ikine(T, 'mask', [1 1 1 0 0 0]);
这里mask参数[1 1 1 0 0 0]表示只考虑位置控制,不考虑末端姿态(三自由度机械臂无法独立控制姿态)。实际应用中要注意:
- 解可能不存在(目标点超出工作空间)
- 可能存在多个解(需要根据关节限位选择最合适的解)
- 数值解法可能陷入局部最优
3. 轨迹规划实现
3.1 关节空间轨迹规划
五次多项式插值是最常用的轨迹规划方法,可以保证位置、速度、加速度的连续性:
matlab复制t = linspace(0, 5, 100); % 5秒运动时间,100个采样点
q = jtraj(q_start, q_end, t); % 生成轨迹
jtraj函数会自动计算符合运动学约束的平滑轨迹。但在实际调试中发现两个问题:
- 加速度突变会导致机械臂抖动
- 舵机响应延迟影响轨迹跟踪精度
解决方案:
- 在Simulink中加入加速度限制模块
- 根据实际舵机性能调整轨迹时间参数
3.2 笛卡尔空间轨迹规划
对于需要精确控制末端路径的应用,可以先在笛卡尔空间规划路径,再通过逆运动学转换为关节角度:
matlab复制% 创建圆形路径
theta = linspace(0, 2*pi, 50);
x = 150 + 50*cos(theta);
y = 50*sin(theta);
z = zeros(size(x)) + 100;
% 转换为关节角度
q_vals = [];
for i = 1:length(x)
T = transl(x(i), y(i), z(i));
q = robot.ikine(T, 'mask', [1 1 1 0 0 0]);
q_vals = [q_vals; q];
end
4. 动力学建模与控制
4.1 动力学方程建立
使用拉格朗日法建立动力学方程,计算各关节所需力矩:
matlab复制tau = robot.rne(q, qd, qdd);
rne函数基于递归牛顿-欧拉算法,自动计算机械臂的逆动力学。实际应用中需要注意:
- 单位一致性(MK2的连杆参数需要转换为kg和m)
- 摩擦模型的选择(库仑+粘滞摩擦模型效果较好)
4.2 控制器设计
经过多次仿真比较,前馈+PD控制方案表现最佳:
matlab复制% 前馈补偿
tau_ff = rne(q_desired, qd_desired, qdd_desired);
% PD反馈控制
tau_pd = Kp*(q_desired - q_actual) + Kd*(qd_desired - qd_actual);
% 总控制量
tau_total = tau_ff + tau_pd;
参数整定技巧:
- 先调前馈增益(通常70-90%)
- 再调D参数抑制振荡
- 最后调P参数提高响应速度
- 注意各关节的耦合效应
5. Simulink仿真实现
5.1 整体仿真架构
Simulink模型包含以下几个关键部分:
- 轨迹生成模块(MATLAB Function)
- 控制器模块(前馈+PD)
- 机械臂动力学模型(Robotics Toolbox接口)
- 电机模型(含饱和限制)
血泪教训:一定要给电机模型添加力矩饱和限制,否则仿真时会出现"机械臂抽风"现象,别问我怎么知道的...
5.2 仿真结果分析
通过多次仿真调试,最终实现的性能指标:
- 位置跟踪误差:<0.05rad
- 最大速度:1.5rad/s
- 轨迹重复精度:±2mm
典型问题及解决方案:
- 末端抖动 → 检查加速度限制
- 稳态误差 → 调整前馈增益
- 超调振荡 → 增加微分作用
6. 实际调试经验分享
经过三个月的实际调试,总结出以下实用技巧:
- 机械结构方面:
- 所有紧固件必须使用螺纹胶固定
- 线缆要合理捆扎避免干扰运动
- 定期检查齿轮间隙
- 控制算法方面:
- 实时显示各关节角度曲线
- 保存每次实验的参数和结果
- 建立自动化测试脚本
- 安全注意事项:
- 调试时机械臂工作范围内禁止站人
- 准备紧急停止开关
- 限制最大运动速度
这个项目让我深刻体会到理论仿真与实际系统的差距。比如仿真中完美的轨迹跟踪,在实际机械臂上会因为齿轮间隙、电机响应等因素大打折扣。解决这些问题没有捷径,只有不断调试、记录、分析的迭代过程。