rainbow-rb-sdk 0.0.9.dev29__tar.gz → 0.0.9.dev32__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 (66) hide show
  1. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/PKG-INFO +6 -6
  2. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/pyproject.toml +6 -6
  3. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr.py +5 -0
  4. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_accessory.py +1 -1
  5. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_control.py +17 -63
  6. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_localization.py +12 -15
  7. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_map.py +17 -20
  8. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_move.py +51 -19
  9. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_program.py +44 -37
  10. rainbow_rb_sdk-0.0.9.dev32/src/rainbow/rb_sdk/amr_sdk/amr_sensor.py +169 -0
  11. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_setting.py +143 -134
  12. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/base.py +95 -4
  13. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_move.py +194 -18
  14. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_program.py +2 -2
  15. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_service.py +191 -1
  16. rainbow_rb_sdk-0.0.9.dev32/src/rainbow/rb_sdk/program_sdk/__init__.py +39 -0
  17. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/program_sdk/program_interface.py +33 -1
  18. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/rby1.py +20 -7
  19. rainbow_rb_sdk-0.0.9.dev32/src/rainbow/rb_sdk/rby1_sdk/base.py +354 -0
  20. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/rby1_sdk/config.py +4 -1
  21. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/rby1_sdk/control.py +63 -38
  22. rainbow_rb_sdk-0.0.9.dev32/src/rainbow/rb_sdk/rby1_sdk/state.py +168 -0
  23. rainbow_rb_sdk-0.0.9.dev32/src/rainbow/rb_sdk/schema/rby1_schema.py +119 -0
  24. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow_rb_sdk.egg-info/PKG-INFO +6 -6
  25. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow_rb_sdk.egg-info/SOURCES.txt +2 -0
  26. rainbow_rb_sdk-0.0.9.dev32/src/rainbow_rb_sdk.egg-info/requires.txt +6 -0
  27. rainbow_rb_sdk-0.0.9.dev29/src/rainbow/rb_sdk/rby1_sdk/base.py +0 -165
  28. rainbow_rb_sdk-0.0.9.dev29/src/rainbow/rb_sdk/rby1_sdk/state.py +0 -80
  29. rainbow_rb_sdk-0.0.9.dev29/src/rainbow/rb_sdk/schema/__init__.py +0 -0
  30. rainbow_rb_sdk-0.0.9.dev29/src/rainbow_rb_sdk.egg-info/requires.txt +0 -6
  31. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/README.md +0 -0
  32. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/setup.cfg +0 -0
  33. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/__init__.py +0 -0
  34. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/__init__.py +0 -0
  35. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_capability.py +0 -0
  36. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_file.py +0 -0
  37. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/amr_status.py +0 -0
  38. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/amr_sdk/schema/__init__.py +0 -0
  39. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/base_sdk/__init__.py +0 -0
  40. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/base_sdk/base_schema.py +0 -0
  41. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate.py +0 -0
  42. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/__init__.py +0 -0
  43. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_config.py +0 -0
  44. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_get_data.py +0 -0
  45. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_io.py +0 -0
  46. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_maintenance.py +0 -0
  47. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_point.py +0 -0
  48. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/manipulate_state.py +0 -0
  49. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/schema/__init__.py +0 -0
  50. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_config_schema.py +0 -0
  51. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_io_schema.py +0 -0
  52. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_move_schema.py +0 -0
  53. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/manipulate_sdk/schema/manipulate_program_schema.py +0 -0
  54. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/program_sdk/client_modules.pyi +0 -0
  55. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/program_sdk/program.py +0 -0
  56. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/program_sdk/test_binding.py +0 -0
  57. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/rby1_sdk/__init__.py +0 -0
  58. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/rby1_sdk/client.py +0 -0
  59. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/rby1_sdk/exceptions.py +0 -0
  60. {rainbow_rb_sdk-0.0.9.dev29/src/rainbow/rb_sdk/program_sdk → rainbow_rb_sdk-0.0.9.dev32/src/rainbow/rb_sdk/schema}/__init__.py +0 -0
  61. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/schema/amr_schema.py +0 -0
  62. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/schema/base_schema.py +0 -0
  63. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/schema/manipulate_schema.py +0 -0
  64. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow/rb_sdk/schema/program_schema.py +0 -0
  65. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow_rb_sdk.egg-info/dependency_links.txt +0 -0
  66. {rainbow_rb_sdk-0.0.9.dev29 → rainbow_rb_sdk-0.0.9.dev32}/src/rainbow_rb_sdk.egg-info/top_level.txt +0 -0
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rainbow-rb-sdk
3
- Version: 0.0.9.dev29
3
+ Version: 0.0.9.dev32
4
4
  Summary: Rainbow Robotics 통합 Python SDK — AMR, 매니퓰레이터, RB-Y1 휴머노이드와 Rainbow Robot Service(common) 연동
5
5
  Author-email: Derek <dfd1123@rainbow-robotics.com>
6
6
  Requires-Python: >=3.11
7
7
  Description-Content-Type: text/markdown
8
- Requires-Dist: rainbow-rb-utils==0.0.9.dev29
9
- Requires-Dist: rainbow-rb-zenoh==0.0.9.dev29
10
- Requires-Dist: rainbow-rb-flat-buffers==0.0.9.dev29
11
- Requires-Dist: rainbow-rb-schemas==0.0.9.dev29
12
- Requires-Dist: rainbow-rb-log==0.0.9.dev29
8
+ Requires-Dist: rainbow-rb-utils==0.0.9.dev32
9
+ Requires-Dist: rainbow-rb-zenoh==0.0.9.dev32
10
+ Requires-Dist: rainbow-rb-flat-buffers==0.0.9.dev32
11
+ Requires-Dist: rainbow-rb-schemas==0.0.9.dev32
12
+ Requires-Dist: rainbow-rb-log==0.0.9.dev32
13
13
  Requires-Dist: rby1-sdk>=0.9.1
14
14
 
15
15
  # rb_sdk
@@ -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.dev29"
7
+ version = "0.0.9.dev32"
8
8
  requires-python = ">=3.11"
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.dev29",
17
- "rainbow-rb-zenoh==0.0.9.dev29",
18
- "rainbow-rb-flat-buffers==0.0.9.dev29",
19
- "rainbow-rb-schemas==0.0.9.dev29",
20
- "rainbow-rb-log==0.0.9.dev29",
16
+ "rainbow-rb-utils==0.0.9.dev32",
17
+ "rainbow-rb-zenoh==0.0.9.dev32",
18
+ "rainbow-rb-flat-buffers==0.0.9.dev32",
19
+ "rainbow-rb-schemas==0.0.9.dev32",
20
+ "rainbow-rb-log==0.0.9.dev32",
21
21
  "rby1-sdk>=0.9.1",
22
22
  ]
23
23
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  from rainbow.rb_sdk.amr_sdk.amr_capability import RBAmrCapabilitySDK
4
4
  from rainbow.rb_sdk.amr_sdk.amr_program import RBAmrProgramSDK
5
+ from rainbow.rb_sdk.amr_sdk.amr_sensor import RBAmrSensorSDK
5
6
 
6
7
  from .amr_sdk.amr_control import RBAmrControlSDK
7
8
  from .amr_sdk.amr_file import RBAmrFileSDK
@@ -43,6 +44,9 @@ class RBAmrSDK(RBBaseSDK):
43
44
  program: RBAmrProgramSDK
44
45
  """AMR 프로그램 관련 SDK 집합"""
45
46
 
47
+ sensor: RBAmrSensorSDK
48
+ """AMR 센서 관련 SDK 집합"""
49
+
46
50
  def __init__(self):
47
51
  super().__init__(server="amr")
48
52
 
@@ -55,3 +59,4 @@ class RBAmrSDK(RBBaseSDK):
55
59
  self.status = RBAmrStatusSDK()
56
60
  self.capability = RBAmrCapabilitySDK()
57
61
  self.program = RBAmrProgramSDK()
62
+ self.sensor = RBAmrSensorSDK()
@@ -22,7 +22,7 @@ class RBAmrAccessorySDK(RBBaseSDK):
22
22
  if flow_manager_args is None:
23
23
  return None
24
24
 
25
- done_event = asyncio.Event()
25
+ done_event = self._zenoh_subs_done_event()
26
26
  state: dict[str, Any] = {
27
27
  "finished": False,
28
28
  "error": "",
@@ -14,7 +14,6 @@ from rainbow.rb_flat_buffers.SLAMNAV.RequestGetSafetyField import RequestGetSafe
14
14
  from rainbow.rb_flat_buffers.SLAMNAV.RequestGetSafetyFlag import RequestGetSafetyFlagT
15
15
  from rainbow.rb_flat_buffers.SLAMNAV.RequestGetSafetyIo import RequestGetSafetyIoT
16
16
  from rainbow.rb_flat_buffers.SLAMNAV.RequestSetAvoid import RequestSetAvoidT
17
- from rainbow.rb_flat_buffers.SLAMNAV.RequestSetDetectMode import RequestSetDetectModeT
18
17
  from rainbow.rb_flat_buffers.SLAMNAV.RequestSetJog import RequestSetJogT
19
18
  from rainbow.rb_flat_buffers.SLAMNAV.RequestSetLed import RequestSetLedT
20
19
  from rainbow.rb_flat_buffers.SLAMNAV.RequestSetMotor import RequestSetMotorT
@@ -32,7 +31,6 @@ from rainbow.rb_flat_buffers.SLAMNAV.ResponseGetSafetyField import ResponseGetSa
32
31
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseGetSafetyFlag import ResponseGetSafetyFlagT
33
32
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseGetSafetyIo import ResponseGetSafetyIoT
34
33
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseSetAvoid import ResponseSetAvoidT
35
- from rainbow.rb_flat_buffers.SLAMNAV.ResponseSetDetectMode import ResponseSetDetectModeT
36
34
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseSetJog import ResponseSetJogT
37
35
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseSetLed import ResponseSetLedT
38
36
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseSetMotor import ResponseSetMotorT
@@ -76,7 +74,7 @@ class RBAmrControlSDK(RBBaseSDK):
76
74
  if req_id is None:
77
75
  req_id = str(uuid.uuid4())
78
76
 
79
- done_event = asyncio.Event()
77
+ done_event = self._zenoh_subs_done_event()
80
78
  state: dict[str, Any] = {
81
79
  "finished": False,
82
80
  "error": "",
@@ -138,7 +136,7 @@ class RBAmrControlSDK(RBBaseSDK):
138
136
  done_event.set()
139
137
  return
140
138
 
141
- sub_handle = self.zenoh_client.subscribe(
139
+ async with self._zenoh_sub_with_close(
142
140
  f"amr/{robot_model}/status",
143
141
  _on_status,
144
142
  flatbuffer_obj_t=StatusT,
@@ -147,25 +145,23 @@ class RBAmrControlSDK(RBBaseSDK):
147
145
  overflow=OverflowPolicy.LATEST_ONLY,
148
146
  parse_dict_payload=False,
149
147
  ),
150
- )
151
- watchdog_task = asyncio.create_task(_watchdog())
152
-
153
- try:
154
- await done_event.wait()
155
- if state["error"] != "":
156
- raise RuntimeError(state["error"])
157
- except asyncio.CancelledError:
158
- pass
159
- except Exception as e:
160
- all_stop(flow_manager_args=flow_manager_args)
161
- raise RuntimeError(str(e)) from e
162
- finally:
163
- watchdog_task.cancel()
148
+ ):
149
+ watchdog_task = asyncio.create_task(_watchdog())
164
150
  try:
165
- await watchdog_task
151
+ await done_event.wait()
152
+ if state["error"] != "":
153
+ raise RuntimeError(state["error"])
166
154
  except asyncio.CancelledError:
167
- print("WATCHDOG CANCELLED", flush=True)
168
- sub_handle.close()
155
+ pass
156
+ except Exception as e:
157
+ all_stop(flow_manager_args=flow_manager_args)
158
+ raise RuntimeError(str(e)) from e
159
+ finally:
160
+ watchdog_task.cancel()
161
+ try:
162
+ await watchdog_task
163
+ except asyncio.CancelledError:
164
+ print("WATCHDOG CANCELLED", flush=True)
169
165
 
170
166
  return None
171
167
 
@@ -936,48 +932,6 @@ class RBAmrControlSDK(RBBaseSDK):
936
932
 
937
933
  return result["obj_payload"]
938
934
 
939
- def control_set_detect_mode(
940
- self,
941
- robot_model: str,
942
- switch: bool,
943
- req_id: str | None = None,
944
- flow_manager_args: FlowManagerArgs | None = None,
945
- ) -> ResponseSetDetectModeT:
946
- """
947
- [탐지 모드 제어]
948
- - req_id: 요청 ID
949
- - switch: 탐지 모드 켜기/끄기 (True: 켜기, False: 끄기)
950
- - ResponseSetDetectModeT 객체 반환
951
- """
952
-
953
- if req_id is None:
954
- req_id = str(uuid.uuid4())
955
-
956
- # 1) RequestSetDetectModeT 객체 생성
957
- req = RequestSetDetectModeT()
958
- req.id = req_id
959
- req.switch = switch
960
-
961
- # 2) 요청 전송
962
- result = self.zenoh_client.query_one(
963
- f"amr/{robot_model}/control/setDetectMode",
964
- flatbuffer_req_obj=req,
965
- flatbuffer_res_T_class=ResponseSetDetectModeT,
966
- flatbuffer_buf_size=125,
967
- timeout=3,
968
- )
969
-
970
- # 3) 결과 처리 및 반환
971
- if result.get("obj_payload") is None:
972
- raise RuntimeError("Call Control Motor failed: obj_payload is None")
973
-
974
- if flow_manager_args is not None:
975
- if result["dict_payload"].get("result") == "accept":
976
- flow_manager_args.done()
977
- else:
978
- raise RuntimeError(result["dict_payload"].get("message"))
979
-
980
- return result["obj_payload"]
981
935
 
982
936
  # def control_sensor_mode(self, robot_model: str, req_id: str, command: str, control: bool, frequency: int) -> ResponseSensorModeT:
983
937
  # """
@@ -43,7 +43,7 @@ class RBAmrLocalizationSDK(RBBaseSDK):
43
43
  if req_id is None:
44
44
  req_id = str(uuid.uuid4())
45
45
 
46
- done_event = asyncio.Event()
46
+ done_event = self._zenoh_subs_done_event()
47
47
  state: dict[str, Any] = {"finished": False, "error": ""}
48
48
 
49
49
  def all_stop(*, flow_manager_args: FlowManagerArgs | None = None):
@@ -85,7 +85,7 @@ class RBAmrLocalizationSDK(RBBaseSDK):
85
85
  done_event.set()
86
86
  raise e
87
87
 
88
- sub_handle = self.zenoh_client.subscribe(
88
+ async with self._zenoh_sub_with_close(
89
89
  f"amr/{robot_model}/status",
90
90
  _on_status,
91
91
  flatbuffer_obj_t=StatusT,
@@ -94,19 +94,16 @@ class RBAmrLocalizationSDK(RBBaseSDK):
94
94
  overflow=OverflowPolicy.LATEST_ONLY,
95
95
  parse_dict_payload=False,
96
96
  ),
97
- )
98
-
99
- try:
100
- await done_event.wait()
101
- if state["error"] != "":
102
- raise RuntimeError(state["error"])
103
- except asyncio.CancelledError:
104
- pass
105
- except Exception as e:
106
- all_stop(flow_manager_args=flow_manager_args)
107
- raise RuntimeError(str(e)) from e
108
- finally:
109
- sub_handle.close()
97
+ ):
98
+ try:
99
+ await done_event.wait()
100
+ if state["error"] != "":
101
+ raise RuntimeError(state["error"])
102
+ except asyncio.CancelledError:
103
+ pass
104
+ except Exception as e:
105
+ all_stop(flow_manager_args=flow_manager_args)
106
+ raise RuntimeError(str(e)) from e
110
107
 
111
108
  return None
112
109
 
@@ -56,7 +56,7 @@ class RBAmrMapSDK(RBBaseSDK):
56
56
  if flow_manager_args is None:
57
57
  return None
58
58
 
59
- done_event = asyncio.Event()
59
+ done_event = self._zenoh_subs_done_event()
60
60
  state: dict[str, Any] = {
61
61
  "finished": False,
62
62
  "error": "",
@@ -114,7 +114,7 @@ class RBAmrMapSDK(RBBaseSDK):
114
114
  done_event.set()
115
115
  return
116
116
 
117
- sub_handle = self.zenoh_client.subscribe(
117
+ async with self._zenoh_sub_with_close(
118
118
  f"amr/{robot_model}/status",
119
119
  _on_status,
120
120
  flatbuffer_obj_t=StatusT,
@@ -123,26 +123,23 @@ class RBAmrMapSDK(RBBaseSDK):
123
123
  overflow=OverflowPolicy.LATEST_ONLY,
124
124
  parse_dict_payload=False,
125
125
  ),
126
- )
127
- watchdog_task = asyncio.create_task(_watchdog())
128
-
129
-
130
- try:
131
- await done_event.wait()
132
- if state["error"] != "":
133
- raise RuntimeError(state["error"])
134
- except asyncio.CancelledError:
135
- pass
136
- except Exception as e:
137
- all_stop(flow_manager_args=flow_manager_args)
138
- raise RuntimeError(str(e)) from e
139
- finally:
140
- watchdog_task.cancel()
126
+ ):
127
+ watchdog_task = asyncio.create_task(_watchdog())
141
128
  try:
142
- await watchdog_task
129
+ await done_event.wait()
130
+ if state["error"] != "":
131
+ raise RuntimeError(state["error"])
143
132
  except asyncio.CancelledError:
144
- print("WATCHDOG CANCELLED", flush=True)
145
- sub_handle.close()
133
+ pass
134
+ except Exception as e:
135
+ all_stop(flow_manager_args=flow_manager_args)
136
+ raise RuntimeError(str(e)) from e
137
+ finally:
138
+ watchdog_task.cancel()
139
+ try:
140
+ await watchdog_task
141
+ except asyncio.CancelledError:
142
+ print("WATCHDOG CANCELLED", flush=True)
146
143
 
147
144
  return None
148
145
 
@@ -7,6 +7,7 @@ from typing import Any
7
7
  from rainbow.rb_flat_buffers.SLAMNAV.MoveJog import MoveJogT
8
8
  from rainbow.rb_flat_buffers.SLAMNAV.MovePose import MovePoseT
9
9
  from rainbow.rb_flat_buffers.SLAMNAV.MoveStatus import MoveStatusT
10
+ from rainbow.rb_flat_buffers.SLAMNAV.RequestEnqueueAction import RequestEnqueueActionT
10
11
  from rainbow.rb_flat_buffers.SLAMNAV.RequestMoveCircular import RequestMoveCircularT
11
12
  from rainbow.rb_flat_buffers.SLAMNAV.RequestMoveGoal import RequestMoveGoalT
12
13
  from rainbow.rb_flat_buffers.SLAMNAV.RequestMovePause import RequestMovePauseT
@@ -18,6 +19,7 @@ from rainbow.rb_flat_buffers.SLAMNAV.RequestMoveXLinear import RequestMoveXLinea
18
19
  from rainbow.rb_flat_buffers.SLAMNAV.RequestMoveYLinear import RequestMoveYLinearT
19
20
  from rainbow.rb_flat_buffers.SLAMNAV.RequestMultiPath import RequestMultiPathT
20
21
  from rainbow.rb_flat_buffers.SLAMNAV.RequestMultiVobs import RequestMultiVobsT
22
+ from rainbow.rb_flat_buffers.SLAMNAV.ResponseEnqueueAction import ResponseEnqueueActionT
21
23
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseMoveCircular import ResponseMoveCircularT
22
24
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseMoveGoal import ResponseMoveGoalT
23
25
  from rainbow.rb_flat_buffers.SLAMNAV.ResponseMovePause import ResponseMovePauseT
@@ -58,7 +60,7 @@ class RBAmrMoveSDK(RBBaseSDK):
58
60
  if flow_manager_args is None:
59
61
  return None
60
62
 
61
- done_event = asyncio.Event()
63
+ done_event = self._zenoh_subs_done_event()
62
64
  state: dict[str, Any] = {
63
65
  "finished": False,
64
66
  "error": "",
@@ -118,7 +120,7 @@ class RBAmrMoveSDK(RBBaseSDK):
118
120
 
119
121
  await asyncio.sleep(interval_sec)
120
122
 
121
- sub_handle = self.zenoh_client.subscribe(
123
+ async with self._zenoh_sub_with_close(
122
124
  f"amr/{robot_model}/moveStatus",
123
125
  _on_move_status,
124
126
  flatbuffer_obj_t=MoveStatusT,
@@ -127,25 +129,23 @@ class RBAmrMoveSDK(RBBaseSDK):
127
129
  overflow=OverflowPolicy.LATEST_ONLY,
128
130
  parse_dict_payload=False,
129
131
  ),
130
- )
131
- watchdog_task = asyncio.create_task(_watchdog())
132
-
133
- try:
134
- await done_event.wait()
135
- if state["error"] != "":
136
- raise RuntimeError(state["error"])
137
- except asyncio.CancelledError:
138
- pass
139
- except Exception as e:
140
- all_stop(flow_manager_args=flow_manager_args)
141
- raise RuntimeError(str(e)) from e
142
- finally:
143
- watchdog_task.cancel()
132
+ ):
133
+ watchdog_task = asyncio.create_task(_watchdog())
144
134
  try:
145
- await watchdog_task
135
+ await done_event.wait()
136
+ if state["error"] != "":
137
+ raise RuntimeError(state["error"])
146
138
  except asyncio.CancelledError:
147
- print("WATCHDOG CANCELLED", flush=True)
148
- sub_handle.close()
139
+ pass
140
+ except Exception as e:
141
+ all_stop(flow_manager_args=flow_manager_args)
142
+ raise RuntimeError(str(e)) from e
143
+ finally:
144
+ watchdog_task.cancel()
145
+ try:
146
+ await watchdog_task
147
+ except asyncio.CancelledError:
148
+ print("WATCHDOG CANCELLED", flush=True)
149
149
  return None
150
150
 
151
151
 
@@ -730,3 +730,35 @@ class RBAmrMoveSDK(RBBaseSDK):
730
730
  )
731
731
 
732
732
  return result["obj_payload"]
733
+
734
+ def send_multi_enqueue(self, robot_model: str, action_id: str, predecessor_id: str, from_node: str, to_node: str) -> ResponseEnqueueActionT:
735
+ """
736
+ [멀티 edgeAction을 추가]
737
+ - robot_model: 로봇
738
+ - action_id: 액션 ID (UUID)
739
+ - predecessor_id: 로봇 현재 tail의 action_id
740
+ - from_node:
741
+ - to_node:
742
+ - flow_manager_args: FlowManagerArgs 객체
743
+ - ResponseMultiPathT 객체 반환
744
+ """
745
+ # 1) RequestEnqueueActionT 객체 생성
746
+ req = RequestEnqueueActionT()
747
+ req.action_id = action_id
748
+ req.predecessor_id = predecessor_id
749
+ req.from_node = from_node
750
+ req.to_node = to_node
751
+
752
+ # 2) 요청 전송
753
+ result = self.zenoh_client.query_one(
754
+ f"amr/{robot_model}/multi/enqueue",
755
+ flatbuffer_req_obj=req,
756
+ flatbuffer_res_T_class=ResponseEnqueueActionT,
757
+ flatbuffer_buf_size=125,
758
+ )
759
+
760
+ # 3) 결과 처리 및 반환
761
+ if result["obj_payload"] is None:
762
+ raise RuntimeError("Call Multi Path failed: obj_payload is None")
763
+
764
+ return result["obj_payload"]
@@ -4,8 +4,7 @@ from rainbow.rb_flat_buffers.IPC.Request_MotionResume import Request_MotionResum
4
4
  from rainbow.rb_flat_buffers.IPC.Request_ProgramAfter import Request_ProgramAfterT
5
5
  from rainbow.rb_flat_buffers.IPC.Request_ProgramBefore import Request_ProgramBeforeT
6
6
  from rainbow.rb_flat_buffers.IPC.Response_Functions import Response_FunctionsT
7
- from rainbow.rb_log.log import rb_log
8
- from rainbow.rb_zenoh.exception import ZenohNoReply, ZenohReplyError
7
+ from rainbow.rb_flat_buffers.SLAMNAV.ResponseCurrentVersion import ResponseCurrentVersionT
9
8
 
10
9
  from rainbow.rb_sdk.base import RBBaseSDK
11
10
 
@@ -74,25 +73,20 @@ class RBAmrProgramSDK(RBBaseSDK):
74
73
  option: 프로그램 옵션
75
74
  """
76
75
 
77
- try:
78
- req = Request_ProgramBeforeT()
79
- req.option = option
76
+ req = Request_ProgramBeforeT()
77
+ req.option = option
80
78
 
81
- res = self.zenoh_client.query_one(
82
- f"amr/{robot_model}/call_program_before",
83
- flatbuffer_req_obj=req,
84
- flatbuffer_res_T_class=Response_FunctionsT,
85
- flatbuffer_buf_size=2,
86
- )
79
+ res = self.zenoh_client.query_one(
80
+ f"amr/{robot_model}/call_program_before",
81
+ flatbuffer_req_obj=req,
82
+ flatbuffer_res_T_class=Response_FunctionsT,
83
+ flatbuffer_buf_size=2,
84
+ )
87
85
 
88
- if res["obj_payload"] is None:
89
- raise RuntimeError("Call Program Before failed: obj_payload is None")
86
+ if res["obj_payload"] is None:
87
+ raise RuntimeError("Call Program Before failed: obj_payload is None")
90
88
 
91
- return res["obj_payload"]
92
- except (ZenohNoReply, ZenohReplyError) as e:
93
- rb_log.error(f"Call Program Before failed: {e}")
94
- except Exception as e:
95
- raise e
89
+ return res["obj_payload"]
96
90
 
97
91
  def call_program_after(self, robot_model: str, option: int) -> Response_FunctionsT:
98
92
  """
@@ -102,22 +96,35 @@ class RBAmrProgramSDK(RBBaseSDK):
102
96
  robot_model: 로봇 모델명
103
97
  option: 프로그램 옵션
104
98
  """
105
- try:
106
- req = Request_ProgramAfterT()
107
- req.option = option
108
-
109
- res = self.zenoh_client.query_one(
110
- f"amr/{robot_model}/call_program_after",
111
- flatbuffer_req_obj=req,
112
- flatbuffer_res_T_class=Response_FunctionsT,
113
- flatbuffer_buf_size=2,
114
- )
115
-
116
- if res["obj_payload"] is None:
117
- raise RuntimeError("Call Program After failed: obj_payload is None")
118
-
119
- return res["obj_payload"]
120
- except (ZenohNoReply, ZenohReplyError) as e:
121
- rb_log.error(f"Call Program After failed: {e}")
122
- except Exception as e:
123
- raise e
99
+ req = Request_ProgramAfterT()
100
+ req.option = option
101
+
102
+ res = self.zenoh_client.query_one(
103
+ f"amr/{robot_model}/call_program_after",
104
+ flatbuffer_req_obj=req,
105
+ flatbuffer_res_T_class=Response_FunctionsT,
106
+ flatbuffer_buf_size=2,
107
+ )
108
+
109
+ if res["obj_payload"] is None:
110
+ raise RuntimeError("Call Program After failed: obj_payload is None")
111
+
112
+ return res["obj_payload"]
113
+
114
+ def get_program_version(self, robot_model: str) -> ResponseCurrentVersionT:
115
+ """
116
+ [프로그램 버전 조회 함수]
117
+
118
+ Args:
119
+ robot_model: 로봇 모델명
120
+ """
121
+ res = self.zenoh_client.query_one(
122
+ f"amr/{robot_model}/program/getVersion",
123
+ flatbuffer_res_T_class=ResponseCurrentVersionT,
124
+ flatbuffer_buf_size=2,
125
+ )
126
+
127
+ if res["obj_payload"] is None:
128
+ raise RuntimeError("Get Program Version failed: obj_payload is None")
129
+
130
+ return res["obj_payload"]