Booster T2와 SKIX 연동 설계
결론
namuh의 Android 실행 구조를 T2의 Ubuntu 환경으로 옮길 필요는 없다. 두 제품은 각자의 운영체제와 제조사 실행기를 유지하고, 기능 명세·작업 요청·상태·정책 요구·완료 근거만 공통 계약으로 맞추는 구성이 적합하다.
공통으로 맞출 것 Capability · Task · Workflow · State · Evidence · Reason
Android에 남길 것 AAR · Manager · Binder/AIDL · DeviceAgent · Android 제품 기능
T2에 남길 것 Booster Service · Booster SDK · ROS 2/DDS · 모터·센서 안전 제어
Booster SDK는 SKIX를 대체하는 상위 프레임워크가 아니라 T2 기능을 실행하는 공급자다. SKIX는 어떤 기능을 언제 누구에게 맡길지 관리하고, T2는 로봇 내부 동작과 즉시 안전 판단을 소유한다.
SKIX 공용 API를 ROS 2 Topic·Service·Action 자체로 정의하지 않는다. SKIX에는 제조사와 통신 방식에 독립적인 Robot Provider 계약을 두고, ROS 2와 Booster SDK는 그 계약을 구현하는 Adapter로 사용한다. 이 경계가 있어야 Booster가 아닌 로봇을 연결해도 상위 앱·제품 정책·TaskManager 계약을 유지할 수 있다.
상태 표기
- 공개 확인: Booster와 ROS 2의 공개 문서·저장소에서 확인된 기능
- SKIX 기준선: 현재 Android Manager/Binder/DeviceAgent 구조와 TaskManager 설계 기준
- 목표 설계: T2 구매 후 구현·검증해야 하는 교차 플랫폼 연결
1. T2에서 공개된 실행 구조
T2는 31자유도 휴머노이드 플랫폼이며, Education 모델은 ARM 기반 연산 장치, Pro 모델은 NVIDIA Jetson Thor T5000을 사용한다. 카메라·마이크 배열·스피커·IMU가 기본 사양에 포함되고 손 또는 그리퍼는 선택 구성이다.
공개 개발 구조는 세 층으로 읽는 것이 정확하다.
| 층 | 공개 인터페이스 | 주 용도 | SKIX에서의 위치 |
|---|---|---|---|
| 고수준 로봇 기능 | Booster Robotics SDK의 RPC Client, BoosterOS Python SDK | 보행, 자세, 동작, 음향, 카메라·Vision 등 의미 단위 기능 | T2 Domain Adapter가 우선 사용 |
| 연속 상태·저수준 제어 | ROS 2/DDS Topic | IMU, 관절, odometry, robot state와 고주기 제어 | State Adapter 또는 제한된 전문가 기능 |
| 로봇 내 앱 실행 | Booster Agent와 .agent 패키지 |
로봇 안에서 프로세스·UI·설정·리소스 운영 | 선택적 배포·운영 Host |
Booster 공식 구조에서는 ROS 2 응용 프로그램은 ROS 2 DDS를 사용하고, 비 ROS 응용 프로그램은 Booster Robotics SDK를 사용한다. 두 경로 모두 로봇의 같은 서비스 계층으로 연결된다. 따라서 모든 기능을 ROS 2 Topic으로 다시 포장하기보다, 의미 단위 기능은 고수준 SDK를 우선하고 고주기 관측만 DDS로 받는 것이 안정적이다.
1.1 운영체제와 ROS 2의 관계
T2를 ROS 기반 운영체제라고 부르면 계층이 섞인다. 공개 문서로 확인되는 구조는 다음과 같다.
| 계층 | T2에서의 역할 |
|---|---|
| Ubuntu/Linux | 프로세스, 파일, 네트워크, 장치와 기본 운영 환경 |
| Booster Service | 로봇 기능과 상태를 제공하는 제조사 서비스 계층 |
| ROS 2/DDS | Topic 중심 상태 스트림과 저수준 인터페이스를 연결하는 미들웨어 |
| Booster C++/Python SDK | Booster Service의 고수준 기능을 호출하는 개발 API |
| 응용 프로그램 | 제조사 SDK나 ROS 2를 선택해 사용하는 로봇 앱 |
즉 운영체제는 Ubuntu/Linux이고, ROS 2는 그 위에서 동작하는 로봇 통신·실행 미들웨어 중 하나다. Booster SDK RPC와 ROS 2/DDS는 같은 제조사 서비스에 접근하는 병렬 경로이며, 어느 한쪽이 다른 쪽 전체를 대체하지 않는다.
1.2 공개 개발 문서가 제공하는 연결 지점
Booster 공개 개발 자료는 하나의 SDK가 아니라 목적이 다른 네 가지 연결 지점을 제공한다.
| 연결 지점 | 제공 범위 | SKIX 적용 위치 |
|---|---|---|
| Booster Robotics C++ SDK | 고수준 RPC, DDS Topic, Controller Wrapper, IDL과 오류 코드 | T2 Gateway의 기본 실행 Adapter |
| BoosterOS Python SDK | 상태 조회·구독, 동작 제어, 비동기 TaskHandle, Audio, 선택적 Vision·Speech |
빠른 검증, 비동기 작업 연결, 선택 기능 Adapter |
| Booster Agent Framework | 로봇 내 UI, 설정, 상태, 저장소, Agent 생명주기 | T2 내부 관리·진단 앱이 필요할 때 선택 적용 |
| 공개 ROS 2·학습·배포 자원 | ROS 2 메시지, 시뮬레이션, 학습 정책과 배포 도구 | 연구·시뮬레이션·고주기 상태 연동에 제한 적용 |
제품 실행의 기본 경로는 고수준 C++ RPC 또는 Python Task API다. DDS Topic은 연속 상태와 전문가 제어에 사용하고, Agent Framework는 장시간 실행을 직접 붙잡는 계층이 아니라 로봇 내부 앱의 UI·설정·상태 표시 계층으로 사용한다.
공개 범위에서 확인된 기능
| 기능군 | 확인된 공개 범위 | 도입 판단 |
|---|---|---|
| 이동·자세·동작 | 모드 전환, 속도 명령, 사전 정의 동작, 궤적 실행 API | 고수준 SDK부터 연결 |
| 상태 관측 | IMU, 관절, odometry, battery, robot state 구독 | 공통 StateSnapshot으로 정규화 |
| 카메라·Vision | 이미지 취득과 Vision/Camera Client | 원본 영상과 의미 관측의 권한을 분리 |
| 음향 | AudioManager와 음향 관련 Python API | 재생·중지·완료 결과를 Evidence로 변환 |
| 비동기 작업 | Python TaskHandle의 상태, 대기, 취소, 완료 callback |
SKIX Child Task와 연결 가능 |
| ROS 2 연동 | 상태·제어 message/service/action 저장소 공개 | 고주기·연구 기능에 제한 적용 |
공개 자료만으로 확정하면 안 되는 항목
- Python SDK 개요는 T2를 지원 모델로 표시하지만, 일부 공개 저수준 관절 표와
booster_assets는 T1/K1 중심이다. - T2에는 손 유도 궤적, 자동 축구 동작, 음성 물리 스킬 등 일부 미지원 항목이 별도로 표시돼 있다.
- 실제 구매 형상의 firmware, 31자유도 joint map, URDF, hand/gripper, simulator와 Agent 배포 권한은 계약별로 달라질 수 있다.
따라서 모델명만 보고 Capability를 고정 등록하지 않는다. 부팅 시 모델·firmware·설치 모듈·실제 API 응답을 확인해 해당 기기에서 검증된 기능만 활성화해야 한다.
2. 연동 방식 비교
| 방식 | 구조 | 장점 | 한계 | 판단 |
|---|---|---|---|---|
| Android 구조 전체 이식 | DeviceAgent와 Android 실행 구조를 T2 Ubuntu로 포팅 | 겉보기 API가 같아짐 | Binder/AAR·Android 생명주기 의존을 다시 구현하고 제조사 안전 경계를 침범 | 제외 |
| T2 SDK 직접 사용 | 각 앱과 상위 서비스가 Booster SDK/ROS 2를 직접 호출 | 초기 시연이 빠름 | 앱마다 정책·상태·취소·오류 해석이 달라지고 공급사 API가 제품 전체로 누출 | 단기 실험만 허용 |
| 공통 계약 + OS별 Adapter | SKIX 공통 계약 아래 Android와 T2 실행기를 분리 | 기존 Android 보존, T2 안전 경계 보존, 시험·교체·확장 용이 | 계약과 Adapter를 추가로 구현해야 함 | 권장 |
권장안의 핵심은 코드를 하나로 만드는 것이 아니라 같은 의미와 결과를 공유하는 것이다. Android의 AAR/Binder와 T2의 SDK/ROS 2는 다른 구현이어도 같은 TaskState와 Evidence를 반환할 수 있다.
2.1 범용 ROS 인터페이스를 SKIX에 직접 노출할 것인가
| 선택 | 장점 | 구조적 문제 | 판단 |
|---|---|---|---|
| SKIX API를 ROS 2로 통일 | ROS 개발 도구와 기존 패키지를 빠르게 활용 | Android 앱까지 Topic·QoS·Action 이름과 ROS 배포에 의존 | 연구 도구와 로봇 내부 연동에 한정 |
| 공급사 SDK를 앱에 직접 노출 | 초기 PoC가 빠름 | Booster 함수명·오류·수명주기가 제품 전체로 확산 | 실험용 |
| SKIX Robot Provider + ROS/SDK Adapter | 상위 계약을 유지하면서 공급사별 최적 API 선택 | Adapter와 계약 시험이 필요 | 제품 기준안 |
ROS 2의 Topic, Service, Action 구분은 Provider 내부에서 그대로 활용할 가치가 있다. 다만 SKIX Client가 호출하는 것은 mobility.move_to, motion.perform_action, state.observe 같은 제품 의미여야 한다. 실제 Provider는 기능별로 ROS 2 Action, ROS 2 Service, DDS Topic 또는 Booster SDK RPC 중 적합한 경로를 선택한다.
3. 권장 전체 구조
이 그림은 namuhX의 응용 계층·AOSP 표준 API·SKIX 제품 Runtime과 A1·Booster 실행면을 하나의 목표 구조로 연결한다. A1과 Booster는 각자의 기기 정책과 실시간 안전 책임을 유지하고, SKIX에는 제품 의미의 기능·작업·상태·완료 근거만 노출한다.
이 구조에서 A1 리팩터링은 Booster용 직접 의존성을 추가하는 작업이 아니다. 공통 Runtime과 작업 생명주기를 유지하고, Android의 DeviceAgent와 T2의 Booster Service를 각각 독립 Provider로 연결하는 확장이다. 그림의 녹색 상태는 현재 소스에 반영된 공통 Runtime 기준선이고, 주황색 상태의 Provider SPI·공통 schema·구체 Adapter·적합성 시험은 후속 구현 범위다.
3.1 공통 계약 계층
| 계약 | 포함할 정보 | 포함하지 않을 정보 |
|---|---|---|
CapabilityDescriptor |
기능 ID, 입력·출력 schema version, 필요 자원, 선행 조건, 취소·완료 방식 | Binder class, ROS Topic 문자열, 공급사 내부 함수명 |
TaskRequest |
task ID, capability ID, 인자, deadline, 호출자, 안전 문맥 | 관절 번호와 제어 주기 같은 저수준 구현 |
WorkflowRequest |
단계, 의존 관계, 실패 정책, 보상 단계 | 로봇 내부 실시간 제어 loop |
StateSnapshot |
위치·자세·모드·배터리·연결·활성 작업, 출처, 관측 시각 | 출처와 시각이 없는 추정값 |
EvidenceRecord |
접수·진행·도착·완료·실패를 증명한 사건과 correlation key | TTS 응답만으로 만든 임의 완료 |
Reason |
차단·거부·실패·timeout 사유와 재시도 가능 여부 | 공급사 오류 문자열의 무가공 노출 |
공통 계약은 Protobuf/IDL 또는 동등한 schema 원본에서 Java/Kotlin·C++·Python 타입을 생성하는 방식이 적합하다. AAR은 Android Client 배포 수단으로 유지하되, 교차 플랫폼 계약 자체를 Android Bundle에 묶지 않는다.
3.2 OS별 실행 경계
Android namuh
SKIX Manager AAR → Binder/AIDL → SKIX Runtime/DeviceAgent → Android Domain Executor
Booster T2
SKIX T2 Gateway → Booster SDK RPC / ROS 2 Adapter → Booster Service → Robot Hardware
T2 Gateway는 공급사 API를 공통 Capability로 번역한다. mobility.velocity는 Booster의 속도 명령으로 직접 대응할 수 있지만, mobility.move_to는 이름이 붙은 목적지·자기 위치·경로 계획·도착 판정이 필요하므로 공개 속도 API 하나만으로 구현됐다고 보면 안 된다. 별도의 위치 추정·Navigation Provider가 있을 때만 Capability를 활성화한다. SDK의 진행 상태·odometry·TaskHandle 결과는 공통 TaskEvent로 올린다.
3.3 통신 선택
| 경계 | 권장 통신 | 이유 |
|---|---|---|
| Android 앱 ↔ Android Runtime | Binder/AIDL | 호출자 UID·죽음 감지·제품 권한과 기존 구조 활용 |
| T2 Gateway ↔ T2 Runtime | Booster SDK RPC, ROS 2/DDS | 제조사가 제공하는 로봇 내부 상태·제어 경로 유지 |
| namuh/상위 Runtime ↔ T2 Gateway | gRPC/Protobuf 기반 로컬 네트워크 계약 | typed schema, 양방향 진행 event, timeout·version 관리 |
| Cloud ↔ 제품 Runtime | 기존 MQTT 또는 HTTPS | 비동기 명령·상태 동기화에 사용하되 저수준 제어는 금지 |
ROS 2 Topic을 외부 앱에 직접 공개하지 않는다. Topic 이름·QoS·joint layout 변경은 T2 Adapter 안에서 흡수하고, 외부에는 안정된 Capability와 Task 상태만 제공한다.
3.4 Robot Provider 계약
Provider는 ROS 2를 감추기 위한 단순 Wrapper가 아니다. 현재 로봇이 실제로 할 수 있는 기능을 발견하고, SKIX Task를 공급사 실행 요청으로 변환하며, 상태와 완료 근거를 공통 의미로 되돌리는 실행 경계다.
discoverCapabilities() 모델·firmware·설치 모듈 기준 실제 지원 기능 조회
getStateSnapshot() 위치·자세·모드·배터리·안전 상태의 최신본 반환
submitTask(TaskRequest) 공통 Task를 공급사 SDK·ROS 2 요청으로 변환
observeTask(taskId) 진행·보류·완료·실패와 근거를 연속 전달
cancelTask(taskId, reason) 공급자 작업 취소 후 안전한 종료 상태 확인
reconcile(taskId) 연결 복구 뒤 공급자 상태와 SKIX 상태 재조정
다른 제조사를 추가할 때 상위 TaskManager를 수정하는 대신 새 Provider가 이 계약을 구현한다. 모든 로봇이 같은 기능을 가진다고 가정하지 않고, 부팅·연결 시점에 확인된 Capability만 Registry에 등록한다.
3.5 Android/AOSP를 제품 제어면으로 유지하는 이유
Android는 T2의 보행 제어기를 대신하기 위한 선택이 아니다. 사용자·앱·Cloud와 로봇 실행부 사이에서 제품 수명주기와 서비스 경험을 안정적으로 운영하는 제어면으로 가치가 있다.
| Android/AOSP 기반 | SKIX에서 활용할 가치 |
|---|---|
| 앱 프로세스·UID Sandbox·권한 | 시스템 앱, 파트너 앱, 일반 앱의 기기 제어 범위를 분리 |
| Binder/AIDL과 Service 생명주기 | 프로세스가 달라도 typed API, 호출자 식별, 연결 죽음 감지 제공 |
| Activity·Service·Broadcast·Notification | 화면이 없어도 실행되는 서비스와 사용자에게 보이는 진행 UX를 분리 |
| Camera·Audio·Media·Bluetooth·Network Framework | 사용자 접점 기능을 검증된 Android API와 권한 체계로 운영 |
| 전원·백그라운드 실행 정책 | 화면, 음성, 네트워크와 장기 작업의 자원 사용을 제품 정책으로 조정 |
| APK 서명·SELinux·Verified Boot | 앱과 시스템 이미지의 신뢰 경계를 제품 배포 체계에 연결 |
| OTA와 A/B 복구 | 현장 업데이트 실패 시 이전 부팅 가능한 형상으로 복구하는 운영 기반 제공 |
| Jetpack 기반 UI·상태 관리 | 런처, PUI, 설정, 관제 UI를 같은 생명주기와 개발 규칙으로 유지 |
따라서 권장 구조는 Android 또는 ROS 2의 선택이 아니다. Android/SKIX는 제품 앱·정책·Task·관측을 관리하고, T2의 Ubuntu/Booster Runtime은 로봇 실행과 실시간 안전을 담당한다. 로봇이 바뀌면 Provider를 교체하고, 사용자 경험과 제품 운영 계층은 유지한다.
4. 작업 위임과 완료 판단
여러 기기를 묶는 Workflow와 로봇 내부의 물리 실행은 소유 범위가 다르다. 상위 TaskManager가 전체 순서를 관리하고, T2 Gateway와 제조사 Runtime이 한 단계의 실제 실행을 관리한다.
예시: T2가 거실로 이동해 사람을 향해 안내하고, namuh가 공기질을 확인한 뒤 결과를 화면에 표시
- 상위 Workflow가 T2 이동, namuh 상태 조회, 안내와 화면 표시의 의존 관계를 만든다.
- T2 이동 단계는
childTaskId와 함께 T2 Gateway에 위임한다. - Gateway는 현재 모드와 SDK 지원 여부를 확인하고 제조사 고수준 API를 호출한다.
accepted,running,feedback,succeeded/failed/cancelled를 같은 correlation key로 반환한다.- 상위 Workflow는
movement.arrived근거를 받은 뒤에만 다음 단계를 연다. - 연결이 끊기면 성공으로 추정하지 않고
UNKNOWN/RECOVERY_REQUIRED로 보류한 뒤 재조회한다.
ROS 2 Action이 장시간 동작에 Goal·Feedback·Result·Cancel을 제공하고, Booster Python SDK의 TaskHandle이 상태·대기·취소·완료 callback을 제공한다는 점은 이 경계와 잘 맞는다. 다만 두 상태 체계를 그대로 외부에 노출하지 않고 SKIX 상태로 정규화해야 한다.
권장 상태 대응
| 공급자 상태 | 공통 Task 상태 | 필요한 근거 |
|---|---|---|
| 요청 수신 전 | SUBMITTED |
상위 request ID 생성 |
| SDK/Action 수락 | ADMITTED 또는 RUNNING |
vendor handle·goal ID 확보 |
| 진행 callback | RUNNING |
progress와 최신 관측 시각 |
| 성공 결과 | SUCCEEDED |
capability별 terminal evidence |
| 명시 취소 | CANCELLED |
취소 수락과 안전 정지 확인 |
| 오류 결과 | FAILED |
정규화된 reason과 원본 vendor code |
| 연결 단절 | UNKNOWN 또는 RECOVERY_REQUIRED |
재연결 후 handle·robot state 재조정 필요 |
4.1 SKIX Task의 적정 크기
SKIX TaskManager는 관절이나 모터의 순간 제어를 관리하지 않는다. 외부 호출자가 의미를 이해할 수 있고, 독립적으로 취소할 수 있으며, 시작부터 종료까지 상태와 완료 근거를 추적할 수 있는 행동 단위를 관리한다.
| 계층 | 예시 | 관리 주체 | 일반적인 시간 범위 |
|---|---|---|---|
| 목표 | 사용자를 맞이한다, 주변을 확인한다 |
제품 시나리오 또는 선택적 Planner | 수십 초~수 시간 |
| Workflow | A로 이동 → 안내 → 복귀 |
SKIX TaskManager | 수십 초~수십 분 |
| Task | MoveTo(A), PerformAction, CaptureObservation |
SKIX TaskManager와 실행 Provider | 수 초~수 분 |
| 로봇 Action | 경로 추종, 보행 시작·정지, 자세 전환 | T2 Gateway와 Booster Runtime | 수백 ms~수 초 |
| 제어 Loop | 균형 보정, 관절 위치·토크, 충돌 회피 | T2 내부 제어기 | 수 ms |
MoveTo(A)처럼 한 문장으로 표현되는 단일 행동도 SKIX Task가 될 수 있다. 중요한 기준은 크기가 아니라 생명주기·취소·자원·완료 근거를 외부에서 관리할 가치가 있는가다. 반대로 보행 중 발목 각도를 조정하거나 매 제어 주기마다 균형을 보정하는 일은 T2 내부 구현이며 SKIX Task로 만들지 않는다.
4.2 센서·단발 이벤트가 발생했을 때
센서 이벤트의 처리 위치는 이벤트 종류가 아니라 영향 범위로 결정한다. 동일한 목표와 완료 조건 안에서 실행 방법만 조정할 수 있으면 T2가 즉시 처리한다. Task 상태나 Workflow 순서가 바뀌면 SKIX가 결정하고, 사용자 목표 자체를 다시 해석해야 하면 상위 Planner 또는 제품 시나리오로 올린다.
| 이벤트와 영향 | 최초 처리 | SKIX에 전달할 정보 | 상위 결정 필요 여부 |
|---|---|---|---|
| 보행 중 작은 미끄러짐을 균형 제어로 복구 | T2 실시간 제어기 | 필요하면 진단 통계만 전달 | 없음 |
| 이동 경로의 일시 장애물을 우회해 같은 A에 도착 | T2 이동 실행기 | 진행률·경로 변경·최신 위치 | 없음. 같은 Task 범위 |
| 사람이 갑자기 진입해 안전 정지 | T2가 즉시 정지 | PAUSED/WAITING, 감지 시각, 안전 사유 |
SKIX가 재개·timeout·취소 결정 |
| 낙상 또는 E-stop | T2 안전 계층 | FAILED/PAUSED, 자세, 원본 오류, 복구 가능 여부 |
SKIX가 후속 Task를 막고 복구 흐름 결정 |
| 카메라 관찰에서 대상 미발견 | T2가 관찰 Task 종료 | NOT_FOUND 근거와 관측 범위 |
SKIX가 재시도·다른 위치·종료 결정 |
| 저전력 경고지만 즉시 위험하지 않음 | T2 상태 감지 | 배터리 값·threshold·freshness | SKIX Policy가 현재 Task 지속 또는 복귀 결정 |
| 임계 저전력·열·구동 안전 한계 | T2가 로컬 안전 동작 우선 | 실제 중단 상태와 안전 사유 | SKIX는 결과를 수용하고 Workflow 정리 |
| 사용자가 목적지를 변경 | 입력 채널이 SKIX에 전달 | 현재 Task와 새 요청의 관계 | Planner 또는 제품 로직이 목표·Workflow 갱신 |
T2가 로컬에서 바꿀 수 있는 범위는 Task 계약의 실행 허용 범위 안이다. 예를 들어 A로 이동에서 장애물을 피해 경로를 바꾸는 것은 가능하지만, 장애물이 있다는 이유로 목적지를 B로 바꾸거나 다른 행동을 추가하면 안 된다. 계약 밖의 변경이 필요하면 NEEDS_DECISION과 근거를 올리고 현재 작업을 안전 상태로 보류한다.
4.3 상태 환류 계약
T2가 이벤트를 흡수했더라도 상위에서 알아야 하는 상태는 정규화해 전달한다.
TaskEvent
task_id / attempt_id / provider_task_id
state: RUNNING | PAUSED | WAITING | SUCCEEDED | FAILED | CANCELLED | UNKNOWN
progress
reason_code / retryable
observation: source / timestamp / freshness
evidence: position / mode / safety_state / terminal_result
연속 센서 원본을 모두 SKIX로 올리는 것이 아니라, 상태 판단에 필요한 요약과 근거를 보낸다. 고주기 원본은 T2 내부에서 처리하고, SKIX StateMirror에는 현재 실행을 판단할 수 있는 최신본만 유지한다. 장애 분석이 필요할 때는 correlation key로 T2 원본 로그를 조회한다.
4.4 이 구조의 장점과 비용
| 구분 | 효과 | 함께 관리할 비용 |
|---|---|---|
| 안전과 지연 | 균형·충돌·E-stop을 T2 내부에서 즉시 처리 | 로컬 판단과 상위 상태의 동기화 필요 |
| 제품 API 안정성 | 앱은 Booster 함수나 ROS Topic 대신 SKIX Capability를 사용 | Adapter와 schema version을 지속 관리 |
| 플랫폼 확장 | Android namuh와 Ubuntu T2가 같은 Task·Evidence 의미를 공유 | OS·firmware·모델 조합별 계약 시험 증가 |
| 실행 일관성 | Workflow 순서·취소·timeout·완료를 SKIX에서 한 방식으로 관찰 | 상위 Task와 공급자 Task의 이중 상태 대응 필요 |
| 공급사 독립성 | 공급사 API 변경을 T2 Adapter 안에서 흡수 | 신규 기능마다 Capability와 Evidence 정의 필요 |
| 장애 복구 | 연결 단절 시 성공을 추정하지 않고 재조정 가능 | task ID·attempt ID·vendor handle 보존 필요 |
| 관측성 | 요청부터 물리 결과까지 같은 correlation으로 추적 | 로그·시간 동기화·보존 정책이 필요 |
가장 큰 위험은 SKIX와 T2가 같은 결정을 동시에 소유하는 것이다. 이를 방지하려면 다음 원칙을 고정한다.
- T2는 즉시 안전과 동일 Task 안의 실행 적응을 소유한다.
- SKIX TaskManager는 Task 생명주기, 자원 충돌, Workflow 순서와 재시도를 소유한다.
- Planner 또는 제품 시나리오는 목표 해석과 Task 구성 변경을 소유한다.
- 로컬에서 처리한 사건도 상위 판단에 영향을 주면 출처·시각·근거와 함께 보고한다.
- 연결 단절 상태에서는 어느 계층도 성공을 추정하지 않는다.
5. 안전·모드·자원 정책
T2는 DAMP, PREP, WALK 등 상태 전이 제약을 가지며, DAMP에서 WALK로 바로 이동할 수 없는 것처럼 제조사 모드 규칙이 있다. SKIX가 이를 우회하면 안 된다.
SKIX 사전 판단 호출자 권한 · 제품 정책 · 작업 충돌 · 사용자 동의
T2 Gateway 판단 capability 지원 · firmware · 현재 모드 · 연결 freshness
T2 최종 판단 로봇 자세 · 균형 · 충돌 회피 · E-stop · 저수준 안전 한계
최종 실행 가능 여부는 세 판단을 모두 통과해야 한다. 상위에서 승인됐다는 이유로 T2의 거부를 성공으로 바꾸지 않으며, T2의 로컬 E-stop과 damping mode는 항상 우선한다.
공유 자원은 최소한 다음 단위로 충돌을 관리한다.
| 자원군 | 충돌 예시 | 원칙 |
|---|---|---|
locomotion |
보행과 다른 전신 동작 동시 실행 | 한 실행 주체만 소유 |
whole_body_action |
춤·기상 동작과 이동 | 동작 명세의 양립 가능성 확인 |
left_arm / right_arm |
양팔 동작과 hand/gripper 제어 | 장착 형상별 Capability로 구분 |
head / vision |
시선 제어와 카메라 관찰 | 원본 영상 권한과 자세 자원을 함께 검사 |
audio |
안내 음성, 미디어, 긴급 경고 | 긴급 경고 우선순위 보장 |
control_mode |
WALK·custom joint control 전환 | 저수준 제어는 격리된 전문가 기능만 허용 |
Cloud나 Android에서 joint command를 Wi-Fi로 연속 전송하는 구조는 채택하지 않는다. 제어 주기와 안전 제한이 필요한 loop는 T2 내부에서 닫고, 외부는 목표·제약·취소만 전달한다.
6. Booster 공개 API와 SKIX 연결 범위
Booster Developer Guide의 공개 범위는 넓지만, API가 존재한다는 사실과 T2 납품 형상에서 실행 가능하다는 사실은 구분해야 한다. SKIX는 공개 API를 그대로 복제하지 않고, 제품에서 재사용할 의미 단위만 Capability로 등록한다.
6.1 C++ 고수준 RPC
| 기능군 | 공개 Client·API | 확인 가능한 기능 | SKIX 연결 판단 |
|---|---|---|---|
| 연결·공통 오류 | ChannelFactory, Init, WaitForService, RPC status code |
로봇 선택, 서비스 준비, timeout·conflict·state-transition 오류 | Gateway 공통 연결·Reason 변환에 사용 |
| 로봇 정보 | GetRobotInfo, GetMode, GetStatus |
모델·serial·firmware·현재 mode·body control·active action | Capability 활성화와 StateSnapshot의 필수 입력 |
| 장착 정보 | GetSensors, GetHands, GetRobotModel, GetCameras |
IMU·손·URDF/RBDL·카메라 목록 | 모델명이 아니라 실제 장착 형상으로 기능 등록 |
| 모드·기상 | ChangeMode, GetUp, GetUpWithMode |
damping·prepare·walking·custom 전환과 기상 | 제조사 상태 전이 순서를 그대로 준수 |
| 속도·보행 | Move, MoveCommand, SwitchGait, ResetOdometry |
X/Y 선속도, yaw 속도, gait 전환, odometry 초기화 | 로컬 이동 실행에 사용. 장소 기반 이동과는 구분 |
| 머리 자세 | RotateHead, RotateHeadWithTime, RotateHeadWithDirection |
pitch·yaw와 도달 시간·방향 제어 | head.pose.set 후보. Vision과 자원 충돌 관리 |
| 사전 동작 | WaveHand, Handshake, WholeBodyDance, Shoot, VisualKick |
손인사·악수·전신 동작·킥 | 설치 motion과 현재 mode를 확인한 목록만 등록 |
| 상체·궤적 | UpperBodyCustomControl, LoadCustomTrainedTraj, ActivateCustomTrainedTraj, UnloadCustomTrainedTraj |
상체 사용자 제어와 ONNX 기반 학습 동작 | 전문가 기능으로 격리. T2 지원 범위를 실기기 검증 |
| 손·그리퍼 | MoveHandEndEffectorV2, MoveDualHandEndEffector, ControlGripper, ControlDexterousHand |
말단 위치, 양손, 그리퍼, 손가락 제어 | 공개 지원표가 K1/T1 중심이므로 T2 기본 Capability에서 제외 |
| AI·LUI | StartAiChat, StopAiChat, Speak, StartFaceTracking, StartAsr, StopAsr, StartTts, SendTtsText, StopTts |
대화·발화·얼굴 추적·ASR·TTS 세션 | 하드웨어·네트워크·개인정보 조건을 확인한 선택 기능 |
| Vision | StartVisionService, GetDetectionObject, StopVisionService |
객체 검출 세션과 class·confidence·bounding box | 관찰 Task와 Evidence로 연결 |
| 손-눈 보정 | StartCalibration, GetStatus, GetResult, ApplyResult, StopCalibration |
보정 시작·상태·결과·적용 | 일반 제품 API가 아닌 서명된 정비 기능 |
| Camera | CameraClient.GetCameras, X5 ChangeMode, GetStatus |
카메라 목록과 normal·high-resolution mode | 실제 X5 장착 형상과 firmware 확인 후 등록 |
| Lighting | SetLEDLightColor, SetLEDLightColors, StopLEDLightControl |
단일·다중 RGB 설정과 제어 해제 | 상태 표현 정책을 거친 light.scene.set 후보 |
Move와 MoveCommand는 장소 이름이나 지도 좌표로 이동하는 API가 아니라 속도 명령이다. 반면 C++ MoveController는 odometry를 이용해 MoveToTarget, MoveToRelative, TurnAround, Stop을 제공한다. 이것도 지도·경로 계획·장애물 회피가 포함된 Navigation은 아니므로, mobility.move_to는 별도 Navigation Provider와 도착 근거가 있을 때만 활성화한다.
6.2 Audio API
| 객체 | 주요 API | 용도와 완료 판단 |
|---|---|---|
AudioManager |
Init, Shutdown, CreatePlayer, CreateRecorder, CreateCaptureStream, CreateLocalizer |
Audio runtime과 하위 세션의 생명주기 관리 |
| 시스템·장치 | Set/GetSystemVolume, Set/GetSystemMute, GetDevices |
전역 음량·mute와 입출력 장치 조회 |
| Bluetooth | Start/StopBluetoothScan, GetBluetoothDevices, Connect/DisconnectBluetoothDevice |
검색·연결·해제 상태를 callback 또는 조회로 확인 |
AudioPlayer |
Init, Start, Pause, Stop, Reset, Destroy, PushPcmStream |
파일·PCM 재생. state·progress·completion·error callback을 Evidence로 사용 |
AudioRecorder |
Init, Start, Pause, Stop, Destroy, GetInfo |
녹음 파일이 마감된 뒤 완료 처리 |
AudioCaptureStream |
Init, Start, Pause, Stop, Destroy, SetFrameCallback |
raw·NAEC frame 수신. 장기 구독 자원으로 관리 |
AudioLocalizer |
GetDoaAngle |
마이크 배열 기반 음원 방향. 관측 시각과 장치 지원 여부 포함 |
Player·Recorder·CaptureStream은 서로 다른 세션이다. SKIX에서도 audio.play, audio.record, audio.capture, audio.direction.read로 분리해야 취소·권한·동시 사용 정책과 완료 근거가 명확해진다.
6.3 DDS와 ROS 형식 상태 Topic
| 범위 | 공개 Topic | SKIX 사용 원칙 |
|---|---|---|
| 저수준 상태·제어 | rt/low_state, rt/joint_ctrl |
관절·모터 상태 관찰이 기본. 직접 제어는 Custom mode의 전문가 기능으로 격리 |
| 안전·상태 | rt/fall_down, rt/robot_states, rt/prone_body_control_status |
낙상·mode·action 변화를 로컬에서 판정해 의미 이벤트로 올림 |
| 이동 상태 | rt/odometer_state, rt/odom, rt/tf |
위치·transform의 출처와 시각을 포함해 StateMirror 갱신 |
| 센서 | rt/imu/data, rt/joint_states |
고주기 원본은 T2 내부 소비, 상위에는 최신 요약과 이상 사건 전달 |
| 손·입력 | rt/booster_hand_data, rt/booster_hand_touch_data, rt/button_event, rt/remote_controller_state |
장착·입력 이벤트를 Capability 지원과 사용자 개입 근거로 사용 |
| 동작 상태 | rt/trained_traj_status, rt/robot_replay_traj_id, rt/robocup_behavior_status, rt/kick_ball |
모델별 지원 여부를 확인하고 Task 진행·종료 근거로 변환 |
| AI·LUI | rt/ai_subtitle, rt/lui_asr_chunk |
대화·ASR 결과 스트림. 사용자 데이터 정책을 적용 |
ROS 2 기준으로 Topic은 연속 상태, Service는 짧은 조회·설정, Action은 feedback·cancel·result가 필요한 장기 실행에 적합하다. SKIX Client에는 ROS 이름과 QoS를 노출하지 않고 Provider 내부 구현 선택으로 유지한다.
6.4 BoosterOS Python SDK
| 범위 | 공개 기능 | SKIX에서의 용도 |
|---|---|---|
| 연결 | BoosterRobot(...) |
물리·가상 로봇 연결. 로봇당 인스턴스 하나를 재사용해 다중 publisher 충돌 방지 |
| 정보·목록 | 로봇 정보, mode·gait·frame·joint·action 목록 | capability discovery와 입력 범위 구성 |
| 상태 snapshot | image·camera info·IMU·odometry·joint·battery·fall-down·transform 조회 | 출처·시각·freshness가 있는 StateSnapshot |
| 상태 구독 | image·IMU·odometry·battery·fall-down callback | 원본 스트림은 로컬에서 소비하고 의미 있는 변화만 StateEvent로 전달 |
| 동작 제어 | mode·gait·velocity·upper body·joint·head·odometry reset | 안전 등급과 현재 mode를 확인한 Provider 내부 실행 |
| 비동기 작업 | action·get-up·trajectory·play_sound |
TaskHandle의 상태·취소·완료를 SKIX Child Task로 연결 |
| Audio Manager | system volume, recording, stream playback | 제품 Audio Capability의 빠른 검증 경로 |
Vision Detection |
모델 목록·적재·객체 검출·결과 표시 | 선택 의존성과 추론 장치 확인 후 관찰 Capability로 등록 |
| Speech | 음성 인식·대화·voice 목록 | 물리 로봇과 Audio 서비스 확인 후 선택 등록 |
| Hand Guiding | 궤적 기록·재생 | T2 미지원이 명시돼 있으므로 등록 금지 |
| Soccer Kick Manager | 자동 킥 시작·명령 갱신·중지 | T2 미지원이 명시돼 있으므로 등록 금지 |
TaskHandle은 wait, cancel, done, running, 상태 변경 callback과 완료 callback을 제공한다. 공급사 상태를 그대로 노출하지 않고 provider_task_id, attempt_id, TaskEvent, terminal evidence로 정규화한다. DataNotReadyError는 값이 0이라는 뜻이 아니라 현재 채널에서 상태가 준비되지 않았다는 뜻이므로, 과거 값을 현재 상태로 대체하지 않는다.
6.5 Booster Agent와 공개 개발 자원
| 영역 | 공개 기능 | 연동 판단 |
|---|---|---|
| Agent 기본 클래스 | runtime 설정, 활성화·종료 callback, manager 접근 | 로봇 내부 앱의 생명주기 연결에 사용 가능 |
| UI Component | component 등록·갱신, page 전환, toast | T2 자체 화면·관리 UI가 필요할 때 선택 적용 |
| Parameter·Storage | 설정 읽기·쓰기·검증·변경 callback, Agent 저장소 | 제품 설정 schema와 충돌하지 않는 로컬 설정에 사용 |
| Robot State | Agent에서 집계 로봇 상태 조회 | SKIX StateSnapshot 보조 입력. 원본 출처 유지 |
| Joystick·Shortcut | 버튼 조합과 shortcut metadata | 현장 조작과 사용자 개입 사건으로 연결 가능 |
booster_gym·booster_train·booster_deploy·booster_assets |
학습·시뮬레이션·정책 배포·모델 자원 | 제품 runtime API가 아니라 연구·검증·동작 자산 공급 경로 |
Agent callback은 기본적으로 직렬 실행되므로 긴 작업을 callback 안에서 기다리면 안 된다. callback은 요청 접수와 상태 갱신만 수행하고, 장기 작업은 별도 worker나 SKIX/T2 Task 경로로 넘겨야 한다.
6.6 초기 Capability 등록안
| 공통 Capability | T2 실행 후보 | 입력 | 완료 근거 | 초기 등급 |
|---|---|---|---|---|
robot.info.read |
GetRobotInfo·GetRobotModel |
요청 필드 | model·firmware가 있는 snapshot | 읽기 전용 |
robot.state.observe |
Python subscription 또는 DDS Topic | 상태 종류·주기 상한 | source timestamp가 있는 최신본 | 읽기 전용 |
mobility.velocity |
Move 또는 MoveCommand |
선속도·각속도·지속 시간 | 정지와 최종 odometry | 제한 실행 |
mobility.move_to |
별도 Navigation Provider | 목적지·허용 구역·timeout | 도착 pose·허용 오차 | Provider 확인 전 비활성 |
head.pose.set |
RotateHead* |
pitch·yaw·duration | 최종 head pose | 안전한 단일 작업 |
motion.perform_action |
action RPC 또는 Python task | action ID·제약 | terminal result·최종 mode | 목록 기반 등록 |
perception.observe_object |
Vision Service 또는 제품 Vision | 관찰 대상·시간 제한 | class·confidence·frame provenance | 선택 모듈 |
audio.play |
AudioPlayer |
asset/stream·volume | completion/cancel/error callback | 안전한 단일 작업 |
audio.capture |
Recorder 또는 CaptureStream | 형식·기간·저장 정책 | 종료 상태·frame/file evidence | 동의·개인정보 필요 |
audio.direction.read |
AudioLocalizer.GetDoaAngle |
freshness | 각도·관측 시각 | 읽기 전용 |
light.scene.set |
LightControlClient |
RGB 또는 장면 ID | 적용 상태 또는 공급자 응답 | 제품 표현 정책 필요 |
Capability에는 provider, model, firmwareRange, resources, preconditions, cancelContract, evidenceContract를 둔다. 런타임에서 확인되지 않은 기능은 Planner와 앱의 선택 후보에 노출하지 않는다. 관절 직접 제어, 무제한 속도 스트림, calibration은 기본 Client API가 아니라 서명된 진단·전문가 권한으로 분리한다.
초기 연결 순서는 상태 조회 → Audio·LED·머리 자세 → 목록 기반 사전 동작 → 제한 이동 → Vision → 별도 Navigation이 적합하다. 손·관절·학습 궤적은 실제 T2 형상과 안전 시험이 끝난 뒤 별도 등급으로 연다.
7. 도입 단계와 통과 기준
1단계 · 구매 형상 확인
- T2 Education/Pro, hand/gripper, firmware와 개발 계정 권한을 확정한다.
- SDK·ROS 2·Agent·simulator의 T2 지원표와 31자유도 joint/URDF 자료를 공급사에 확인한다.
- E-stop, mode 전환, OTA, 로그 접근과 앱 서명·배포 조건을 확인한다.
통과 기준: 실제 납품 형상과 문서의 기능표가 일치하고, 미지원 기능이 명시돼 있다.
2단계 · 읽기 전용 Adapter
- model, firmware, mode, battery, IMU, odometry와 active task를
StateSnapshot으로 변환한다. - 각 값에 source, timestamp, freshness를 붙인다.
- 재부팅·네트워크 단절 뒤 과거 값을 현재 상태로 재사용하지 않는다.
통과 기준: 실기기와 simulator에서 상태 schema가 같고 stale 값이 차단된다.
3단계 · 안전한 단일 작업
- 자세 조회, audio, 정해진 action처럼 위험이 낮은 고수준 기능부터 연결한다.
- accepted·progress·cancel·terminal reason을 공통 TaskEvent로 변환한다.
통과 기준: 요청 ID 하나로 시작부터 terminal evidence까지 추적할 수 있다.
4단계 · 이동과 Workflow
- 이동·정지·취소·timeout을 연결하고 mode·resource admission을 적용한다.
- 상위 Workflow와 T2 Child Task의 재연결·중복 요청·취소 경쟁을 시험한다.
통과 기준: 단계 성공을 추정하지 않고 실제 근거 뒤에만 다음 단계가 열린다.
5단계 · 제품 시나리오
- namuh와 T2의 역할을 나눈 시나리오를 구성한다.
- 같은 요청을 simulator, 단일 T2, namuh+T2 환경에서 재생하고 계약 호환성을 검증한다.
통과 기준: 공급자 구현이 달라도 상위 Workflow와 관측 화면이 같은 상태 체계를 사용한다.
8. 공급사 확인 목록
| 확인 항목 | 필요한 답변 |
|---|---|
| 납품 형상 | Education/Pro, 연산 모듈, hand/gripper, sensor 구성 |
| firmware 호환 | SDK별 최소·권장 firmware와 장기 지원 기간 |
| T2 기능표 | RPC, Python, ROS 2, Agent, simulator별 지원·미지원 목록 |
| 로봇 모델 | 31자유도 joint map, URDF, TF tree, 좌표계와 단위 |
| 작업 제어 | 비동기 handle, progress, cancel, timeout, terminal reason 보장 |
| 안전 책임 | mode transition, E-stop, fall recovery, velocity/joint limit의 최종 owner |
| 배포 | Agent/package 서명, 권한, 자동 시작, OTA와 rollback |
| 연결 복구 | SDK handle 유효 범위, 재연결 후 상태·작업 재조회 방법 |
| 관측성 | request/goal ID가 포함된 로그, topic/RPC trace, 시간 동기화 |
| 보안 | 원격 접속, 인증서, 포트, ROS 2 DDS 보안과 카메라 데이터 정책 |
9. 현재 판단과 남은 검증
| 항목 | 현재 판단 |
|---|---|
| Android 기반 유지 | 앱 격리, Binder 서비스, UI·미디어·네트워크, 서명·권한, OTA를 포함한 제품 운영 제어면으로 유지한다. |
| T2 Ubuntu 기반 유지 | Booster Service·SDK·ROS 2와 실시간 안전 제어가 동작하는 로봇 실행면으로 유지한다. |
| 교차 플랫폼 SKIX | 공통 schema와 Adapter 구조로 가능하다. AAR 하나를 두 OS에 공통 적용하는 방식은 아니다. |
| 범용 ROS 연동 | ROS 2 자체를 SKIX 공용 API로 삼지 않고 Robot Provider의 선택적 구현 경로로 둔다. |
| TaskManager 연동 | 상위 Workflow와 T2 Child Task의 계층형 위임이 적합하다. 실제 T2 연결 구현은 남아 있다. |
| 저수준 제어 | T2 내부에 격리한다. 초기 제품 연동 범위에서 제외한다. |
| 실기기 검증 | 아직 수행하지 않았다. 구매 형상·firmware·SDK 권한 확정 후 검증해야 한다. |
Connections
-
부스터로보틱스 SDK 검토 자료 — SDK 구성·API·개발 환경과 지원 제약
- Resource·Capability·Task Runtime 상세 구조
- Request-to-Evidence 전체 흐름
- TaskManager 전체 사양
Sources
- Booster Developer Guide
- Booster T2 Overview
- Booster T2 Specifications
- Booster T2 Modes
- Booster Robotics SDK Architecture
- Booster Robotics SDK RPC Interfaces
- Booster Motion-Control Interfaces
- Booster C++ Controller Wrappers
- Booster C++ API Reference
- Booster Device Information Interfaces
- Booster AI and LUI Interfaces
- Booster Vision Interfaces
- Booster Camera Interfaces
- Booster Lighting Interfaces
- Booster Audio Module
- Booster Robotics SDK Low-Level Topics
- BoosterOS Python SDK Overview
- BoosterOS Python TaskHandle
- Booster Robot Development Protocol
- ROS 2 Interfaces: Topics, Services, Actions
- ROS 2 Actions
- AOSP Architecture Overview
- AOSP Binder Overview
- Android Application Sandbox
- AOSP A/B System Updates
- Booster Agent Overview
- Booster Agent API Overview
- Booster Robotics SDK ROS 2
- Booster Robotics SDK
- ROS 2 Managed Nodes