본문 바로가기
프로젝트

MATLAB 3링크 평면 로봇 제어 시스템 프로젝트(3학년 1학)

by hidden picture 2025. 7. 7.

프로젝트 개요

프로젝트 정보
프로젝트명 3-Link Planar Manipulator Control System
개발 기간 2022년 6월 (약 2주)
개발 환경 개발 OS : Windows 10
사용 도구 언어 : MATLAB R2019b
시뮬레이션 : Simulink
제어 : PID Controller
사용 기술 Path Planning, Inverse Kinematics, Manipulator Dynamics, Forward, Kinematics, PID Controller, Lagrangian Mechanics

 

3-Link planar manipulator

1. 프로젝트 배경

1.1 과제 분석 및 시스템 구조 이해

이 프로젝트는 로봇공학개론 수업에서 Final Term Project #2번이다. 3링크 평면 매니퓰레이터에 대한 완전한 제어 시스템을 구현하는 것이 목표.

 

3링크 평면 매니퓰레이터는 6축 로봇보다 단순하지만, 기구한, 동역학, 제어 이론까지 포함할 수 있어 학습 가치가 높은 시스템이다. 이 시스템은 3개의 회전 관절이 평면상에서 움직이며, 각 링크의 길이는 l1=2m, l2=1m, l3=1m로 설정되어 있다.

이러한 구조의 특징은 2차원 평면에서의 위치 제어에 특화되어 있다는 것이고, 3개의 관절로 2차원 좌표(x, y)와 엔드이펙터의 방향을 모두 제어할 수 있어, 중복 자유도(Redundant DOF)를 가지는 시스템이다. 즉, 같은 위치에 도달하기 위한 관절 조합이 여러 개 존재하기 때문에 하나의 목표 좌표를 다양한 방식으로 도달할 수 있다.

이로 인해 제어 이슈(최적 경로 선택, 특이점 처리 등)가 생기고, 이는 실제 산업용 로봇에서도 중요한 문제로 다뤄진다.

1.2 프로젝트 동기 및 학습 목표

이전 프로젝트인 6축 로봇 시뮬레이터에서는 주로 DH 파라미터 기반의 기구학 구현에 집중했었다. 전 프로젝트에서는 '로봇이 어떻게 움직이는가'에 초점을 맞췄다면, 이면에는 그 다음 단계인 '로봇이 어떻게 힘을 받고, 어떻게 제어되는가'를 중심으로 프로젝트를 진행한다.

이번 목표는 동역학(Dynamics)과 제어(Control)를 포함한 전체 시스템을 구현 하는 것이다.

수업에서 배운 라그랑지안 역학(Lagrangian Mechanics), PID 제어, 그리고 Simulink 기반 동적 시뮬레이션이 실제로 어떻게 통합되어 동작하는지에 직접 확인하고 싶었다. 또한 Path Planning부터 실제 로봇의 움직임까지의 전체 제어 루프를 구현해보면서, 이론에서 배운 각 요소들이 어떻게 연결되는지 이해하며, 교수님이 수업에서 Simulink의 기본 사용법과 동역학 모델링 방법을 가르쳐주셨는데, 이를 바탕으로 더 복잡하고 실용적인 시스템을 만들어보는 것이 목표로 삼았다.

 


2. 프로젝트 목표 및 설계

2.1 통합 제어 시스템 구현

핵심 목표 :

  1. Path Planning: 원하는 궤적 생성 (직선, 원운동)
  2. Inverse Kinematics: 목표 위치를 관절 각도로 변환
  3. PID Control: 관절별 정밀 제어
  4. Dynamic Simulation: 실제 로봇의 물리적 특성 반영

설계 방식 :

  • Simulink 기반 시스템 통합: 각 모듈을 블록으로 연결
  • Function 기반 모듈화: 재사용 가능한 MATLAB 함수들
  • 실시간 시각화: 로봇 움직임의 실시간 애니메이션

2.2 제어 이론 실습

핵심 목표 :

  1. 동역학 모델링: 라그랑지안 방법을 통한 운동방정식 도출
  2. 제어기 설계: PID 파라미터 조정 및 성능 분석
  3. 시스템 통합: 계획-제어-실행의 전체 루프 구현

설계 방식 :

  • 라그랑지안 역학: 운동에너지와 위치에너지 기반 모델링
  • 상태공간 모델: 2계 미분방정식을 1계 시스템으로 변환
  • 피드백 제어: 오차 기반 실시간 보정

3. 시스템 설계

3.1 전체 시스템 아키텍처

 

┌─────────────────────────────────────────┐
│            Path Planning                │
│        xd(t), yd(t) 생성                │
├─────────────────────────────────────────┤
│         Inverse Kinematics              │
│    θd1(t), θd2(t), θd3(t) 계산           │
├─────────────────────────────────────────┤
│            PID Controller               │
│         τ1, τ2, τ3 생성                 │
├─────────────────────────────────────────┤
│        Manipulator Dynamics             │
│     θ̈1, θ̈2, θ̈3 계산 (Simulink)          │
├─────────────────────────────────────────┤
│         Forward Kinematics              │
│        x(t), y(t) 계산 및 시각화          │
└─────────────────────────────────────────┘

3.2 데이터 흐름

  1. 경로 계획 → 목표 위치 (xd, yd)
  2. 역운동학 → 목표 관절각도 (세타d1, 세타d2, 세타d3)
  3. PID 제어 → 관절 토크 (타우1, 타우2, 타우3)
  4. 동역학 → 관절 가속도 (세타1, 세타2, 세타3)
  5. 적분 → 관절 각도 (세타1, 세타2, 세타3)
  6. 순운동학 → 실제 위치 (x, y) 및 시각화

4. 소프트웨어 설계

4.1 Path Planning

1) 경로 함수

function out = path_planning(input)
t = input(1); K = input(2);

if (K==1)      % X축 직선 운동
    xt = ((1-0.15)/10)*t + 0.15;    % 0.15에서 1까지 선형 이동
    yt = 1;                         % Y 고정
elseif (K==2)  % Y축 직선 운동  
    xt = 1;                         % X 고정
    yt = ((1-0.5)/10)*t + 0.5;      % 0.5에서 1까지 선형 이동
elseif (K==3)  % 원운동
    th = 2*pi*t/10;                 % 10초에 한 바퀴
    xt = 0.8 + 0.5*cos(th);         % 중심 (0.8, 0.8), 반지름 0.5
    yt = 0.8 + 0.5*sin(th);
end

out(1) = xt; out(2) = yt;
end

2) 경로별 특성

  • 직선 운동 : 10초 동안 등속 직선 이동
  • 원 운동 : 10초에 한 바퀴, 부드러운 원형 궤적
  • 매개변수화 : 시간 t에 따른 연속 함수로 표현

3) 풀이 접근법

  1. 시각점과 끝점이 시간 함수로 연결
  2. 매개변수 K로 경로 타입 선택
  3. 실시간 좌표 생성으로 연속 제어 지원

4.2 Inverse Kinematics

1) 역운동학 알고리즘 - 삼각함수의 위치 관계를 이용해서 로봇 관절 각도를 계산

function out = inverse_kinematics(input)
Px = input(1); Py = input(2);
thi = -pi/2;  % 엔드이펙터 방향 고정
l1 = 2; l2 = 1; l3 = 1;

% 3번째 링크 보상
px = Px - l3*cos(thi);
py = Py - l3*sin(thi);

% 2링크 시스템으로 축소하여 해석적 해 계산
r = atan2(py, px);
th1 = r + acos((px^2 + py^2 + l1^2 - l2^2)/(2*l1*sqrt(px^2 + py^2)));
th2 = -th1 + atan2((py - l1*sin(th1)), (px - l1*cos(th1)));
th3 = -pi - thi - th1 - th2;  % 방향 제약 조건

out(1) = th1; out(2) = th2; out(3) = th3;
end

2) 핵심 포인트

  • 수치해석 대비 정확하고 빠른 계산
  • 엔드이펙터 방향을 -90도로 고정하여 문제 단순화

3) 풀이 접근법

  1. 엔드이펜터 방향 고정으로 3DOF → 2DOF 변환
  2. 마지막 링크 제거하여 2링크 문제로 축소
  3. cos법칙으로 관절 각도 계산
  4. 기하학적 관계식으로 나머지 각도 도출

4.3 Manipulator Dynamics

1) 동역학 방정식 함수 - 라그랑지안 역학 기반 동역학 모델링

function out = three_link_dynamics(input)
% 입력: 관절각도, 각속도, 토크
th1 = input(1); th2 = input(2); th3 = input(3);
dth1 = input(4); dth2 = input(5); dth3 = input(6);
T1 = input(7); T2 = input(8); T3 = input(9);

% 물리적 파라미터
l1=2; l2=1; l3=1; m1=3; m2=2; m3=2; g=9.8;

% 관성 행렬 M(q) 계산
M11 = (m1+m2+m3)*l1^2 + (m2+m3)*l2^2 + m3*l3^2 + 
      2*(m2+m3)*l1*l2*cos(th2) + 2*m3*l2*l3*cos(th3) + 
      2*m3*l3*l1*cos(th2+th3);
% ... (M12, M13, M21, M22, M23, M31, M32, M33 계산)

% 원심력/코리올리 항 V(q,q̇) 계산  
V11 = -(m2+m3)*l1*l2*(2*dth1*dth2+dth2^2)*sin(th2) - 
      m3*l2*l3*(2*dth1*dth3+2*dth2*dth3+dth3^2)*sin(th3) - 
      m3*l3*l1*(2*dth1+dth2+dth3)*(dth2+dth3)*sin(th2+th3);
% ... (V21, V31 계산)

% 중력 항 G(q) 계산
G11 = (m1+m2+m3)*g*l1*cos(th1) + (m2+m3)*g*l2*cos(th1+th2) + 
      m3*g*l3*cos(th1+th2+th3);
% ... (G21, G31 계산)

% 동역학 방정식: M(q)q̈ + V(q,q̇) + G(q) = τ
% 해: q̈ = M^(-1)[τ - V(q,q̇) - G(q)]
M = [M11 M12 M13; M21 M22 M23; M31 M32 M33];
T = [T1; T2; T3];
V = [V11; V21; V31];
G = [G11; G21; G31];

out = inv(M)*(-V - G + T);  % 관절 가속도 출력
end

2) 물리적 의미

  • M(q) : 관성 행렬 (질량과 관성모멘트의 효과)
  • V(q, q̇) : 원심력과 코리올리 힘
  • G(q) : 중력의 영향
  • τ: 관절 토크 (제어 입력)

3) 핵심 포인트

 

  • 라그랑지안 역학 : 에너지 기반 동역학 모델링
  • 비선형 시스템 : 관절 결합과 중력의 복잡한 상호작용
  • 실시간 계산 : Simulink에서 실시간 동역학 해석

4) 풀이 접근법

 

  • 라그랑지안 정의: L = T - V (운동에너지 - 위치에너지)
  • 오일러-라그랑지 방정식: d/dt(∂L/∂q̇) - ∂L/∂q = τ
  • 행렬 형태 변환: M(q)q̈ + V(q,q̇) + G(q) = τ
  • Simulink 통합: 실시간 수치 적분으로 해 계산

 

 

4.4 PID Controller

1) PID 제어기 설계

% Simulink에서 구현된 PID 제어기
% 각 관절별 독립적인 PID 제어

% PID 파라미터 (조정 결과)
Kp = 1000;  % 비례 게인
Ki = 100;   % 적분 게인  
Kd = 800;   % 미분 게인

% 제어 법칙
error = θd - θ;              % 오차 계산
τ = Kp*error + Ki*∫error*dt + Kd*d(error)/dt;

2) 파라미터 조정

 

  • Kp (비례) : 응답 속도 조절, 너무 크면 진동 발생
  • Ki (적분) : 정상상태 오차 제거, 너무 크면 불안정
  • Kd (미분) : 오버슈트 억제, 노이즈에 민감

3) 핵심 포인트

  • 3개 독립 제어기 : 각 관절별 개별 PID 적용
  • 파라미터 조정 : 시행착오를 통한 최적 파라미터 발견
  • 실시간 제어 : 연속적인 피드백 기반 제어

4) 풀이 접근법

  1. 각 관절의 동특성 분석
  2. PID 파라미터 초기값 설정
  3. 시뮬레이션을 통한 성능 확인
  4. 파라미터 조정 및 최적화

4.5 Forward Kinematics

1) 순운동학 계산

function out = forward_kinematics(input)
l1=2; l2=1; l3=1;
th1 = input(1); th2 = input(2); th3 = input(3);

% 각 관절 위치 계산
px1 = l1*cos(th1);
py1 = l1*sin(th1);
px2 = l1*cos(th1) + l2*cos(th1+th2);
py2 = l1*sin(th1) + l2*sin(th1+th2);
px3 = l1*cos(th1) + l2*cos(th1+th2) + l3*cos(th1+th2+th3);
py3 = l1*sin(th1) + l2*sin(th1+th2) + l3*sin(th1+th2+th3);

out = [px1 px2 px3 py1 py2 py3];
end

 

2) 실시간 시각화

function threelink_Termproject_plot(X1, X2, X3, Y1, Y2, Y3, K)
% 목표 경로 표시
if (K==1)      % 직선 경로
    plot([0.15, 1],[1, 1]); hold on
elseif (K==2)  % 직선 경로  
    plot([1,1],[0.5, 1]); hold on
elseif (K==3)  % 원형 경로
    center=[0.8,0.8]; r=0.5;
    theta = linspace(0,2*pi,100);
    px = r*cos(theta)+center(1);
    py = r*sin(theta)+center(2);
    plot(px,py); hold on
end

% 로봇 팔 그리기
plot([0, X1],[0, Y1], 'r', 'Linewidth', 2);      % Link 1
plot([X1, X2],[Y1, Y2], 'y', 'Linewidth', 2);    % Link 2  
plot([X2, X3],[Y2, Y3], 'b', 'Linewidth', 2);    % Link 3
plot([0, X1, X2, X3], [0, Y1, Y2, Y3], 'ok', 'Linewidth', 2);
end

3) 핵심 포인트

  • 연쇄 좌표 변환 : 각 링크의 누적 변환
  • 실시간 애니메이션 : 매 시간 스텝마다 그래픽 업데이트
  • 목표 경로 표시 : 계획된 경로와 실제 경로 비교

4) 풀이 접근법

  1. 각 관절의 절대 좌표 계산
  2. 링크별 연결선 그리기
  3. 목표 경로와 실제 경로 동시 표시
  4. 실시간 프레임 업데이트

5. 핵심 기술 구현

5.1 Simulink 시스템 통합

% 메인 실행 파일
clear all; clc
K = 3;  % 경로 선택 (1:직선X, 2:직선Y, 3:원)
a = 1000; b = 100; c = 800;  % PID 파라미터

simOut = sim('Termproject2');  % Simulink 모델 실행
Coordinates = simOut.ScopeData1.signals.values;

% 실시간 애니메이션
for i = 1:length(Coordinates)
    X1 = Coordinates(i,1); Y1 = Coordinates(i,4);
    X2 = Coordinates(i,2); Y2 = Coordinates(i,5);
    X3 = Coordinates(i,3); Y3 = Coordinates(i,6);
    
    threelink_Termproject_plot(X1, X2, X3, Y1, Y2, Y3, K);
    getframe(gcf);
end

5.2 동역학 모델의 복잡성

주요 도전과제:

  1. 비선형성: 삼각함수가 포함된 복잡한 수식
  2. 결합성: 모든 관절이 서로 영향을 미침
  3. 실시간성: 제어 주기 내에서 계산 완료 필요

5.3 제어 성능 최적화

PID 튜닝 과정 :

  • 초기값 : Kp=100, Ki=10, Kd=50
  • 최종값 : Kp=1000, Ki=100, Kd=800
  • 조정 기준 : 오버슈트 최소화, 정착시간 단축

6. 결론

6.1 제어 성능 분석

PID 제어 파라미터 최종 조정 결과 : 

 

  • Kp = 1000, Ki = 100, Kd = 800
  • 경로 추종 정확도: 평균 오차 ±2mm 수준
  • 안정화 시간: 목표점 도달 후 약 0.5초 내 정착

이 결과를 분석해보면 구현된 시스템은 3가지 경로(X축 직선, Y축 직선, 원운동) 모두에서 비교적 안정적인 추종 성능을 보였다. 특히 원운동의 경우 연속적인 방향 변경에도 불구하고 부드러운 궤적을 유지했는데, 이는 동역학 모델과 PID 제어의 효과적인 결합 덕분이었다.

하지만 실제 산업에서 사용하는 로봇 시스템은 훨씬 더 높은 정확도와 안정성을 요구합니다. 이 프로젝트에서 사용한 기본적인 PID 제어는 교육 목적으로는 적합하지만, 실제 로봇 제어에서는 급격한 방향 전환 시 오버슈트 발생, 관절 간 결합으로 인한 상호 간섭, 외란에 대한 강건성 부족 등 한계가 명확한 걸 알 수 있었다.

 

6.2 학습 가치

이 프로젝트는 산업용 로봇을 목표로 만든 게 아니라 로봇 제어의 전체 파이프라인을 이해하고 경험해보는 재미있는 경험이었다. Path Planning부터 Dynamic Control까지의 전 과정을 직접 구현하면서, 각 단계가 어떻게 연결되는지 깊이 이해할 수 있었고, 특히 라그랑지안 역학이 실제 로봇 제어에서 어떻게 활용되는지를 확인한 점이 가장 인상 깊었다. 비록 제어 성능 면에서는 한계가 명확하지만, '이론이 실제로 어떻게 작동하는가?'라는 근본적인 질문에 대한 답을 찾을 수 있었고, 교과서의 추상적인 수식들이 실제 로봇의 움직임으로 나타나는 과정을 통해 제어 이론의 실용적 가치를 깨달을 수 있었습니다. 향후 실제 하드웨어 부분에서 기획한다면 이번 프로젝트에서 발견한 오차 문제들 해결하는 방향서으로 접근해봐야겠다는 생각이 들었다.