hello, robot

팔을 A에서 B로 옮기려면 중간 지점들이 필요해요. 시작과 끝을 주고 균등하게 나누면 경로점이 나오죠. 한 줄이면 되고 결과도 그럴듯해요.

그런데 그렇게 만든 궤적을 실제 팔에 넣으면 시작과 끝에서 덜컥거려요. 이유를 알면 당연한데, 모르면 제어기 게인을 한참 만지게 돼요.

등간격은 등속이에요

균등 분할이 무슨 뜻인지 다시 보면 답이 나와요.

같은 시간 간격마다 같은 거리를 이동하라는 뜻이에요. 즉 처음부터 끝까지 속도가 일정한 궤적이죠.

문제는 시작 순간이에요. 정지해 있던 팔이 다음 순간 목표 속도로 움직여야 해요. 속도가 0에서 최대로 순식간에 뛰는 거니까 가속도가 무한대로 요구돼요.

물리적으로 불가능하니 실제로는 이렇게 돼요. 모터가 최대 토크로 급격히 밀고, 팔이 흔들리고, 목표를 지나쳤다가 되돌아와요. 끝점에서도 같은 일이 반대로 일어나고요. 명령은 매끄러운데 움직임이 거친 상태예요.

경로와 속도는 다른 축이에요

여기가 개념이 갈리는 지점이에요.

어디를 지날 것인가각 지점을 언제 지날 것인가는 별개예요. 앞의 것이 경로이고 뒤의 것이 속도 계획이죠. 균등 분할은 앞의 것만 정한 건데, 뒤의 것도 자동으로 정해 버린 게 문제예요.

그래서 순서를 나눠요. 먼저 지나갈 자리를 고르게 깔고, 그 위에 속도 프로파일을 얹어요. 같은 경로라도 얹는 프로파일에 따라 부드럽기가 완전히 달라져요.

사다리꼴로 만들어요

가장 기본적인 프로파일이 세 구간으로 되어 있어요.

일정한 가속도로 속도를 올리는 구간, 최고 속도를 유지하는 구간, 일정한 감속도로 속도를 내리는 구간이요. 속도를 시간에 대해 그리면 사다리꼴이라 그렇게 불러요.

이러면 시작과 끝에서 속도가 0이라 정지 상태와 매끄럽게 이어져요. 가속도가 유한하니 모터가 낼 수 있는 토크 범위 안에 들어오고요.

거리가 짧으면 최고 속도에 도달하기 전에 감속을 시작해야 해요. 그러면 사다리꼴이 아니라 삼각형이 되죠. 이 경우를 따로 처리 안 하면 계산이 어긋나니 구현할 때 첫 번째로 부딪히는 분기예요.

한 단계 더 부드럽게

사다리꼴에도 거친 지점이 남아 있어요. 가속 구간과 등속 구간이 만나는 자리요.

그 순간 가속도가 어떤 값에서 0으로 순간에 바뀌어요. 가속도의 변화율을 저크라고 부르는데, 여기서 저크가 무한대가 되죠. 앞에서 속도로 겪은 문제가 한 단계 위로 올라온 거예요.

증상은 덜컥거림이 아니라 진동이에요. 팔이 멈춘 뒤에도 끝이 미세하게 떨리거나, 들고 있던 물건이 흔들려요. 정밀 조립이나 액체를 옮기는 작업에서 문제가 되죠.

그래서 가속도 자체도 매끄럽게 바꾸는 프로파일을 써요. 속도 곡선이 S자를 그리게 되고요. 계산은 복잡해지지만 움직임이 눈에 띄게 조용해져요.

어디까지 갈지는 작업이 정해요. 물건을 옮기는 정도면 사다리꼴로 충분하고, 진동이 결과를 망치는 작업이면 한 단계 더 가는 식이죠.

어느 공간에서 나눌까요

마지막으로 결정 하나가 더 있어요. 관절 각도로 나눌지, 손끝 좌표로 나눌지요.

관절 각도를 균등하게 나누면 각 모터가 매끄럽게 돌아요. 대신 손끝이 그리는 궤적은 직선이 아니라 휘어요. 관절 회전이 원호를 그리니까요.

손끝 좌표를 균등하게 나누면 손끝이 직선으로 가요. 대신 매 지점마다 관절 각도를 역으로 풀어야 하고, 그 각도들이 매끄럽게 이어진다는 보장이 없어요. 특정 자세 근처에서는 손끝이 조금만 움직여도 관절이 크게 도는 구간이 있거든요.

그래서 선택 기준이 이렇게 갈려요. 경로 모양이 중요하면 손끝 기준으로 나누고, 부드러움이 중요하면 관절 기준으로 나눠요. 용접선을 따라가야 하면 앞의 것, 그냥 A에서 B로 옮기면 뒤의 것이죠.

정리하면

궤적을 만드는 일은 두 단계예요. 어디를 지날지 정하고, 각 지점을 언제 지날지 정해요.

균등 분할 한 줄로 끝난 것처럼 보이는 이유는 두 번째가 자동으로 정해졌기 때문이고, 그 자동값이 등속이라 시작과 끝에서 무리한 요구가 돼요. 프로파일을 얹는 것이 그 요구를 물리적으로 가능한 범위로 되돌리는 일이고요.

관절 명령이 실제 모터까지 내려가는 경로는 ros2_control — update()의 주기 계약에, 손끝 좌표를 관절 각도로 푸는 이야기는 IK 계산과 학습 정책 — 팔을 움직이는 두 갈래에 있어요. 명령과 실제 응답의 차이를 재는 방법은 rosbag2 — 시계 축이 어긋난 기록은 조용히 틀려요에 있고요.