- 문제 정의
4개의 링크로 구성된 평면 메커니즘에서 각 링크의 회전각과 각속도를 수학적으로 도출하는 문제입니다. 링크 길이와 드라이브 링크의 각속도가 주어진 상태에서 나머지 링크의 운동학적 특성을 분석합니다.
- 수학적 도출
기하학적 관계식을 이용한 해석적 접근과 미분을 통한 수치적 접근 두 가지 방법을 비교합니다. 해석적 방법은 행렬 연산을 사용해 연립방정식을 푸는 방식이며, 수치적 방법은 기하학적 관계식의 미분을 통해 각속도를 계산합니다.
- MATLAB 구현
최신 버전 코드
기하학적 관계식의 미분을 직접 계산하여 각속도를 산출하는 방식입니다. 코드량은 적지만 계산 효율성이 낮습니다.
% *** 4연杆 메커니즘 운동학 계산 ***
% 1. 고정 파라미터
len1 = 100; % 단위:mm
len2 = 300;
len3 = 250;
len4 = 200;
ang_vel1 = 10.17; % rad/s
% 각도 변환 계수
rad_to_deg = pi/180;
deg_to_rad = 180/pi;
% 기호 변수 정의
syms beta gamma1
beta(gamma1) = sqrt(len4^2 + len1^2 - 2*len4*len1*cos(pi-gamma1));
syms thetaA thetaB
thetaA(gamma1) = acos((len3^2 + beta(gamma1)^2 - len2^2)/(2*len3*beta(gamma1)));
thetaB(gamma1) = asin((len1*sin(pi-gamma1))/beta(gamma1));
% 각속도 계산
ang_vel3(gamma1) = (diff(thetaA,gamma1) + diff(thetaB,gamma1)) * ang_vel1;
% 결과 저장 배열 초기화
idx = 1;
gamma_values = zeros(1,73);
theta3_values = zeros(1,73);
vel3_values = zeros(1,73);
% 계산 반복
for deg=0:5:360
gamma = deg * rad_to_deg;
gamma_values(idx) = deg;
theta3_values(idx) = thetaA(gamma) + thetaB(gamma);
vel3_values(idx) = ang_vel3(gamma);
theta3_values(idx) = theta3_values(idx) * deg_to_rad;
idx = idx + 1;
end
% 시각화
subplot(2,2,1);
plot(gamma_values, theta3_values, '-b');
title('링크3의 회전각 변화')
xlabel('\gamma_1 (\circ)')
ylabel('\gamma_3 (\circ)')
grid on;
subplot(2,2,2);
plot(gamma_values, vel3_values, '-r');
title('링크3의 각속도')
xlabel('입력각도')
ylabel('rad\cdots^{-1}')
grid on;
subplot(2,2,[3 4]);
[ax,h1,h2] = plotyy(gamma_values, theta3_values, gamma_values, vel3_values);
set(get(ax(1),'ylabel'),'string','각도값');
set(get(ax(2),'ylabel'),'string','속도값');
legend([h1,h2],'각도','속도');
set(ax,'Xlim',[0 360],'xtick',[0:10:360])
이전 버전 코드
선형 방정식 계산을 기반으로 한 고속 처리 방식입니다. 보다 많은 코드량을 필요로하지만 계산 속도가 빠릅니다.
% *** 4연杆 메커니즘 운동학 계산 ***
% 1. 고정 파라미터
len1 = 100; % mm
len2 = 300;
len3 = 250;
len4 = 200;
ang_vel1 = 10.17; % rad/s
% 단위 변환 계수
rad_to_deg = pi/180;
deg_to_rad = 180/pi;
% 기호 변수 정의
syms beta gamma1
beta(gamma1) = sqrt(len4^2 + len1^2 - 2*len4*len1*cos(pi-gamma1));
syms thetaA thetaB
thetaA(gamma1) = acos((len3^2 + beta(gamma1)^2 - len2^2)/(2*len3*beta(gamma1)));
thetaB(gamma1) = asin((len1*sin(pi-gamma1))/beta(gamma1));
% 결과 저장 배열 초기화
idx = 1;
gamma_values = zeros(1,74);
theta3_values = zeros(1,74);
theta2_values = zeros(1,74);
% 계산 반복
for deg=0:5:360
gamma = deg * rad_to_deg;
gamma_values(idx) = deg;
theta3_values(idx) = thetaA(gamma) + thetaB(gamma);
theta2_values(idx) = asin((len3*sin(theta3_values(idx)) - len1*sin(gamma))/len2);
theta2_values(idx) = theta2_values(idx) * deg_to_rad;
theta3_values(idx) = theta3_values(idx) * deg_to_rad;
idx = idx + 1;
end
plot(gamma_values, theta3_values, '-b');
title('\gamma_3 변화')
xlim([0 360])
xlabel('\gamma_1 (\circ)')
ylabel('각도 (\circ)')
ylim([-360 360])
grid on;
hold on;
plot(gamma_values, theta2_values, '-.r');