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.
Files changed (57) hide show
  1. rainbow_rb_sdk-0.0.9.dev5/PKG-INFO +137 -0
  2. rainbow_rb_sdk-0.0.9.dev5/README.md +124 -0
  3. rainbow_rb_sdk-0.0.9.dev5/pyproject.toml +32 -0
  4. rainbow_rb_sdk-0.0.9.dev5/setup.cfg +4 -0
  5. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/__init__.py +42 -0
  6. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr.py +57 -0
  7. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/__init__.py +0 -0
  8. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_accessory.py +200 -0
  9. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_capability.py +391 -0
  10. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_control.py +995 -0
  11. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_file.py +162 -0
  12. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_localization.py +407 -0
  13. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_map.py +664 -0
  14. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_move.py +732 -0
  15. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_program.py +125 -0
  16. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_setting.py +600 -0
  17. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/amr_status.py +123 -0
  18. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/amr_sdk/schema/__init__.py +0 -0
  19. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/base.py +517 -0
  20. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/base_sdk/__init__.py +0 -0
  21. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/base_sdk/base_schema.py +7 -0
  22. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate.py +51 -0
  23. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/__init__.py +0 -0
  24. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_config.py +1362 -0
  25. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_get_data.py +149 -0
  26. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_io.py +1057 -0
  27. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_move.py +1649 -0
  28. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_point.py +138 -0
  29. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_program.py +772 -0
  30. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_service.py +761 -0
  31. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_smbc.py +144 -0
  32. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/manipulate_state.py +181 -0
  33. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/__init__.py +0 -0
  34. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_config_schema.py +132 -0
  35. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_io_schema.py +41 -0
  36. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_move_schema.py +19 -0
  37. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_program_schema.py +35 -0
  38. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/program_sdk/__init__.py +0 -0
  39. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/program_sdk/program.py +757 -0
  40. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1.py +18 -0
  41. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/__init__.py +21 -0
  42. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/base.py +8 -0
  43. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/client.py +111 -0
  44. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/config.py +9 -0
  45. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/control.py +64 -0
  46. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/exceptions.py +10 -0
  47. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/rby1_sdk/state.py +40 -0
  48. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/__init__.py +0 -0
  49. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/amr_schema.py +0 -0
  50. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/base_schema.py +0 -0
  51. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/manipulate_schema.py +52 -0
  52. rainbow_rb_sdk-0.0.9.dev5/src/rainbow/rb_sdk/schema/program_schema.py +51 -0
  53. rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/PKG-INFO +137 -0
  54. rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/SOURCES.txt +55 -0
  55. rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/dependency_links.txt +1 -0
  56. rainbow_rb_sdk-0.0.9.dev5/src/rainbow_rb_sdk.egg-info/requires.txt +5 -0
  57. 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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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()
@@ -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"]