IRDYn/r1000dynamics/r1000_dynamic_analysis/calculateJacobian.asv

49 lines
2.3 KiB
Plaintext

function [jacoInfo] = calculateJacobian(robotRigidInfo,...
rotInfo,...
theta)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 计算机器人各个轴臂的雅可比矩阵,
% dynamicBasicInfo: 机械臂的基本信息
% rotInfo: 各个轴臂的姿态信息
% theta: 转角
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
temp = struct;
temp.rot = eye(3);
temp.rotTran = eye(3);
rotInfo.link = ([temp temp temp temp temp temp temp temp temp]);
rotInfo.motor = ([temp temp temp temp temp temp temp temp temp]);
for i=1:9
jacoInfo.link(i).jaco = zeros(6,9);
jacoInfo.motor(i).jaco = zeros(6,robotRigidInfo.dof);
comToRotCenter = -rotInfo.link(i).rot*robotRigidInfo.link(i).R1;
for j=i:-1:1
if robotRigidInfo.link(j).jointAxis>3
rotAxis=zeros(3,1);
rotAxis(robotRigidInfo.link(j).jointAxis-3) = 1;
% movement
jacoInfo.link(i).jaco(1:3,j) = -vector2so3(comToRotCenter)*rotInfo.link(j).rot*rotAxis;
if j>1
comToRotCenter = comToRotCenter + ...
rotInfo.link(j-1).rot*robotRigidInfo.link(j-1).R2 ...
- rotInfo.link(j-1).rot*robotRigidInfo.link(j-1).R1;
end
% rotation
jacoInfo.link(i).jaco(4:6,j) = rotInfo.link(i).rotTran*rotInfo.link(j).rot*rotAxis;
else
tranAxis=zeros(3,1);
tranAxis(robotRigidInfo.link(j).jointAxis) = 1;
% movement
jacoInfo.link(i).jaco(1:3,j) = rotInfo.link(j).rot*tranAxis;
if j>1
comToRotCenter = comToRotCenter + ...
rotInfo.link(j-1).rot*robotRigidInfo.link(j-1).R2 ...
- rotInfo.link(j-1).rot*robotRigidInfo.link(j-1).R1 + ...
rotInfo.link(j).rot*tranAxis*theta(j);
end
end
motorRotAxis = zeros(3,1);
motorRotAxis(robotRigidInfo.motor(i).jointAxis-3) = 1;
jacoInfo.motor(i).jaco = jacoInfo.link(i).jaco;
jacoInfo.motor(i).jaco(4:6,i) = robotRigidInfo.motor(i).gearRatio*motorRotAxis;
end
end