%% 五连杆机构腿长计算脚本 clear; clc; %% 定义输入参数 % 连杆长度 (m) l1 = 0.215; % 连杆1长度 l2 = 0.258; % 连杆2长度 l3 = 0.258; % 连杆3长度 l4 = 0.215; % 连杆4长度 l5 = 0.0; % 连杆5长度 % 关节角度 (弧度) phi1 = 0.10; % 30度 phi4 = 2.96; % 45度 %% 调用腿长计算函数 fprintf('五连杆机构腿长计算\n'); fprintf('输入参数:\n'); fprintf(' 连杆长度: l1=%.3f, l2=%.3f, l3=%.3f, l4=%.3f, l5=%.3f (m)\n', l1, l2, l3, l4, l5); fprintf(' 关节角度: phi1=%.3f (%.1f°), phi4=%.3f (%.1f°)\n', phi1, rad2deg(phi1), phi4, rad2deg(phi4)); try % 计算各关键点位置 % B点 (连杆1末端) x_B = l1 * cos(phi1); y_B = l1 * sin(phi1); % D点 (连杆4末端) x_D = l5 + l4 * cos(phi4); y_D = l4 * sin(phi4); % 计算BD距离 BD_dist = sqrt((x_D - x_B)^2 + (y_D - y_B)^2); % 检查三角形约束条件 if BD_dist > (l2 + l3) || BD_dist < abs(l2 - l3) warning('无法形成闭合五连杆机构!BD距离=%.3f, 需要满足: %.3f < BD < %.3f', ... BD_dist, abs(l2-l3), l2+l3); leg_length = NaN; foot_pos = [NaN, NaN]; return; end % 使用余弦定理求解phi2 cos_phi2_BD = (l2^2 + BD_dist^2 - l3^2) / (2 * l2 * BD_dist); % 检查余弦值是否在有效范围内 if abs(cos_phi2_BD) > 1 warning('余弦值超出范围: %.3f', cos_phi2_BD); leg_length = NaN; foot_pos = [NaN, NaN]; return; end % 计算BD方向角 alpha_BD = atan2(y_D - y_B, x_D - x_B); % 计算phi2 (两个解,选择合理的一个) angle_offset = acos(cos_phi2_BD); phi2_solution1 = alpha_BD + angle_offset; phi2_solution2 = alpha_BD - angle_offset; % 选择合理的解 (通常选择使机构在合理配置的解) phi2 = phi2_solution1; % 可以根据实际需要调整选择逻辑 % 计算C点位置 (足端位置) x_C = x_B + l2 * cos(phi2); y_C = y_B + l2 * sin(phi2); % 验证C点到D点距离是否等于l3 CD_dist = sqrt((x_D - x_C)^2 + (y_D - y_C)^2); error_CD = abs(CD_dist - l3); if error_CD > 1e-6 fprintf('警告: CD距离误差较大 (%.6f)\n', error_CD); end % 计算腿长 (假设为原点到C点的距离) leg_length = sqrt(x_C^2 + y_C^2); foot_pos = [x_C, y_C]; % 输出结果 fprintf('\n计算结果:\n'); fprintf(' B点位置: (%.3f, %.3f)\n', x_B, y_B); fprintf(' C点位置: (%.3f, %.3f)\n', x_C, y_C); fprintf(' D点位置: (%.3f, %.3f)\n', x_D, y_D); fprintf(' phi2角度: %.3f rad (%.1f°)\n', phi2, rad2deg(phi2)); fprintf(' 腿长: %.3f m\n', leg_length); fprintf(' BD距离: %.3f m\n', BD_dist); fprintf(' CD验证: %.6f m (应该等于l3=%.3f)\n', CD_dist, l3); %% 可视化结果 figure; plot([0, x_B], [0, y_B], 'b-', 'LineWidth', 2); % 连杆1 hold on; plot([x_B, x_C], [y_B, y_C], 'r-', 'LineWidth', 2); % 连杆2 plot([x_C, x_D], [y_C, y_D], 'g-', 'LineWidth', 2); % 连杆3 plot([l5, x_D], [0, y_D], 'm-', 'LineWidth', 2); % 连杆4 plot([0, l5], [0, 0], 'k-', 'LineWidth', 3); % 连杆5 (基座) % 标记关键点 plot(0, 0, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'k'); % A点 plot(x_B, y_B, 'bo', 'MarkerSize', 8, 'MarkerFaceColor', 'b'); % B点 plot(x_C, y_C, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'r'); % C点 plot(x_D, y_D, 'go', 'MarkerSize', 8, 'MarkerFaceColor', 'g'); % D点 plot(l5, 0, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'k'); % E点 % 标记腿长 plot([0, x_C], [0, y_C], 'k--', 'LineWidth', 1); % 腿长线 % 图形设置 grid on; axis equal; xlabel('X (m)'); ylabel('Y (m)'); title('五连杆机构示意图'); legend('连杆1', '连杆2', '连杆3', '连杆4', '基座', 'Location', 'best'); % 添加文本标注 text(0, 0-0.02, 'A', 'HorizontalAlignment', 'center'); text(x_B, y_B+0.02, 'B', 'HorizontalAlignment', 'center'); text(x_C, y_C+0.02, 'C(足端)', 'HorizontalAlignment', 'center'); text(x_D, y_D+0.02, 'D', 'HorizontalAlignment', 'center'); text(l5, 0-0.02, 'E', 'HorizontalAlignment', 'center'); text(x_C/2, y_C/2, sprintf('腿长=%.3fm', leg_length), 'HorizontalAlignment', 'center'); catch ME fprintf('计算过程中出现错误: %s\n', ME.message); leg_length = NaN; foot_pos = [NaN, NaN]; end %% 多组参数测试 fprintf('\n\n=== 多组参数测试 ===\n'); test_cases = [ pi/6, pi/4; % 30°, 45° pi/4, pi/3; % 45°, 60° -pi/6, pi/2; % -30°, 90° 0, pi/6; % 0°, 30° ]; for i = 1:size(test_cases, 1) phi1_test = test_cases(i, 1); phi4_test = test_cases(i, 2); fprintf('\n测试 %d: phi1=%.1f°, phi4=%.1f°\n', i, rad2deg(phi1_test), rad2deg(phi4_test)); % 重复计算过程(简化版) x_B_test = l1 * cos(phi1_test); y_B_test = l1 * sin(phi1_test); x_D_test = l5 + l4 * cos(phi4_test); y_D_test = l4 * sin(phi4_test); BD_dist_test = sqrt((x_D_test - x_B_test)^2 + (y_D_test - y_B_test)^2); if BD_dist_test <= (l2 + l3) && BD_dist_test >= abs(l2 - l3) cos_phi2_BD_test = (l2^2 + BD_dist_test^2 - l3^2) / (2 * l2 * BD_dist_test); if abs(cos_phi2_BD_test) <= 1 alpha_BD_test = atan2(y_D_test - y_B_test, x_D_test - x_B_test); angle_offset_test = acos(cos_phi2_BD_test); phi2_test = alpha_BD_test + angle_offset_test; x_C_test = x_B_test + l2 * cos(phi2_test); y_C_test = y_B_test + l2 * sin(phi2_test); leg_length_test = sqrt(x_C_test^2 + y_C_test^2); fprintf(' 结果: 腿长=%.3f m, 足端位置=(%.3f, %.3f)\n', leg_length_test, x_C_test, y_C_test); else fprintf(' 结果: 余弦值超出范围\n'); end else fprintf(' 结果: 无法形成闭合机构\n'); end end fprintf('\n计算完成!\n');