BEFORE
화면 선택이 작업 대상
선택한 로봇을 기준으로 모드를 전환하고 정지 대상을 찾음
01 / MULTI-ROBOT
화면 선택과 세션 참가 대상을 분리하고, 참가 목록·로봇 식별자를 기준으로 N대 확장을 고려한 구조를 개발했습니다.
Neuromeka 인턴 · 2025.12 ~ 2026.06
01 / Problem
독립된 제어기를 사용하는 Indy12 두 대를 하나의 세션에서 지원해야 했습니다. 기존 플랫폼에는 로봇을 여러 대 등록할 수 있는 부분이 있었지만, 실제 수집과 조작은 화면에서 선택한 한 대를 중심으로 동작했습니다.
두 대를 연결한 뒤 Collect에서 텔레오퍼레이션 모드로 전환했을 때, 선택된 로봇만 전환됐습니다. 저는 장비 연결보다 기존 기능이 무엇을 작업 대상으로 보고 있는지부터 확인했습니다.
02 / Investigation
Collect의 텔레오퍼레이션 진입 요청이 화면에서 선택된 로봇을 따라가고 있었습니다. 먼저 세션 전체를 대상으로 요청하도록 바꿨습니다.
진입 요청을 바꾼 뒤에도 idle 복귀에서는 화면의 단일 로봇 상태로 대상을 추정하고 있었습니다. Stop 역시 수집기의 단일 로봇 정보만 읽었습니다.
각 버튼을 따로 고치는 대신, “현재 화면 선택이 전체 작업을 대표한다”는 가정을 바꿔야 한다고 판단했습니다. 화면 선택과 실제 세션 참가 목록을 분리했습니다.
03 / Architecture
BEFORE
선택한 로봇을 기준으로 모드를 전환하고 정지 대상을 찾음
AFTER
화면은 한 대를 보더라도 Collect의 전환·정지는 세션 전체에 요청
세션 참가 목록과 순서를 기준으로 대상을 정하고, 수집 모드 전환과 정지 요청에서 같은 기준을 사용하도록 수정했습니다. 전환 도중 한 로봇이 실패하면 이미 전환된 로봇을 idle로 되돌리는 처리도 넣었습니다.
데이터에서도 비슷한 문제가 있었습니다. 저장 파일에는 두 손의 값이 있었지만 수집 계획과 일부 메타데이터는 선택된 한 로봇의 손만 설명했습니다. 참가 로봇 전체의 장치 목록으로 계획을 만들고, 로봇별 식별자와 순서를 수집·학습 산출물·추론 출력까지 유지하도록 처리했습니다.
두 대에 맞춘 호출을 하나 더 붙이는 대신, 참가 로봇 목록·로봇별 식별자·데이터 순서와 차원을 공통 기준으로 만들었습니다. 로봇 수가 늘어날 때도 이 기준으로 수집·학습·실행이 이어지도록 구성했습니다.
화면에서 선택한 한 대와 실제 작업 참가자를 분리했습니다. 모드 전환·복귀·정지는 참가 목록을 따라 처리해, 로봇별 호출을 두 대로 고정하지 않았습니다.
각 로봇과 장치의 식별자로 수집 계획과 저장 구조를 구성했습니다. 로봇이 추가되어도 상태·관절·그리퍼 데이터가 어느 로봇의 값인지 구분하도록 했습니다.
학습에 사용할 key 순서와 차원을 산출물에 보존하고, 추론 결과도 같은 기준으로 나누어 소속 로봇에 전달했습니다. 실행 전에는 학습 산출물과 참가 로봇 구성의 일치 여부를 확인했습니다.
추가 로봇은 등록 정보와 참가 목록, 수집·학습 입출력 구성에 반영하도록 했습니다. 로봇이 늘어날 때마다 별도의 처리 흐름을 만드는 대신, 목록과 메타데이터를 기준으로 확장하는 방식입니다.
04 / Validation
화면의 로봇을 바꿔도 수집 대상 두 대가 유지되는지, 세션 전체의 조작·정지 요청이 연결되는지 확인했습니다.
수집 파일·계획·메타데이터의 로봇과 장치 목록을 대조하고, 학습 입력과 추론 출력의 소속·순서를 구분해 검사했습니다.
기존 단일 로봇 데이터와 양팔 데이터의 해석 경로를 유지하고, 새 경로가 기존 의미를 덮어쓰지 않는지 확인했습니다.
독립 제어기 기반 로봇 두 대에서 모드 전환·정지와 데이터 소속·순서, 학습 입력과 추론 출력의 연결을 확인했습니다. 이 과정에서 참가 목록과 로봇별 메타데이터를 공통 기준으로 사용해, 이후 N대 확장에도 적용할 처리 구조를 정리했습니다.
05 / Takeaway