├── 正运动学求解1.gif ├── 正运动学求解2.gif ├── 逆运动学求解1.gif ├── 逆运动学求解2.gif ├── 逆运动学求解画圆.gif ├── README.md └── puma560.md /正运动学求解1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SEUZTh/Forward-and-inverse-kinematics-of-puma560/HEAD/正运动学求解1.gif -------------------------------------------------------------------------------- /正运动学求解2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SEUZTh/Forward-and-inverse-kinematics-of-puma560/HEAD/正运动学求解2.gif -------------------------------------------------------------------------------- /逆运动学求解1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SEUZTh/Forward-and-inverse-kinematics-of-puma560/HEAD/逆运动学求解1.gif -------------------------------------------------------------------------------- /逆运动学求解2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SEUZTh/Forward-and-inverse-kinematics-of-puma560/HEAD/逆运动学求解2.gif -------------------------------------------------------------------------------- /逆运动学求解画圆.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SEUZTh/Forward-and-inverse-kinematics-of-puma560/HEAD/逆运动学求解画圆.gif -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Forward-and-inverse-kinematics-of-puma560 2 | 东南大学自动化学院2018级机器人技术基础实验2:正逆运动学求解仿真 3 | 4 | 5 | 6 | - [1. 实验目的和要求](#1-实验目的和要求) 7 | - [2. 实验手段](#2-实验手段) 8 | - [2.1 实验原理](#21-实验原理) 9 | - [2.2 函数详解](#22-函数详解) 10 | - [3. 实验主要内容](#3-实验主要内容) 11 | - [4. 实验结果和分析](#4-实验结果和分析) 12 | - [4.1 正运动学求解](#41-正运动学求解) 13 | - [例1](#例1) 14 | - [例2](#例2) 15 | - [4.2 逆运动学求解](#42-逆运动学求解) 16 | - [例1](#例1-1) 17 | - [例2](#例2-1) 18 | 19 | 20 | 21 | # 1. 实验目的和要求 22 | - 掌握常见形式的机器人的D-H坐标系建立方法、运动学建模; 23 | - 正逆运动学分析与求解; 24 | - 使用Robotics Toolbox对直角坐标机器人、圆柱坐标机器人、球坐标机器人、PUMA560其中之一建立运动学模型,正逆求解和仿真。 25 | # 2. 实验手段 26 | ## 2.1 实验原理 27 | - D-H坐标系 28 | - 正运动学求解:已知机器人的所有连杆长度和关节角度,计算机器人手的位姿。 29 | - 逆运动学求解:找到方程的逆,求得所需的关节变量,使机器人放置在期望的位姿。 30 | - Robotics Toolbox & MATLAB 31 | ## 2.2 函数详解 32 | - transl 33 | - Create or unpack an SE3 translational transform 34 | - ```T = transl(x, y, z)``` is an SE(3) homogeneous transform (4x4) representing a pure translation of x, y and z. 35 | ```matlab 36 | >> T=transl(0, 0, 0.62) 37 | 38 | T = 39 | 40 | 1.0000 0 0 0 41 | 0 1.0000 0 0 42 | 0 0 1.0000 0.6200 43 | 0 0 0 1.0000 44 | ``` 45 | --- 46 | - trotz 47 | - Rotation about Z axis 48 | - ```T = trotz(theta)``` is a homogeneous transformation (4x4) representing a rotation of theta radians about the z-axis. 49 | ```matlab 50 | >> T=trotz(pi/2) 51 | 52 | T = 53 | 54 | 0.9996 -0.0274 0 0 55 | 0.0274 0.9996 0 0 56 | 0 0 1.0000 0 57 | 0 0 0 1.0000 58 | ``` 59 | --- 60 | - SerialLink 61 | - Serial-link robot class 62 | - A concrete class that represents a serial-link arm-type robot. The mechanism is described using Denavit-Hartenberg parameters, one set per joint. 63 | ```matlab 64 | robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','puma560','base' , ... 65 | transl(1, 1, 1)* trotz(pi/2)); %连接连杆,机器人取名puma560 66 | ``` 67 | --- 68 | - Link 69 | - Robot manipulator Link class 70 | - A Link object holds all information related to a robot link such as kinematics parameters, rigid-body inertial parameters, motor and transmission parameters. 71 | ```matlab 72 | % theta d a alpha offset 73 | L1=Link([ 0 0 0 -pi/2 0 ],'standard'); %连杆的D-H参数 74 | L2=Link([ 0 0 0.4318 0 0 ],'standard'); 75 | L3=Link([ 0 0.1501 0.0203 pi/2 0 ],'standard'); 76 | L4=Link([ 0 0.4318 0 -pi/2 0 ],'standard'); 77 | L5=Link([ 0 0 0 pi/2 0 ],'standard'); 78 | L6=Link([ 0 0 0 0 0 ],'standard'); 79 | ``` 80 | --- 81 | # 3. 实验主要内容 82 | - PUMA机器人的标准D-H参数如下: 83 | 84 | |连杆|$\theta_{i}$|$d$|$a$|$\alpha$| 85 | |:---:|:---:|:---:|:---:|:---:| 86 | |1|$\theta_{1}$|0|0|-90| 87 | |2|$\theta_{2}$|149.09mm|431.8mm|0| 88 | |3|$\theta_{3}$|0|-20.32mm|90| 89 | |4|$\theta_{4}$|433.07mm|0|-90| 90 | |5|$\theta_{5}$|0|0|90| 91 | |6|$\theta_{6}$|56.25mm|0|0| 92 | # 4. 实验结果和分析 93 | ## 4.1 正运动学求解 94 | ### 例1 95 | $\theta=[\frac{\pi}{2},0,\frac{\pi}{2},0,0,0]$ 96 | ```matlab 97 | >> theta=[pi/2 0 pi/2 0 0 0]; 98 | >> T=robot.fkine(theta) 99 | 100 | 101 | T = 102 | 0 -1 0 -0.1501 103 | 0 0 1 0.8636 104 | -1 0 0 0.4797 105 | 0 0 0 1 106 | ``` 107 |  108 | 109 | 110 | ### 例2 111 | $\theta=[-\frac{\pi}{2},0,-\frac{\pi}{2},0,0,0]$ 112 | ```matlab 113 | >> theta=[-pi/2 0 -pi/2 0 0 0]; 114 | >> T=robot.fkine(theta) 115 | 116 | 117 | T = 118 | 0 1 0 0.1501 119 | 0 0 1 0 120 | 1 0 0 0.5203 121 | 0 0 0 1 122 | ``` 123 |  124 | 125 | ## 4.2 逆运动学求解 126 | ### 例1 127 | ```matlab 128 | bx = -0.06; 129 | by = -0.2; 130 | bz = 0.1; 131 | tform = rpy2tr(136,-180,-180); %欧拉角转姿态齐次矩阵 132 | targetPos = [bx by bz]; %末端位置向量 133 | TR=transl(targetPos)*tform; %位姿齐次矩阵 134 | q=robot.ikine(TR); % 求逆解 135 | >> q 136 | 137 | q = 138 | 139 | -2.6644 0.1658 -2.6476 -0.7275 1.9528 2.1979 140 | ``` 141 |  142 | 143 | ### 例2 144 | ```matlab 145 | ```matlab 146 | bx = -0.35; 147 | by = -0.4; 148 | bz = 0.2; 149 | tform = rpy2tr(136,-180,-180); %欧拉角转姿态齐次矩阵 150 | targetPos = [bx by bz]; %末端位置向量 151 | TR=transl(targetPos)*tform; %位姿齐次矩阵 152 | q=robot.ikine(TR); % 求逆解 153 | >> q 154 | 155 | q = 156 | 157 | 1.1383 1.7925 -3.1260 0.3310 2.0308 -1.0988 158 | ``` 159 |  160 | 161 | # 5. 附 Matlab 代码和演示视频 162 | - 正逆运动学求解代码: 163 | ```matlab 164 | %% 标准DH建立puma560机器人模型 165 | clear; 166 | clc; 167 | %建立机器人模型(标准D-H参数) 168 | theta=[-pi/2 0 -pi/2 0 0 0]; 169 | %theta=[0 0 -pi/2 pi/2 pi/2 0]; 170 | % theta d a alpha offset 171 | L1=Link([ theta(1) 0 0 -pi/2 0 ],'standard'); %连杆的D-H参数 172 | L2=Link([ theta(2) 0 0.4318 0 0 ],'standard'); 173 | L3=Link([ theta(3) 0.1501 0.0203 pi/2 0 ],'standard'); 174 | L4=Link([ theta(4) 0.4318 0 -pi/2 0 ],'standard'); 175 | L5=Link([ theta(5) 0 0 pi/2 0 ],'standard'); 176 | L6=Link([ theta(6) 0 0 0 0 ],'standard'); 177 | robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','puma560','base' , ... 178 | transl(0, 0, 0.5)* trotz(0)); %连接连杆,机器人取名puma560 179 | % base pose of robot's base (4x4 homog xform) 180 | figure(1) 181 | robot.teach() %teach可视化模型并可以单轴驱动,可以查看模型与实际机器人的关节运动是否一致。 182 | robot.display(); %Link 类函数,显示建立的机器人DH参数 183 | 184 | T=robot.fkine(theta); %计算机器人正运动学,括号内为theta值 185 | disp(T); 186 | robot.plot(theta) 187 | 188 | %% 使用Peter工具箱逆解 189 | hold on 190 | title("工具箱机器人模型"); 191 | xlabel('x/米','FontSize',12); 192 | ylabel('y/米','FontSize',12); 193 | zlabel('z/米','FontSize',12); 194 | bx = -0.35; 195 | by = -0.4; 196 | bz = 0.2; 197 | tform = rpy2tr(136,-180,-180); %欧拉角转姿态齐次矩阵 198 | targetPos = [bx by bz]; %末端位置向量 199 | TR=transl(targetPos)*tform; %位姿齐次矩阵 200 | hold on 201 | grid on 202 | plot3(bx,by,bz,'*','LineWidth',1); 203 | q=robot.ikine(TR); 204 | robot.plot(q); 205 | ``` 206 | 207 | - 逆运动学求解——画圆 208 | ```matlab 209 | %% 标准DH建立puma560机器人模型 210 | clear; 211 | clc; 212 | %建立机器人模型(标准D-H参数) 213 | theta=[-pi/2 0 -pi/2 0 0 0]; 214 | %theta=[0 0 -pi/2 pi/2 pi/2 0]; 215 | % theta d a alpha offset 216 | L1=Link([ theta(1) 0 0 -pi/2 0 ],'standard'); %连杆的D-H参数 217 | L2=Link([ theta(2) 0 0.4318 0 0 ],'standard'); 218 | L3=Link([ theta(3) 0.1501 0.0203 pi/2 0 ],'standard'); 219 | L4=Link([ theta(4) 0.4318 0 -pi/2 0 ],'standard'); 220 | L5=Link([ theta(5) 0 0 pi/2 0 ],'standard'); 221 | L6=Link([ theta(6) 0 0 0 0 ],'standard'); 222 | robot=SerialLink([L1 L2 L3 L4 L5 L6],'name','puma560','base' , ... 223 | transl(0, 0, 0.5)* trotz(0)); %连接连杆,机器人取名puma560 224 | % base pose of robot's base (4x4 homog xform) 225 | figure(1) 226 | robot.teach() %teach可视化模型并可以单轴驱动,可以查看模型与实际机器人的关节运动是否一致。 227 | robot.display(); %Link 类函数,显示建立的机器人DH参数 228 | 229 | T=robot.fkine(theta); %计算机器人正运动学,括号内为theta值 230 | disp(T); 231 | robot.plot(theta) 232 | 233 | %% 定义圆路径 234 | t = (0:0.2:20)'; count = length(t);center = [-0.25 0.6 0.1];radius = 0.1;%圆心和半径 235 | theta = t*(2*pi/t(end)); 236 | points =(center + radius*[cos(theta) sin(theta) zeros(size(theta))])'; 237 | figure(1); 238 | plot3(points(1,:),points(2,:),points(3,:),'r') 239 | 240 | %% 使用Peter工具箱逆解进行轨迹重现 241 | hold on 242 | % axis([-1 1.2 -1 1.2 -1 1.2]) 243 | title("工具箱机器人模型末端运动轨迹"); 244 | xlabel('x/米','FontSize',12); 245 | ylabel('y/米','FontSize',12); 246 | zlabel('z/米','FontSize',12); 247 | for i = 1:size(points,2) 248 | pause(0.01) 249 | bx = points(1,i); 250 | by = points(2,i); 251 | bz =points(3,i); 252 | tform = rpy2tr(136,-180,-180); %欧拉角转姿态齐次矩阵 253 | targetPos = [bx by bz]; %末端位置向量 254 | % targetOr = [0.02 -0.14 0.99 -0.01] %四元数 255 | % tform = quat2tform(targetOr) %四元数转姿态齐次矩阵 256 | TR=transl(targetPos)*tform; %位姿齐次矩阵 257 | hold on 258 | grid on 259 | plot3(bx,by,bz,'*','LineWidth',1); 260 | q=robot.ikine(TR); 261 | pause(0.01) 262 | robot.plot(q);%动画演示 263 | end 264 | ``` 265 | -------------------------------------------------------------------------------- /puma560.md: -------------------------------------------------------------------------------- 1 |