IRDYn/R1000_Dynamics_num_traj.m

259 lines
7.9 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

%% R1000
N=9;
% traj
load('pose1_isa_depth_95mm.mat');
time = (100:size(q_log,2))/2000;
q_J = q_log(2:10,100:end);
qd_J = vel_log(2:10,100:end);
qdd_J = acc_log(2:10,100:end);
% Dynamics parameters
link_mass = robot.m;
com_pos = robot.com;
link_inertia = robot.I;
thetalist = q_J';
dthetalist = qd_J';
ddthetalist = qdd_J';
%real traj
% get_GCTraj_R1000_DVT;
% thetalist = idntfcnTrjctry(6).q';
% dthetalist = idntfcnTrjctry(6).qd';
% ddthetalist = idntfcnTrjctry(6).qdd';
% Get general mass matrix
Glist=[];
for i = 1:N
link_inertia(:,:,i) = robot.Home.R(:,:,i)'*link_inertia(:,:,i)*robot.Home.R(:,:,i);
Gb= [link_inertia(:,:,i),zeros(3,3);zeros(3,3),link_mass(i)*diag([1,1,1])];
Glist = cat(3, Glist, Gb);
end
% Get the com pos transformation in each joint reference frame
% Mlist_CG = [];
% for i = 0:N-1
% if i == 0
% M = robot.T(:,:,i+1)*transl(com_pos(:,i+1));
% else
% M = TransInv(transl(com_pos(:,i)))*robot.T(:,:,i+1)*transl(com_pos(:,i+1));
% end
% Mlist_CG = cat(3, Mlist_CG, M);
% end
% M = [[1, 0, 0, 0]; [0, 1, 0, 0]; [0, 0, 1, 0]; [0, 0, 0, 1]];
% Mlist_CG = cat(3, Mlist_CG, M);
% Get the com pos transformation in each joint reference frame
% FIXME: BUG here
% Mlist_CG=[];
% for i = 0:N-1
% if i == 0
% M=robot.T(:,:,i+1)*transl(com_pos(:,i+1));
% else
% rotation_i = diag([1,1,1]);
% for j = 1:i
% rotation_i = rotation_i*TransToRp(robot.T(:,:,i));
% rotation_j = rotation_i*TransToRp(robot.T(:,:,i+1));
% end
% M = TransInv(RpToTrans(rotation_i,rotation_i*com_pos(:,i)))*robot.T(:,:,i+1)*RpToTrans(rotation_j,rotation_j*com_pos(:,i+1));
% end
% Mlist_CG = cat(3, Mlist_CG, M);
% end
% M = [[1, 0, 0, 0]; [0, 1, 0, 0]; [0, 0, 1, 0]; [0, 0, 0, 1]];
% Mlist_CG = cat(3, Mlist_CG, M);
% ct=[];
% Mlist_CG=[];
% for i = 1:N
% if i == 1
% ct(:,i) = com_pos_R1(:,i);
% elseif i< 9
% ct(:,i) = -com_pos_R2(:,i-1)+com_pos_R1(:,i);
% else
% ct(:,i) = -com_pos_R1(:,i-1)-[0;0;0.05896]+com_pos_R1(:,i);
% end
% robot.Home.com(:,i) = ct(:,i);
% M = RpToTrans(robot.T(1:3,1:3,i),robot.Home.R(:,:,i)*robot.Home.com(:,i));
% Mlist_CG = cat(3, Mlist_CG, M);
% end
% M = [[1, 0, 0, 0]; [0, 1, 0, 0]; [0, 0, 1, 0]; [0, 0, 0, 1]];
% Mlist_CG = cat(3, Mlist_CG, M);
% Mlist_CG=[];
% for i = 1:N
% if i == 1
% M = [diag([1,1,1]),com_pos_R1(:,i);zeros(1,3),1];
% elseif i<=8
% M = RpToTrans(TransToRp(robot.T(:,:,i)),robot.Home.R(:,:,i)*(-com_pos_R2(:,i-1)+com_pos_R1(:,i)));
% elseif i==9
% M = RpToTrans(TransToRp(robot.T(:,:,i)),robot.Home.R(:,:,i)*(-[0;0;0.05896]+com_pos_R1(:,i-1)+com_pos_R1(:,i)));
% end
% Mlist_CG = cat(3, Mlist_CG, M);
% end
% M = [[1, 0, 0, 0]; [0, 1, 0, 0]; [0, 0, 1, 0]; [0, 0, 0, 1]];
% Mlist_CG = cat(3, Mlist_CG, M);
% get the CG at the world base frame
com_pos_R1 = robot.com_pos_R1;
com_pos_R2 = robot.com_pos_R2;
ct=[];
Mlist_CG_Base=[];
for i = 1:N
if i == 1
ct(:,i) = com_pos_R1(:,i);
elseif i< 9
ct(:,i) = ct(:,i-1)-com_pos_R2(:,i-1)+com_pos_R1(:,i);
else
ct(:,i) = ct(:,i-1)-com_pos_R1(:,i-1)-[0.23;0;0.05896]+com_pos_R1(:,i);
end
robot.Home.com(:,i) = ct(:,i);
M_CG_Base = RpToTrans(robot.Home.R(:,:,i),robot.Home.com(:,i));
Mlist_CG_Base = cat(3, Mlist_CG_Base, M_CG_Base);
end
% get the CG at the last GC frame
Mlist_CG=[];
for i = 1:N
if i == 1
Mlist_CG(:,:,i) = Mlist_CG_Base(:,:,i);
else
Mlist_CG(:,:,i) = TransInv(Mlist_CG_Base(:,:,i-1))*Mlist_CG_Base(:,:,i);
end
end
M = [[1, 0, 0, 0]; [0, 1, 0, 0]; [0, 0, 1, 0]; [0, 0, 0, 1]];
Mlist_CG = cat(3, Mlist_CG, M);
% Get the end efforce transformation in each joint reference frame
Mlist_ED = [];
for i = 1:N
M = robot.T(:,:,i);
Mlist_ED = cat(3, Mlist_ED, M);
end
M = [[1, 0, 0, 0]; [0, 1, 0, 0]; [0, 0, 1, 0]; [0, 0, 0, 1]];
Mlist_ED = cat(3, Mlist_ED, M);
%TODO: Get Slist form DH table method
% RRRRRRRRP
Slist=robot.slist;
exf=[0;0;0;0;1;0];
for i = 1:length(thetalist)
[V1(:,:, i),Vd1(:,:, i),Adgab_mat(:,:,:,i),Fmat(:,:,i),taumat(:,i)] ...
= InverseDynamics_debug(thetalist(i,:)', dthetalist(i,:)', ddthetalist(i,:)', ...
[0;0;-9.806], exf, Mlist_CG, Glist, Slist);
% [0;0;-9.806], exf, Mlist_CG, Glist, Slist);
G(:,:,:,i) = FKinSpaceExpand(Mlist_CG, Slist, thetalist(i,:)');
T(:,:,:,i)=FKinSpaceExpand(Mlist_ED, Slist, thetalist(i,:)');
%Want to get the result from TC_delta, which means F at CG represent under frame at the last origin
%why we need Mlist_ED
%please explain this more
F_Simpack(:,:,i) = getSimpackF(G(:,:,:,i),T(:,:,:,i),Mlist_ED,Fmat(:,:,i));
end
% plot Torque
% above 2020b
% F_Simpack = pagetranspose(F_Simpack);
% below 2020b
% for i = 1:3
% subplot(3,1,i);
% hold on;
% %added minus, so should be the same as simpack
% plot(time,taumat(i+6,:))
% xlabel('time(s)')
% ylabel('Torque(Nm)')
% % plot(SPCK_Result.Crv(i+4).x,SPCK_Result.Crv(i+4).y)
% end
F_Simpack = permute(F_Simpack,[2 1 3]);
F_Simpack = -F_Simpack;
% 确保输出文件夹存在
output_main = 'output';
output_sub = fullfile(output_main, 'pose1_isa_depth_95mm');
if ~exist(output_main, 'dir')
mkdir(output_main);
end
if ~exist(output_sub, 'dir')
mkdir(output_sub);
end
% 获取时间序列长度
n_time = size(F_Simpack, 3);
% 遍历所有关节1到8
for joint_idx = 1:8
fig = figure('Position', [100, 100, 1000, 900]); % 创建大尺寸图形窗口
% 遍历三个力矩分量
for comp_idx = 1:3
subplot(3, 1, comp_idx);
hold on;
% 提取并处理数据取负值以匹配Simpack约定
data = -squeeze(F_Simpack(joint_idx, comp_idx, :));
% 绘制力矩曲线
plot(time, data, 'LineWidth', 1.5);
% 计算并标注最大绝对值(峰值)
[abs_max, max_idx] = max(abs(data)); % 找到最大绝对值
peak_value = data(max_idx); % 对应的实际值(带符号)
% 标记峰值点
plot(time(max_idx), peak_value, 'ro', 'MarkerSize', 8, 'LineWidth', 2);
% 创建标注文本
text_str = sprintf('Peak: %.2f Nm (|%.2f|)', peak_value, abs_max);
% 确定文本位置(避免重叠)
y_range = ylim;
y_offset = 0.05 * (y_range(2) - y_range(1));
if peak_value >= 0
text_pos = [time(max_idx), peak_value - y_offset];
vert_align = 'top';
else
text_pos = [time(max_idx), peak_value + y_offset];
vert_align = 'bottom';
end
% 添加文本标注
text(text_pos(1), text_pos(2), text_str, ...
'VerticalAlignment', vert_align, 'HorizontalAlignment', 'center', ...
'FontSize', 10, 'BackgroundColor', 'white', 'EdgeColor', 'black');
% 添加标签和网格
switch comp_idx
case 1
title('Bending Moment (M_x)');
case 2
title('Bending Moment (M_y)');
case 3
title('Torque (M_z)');
end
xlabel('Time [s]');
ylabel('Moment [Nm]');
grid on;
box on;
end
% 添加总标题
sgtitle(sprintf('Joint %d - Moment Components (Peak Values)', joint_idx), ...
'FontSize', 14, 'FontWeight', 'bold');
% 保存图形
saveas(fig, fullfile(output_sub, sprintf('joint_%d.png', joint_idx)));
close(fig); % 关闭图形释放内存
end
disp('所有关节图表已保存至 output/pose2_isa_depth_95mm 文件夹');
% Use Body Twist cal linear vel, but can't cal the end frame vel
% [V2] = InverseDynamics_sym(thetalist, dthetalist, ddthetalist, ...
% [0;0;0], exf, Mlist, Glist, Slist);
% j=1;
% Vlinear(:, j+1) = BodyVelToLinearVel(V2(:,j+1),G(:,:,j)*M12);
% j=2;
% Vlinear(:, j+1) = BodyVelToLinearVel(V2(:,j+1),G(:,:,j)*M23);