%% 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);