rainbow-rb-sdk 0.0.9.dev10__tar.gz → 0.0.9.dev12__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rainbow_rb_sdk-0.0.9.dev12/PKG-INFO +331 -0
- rainbow_rb_sdk-0.0.9.dev12/README.md +317 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/pyproject.toml +6 -6
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/base.py +28 -3
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_move.py +48 -2
- rainbow_rb_sdk-0.0.9.dev12/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_move_schema.py +40 -0
- rainbow_rb_sdk-0.0.9.dev12/src/rainbow_rb_sdk.egg-info/PKG-INFO +331 -0
- rainbow_rb_sdk-0.0.9.dev12/src/rainbow_rb_sdk.egg-info/requires.txt +6 -0
- rainbow_rb_sdk-0.0.9.dev10/PKG-INFO +0 -239
- rainbow_rb_sdk-0.0.9.dev10/README.md +0 -225
- rainbow_rb_sdk-0.0.9.dev10/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_move_schema.py +0 -19
- rainbow_rb_sdk-0.0.9.dev10/src/rainbow_rb_sdk.egg-info/PKG-INFO +0 -239
- rainbow_rb_sdk-0.0.9.dev10/src/rainbow_rb_sdk.egg-info/requires.txt +0 -6
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/setup.cfg +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_accessory.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_capability.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_control.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_file.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_localization.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_map.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_move.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_program.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_setting.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/amr_status.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/amr_sdk/schema/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/base_sdk/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/base_sdk/base_schema.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_config.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_get_data.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_io.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_maintenance.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_point.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_program.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_service.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_state.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/schema/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_config_schema.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_io_schema.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_program_schema.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/program_sdk/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/program_sdk/client_modules.pyi +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/program_sdk/program.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/program_sdk/program_interface.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/program_sdk/test_binding.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/rby1.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/rby1_sdk/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/rby1_sdk/base.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/rby1_sdk/client.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/rby1_sdk/config.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/rby1_sdk/control.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/rby1_sdk/exceptions.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/rby1_sdk/state.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/schema/__init__.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/schema/amr_schema.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/schema/base_schema.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/schema/manipulate_schema.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow/rb_sdk/schema/program_schema.py +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow_rb_sdk.egg-info/SOURCES.txt +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow_rb_sdk.egg-info/dependency_links.txt +0 -0
- {rainbow_rb_sdk-0.0.9.dev10 → rainbow_rb_sdk-0.0.9.dev12}/src/rainbow_rb_sdk.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rainbow-rb-sdk
|
|
3
|
+
Version: 0.0.9.dev12
|
|
4
|
+
Summary: Rainbow Robotics 통합 Python SDK — AMR, 매니퓰레이터, RB-Y1 휴머노이드와 Rainbow Robot Service(common) 연동
|
|
5
|
+
Author-email: Derek <dfd1123@rainbow-robotics.com>
|
|
6
|
+
Requires-Python: <3.13,>=3.12
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
Requires-Dist: rainbow-rb-utils==0.0.9.dev12
|
|
9
|
+
Requires-Dist: rainbow-rb-zenoh==0.0.9.dev12
|
|
10
|
+
Requires-Dist: rainbow-rb-flat-buffers==0.0.9.dev12
|
|
11
|
+
Requires-Dist: rainbow-rb-schemas==0.0.9.dev12
|
|
12
|
+
Requires-Dist: rainbow-rb-log==0.0.9.dev12
|
|
13
|
+
Requires-Dist: rby1-sdk>=0.9.1
|
|
14
|
+
|
|
15
|
+
# rb_sdk
|
|
16
|
+
|
|
17
|
+
Rainbow Robotics 통합 Python SDK. AMR · Manipulator · RB-Y1 양팔로봇 제어와 Rainbow Robot Service(common) 연동을 단일 API로 제공합니다.
|
|
18
|
+
|
|
19
|
+
## 진입점
|
|
20
|
+
|
|
21
|
+
| 클래스 | 용도 |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `RBAmrSDK` | AMR(자율 주행) 로봇 제어 |
|
|
24
|
+
| `RBManipulateSDK` | 협동 로봇 매니퓰레이터 제어 |
|
|
25
|
+
| `RBRby1SDK` | RB-Y1 양팔로봇 제어 |
|
|
26
|
+
| `RBBaseSDK` | 공통 베이스 (직접 상속하지 않는 한 사용할 일 없음) |
|
|
27
|
+
|
|
28
|
+
내부적으로 Zenoh pub/sub/query 메시 위에서 동작하며, 같은 PC(로봇 본체)에서 실행할 때는 별도 설정 없이 즉시 사용 가능합니다.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 1. 설치
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install rb_sdk
|
|
36
|
+
# RB-Y1 양팔로봇 제어가 필요하면 함께 설치
|
|
37
|
+
pip install rby1-sdk
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`requires-python = ">=3.12,<3.13"` — Python 3.12 전용.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 2. 기본 사용 (로봇 본체에서 실행하는 경우)
|
|
45
|
+
|
|
46
|
+
`common` 서비스와 같은 PC에서 실행되는 스크립트라면 추가 설정 없이 그대로 사용 가능합니다.
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
from rb_sdk import RBAmrSDK, RBManipulateSDK
|
|
50
|
+
|
|
51
|
+
amr = RBAmrSDK()
|
|
52
|
+
manipulate = RBManipulateSDK()
|
|
53
|
+
|
|
54
|
+
# 이 시점에 ZenohClient가 127.0.0.1:7447(common)에 자동 연결
|
|
55
|
+
manipulate.move.call_move_j(
|
|
56
|
+
robot_model="C500920",
|
|
57
|
+
target={"tar_values": [0, 0, 0, 0, 0, 0], "tar_frame": 0, "tar_unit": 0},
|
|
58
|
+
)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 3. 외부 PC에서 사용 (Remote Connect)
|
|
64
|
+
|
|
65
|
+
개발용 노트북 등 **로봇 본체와 다른 머신**에서 로봇과 통신하고 싶다면 `sdk.connect()`를 호출합니다.
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
import asyncio
|
|
69
|
+
from rb_sdk import RBManipulateSDK
|
|
70
|
+
|
|
71
|
+
async def main():
|
|
72
|
+
sdk = RBManipulateSDK()
|
|
73
|
+
|
|
74
|
+
# 로봇(common 서비스)에 외부 peer로 등록 + 자동 heartbeat 시작
|
|
75
|
+
peer_id = await sdk.connect(
|
|
76
|
+
token="외부 서비스 Token", # Muscat이 생성한 서비스 Token
|
|
77
|
+
host="192.168.1.100", # 로봇 IP
|
|
78
|
+
# ttl=30, # 서버 측 세션 TTL(초). heartbeat 끊기면 자동 해제
|
|
79
|
+
# zenoh_port=None, # None → OS가 빈 포트 자동 배정 (충돌 없음)
|
|
80
|
+
# heartbeat_interval=15.0, # 기본: ttl / 2
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
sdk.move.call_move_j(robot_model="C500920", target={...})
|
|
84
|
+
|
|
85
|
+
await sdk.disconnect()
|
|
86
|
+
|
|
87
|
+
asyncio.run(main())
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
#### 주요 특징
|
|
91
|
+
|
|
92
|
+
- **로컬 IP 자동 감지**: `host` 방향의 라우팅 인터페이스 IP를 자동으로 찾아 로봇에 알림
|
|
93
|
+
- **포트 자동 배정**: 별도 지정 없이 OS가 빈 포트를 잡아주므로 포트 충돌 없음
|
|
94
|
+
- **자동 heartbeat**: 주기적으로 TTL 연장. 스크립트 종료 / 크래시 시 TTL 만료로 서버 측 정리
|
|
95
|
+
- **같은 PC 자동 감지**: `host`가 localhost거나 자기 IP인 경우 `connect()`는 아무것도 하지 않고 `None` 반환 (이미 메시 안에 있음)
|
|
96
|
+
|
|
97
|
+
#### connect() 인자
|
|
98
|
+
|
|
99
|
+
| 인자 | 타입 | 기본 | 설명 |
|
|
100
|
+
|---|---|---|---|
|
|
101
|
+
| `token` | `str` | (필수) | common 서비스 JWT |
|
|
102
|
+
| `host` | `str` | (필수) | common이 실행 중인 로봇 IP |
|
|
103
|
+
| `zenoh_port` | `int \| None` | `None` | 로컬 Zenoh listen 포트. `None`이면 자동 |
|
|
104
|
+
| `ttl` | `int` | `30` | 서버 측 세션 TTL(초) |
|
|
105
|
+
| `heartbeat_interval` | `float \| None` | `None` | heartbeat 주기. `None`이면 `ttl/2` |
|
|
106
|
+
| `mesh_timeout` | `float \| None` | `None` | mesh 형성 대기 최대 시간(초). `None`이면 무제한 대기 |
|
|
107
|
+
| `mesh_probe_timeout` | `float` | `1.0` | probe query 1회 timeout(초) |
|
|
108
|
+
| `mesh_probe_interval` | `float` | `0.5` | probe 재시도 간격(초) |
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 4. use_directly 모드
|
|
113
|
+
|
|
114
|
+
`RBBaseSDK` 생성자에 `use_directly=True`를 전달하면, 메서드 호출 시 `{name}_directly` 메서드가 존재하면 자동으로 그쪽으로 라우팅됩니다. 없으면 원래 메서드가 그대로 호출됩니다.
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
class MySDK(RBManipulateSDK):
|
|
118
|
+
def call_move_j_directly(self, *, robot_model, target, **kwargs):
|
|
119
|
+
# Zenoh를 거치지 않고 직접 하드웨어 제어하는 구현
|
|
120
|
+
...
|
|
121
|
+
|
|
122
|
+
# use_directly=True → call_move_j 호출 시 call_move_j_directly로 라우팅
|
|
123
|
+
sdk = MySDK(use_directly=True)
|
|
124
|
+
sdk.move.call_move_j(robot_model="C500920", target={...}) # → call_move_j_directly 호출
|
|
125
|
+
|
|
126
|
+
# use_directly=False (기본) 또는 _directly 메서드 없으면 원래 메서드 사용
|
|
127
|
+
sdk2 = MySDK(use_directly=False)
|
|
128
|
+
sdk2.move.call_move_j(...) # → call_move_j 호출
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
싱글톤 인스턴스가 이미 존재해도 `use_directly`는 매 생성자 호출마다 갱신됩니다.
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## 5. AMR SDK (`RBAmrSDK`)
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
from rb_sdk import RBAmrSDK
|
|
139
|
+
|
|
140
|
+
sdk = RBAmrSDK()
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 하위 모듈
|
|
144
|
+
|
|
145
|
+
| 속성 | 클래스 | 주요 기능 |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| `sdk.move` | `AmrMoveSDK` | 목표 지점 이동, jog, 정지/일시정지/재개, 직선·원호·회전 이동 |
|
|
148
|
+
| `sdk.control` | `AmrControlSDK` | 안전 필드/플래그/IO 설정, 도킹/언도킹, LED/모터/jog 제어, 장애물 박스 |
|
|
149
|
+
| `sdk.localization` | `AmrLocalizationSDK` | 위치 초기화, 랜덤/자동/반자동 init, 위치 추정 시작/정지 |
|
|
150
|
+
| `sdk.map` | `AmrMapSDK` | 맵 목록/로드/삭제, 토폴로지 get/set, 매핑 시작/정지/저장 |
|
|
151
|
+
| `sdk.setting` | `AmrSettingSDK` | 로봇 타입, 설정 카테고리/파라미터, PDU/드라이브/센서 설정 |
|
|
152
|
+
| `sdk.status` | `AmrStatusSDK` | 상태·이동 상태·LiDAR·경로 조회 |
|
|
153
|
+
| `sdk.file` | `AmrFileSDK` | 맵·리소스 파일 관리 |
|
|
154
|
+
| `sdk.capability` | `AmrCapabilitySDK` | 로봇 능력 조회 |
|
|
155
|
+
| `sdk.accessory` | `AmrAccessorySDK` | 액세서리 제어 |
|
|
156
|
+
| `sdk.program` | `AmrProgramSDK` | AMR 프로그램 실행/제어 |
|
|
157
|
+
|
|
158
|
+
### 이동 예시
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
# 목표 노드로 이동
|
|
162
|
+
sdk.move.send_move_goal(
|
|
163
|
+
robot_model="AMR001",
|
|
164
|
+
goal_type=0,
|
|
165
|
+
goal_node_name="node_A",
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
# 이동 결과 대기 (async)
|
|
169
|
+
result = await sdk.move.get_move_result(robot_model="AMR001")
|
|
170
|
+
|
|
171
|
+
# jog 이동
|
|
172
|
+
sdk.move.send_move_jog(robot_model="AMR001", vx=0.3, vy=0.0, wz=0.0)
|
|
173
|
+
|
|
174
|
+
# 멀티 경로
|
|
175
|
+
sdk.move.send_multi_path(robot_model="AMR001", path=["node_A", "node_B", "node_C"])
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## 6. Manipulate SDK (`RBManipulateSDK`)
|
|
181
|
+
|
|
182
|
+
```python
|
|
183
|
+
from rb_sdk import RBManipulateSDK
|
|
184
|
+
|
|
185
|
+
sdk = RBManipulateSDK()
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 하위 모듈
|
|
189
|
+
|
|
190
|
+
| 속성 | 클래스 | 주요 기능 |
|
|
191
|
+
|---|---|---|
|
|
192
|
+
| `sdk.move` | `ManipulateMoveSDK` | 관절/직선/원호 이동, jog, 서보/온라인, 어드미턴스, 위빙, 컨베이어 |
|
|
193
|
+
| `sdk.program` | `ManipulateProgramSDK` | 프로그램 실행·정지·재개, 핀포인트, 툴 출력 |
|
|
194
|
+
| `sdk.config` | `ManipulateConfigSDK` | 툴·유저프레임·충돌 파라미터, 속도/impedance/freedrive 설정 |
|
|
195
|
+
| `sdk.io` | `ManipulateIOSDK` | side/flange/ext DIO·AIO 출력, 펄스, 비트 조합, IO 함수 설정 |
|
|
196
|
+
| `sdk.get_data` | `ManipulateGetDataSDK` | 변수 조회, 상대/절대 좌표 계산 |
|
|
197
|
+
| `sdk.point` | `ManipulatePointSDK` | 포인트·좌표 등록 |
|
|
198
|
+
| `sdk.service` | `ManipulateServiceSDK` | 미니 탭 기능 |
|
|
199
|
+
| `sdk.maintenance` | `ManipulateMaintenanceSDK` | 관리자 설정 |
|
|
200
|
+
| `sdk.state` | `ManipulateStateSDK` | whoami, 전원·서보·레퍼런스 제어, 실시간 상태 구독 |
|
|
201
|
+
|
|
202
|
+
### move 모듈 — 주요 메서드
|
|
203
|
+
|
|
204
|
+
| 메서드 | 설명 |
|
|
205
|
+
|---|---|
|
|
206
|
+
| `call_move_j` | 관절 공간(Joint) 이동 |
|
|
207
|
+
| `call_move_l` | 직선(Linear) 이동 |
|
|
208
|
+
| `call_move_cir_axis` | 축 기반 원호 이동 |
|
|
209
|
+
| `call_move_cir_threepoint` | 3점 기반 원호 이동 |
|
|
210
|
+
| `call_move_home` | Home 위치로 이동 |
|
|
211
|
+
| `call_move_jb_clr/add/run` | Joint 블렌딩 경로 등록·실행 |
|
|
212
|
+
| `call_move_lb_clr/add/run` | Linear 블렌딩 경로 등록·실행 |
|
|
213
|
+
| `call_move_xb_clr/add/run` | X 블렌딩 경로 등록·실행 |
|
|
214
|
+
| `call_smoothjog_j/l` | 스무스 jog (관절/직선) |
|
|
215
|
+
| `call_tickjog_j/l` | 틱 jog (관절/직선) |
|
|
216
|
+
| `call_approach_j/l` | 어프로치 이동 |
|
|
217
|
+
| `call_servo_j/l` | 서보 모드 관절/직선 이동 |
|
|
218
|
+
| `call_online_j/l` | 온라인 궤적 관절/직선 |
|
|
219
|
+
| `call_admittance_force_on/off/change` | 어드미턴스 포스 제어 |
|
|
220
|
+
| `call_arc_sensing_on/off` | 아크 센싱 제어 |
|
|
221
|
+
| `call_tcp_weaving_on/off` | TCP 위빙 제어 |
|
|
222
|
+
| `call_base_conveyor_on/off/speed` | 베이스 컨베이어 제어 |
|
|
223
|
+
|
|
224
|
+
### 이동 예시
|
|
225
|
+
|
|
226
|
+
```python
|
|
227
|
+
# 관절 이동
|
|
228
|
+
sdk.move.call_move_j(
|
|
229
|
+
robot_model="C500920",
|
|
230
|
+
target={"tar_values": [0, 0, 90, 0, 90, 0], "tar_frame": 0, "tar_unit": 1},
|
|
231
|
+
speed={"spd_mode": 1, "spd_vel_para": 60, "spd_acc_para": 120},
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
# 직선 이동
|
|
235
|
+
sdk.move.call_move_l(
|
|
236
|
+
robot_model="C500920",
|
|
237
|
+
target={"tar_values": [400, 0, 500, 0, 180, 0], "tar_frame": 1, "tar_unit": 0},
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# 기준 위치로부터 상대 이동
|
|
241
|
+
sdk.move.call_move_j(
|
|
242
|
+
robot_model="C500920",
|
|
243
|
+
target={"tar_values": [10, 0, 0, 0, 0, 0], "tar_frame": 0, "tar_unit": 1},
|
|
244
|
+
reference_value=[0, 0, 90, 0, 90, 0], # 현재 기준값
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
# 전원·서보 제어
|
|
248
|
+
sdk.state.call_powercontrol(robot_model="C500920", control=1)
|
|
249
|
+
sdk.state.call_servocontrol(robot_model="C500920", control=1)
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## 7. RB-Y1 SDK (`RBRby1SDK`)
|
|
255
|
+
|
|
256
|
+
공식 `rby1-sdk` 래퍼. 자세한 설명은 [rby1_sdk/README.md](src/rb_sdk/rby1_sdk/README.md) 참조.
|
|
257
|
+
|
|
258
|
+
```python
|
|
259
|
+
from rb_sdk import RBRby1SDK
|
|
260
|
+
|
|
261
|
+
sdk = RBRby1SDK(endpoint="192.168.30.1:50051", model=None, auto_connect=True)
|
|
262
|
+
|
|
263
|
+
print(sdk.connected)
|
|
264
|
+
print(sdk.whoami())
|
|
265
|
+
|
|
266
|
+
await sdk.control.power_on(robot_model="a")
|
|
267
|
+
await sdk.control.servo_on(robot_model="a")
|
|
268
|
+
|
|
269
|
+
state = await sdk.state.get_state(robot_model="a")
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
모든 public 메서드는 `async def` + 내부 `asyncio.to_thread`입니다 (공식 SDK가 blocking C++ pybind11이므로).
|
|
273
|
+
sync 컨텍스트(PyFM Step 등)에서는 `asyncio.run(...)` 또는 `RBRby1BaseSDK.run_sync(...)` 사용.
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
## 8. FlowManagerArgs 통합 (PyFM)
|
|
278
|
+
|
|
279
|
+
PyFM Step에서 SDK 메서드를 호출할 때 `flow_manager_args`를 전달하면 done 콜백 처리, 이동 완료 대기, 변수 바인딩 등이 자동으로 처리됩니다.
|
|
280
|
+
|
|
281
|
+
```python
|
|
282
|
+
# PyFM Step 내부
|
|
283
|
+
def execute(self, flow_manager_args):
|
|
284
|
+
sdk.move.call_move_j(
|
|
285
|
+
robot_model="C500920",
|
|
286
|
+
target={"tar_values": [0, 0, 0, 0, 0, 0], "tar_frame": 0, "tar_unit": 0},
|
|
287
|
+
flow_manager_args=flow_manager_args, # done() 콜백 자동 호출
|
|
288
|
+
)
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
`flow_manager_args`를 생략하면 블로킹 호출로 동작합니다.
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## 9. 아키텍처 메모
|
|
296
|
+
|
|
297
|
+
### 프로세스 단위 싱글톤
|
|
298
|
+
|
|
299
|
+
`RBBaseSDK`(`RBAmrSDK`, `RBManipulateSDK`)는 `(pid, cls)` 기준 싱글톤입니다. 같은 프로세스에서 여러 번 생성자를 호출해도 동일 인스턴스가 반환됩니다. ZenohClient도 PID당 하나를 공유합니다.
|
|
300
|
+
|
|
301
|
+
```python
|
|
302
|
+
a = RBManipulateSDK()
|
|
303
|
+
b = RBManipulateSDK()
|
|
304
|
+
assert a is b # True
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### 자동 에러 래핑
|
|
308
|
+
|
|
309
|
+
`RBBaseSDK`를 상속한 클래스의 모든 public instance method는 `__init_subclass__`에 의해 자동으로 공통 try/except로 래핑됩니다. `ZenohNoReply` / `ZenohTransportError` 발생 시 자동 재연결 후 1회 재시도합니다.
|
|
310
|
+
|
|
311
|
+
### SDK 종료
|
|
312
|
+
|
|
313
|
+
```python
|
|
314
|
+
sdk.close() # 현재 인스턴스 정리
|
|
315
|
+
RBBaseSDK.close_all_for_pid() # 현재 프로세스의 모든 SDK 인스턴스 정리
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
---
|
|
319
|
+
|
|
320
|
+
## 10. 주의사항
|
|
321
|
+
|
|
322
|
+
- `RBRby1SDK`는 최초 `endpoint/model` 기준으로 세션이 공유됩니다.
|
|
323
|
+
- 연결 대상(zenoh, rby1 endpoint, Muscat HTTP)이 준비되지 않으면 런타임 예외가 발생합니다.
|
|
324
|
+
- 외부 PC에서 SDK 사용 시 **방화벽이 7447/TCP(zenoh)와 8000/TCP을 양방향으로 허용**해야 합니다.
|
|
325
|
+
- `use_directly=True`는 싱글톤 재진입 시에도 반영됩니다. 단, 하위 SDK(`sdk.move` 등)에는 전파되지 않으므로 `_directly` 메서드는 최상위 SDK에 정의해야 합니다.
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## 11. 라이선스 / 문의
|
|
330
|
+
|
|
331
|
+
© Rainbow Robotics. 내부 이슈/문의: [GitHub Issues](https://github.com/rainbow-mobile/rainbow-release-apps/issues)
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
# rb_sdk
|
|
2
|
+
|
|
3
|
+
Rainbow Robotics 통합 Python SDK. AMR · Manipulator · RB-Y1 양팔로봇 제어와 Rainbow Robot Service(common) 연동을 단일 API로 제공합니다.
|
|
4
|
+
|
|
5
|
+
## 진입점
|
|
6
|
+
|
|
7
|
+
| 클래스 | 용도 |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `RBAmrSDK` | AMR(자율 주행) 로봇 제어 |
|
|
10
|
+
| `RBManipulateSDK` | 협동 로봇 매니퓰레이터 제어 |
|
|
11
|
+
| `RBRby1SDK` | RB-Y1 양팔로봇 제어 |
|
|
12
|
+
| `RBBaseSDK` | 공통 베이스 (직접 상속하지 않는 한 사용할 일 없음) |
|
|
13
|
+
|
|
14
|
+
내부적으로 Zenoh pub/sub/query 메시 위에서 동작하며, 같은 PC(로봇 본체)에서 실행할 때는 별도 설정 없이 즉시 사용 가능합니다.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 1. 설치
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pip install rb_sdk
|
|
22
|
+
# RB-Y1 양팔로봇 제어가 필요하면 함께 설치
|
|
23
|
+
pip install rby1-sdk
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
`requires-python = ">=3.12,<3.13"` — Python 3.12 전용.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 2. 기본 사용 (로봇 본체에서 실행하는 경우)
|
|
31
|
+
|
|
32
|
+
`common` 서비스와 같은 PC에서 실행되는 스크립트라면 추가 설정 없이 그대로 사용 가능합니다.
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
from rb_sdk import RBAmrSDK, RBManipulateSDK
|
|
36
|
+
|
|
37
|
+
amr = RBAmrSDK()
|
|
38
|
+
manipulate = RBManipulateSDK()
|
|
39
|
+
|
|
40
|
+
# 이 시점에 ZenohClient가 127.0.0.1:7447(common)에 자동 연결
|
|
41
|
+
manipulate.move.call_move_j(
|
|
42
|
+
robot_model="C500920",
|
|
43
|
+
target={"tar_values": [0, 0, 0, 0, 0, 0], "tar_frame": 0, "tar_unit": 0},
|
|
44
|
+
)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 3. 외부 PC에서 사용 (Remote Connect)
|
|
50
|
+
|
|
51
|
+
개발용 노트북 등 **로봇 본체와 다른 머신**에서 로봇과 통신하고 싶다면 `sdk.connect()`를 호출합니다.
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
import asyncio
|
|
55
|
+
from rb_sdk import RBManipulateSDK
|
|
56
|
+
|
|
57
|
+
async def main():
|
|
58
|
+
sdk = RBManipulateSDK()
|
|
59
|
+
|
|
60
|
+
# 로봇(common 서비스)에 외부 peer로 등록 + 자동 heartbeat 시작
|
|
61
|
+
peer_id = await sdk.connect(
|
|
62
|
+
token="외부 서비스 Token", # Muscat이 생성한 서비스 Token
|
|
63
|
+
host="192.168.1.100", # 로봇 IP
|
|
64
|
+
# ttl=30, # 서버 측 세션 TTL(초). heartbeat 끊기면 자동 해제
|
|
65
|
+
# zenoh_port=None, # None → OS가 빈 포트 자동 배정 (충돌 없음)
|
|
66
|
+
# heartbeat_interval=15.0, # 기본: ttl / 2
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
sdk.move.call_move_j(robot_model="C500920", target={...})
|
|
70
|
+
|
|
71
|
+
await sdk.disconnect()
|
|
72
|
+
|
|
73
|
+
asyncio.run(main())
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
#### 주요 특징
|
|
77
|
+
|
|
78
|
+
- **로컬 IP 자동 감지**: `host` 방향의 라우팅 인터페이스 IP를 자동으로 찾아 로봇에 알림
|
|
79
|
+
- **포트 자동 배정**: 별도 지정 없이 OS가 빈 포트를 잡아주므로 포트 충돌 없음
|
|
80
|
+
- **자동 heartbeat**: 주기적으로 TTL 연장. 스크립트 종료 / 크래시 시 TTL 만료로 서버 측 정리
|
|
81
|
+
- **같은 PC 자동 감지**: `host`가 localhost거나 자기 IP인 경우 `connect()`는 아무것도 하지 않고 `None` 반환 (이미 메시 안에 있음)
|
|
82
|
+
|
|
83
|
+
#### connect() 인자
|
|
84
|
+
|
|
85
|
+
| 인자 | 타입 | 기본 | 설명 |
|
|
86
|
+
|---|---|---|---|
|
|
87
|
+
| `token` | `str` | (필수) | common 서비스 JWT |
|
|
88
|
+
| `host` | `str` | (필수) | common이 실행 중인 로봇 IP |
|
|
89
|
+
| `zenoh_port` | `int \| None` | `None` | 로컬 Zenoh listen 포트. `None`이면 자동 |
|
|
90
|
+
| `ttl` | `int` | `30` | 서버 측 세션 TTL(초) |
|
|
91
|
+
| `heartbeat_interval` | `float \| None` | `None` | heartbeat 주기. `None`이면 `ttl/2` |
|
|
92
|
+
| `mesh_timeout` | `float \| None` | `None` | mesh 형성 대기 최대 시간(초). `None`이면 무제한 대기 |
|
|
93
|
+
| `mesh_probe_timeout` | `float` | `1.0` | probe query 1회 timeout(초) |
|
|
94
|
+
| `mesh_probe_interval` | `float` | `0.5` | probe 재시도 간격(초) |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 4. use_directly 모드
|
|
99
|
+
|
|
100
|
+
`RBBaseSDK` 생성자에 `use_directly=True`를 전달하면, 메서드 호출 시 `{name}_directly` 메서드가 존재하면 자동으로 그쪽으로 라우팅됩니다. 없으면 원래 메서드가 그대로 호출됩니다.
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
class MySDK(RBManipulateSDK):
|
|
104
|
+
def call_move_j_directly(self, *, robot_model, target, **kwargs):
|
|
105
|
+
# Zenoh를 거치지 않고 직접 하드웨어 제어하는 구현
|
|
106
|
+
...
|
|
107
|
+
|
|
108
|
+
# use_directly=True → call_move_j 호출 시 call_move_j_directly로 라우팅
|
|
109
|
+
sdk = MySDK(use_directly=True)
|
|
110
|
+
sdk.move.call_move_j(robot_model="C500920", target={...}) # → call_move_j_directly 호출
|
|
111
|
+
|
|
112
|
+
# use_directly=False (기본) 또는 _directly 메서드 없으면 원래 메서드 사용
|
|
113
|
+
sdk2 = MySDK(use_directly=False)
|
|
114
|
+
sdk2.move.call_move_j(...) # → call_move_j 호출
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
싱글톤 인스턴스가 이미 존재해도 `use_directly`는 매 생성자 호출마다 갱신됩니다.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 5. AMR SDK (`RBAmrSDK`)
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
from rb_sdk import RBAmrSDK
|
|
125
|
+
|
|
126
|
+
sdk = RBAmrSDK()
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 하위 모듈
|
|
130
|
+
|
|
131
|
+
| 속성 | 클래스 | 주요 기능 |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| `sdk.move` | `AmrMoveSDK` | 목표 지점 이동, jog, 정지/일시정지/재개, 직선·원호·회전 이동 |
|
|
134
|
+
| `sdk.control` | `AmrControlSDK` | 안전 필드/플래그/IO 설정, 도킹/언도킹, LED/모터/jog 제어, 장애물 박스 |
|
|
135
|
+
| `sdk.localization` | `AmrLocalizationSDK` | 위치 초기화, 랜덤/자동/반자동 init, 위치 추정 시작/정지 |
|
|
136
|
+
| `sdk.map` | `AmrMapSDK` | 맵 목록/로드/삭제, 토폴로지 get/set, 매핑 시작/정지/저장 |
|
|
137
|
+
| `sdk.setting` | `AmrSettingSDK` | 로봇 타입, 설정 카테고리/파라미터, PDU/드라이브/센서 설정 |
|
|
138
|
+
| `sdk.status` | `AmrStatusSDK` | 상태·이동 상태·LiDAR·경로 조회 |
|
|
139
|
+
| `sdk.file` | `AmrFileSDK` | 맵·리소스 파일 관리 |
|
|
140
|
+
| `sdk.capability` | `AmrCapabilitySDK` | 로봇 능력 조회 |
|
|
141
|
+
| `sdk.accessory` | `AmrAccessorySDK` | 액세서리 제어 |
|
|
142
|
+
| `sdk.program` | `AmrProgramSDK` | AMR 프로그램 실행/제어 |
|
|
143
|
+
|
|
144
|
+
### 이동 예시
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
# 목표 노드로 이동
|
|
148
|
+
sdk.move.send_move_goal(
|
|
149
|
+
robot_model="AMR001",
|
|
150
|
+
goal_type=0,
|
|
151
|
+
goal_node_name="node_A",
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
# 이동 결과 대기 (async)
|
|
155
|
+
result = await sdk.move.get_move_result(robot_model="AMR001")
|
|
156
|
+
|
|
157
|
+
# jog 이동
|
|
158
|
+
sdk.move.send_move_jog(robot_model="AMR001", vx=0.3, vy=0.0, wz=0.0)
|
|
159
|
+
|
|
160
|
+
# 멀티 경로
|
|
161
|
+
sdk.move.send_multi_path(robot_model="AMR001", path=["node_A", "node_B", "node_C"])
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 6. Manipulate SDK (`RBManipulateSDK`)
|
|
167
|
+
|
|
168
|
+
```python
|
|
169
|
+
from rb_sdk import RBManipulateSDK
|
|
170
|
+
|
|
171
|
+
sdk = RBManipulateSDK()
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 하위 모듈
|
|
175
|
+
|
|
176
|
+
| 속성 | 클래스 | 주요 기능 |
|
|
177
|
+
|---|---|---|
|
|
178
|
+
| `sdk.move` | `ManipulateMoveSDK` | 관절/직선/원호 이동, jog, 서보/온라인, 어드미턴스, 위빙, 컨베이어 |
|
|
179
|
+
| `sdk.program` | `ManipulateProgramSDK` | 프로그램 실행·정지·재개, 핀포인트, 툴 출력 |
|
|
180
|
+
| `sdk.config` | `ManipulateConfigSDK` | 툴·유저프레임·충돌 파라미터, 속도/impedance/freedrive 설정 |
|
|
181
|
+
| `sdk.io` | `ManipulateIOSDK` | side/flange/ext DIO·AIO 출력, 펄스, 비트 조합, IO 함수 설정 |
|
|
182
|
+
| `sdk.get_data` | `ManipulateGetDataSDK` | 변수 조회, 상대/절대 좌표 계산 |
|
|
183
|
+
| `sdk.point` | `ManipulatePointSDK` | 포인트·좌표 등록 |
|
|
184
|
+
| `sdk.service` | `ManipulateServiceSDK` | 미니 탭 기능 |
|
|
185
|
+
| `sdk.maintenance` | `ManipulateMaintenanceSDK` | 관리자 설정 |
|
|
186
|
+
| `sdk.state` | `ManipulateStateSDK` | whoami, 전원·서보·레퍼런스 제어, 실시간 상태 구독 |
|
|
187
|
+
|
|
188
|
+
### move 모듈 — 주요 메서드
|
|
189
|
+
|
|
190
|
+
| 메서드 | 설명 |
|
|
191
|
+
|---|---|
|
|
192
|
+
| `call_move_j` | 관절 공간(Joint) 이동 |
|
|
193
|
+
| `call_move_l` | 직선(Linear) 이동 |
|
|
194
|
+
| `call_move_cir_axis` | 축 기반 원호 이동 |
|
|
195
|
+
| `call_move_cir_threepoint` | 3점 기반 원호 이동 |
|
|
196
|
+
| `call_move_home` | Home 위치로 이동 |
|
|
197
|
+
| `call_move_jb_clr/add/run` | Joint 블렌딩 경로 등록·실행 |
|
|
198
|
+
| `call_move_lb_clr/add/run` | Linear 블렌딩 경로 등록·실행 |
|
|
199
|
+
| `call_move_xb_clr/add/run` | X 블렌딩 경로 등록·실행 |
|
|
200
|
+
| `call_smoothjog_j/l` | 스무스 jog (관절/직선) |
|
|
201
|
+
| `call_tickjog_j/l` | 틱 jog (관절/직선) |
|
|
202
|
+
| `call_approach_j/l` | 어프로치 이동 |
|
|
203
|
+
| `call_servo_j/l` | 서보 모드 관절/직선 이동 |
|
|
204
|
+
| `call_online_j/l` | 온라인 궤적 관절/직선 |
|
|
205
|
+
| `call_admittance_force_on/off/change` | 어드미턴스 포스 제어 |
|
|
206
|
+
| `call_arc_sensing_on/off` | 아크 센싱 제어 |
|
|
207
|
+
| `call_tcp_weaving_on/off` | TCP 위빙 제어 |
|
|
208
|
+
| `call_base_conveyor_on/off/speed` | 베이스 컨베이어 제어 |
|
|
209
|
+
|
|
210
|
+
### 이동 예시
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
# 관절 이동
|
|
214
|
+
sdk.move.call_move_j(
|
|
215
|
+
robot_model="C500920",
|
|
216
|
+
target={"tar_values": [0, 0, 90, 0, 90, 0], "tar_frame": 0, "tar_unit": 1},
|
|
217
|
+
speed={"spd_mode": 1, "spd_vel_para": 60, "spd_acc_para": 120},
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
# 직선 이동
|
|
221
|
+
sdk.move.call_move_l(
|
|
222
|
+
robot_model="C500920",
|
|
223
|
+
target={"tar_values": [400, 0, 500, 0, 180, 0], "tar_frame": 1, "tar_unit": 0},
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
# 기준 위치로부터 상대 이동
|
|
227
|
+
sdk.move.call_move_j(
|
|
228
|
+
robot_model="C500920",
|
|
229
|
+
target={"tar_values": [10, 0, 0, 0, 0, 0], "tar_frame": 0, "tar_unit": 1},
|
|
230
|
+
reference_value=[0, 0, 90, 0, 90, 0], # 현재 기준값
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
# 전원·서보 제어
|
|
234
|
+
sdk.state.call_powercontrol(robot_model="C500920", control=1)
|
|
235
|
+
sdk.state.call_servocontrol(robot_model="C500920", control=1)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## 7. RB-Y1 SDK (`RBRby1SDK`)
|
|
241
|
+
|
|
242
|
+
공식 `rby1-sdk` 래퍼. 자세한 설명은 [rby1_sdk/README.md](src/rb_sdk/rby1_sdk/README.md) 참조.
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
from rb_sdk import RBRby1SDK
|
|
246
|
+
|
|
247
|
+
sdk = RBRby1SDK(endpoint="192.168.30.1:50051", model=None, auto_connect=True)
|
|
248
|
+
|
|
249
|
+
print(sdk.connected)
|
|
250
|
+
print(sdk.whoami())
|
|
251
|
+
|
|
252
|
+
await sdk.control.power_on(robot_model="a")
|
|
253
|
+
await sdk.control.servo_on(robot_model="a")
|
|
254
|
+
|
|
255
|
+
state = await sdk.state.get_state(robot_model="a")
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
모든 public 메서드는 `async def` + 내부 `asyncio.to_thread`입니다 (공식 SDK가 blocking C++ pybind11이므로).
|
|
259
|
+
sync 컨텍스트(PyFM Step 등)에서는 `asyncio.run(...)` 또는 `RBRby1BaseSDK.run_sync(...)` 사용.
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 8. FlowManagerArgs 통합 (PyFM)
|
|
264
|
+
|
|
265
|
+
PyFM Step에서 SDK 메서드를 호출할 때 `flow_manager_args`를 전달하면 done 콜백 처리, 이동 완료 대기, 변수 바인딩 등이 자동으로 처리됩니다.
|
|
266
|
+
|
|
267
|
+
```python
|
|
268
|
+
# PyFM Step 내부
|
|
269
|
+
def execute(self, flow_manager_args):
|
|
270
|
+
sdk.move.call_move_j(
|
|
271
|
+
robot_model="C500920",
|
|
272
|
+
target={"tar_values": [0, 0, 0, 0, 0, 0], "tar_frame": 0, "tar_unit": 0},
|
|
273
|
+
flow_manager_args=flow_manager_args, # done() 콜백 자동 호출
|
|
274
|
+
)
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
`flow_manager_args`를 생략하면 블로킹 호출로 동작합니다.
|
|
278
|
+
|
|
279
|
+
---
|
|
280
|
+
|
|
281
|
+
## 9. 아키텍처 메모
|
|
282
|
+
|
|
283
|
+
### 프로세스 단위 싱글톤
|
|
284
|
+
|
|
285
|
+
`RBBaseSDK`(`RBAmrSDK`, `RBManipulateSDK`)는 `(pid, cls)` 기준 싱글톤입니다. 같은 프로세스에서 여러 번 생성자를 호출해도 동일 인스턴스가 반환됩니다. ZenohClient도 PID당 하나를 공유합니다.
|
|
286
|
+
|
|
287
|
+
```python
|
|
288
|
+
a = RBManipulateSDK()
|
|
289
|
+
b = RBManipulateSDK()
|
|
290
|
+
assert a is b # True
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### 자동 에러 래핑
|
|
294
|
+
|
|
295
|
+
`RBBaseSDK`를 상속한 클래스의 모든 public instance method는 `__init_subclass__`에 의해 자동으로 공통 try/except로 래핑됩니다. `ZenohNoReply` / `ZenohTransportError` 발생 시 자동 재연결 후 1회 재시도합니다.
|
|
296
|
+
|
|
297
|
+
### SDK 종료
|
|
298
|
+
|
|
299
|
+
```python
|
|
300
|
+
sdk.close() # 현재 인스턴스 정리
|
|
301
|
+
RBBaseSDK.close_all_for_pid() # 현재 프로세스의 모든 SDK 인스턴스 정리
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 10. 주의사항
|
|
307
|
+
|
|
308
|
+
- `RBRby1SDK`는 최초 `endpoint/model` 기준으로 세션이 공유됩니다.
|
|
309
|
+
- 연결 대상(zenoh, rby1 endpoint, Muscat HTTP)이 준비되지 않으면 런타임 예외가 발생합니다.
|
|
310
|
+
- 외부 PC에서 SDK 사용 시 **방화벽이 7447/TCP(zenoh)와 8000/TCP을 양방향으로 허용**해야 합니다.
|
|
311
|
+
- `use_directly=True`는 싱글톤 재진입 시에도 반영됩니다. 단, 하위 SDK(`sdk.move` 등)에는 전파되지 않으므로 `_directly` 메서드는 최상위 SDK에 정의해야 합니다.
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## 11. 라이선스 / 문의
|
|
316
|
+
|
|
317
|
+
© Rainbow Robotics. 내부 이슈/문의: [GitHub Issues](https://github.com/rainbow-mobile/rainbow-release-apps/issues)
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "rainbow-rb-sdk"
|
|
7
|
-
version = "0.0.9.
|
|
7
|
+
version = "0.0.9.dev12"
|
|
8
8
|
requires-python = ">=3.12,<3.13"
|
|
9
9
|
description = "Rainbow Robotics 통합 Python SDK — AMR, 매니퓰레이터, RB-Y1 휴머노이드와 Rainbow Robot Service(common) 연동"
|
|
10
10
|
authors = [
|
|
@@ -13,11 +13,11 @@ authors = [
|
|
|
13
13
|
readme = "README.md"
|
|
14
14
|
|
|
15
15
|
dependencies = [
|
|
16
|
-
"rainbow-rb-utils==0.0.9.
|
|
17
|
-
"rainbow-rb-zenoh==0.0.9.
|
|
18
|
-
"rainbow-rb-flat-buffers==0.0.9.
|
|
19
|
-
"rainbow-rb-schemas==0.0.9.
|
|
20
|
-
"rainbow-rb-log==0.0.9.
|
|
16
|
+
"rainbow-rb-utils==0.0.9.dev12",
|
|
17
|
+
"rainbow-rb-zenoh==0.0.9.dev12",
|
|
18
|
+
"rainbow-rb-flat-buffers==0.0.9.dev12",
|
|
19
|
+
"rainbow-rb-schemas==0.0.9.dev12",
|
|
20
|
+
"rainbow-rb-log==0.0.9.dev12",
|
|
21
21
|
"rby1-sdk>=0.9.1",
|
|
22
22
|
]
|
|
23
23
|
|