assembly
Assembly 구성
등록된 로봇들을 팔·도구·하체 슬롯에 끼워 하나의 가상 로봇(Agent)으로 묶고, 활성화 창에서 함께 움직여 보는 단계.
최근 확인 버전: v6.0.23
Assembly는 Robots → Management에 등록된 여러 로봇을 **하나의 가상 로봇(Agent)**으로 묶는 단계입니다. 등록된 로봇 자체는 "이 팔이 어떤 시리얼·어떤 IP·몇 자유도냐" 같은 하드웨어 단위 정의에 가깝고, Assembly는 그 부품들을 조합해 **"이 작업에서는 이 팔과 저 그리퍼를 한 몸처럼 쓰겠다"**라고 선언하는 일이에요.
이후의 모든 단계 — 텔레오퍼레이션 · 워크스페이스 · 데이터 수집 · 학습 · 추론 — 는 모두 이 Assembly 단위로 진행됩니다. 워크스페이스도 항상 한 Assembly에 묶여요.
왜 Assembly가 필요한가
서로 다른 회사에서 만든 팔과 그리퍼를 같이 써도, 정책(policy) 입장에서는 하나의 큰 로봇이어야 합니다. 관절각·EE 자세·그리퍼 명령이 한 묶음의 관측·액션 벡터로 들어가야 학습이 의미가 있기 때문이에요.
Assembly는 이 "한 묶음"을 사용자가 직접 정의하게 해 줍니다.
- 단일 팔 작업 — 팔 한 대만 슬롯에 꽂으면 그대로 끝.
- 양팔 작업 — 같은 모델 두 대를 left / right 슬롯에 각각 꽂으면 양팔 Agent가 됩니다. 두 팔이 꼭 같은 회사·같은 모델일 필요는 없어요. 좌측에 Piper, 우측에 Fairino 식으로 이종 조합도 가능합니다.
- 외부 그리퍼 결합 — 팔에는 자체 그리퍼가 없어도 됩니다. 별도로 등록한 Custom Robot(예: 시중 전동 그리퍼, 자체 제작 손)을 tool 슬롯에 끼우면 그 팔의 그리퍼처럼 동작해요. 학습 시에는 팔 관절 + 그리퍼 명령이 하나의 액션으로 합쳐집니다.
- 팔 + 내장 그리퍼 일체형 — Piper처럼 그리퍼가 팔에 일체로 붙어있는 모델은 한 번의 클릭으로 arm + tool 슬롯이 동시에 채워집니다.
- 이동 베이스 결합 — 이동 베이스를 하체 슬롯에 끼웁니다. 팔·도구와 함께 묶을 수도 있고, 이동 베이스 한 대만으로 Assembly를 만들 수도 있습니다.
- 휴머노이드 — 휴머노이드는 몸 전체가 한 로봇이라, 카드를 한 번 누르면 두 팔·양손·하체가 모두 그 한 대로 채워집니다.
5개의 슬롯
Assembly는 다음 다섯 슬롯으로 구성됩니다. 앞의 네 슬롯이 상체(팔·도구)이고, 하체가 이동을 맡습니다. 조립 창의 구성 줄에는 한글 이름으로, 어셈블리 카드에는 영문 이름으로 표시됩니다.
| 슬롯 (구성 줄 / 어셈블리 카드) | 역할 | 비어 있어도 되나? |
|---|---|---|
| 왼팔 / left_arm | 좌측 팔 | 우측 팔만 쓸 거면 비워도 됨 |
| 오른팔 / right_arm | 우측 팔 | 좌측 팔만 쓸 거면 비워도 됨 |
| 왼쪽 도구 / left_tool | 좌측 팔의 그리퍼/도구 | 그리퍼 없는 팔이면 비움 |
| 오른쪽 도구 / right_tool | 우측 팔의 그리퍼/도구 | 그리퍼 없는 팔이면 비움 |
| 하체 / mobile_base | 이동 베이스, 또는 휴머노이드의 다리·이동 | 이동이 없는 작업이면 비움 |
원하는 조합 그대로 다섯 슬롯에 부품을 끼우면 그게 곧 Assembly입니다. 최소 한 슬롯은 채워야 저장되며, 하체만 채운 Assembly도 저장할 수 있습니다.
흔한 구성 예시
| 사용 사례 | left_arm | left_tool | right_arm | right_tool | mobile_base |
|---|---|---|---|---|---|
| 단일 팔 + 내장 그리퍼 (Piper) | piper_main | (자동) | — | — | — |
| 단일 팔 + 외부 그리퍼 | fairino_main | custom_gripper | — | — | — |
| 양팔 (동일 모델) | piper_left | (자동) | piper_right | (자동) | — |
| 양팔 (이종 + 외부 그리퍼) | fairino_left | custom_gripper_l | piper_right | (자동) | — |
| 단일 팔 + 이동 베이스 | piper_main | (자동) | — | — | base_main |
| 이동 베이스만 | — | — | — | — | sim_go2 |
| 휴머노이드 전신 | sim_humanoid | (자동) | (자동) | (자동) | (자동) |
휴머노이드에 손 관절이 없으면 left_tool / right_tool은 비어 있습니다.
로봇의 역할
로봇 추가 단계에서 각 로봇에 정해진 역할이 Assembly에서 어느 슬롯에 들어갈 수 있는지를 결정합니다.
| 역할 | 가능 슬롯 | 예 |
|---|---|---|
| 단일 팔 | left_arm 또는 right_arm | Piper, Fairino, Jaka 같은 6/7-DoF 매니퓰레이터 |
| 도구 | left_tool 또는 right_tool | 별도 등록된 그리퍼 (Custom Robot으로 등록한 외부 그리퍼) |
| 양팔 (바이매뉴얼) | left_arm + right_arm을 한 번에 (그리퍼가 팔 관절에 함께 있으면 left_tool + right_tool까지) | 이미 양팔이 한 컨트롤러에 묶여 있는 통합형 (예: AI Worker, sim_bimanual) |
| 휴머노이드 | left_arm + right_arm + mobile_base를 한 번에 (손 관절이 있으면 left_tool + right_tool까지) | sim_humanoid, sim_igris |
| 이동 베이스 | mobile_base (하체) | sim_base, sim_go2 |
구성하기
-
로봇 → 어셈블리로 이동하고 + 카드를 눌러 새 어셈블리 창을 엽니다.
어셈블리 카드 목록 끝의 + 카드를 누르면 새로 만들기 창이 열립니다. 왼쪽 위에 어셈블리 이름 칸, 오른쪽에 등록된 로봇 카드가 나열되고, 그 아래에 구성 줄과 3D 조립, 저장 버튼이 있습니다. 이미 만든 Assembly를 고치려면 그 Assembly의 카드를 누릅니다.
스크린샷 누락/docs/assembly/02-new-dialog.png새로 만들기 창 — 어셈블리 이름 칸, 로봇 카드 목록, 구성 줄(왼팔 · 왼쪽 도구 · 오른팔 · 오른쪽 도구 · 하체), 3D 조립, 저장 버튼
-
로봇 카드를 눌러 역할에 맞는 슬롯에 넣습니다.
카드를 누르면 그 로봇의 역할에 맞는 슬롯에 들어가고 카드 테두리가 강조됩니다. 넣은 뒤 카드에 나타나는 버튼·표시는 역할마다 다릅니다.
- 단일 팔 — 비어 있는 팔 슬롯에 먼저 들어가고, 왼쪽 / 오른쪽 버튼으로 어느 팔로 쓸지 바꿉니다.
- 도구 — 왼쪽 / 오른쪽 버튼으로 어느 팔의 그리퍼로 쓸지 고릅니다.
- 양팔 (바이매뉴얼) — 한 번 누르면 왼팔·오른팔 슬롯을 모두 차지합니다.
- 이동 베이스 — 하체 슬롯에 들어가고 카드에 하체 표시가 나타납니다.
- 휴머노이드 — 전신이 한 번에 채워지고 카드에 전신 (팔 · 손 · 하체) 표시가 나타납니다.
넣은 카드를 다시 누르면 그 로봇이 모든 슬롯에서 빠집니다. 다른 로봇이 있던 슬롯에 새 로봇을 넣으면 원래 로봇은 빠지는데, 양팔 (바이매뉴얼)·휴머노이드처럼 여러 슬롯을 차지하던 로봇이면 나머지 슬롯에서도 함께 빠집니다.

-
구성 줄에서 슬롯마다 들어간 로봇을 확인합니다.
로봇 카드 아래의 구성 줄에는 왼팔 · 왼쪽 도구 · 오른팔 · 오른쪽 도구 · 하체 다섯 칸이 나란히 있고, 칸마다 들어간 로봇 이름이 표시됩니다. 빈 칸은 — 로 표시됩니다. 채워진 칸 오른쪽의 ✕ 를 누르면 그 칸에서만 로봇을 뺍니다. 휴머노이드처럼 여러 칸을 차지한 로봇도 ✕ 를 누른 칸에서만 빠지고 나머지 칸은 그대로입니다.
스크린샷 누락/docs/assembly/03-slots-row.png구성 줄 — 왼팔 · 왼쪽 도구 · 오른팔 · 오른쪽 도구 · 하체 다섯 칸에 들어간 로봇 이름, 빈 칸의 —, 채워진 칸의 ✕ 버튼
-
양팔이라면 같은 방식으로 반대편에도 팔을 끼웁니다.
같은 모델 두 대를 양팔로 쓸 수도 있고, 다른 회사 팔을 좌·우에 섞어도 됩니다. 시스템은 두 팔의 관측을 그대로 나란히 묶어서 한 Agent로 다룹니다.
스크린샷 누락/docs/assembly/04-dual-arms.png양팔 구성 — 두 단일 팔 카드에 각각 왼쪽 / 오른쪽이 선택되고 구성 줄의 왼팔 · 오른팔 칸이 채워진 모습
-
외부 그리퍼가 있다면 도구 카드를 클릭해 같은 쪽 슬롯에 끼웁니다.
그리퍼가 일체로 달려 있지 않은 팔(자체 그리퍼가 없는 매니퓰레이터)에 외부 그리퍼를 결합할 때 쓰는 절차예요. 예를 들어 좌측 팔에 외부 그리퍼를 붙이고 싶으면, 팔 카드의 왼쪽을 누른 뒤 그리퍼 카드의 왼쪽을 누르면 됩니다.
스크린샷 누락/docs/assembly/05-external-tool.png외부 그리퍼 결합 — 팔 카드와 도구 카드에 모두 왼쪽이 선택되고 구성 줄의 왼팔 · 왼쪽 도구 칸에 각각 다른 로봇이 들어간 모습
-
(이동 베이스) 이동 베이스 카드를 눌러 하체 슬롯에 넣습니다.
이동 베이스 카드를 누르면 하체 슬롯에 들어갑니다. 팔·도구를 넣은 Assembly에 이동 베이스를 더하면 팔과 베이스를 한 Assembly로 묶을 수 있고, 이동 베이스만 넣고 저장하면 베이스 한 대짜리 Assembly가 됩니다.
스크린샷 누락/docs/assembly/06-mobile-base.png이동 베이스 추가 — 하체 표시가 나타난 이동 베이스 카드와 구성 줄의 왼팔 · 왼쪽 도구 · 하체 칸이 채워진 모습
-
(휴머노이드) 휴머노이드 카드를 한 번 눌러 전신을 채웁니다.
휴머노이드는 몸 전체가 한 로봇이라 슬롯을 나눠 고르지 않습니다. 카드를 한 번 누르면 왼팔 · 오른팔 · 하체가 모두 그 휴머노이드로 채워지고, 손 관절이 있는 휴머노이드는 왼쪽 도구 · 오른쪽 도구까지 채워집니다. 그 슬롯에 있던 다른 로봇은 빠집니다. 두 팔을 쓰는 구성이라 양팔 (바이매뉴얼) 로봇처럼 Pro 이상에서 쓸 수 있습니다.
휴머노이드만으로 된 Assembly는 팔·도구를 따로 합칠 것이 없어서, 3D 조립 자리에 3D 화면 대신 "휴머노이드는 몸 전체가 한 로봇이라 팔·툴을 따로 합치는 3D 조립이 필요 없습니다." 안내가 표시됩니다.
이동 속도 명령 토픽과 이동 위치 토픽 중 하나라도 비어 있는 휴머노이드는 구성 줄 아래에 "이 휴머노이드는 이동 토픽이 없어 하체가 걷지 않습니다 — 로봇 편집에서 이동 속도 명령·위치 토픽을 넣으면 걷습니다." 안내가 표시됩니다. 두 토픽은 Custom Robot 등록 폼에서 입력합니다.
스크린샷 누락/docs/assembly/07-humanoid.png휴머노이드 전신 — 전신 (팔 · 손 · 하체) 표시가 나타난 sim_humanoid 카드, 구성 줄 다섯 칸 모두 sim_humanoid, 3D 조립 자리의 안내 문구
-
어셈블리 이름을 입력하고 저장을 누릅니다.
여기서 정한 이름이 이후 텔레오퍼레이션·워크스페이스 화면에서 그대로 보입니다. 작업/구성을 알아볼 수 있는 이름(
bimanual_piper,fairino_with_custom_gripper등)을 권장해요. 슬롯이 하나도 채워지지 않았으면 "어셈블리에 최소 한 부품을 포함해야 합니다." 안내가 뜨고 저장되지 않습니다.스크린샷 누락/docs/assembly/08-save.png새로 만들기 창 아래쪽 — 어셈블리 이름 칸에 이름을 입력하고 오른쪽 아래 저장 버튼을 누르는 모습
활성화 창에서 움직이기
저장한 Assembly는 로봇 → 어셈블리 화면에 카드로 나타납니다. 카드에는 left_arm · left_tool · right_arm · right_tool · mobile_base 줄마다 들어간 로봇 이름과 온라인 / 오프라인 표시가 있으며, mobile_base 줄이 하체 슬롯입니다. 카드의 활성화를 누르면 그 Assembly의 로봇들을 함께 움직이는 활성화 창이 열립니다. 활성화는 한 번에 한 Assembly만 할 수 있습니다.
-
Assembly에 든 로봇을 모두 켜고 카드의 활성화를 누릅니다.
하체 로봇을 포함해 Assembly에 든 로봇이 하나라도 꺼져 있으면 활성화되지 않고 "꺼져 있는 로봇이 있어 활성화할 수 없습니다: … — 로봇 탭에서 먼저 켜 주세요." 안내가 뜹니다. 로봇은 로봇 → 관리에서 켭니다.
스크린샷 누락/docs/assembly/09-card-mobile-base.png어셈블리 카드 — left_arm · left_tool · right_arm · right_tool · mobile_base 줄의 로봇 이름과 온라인 표시, 아래쪽 활성화 버튼
-
활성화 창의 로봇 목록에서 로봇 상태를 확인합니다.
활성화 창 위쪽의 로봇 목록에 Assembly에 든 로봇이 버튼으로 하나씩 나오며, 하체 로봇도 여기에 포함됩니다. 여러 슬롯을 차지한 휴머노이드는 한 번만 나옵니다. 버튼을 누르면 그 로봇을 켜고 끌 수 있고, 켜진 로봇은 초록색으로 표시됩니다.
키보드 텔레오퍼레이션 스위치는 하체를 포함한 모든 로봇이 켜져 있어야 켤 수 있습니다. 꺼진 로봇이 있으면 "어셈블리의 모든 로봇이 켜져 있어야 텔레오퍼레이션을 켤 수 있습니다." 안내가 표시되고, 텔레오퍼레이션 중에 로봇이 하나라도 꺼지면 텔레오퍼레이션도 꺼집니다.
스크린샷 누락/docs/assembly/10-window-robots.png활성화 창 — 로봇 목록에 팔 로봇과 하체 로봇 버튼(켜진 로봇은 초록색), 키보드 텔레오퍼레이션 스위치
-
키보드 텔레오퍼레이션을 켜면 Assembly 구성에 맞는 조작 패널이 열립니다.
- 팔·도구가 든 Assembly — 팔·도구 펜던트가 열립니다.
- 휴머노이드 Assembly — 휴머노이드 펜던트가 열립니다. 몸 지도에서 부위를 골라 관절을 움직이고, 이동 토픽이 있는 휴머노이드는 이동 칸으로 걷게 합니다. 사용법은 로봇 관리 탭의 휴머노이드 펜던트와 같습니다.
- 하체가 이동 베이스인 Assembly — 팔·도구 펜던트 아래(하체만 있는 Assembly는 그 자리)에 하체 · (로봇 이름) 제목과 주행 패널이 붙습니다. 제목 옆의 직진 속도 m/s (최대 …) / 회전 속도 rad/s (최대 …) 칸에 누를 때 보낼 속도를 넣고, 위치 (odom) 줄에서 x · y · yaw를 확인하며, 주행 줄(앞·뒤 (m/s), 회전 (rad/s), 옆으로도 움직이는 베이스는 옆 (m/s))과 정지 버튼으로 몹니다. 주행 줄은 누르고 있는 동안 움직이고 떼면 멈춥니다. 속도 값은 로봇 관리 탭의 이동 베이스 펜던트와 같은 값을 씁니다.
스크린샷 누락/docs/assembly/11-window-humanoid.png활성화 창 — 휴머노이드 Assembly에서 키보드 텔레오퍼레이션을 켠 뒤 열린 휴머노이드 펜던트(몸 지도 · 관절 칸 · 이동 칸)
스크린샷 누락/docs/assembly/12-window-base-only.png활성화 창 — 하체만 있는 Assembly의 하체 · sim_go2 주행 패널: 직진·회전 속도 입력, 위치 (odom) 줄, 양옆에 키가 표시된 주행 줄과 정지 버튼
-
팔과 하체가 함께 있으면 주행은 버튼으로 합니다.
팔(또는 도구)과 이동 베이스가 함께 든 Assembly에서는 키보드가 팔 조작에 쓰이므로 주행 패널이 키보드를 받지 않습니다. 주행 줄 양옆에 키가 표시되지 않고, 패널 아래에 "누르고 있는 동안 움직이고 떼면 멈춥니다. 키보드는 팔 조작에 쓰이므로 주행은 버튼으로 합니다." 안내가 나옵니다. 이때는 주행 줄의 + / − 버튼을 누르고 있는 동안 베이스가 움직입니다.
하체만 있는 Assembly는 키보드로도 주행합니다. W/S로 앞뒤, A/D로 회전하고(화살표 키도 같음), 옆으로도 움직이는 베이스는 Q/E로 옆으로 이동합니다. 주행 줄 양옆에 그 키가 표시됩니다.
스크린샷 누락/docs/assembly/13-window-arms-base.png활성화 창 — 팔·도구 펜던트 아래의 하체 · (로봇 이름) 주행 패널: 키 표시 없는 주행 줄과 '키보드는 팔 조작에 쓰이므로 주행은 버튼으로 합니다' 안내
등록 후 어떻게 쓰이나
Assembly가 만들어지면 시스템은 그 안의 로봇들을 다음과 같이 묶어 다룹니다.
- 관측(observation) — 모든 슬롯의 관절각·EE 자세·이미지가 일정한 순서로 합쳐져 정책 입력이 됩니다.
- 액션(action) — 슬롯별 명령이 같은 순서로 합쳐진 단일 액션 벡터로 출력되며, 시스템이 슬롯별로 분배해 각 로봇에 전달합니다.
- 텔레오퍼레이션 — 키보드·Easy Controller 모두 Assembly 단위로 켜집니다. 양팔이면 두 팔이 동시에 움직이고, 외부 그리퍼는 팔의 일부처럼 같이 따라옵니다.
- 데이터셋 — 한 에피소드의 모든 프레임은 Assembly의 관측·액션 벡터 형태로 저장돼요. 즉 같은 Assembly로 모은 데이터끼리만 학습이 호환됩니다.
이 일관성 덕분에 정책은 "팔이 두 대인지, 그리퍼가 외부인지" 신경 쓸 필요 없이 하나의 로봇을 학습한다고 가정하고 동작합니다.
다음 단계
Assembly가 만들어졌다면 텔레오퍼레이션으로 넘어가 EE 오프셋·키보드·Easy Controller를 설정하고 실제로 움직여 보세요. 그 다음 워크스페이스 만들기에서 이 Assembly를 골라 시연 데이터 수집을 시작합니다.