机器人正运动学实例——PUMA560机械臂(附Matlab机器人工具箱建模代码)

机器人正运动学实例——PUMA560机械臂(附Matlab机器人工具箱建模代码)

前言

前面文章讲到了机器人正运动学的基本方法,这篇文章就是以实际案例来记录如何进行运动学正解、运动空间分析等(包括利用Matlab机器人工具箱来实现),本文案例是PUMA560六自由度机械臂。

一、方法回顾

①进行正运动学的基础是分析机器人的机构原理,第一步是建立连杆坐标系(使用右手法则,并尽可能让更多参数为0,简化运动方程);

②描述连杆与关节参数,进行连杆变换建立D-H参数表(是改进的D-H法);

③建立正运动学方程

至此,列写正运动学方程即完成了正运动学的描述,也就是通过不同已知的关节变量最终得到的是机器人末端相对于基坐标系的运动

二、PUMA560机械臂正运动学分析

1. 绘制机构原理图并建立坐标系

PUMA560机械臂是6R的机械臂,也就是只有六个转动,最后的三转自由度集中在了末端,三轴相交。可以对其构建机构原理图如下:

坐标系的Z轴指向旋转关节轴向,坐标系建立符合右手法则

连杆{1}系为了方便描述与{0}系重合,因此{1}系相对于{0}系就只有绕Z轴的转动;其他坐标系建立如上图所示。

2. 建立D-H参数表

建立了坐标系,再根据已知的长度等参数,可以根据上面提到的描述连杆参数的方法,列写D-H参数表如下:

注:括号中代表了上图位姿下,该变量的数值(注意正负号)。

开始我不太明白为何运动学分析前一定要列写这个参数表,在写齐次变换矩阵时候,我一边写一边分析不就好了吗?

这里引用哈工大一个师兄的
知乎回答,大概意思就是D-H参数作用主要不是为了下面齐次变换矩阵,而是建立关节物理模型和空间位置姿态之间的关系。(可能有些抽象,感兴趣可以深入学一学)

个人认为D-H参数表可以很清楚的说明连杆重要的四类参数(而欧式变换需要至少6个参数),对于建立正运动学模型有重要意义。

3. 正运动学方程推导+Matlab求解

① 推导的理论基础

这里我们需要建立{6}系对于{0}系的变换矩阵,也就是进行下面的推导:

同时,连杆变换中讲到了通用的子变换情况,齐次变换矩阵为:

注意:这里的矩阵变换通式是用的改进型的D-H法,因此下面的mtlab都是用的改进型。


② 具体过程

让我们来列写各个子变换,结合上面通式与D-H表,也可以很容易列写

_{1}^{0}\textrm{}T

~

_{6}^{5}\textrm{}T

当然我写的下面matlab程序可以由D-H参数表与变换通式,直接输出各个子变换的值~

_{1}^{0}\textrm{}T=\begin{bmatrix} c_{1} & -s_{1} & 0& 0\\ s_{1}& c_{1} & 0 & 0\\ 0& 0 & 1 & 0\\ 0 & 0& 0 & 1 \end{bmatrix}

     

_{2}^{1}\textrm{}T=\begin{bmatrix} c_{2} & -s_{2} & 0& 0\\ 0& 0 &1 & d_{2}\\ -s_{2}& -c_{2} & 0 & 0\\ 0 & 0& 0 & 1 \end{bmatrix}

     

_{3}^{2}\textrm{}T=\begin{bmatrix} \ c_{3} & -s_{3} & 0 & a_2 \\ \ s_{3} & c_{3} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
_{4}^{3}\textrm{}T=\begin{bmatrix} c_{4} & -s_{4} & 0 & a_3 \\ 0& 0 & 1 & d_4 \\ -s_4 & -c_4 & 0 & 0\\ 0 & 0& 0 & 1 \end{bmatrix}

     

_{5}^{4}\textrm{}T=\begin{bmatrix} c_{5} & -s_{5} & 0& 0\\ 0& 0 &-1 & 0\\ s_{5}& c_{5} & 0 & 0\\ 0 & 0& 0 & 1 \end{bmatrix}

     

_{6}^{5}\textrm{}T=\begin{bmatrix} \ c_{6} & -s_{6} & 0 & 0 \\ \ 0 & 0 & 1 & 0 \\ -s_6 & -c_6 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

对上述矩阵相乘可以用Matlab运算(比较快):

clc; clear; %以下为正运动学求解过程 %声明变量 syms theata1 theata2 theata3 theata4 theata5 theata6 a2 a3 d2 d4; % %代入参数值 % theata1=0; theata2=0; theata3=-pi/2; theata4=0; theata5=0; theata6=0; % a2=400; a3=10; d2=120; d4=400; %D-H参数表 DH=[0 0 0 theata1; -pi/2 0 d2 theata2; 0 a2 0 theata3; -pi/2 a3 d4 theata4; pi/2 0 0 theata5; -pi/2 0 0 theata6]; t=1; %齐次变换 for i=1:6 T0 = [cos(DH(i,4)) -sin(DH(i,4)) 0 DH(i,2); sin(DH(i,4))*cos(DH(i,1)) cos(DH(i,4))*cos(DH(i,1)) -sin(DH(i,1)) -DH(i,3)*sin(DH(i,1)); sin(DH(i,4))*sin(DH(i,1)) cos(DH(i,4))*sin(DH(i,1)) cos(DH(i,1)) DH(i,3)*cos(DH(i,1)); 0 0 0 1 ] t = t*T0 end 

上述代码实际上就是利用了一个for循环,来计算

_{1}^{0}\textrm{}T

~

_{6}^{5}\textrm{}T

矩阵并输出到

T_{0}

中;之后为了计算矩阵相乘,就引入了T,每计算一个子变换就乘进去一个,最终得到的T结果就是

_{6}^{0}\textrm{}T


如果已知了theata1~theata6的关节变量值,可以在DH参数表下面写明对应数值,这样就可以计算出对应的齐次变换矩阵真值了~

比如,上面代码代入参数值取消注释后运行代码,可以输出这个参数值下的齐次变换矩阵,可以看到末端相对基座标的位置信息:

% theata1=0; theata2=0; theata3=-pi/2; theata4=0; theata5=0; theata6=0; % a2=400; a3=10; d2=120; d4=400;

也就是代表了机械臂末端在基坐标系下的位置是:x=800,y=120,z=10。

三、Matlab正运动仿真——机器人工具箱

接下来是利用matlab里的工具箱进行机械臂的建模,这一步骤就是可以很便捷的对各个关节进行参数设置,就能够直观看出末端的位置角度信息。

下面是整体的建模代码:

clc; clear; %定义连杆的D-H参数 %连杆偏移 d1 = 0; d2 = 120; d3 = 0; d4 = 400; d5 = 0; d6 = 0; %连杆长度 a1 = 0; a2 = 0; a3 = 400; a4 = 10; a5 = 0; a6 = 0; %连杆扭角 alpha1 = 0; alpha2 = -pi/2; alpha3 = 0; alpha4 = -pi/2; alpha5 = pi/2; alpha6 = -pi/2; %建立机器人模型 % theta d a alpha L1=Link([0 d1 a1 alpha1 ],'modified'); L2=Link([0 d2 a2 alpha2 ],'modified'); L3=Link([0 d3 a3 alpha3 ],'modified'); L4=Link([0 d4 a4 alpha4 ],'modified'); L5=Link([0 d5 a5 alpha5 ],'modified'); L6=Link([0 d6 a6 alpha6 ],'modified'); %限制机器人的关节空间 L1.qlim = [(-165/180)*pi,(165/180)*pi]; L2.qlim = [(-150/180)*pi, (60/180)*pi]; L3.qlim = [(-150/180)*pi, (90/180)*pi]; L4.qlim = [(-180/180)*pi,(180/180)*pi]; L5.qlim = [(-115/180)*pi,(115/180)*pi]; L6.qlim = [(-360/180)*pi,(360/180)*pi]; %连接连杆,机器人取名为myrobot robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','6Rrobot'); robot.base = transl(0 ,0 ,660.4); %基坐标系进行平移 robot.display(); %打印出机器人D-H参数表 robot.teach(); %展示机器人模型 %调整坐标轴长度 ax = gca; ax.XLim = [-1000, 1000]; ax.YLim = [-1000, 1000]; ax.ZLim = [-1000, 1500]; hold on; 

之后可以输出下面的结果,图中我修改了转轴3的角度:

可以和上面旋转矩阵直接求解的结果(x=800,y=120,z=10)对比,发现机器人的z位置为什么是670.4呢?这是因为建系时为了方便列写后续参数,没有将底座的高度考虑进来。我在上面代码中写了这样一句:

robot.base = transl(0 ,0 ,660.4); %基坐标系进行平移

就是将基坐标系平移,这句命令将基坐标系向Z方向平移了660.4个单位,也就是PUMA560机器人图中的基座高度,因此这两个解出来实际是一样的。

四、PUMA560工作空间可视化

上面讲到了如何进行这个机器人的建模和正运动学解算,下面我们来具体求一下这个机器人的工作空间到底是多大呢,而工作空间算出来就可以知道,我们设计的机器人能不能满足工作环境的需要了~

只需要在上面正解的代码后面,加下面的代码即可:

% 计算工作空间 num = 10000; % 采样点数,点数越多越精确但计算时间越长 q = zeros(num, 3); % 提前声明这样的位置矩阵 % 计算每个关节构型对应的末端执行器位置 for i = 1:num q1=L1.qlim(1)+ rand * (L1.qlim(2)-L1.qlim(1)) ; q2=L2.qlim(1)+ rand * (L1.qlim(2)-L1.qlim(1)) ; q3=L3.qlim(1)+ rand * (L1.qlim(2)-L1.qlim(1)) ; q4=L4.qlim(1)+ rand * (L1.qlim(2)-L1.qlim(1)) ; q5=L5.qlim(1)+ rand * (L1.qlim(2)-L1.qlim(1)) ; q6=L6.qlim(1)+ rand * (L1.qlim(2)-L1.qlim(1)) ; q= [q1 q2 q3 q4 q5 q6]; T = robot.fkine(q); p(i,:) = transl(T); end % 可视化工作空间 scatter3(p(:,1), p(:,2), p(:,3), 10, 'b', '.');

这是最终的工作空间结果图:


总结

本文主要针对PUMA560这种六自由度机械臂,进行了正运动学分析,其中为了方便计算旋转矩阵利用到了matlab工具;之后利用matlab机器人工具箱,进行了机械臂的建模,这一结果也可以用于正运动学的解算;最后对其工作空间进行了可视化分析~   以上过程的基础是机构自由度、连杆参数、齐次变换等,在我专栏中都有介绍,如有需要可以查阅~

本人也在不断学习过程中,如有不足之处,还望批评指正~

Read more

米家API完全指南:轻松掌控智能家居生态系统

米家API完全指南:轻松掌控智能家居生态系统 【免费下载链接】mijia-api米家API 项目地址: https://gitcode.com/gh_mirrors/mi/mijia-api 米家API是一个功能强大的Python工具库,让开发者和普通用户都能轻松控制小米智能设备。通过封装复杂的网络通信协议,您只需几行代码即可实现设备远程操控、状态监测和场景自动化,打造专属的智能家居体验。 🌟 米家API的核心优势 简单易用:无需深入了解底层技术细节,初学者也能快速上手 功能全面:支持设备发现、属性设置、动作执行等核心操作 兼容性强:适配米家生态链中的各类智能设备 扩展灵活:提供丰富的API接口,满足个性化开发需求 🚀 三分钟快速上手 第一步:安装米家API 推荐方式:通过PyPI安装 pip install mijiaAPI 备选方案:从源码构建 git clone https://gitcode.com/gh_mirrors/mi/mijia-api

【AFDM与信号处理:论文阅读】仿射频分复用:扩展OFDM以实现场景灵活性和弹性

【AFDM与信号处理:论文阅读】仿射频分复用:扩展OFDM以实现场景灵活性和弹性

2025.12.17 虽说还没做过AFDM,但是作为最近比较流行的多载波方案之一,还是有必要去简单学习一下的。因此建立此帖,从小白的视角学习下关于AFDM的相关内容。 【AFDM与信号处理:论文阅读】Affine Frequency Division Multiplexing: Extending OFDM for Scenario-Flexibility and Resilience * 一、前言 * 1.1 写在前面 * 1.2 中心思想 * 二、摘要 * 三、引言 * 四、双重扩散信道中的挑战 * 五、AFDM的基本原理 * 六、潜在应用场景 一、前言 1.1 写在前面 论文题目:Affine Frequency Division Multiplexing: Extending OFDM

Nano Banana进行AI绘画中文总是糊?一招可重新渲染,清晰到可直接汇报

Nano Banana进行AI绘画中文总是糊?一招可重新渲染,清晰到可直接汇报

文章目录 * 1. 为什么 Nano Banana 生成的中文经常不清晰? * 2. 解决思路:Nano Banana + Seedream 4.5 的两段式工作流 * 3. 实战:先用 Nano Banana 生成架构图(中文会糊) * 4. 部署 Personal LLM API,并配置 Seedream 4.5 * 5. 用 Cherry Studio 配置已部署的 LLM 接口 * 6. 关键一步:用 Seedream 4.5 对“中文文字重新渲染” * 7. 效果对比:字清晰、无错位、图形保持不变

智能家居与物联网项目实战全指南:从架构设计到落地部署

随着物联网(IoT)、边缘计算与AI技术的深度融合,智能家居已从单一设备控制升级为“感知-决策-执行”的全场景智能系统。无论是个人开发者搭建家庭智能环境,还是企业级项目落地,都需要兼顾硬件兼容性、网络稳定性、场景实用性与安全性。本文将从系统架构、硬件选型、软件开发、场景实战、问题排查五个核心模块,提供可直接落地的实战方案,助力开发者快速完成智能家居项目从0到1的搭建。 一、智能家居系统核心架构设计(四层架构+技术选型) 智能家居系统的本质是“设备互联+数据驱动+场景联动”,采用经典的“感知层-网络层-平台层-应用层”四层架构设计,可确保系统的稳定性、可扩展性与兼容性。 1. 感知层:数据采集的“神经末梢” 感知层是系统的数据来源,负责采集环境参数、设备状态与人体行为信息,核心设备包括传感器与执行器,选型需兼顾精度、功耗与兼容性。 - 核心设备分类: - 环境传感器:温湿度传感器(推荐DHT22,精度±0.5℃