제7부 실전: ROS2 Humble 프로젝트
7.8 궤적·모션 프로파일 생성
보강 장 (v1 이후 추가) · 논리적 위치: 제7부 실전, 7.3 경로추종과 짝. 제어기는 기준을 따라간다 — 그런데 그 기준(궤적)은 어디서 오나? 계단 설정값은 무한 가속을 요구한다. 부드러운 모션 프로파일(사다리꼴·S-curve·다항식)이 속도·가속 제약을 지키며 진동 없이 목표로 이끈다. 제어(따라가기)와 계획(어디로·어떻게)의 경계.
✅ 검증됨: 사다리꼴 속도 프로파일과 5차 다항식 궤적을
ros:humble컨테이너에서 실행해 검증(verify/ce42_trajectory.py, 7/7 PASS) — 제약 준수·경계조건 만족.
이 장을 마치면 점대점 모션을 사다리꼴·S-curve로 생성하고, 다항식으로 경유점을 부드럽게 잇고, 생성한 궤적이 제어기(7.2·7.3·7.6)의 기준이 됨을 이해해야 한다.
7.8.1 왜 궤적 생성 — 계단은 급격하다
제어기에 "위치 5 m로 가라"를 계단으로 주면, 오차가 순간 5가 되어 제어기가 최대 출력을 낸다 → 포화·오버슈트·진동·기계 충격. 실제 로봇·CNC·엘리베이터는 그렇게 안 움직인다.
모션 프로파일은 시작점에서 목표점까지 부드러운 시간 궤적 $r(t)$를 만들어:
- 속도·가속(·저크) 제약을 존중한다(액추에이터·기계 한계).
- 진동·마모를 줄인다(급격한 변화 회피).
- 제어기에 따라갈 만한 기준을 준다 — 제어기 부담을 덜고 추종 정밀도를 높인다.
생성된 $r(t)$가 7.2(위치)·7.3(경로)·7.6(MPC 기준)의 입력이 된다. "궤적 생성 → 추종 제어"의 분업.
7.8.2 사다리꼴 속도 프로파일 — 점대점의 기본
가장 흔한 점대점(point-to-point) 모션. 속도가 사다리꼴: 가속(일정 $a$) → 순항(일정 $v$) → 감속(일정 −a).
거리 $D$, 속도한계 v_max, 가속한계 a_max로 계산:
t_acc = v_max/a_max, d_acc = v_max²/(2·a_max) (가속 구간 거리)
if 2·d_acc ≤ D: 사다리꼴(순항 있음), 순항거리 = D − 2·d_acc
else: 삼각형(v_max 못 미침), 최고속도 = √(a_max·D)
실제 생성기는 이 식으로 구간 길이를 구한 뒤, 각 시각의 가속을 구간별로 정하고 적분해 속도·위치를 얻는다(verify/ce42_trajectory.py에서 발췌):
t_acc = v_max/a_max
d_acc = 0.5*a_max*t_acc**2
if 2*d_acc <= D: # 사다리꼴(순항 있음)
t_cruise = (D-2*d_acc)/v_max
T = 2*t_acc + t_cruise
else: # 삼각형(v_max 미달)
t_acc = np.sqrt(D/a_max); t_cruise = 0.0
T = 2*t_acc
x = v = 0.0
for k in range(int(T/dt)+1):
t = k*dt
if t < t_acc: a = a_max
elif t < t_acc + t_cruise: a = 0.0
else: a = -a_max
v += a*dt; x += v*dt # 오일러 적분 → x(t), v(t)가 제어기 기준
검증 결과 (D=5, v_max=1.5, a_max=2.0):
목표 도달: x = 5.001 ≈ D
속도 제약: max v = 1.500 ≤ v_max ✓
가속 제약: max a = 2.000 ≤ a_max ✓
제약을 정확히 지키며 목표에 도달한다. 이 $x(t), v(t)$가 위치·속도 제어기(7.2)의 기준이 된다.
7.8.3 S-curve — 저크를 제한해 더 부드럽게
사다리꼴은 가속이 계단으로 바뀌어(0→a_max 순간) 저크(jerk=가속의 변화율)가 무한대다 → 진동·충격. S-curve는 저크 한계 j_max를 둬 가속도가 부드럽게(경사로 모양으로) 증감하게 한다.
7구간: 가속을 0→a_max→0→(등속)→0→−a_max→0으로 만드는 저크 부호 순서다.
- 1구간 — 저크 $+j_{\max}$ 가속 $0 \to a_{\max}$
- 2구간 — 저크 $0$ 가속 $a_{\max}$ 유지 (등가속)
- 3구간 — 저크 $-j_{\max}$ 가속 $a_{\max} \to 0$ (여기서 속도가 $v_{\max}$ 도달)
- 4구간 — 저크 $0$ 등속 $v_{\max}$ (사다리꼴의 순항과 동일)
- 5구간 — 저크 $-j_{\max}$ 가속 $0 \to -a_{\max}$
- 6구간 — 저크 $0$ 가속 $-a_{\max}$ 유지 (등감속)
- 7구간 — 저크 $+j_{\max}$ 가속 $-a_{\max} \to 0$ (여기서 속도가 0 도달)
가속-저크 램프 시간: 저크 j_max로 가속을 0→a_max까지 높이는 데 걸리는 시간은
- $t_j = a_{\max}/j_{\max}$ (1·3·5·7구간 각각의 길이)
- $t_a = v_{\max}/a_{\max} - t_j$ (2구간 = 등가속 유지 시간, $\ge 0$이어야 함)
t_a<0이면 저크만으로 채 a_max에 못 이르고 꺾어야 하는 "저크제한 삼각형" 케이스다(2구간이 사라짐) — 사다리꼴이 삼각형으로 퇴화하는 것과 같은 이치. 여기서는 t_a≥0(a_max에 도달)인 일반적 경우만 다룬다.
가속 구간(1~3구간) 전체 시간과 이동 거리:
- $T_{\mathrm{acc}} = t_j + v_{\max}/a_{\max}$ (= 사다리꼴의 $t_{\mathrm{acc}}$보다 정확히 $t_j$만큼 길다)
- $d_{\mathrm{acc}} = a_{\max}\cdot(t_j^2 + 1.5\cdot t_a\cdot t_j + 0.5\cdot t_a^2)$ (가속 구간에서 이동한 거리)
예시 (7.8.2의 사다리꼴 예시에 j_max=20을 더해): D=5, v_max=1.5, a_max=2.0, j_max=20.
- $t_j = 2.0/20 = 0.100$
- $t_a = 1.5/2.0 - 0.100 = 0.650$
- $T_{\mathrm{acc}} = 0.100 + 0.75 = 0.850$ (사다리꼴 $t_{\mathrm{acc}}=0.75$보다 $+0.100=t_j$)
- $d_{\mathrm{acc}} = 2.0\cdot(0.01 + 1.5\cdot 0.65\cdot 0.1 + 0.5\cdot 0.65^2) = 0.6375$ (사다리꼴 $d_{\mathrm{acc}}=0.5625$보다 더 큼)
검증 결과 (7구간을 수치적분으로 재현, D=5까지 전체 프로파일):
목표 도달: x = 5.0001 ≈ D, 종료 속도 ≈ 0, 종료 가속 ≈ 0
속도 제약: max v = 1.500 ≤ v_max ✓ 가속 제약: max a = 2.000 ≤ a_max ✓
총 이동시간: T = 4.183 (사다리꼴 T=4.083보다 정확히 +0.100 = t_j 더 걸림)
일반적으로(양쪽 다 순항 구간이 있다면) S-curve 총 이동시간은 같은 조건의 사다리꼴보다 정확히 t_j만큼 더 걸린다 — "약간 더 느리게"의 비용을 정확히 숫자로 잰 것. 가속 구간이 t_j만큼 길어지는 대신 순항 구간이 그만큼 짧아지는데, 순항 속도가 더 낮은 가속 구간의 평균속도보다 빠르므로 상쇄가 완전하지 않아 총 시간이 늘어난다.
- 장점: 진동·마모·소음 감소, 정밀 기계·고속 모션에 필수.
- 대가: 같은 거리를 조금 더 느리게(위에서 정량화한
t_j만큼), 계산 복잡.
트레이드오프: 사다리꼴(빠름·단순) vs S-curve(부드러움·기계 보호, 정확히
t_j만큼 느림). 정밀·고속이면 S-curve, 일반이면 사다리꼴.
7.8.4 다항식 궤적 — 경계조건을 매끄럽게
경유점 사이를 위치·속도·가속 경계조건을 만족하며 잇는다.
- 3차(cubic): 시작·끝 위치·속도 지정(4조건). 속도 연속.
- 5차(quintic): 시작·끝 위치·속도·가속 지정(6조건). 가속까지 연속 → 더 부드럽다.
5차 검증 (위치 0→D, 속도·가속 0→0): 계수 $a_3=10D/T^3, a_4=-15D/T^4, a_5=6D/T^5$($a_0=a_1=a_2=0$, 시작 위치·속도·가속이 모두 0이므로).
a3, a4, a5 = 10*D/T**3, -15*D/T**4, 6*D/T**5
def q(t): return a3*t**3 + a4*t**4 + a5*t**5 # 위치
def qd(t): return 3*a3*t**2 + 4*a4*t**3 + 5*a5*t**4 # 속도
def qdd(t): return 6*a3*t + 12*a4*t**2 + 20*a5*t**3 # 가속도
시작 위치 0, 끝 위치 D=5.000 ✓
시작·끝 속도 0 ✓ 시작·끝 가속 0 ✓ (≈10⁻¹⁴)
모든 경계조건을 만족하는 매끄러운 궤적. 스플라인(여러 다항식 조각을 매끄럽게 연결)으로 다수 경유점을 잇는다 — 로봇팔 관절 궤적·드론 경로의 표준.
다관절 동시 도착(시간 동기화): 로봇팔은 관절이 여럿이고, 팔 끝단이 매끄러운 경로를 그리려면 모든 관절이 동시에 출발·정지해야 한다. 표준 절차는 관절마다 독립적으로 최소시간 프로파일(위 5차·사다리꼴 등)을 계산한 뒤, 그중 가장 오래 걸리는 관절의 시간을 공통 시간 T_sync로 설정하고, 나머지 관절의 시간 매개변수를 T_sync에 맞게 늘려($t \to t\cdot T_i/T_{\mathrm{sync}}$처럼 재척도) 다시 계수를 구하는 것이다. 예를 들어 관절1이 단독 최소시간 0.8초, 관절2가 1.3초 걸린다면 T_sync=1.3으로 모든 관절을 재척도한다 — 그러지 않으면 먼저 끝난 관절이 목표에서 기다리는 동안 팔이 의도치 않게 굽거나 끝단 경로가 계획과 어긋난다.
7.8.5 제어와의 연결 — 생성 → 추종
- 생성기가 부드러운 기준과 그 도함수(속도·가속)를 준다 → 제어기는 피드포워드(7.7.2)로 $\dot{r},\ddot{r}$을 미리 반영해 추종을 앞당긴다.
- 7.3의 경로(공간상 점들)에 시간을 입히면(속도 프로파일) 시간 궤적이 된다 — "경로(path) + 속도 프로파일 = 궤적(trajectory)".
- 7.6 MPC의 움직이는 기준
r_k도 이렇게 생성한다.
7.8.6 정직 — 계획과 제어의 경계
- 이것은 "계획"에 가깝다: 궤적 생성은 제어(피드백)가 아니라 기준 생성이다 — 제어기가 그 궤적을 따라갈 수 있다고 가정한다.
- 동역학 실현가능성: 생성한 궤적이 플랜트의 실제 동역학(토크·마찰 한계)을 넘으면 못 따라간다. 운동학적 제약(v·a)만으로는 부족할 수 있어, 동역학을 고려한 궤적 최적화(시간 최적·MPC, 7.6)가 필요할 때가 있다.
- 경유점·충돌: 다수 경유점·장애물 회피는 경로 계획(이 책 범위 밖, Nav2·MoveIt 등) 영역. 이 장은 주어진 시작·끝(경유점) 사이의 시간 프로파일에 집중.
7.8.7 정리 — 그리고
- 계단 기준은 급격하다 — 모션 프로파일이 제약을 지키며 부드러운 $r(t)$를 만든다(7.8.1).
- 사다리꼴(가속-순항-감속, 제약 정확 준수: 검증)·S-curve(저크 제한, 더 부드럽지만 느림)·다항식/스플라인(경계조건 매끄럽게, 5차는 가속까지 연속: 검증)이 도구(7.8.2~7.8.4).
- 생성된 궤적·도함수가 제어기의 기준·피드포워드가 된다 — "경로 + 속도 프로파일 = 궤적", 생성→추종 분업(7.8.5).
- 이것은 계획 쪽 — 동역학 실현가능성·경로 계획은 별도(7.8.6).
7.8.8 연습·생각해 볼 것
- 계단의 문제. 위치 제어기에 목표를 계단으로 주면 무엇이 문제인가(액추에이터·기계 관점)? 모션 프로파일이 어떻게 해결하나? (7.8.1)
- 사다리꼴 계산.
D=2, v_max=1.0, a_max=4.0일 때 사다리꼴인가 삼각형인가? (2·d_acc와 $D$ 비교) 총 이동 시간은? (7.8.2) - 사다리꼴 vs S-curve. 정밀 반도체 스테이지와 일반 컨베이어에 각각 어느 프로파일이 어울리나? 저크 제한이 왜 진동을 줄이나? (7.8.3)
- 3차 vs 5차. 왜 5차가 3차보다 부드러운가(어느 도함수까지 연속)? 로봇팔 관절에 어느 쪽을 쓰겠나? (7.8.4)
- 생성→추종. 생성한
r(t),ṙ(t)를 제어기에 줄 때,ṙ를 피드포워드(7.7)로 쓰면 추종이 왜 개선되나? (7.8.5) - (손으로)
verify/ce42_trajectory.py로 사다리꼴·5차를 재현하고,v_max·a_max·T를 바꿔 프로파일이 어떻게 변하는지(사다리꼴↔삼각형 전환점 등) 관찰하라. 가능하면 생성 궤적을 7.2 위치 제어기의 기준으로 넣어 보라. (검증된 스크립트)
막히면 "계단은 급격, 프로파일이 제약 지키며 부드럽게, 경로+속도프로파일=궤적, 생성→추종 분업"으로 돌아가라.