로봇팔로 반원을 그릴 일이 있었다.

정면 기준으로 위에서 아래로 내려오는 호 동작이었는데, 대부분의 구간에서는 부드럽게 잘 돌았다.
문제는 호의 아래쪽 어느 구간이었다.
그 구간에서만 원이 안으로 살짝 파이거나 바깥으로 튀어나오는 게 보였다.
처음엔 어디 모터가 맛이 갔나? 파라미터가 크게 틀어졌나? 싶었다.
(업무를 하며 로봇이 이상하게 움직이면 일단 하드웨어부터 의심하게 됐다)
조금 들여다보니 그 구간에서 특정 관절이 아주 짧은 시간 안에 큰 각도를 돌아야 하는 상황이 생기고 있었다.
하모닉 드라이브가 달린 모터로는 그 속도를 시간 안에 못 따라잡는 것이었다.
그때 처음 알았다.

로봇이 명령대로 못 따라가는 데에는 이유가 있고, 이게 자코비안의 잘못이 아닌 경우도 있구나
내가 봤던 그 현상을 기준으로 한 번 정리해보고자 한다.
로봇 끝단이 공간에서 원을 그리려면, 매 순간 "어느 방향으로 얼마나 빠르게 움직일지"가 정해져야 한다.
그런데 실제로 제어할 수 있는 건 관절 각도뿐이다.
"끝단을 이 방향으로 움직이려면 각 관절을 얼마나 빠르게 돌려야 하는지"를 계산해주는 녀석이 자코비안(Jacobian) 이다.
는 끝단 속도, 는 관절 속도, 는 자코비안 행렬이다.
우리가 원하는 건 관절 속도니까 식을 뒤집는다.
자코비안은 매 순간 정확한 답을 내준다.
"이 끝단 속도를 내려면 J1은 이만큼, J2는 이만큼 돌리세요" 하고.
문제는 그 답이 모터가 낼 수 있는 속도 범위 안에 있느냐다.
내가 본 케이스에서 일어난 일을 단계별로 보면 이렇다.
도 멀쩡함, 발산 같은 거 없음
(멀쩡히 명령 수행했고, 수행하지 못하는 곳에 도달하면 자동으로 workspace error를 띄웠었음)
문제 상황에선 그 값이 모터 정격 속도보다 컸다는 것밖에 없었음
모터가 못 따라감 → 궤적이 명령에서 이탈
예를 들어 J4가 최대 300 deg/s 까지만 돌 수 있는데 원 그리기가 요구하는 속도가 500 deg/s 라면?

포화(saturation)가 일어난다. 서보가 "나는 여기까지밖에 못 돈다"고 선언하는 순간이다.
끝단은 제 속도를 못 내고, 그 구간에서만 궤적이 안으로 파이거나 바깥으로 튀어나온다.
여기서 자코비안은 죄가 없다. 역행렬도 죄가 없다.
자코비안은 정확한 답을 내줬고, 그 답이 단지 모터 능력 밖이었을 뿐이다.
이건 순수하게 모션 플래닝과 하드웨어의 미스매치다.
경로 자체가 그 시간 안에 그 모터로는 못 그리는 경로였다는 뜻이다.
이런 추종 오차에는 정식 이름이 있었다.
Contour error (윤곽 오차) 라고 부른다고 한다.

이는 명령된 경로(contour)와 실제로 그려진 경로 사이의 수직 거리를 의미하는 용어라고 한다.
원의 경우는 더 좁게 circularity error (진원도 오차) 라고 부르기도 한다.
추종 오차는 보통 두 성분으로 나눈다.
원이 안으로 파이거나 바깥으로 튀어나오는 건 정확히 contouring error에 해당한다.
원인 쪽으로 들어가면 또 다른 용어가 있다.
서보 정격 속도를 넘어서 명령이 포화되는 걸 velocity saturation, 명령에 비해 서보 응답이 늦어지는 걸 servo lag 또는 following error 라고 한다.
하모닉 드라이브 같은 감속기의 wind-up이나 토크 한계로 인한 응답 지연도 following error에 포함된다.
내가 본 건 정확히는 velocity saturation에서 비롯된 contour error였다.
원인이 "경로가 모터 능력을 넘었다" 라면, 답도 거기에 맞춰져야 한다.
Path retiming (time scaling)
가장 직관적인 답.
경로 모양은 그대로 두고, 그 구간에서만 속도를 늦춘다.
관절이 따라올 시간을 주는 방식이다.
원은 제대로 그려지지만 작업 시간이 늘어난다는 trade-off가 있다.
Path replanning
애초에 그 구간에 안 걸리게 경로를 다시 짠다.
Tool 방향을 살짝 바꾸거나, 로봇 베이스 기준 상대 위치를 재배치한다.
사이클 타임은 유지되지만 경로 설계를 다시 해야 한다.
Feedforward 보상
좀 더 들어가면, 컨트롤러 단에서 모터 동특성을 미리 알고 명령을 앞서 보내는 방법도 있다.
하지만 현장에서 보통 1차 대처는 위 두 가지다.
내가 본 현상에는 path retiming이 가장 무난한 답이었을 것이다.
근데 업무 상 path retiming이 쉽지 않은 상황이라,
추후에 Feedforward로 경로 제어를 시도해야 할 것 같다.

로봇이 원을 완벽히 못 그리는 건 서보 고장이 아니라 경로와 모터의 미스매치 때문이라는 걸 정리할 수 있었다.
아무튼 하드웨어 문제가 맞잖아?

수식 자체보다, "자코비안이 정답을 줘도 모터가 못 따라갈 수 있다" 라는 한 줄 감각이 기억에 오래 남을 것 같다.
그 위에 contour error, path retiming, 그리고 별개 주제로 특이점/DLS를 얹을 수 있게만 공부한다면,
관련 얘기가 나왔을 때 개념적으로 대화를 이어갈 수 있을 것이다.
난 솔직히 현상을 먼저 보고 개념을 이렇게 정리하는 게 기억에 오래 남는 것 같다.
수식 먼저 외우려 했다면 전혀 기억하지 못했을 것 같다.
사실 분명 이미 본 적이 있겠지 학부 시절 언젠가..
다시 공부했으니 된 것 아닐까