rainbow-rb-sdk 0.0.9.dev5__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.dev5/PKG-INFO +137 -0
- rainbow_rb_sdk-0.0.9.dev5/README.md +124 -0
- rainbow_rb_sdk-0.0.9.dev5/pyproject.toml +32 -0
- rainbow_rb_sdk-0.0.9.dev5/setup.cfg +4 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/__init__.py +42 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr.py +57 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/__init__.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_accessory.py +200 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_capability.py +391 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_control.py +995 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_file.py +162 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_localization.py +407 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_map.py +664 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_move.py +732 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_program.py +125 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_setting.py +600 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_status.py +123 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/schema/__init__.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/base.py +517 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/base_sdk/__init__.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/base_sdk/base_schema.py +7 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate.py +51 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/__init__.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_config.py +1362 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_get_data.py +149 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_io.py +1057 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_move.py +1649 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_point.py +138 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_program.py +772 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_service.py +761 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_smbc.py +144 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_state.py +181 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/__init__.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_config_schema.py +132 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_io_schema.py +41 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_move_schema.py +19 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_program_schema.py +35 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/program_sdk/__init__.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/program_sdk/program.py +757 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1.py +18 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/__init__.py +21 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/base.py +8 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/client.py +111 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/config.py +9 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/control.py +64 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/exceptions.py +10 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/state.py +40 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/__init__.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/amr_schema.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/base_schema.py +0 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/manipulate_schema.py +52 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/program_schema.py +51 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/PKG-INFO +137 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/SOURCES.txt +55 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/dependency_links.txt +1 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/requires.txt +5 -0
- rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rainbow-rb-sdk
|
|
3
|
+
Version: 0.0.9.dev5
|
|
4
|
+
Summary: Rainbow Python SDK
|
|
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.dev5
|
|
9
|
+
Requires-Dist: rainbow-rb-zenoh==0.0.9.dev5
|
|
10
|
+
Requires-Dist: rainbow-rb-flat-buffers==0.0.9.dev5
|
|
11
|
+
Requires-Dist: rainbow-rb-schemas==0.0.9.dev5
|
|
12
|
+
Requires-Dist: rainbow-rb-log==0.0.9.dev5
|
|
13
|
+
|
|
14
|
+
# rb_sdk 사용 설명서
|
|
15
|
+
|
|
16
|
+
`rb_sdk`는 Rainbow 서비스 호출을 Python API 형태로 래핑한 통합 SDK입니다.
|
|
17
|
+
|
|
18
|
+
현재 진입점:
|
|
19
|
+
|
|
20
|
+
- `RBAmrSDK`
|
|
21
|
+
- `RBManipulateSDK`
|
|
22
|
+
- `RBRby1SDK`
|
|
23
|
+
- `RBBaseSDK`
|
|
24
|
+
|
|
25
|
+
## 1. 설치/의존성
|
|
26
|
+
|
|
27
|
+
워크스페이스 기준:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
cd /Users/kimjongwan/Desktop/workspace/rby2/backend
|
|
31
|
+
uv add rb_sdk --package your_package
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`RBRby1SDK`를 사용할 경우 추가로 `rby1-sdk` 설치가 필요합니다.
|
|
35
|
+
|
|
36
|
+
## 2. 기본 사용
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
from rb_sdk import RBAmrSDK, RBManipulateSDK
|
|
40
|
+
|
|
41
|
+
amr = RBAmrSDK()
|
|
42
|
+
manipulate = RBManipulateSDK()
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`rb_sdk`는 lazy import를 사용하므로 `from rb_sdk import ...` 방식으로 가져오면 됩니다.
|
|
46
|
+
|
|
47
|
+
## 3. AMR SDK
|
|
48
|
+
|
|
49
|
+
`RBAmrSDK` 하위 모듈:
|
|
50
|
+
|
|
51
|
+
- `move`
|
|
52
|
+
- `control`
|
|
53
|
+
- `localization`
|
|
54
|
+
- `map`
|
|
55
|
+
- `setting`
|
|
56
|
+
- `file`
|
|
57
|
+
- `status`
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
from rb_sdk import RBAmrSDK
|
|
61
|
+
|
|
62
|
+
sdk = RBAmrSDK()
|
|
63
|
+
# 예: sdk.move.*, sdk.control.* 형태로 기능 호출
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 4. Manipulate SDK
|
|
67
|
+
|
|
68
|
+
`RBManipulateSDK` 하위 모듈:
|
|
69
|
+
|
|
70
|
+
- `program`
|
|
71
|
+
- `move`
|
|
72
|
+
- `config`
|
|
73
|
+
- `io`
|
|
74
|
+
- `get_data`
|
|
75
|
+
- `point`
|
|
76
|
+
|
|
77
|
+
```python
|
|
78
|
+
from rb_sdk import RBManipulateSDK
|
|
79
|
+
|
|
80
|
+
sdk = RBManipulateSDK()
|
|
81
|
+
# 예: sdk.program.*, sdk.move.*, sdk.io.* 형태로 호출
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 5. RB-Y1 SDK (`RBRby1SDK`)
|
|
85
|
+
|
|
86
|
+
`RBRby1SDK`는 공식 `rby1-sdk`를 감싸는 래퍼입니다.
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
from rb_sdk import RBRby1SDK
|
|
90
|
+
|
|
91
|
+
sdk = RBRby1SDK(endpoint="192.168.30.1:50051", model=None, auto_connect=True)
|
|
92
|
+
|
|
93
|
+
print(sdk.connected)
|
|
94
|
+
print(sdk.whoami())
|
|
95
|
+
|
|
96
|
+
sdk.control.power_on()
|
|
97
|
+
sdk.control.servo_on()
|
|
98
|
+
|
|
99
|
+
state = sdk.state.get_state()
|
|
100
|
+
print(state)
|
|
101
|
+
|
|
102
|
+
sdk.disconnect()
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
지원 메서드:
|
|
106
|
+
|
|
107
|
+
- 공통
|
|
108
|
+
- `connect()`
|
|
109
|
+
- `disconnect()`
|
|
110
|
+
- `whoami()`
|
|
111
|
+
- `call(method, *args, **kwargs)`
|
|
112
|
+
- 제어
|
|
113
|
+
- `control.invoke(...)`
|
|
114
|
+
- `control.power_on()`
|
|
115
|
+
- `control.servo_on()`
|
|
116
|
+
- 상태
|
|
117
|
+
- `state.get_state()`
|
|
118
|
+
|
|
119
|
+
## 6. Flow Manager 연동 포인트
|
|
120
|
+
|
|
121
|
+
여러 SDK 메서드는 `flow_manager_args`를 받아 Step 실행 완료 시 `done()` 콜백과 연동되도록 설계되어 있습니다.
|
|
122
|
+
|
|
123
|
+
```python
|
|
124
|
+
from rb_schemas.sdk import FlowManagerArgs
|
|
125
|
+
from rb_sdk import RBRby1SDK
|
|
126
|
+
|
|
127
|
+
sdk = RBRby1SDK(endpoint="192.168.30.1:50051")
|
|
128
|
+
|
|
129
|
+
def step_func(flow_manager_args: FlowManagerArgs | None = None):
|
|
130
|
+
sdk.control.power_on(flow_manager_args=flow_manager_args)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 7. 주의사항
|
|
134
|
+
|
|
135
|
+
- `RBBaseSDK`는 내부적으로 프로세스 단위 공유 리소스를 사용합니다.
|
|
136
|
+
- `RBRby1SDK`는 동일 프로세스에서 최초 `endpoint/model` 기준으로 세션이 공유됩니다.
|
|
137
|
+
- 연결 대상 서비스(zenoh, rby1 endpoint)가 준비되지 않으면 런타임 예외가 발생합니다.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# rb_sdk 사용 설명서
|
|
2
|
+
|
|
3
|
+
`rb_sdk`는 Rainbow 서비스 호출을 Python API 형태로 래핑한 통합 SDK입니다.
|
|
4
|
+
|
|
5
|
+
현재 진입점:
|
|
6
|
+
|
|
7
|
+
- `RBAmrSDK`
|
|
8
|
+
- `RBManipulateSDK`
|
|
9
|
+
- `RBRby1SDK`
|
|
10
|
+
- `RBBaseSDK`
|
|
11
|
+
|
|
12
|
+
## 1. 설치/의존성
|
|
13
|
+
|
|
14
|
+
워크스페이스 기준:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
cd /Users/kimjongwan/Desktop/workspace/rby2/backend
|
|
18
|
+
uv add rb_sdk --package your_package
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`RBRby1SDK`를 사용할 경우 추가로 `rby1-sdk` 설치가 필요합니다.
|
|
22
|
+
|
|
23
|
+
## 2. 기본 사용
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
from rb_sdk import RBAmrSDK, RBManipulateSDK
|
|
27
|
+
|
|
28
|
+
amr = RBAmrSDK()
|
|
29
|
+
manipulate = RBManipulateSDK()
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`rb_sdk`는 lazy import를 사용하므로 `from rb_sdk import ...` 방식으로 가져오면 됩니다.
|
|
33
|
+
|
|
34
|
+
## 3. AMR SDK
|
|
35
|
+
|
|
36
|
+
`RBAmrSDK` 하위 모듈:
|
|
37
|
+
|
|
38
|
+
- `move`
|
|
39
|
+
- `control`
|
|
40
|
+
- `localization`
|
|
41
|
+
- `map`
|
|
42
|
+
- `setting`
|
|
43
|
+
- `file`
|
|
44
|
+
- `status`
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
from rb_sdk import RBAmrSDK
|
|
48
|
+
|
|
49
|
+
sdk = RBAmrSDK()
|
|
50
|
+
# 예: sdk.move.*, sdk.control.* 형태로 기능 호출
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## 4. Manipulate SDK
|
|
54
|
+
|
|
55
|
+
`RBManipulateSDK` 하위 모듈:
|
|
56
|
+
|
|
57
|
+
- `program`
|
|
58
|
+
- `move`
|
|
59
|
+
- `config`
|
|
60
|
+
- `io`
|
|
61
|
+
- `get_data`
|
|
62
|
+
- `point`
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
from rb_sdk import RBManipulateSDK
|
|
66
|
+
|
|
67
|
+
sdk = RBManipulateSDK()
|
|
68
|
+
# 예: sdk.program.*, sdk.move.*, sdk.io.* 형태로 호출
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 5. RB-Y1 SDK (`RBRby1SDK`)
|
|
72
|
+
|
|
73
|
+
`RBRby1SDK`는 공식 `rby1-sdk`를 감싸는 래퍼입니다.
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
from rb_sdk import RBRby1SDK
|
|
77
|
+
|
|
78
|
+
sdk = RBRby1SDK(endpoint="192.168.30.1:50051", model=None, auto_connect=True)
|
|
79
|
+
|
|
80
|
+
print(sdk.connected)
|
|
81
|
+
print(sdk.whoami())
|
|
82
|
+
|
|
83
|
+
sdk.control.power_on()
|
|
84
|
+
sdk.control.servo_on()
|
|
85
|
+
|
|
86
|
+
state = sdk.state.get_state()
|
|
87
|
+
print(state)
|
|
88
|
+
|
|
89
|
+
sdk.disconnect()
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
지원 메서드:
|
|
93
|
+
|
|
94
|
+
- 공통
|
|
95
|
+
- `connect()`
|
|
96
|
+
- `disconnect()`
|
|
97
|
+
- `whoami()`
|
|
98
|
+
- `call(method, *args, **kwargs)`
|
|
99
|
+
- 제어
|
|
100
|
+
- `control.invoke(...)`
|
|
101
|
+
- `control.power_on()`
|
|
102
|
+
- `control.servo_on()`
|
|
103
|
+
- 상태
|
|
104
|
+
- `state.get_state()`
|
|
105
|
+
|
|
106
|
+
## 6. Flow Manager 연동 포인트
|
|
107
|
+
|
|
108
|
+
여러 SDK 메서드는 `flow_manager_args`를 받아 Step 실행 완료 시 `done()` 콜백과 연동되도록 설계되어 있습니다.
|
|
109
|
+
|
|
110
|
+
```python
|
|
111
|
+
from rb_schemas.sdk import FlowManagerArgs
|
|
112
|
+
from rb_sdk import RBRby1SDK
|
|
113
|
+
|
|
114
|
+
sdk = RBRby1SDK(endpoint="192.168.30.1:50051")
|
|
115
|
+
|
|
116
|
+
def step_func(flow_manager_args: FlowManagerArgs | None = None):
|
|
117
|
+
sdk.control.power_on(flow_manager_args=flow_manager_args)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 7. 주의사항
|
|
121
|
+
|
|
122
|
+
- `RBBaseSDK`는 내부적으로 프로세스 단위 공유 리소스를 사용합니다.
|
|
123
|
+
- `RBRby1SDK`는 동일 프로세스에서 최초 `endpoint/model` 기준으로 세션이 공유됩니다.
|
|
124
|
+
- 연결 대상 서비스(zenoh, rby1 endpoint)가 준비되지 않으면 런타임 예외가 발생합니다.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=69", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "rainbow-rb-sdk"
|
|
7
|
+
version = "0.0.9.dev5"
|
|
8
|
+
requires-python = ">=3.12,<3.13"
|
|
9
|
+
description = "Rainbow Python SDK"
|
|
10
|
+
authors = [
|
|
11
|
+
{ name = "Derek", email = "dfd1123@rainbow-robotics.com" },
|
|
12
|
+
]
|
|
13
|
+
readme = "README.md"
|
|
14
|
+
|
|
15
|
+
dependencies = [
|
|
16
|
+
"rainbow-rb-utils==0.0.9.dev5",
|
|
17
|
+
"rainbow-rb-zenoh==0.0.9.dev5",
|
|
18
|
+
"rainbow-rb-flat-buffers==0.0.9.dev5",
|
|
19
|
+
"rainbow-rb-schemas==0.0.9.dev5",
|
|
20
|
+
"rainbow-rb-log==0.0.9.dev5",
|
|
21
|
+
]
|
|
22
|
+
|
|
23
|
+
[tool.setuptools]
|
|
24
|
+
package-dir = {"" = "src"}
|
|
25
|
+
include-package-data = true
|
|
26
|
+
|
|
27
|
+
[tool.setuptools.packages.find]
|
|
28
|
+
where = ["src"]
|
|
29
|
+
include = ["rainbow.rb_sdk*"]
|
|
30
|
+
|
|
31
|
+
[tool.setuptools.package-data]
|
|
32
|
+
"*" = ["py.typed"]
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Rainbow Robotics SDK package.
|
|
2
|
+
|
|
3
|
+
이 패키지는 문서 빌드 중에 종속성을 방지하기 위해 lazy import를 사용하여 선택된 SDK 진입점을 제공합니다.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
from typing import TYPE_CHECKING
|
|
9
|
+
|
|
10
|
+
__all__ = ["RBAmrSDK", "RBManipulateSDK", "RBBaseSDK", "RBRby1SDK"]
|
|
11
|
+
|
|
12
|
+
# 타입체커/IDE(자동완성)용: 여기서는 import 해도 런타임에 실행되지 않음
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from .amr import RBAmrSDK
|
|
15
|
+
from .base import RBBaseSDK
|
|
16
|
+
from .manipulate import RBManipulateSDK
|
|
17
|
+
from .rby1 import RBRby1SDK
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def __getattr__(name: str):
|
|
21
|
+
if name == "RBManipulateSDK":
|
|
22
|
+
from .manipulate import RBManipulateSDK # noqa: PLC0415
|
|
23
|
+
return RBManipulateSDK
|
|
24
|
+
|
|
25
|
+
if name == "RBBaseSDK":
|
|
26
|
+
from .base import RBBaseSDK # noqa: PLC0415
|
|
27
|
+
return RBBaseSDK
|
|
28
|
+
|
|
29
|
+
if name == "RBAmrSDK":
|
|
30
|
+
from .amr import RBAmrSDK # noqa: PLC0415
|
|
31
|
+
return RBAmrSDK
|
|
32
|
+
|
|
33
|
+
if name == "RBRby1SDK":
|
|
34
|
+
from .rby1 import RBRby1SDK # noqa: PLC0415
|
|
35
|
+
return RBRby1SDK
|
|
36
|
+
|
|
37
|
+
raise AttributeError(name)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def __dir__() -> list[str]:
|
|
41
|
+
# dir(rb_sdk) 결과가 __all__과 일치하게 (IDE/REPL 친화)
|
|
42
|
+
return sorted(__all__)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
from rainbow.rb_sdk.amr_sdk.amr_capability import RBAmrCapabilitySDK
|
|
4
|
+
from rainbow.rb_sdk.amr_sdk.amr_program import RBAmrProgramSDK
|
|
5
|
+
|
|
6
|
+
from .amr_sdk.amr_control import RBAmrControlSDK
|
|
7
|
+
from .amr_sdk.amr_file import RBAmrFileSDK
|
|
8
|
+
from .amr_sdk.amr_localization import RBAmrLocalizationSDK
|
|
9
|
+
from .amr_sdk.amr_map import RBAmrMapSDK
|
|
10
|
+
from .amr_sdk.amr_move import RBAmrMoveSDK
|
|
11
|
+
from .amr_sdk.amr_setting import RBAmrSettingSDK
|
|
12
|
+
from .amr_sdk.amr_status import RBAmrStatusSDK
|
|
13
|
+
from .base import RBBaseSDK
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class RBAmrSDK(RBBaseSDK):
|
|
17
|
+
"""Rainbow Robotics AMR SDK"""
|
|
18
|
+
|
|
19
|
+
move: RBAmrMoveSDK
|
|
20
|
+
"""AMR 이동 관련 SDK 집합"""
|
|
21
|
+
|
|
22
|
+
control: RBAmrControlSDK
|
|
23
|
+
"""AMR 제어 관련 SDK 집합"""
|
|
24
|
+
|
|
25
|
+
localization: RBAmrLocalizationSDK
|
|
26
|
+
"""AMR 위치 추정 관련 SDK 집합"""
|
|
27
|
+
|
|
28
|
+
map: RBAmrMapSDK
|
|
29
|
+
"""AMR 맵 관련 SDK 집합"""
|
|
30
|
+
|
|
31
|
+
setting: RBAmrSettingSDK
|
|
32
|
+
"""AMR 설정 관련 SDK 집합"""
|
|
33
|
+
|
|
34
|
+
file: RBAmrFileSDK
|
|
35
|
+
"""AMR 파일 관련 SDK 집합"""
|
|
36
|
+
|
|
37
|
+
status: RBAmrStatusSDK
|
|
38
|
+
"""AMR 상태 관련 SDK 집합"""
|
|
39
|
+
|
|
40
|
+
capability: RBAmrCapabilitySDK
|
|
41
|
+
"""AMR 기능 관련 SDK 집합"""
|
|
42
|
+
|
|
43
|
+
program: RBAmrProgramSDK
|
|
44
|
+
"""AMR 프로그램 관련 SDK 집합"""
|
|
45
|
+
|
|
46
|
+
def __init__(self):
|
|
47
|
+
super().__init__(server="amr")
|
|
48
|
+
|
|
49
|
+
self.move = RBAmrMoveSDK()
|
|
50
|
+
self.control = RBAmrControlSDK()
|
|
51
|
+
self.localization = RBAmrLocalizationSDK()
|
|
52
|
+
self.map = RBAmrMapSDK()
|
|
53
|
+
self.setting = RBAmrSettingSDK()
|
|
54
|
+
self.file = RBAmrFileSDK()
|
|
55
|
+
self.status = RBAmrStatusSDK()
|
|
56
|
+
self.capability = RBAmrCapabilitySDK()
|
|
57
|
+
self.program = RBAmrProgramSDK()
|
|
File without changes
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import uuid
|
|
3
|
+
from contextlib import suppress
|
|
4
|
+
from time import time
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from rainbow.rb_flat_buffers.SLAMNAV.RequestLiftPower import RequestLiftPowerT
|
|
8
|
+
from rainbow.rb_flat_buffers.SLAMNAV.ResponseLiftPower import ResponseLiftPowerT
|
|
9
|
+
from rainbow.rb_schemas.sdk import FlowManagerArgs
|
|
10
|
+
from rainbow.rb_utils.parser import t_to_dict
|
|
11
|
+
|
|
12
|
+
from rainbow.rb_sdk.base import RBBaseSDK
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RBAmrAccessorySDK(RBBaseSDK):
|
|
16
|
+
""" Rainbow Robotics AMR Accessory SDK """
|
|
17
|
+
|
|
18
|
+
async def _accessory_flow_manager_solver(self, robot_model: str, req_id: str, flow_manager_args: FlowManagerArgs | None = None):
|
|
19
|
+
"""
|
|
20
|
+
Accessory flow manager solver for AMR.
|
|
21
|
+
"""
|
|
22
|
+
if flow_manager_args is None:
|
|
23
|
+
return None
|
|
24
|
+
|
|
25
|
+
done_event = asyncio.Event()
|
|
26
|
+
state: dict[str, Any] = {
|
|
27
|
+
"finished": False,
|
|
28
|
+
"error": "",
|
|
29
|
+
"last_seen": time.monotonic(),
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
def all_stop(*, flow_manager_args: FlowManagerArgs | None = None):
|
|
33
|
+
"""모든 프로세스 정지"""
|
|
34
|
+
with suppress(Exception):
|
|
35
|
+
self.zenoh_client.query_one("muscat/stop", payload={})
|
|
36
|
+
if flow_manager_args is not None:
|
|
37
|
+
flow_manager_args.done()
|
|
38
|
+
|
|
39
|
+
async def _on_status(*, obj_payload=None, unsubscribe=None, **_):
|
|
40
|
+
if state["finished"] or obj_payload is None:
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
flow_manager_args.ctx.check_stop()
|
|
45
|
+
state["last_seen"] = time.monotonic()
|
|
46
|
+
|
|
47
|
+
obj = t_to_dict(obj_payload)
|
|
48
|
+
print(f"FLOW MANAGER ACCESSORY STATUS >>>>>>>>>>> {obj.get('mapState').get('mapId')} {req_id} {obj.get('mapState').get('mapResult')} ", flush=True)
|
|
49
|
+
|
|
50
|
+
# if obj.get("mapState").get("mapId") != req_id:
|
|
51
|
+
# raise RuntimeError("Map ID Mismatch")
|
|
52
|
+
|
|
53
|
+
# if obj.get("mapState").get("mapResult") == "success":
|
|
54
|
+
# print("Map Flow Manager SOLVER DONE", flush=True)
|
|
55
|
+
# flow_manager_args.done()
|
|
56
|
+
# state["finished"] = True
|
|
57
|
+
# if unsubscribe is not None:
|
|
58
|
+
# unsubscribe()
|
|
59
|
+
# done_event.set()
|
|
60
|
+
# elif obj.get("mapState").get("mapResult") == "fail":
|
|
61
|
+
# raise RuntimeError("Map Load Fail")
|
|
62
|
+
# elif obj.get("mapState").get("mapResult") == "cancel":
|
|
63
|
+
# raise RuntimeError("Map Load Cancel")
|
|
64
|
+
except Exception as e:
|
|
65
|
+
state["finished"] = True
|
|
66
|
+
state["error"] = str(e)
|
|
67
|
+
if unsubscribe is not None:
|
|
68
|
+
unsubscribe()
|
|
69
|
+
done_event.set()
|
|
70
|
+
|
|
71
|
+
async def _watchdog():
|
|
72
|
+
timeout_sec = 2.0
|
|
73
|
+
interval_sec = 0.5
|
|
74
|
+
while not state["finished"]:
|
|
75
|
+
await asyncio.sleep(interval_sec)
|
|
76
|
+
if state["finished"]:
|
|
77
|
+
return
|
|
78
|
+
if time.monotonic() - state["last_seen"] > timeout_sec:
|
|
79
|
+
state["finished"] = True
|
|
80
|
+
state["error"] = "Map Load Fail (Timeout)"
|
|
81
|
+
done_event.set()
|
|
82
|
+
return
|
|
83
|
+
|
|
84
|
+
# sub_handle = self.zenoh_client.subscribe(
|
|
85
|
+
# f"amr/{robot_model}/status",
|
|
86
|
+
# _on_status,
|
|
87
|
+
# flatbuffer_obj_t=StatusT,
|
|
88
|
+
# options=SubscribeOptions(
|
|
89
|
+
# dispatch="queue",
|
|
90
|
+
# overflow=OverflowPolicy.LATEST_ONLY,
|
|
91
|
+
# parse_dict_payload=False,
|
|
92
|
+
# ),
|
|
93
|
+
# )
|
|
94
|
+
watchdog_task = asyncio.create_task(_watchdog())
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
await done_event.wait()
|
|
99
|
+
if state["error"] != "":
|
|
100
|
+
raise RuntimeError(state["error"])
|
|
101
|
+
except asyncio.CancelledError:
|
|
102
|
+
pass
|
|
103
|
+
except Exception as e:
|
|
104
|
+
all_stop(flow_manager_args=flow_manager_args)
|
|
105
|
+
raise RuntimeError(str(e)) from e
|
|
106
|
+
finally:
|
|
107
|
+
watchdog_task.cancel()
|
|
108
|
+
try:
|
|
109
|
+
await watchdog_task
|
|
110
|
+
except asyncio.CancelledError:
|
|
111
|
+
print("WATCHDOG CANCELLED", flush=True)
|
|
112
|
+
# sub_handle.close()
|
|
113
|
+
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
def set_lift_power(self, robot_model: str, switch: bool, req_id: str | None = None, flow_manager_args: FlowManagerArgs | None = None) -> ResponseLiftPowerT:
|
|
117
|
+
"""
|
|
118
|
+
[Lift 전원 제어]
|
|
119
|
+
- robot_model: 로봇 모델
|
|
120
|
+
- switch: 리프트 전원 스위치 (True: ON, False: OFF)
|
|
121
|
+
- req_id: 요청 ID (선택 사항)
|
|
122
|
+
- flow_manager_args: 플로우 매니저 인자 (선택 사항)
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
if req_id is None:
|
|
126
|
+
req_id = str(uuid.uuid4())
|
|
127
|
+
|
|
128
|
+
# 1) RequestLiftPower 객체 생성
|
|
129
|
+
req = RequestLiftPowerT()
|
|
130
|
+
req.id = req_id
|
|
131
|
+
req.switch = switch
|
|
132
|
+
|
|
133
|
+
# 2) 요청 전송
|
|
134
|
+
result = self.zenoh_client.query_one(
|
|
135
|
+
f"amr/{robot_model}/accessory/lift",
|
|
136
|
+
flatbuffer_req_obj=req,
|
|
137
|
+
flatbuffer_res_T_class=ResponseLiftPowerT,
|
|
138
|
+
flatbuffer_buf_size=2048,
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# 3) 결과 처리 및 반환
|
|
142
|
+
if result.get("obj_payload") is None:
|
|
143
|
+
raise RuntimeError("Call Lift Power failed: obj_payload is None")
|
|
144
|
+
|
|
145
|
+
if flow_manager_args is not None:
|
|
146
|
+
print(result["dict_payload"].get("result"))
|
|
147
|
+
if result["dict_payload"].get("result") == "reject":
|
|
148
|
+
raise RuntimeError(result["dict_payload"].get("message"))
|
|
149
|
+
|
|
150
|
+
self._run_coro_blocking(
|
|
151
|
+
self._accessory_flow_manager_solver(
|
|
152
|
+
robot_model=robot_model,
|
|
153
|
+
req_id=req_id,
|
|
154
|
+
flow_manager_args=flow_manager_args,
|
|
155
|
+
)
|
|
156
|
+
)
|
|
157
|
+
return result["obj_payload"]
|
|
158
|
+
|
|
159
|
+
# def set_foot_pose(self, robot_model: str, foot_pose: FootPoseT, req_id: str | None = None, flow_manager_args: FlowManagerArgs | None = None) -> ResponseFootPoseT:
|
|
160
|
+
# """
|
|
161
|
+
# [Foot Pose 제어]
|
|
162
|
+
# - robot_model: 로봇 모델
|
|
163
|
+
# - foot_pose: 발 포즈 정보
|
|
164
|
+
# - req_id: 요청 ID (선택 사항)
|
|
165
|
+
# - flow_manager_args: 플로우 매니저 인자 (선택 사항)
|
|
166
|
+
# """
|
|
167
|
+
|
|
168
|
+
# if req_id is None:
|
|
169
|
+
# req_id = str(uuid.uuid4())
|
|
170
|
+
|
|
171
|
+
# # 1) RequestFootMove 객체 생성
|
|
172
|
+
# req = RequestFootMoveT()
|
|
173
|
+
# req.id = req_id
|
|
174
|
+
# req.pose = foot_pose
|
|
175
|
+
|
|
176
|
+
# # 2) 요청 전송
|
|
177
|
+
# result = self.zenoh_client.query_one(
|
|
178
|
+
# f"amr/{robot_model}/accessory/foot",
|
|
179
|
+
# flatbuffer_req_obj=req,
|
|
180
|
+
# flatbuffer_res_T_class=ResponseFootMoveT,
|
|
181
|
+
# flatbuffer_buf_size=2048,
|
|
182
|
+
# )
|
|
183
|
+
|
|
184
|
+
# # 3) 결과 처리 및 반환
|
|
185
|
+
# if result.get("obj_payload") is None:
|
|
186
|
+
# raise RuntimeError("Call Foot Pose failed: obj_payload is None")
|
|
187
|
+
|
|
188
|
+
# if flow_manager_args is not None:
|
|
189
|
+
# print(result["dict_payload"].get("result"))
|
|
190
|
+
# if result["dict_payload"].get("result") == "reject":
|
|
191
|
+
# raise RuntimeError(result["dict_payload"].get("message"))
|
|
192
|
+
|
|
193
|
+
# self._run_coro_blocking(
|
|
194
|
+
# self._accessory_flow_manager_solver(
|
|
195
|
+
# robot_model=robot_model,
|
|
196
|
+
# req_id=req_id,
|
|
197
|
+
# flow_manager_args=flow_manager_args,
|
|
198
|
+
# )
|
|
199
|
+
# )
|
|
200
|
+
# return result["obj_payload"]
|