로봇 구조를 적는 파일을 보면 링크와 관절이 눈에 먼저 들어와요. 그런데 정작 어려운 칸은 그 안의 물성치예요. 링크와 관절을 적는 건 문법이라 반나절이면 익히는데, 그 링크가 몇 킬로그램이고 관성값이 얼마인지는 아는 사람만 채울 수 있거든요.
관성값은 쉽게 말해 이 물체를 어느 축으로 돌리려 할 때 얼마나 버티는가를 숫자로 적은 거예요. 질량이 회전에 대해 갖는 저항이고, 같은 질량이라도 무게가 축에서 멀리 퍼져 있을수록 커져요. 3×3 행렬인데 대칭이라 여섯 개 숫자로 적어요.
중립적으로 보이는 값이 가장 위험해요
감이 없을 때 손이 가는 값이 둘 있는데, 둘 다 사고를 내요.
전부 1을 넣는 경우예요. 얼핏 중립적인 기본값 같지만, 공식 문서 표현으로는 한 변 10센티미터 상자에 600킬로그램이 든 것과 같아요. 소형 팔의 링크에 이 값을 넣으면 시뮬레이터는 그 링크를 콘크리트 덩어리로 취급해요. 토크가 아무리 들어가도 안 움직이거나, 반대로 관절이 이상하게 늘어져요.
0이나 거의 0을 넣는 경우는 더 나빠요. 실시간 제어를 붙이면 경고 없이 모델이 붕괴하고, 모든 링크의 원점이 월드 원점에 겹쳐 버려요. 로봇이 화면에서 한 점으로 뭉개져 보이는 그 증상이에요.
감이 없을 때의 무난한 출발점은 0.001 이하예요. 한 변 10센티미터에 0.6킬로그램인 상자에 해당하는 크기죠. 정확하지는 않아도 적어도 물리적으로 말이 되는 범위예요.
에러가 원인을 안 가리켜요
이 증상들의 공통점이 중요해요. “관성값이 틀렸습니다”라고 뜨지 않아요. 로봇이 안 움직이거나 화면에서 뭉개지죠.
그래서 원인을 물성치로 의심할 수 있는 사람과 못 하는 사람의 디버깅 시간이 크게 갈려요. 안 움직이면 제어기 게인부터 보고, 뭉개지면 좌표 변환부터 보게 되거든요. 둘 다 정상인데 값 한 칸이 틀린 거예요.
같은 계열의 사고를 다른 데서도 봤어요. 좁은 통로를 로봇이 못 지나가는 문제를 쫓았는데, 범인은 장애물 여유 설정이 아니라 로봇 치수에서 자동 계산되는 반경이었어요. 치수를 실물보다 크게 적어 넣는 순간 그 로봇은 지나갈 수 있는 곳도 못 지나가는 소프트웨어가 돼요.
관성값과 치수는 다른 파라미터지만 구조가 같아요. 물성치가 틀리면 증상은 소프트웨어 버그의 얼굴을 하고 나타나요.
값은 손으로 적분하지 않아요
다행히 관성값은 계산해 주는 도구가 있어요. 주요 설계 도구 전부가 형상과 재질 밀도로부터 질량과 무게중심, 관성값을 뽑아 줘요. 메시만 있고 설계 파일이 없어도 근사해 주는 도구가 있고요.
변환 경로도 성숙해 있어요. 설계 도구에서 로봇 구조 파일로 바로 내보내는 기능이 붙어 있거나, 전용 변환 도구가 있어요. 버튼은 누구나 누를 수 있어요.
그래서 남는 일은 둘이에요.
첫째, 설계 파일 안에 재질과 밀도를 제대로 넣어야 관성값이 맞게 나와요. 밀도를 안 넣거나 기본값으로 두면 변환기는 그럴듯한 숫자를 뱉는데, 실물과 무관한 숫자예요. 값이 나왔다는 것과 값이 맞다는 것은 다른 얘기죠.
둘째, 충돌 형상과 시각 형상을 분리해야 해요. 구조 파일은 링크마다 이 둘을 따로 적어요. 시각용은 정밀한 메시를 써도 되지만, 충돌용은 단순한 도형으로 뭉개는 것이 정석이에요.
이유는 충돌 검사가 계획 단계마다 도는데 메시가 정밀할수록 그 검사가 느려지기 때문이에요. 정밀 메시를 단순한 껍질로 바꿔 계획 시간이 몇 초에서 1초 아래로 떨어진 보고가 있어요.
단순화한 껍질은 물체를 고무줄로 감싸 씌운 모양이라, 오목한 부분이 메워져 실제보다 약간 뚱뚱해져요. 안전 쪽으로 약간 크게, 대신 빠르게를 택하는 거예요. 어디까지 뭉개도 되는지는 형상을 읽을 줄 알아야 판단할 수 있고요.
시뮬을 실물처럼 굴게 맞추는 일
한 걸음 더 나가면 실물에서 측정한 응답으로 시뮬레이터의 물리 파라미터를 맞추는 작업이 있어요. 맞춰 넣는 대상은 관절 마찰, 모터 토크 곡선, 링크 관성 같은 것들이죠.
이게 중요한 이유는 시뮬에서 학습한 정책이 실물에서 안 되는 격차의 주원인이 바로 이 값들의 불일치이기 때문이에요. 최근 연구에서 실제로 맞춰 넣는 항목을 보면 회전자 관성, 점성 감쇠, 마찰, 관절 편차, 전역 지연이에요.
현장 조언 중에 하나가 특히 인상적이에요. 지연은 고정값이 아니라 분포로 주입해요. “평균 4밀리초, 표준편차 1밀리초” 같은 형태로요. 실물은 정확한 값 하나로 표현되지 않고 흩어진다는 감각인데, 이상적인 모델만 다뤄 본 눈에는 잘 안 잡히는 지점이에요.
단위를 바꿨더니 값이 0이 돼요
마지막으로 습관 하나예요.
시뮬레이터로 구조 파일을 들여올 때 작은 관성값이 0으로 들어가는 현상이 보고돼 있어요. 센티미터 단위로 작성했을 땐 정상인데 미터 단위로 바꾸면 값이 0이 되고, 물리 엔진이 관성이 0일 수 없다는 경고를 뱉어요. 표시상의 반올림일 뿐이라는 답변과 실제 데이터 문제라는 반박이 갈려 완전히 정리되지는 않았고요.
여기서 얻을 것은 결론이 아니라 습관이에요. 구조 파일을 시뮬레이터에 넣은 뒤 관성값이 그대로 들어갔는지 확인해요. 앞에서 본 대로 관성이 0이면 모델은 경고 없이 무너지는데, 그 경고 없는 붕괴가 단위 변환만으로도 일어날 수 있어요.
값을 넣는 것과 값이 들어간 것은 다르다는 얘기고, 이건 이 글 전체를 관통하는 얘기이기도 해요.
관절이 실제로 어떻게 도는지, 회전을 무슨 수로 적는지는 회전 표현 — 오일러는 UI, 쿼터니언은 데이터에, 구조 파일이 좌표계를 자동으로 만들어 주는 이야기는 TF — 좌표계에 시간이 붙는 이유에 있어요.