Skip to main content

네 번째 프로젝트: 로봇팔로 물체 집기

로봇팔 프로젝트는 처음 보면 조금 겁이 납니다. 바퀴 로봇은 굴러가면 되고, 음성 로봇은 말하면 되는데, 로봇팔은 갑자기 수학 냄새가 진하게 나기 때문입니다. 하지만 막상 해보면 핵심은 꽤 분명합니다. 어디로 갈지 정하고, 손을 벌리고, 내려가서, 집고, 다시 올리고, 옮기고, 놓는 것입니다.

이 장의 목표는 거창한 산업용 자동화를 만드는 것이 아닙니다. 책상 위에서 작은 블록이나 컵, 스펀지, 상자 같은 물체를 집어서 다른 위치로 옮기는 경험을 만드는 것입니다. 이 한 번의 성공이 왜 중요하냐면, 로봇 조작의 본질이 거의 다 들어 있기 때문입니다. 좌표를 이해해야 하고, 관절을 제어해야 하며, 그리퍼를 다뤄야 하고, 실패했을 때 왜 실패했는지도 읽어야 합니다.

네 번째 프로젝트: 로봇팔로 물체 집기

이번 프로젝트의 현실적인 목표

이번 장에서는 저가형 4~6자유도 로봇팔이나 시뮬레이터를 사용해, 다음 흐름을 직접 구현합니다.

  • 기준 자세로 이동한다.

  • 집을 위치 위로 간다.

  • 천천히 내려간다.

  • 그리퍼를 닫아 물체를 잡는다.

  • 다시 들어 올린다.

  • 놓을 위치로 이동한다.

  • 내려가서 놓고 돌아온다.

여기서 중요한 점은 처음부터 "아무 물체나 아무 각도에서 집기"를 목표로 삼지 않는 것입니다. 그런 목표는 비전, 충돌 회피, 경로 계획, 힘 제어까지 필요해 금방 복잡해집니다. 대신 우리는 고정된 테이블, 미리 아는 위치, 단순한 그리퍼, 정해진 물체라는 조건에서 확실한 성공을 만듭니다. 로봇 개발은 대체로 이런 식입니다. 범위를 좁히면 갑자기 가능해집니다.

왜 로봇팔 프로젝트가 특별한가

이동 로봇은 공간을 돌아다니고, 음성 로봇은 사람과 대화합니다. 반면 로봇팔은 물체와 직접 상호작용합니다. 즉, AI나 소프트웨어가 화면 밖으로 나와 진짜 물건을 건드리기 시작합니다.

이때부터 로봇은 훨씬 더 정직해집니다. 화면 속에서는 "컵을 집었습니다"라고 말하면 끝이지만, 실제 책상 위에서는 컵을 비껴 잡거나, 너무 세게 눌러 넘어뜨리거나, 그리퍼가 미끄러질 수 있습니다. 그래서 로봇팔 프로젝트는 로봇 개발자의 감각을 빠르게 키워 줍니다. 코드가 좋아 보여도 물체를 못 집으면 실패이고, 코드가 투박해도 안정적으로 집어 옮기면 성공입니다.

준비 방법: 실물 로봇팔과 시뮬레이터 중 무엇을 쓸까

요즘은 개인 개발자도 접근할 수 있는 저가형 로봇팔이 꽤 많습니다. 200달러 안팎의 DIY AI 학습용 팔 키트나, 250달러 수준에서 조립 가능한 오픈소스 저가형 로봇팔 프로젝트도 나와 있어 예전보다 진입 장벽이 훨씬 낮아졌습니다.12 꼭 산업용 로봇팔이 아니어도, 책상 위에서 움직이는 작은 팔만 있으면 이 장의 핵심을 충분히 익힐 수 있습니다.

실물 장비가 있다면 가장 좋지만, 없다면 시뮬레이터로 시작해도 괜찮습니다. 오히려 처음에는 시뮬레이터가 더 편할 때가 많습니다. 테이블에 부딪혀도 안 깨지고, 모터가 타지도 않고, 물체를 수십 번 떨어뜨려도 마음만 조금 아플 뿐입니다.

현실적으로는 다음 두 경로 중 하나를 고르면 됩니다.

경로추천 대상장점주의할 점
실물 저가형 로봇팔손으로 직접 만지며 배우고 싶은 사람진짜 집기 감각을 익힐 수 있음조립, 전원, 오차, 마찰 문제를 겪음
시뮬레이터예산이 적거나 먼저 개념을 익히고 싶은 사람안전하고 반복 실험이 쉬움현실의 미끄러짐, 유격, 힘 문제는 덜 느껴짐

개인적으로는 시뮬레이터로 첫 성공 → 실물로 옮기기 순서를 추천합니다. 처음부터 하드웨어와 소프트웨어를 동시에 잡으려 하면 머리가 둘로 갈라지는 느낌이 들기 쉽습니다.

로봇팔을 이해하는 가장 중요한 지도

로봇팔은 크게 보면 세 가지 좌표 세계를 오갑니다.

첫째는 베이스 좌표계입니다. 로봇이 책상 어디에 고정되어 있는지를 기준으로 삼는 세계입니다. 둘째는 관절 공간입니다. 각 모터가 몇 도 돌아가 있는지를 다루는 세계입니다. 셋째는 작업 공간 또는 카테시안 공간입니다. 끝점이 x, y, z 어디에 있는지를 다루는 세계입니다. 로봇의 끝부분, 즉 실제로 집기 동작을 수행하는 지점을 보통 TCP(Tool Center Point)라고 부릅니다.3

처음엔 이게 추상적으로 들릴 수 있습니다. 하지만 사람 팔로 생각하면 쉽습니다. "어깨 20도, 팔꿈치 45도"는 관절 공간의 말이고, "손끝을 컵 위 5cm로 가져가"는 작업 공간의 말입니다. 로봇 제어는 결국 이 둘을 왔다 갔다 번역하는 일입니다.

관절을 움직이는 것과 손끝을 움직이는 것은 다르다

로봇팔에서 자주 나오는 두 단어가 있습니다. 순기구학과 역기구학입니다.

순기구학은 관절 각도를 알고 있을 때 손끝의 위치와 방향을 계산하는 문제입니다. 반대로 역기구학은 손끝의 목표 위치와 방향이 주어졌을 때, 거기에 도달하기 위한 관절 값들을 계산하는 문제입니다.4 이름은 어렵지만, 사실 "관절에서 끝점으로 가는 계산"과 "끝점에서 관절로 돌아오는 계산"이라고 생각하면 됩니다.

초보자에게 중요한 포인트는 이것입니다. 처음에는 순기구학을 완벽히 몰라도 움직일 수 있지만, 결국 역기구학을 이해해야 좌표 기반 조작이 가능해진다는 점입니다.

다만 여기서 너무 겁먹을 필요는 없습니다. 저가형 로봇팔은 4자유도나 5자유도인 경우가 많아서, 모든 위치와 모든 손목 방향을 마음대로 만들 수는 없습니다. 이런 팔은 특정 위치는 갈 수 있어도, 원하는 방향까지 완벽히 맞추지 못할 수 있습니다.4 그런데 책상 위 블록 집기 정도는 대개 충분히 가능합니다. 이 장에서는 바로 그 "충분히 가능한 범위"에 집중합니다.

프로젝트 시나리오: 블록 하나를 왼쪽에서 오른쪽으로 옮기기

이번 프로젝트의 가장 단순하고 좋은 예제는 이렇습니다.

책상 위 왼쪽 구역에 작은 블록이 하나 놓여 있습니다. 로봇팔은 기준 자세에서 시작합니다. 블록 위로 이동한 뒤, 약간 내려가 그리퍼를 닫아 블록을 잡습니다. 다시 올라와 오른쪽 구역으로 이동하고, 그곳에 내려놓습니다. 끝나면 처음 자세로 돌아옵니다.

이 동작은 단순해 보이지만 실제로는 다음 요소가 모두 들어 있습니다.

  • 좌표 지정

  • 관절 이동

  • 접근 높이 설정

  • 그리퍼 열기와 닫기

  • 집기 전후의 안정화 시간

  • 물체를 놓을 때의 충돌 방지

로봇팔 프로젝트는 "움직인다"보다 "어떻게 접근하느냐"가 훨씬 중요합니다. 목표 좌표를 바로 찌르듯 들어가면 실패하기 쉽고, 위에서 접근하고, 내려가고, 다시 위로 빠지는 습관을 들이면 성공률이 크게 올라갑니다.

첫 단계: 캘리브레이션이 절반이다

로봇팔 프로젝트에서 초보자가 가장 많이 건너뛰는 단계가 캘리브레이션입니다. 그런데 이걸 대충 하면 이후의 모든 문제가 한꺼번에 터집니다.

처음에는 꼭 다음 네 가지를 확인하세요.

  • 홈 자세를 정합니다. 모든 실험은 같은 시작 자세에서 출발해야 결과를 비교하기 쉽습니다.

  • 각 관절의 안전 범위를 확인합니다. 로봇마다 회전 가능한 범위가 다르고, 케이블이 꼬이는 구간도 있습니다.

  • 테이블 높이를 기준 좌표로 잡습니다. z값이 어디부터 책상인지 알아야 너무 깊게 내려가지 않습니다.

  • 그리퍼의 열린 폭과 닫힌 폭을 확인합니다. 생각보다 "조금 덜 닫힘" 때문에 물체를 놓치는 일이 많습니다.

실물 로봇이라면 이 단계에서 모터를 하나씩 천천히 움직여 보며 방향을 확인하세요. "플러스 각도가 위로 가는 줄 알았는데 아래로 간다" 같은 문제는 어려운 수학 문제가 아니라 축 방향 설정 오류인 경우가 많습니다.

가장 쉬운 성공법: 관절 자세를 미리 기록하는 방식

역기구학을 바로 쓰고 싶겠지만, 첫 성공은 더 단순한 방법으로 만드는 편이 좋습니다. 바로 자세를 미리 저장해 두는 방식입니다.

예를 들어 다음처럼 몇 개의 관절 자세를 직접 찾습니다.

  • home: 시작 자세

  • above_pick: 집을 물체 위의 안전한 높이

  • pick: 물체를 잡는 낮은 자세

  • above_place: 놓을 위치 위의 안전한 높이

  • place: 물체를 놓는 낮은 자세

그리고 이 자세들을 순서대로 재생하면 됩니다. 이렇게 하면 역기구학 없이도 로봇팔이 "집어서 옮기기"를 해냅니다.

예를 들어 의사코드는 이런 느낌입니다.

home = [0.0, -0.6, 1.1, 0.2]
above_pick = [0.4, -0.5, 0.9, 0.1]
pick = [0.4, -0.7, 1.0, 0.1]
above_place = [-0.4, -0.5, 0.9, 0.1]
place = [-0.4, -0.7, 1.0, 0.1]

def pick_and_place():
    open_gripper()
    move_joints(home)
    move_joints(above_pick)
    move_joints(pick)
    close_gripper()
    sleep(0.5)
    move_joints(above_pick)
    move_joints(above_place)
    move_joints(place)
    open_gripper()
    sleep(0.5)
    move_joints(above_place)
    move_joints(home)

이 방식의 장점은 엄청 단순하다는 점입니다. 그리고 단점도 분명합니다. 물체 위치가 조금만 바뀌어도 다시 자세를 손으로 맞춰야 합니다. 하지만 바로 이 한계 때문에 다음 단계, 즉 좌표 기반 제어의 필요성이 자연스럽게 보입니다.

다음 단계: 좌표를 넣고 관절을 계산하는 역기구학

이제 조금 더 똑똑하게 가봅시다. "왼쪽 블록 위 10cm" 같은 좌표를 주면, 로봇이 거기로 갈 수 있는 관절 값을 계산하도록 만드는 것입니다. 이것이 역기구학입니다.4

수학을 전부 손으로 풀 필요는 없습니다. 중요한 것은 원리입니다. 로봇팔의 링크 길이와 관절 구조를 알고 있으면, 목표 위치에 도달하는 관절 조합을 계산할 수 있습니다. 간단한 팔은 기하학적으로 풀 수 있고, 더 복잡한 팔은 반복 계산으로 점점 목표에 가까워지는 수치적 방법을 씁니다. 자코비안 기반 방법은 이런 수치적 IK의 대표적인 예입니다.34

예를 들어 2링크 평면 팔은 개념적으로 이렇게 생각할 수 있습니다.

x = L1*cos(q1) + L2*cos(q1+q2)
y = L1*sin(q1) + L2*sin(q1+q2)

여기서 q1, q2를 알면 손끝 위치 (x, y)를 구할 수 있습니다. 이것이 순기구학입니다. 반대로 원하는 (x, y)가 있을 때 q1, q2를 구하는 것이 역기구학입니다.

실전에서는 이런 계산을 직접 구현할 수도 있고, 라이브러리를 쓸 수도 있습니다. ROS 2 환경에서는 URDF로 로봇 구조를 읽고 KDL 같은 라이브러리로 IK를 풀 수 있으며, 초기 관절값을 어떻게 주느냐가 수렴 속도와 결과에 영향을 주기도 합니다.5 다시 말해, 역기구학은 마법 버튼이 아니라 로봇 구조 + 현재 자세 + 목표 자세를 바탕으로 푸는 계산 문제입니다.

그리퍼는 마지막 부품이 아니라 핵심 부품이다

초보자는 종종 팔에만 집중하고 그리퍼를 부록처럼 취급합니다. 하지만 실제 집기 성공률은 그리퍼에서 크게 갈립니다.

두 손가락 그리퍼를 쓴다고 해봅시다. 이때 중요한 것은 단순히 닫는 기능이 아닙니다. 어떤 방향에서 접근하느냐, 얼마나 깊게 들어가느냐, 어느 정도 힘으로 쥐느냐가 다 중요합니다.

간단한 규칙만 지켜도 성공률이 올라갑니다.

  • 물체 중심을 향해 접근합니다.

  • 가능하면 위에서 수직으로 내려갑니다.

  • 닫기 전에 손가락이 물체 양옆에 충분히 들어갔는지 확인합니다.

  • 너무 세게 쥐지 않습니다. 가벼운 물체는 튕겨 나가거나 미끄러질 수 있습니다.

  • 집은 직후 바로 옆으로 이동하지 말고, 먼저 위로 들어 올립니다.

작은 스펀지나 종이컵처럼 변형이 쉬운 물체는 오히려 어렵습니다. 첫 실습은 나무 블록, 지우개, 작은 박스처럼 모양이 단순하고 미끄럽지 않은 물체로 시작하는 것이 좋습니다.

코드는 상태 머신으로 짜면 훨씬 덜 꼬인다

로봇팔 프로젝트에서 if문을 아무 데나 붙이기 시작하면 금방 미로에 빠집니다. 그래서 상태 머신 방식이 잘 맞습니다. 한 번에 한 상태만 처리하고, 조건이 되면 다음 상태로 넘어가는 구조입니다.

예를 들면 이런 식입니다.

state = "MOVE_ABOVE_PICK"

while True:
    if state == "MOVE_ABOVE_PICK":
        if move_to_pose(above_pick_pose):
            state = "DESCEND_TO_PICK"

    elif state == "DESCEND_TO_PICK":
        if move_to_pose(pick_pose):
            state = "GRASP"

    elif state == "GRASP":
        close_gripper()
        wait(0.5)
        state = "LIFT"

    elif state == "LIFT":
        if move_to_pose(above_pick_pose):
            state = "MOVE_ABOVE_PLACE"

    elif state == "MOVE_ABOVE_PLACE":
        if move_to_pose(above_place_pose):
            state = "DESCEND_TO_PLACE"

    elif state == "DESCEND_TO_PLACE":
        if move_to_pose(place_pose):
            state = "RELEASE"

    elif state == "RELEASE":
        open_gripper()
        wait(0.5)
        state = "RETURN_HOME"

    elif state == "RETURN_HOME":
        if move_to_pose(home_pose):
            break

이 구조의 장점은 디버깅이 쉽다는 것입니다. 로봇이 실패해도 "어느 상태에서 멈췄는지" 바로 알 수 있습니다. 음성 명령이나 비전 인식을 붙이더라도 결국 내부 동작은 이런 작은 상태들의 연결로 가는 경우가 많습니다.

자주 실패하는 이유는 대부분 비슷하다

로봇팔 프로젝트를 하다 보면 "내 로봇만 이상한가?" 싶은 순간이 옵니다. 하지만 실패 패턴은 대체로 정해져 있습니다.

  • 목표 바로 위가 아니라 옆으로 조금 비껴 갑니다. 이때는 좌표계 원점이나 링크 길이, 홈 오프셋이 잘못됐을 가능성이 큽니다.

  • 내려가다가 테이블을 칩니다. z축 기준 높이나 접근 자세가 잘못됐을 수 있습니다.

  • 잡았는데 들자마자 떨어뜨립니다. 그리퍼 폭이 부족하거나, 물체 중심에서 벗어나 잡았거나, 너무 빠르게 이동하는 경우가 많습니다.

  • 특정 자세에서 팔이 떨립니다. 관절 한계 근처이거나, 수치적 IK가 불안정한 자세에 들어갔을 수 있습니다.

  • 같은 코드를 돌려도 결과가 조금씩 다릅니다. 실물 하드웨어에서는 백래시, 유격, 마찰, 전압 변동이 흔합니다.

이럴 때 가장 좋은 방법은 문제를 쪼개는 것입니다. "집기 실패"라고 뭉뚱그리지 말고, 도달 실패인지, 정렬 실패인지, 그립 실패인지, 운반 실패인지를 나눠 보세요. 그러면 고칠 것이 보입니다.

실물 없이도 배울 수 있는 것들

시뮬레이터만으로도 꽤 많은 것을 배울 수 있습니다. 특히 다음은 실물 없이도 충분히 익힐 수 있습니다.

  • 좌표계와 관절 공간의 차이

  • 홈 자세, 웨이포인트, 접근 자세 설계

  • 상태 머신 기반 제어 구조

  • 순기구학과 역기구학의 감각

  • 충돌을 피하기 위한 위쪽 접근 습관

실전에서는 먼저 시뮬레이터에서 TCP가 어떻게 움직이는지 보고, 그다음 실물에서 속도를 낮춰 재현하는 방식이 좋습니다. 나중에 ROS 2와 MoveIt을 쓰게 되면, IK로 가능한 목표 자세를 찾고 그 위에 충돌 없는 경로 계획을 얹는 흐름으로 확장할 수 있습니다.6

여기서 한 단계 더 가려면

이번 프로젝트가 성공했다면, 이제 로봇팔은 단순한 장난감이 아니라 작은 자동화 장치가 됩니다. 다음 단계는 자연스럽게 이어집니다.

  • 카메라를 붙여 색깔 블록을 분류하기

  • QR 코드나 마커를 읽고 위치를 바꿔 가며 집기

  • 컨베이어 대신 사람이 놓아 둔 물체를 순서대로 옮기기

  • 로봇팔 대신 시뮬레이터에서 수백 번 반복해 학습 데이터 만들기

  • ROS 2, KDL, MoveIt 2로 넘어가 더 일반적인 조작 파이프라인 구성하기56

중요한 것은 처음 성공을 너무 어렵게 만들지 않는 것입니다. 로봇 조작은 "수학을 완벽히 이해한 다음 시작"하는 분야가 아닙니다. 먼저 집어 보고, 그다음 왜 되는지 이해하는 분야에 가깝습니다.

이번 장에서 꼭 가져가야 할 감각

이번 프로젝트의 핵심은 로봇팔을 멋지게 보이게 만드는 것이 아니라, 집어서 옮기기를 실제로 구현하는 것입니다. 그 과정에서 우리는 몇 가지 중요한 감각을 얻습니다.

로봇팔은 관절 각도의 세계와 손끝 좌표의 세계를 오가며 움직입니다. 그리퍼는 단순한 부속이 아니라 집기 성공률을 좌우하는 핵심 장치입니다. 그리고 로봇 제어는 큰 지능 하나로 해결되기보다, 홈 이동, 접근, 하강, 파지, 상승, 이동, 해제 같은 작은 동작을 안정적으로 연결하는 구조로 만들어집니다.

이 감각은 앞으로 배우게 될 ROS 2, 시뮬레이션, 비전 기반 조작, LLM 기반 에이전트 제어까지 모두 이어집니다. 로봇이 세상을 바꾸는 장면은 거창한 데서 시작하지 않습니다. 대개는 책상 위 작은 블록 하나를 제대로 집는 데서 시작합니다.

참고

1SO-ARM100 Low-Cost AI Arm Kit Pro

3Kinematics, inverse kinematics, Programming of a simulated robotic arm

4Inverse Kinematics | ROS Robotics

5Inverse kinematics with KDL in ROS 2

6Inverse Kinematics | ROS 2 Jazzy MoveIt Task Constructor

책 목록

혼자 만드는 AI 로봇: 개인 개발자를 위한 현실적인 로봇 제작 로드맵

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기