机械臂机器人——使用Matlab Robotic ToolBox建立四轴机械臂模型并实现运动控制仿真

为了能够实现机械臂的运动轨迹规划,同时更加深入学习机器人学相关理论知识,并将其运用在时间当中,我采用Robotic ToolBox建立四轴机器人模型并实现运动控制仿真,并作以记录分享。

四轴机械臂实物

在这里插入图片描述

Robotic ToolBox机械臂建模

1.建立机械臂的D-H表

在这里我选用的是标准D-H参数进行建模,各个参数含义如图所示:
在这里插入图片描述
需要注意的是:

  • 在确定轴线时,Z轴为连杆关节的旋转轴(在这里即舵机的旋转轴),X轴为当前关节的Z轴和下一关节(一个一个往上走)的Z轴的公垂线(在这里就是机械臂杆的平行线)。
建立机械臂坐标系

坐标系建立方法:
在这里插入图片描述
该机械臂坐标系建立如图所示:
在这里插入图片描述

根据坐标系建立D-H表

首先需要做的就是给该机械臂建立D-H表

ithetad(单位:m)a(单位:m)alpha
1000pi/2(z1绕x1旋转90°到z2)
2000.1050
3000.090
4000.040

2.代码建模

%% 机械臂建模
% 定义各个连杆以及关节类型,默认为转动关节
%           theta      d        a        alpha
L1=Link([       0       0      0     pi/2 ], 'standard'); % [四个DH参数], options
L2=Link([    0         0       0.105       0], 'standard');
L3=Link([     0           0  0.09      0], 'standard');
L4=Link([     0        0   0.04     0], 'standard');

robot=SerialLink([L1,L2,L3,L4]); % 将四个连杆组成机械臂
robot.name='4DOF Robotic Arm';
robot.display();
view(3); % 解决robot.teach()和plot的索引超出报错
robot.teach();
robot.plot([0 pi/2 0 0]);

在这里插入图片描述

机械臂运动学仿真

1.正运动学仿真

给定每个关节的转动角度,让机器人实现运动控制。

clc;
clear;
%% 机械臂建模
% 定义各个连杆以及关节类型,默认为转动关节
%          theta      d       a      alpha
L1=Link([     0       0        0      pi/2], 'standard'); % [四个DH参数], options
L2=Link([     0       0      0.105     0], 'standard');
L3=Link([     0       0      0.09      0], 'standard');
L4=Link([     0       0      0.04      0], 'standard');
b=isrevolute(L1);
robot=SerialLink([L1,L2,L3,L4],'name','Irvingao Arm'); % 将四个连杆组成机械臂
robot.name='4DOF Robotic Arm';
robot.display();

%% 轨迹规划
% 初始值及目标值
init_ang=[0 0 0 0];
targ_ang=[0, -pi/6, -pi/5, pi/6];
step=200;

[q,qd,qdd]=jtraj(init_ang,targ_ang,step); %关节空间规划轨迹,得到机器人末端运动的[位置,速度,加速度]
T0=robot.fkine(init_ang); % 正运动学解算
Tf=robot.fkine(targ_ang);
subplot(2,4,3); i=1:4; plot(q(:,i)); title("位置"); grid on;
subplot(2,4,4); i=1:4; plot(qd(:,i)); title("速度"); grid on;
subplot(2,4,7); i=1:4; plot(qdd(:,i)); title("加速度"); grid on;

Tc=ctraj(T0,Tf,step); % 笛卡尔空间规划轨迹,得到机器人末端运动的变换矩阵
Tjtraj=transl(Tc);
subplot(2,4,8); plot2(Tjtraj, 'r');
title('p1到p2直线轨迹'); grid on;
subplot(2,4,[1,2,5,6]);
plot3(Tjtraj(:,1),Tjtraj(:,2),Tjtraj(:,3),"b"); grid on;
hold on;
view(3); % 解决robot.teach()和plot的索引超出报错
qq=robot.ikine(Tc, 'q0',[0 0 0 0], 'mask',[1 1 1 1 0 0]); % 逆解算
robot.plot(qq);

机械臂运动效果如下:

在这里插入图片描述

2.逆运动学仿真

在这里为了我们方便定义目标点的坐标,所以我们将a的单位改成m。

%% 机械臂建模
% 定义各个连杆以及关节类型,默认为转动关节
%          theta      d       a      alpha
L1=Link([     0       0        0      pi/2], 'standard'); % [四个DH参数], options
L2=Link([     0       0      10.5     0], 'standard');
L3=Link([     0       0      9      0], 'standard');
L4=Link([     0       0      4      0], 'standard');

b=isrevolute(L1);
robot=SerialLink([L1,L2,L3,L4],'name','Irvingao Arm'); % 将四个连杆组成机械臂
robot.name='4DOF Robotic Arm';
robot.display();
view(3);
robot.teach();
robot.plot([0 pi/2 0 0]);

参考文章:

### 使用Matlab实现机械的正向和逆向运动学求解 #### 三、建立坐标系给出D-H参数表 对于机械,首先需要定义各个关节之间的相对位置关系。这可以通过Denavit-Hartenberg (D-H) 参数来描述。假设已知机械的具体结构尺寸,则可以构建其对应的D-H参数表格[^3]。 | 关节 | αi−1 | ai−1 | di | θi | |--| | J1 | ... | ... | ... | ... | | J2 | ... | ... | ... | ... | | J3 | ... | ... | ... | ... | | J4 | ... | ... | ... | ... | 具体数值需依据实际硬件设计而定,在此省略未填入确切数据。 #### 、推导正运动学方程 基于上述D-H参数,利用齐次变换矩阵表示各连杆间的转换关系。每一对相邻连杆之间存在一个特定形式的变换矩阵T(i,i+1),该矩阵包含了旋转和平移操作: \[ T_{(i,i+1)} = \begin{bmatrix} c(\theta_i) & -s(\theta_i)c(\alpha_{i-1}) & s(\theta_i)s(\alpha_{i-1}) & a_{i-1}c(\theta_i) \\ s(\theta_i) & c(\theta_i)c(\alpha_{i-1}) & -c(\theta_i)s(\alpha_{i-1}) & a_{i-1}s(\theta_i)\\ 0 & s(\alpha_{i-1}) & c(\alpha_{i-1}) & d_i \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}\] 其中\(c()\)代表余弦函数,\(s()\)代表正弦函数。整个系统的末端执行器相对于基座的姿态可通过连续左乘这些单个变换矩阵获得最终表达式: \[ ^0T_n = \prod^{n}_{i=1}{^iT_{i+1}} \] 这里 \(^0T_n\) 表达的是从世界坐标系到第 n 个连杆(即最远端)的整体位姿变化。 #### 五、编写MATLAB代码计算正运动学 为了简化编程工作量,建议采用Symbolic Toolbox中的`trigToExp()` 函数处理三角运算,借助循环语句自动生成所有必要的变换矩阵。以下是简单的伪代码框架用于说明这一过程: ```matlab syms theta1 theta2 theta3 theta4 % 定义符号变量作为输入角速度 % 初始化单位矩阵I为起始状态 T_total = eye(4); for i = 1:length(DH_params)-1 Ti = createTransformationMatrix(DH_params{i}); T_total = simplify(T_total * Ti); end disp('The final transformation matrix:'); pretty(T_total) ``` 此处 `createTransformationMatrix()` 是一个用户定义的功能模块负责创建每一级联结点处的局部变换矩阵;`DH_params` 存储着之前提到过的D-H参数列表。 #### 六、解决逆运动学问题 针对自由度串联型机器人来说,解析法可能难以找到通用封闭解因为涉及到复杂的非线性约束条件。因此更倾向于应用迭代优化技术比如牛顿拉夫逊方法来进行近似求解。基本思路是从初始猜测出发逐步调整直至满足目标精度为止。下面展示了一个简化的流程概述: 1. 设定期望达到的位置矢量P_desired=[px;py;pz]; 2. 计算当前构形下的末端效应器位置; 3. 利用雅克比矩阵J映射微分增量Δθ至空间直角坐标的偏差δp; 4. 更新角度值直到误差小于设定阈值ε; 具体的MATLAB实现如下所示: ```matlab function q_new = solveIK(P_desired, q_initial) max_iter = 1e3; tol = 1e-6; for iter = 1:max_iter P_current = forwardKinematics(q_initial); % 获取当前位置 delta_p = P_desired - P_current(:); if norm(delta_p)<tol break; end J = computeJacobian(q_initial); dq = pinv(J)*delta_p'; q_initial = mod(q_initial + squeeze(dq)', [-pi pi]); end q_new = q_initial; end ``` 在此基础上还可以进一步引入阻尼最小二乘法改进鲁棒性和收敛性能等问题[^1]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值