양쪽 추를 단 로봇 관절 모형과 에너지 균형 눈금을 표현한 일러스트

로봇 동역학 시뮬레이션의 에너지 드리프트는 어떻게 읽을까


모터 토크와 관절 마찰을 모두 껐는데 운동에너지와 위치에너지의 합이 서서히 달라진다. 이때 로봇 동역학 시뮬레이션의 에너지 드리프트는 어떻게 읽을까. 변화율이 1%라는 숫자만으로는 정상도 오류도 확정할 수 없다. 먼저 에너지가 보존되어야 하는 모델인지 확인하고, 절대 변화와 시간 이력을 계산한 뒤, 같은 조건에서 시간 간격을 줄였을 때 오차가 수렴하는지 봐야 한다.

필요한 선수 지식은 에너지의 단위인 줄(J)과 사칙연산 정도다. 이 글에서는 순동역학(forward dynamics)을 힘·토크와 현재 상태로 다음 가속도를 구하는 계산, 수치 적분(numerical integration)을 연속 운동을 유한한 시간 간격으로 나누어 상태를 갱신하는 계산이라고 부른다. 2026년 9월 20일에 공식 자료를 대조하고 Python 3.12.3으로 설명용 산술 예제를 검산했지만, 물리 엔진이나 실물 로봇을 실행한 결과는 아니다.

에너지가 줄었다는 사실만으로 오류가 되지는 않는다

운동에너지(kinetic energy) K는 움직임 때문에 생기는 에너지이고, 위치에너지(potential energy) U는 중력이나 이상적인 스프링처럼 보존력과 관련해 배치에 저장된 에너지다. 둘을 더한 E=K+U가 총 기계에너지(total mechanical energy)다.

총에너지 보존을 검사로 쓰려면 조건부터 맞아야 한다. 모델이 시간에 따라 바뀌지 않고, 모터나 외력이 일을 하지 않으며, 마찰·댐핑 같은 비보존력이 없어야 한다. 중력은 그 위치에너지까지 U에 포함했다면 보존력으로 다룰 수 있다. 이 조건에서는 자세가 바뀌며 K와 U가 서로 오르내려도 합 E는 일정해야 한다. MIT Underactuated Robotics의 다물체 동역학은 운동에너지 T, 위치에너지 U, 라그랑지안 L=T-U와 일반화 힘의 관계를 이 틀로 설명한다(확인 2026-09-20).

반대로 댐핑이나 마찰, 비탄성 접촉, 제어 입력이 있다면 K+U가 줄거나 늘 수 있다. 이 경우 감소량을 곧바로 수치 오류라고 부르면 물리적으로 일어난 에너지 전달과 손실을 놓친다.

10 J 예제에서 절대 변화와 상대 변화를 나눠 본다

시뮬레이터가 같은 단위와 같은 위치에너지 기준으로 K와 U를 출력했다고 가정하자. 초기값은 K₀=4.0 J, U₀=6.0 J이므로 E₀=10.0 J다.

설명용 조건 나중 K 나중 U 나중 E E₀ 대비 변화
큰 시간 간격 입력 6.5 J 3.4 J 9.9 J -0.1 J, -1.0%
작은 시간 간격 입력 6.5 J 3.48 J 9.98 J -0.02 J, -0.2%
마찰 포함 경계 사례 5.0 J 4.5 J 9.5 J -0.5 J, -5.0%

계산식은 세 줄이면 충분하다.

E(t)  = K(t) + U(t)                         [J]
ΔE(t) = E(t) - E(0)                         [J]
δE(t) = ΔE(t) / |E(0)|,  100δE(t)           [%]

첫 번째와 두 번째 행의 산술만 보면 작은 시간 간격을 뜻하는 입력에서 드리프트 크기가 줄었다. 하지만 이 표에는 실제 시간 간격 h, 적분기, 로봇 방정식, 시뮬레이션 기간이 없다. 따라서 “작은 시간 간격이 실제 로봇 궤적을 정확하게 만들었다”거나 오차 차수가 얼마라고 결론 내릴 수 없다. 세 번째 행도 마찰이 기계에너지를 소산할 수 있으므로 -5% 자체가 적분 오류의 증거는 아니다.

이 계산은 공개된 설명용 example.py와 검증 기록 verification.json에 연결된다. 2026년 9월 20일 Linux 환경의 Python 3.12.3과 표준 라이브러리로 고정 커밋의 예제를 격리 실행해 다섯 assertion, JSON 출력, 종료 코드 0을 확인했다. 검증한 것은 주어진 K와 U의 합과 나눗셈이며 로봇 동역학 적분은 아니다.

퍼센트는 위치에너지의 영점에 따라 달라질 수 있다

상대 변화율은 편리하지만 항상 공정한 비교값은 아니다. 중력 위치에너지에 상수 C를 더해 U'=U+C로 바꿔도 힘과 로봇의 운동은 바뀌지 않는다. 이때 ΔE는 그대로지만 분모가 |E(0)+C|가 되므로 퍼센트는 달라진다.

그래서 서로 다른 시뮬레이터나 모델의 “에너지 오차 %”를 비교하려면 위치에너지 영점이 같아야 한다. E(0)가 0에 가까우면 상대 변화율이 지나치게 커지거나 정의되지 않는다. 그때는 절대 변화 ΔE[J]를 먼저 보고, 실행 전에 정한 특성 에너지 E_scale로 ΔE/E_scale을 계산한다. 결과를 본 뒤 유리한 척도로 바꾸지 말고 E_scale의 정의와 단위를 함께 남겨야 한다.

종점 퍼센트 하나도 전체 거동을 숨긴다. 적어도 다음 네 값을 같은 로그에서 읽는다.

  • 시간에 따른 E(t)와 ΔE(t)
  • 전체 구간의 최대 편차 max |ΔE(t)|
  • 마지막 시점의 편차 ΔE(T)
  • 한 방향 누적인지 제한된 진동인지 보여주는 시간 방향 추세

최대 편차가 큰데 종점만 우연히 0에 가까울 수 있다. 반대로 오차가 작은 범위에서 위아래로 흔들릴 뿐 장기 누적은 없을 수도 있다. 그래프가 필요한 이유는 예쁘게 보여주기 위해서가 아니라 이 둘을 구분하기 위해서다.

동일한 초기 에너지에서 제한된 진동 오차와 한 방향 누적 드리프트를 비교한 정성적 선 그래프

시간 간격을 줄여 같은 끝점에서 수렴하는지 확인한다

수치 적분은 연속 운동을 띄엄띄엄 계산하므로 유한한 시간 간격 h에서 근사 오차가 생긴다. Modern Robotics의 순동역학 강의는 모터 토크와 관절 마찰이 없는 로봇에서 K+U가 거의 일정한지를 시뮬레이터 검사로 쓰고, 적분에 따른 드리프트는 더 작은 시간 간격이나 더 정교한 적분 절차로 줄일 수 있다고 설명한다(확인 2026-09-20). 여기서 “거의”를 모든 모델에 통하는 1% 같은 문턱으로 바꿔 읽어서는 안 된다.

시간 간격과 전진 오일러법의 관계가 낯설다면 로봇 시뮬레이션에서 시간 간격을 줄일 때 위치 계산이 달라지는 이유를 먼저 계산해 볼 수 있다.

비교할 때는 모델, 초기 관절 위치 q, 초기 관절 속도 q̇, 적분기와 종료시간을 고정한다. 시간 간격만 h, h/2, 가능하면 h/4로 바꾸고 각 실행의 최대 편차, 종점 편차와 관심 궤적을 함께 비교한다. 두 해상도만으로는 우연과 수렴 경향을 가르기 어려워 세 해상도가 더 낫다.

오차가 해상도를 높일수록 줄고 관절각·주기·최대 높이처럼 실제로 필요한 출력도 한 값으로 모이면 시간 이산화 오차라는 설명이 강해진다. 반대로 h를 줄여도 개선되지 않으면 다음 항목을 먼저 점검한다.

  1. 운동·위치에너지 식에 빠진 항이 없는가
  2. 중력 부호, 좌표계와 단위가 일치하는가
  3. 상태와 에너지를 같은 시점에 기록했는가
  4. 접촉·제약 솔버나 비보존 항이 숨어 있지 않은가
  5. NaN, 발산 또는 제약 위반이 발생하지 않았는가

적응형 솔버에서는 출력 저장 간격과 내부 적분 스텝을 혼동하지 않아야 한다. SciPy 1.18.0 문서의 solve_ivp는 상태의 로컬 오차를 atol + rtol*abs(y)로 제어한다고 설명한다(확인 2026-09-20). 이 기준은 총에너지 오차 허용치가 아니므로 에너지 잔차는 별도로 계산해야 한다.

확인 문제: -0.2%면 통과라고 말할 수 있을까

다음 조건을 생각해 보자.

큰 시간 간격 입력에서 종점 드리프트가 -1.0%, 작은 시간 간격 입력에서 -0.2%였다. 작은 시간 간격 실행은 검증을 통과했다고 판정해도 되는가?

답은 아직 판정할 수 없다는 것이다. 두 숫자는 작은 시간 간격을 뜻하는 설명용 입력의 산술 편차가 더 작다는 사실만 보여준다. 실제 h와 h/4 비교, 전체 시간 이력, 궤적 오차, 에너지 항의 완전성이 없고 애플리케이션이 허용할 오차 예산도 정해지지 않았다.

다른 확인 문제도 있다. 위치에너지 기준에 +100 J를 더하면 ΔE=-0.1 J는 그대로지만 상대 퍼센트의 크기는 작아진다. 로봇의 운동이 좋아진 것이 아니라 분모가 바뀐 것이다. 이 때문에 절대 변화와 고정된 정규화 기준을 함께 기록해야 한다.

구동·마찰·접촉이 있으면 에너지 장부로 바꾼다

모터와 외력이 일을 하거나 마찰이 에너지를 소산한다면 검사 질문은 “K+U가 일정한가”에서 “들어오고 나간 일까지 장부가 맞는가”로 바뀐다. 개념적인 잔차는 다음과 같다.

residual(t) = [E(t) - E(0)]
              - ∫(P_input + P_nonconservative) dt

파워의 부호 규약은 사용하는 API에 맞춰 고정한다. 이때 0에 가까워야 할 값은 E(t)-E(0)가 아니라 일과 소산을 반영한 잔차다. Drake의 LinearSpringDamper 문서는 비보존 파워를 적분한 일까지 반영한 에너지 장부를 설명한다(확인 2026-09-20).

API 이름에 Energy가 들어간다고 장부가 완전한 것도 아니다. 2026년 9월 20일 확인한 Drake MultibodyPlant 문서는 위치에너지와 비보존 파워 계산에 포함되지 않는 접촉·관절 한계·입력·마찰 관련 항이 있음을 명시한다. 먼저 도구가 어떤 항을 합산하는지 확인해야 한다.

적분기 이름만 보고 우열을 정해서도 안 된다. MuJoCo 수치 적분 문서는 자체 복잡한 진자 예에서 RK4와 implicit 계열이 서로 다른 에너지 거동을 보인다고 설명한다(확인 2026-09-20). 이는 해당 구현과 예제의 결과다. 강성, 접촉, 계산 비용과 장기 거동이 다른 모든 로봇에서 RK4가 언제나 최선이라는 뜻은 아니다.

에너지 검사는 내부 일관성을 보지만 현실 정확도를 보장하지 않는다

에너지가 거의 보존돼도 위상과 관절 궤적이 틀리거나 제약 위반이 생길 수 있다. 에너지 드리프트는 유용한 진단 신호지만 시뮬레이션 정확성의 충분조건은 아니다. 실제 판정에서는 에너지 예산과 함께 관절각, 주기, 접촉 시각 등 작업에 중요한 출력의 허용 오차를 먼저 정해야 한다. 확인한 1차 자료에는 모든 시뮬레이션에 적용할 보편적인 허용 퍼센트가 없었다.

이 검사는 수학 모델과 수치 구현 사이의 내부 일관성만 다룬다. 실제 로봇의 마찰, 백래시, 케이블 탄성, 모터·드라이브 손실, 센서 바이어스와 충돌 변형은 검증하지 않았다. 실물 검증은 낮은 에너지와 낮은 속도에서 시작하고, 관절·작업공간 및 토크·전류 제한을 설정해야 한다. 사람은 보호구역 밖에 두고 비상 정지와 안전 정지 수단을 준비하며, 이상 진동·제한 초과·통신 손실·예상 밖 접촉이 생기면 즉시 구동을 멈추는 조건을 사전에 정한다. 실제 설비에서는 지역 법규, 제조사 절차와 현장 위험성 평가가 우선한다. 예를 들어 Universal Robots의 UR20 SW10.9 비상 정지 설명은 비상 정지를 보완적 보호수단으로 구분하며, 이것만으로 부상을 예방하는 보호장치를 대신할 수 없다고 밝힌다(확인 2026-09-20). 이는 해당 제조사 문서의 설명이며, 다른 장비의 정지 절차나 현장 위험성 평가를 대신하지 않는다.

첫 비교는 자신의 로그에서 시작하면 된다. 같은 모델·초기조건·종료시간으로 K, U, h를 고정 형식으로 내보내고 h와 h/2, 가능하면 h/4의 전체 이력을 나란히 놓는다. 드리프트가 줄더라도 관심 궤적까지 수렴하기 전에는 “해결됐다”고 판정하지 않는 것이 이 검사의 마지막 경계다.

이 글에는 제휴·협찬이 없다.

비슷한 글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다