hello, robot

팔로 물건을 집게 하는 방법은 크게 둘로 갈려요. 손끝이 갈 좌표를 계산해서 관절을 꺾는 길과, 사람이 시연한 것을 흉내 내도록 학습시키는 길이에요.

둘 다 카메라를 쓰는데, 카메라에 기대하는 게 완전히 달라요. 그 차이가 이 글의 내용이에요.

관절 각도에서 손끝으로, 손끝에서 관절 각도로

먼저 용어 둘을 정리해요. 방향이 반대인 한 쌍이에요.

관절 각도들을 알 때 손끝이 어디에 있는지 구하는 건 쉬워요. 링크 길이와 각도를 순서대로 곱해 나가면 나오거든요. 답이 하나고 계산이 곧장 나와요.

반대로 손끝을 이 좌표에 놓으려면 각 관절을 몇 도로 꺾어야 하는가는 어려워요. 답이 여럿일 수도 있고(팔꿈치를 위로 접든 아래로 접든 손끝은 같은 자리에 갈 수 있어요), 아예 없을 수도 있어요(팔이 안 닿는 곳이면요).

로봇팔 제어에서 실제로 필요한 건 대개 뒤쪽이에요. 원하는 건 손끝 위치니까요. 그래서 이쪽을 푸는 라이브러리를 쓰고, 직접 짜지는 않아요.

여기서 앞 글과 이어지는 지점이 하나 있어요. 이걸 풀려면 로봇의 뼈대 정보가 필요해요. 어느 관절이 어디에 있고 링크 길이가 얼마인지를 알아야 하죠. 구조 파일에 적힌 값이 틀리면 계산도 틀리는데, 그 이야기는 URDF 관성 텐서 — 기본값이 링크를 콘크리트로 만드는 칸 쪽에 있어요.

다 왔다는 걸 어떻게 알까요

계산해서 가는 길의 실전 함정이 여기예요.

일반 컬러 카메라는 거리 정보를 안 줘요. 화면에서 상자가 보이지만 그게 30센티미터 앞인지 1미터 앞인지는 안 나와요. 좌표를 계산하려면 3차원 위치가 필요한데 2차원 그림만 있는 거죠.

거리를 함께 재는 카메라를 쓰면 해결되지만 비용이 올라가고 구성이 복잡해져요.

그래서 실용적인 대안이 있어요. 화면에서 상자가 차지하는 면적 비율을 근접 신호로 쓰는 거예요. 가까워질수록 크게 보이니까요. 화면의 80퍼센트를 채우면 충분히 가깝다고 판정하고 집기 동작을 시작하는 식이죠.

정밀한 좌표 대신 거칠지만 되는 신호로 바꾼 거예요. 물체 크기가 일정하다는 전제가 깔려 있으니 아무 데나 쓸 수는 없지만, 조건이 통제된 작업에서는 충분해요.

이 사고방식이 실무에서 자주 나와요. 정확한 값이 안 나오는 자리에서 판정에 필요한 만큼만 되는 대체 신호를 찾는 거요.

이미지를 넣으면 모터 명령이 나와요

다른 길은 접근 자체가 달라요. 카메라 이미지와 명령을 넣으면 신경망 하나가 다음 모터 명령을 직접 뽑아요. 중간에 좌표를 계산하는 단계가 없어요.

학습 방식은 흉내 내기예요. 사람이 팔을 조작해 작업을 해 보인 데이터를 모으고, 같은 상황에서 같은 동작이 나오도록 학습시켜요.

입력이 하나가 아닌 게 특징이에요. 팔에 붙인 카메라와 작업대 위를 보는 카메라를 함께 넣어요. 손이 어디 있는지와 전체 판이 어떤지를 동시에 보는 셈이죠. 여기에 현재 관절 상태도 함께 들어가고요.

말만 하면 알아서 하는 건 아니에요

여기서 오해를 하나 짚고 가야 해요.

이름만 보면 “말로 시키면 이동하고 인식하고 집는 것까지 다 알아서 한다”로 읽혀요. 그런데 실제로 돌아가는 걸 보면 비전과 목표 정보가 이미 주어진 좁은 상황에서만 그렇게 동작해요.

정말 모르는 환경에서 스스로 판단하는 게 아니라, 학습 때 본 것과 비슷한 상황에서 본 대로 움직이는 거예요. 시연 데이터에 없던 배치나 조명이 오면 성능이 떨어지고요.

이 구분이 중요한 이유는 기대치가 설계를 바꾸기 때문이에요. 알아서 다 한다고 믿으면 데이터를 대충 모으고, 본 것만 재현한다고 알면 어떤 상황을 시연에 포함시킬지부터 설계하게 되죠.

두 길을 비교하려면 조건을 맞춰요

두 방식을 같은 팔, 같은 카메라로 놓고 견주면 차이가 방식에서 오는지 하드웨어에서 오는지 갈릴 수 있어요.

카메라를 일반 컬러로 통일하는 선택에는 이유가 둘 있어요. 학습 데이터가 대개 컬러 이미지라 조건을 맞춰야 하고, 컬러 카메라가 가장 보편적이고 싸요.

거리 재는 카메라를 쓰면 계산하는 쪽이 유리해지는데, 그러면 학습하는 쪽의 데이터 조건과 어긋나요. 비교가 목적이면 한쪽에 유리한 조건을 주는 게 이상하죠.

입출력 인터페이스를 같게 두는 것도 같은 이유예요. 이미지가 들어가고 모터 명령이 나오는 형태를 양쪽 다 지키면, 안쪽 방식만 갈아 끼우며 나란히 놓고 볼 수 있어요.

어느 쪽이 언제 맞을까요

정리하면 성격이 이렇게 갈려요.

계산하는 길은 왜 그렇게 움직였는지 설명이 되고, 목표를 바꾸면 바로 반영돼요. 대신 물체 위치를 알아내는 단계를 따로 만들어야 하고, 좌표가 안 나오는 상황에서 막혀요.

학습하는 길은 좌표를 몰라도 되고 복잡한 조작을 통째로 배울 수 있어요. 대신 시연 데이터가 필요하고, 왜 그렇게 움직였는지 설명이 안 되고, 못 본 상황에서 어떻게 될지 예측이 어려워요.

그래서 둘 중 하나를 고르는 문제가 아니라 어느 층에 무엇을 둘지의 문제로 가요. 위치가 명확한 작업은 계산으로, 손끝 감각이 필요한 조작은 학습으로 두는 식이죠.

명령이 실제 관절까지 내려가는 경로는 ros2_control — update()의 주기 계약에, 좌표계를 어떻게 옮겨 다니는지는 TF — 좌표계에 시간이 붙는 이유에 있어요.