49 lines
2.3 KiB
Plaintext
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 |