standardbots 2.20241003.41__py3-none-any.whl → 2.20241119.1__py3-none-any.whl
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.
Potentially problematic release.
This version of standardbots might be problematic. Click here for more details.
- standardbots/auto_generated/apis.py +2469 -1544
- standardbots/auto_generated/models.py +1872 -1298
- {standardbots-2.20241003.41.dist-info → standardbots-2.20241119.1.dist-info}/METADATA +3 -10
- standardbots-2.20241119.1.dist-info/RECORD +8 -0
- {standardbots-2.20241003.41.dist-info → standardbots-2.20241119.1.dist-info}/WHEEL +1 -1
- standardbots-2.20241003.41.dist-info/RECORD +0 -8
- {standardbots-2.20241003.41.dist-info → standardbots-2.20241119.1.dist-info}/top_level.txt +0 -0
|
@@ -1,1605 +1,2530 @@
|
|
|
1
1
|
# Code autogenerated by StandardBots
|
|
2
|
-
import urllib3
|
|
3
|
-
from enum import Enum
|
|
4
2
|
import json
|
|
5
3
|
from contextlib import contextmanager
|
|
4
|
+
from enum import Enum
|
|
6
5
|
from typing import Dict, Generic, TypeVar, Union
|
|
7
6
|
|
|
7
|
+
import urllib3
|
|
8
|
+
|
|
8
9
|
from . import models
|
|
9
10
|
|
|
11
|
+
|
|
10
12
|
class RobotKind(Enum):
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
Live = "live"
|
|
14
|
+
Simulated = "simulated"
|
|
15
|
+
|
|
13
16
|
|
|
14
17
|
GenericResponseType = TypeVar('GenericResponseType')
|
|
15
18
|
OkResponseType = TypeVar('OkResponseType')
|
|
16
19
|
|
|
20
|
+
|
|
17
21
|
class Response(Generic[GenericResponseType, OkResponseType]):
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
self
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
data: GenericResponseType
|
|
23
|
+
status: int
|
|
24
|
+
response: urllib3.HTTPResponse
|
|
25
|
+
|
|
26
|
+
def __init__(self, data: GenericResponseType, status: int, response: urllib3.HTTPResponse):
|
|
27
|
+
self.data = data
|
|
28
|
+
self.status = status
|
|
29
|
+
self.response = response
|
|
30
|
+
|
|
31
|
+
def ok(self) -> GenericResponseType:
|
|
32
|
+
if self.status != 200:
|
|
33
|
+
raise Exception("Request failed with status " + str(self.status) + ": " + str(self.data))
|
|
34
|
+
return self.data
|
|
35
|
+
|
|
36
|
+
def d(self) -> GenericResponseType:
|
|
37
|
+
return self.data
|
|
38
|
+
|
|
39
|
+
def isNotOk(self):
|
|
40
|
+
return self.status != 200
|
|
41
|
+
|
|
42
|
+
def assert_status(self, status: int):
|
|
43
|
+
if self.status != status:
|
|
44
|
+
raise Exception("Expecting status " + str(self.status) + ", but found " + str(self.status))
|
|
34
45
|
|
|
35
46
|
class RequestManager:
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
robot_kind: RobotKind
|
|
39
|
-
def __init__(
|
|
40
|
-
self,
|
|
41
|
-
http: urllib3.PoolManager,
|
|
42
|
-
token: str,
|
|
43
|
-
host: str,
|
|
47
|
+
token: str
|
|
48
|
+
host: str
|
|
44
49
|
robot_kind: RobotKind
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
50
|
+
def __init__(
|
|
51
|
+
self,
|
|
52
|
+
http: urllib3.PoolManager,
|
|
53
|
+
token: str,
|
|
54
|
+
host: str,
|
|
55
|
+
robot_kind: RobotKind
|
|
56
|
+
):
|
|
57
|
+
self.http = http
|
|
58
|
+
self.token = token
|
|
59
|
+
self.host = host
|
|
60
|
+
self.robot_kind = robot_kind
|
|
61
|
+
|
|
62
|
+
def request(self, method: str, url: str, **kwargs):
|
|
63
|
+
return self.http.request(method, self.host + url, **kwargs)
|
|
64
|
+
|
|
65
|
+
def json_headers(self) -> Dict[str, str]:
|
|
66
|
+
return {
|
|
67
|
+
"Content-Type": "application/json",
|
|
68
|
+
"Authorization": "Bearer " + self.token,
|
|
69
|
+
"robot_kind": self.robot_kind.value,
|
|
70
|
+
}
|
|
65
71
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
class Equipment:
|
|
69
|
-
def __init__(self, request_manager: RequestManager):
|
|
70
|
-
self._request_manager = request_manager
|
|
72
|
+
def close(self):
|
|
73
|
+
self.http.clear()
|
|
71
74
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
75
|
+
class Default:
|
|
76
|
+
_request_manager: RequestManager
|
|
77
|
+
class Equipment:
|
|
78
|
+
def __init__(self, request_manager: RequestManager):
|
|
79
|
+
self._request_manager = request_manager
|
|
80
|
+
|
|
81
|
+
def onrobot_2fg7_move(
|
|
82
|
+
self,
|
|
83
|
+
value: Union[int, float],
|
|
84
|
+
direction: Union[str, models.LinearGripDirectionEnum] = models.LinearGripDirectionEnum.Inward,
|
|
85
|
+
unit_kind: Union[str, models.LinearUnitKind] = models.LinearUnitKind.Millimeters
|
|
86
|
+
):
|
|
87
|
+
"""Move the robot to the onrobot_2fg7 position.
|
|
88
|
+
"""
|
|
89
|
+
return self.control_gripper(
|
|
90
|
+
models.GripperCommandRequest(
|
|
91
|
+
kind=models.GripperKindEnum.Onrobot2Fg7,
|
|
92
|
+
onrobot_2fg7=models.OnRobot2FG7GripperCommandRequest(
|
|
93
|
+
control_kind=models.OnRobot2FG7ControlKindEnum.Move,
|
|
94
|
+
target_grip_width=models.LinearUnit(
|
|
95
|
+
unit_kind=models.LinearUnitKind(unit_kind),
|
|
96
|
+
value=float(value),
|
|
97
|
+
),
|
|
98
|
+
grip_direction=models.LinearGripDirectionEnum(direction),
|
|
99
|
+
)
|
|
100
|
+
)
|
|
90
101
|
)
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
102
|
+
|
|
103
|
+
def onrobot_2fg7_grip(
|
|
104
|
+
self,
|
|
105
|
+
value: Union[int, float],
|
|
106
|
+
direction: Union[str, models.LinearGripDirectionEnum] = models.LinearGripDirectionEnum.Inward,
|
|
107
|
+
unit_kind: Union[str, models.LinearUnitKind] = models.LinearUnitKind.Millimeters,
|
|
108
|
+
force: Union[int, float] = 0.0,
|
|
109
|
+
force_unit: Union[str, models.ForceUnitKind] = models.ForceUnitKind.Newtons
|
|
110
|
+
):
|
|
111
|
+
"""Move the robot to the onrobot_2fg7 position.
|
|
112
|
+
"""
|
|
113
|
+
return self.control_gripper(
|
|
114
|
+
models.GripperCommandRequest(
|
|
115
|
+
kind=models.GripperKindEnum.Onrobot2Fg7,
|
|
116
|
+
onrobot_2fg7=models.OnRobot2FG7GripperCommandRequest(
|
|
117
|
+
control_kind=models.OnRobot2FG7ControlKindEnum.ForceGrip,
|
|
118
|
+
target_grip_width=models.LinearUnit(
|
|
119
|
+
unit_kind=models.LinearUnitKind(unit_kind),
|
|
120
|
+
value=float(value),
|
|
121
|
+
),
|
|
122
|
+
target_force=models.ForceUnit(
|
|
123
|
+
unit_kind=models.ForceUnitKind(force_unit),
|
|
124
|
+
value=float(force),
|
|
125
|
+
),
|
|
126
|
+
grip_direction=models.LinearGripDirectionEnum(direction),
|
|
127
|
+
)
|
|
128
|
+
)
|
|
118
129
|
)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
target_diameter, target_force, target_speed
|
|
130
|
+
|
|
131
|
+
def dh_ag_grip(
|
|
132
|
+
self,
|
|
133
|
+
target_diameter: float,
|
|
134
|
+
target_force: float | None,
|
|
135
|
+
target_speed: float | None,
|
|
136
|
+
):
|
|
137
|
+
"""
|
|
138
|
+
Control the DH AG gripper.
|
|
139
|
+
Args:
|
|
140
|
+
- target_diameter: 0.0 - 1.0
|
|
141
|
+
- target_force: 0.2 - 1.0
|
|
142
|
+
- target_speed: 0.01 - 1.0
|
|
143
|
+
"""
|
|
144
|
+
return self.control_gripper(
|
|
145
|
+
body=models.GripperCommandRequest(
|
|
146
|
+
kind=models.GripperKindEnum.DhAg,
|
|
147
|
+
dh_ag=models.DHAGGripperCommandRequest(
|
|
148
|
+
target_diameter, target_force, target_speed
|
|
149
|
+
),
|
|
140
150
|
),
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
151
|
+
)
|
|
152
|
+
def dh_pgc_grip(
|
|
153
|
+
self,
|
|
154
|
+
target_diameter: float,
|
|
155
|
+
target_force: float | None,
|
|
156
|
+
target_speed: float | None,
|
|
157
|
+
):
|
|
158
|
+
"""
|
|
159
|
+
Control the DH PGC gripper.
|
|
160
|
+
Args:
|
|
161
|
+
- target_diameter: 0.0 - 1.0
|
|
162
|
+
- target_force: 0.2 - 1.0
|
|
163
|
+
- target_speed: 0.01 - 1.0
|
|
164
|
+
"""
|
|
165
|
+
return self.control_gripper(
|
|
166
|
+
body=models.GripperCommandRequest(
|
|
167
|
+
kind=models.GripperKindEnum.DhPgc,
|
|
168
|
+
dh_pgc=models.DHPGCGripperCommandRequest(
|
|
169
|
+
target_diameter, target_force, target_speed
|
|
170
|
+
),
|
|
161
171
|
),
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
172
|
+
)
|
|
173
|
+
def dh_cgi_grip(
|
|
174
|
+
self,
|
|
175
|
+
target_diameter: float,
|
|
176
|
+
target_force: float | None,
|
|
177
|
+
target_speed: float | None,
|
|
178
|
+
):
|
|
179
|
+
"""
|
|
180
|
+
Control the DH CGI gripper.
|
|
181
|
+
Args:
|
|
182
|
+
- target_diameter: 0.0 - 1.0
|
|
183
|
+
- target_force: 0.2 - 1.0
|
|
184
|
+
- target_speed: 0.01 - 1.0
|
|
185
|
+
"""
|
|
186
|
+
return self.control_gripper(
|
|
187
|
+
body=models.GripperCommandRequest(
|
|
188
|
+
kind=models.GripperKindEnum.DhCgi,
|
|
189
|
+
dh_pgc=models.DHCGIGripperCommandRequest(
|
|
190
|
+
target_diameter, target_force, target_speed
|
|
191
|
+
),
|
|
182
192
|
),
|
|
183
|
-
)
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def control_gripper(
|
|
197
|
+
self,
|
|
198
|
+
body: models.GripperCommandRequest,
|
|
199
|
+
) -> Response[
|
|
200
|
+
None,
|
|
201
|
+
None
|
|
202
|
+
]:
|
|
203
|
+
"""
|
|
204
|
+
Send commands to control the Gripper (End Effector) of the robot. The gripper can be any of Standard Bots supported grippers.
|
|
205
|
+
|
|
206
|
+
"""
|
|
207
|
+
path = "/api/v1/equipment/end-effector/control"
|
|
208
|
+
try:
|
|
209
|
+
response = self._request_manager.request(
|
|
210
|
+
"POST",
|
|
211
|
+
path,
|
|
212
|
+
headers=self._request_manager.json_headers(),
|
|
213
|
+
body=json.dumps(models.serialize_gripper_command_request(body)),
|
|
214
|
+
)
|
|
215
|
+
parsed = None
|
|
216
|
+
|
|
217
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
218
|
+
is_unavailable = response.status == 503
|
|
219
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
220
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
221
|
+
|
|
222
|
+
return Response(
|
|
223
|
+
parsed,
|
|
224
|
+
response.status,
|
|
225
|
+
response
|
|
226
|
+
)
|
|
227
|
+
except urllib3.exceptions.MaxRetryError:
|
|
228
|
+
return Response(
|
|
229
|
+
models.ErrorResponse(
|
|
230
|
+
error=models.ErrorEnum.InternalServerError,
|
|
231
|
+
message="Connection Refused"
|
|
232
|
+
),
|
|
233
|
+
503,
|
|
234
|
+
None
|
|
235
|
+
)
|
|
236
|
+
def get_gripper_configuration(
|
|
237
|
+
self,
|
|
238
|
+
) -> Response[
|
|
239
|
+
Union[
|
|
240
|
+
models.GripperConfiguration,
|
|
241
|
+
models.ErrorResponse,
|
|
242
|
+
None
|
|
243
|
+
],
|
|
244
|
+
models.GripperConfiguration
|
|
245
|
+
]:
|
|
246
|
+
"""
|
|
247
|
+
Get the current gripper configuration
|
|
248
|
+
|
|
249
|
+
"""
|
|
250
|
+
path = "/api/v1/equipment/end-effector/configuration"
|
|
251
|
+
try:
|
|
252
|
+
response = self._request_manager.request(
|
|
253
|
+
"GET",
|
|
254
|
+
path,
|
|
255
|
+
headers=self._request_manager.json_headers(),
|
|
256
|
+
)
|
|
257
|
+
parsed = None
|
|
258
|
+
if response.status == 200:
|
|
259
|
+
parsed = models.parse_gripper_configuration(json.loads(response.data))
|
|
260
|
+
|
|
261
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
262
|
+
is_unavailable = response.status == 503
|
|
263
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
264
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
265
|
+
|
|
266
|
+
return Response(
|
|
267
|
+
parsed,
|
|
268
|
+
response.status,
|
|
269
|
+
response
|
|
270
|
+
)
|
|
271
|
+
except urllib3.exceptions.MaxRetryError:
|
|
272
|
+
return Response(
|
|
273
|
+
models.ErrorResponse(
|
|
274
|
+
error=models.ErrorEnum.InternalServerError,
|
|
275
|
+
message="Connection Refused"
|
|
276
|
+
),
|
|
277
|
+
503,
|
|
278
|
+
None
|
|
279
|
+
)
|
|
280
|
+
class Sensors:
|
|
281
|
+
def __init__(self, request_manager: RequestManager):
|
|
282
|
+
self._request_manager = request_manager
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def get_sensors(
|
|
286
|
+
self,
|
|
287
|
+
) -> Response[
|
|
288
|
+
Union[
|
|
289
|
+
models.SensorsConfiguration,
|
|
290
|
+
models.ErrorResponse,
|
|
291
|
+
None
|
|
292
|
+
],
|
|
293
|
+
models.SensorsConfiguration
|
|
294
|
+
]:
|
|
295
|
+
"""
|
|
296
|
+
Get the current state of all sensors
|
|
297
|
+
"""
|
|
298
|
+
path = "/api/v1/equipment/custom/sensors"
|
|
299
|
+
try:
|
|
300
|
+
response = self._request_manager.request(
|
|
301
|
+
"GET",
|
|
302
|
+
path,
|
|
303
|
+
headers=self._request_manager.json_headers(),
|
|
304
|
+
)
|
|
305
|
+
parsed = None
|
|
306
|
+
if response.status == 200:
|
|
307
|
+
parsed = models.parse_sensors_configuration(json.loads(response.data))
|
|
308
|
+
|
|
309
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
310
|
+
is_unavailable = response.status == 503
|
|
311
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
312
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
313
|
+
|
|
314
|
+
return Response(
|
|
315
|
+
parsed,
|
|
316
|
+
response.status,
|
|
317
|
+
response
|
|
318
|
+
)
|
|
319
|
+
except urllib3.exceptions.MaxRetryError:
|
|
320
|
+
return Response(
|
|
321
|
+
models.ErrorResponse(
|
|
322
|
+
error=models.ErrorEnum.InternalServerError,
|
|
323
|
+
message="Connection Refused"
|
|
324
|
+
),
|
|
325
|
+
503,
|
|
326
|
+
None
|
|
327
|
+
)
|
|
328
|
+
class Space:
|
|
329
|
+
def __init__(self, request_manager: RequestManager):
|
|
330
|
+
self._request_manager = request_manager
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
def list_planes(
|
|
334
|
+
self,
|
|
335
|
+
limit: int,
|
|
336
|
+
offset: int,
|
|
337
|
+
) -> Response[
|
|
338
|
+
Union[
|
|
339
|
+
models.PlanesPaginatedResponse,
|
|
340
|
+
models.ErrorResponse,
|
|
341
|
+
None
|
|
342
|
+
],
|
|
343
|
+
models.PlanesPaginatedResponse
|
|
344
|
+
]:
|
|
345
|
+
"""
|
|
346
|
+
List Planes
|
|
347
|
+
"""
|
|
348
|
+
path = "/api/v1/space/planes"
|
|
349
|
+
try:
|
|
350
|
+
response = self._request_manager.request(
|
|
351
|
+
"GET",
|
|
352
|
+
path,
|
|
353
|
+
headers=self._request_manager.json_headers(),
|
|
354
|
+
fields={
|
|
355
|
+
"limit": models.serialize_i_64(limit),
|
|
356
|
+
"offset": models.serialize_i_64(offset),
|
|
357
|
+
}
|
|
358
|
+
)
|
|
359
|
+
parsed = None
|
|
360
|
+
if response.status == 200:
|
|
361
|
+
parsed = models.parse_planes_paginated_response(json.loads(response.data))
|
|
362
|
+
|
|
363
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
364
|
+
is_unavailable = response.status == 503
|
|
365
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
366
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
367
|
+
|
|
368
|
+
return Response(
|
|
369
|
+
parsed,
|
|
370
|
+
response.status,
|
|
371
|
+
response
|
|
372
|
+
)
|
|
373
|
+
except urllib3.exceptions.MaxRetryError:
|
|
374
|
+
return Response(
|
|
375
|
+
models.ErrorResponse(
|
|
376
|
+
error=models.ErrorEnum.InternalServerError,
|
|
377
|
+
message="Connection Refused"
|
|
378
|
+
),
|
|
379
|
+
503,
|
|
380
|
+
None
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
equipment: Equipment
|
|
384
|
+
sensors: Sensors
|
|
385
|
+
space: Space
|
|
386
|
+
|
|
254
387
|
def __init__(self, request_manager: RequestManager):
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
self,
|
|
260
|
-
limit: int,
|
|
261
|
-
offset: int,
|
|
262
|
-
) -> Response[
|
|
263
|
-
Union[
|
|
264
|
-
models.PlanesPaginatedResponse,
|
|
265
|
-
models.ErrorResponse,
|
|
266
|
-
None
|
|
267
|
-
],
|
|
268
|
-
models.PlanesPaginatedResponse
|
|
269
|
-
]:
|
|
270
|
-
"""
|
|
271
|
-
List Positions
|
|
272
|
-
"""
|
|
273
|
-
path = "/api/v1/space/positions"
|
|
274
|
-
response = self._request_manager.request(
|
|
275
|
-
"GET",
|
|
276
|
-
path,
|
|
277
|
-
headers=self._request_manager.json_headers(),
|
|
278
|
-
fields={
|
|
279
|
-
"limit": models.serialize_i_64(limit),
|
|
280
|
-
"offset": models.serialize_i_64(offset),
|
|
281
|
-
}
|
|
282
|
-
)
|
|
283
|
-
parsed = None
|
|
284
|
-
if response.status == 200:
|
|
285
|
-
parsed = models.parse_planes_paginated_response(json.loads(response.data))
|
|
286
|
-
|
|
287
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
288
|
-
is_unavailable = response.status == 503
|
|
289
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
290
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
291
|
-
|
|
292
|
-
return Response(
|
|
293
|
-
parsed,
|
|
294
|
-
response.status,
|
|
295
|
-
response
|
|
296
|
-
)
|
|
297
|
-
|
|
298
|
-
def list_planes(
|
|
299
|
-
self,
|
|
300
|
-
limit: int,
|
|
301
|
-
offset: int,
|
|
302
|
-
) -> Response[
|
|
303
|
-
Union[
|
|
304
|
-
models.PlanesPaginatedResponse,
|
|
305
|
-
models.ErrorResponse,
|
|
306
|
-
None
|
|
307
|
-
],
|
|
308
|
-
models.PlanesPaginatedResponse
|
|
309
|
-
]:
|
|
310
|
-
"""
|
|
311
|
-
List Planes
|
|
312
|
-
"""
|
|
313
|
-
path = "/api/v1/space/planes"
|
|
314
|
-
response = self._request_manager.request(
|
|
315
|
-
"GET",
|
|
316
|
-
path,
|
|
317
|
-
headers=self._request_manager.json_headers(),
|
|
318
|
-
fields={
|
|
319
|
-
"limit": models.serialize_i_64(limit),
|
|
320
|
-
"offset": models.serialize_i_64(offset),
|
|
321
|
-
}
|
|
322
|
-
)
|
|
323
|
-
parsed = None
|
|
324
|
-
if response.status == 200:
|
|
325
|
-
parsed = models.parse_planes_paginated_response(json.loads(response.data))
|
|
326
|
-
|
|
327
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
328
|
-
is_unavailable = response.status == 503
|
|
329
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
330
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
331
|
-
|
|
332
|
-
return Response(
|
|
333
|
-
parsed,
|
|
334
|
-
response.status,
|
|
335
|
-
response
|
|
336
|
-
)
|
|
337
|
-
|
|
338
|
-
equipment: Equipment
|
|
339
|
-
space: Space
|
|
340
|
-
|
|
341
|
-
def __init__(self, request_manager: RequestManager):
|
|
342
|
-
self._request_manager = request_manager
|
|
343
|
-
self.equipment = Default.Equipment(request_manager)
|
|
344
|
-
self.space = Default.Space(request_manager)
|
|
388
|
+
self._request_manager = request_manager
|
|
389
|
+
self.equipment = Default.Equipment(request_manager)
|
|
390
|
+
self.sensors = Default.Sensors(request_manager)
|
|
391
|
+
self.space = Default.Space(request_manager)
|
|
345
392
|
|
|
346
393
|
class Movement:
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
394
|
+
_request_manager: RequestManager
|
|
395
|
+
class Brakes:
|
|
396
|
+
def __init__(self, request_manager: RequestManager):
|
|
397
|
+
self._request_manager = request_manager
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def brake(self):
|
|
401
|
+
"""Brake the robot
|
|
402
|
+
"""
|
|
403
|
+
return self.set_brakes_state(
|
|
404
|
+
models.BrakesState(
|
|
405
|
+
state=models.BrakesStateEnum.Engaged,
|
|
406
|
+
),
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
def unbrake(self):
|
|
410
|
+
"""Unbrake the robot
|
|
411
|
+
"""
|
|
412
|
+
return self.set_brakes_state(
|
|
413
|
+
models.BrakesState(
|
|
414
|
+
state=models.BrakesStateEnum.Disengaged,
|
|
415
|
+
),
|
|
416
|
+
)
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def set_brakes_state(
|
|
420
|
+
self,
|
|
421
|
+
body: models.BrakesState,
|
|
422
|
+
) -> Response[
|
|
423
|
+
Union[
|
|
424
|
+
models.BrakesState,
|
|
425
|
+
models.ErrorResponse,
|
|
426
|
+
None
|
|
427
|
+
],
|
|
428
|
+
models.BrakesState
|
|
429
|
+
]:
|
|
430
|
+
"""
|
|
431
|
+
Control Joint Brakes in the robot
|
|
432
|
+
|
|
433
|
+
"""
|
|
434
|
+
path = "/api/v1/movement/brakes"
|
|
435
|
+
try:
|
|
436
|
+
response = self._request_manager.request(
|
|
437
|
+
"POST",
|
|
438
|
+
path,
|
|
439
|
+
headers=self._request_manager.json_headers(),
|
|
440
|
+
body=json.dumps(models.serialize_brakes_state(body)),
|
|
441
|
+
)
|
|
442
|
+
parsed = None
|
|
443
|
+
if response.status == 200:
|
|
444
|
+
parsed = models.parse_brakes_state(json.loads(response.data))
|
|
445
|
+
|
|
446
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
447
|
+
is_unavailable = response.status == 503
|
|
448
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
449
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
450
|
+
|
|
451
|
+
return Response(
|
|
452
|
+
parsed,
|
|
453
|
+
response.status,
|
|
454
|
+
response
|
|
455
|
+
)
|
|
456
|
+
except urllib3.exceptions.MaxRetryError:
|
|
457
|
+
return Response(
|
|
458
|
+
models.ErrorResponse(
|
|
459
|
+
error=models.ErrorEnum.InternalServerError,
|
|
460
|
+
message="Connection Refused"
|
|
461
|
+
),
|
|
462
|
+
503,
|
|
463
|
+
None
|
|
464
|
+
)
|
|
465
|
+
def get_brakes_state(
|
|
466
|
+
self,
|
|
467
|
+
) -> Response[
|
|
468
|
+
Union[
|
|
469
|
+
models.BrakesState,
|
|
470
|
+
models.ErrorResponse,
|
|
471
|
+
None
|
|
472
|
+
],
|
|
473
|
+
models.BrakesState
|
|
474
|
+
]:
|
|
475
|
+
"""
|
|
476
|
+
Get the current state of the robot brakes
|
|
477
|
+
|
|
478
|
+
"""
|
|
479
|
+
path = "/api/v1/movement/brakes"
|
|
480
|
+
try:
|
|
481
|
+
response = self._request_manager.request(
|
|
482
|
+
"GET",
|
|
483
|
+
path,
|
|
484
|
+
headers=self._request_manager.json_headers(),
|
|
485
|
+
)
|
|
486
|
+
parsed = None
|
|
487
|
+
if response.status == 200:
|
|
488
|
+
parsed = models.parse_brakes_state(json.loads(response.data))
|
|
489
|
+
|
|
490
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
491
|
+
is_unavailable = response.status == 503
|
|
492
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
493
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
494
|
+
|
|
495
|
+
return Response(
|
|
496
|
+
parsed,
|
|
497
|
+
response.status,
|
|
498
|
+
response
|
|
499
|
+
)
|
|
500
|
+
except urllib3.exceptions.MaxRetryError:
|
|
501
|
+
return Response(
|
|
502
|
+
models.ErrorResponse(
|
|
503
|
+
error=models.ErrorEnum.InternalServerError,
|
|
504
|
+
message="Connection Refused"
|
|
505
|
+
),
|
|
506
|
+
503,
|
|
507
|
+
None
|
|
508
|
+
)
|
|
509
|
+
def engage_emergency_stop(
|
|
510
|
+
self,
|
|
511
|
+
body: models.EngageEmergencyStopRequest,
|
|
512
|
+
) -> Response[
|
|
513
|
+
None,
|
|
514
|
+
None
|
|
515
|
+
]:
|
|
516
|
+
"""
|
|
517
|
+
Engage Emergency braking system.
|
|
453
518
|
> **⚠️ Warning:** This will immediately stop the robot and may cause damage to the robot or surrounding environment.
|
|
454
519
|
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
520
|
+
"""
|
|
521
|
+
path = "/api/v1/movement/brakes/emergency-stop"
|
|
522
|
+
try:
|
|
523
|
+
response = self._request_manager.request(
|
|
524
|
+
"POST",
|
|
525
|
+
path,
|
|
526
|
+
headers=self._request_manager.json_headers(),
|
|
527
|
+
body=json.dumps(models.serialize_engage_emergency_stop_request(body)),
|
|
528
|
+
)
|
|
529
|
+
parsed = None
|
|
530
|
+
|
|
531
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
532
|
+
is_unavailable = response.status == 503
|
|
533
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
534
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
535
|
+
|
|
536
|
+
return Response(
|
|
537
|
+
parsed,
|
|
538
|
+
response.status,
|
|
539
|
+
response
|
|
540
|
+
)
|
|
541
|
+
except urllib3.exceptions.MaxRetryError:
|
|
542
|
+
return Response(
|
|
543
|
+
models.ErrorResponse(
|
|
544
|
+
error=models.ErrorEnum.InternalServerError,
|
|
545
|
+
message="Connection Refused"
|
|
546
|
+
),
|
|
547
|
+
503,
|
|
548
|
+
None
|
|
549
|
+
)
|
|
550
|
+
class Position:
|
|
551
|
+
def __init__(self, request_manager: RequestManager):
|
|
552
|
+
self._request_manager = request_manager
|
|
553
|
+
|
|
554
|
+
def move(
|
|
555
|
+
self,
|
|
556
|
+
position: models.Position,
|
|
557
|
+
orientation: models.Orientation,
|
|
558
|
+
reference_frame: str = 'base',
|
|
559
|
+
axis_alignment: str = 'base',
|
|
560
|
+
local_accuracy_calibration: str | None = None,
|
|
561
|
+
movement_kind: models.MovementKindEnum | None = models.MovementKindEnum.Joint,
|
|
562
|
+
speed_profile: models.SpeedProfile | None = None,
|
|
563
|
+
):
|
|
564
|
+
return self.move_tooltip(
|
|
565
|
+
position=position,
|
|
566
|
+
orientation=orientation,
|
|
567
|
+
reference_frame=reference_frame,
|
|
568
|
+
axis_alignment=axis_alignment,
|
|
569
|
+
local_accuracy_calibration=local_accuracy_calibration,
|
|
570
|
+
movement_kind=movement_kind,
|
|
571
|
+
speed_profile=speed_profile
|
|
572
|
+
)
|
|
573
|
+
|
|
574
|
+
def move_tooltip(
|
|
575
|
+
self,
|
|
576
|
+
position: models.Position,
|
|
577
|
+
orientation: models.Orientation,
|
|
578
|
+
reference_frame: str = 'base',
|
|
579
|
+
axis_alignment: str = 'base',
|
|
580
|
+
local_accuracy_calibration: str | None = None,
|
|
581
|
+
movement_kind: models.MovementKindEnum | None = models.MovementKindEnum.Joint,
|
|
582
|
+
speed_profile: models.SpeedProfile | None = None,
|
|
583
|
+
):
|
|
584
|
+
"""Move tooltip of robot to specified position
|
|
585
|
+
"""
|
|
586
|
+
request = models.ArmPositionUpdateRequest(
|
|
587
|
+
kind=models.ArmPositionUpdateRequestKindEnum.TooltipPosition,
|
|
588
|
+
tooltip_position=models.PositionAndOrientation(
|
|
589
|
+
position=position,
|
|
590
|
+
orientation=orientation,
|
|
591
|
+
reference_frame=reference_frame,
|
|
592
|
+
local_accuracy_calibration=local_accuracy_calibration,
|
|
593
|
+
axis_alignment=axis_alignment,
|
|
594
|
+
),
|
|
595
|
+
movement_kind=movement_kind,
|
|
596
|
+
speed_profile=speed_profile
|
|
597
|
+
)
|
|
598
|
+
return self.set_arm_position(request)
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
def get_arm_position(
|
|
602
|
+
self,
|
|
603
|
+
) -> Response[
|
|
604
|
+
Union[
|
|
605
|
+
models.CombinedArmPosition,
|
|
606
|
+
models.ErrorResponse,
|
|
607
|
+
None
|
|
608
|
+
],
|
|
609
|
+
models.CombinedArmPosition
|
|
610
|
+
]:
|
|
611
|
+
"""
|
|
612
|
+
Get the current position of the robot arm
|
|
613
|
+
"""
|
|
614
|
+
path = "/api/v1/movement/position/arm"
|
|
615
|
+
try:
|
|
616
|
+
response = self._request_manager.request(
|
|
617
|
+
"GET",
|
|
618
|
+
path,
|
|
619
|
+
headers=self._request_manager.json_headers(),
|
|
620
|
+
)
|
|
621
|
+
parsed = None
|
|
622
|
+
if response.status == 200:
|
|
623
|
+
parsed = models.parse_combined_arm_position(json.loads(response.data))
|
|
624
|
+
|
|
625
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
626
|
+
is_unavailable = response.status == 503
|
|
627
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
628
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
629
|
+
|
|
630
|
+
return Response(
|
|
631
|
+
parsed,
|
|
632
|
+
response.status,
|
|
633
|
+
response
|
|
634
|
+
)
|
|
635
|
+
except urllib3.exceptions.MaxRetryError:
|
|
636
|
+
return Response(
|
|
637
|
+
models.ErrorResponse(
|
|
638
|
+
error=models.ErrorEnum.InternalServerError,
|
|
639
|
+
message="Connection Refused"
|
|
640
|
+
),
|
|
641
|
+
503,
|
|
642
|
+
None
|
|
643
|
+
)
|
|
644
|
+
def set_arm_position(
|
|
645
|
+
self,
|
|
646
|
+
body: models.ArmPositionUpdateRequest,
|
|
647
|
+
) -> Response[
|
|
648
|
+
Union[
|
|
649
|
+
models.ArmPositionUpdateEvent,
|
|
650
|
+
models.ErrorResponse,
|
|
651
|
+
None
|
|
652
|
+
],
|
|
653
|
+
models.ArmPositionUpdateEvent
|
|
654
|
+
]:
|
|
655
|
+
"""
|
|
656
|
+
Control the position of the RO1 Robot arm.
|
|
657
|
+
|
|
658
|
+
"""
|
|
659
|
+
path = "/api/v1/movement/position/arm"
|
|
660
|
+
try:
|
|
661
|
+
response = self._request_manager.request(
|
|
662
|
+
"POST",
|
|
663
|
+
path,
|
|
664
|
+
headers=self._request_manager.json_headers(),
|
|
665
|
+
body=json.dumps(models.serialize_arm_position_update_request(body)),
|
|
666
|
+
)
|
|
667
|
+
parsed = None
|
|
668
|
+
if response.status == 200:
|
|
669
|
+
parsed = models.parse_arm_position_update_event(json.loads(response.data))
|
|
670
|
+
|
|
671
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
672
|
+
is_unavailable = response.status == 503
|
|
673
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
674
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
675
|
+
|
|
676
|
+
return Response(
|
|
677
|
+
parsed,
|
|
678
|
+
response.status,
|
|
679
|
+
response
|
|
680
|
+
)
|
|
681
|
+
except urllib3.exceptions.MaxRetryError:
|
|
682
|
+
return Response(
|
|
683
|
+
models.ErrorResponse(
|
|
684
|
+
error=models.ErrorEnum.InternalServerError,
|
|
685
|
+
message="Connection Refused"
|
|
686
|
+
),
|
|
687
|
+
503,
|
|
688
|
+
None
|
|
689
|
+
)
|
|
690
|
+
|
|
691
|
+
brakes: Brakes
|
|
692
|
+
position: Position
|
|
693
|
+
|
|
477
694
|
def __init__(self, request_manager: RequestManager):
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
self,
|
|
482
|
-
position: models.Position,
|
|
483
|
-
orientation: models.Orientation,
|
|
484
|
-
reference_frame: str = 'base',
|
|
485
|
-
axis_alignment: str = 'base',
|
|
486
|
-
local_accuracy_calibration: str | None = None,
|
|
487
|
-
movement_kind: models.MovementKindEnum | None = models.MovementKindEnum.Joint,
|
|
488
|
-
):
|
|
489
|
-
return self.move_tooltip(
|
|
490
|
-
position=position,
|
|
491
|
-
orientation=orientation,
|
|
492
|
-
reference_frame=reference_frame,
|
|
493
|
-
axis_alignment=axis_alignment,
|
|
494
|
-
local_accuracy_calibration=local_accuracy_calibration,
|
|
495
|
-
movement_kind=movement_kind
|
|
496
|
-
)
|
|
497
|
-
|
|
498
|
-
def move_tooltip(
|
|
499
|
-
self,
|
|
500
|
-
position: models.Position,
|
|
501
|
-
orientation: models.Orientation,
|
|
502
|
-
reference_frame: str = 'base',
|
|
503
|
-
axis_alignment: str = 'base',
|
|
504
|
-
local_accuracy_calibration: str | None = None,
|
|
505
|
-
movement_kind: models.MovementKindEnum | None = models.MovementKindEnum.Joint
|
|
506
|
-
):
|
|
507
|
-
"""Move tooltip of robot to specified position
|
|
508
|
-
"""
|
|
509
|
-
request = models.ArmPositionUpdateRequest(
|
|
510
|
-
kind=models.ArmPositionUpdateRequestKindEnum.TooltipPosition,
|
|
511
|
-
tooltip_position=models.PositionAndOrientation(
|
|
512
|
-
position=position,
|
|
513
|
-
orientation=orientation,
|
|
514
|
-
reference_frame=reference_frame,
|
|
515
|
-
local_accuracy_calibration=local_accuracy_calibration,
|
|
516
|
-
axis_alignment=axis_alignment,
|
|
517
|
-
),
|
|
518
|
-
)
|
|
519
|
-
return self.set_arm_position(request)
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
def get_arm_position(
|
|
523
|
-
self,
|
|
524
|
-
) -> Response[
|
|
525
|
-
Union[
|
|
526
|
-
models.CombinedArmPosition,
|
|
527
|
-
models.ErrorResponse,
|
|
528
|
-
None
|
|
529
|
-
],
|
|
530
|
-
models.CombinedArmPosition
|
|
531
|
-
]:
|
|
532
|
-
"""
|
|
533
|
-
Get the current position of the robot arm
|
|
534
|
-
"""
|
|
535
|
-
path = "/api/v1/movement/position/arm"
|
|
536
|
-
response = self._request_manager.request(
|
|
537
|
-
"GET",
|
|
538
|
-
path,
|
|
539
|
-
headers=self._request_manager.json_headers(),
|
|
540
|
-
)
|
|
541
|
-
parsed = None
|
|
542
|
-
if response.status == 200:
|
|
543
|
-
parsed = models.parse_combined_arm_position(json.loads(response.data))
|
|
544
|
-
|
|
545
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
546
|
-
is_unavailable = response.status == 503
|
|
547
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
548
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
549
|
-
|
|
550
|
-
return Response(
|
|
551
|
-
parsed,
|
|
552
|
-
response.status,
|
|
553
|
-
response
|
|
554
|
-
)
|
|
555
|
-
|
|
556
|
-
def set_arm_position(
|
|
557
|
-
self,
|
|
558
|
-
body: models.ArmPositionUpdateRequest,
|
|
559
|
-
) -> Response[
|
|
560
|
-
Union[
|
|
561
|
-
models.ArmPositionUpdateEvent,
|
|
562
|
-
models.ErrorResponse,
|
|
563
|
-
None
|
|
564
|
-
],
|
|
565
|
-
models.ArmPositionUpdateEvent
|
|
566
|
-
]:
|
|
567
|
-
"""
|
|
568
|
-
Control the position of the RO1 Robot arm.
|
|
569
|
-
|
|
570
|
-
"""
|
|
571
|
-
path = "/api/v1/movement/position/arm"
|
|
572
|
-
response = self._request_manager.request(
|
|
573
|
-
"POST",
|
|
574
|
-
path,
|
|
575
|
-
headers=self._request_manager.json_headers(),
|
|
576
|
-
body=json.dumps(models.serialize_arm_position_update_request(body)),
|
|
577
|
-
)
|
|
578
|
-
parsed = None
|
|
579
|
-
if response.status == 200:
|
|
580
|
-
parsed = models.parse_arm_position_update_event(json.loads(response.data))
|
|
581
|
-
|
|
582
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
583
|
-
is_unavailable = response.status == 503
|
|
584
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
585
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
586
|
-
|
|
587
|
-
return Response(
|
|
588
|
-
parsed,
|
|
589
|
-
response.status,
|
|
590
|
-
response
|
|
591
|
-
)
|
|
592
|
-
|
|
593
|
-
brakes: Brakes
|
|
594
|
-
position: Position
|
|
595
|
-
|
|
596
|
-
def __init__(self, request_manager: RequestManager):
|
|
597
|
-
self._request_manager = request_manager
|
|
598
|
-
self.brakes = Movement.Brakes(request_manager)
|
|
599
|
-
self.position = Movement.Position(request_manager)
|
|
695
|
+
self._request_manager = request_manager
|
|
696
|
+
self.brakes = Movement.Brakes(request_manager)
|
|
697
|
+
self.position = Movement.Position(request_manager)
|
|
600
698
|
|
|
601
699
|
class Camera:
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
700
|
+
_request_manager: RequestManager
|
|
701
|
+
class Data:
|
|
702
|
+
def __init__(self, request_manager: RequestManager):
|
|
703
|
+
self._request_manager = request_manager
|
|
704
|
+
|
|
705
|
+
|
|
706
|
+
def get_color_frame(
|
|
707
|
+
self,
|
|
708
|
+
body: models.CameraFrameRequest,
|
|
709
|
+
) -> Response[
|
|
710
|
+
None,
|
|
711
|
+
None
|
|
712
|
+
]:
|
|
713
|
+
"""
|
|
714
|
+
Retrieve the latest RGB frame from the camera.
|
|
715
|
+
"""
|
|
716
|
+
path = "/api/v1/camera/frame/rgb"
|
|
717
|
+
try:
|
|
718
|
+
response = self._request_manager.request(
|
|
719
|
+
"GET",
|
|
720
|
+
path,
|
|
721
|
+
headers=self._request_manager.json_headers(),
|
|
722
|
+
body=json.dumps(models.serialize_camera_frame_request(body)),
|
|
723
|
+
)
|
|
724
|
+
parsed = None
|
|
725
|
+
|
|
726
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
727
|
+
is_unavailable = response.status == 503
|
|
728
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
729
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
730
|
+
|
|
731
|
+
return Response(
|
|
732
|
+
parsed,
|
|
733
|
+
response.status,
|
|
734
|
+
response
|
|
735
|
+
)
|
|
736
|
+
except urllib3.exceptions.MaxRetryError:
|
|
737
|
+
return Response(
|
|
738
|
+
models.ErrorResponse(
|
|
739
|
+
error=models.ErrorEnum.InternalServerError,
|
|
740
|
+
message="Connection Refused"
|
|
741
|
+
),
|
|
742
|
+
503,
|
|
743
|
+
None
|
|
744
|
+
)
|
|
745
|
+
def get_camera_intrinsics_color(
|
|
746
|
+
self,
|
|
747
|
+
) -> Response[
|
|
748
|
+
None,
|
|
749
|
+
None
|
|
750
|
+
]:
|
|
751
|
+
"""
|
|
752
|
+
Retrieve the intrinsic parameters for the color camera.
|
|
753
|
+
"""
|
|
754
|
+
path = "/api/v1/camera/intrinsics/rgb"
|
|
755
|
+
try:
|
|
756
|
+
response = self._request_manager.request(
|
|
757
|
+
"GET",
|
|
758
|
+
path,
|
|
759
|
+
headers=self._request_manager.json_headers(),
|
|
760
|
+
)
|
|
761
|
+
parsed = None
|
|
762
|
+
|
|
763
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
764
|
+
is_unavailable = response.status == 503
|
|
765
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
766
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
767
|
+
|
|
768
|
+
return Response(
|
|
769
|
+
parsed,
|
|
770
|
+
response.status,
|
|
771
|
+
response
|
|
772
|
+
)
|
|
773
|
+
except urllib3.exceptions.MaxRetryError:
|
|
774
|
+
return Response(
|
|
775
|
+
models.ErrorResponse(
|
|
776
|
+
error=models.ErrorEnum.InternalServerError,
|
|
777
|
+
message="Connection Refused"
|
|
778
|
+
),
|
|
779
|
+
503,
|
|
780
|
+
None
|
|
781
|
+
)
|
|
782
|
+
def get_camera_stream(
|
|
783
|
+
self,
|
|
784
|
+
) -> Response[
|
|
785
|
+
None,
|
|
786
|
+
None
|
|
787
|
+
]:
|
|
788
|
+
"""
|
|
789
|
+
Retrieve the latest RGB frame from the camera.
|
|
790
|
+
"""
|
|
791
|
+
path = "/api/v1/camera/stream/rgb"
|
|
792
|
+
try:
|
|
793
|
+
response = self._request_manager.request(
|
|
794
|
+
"GET",
|
|
795
|
+
path,
|
|
796
|
+
headers=self._request_manager.json_headers(),
|
|
797
|
+
preload_content=False,
|
|
798
|
+
)
|
|
799
|
+
parsed = None
|
|
800
|
+
|
|
801
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
802
|
+
is_unavailable = response.status == 503
|
|
803
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
804
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
805
|
+
|
|
806
|
+
return Response(
|
|
807
|
+
parsed,
|
|
808
|
+
response.status,
|
|
809
|
+
response
|
|
810
|
+
)
|
|
811
|
+
except urllib3.exceptions.MaxRetryError:
|
|
812
|
+
return Response(
|
|
813
|
+
models.ErrorResponse(
|
|
814
|
+
error=models.ErrorEnum.InternalServerError,
|
|
815
|
+
message="Connection Refused"
|
|
816
|
+
),
|
|
817
|
+
503,
|
|
818
|
+
None
|
|
819
|
+
)
|
|
820
|
+
class Settings:
|
|
821
|
+
def __init__(self, request_manager: RequestManager):
|
|
822
|
+
self._request_manager = request_manager
|
|
823
|
+
|
|
824
|
+
|
|
825
|
+
def set_camera_settings(
|
|
826
|
+
self,
|
|
827
|
+
body: models.CameraSettings,
|
|
828
|
+
) -> Response[
|
|
829
|
+
None,
|
|
830
|
+
None
|
|
831
|
+
]:
|
|
832
|
+
"""
|
|
833
|
+
Set the camera settings.
|
|
834
|
+
"""
|
|
835
|
+
path = "/api/v1/camera/settings"
|
|
836
|
+
try:
|
|
837
|
+
response = self._request_manager.request(
|
|
838
|
+
"POST",
|
|
839
|
+
path,
|
|
840
|
+
headers=self._request_manager.json_headers(),
|
|
841
|
+
body=json.dumps(models.serialize_camera_settings(body)),
|
|
842
|
+
)
|
|
843
|
+
parsed = None
|
|
844
|
+
|
|
845
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
846
|
+
is_unavailable = response.status == 503
|
|
847
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
848
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
849
|
+
|
|
850
|
+
return Response(
|
|
851
|
+
parsed,
|
|
852
|
+
response.status,
|
|
853
|
+
response
|
|
854
|
+
)
|
|
855
|
+
except urllib3.exceptions.MaxRetryError:
|
|
856
|
+
return Response(
|
|
857
|
+
models.ErrorResponse(
|
|
858
|
+
error=models.ErrorEnum.InternalServerError,
|
|
859
|
+
message="Connection Refused"
|
|
860
|
+
),
|
|
861
|
+
503,
|
|
862
|
+
None
|
|
863
|
+
)
|
|
864
|
+
|
|
865
|
+
data: Data
|
|
866
|
+
settings: Settings
|
|
867
|
+
|
|
696
868
|
def __init__(self, request_manager: RequestManager):
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
def set_camera_settings(
|
|
701
|
-
self,
|
|
702
|
-
body: models.CameraSettings,
|
|
703
|
-
) -> Response[
|
|
704
|
-
None,
|
|
705
|
-
None
|
|
706
|
-
]:
|
|
707
|
-
"""
|
|
708
|
-
Set the camera settings.
|
|
709
|
-
"""
|
|
710
|
-
path = "/api/v1/camera/settings"
|
|
711
|
-
response = self._request_manager.request(
|
|
712
|
-
"POST",
|
|
713
|
-
path,
|
|
714
|
-
headers=self._request_manager.json_headers(),
|
|
715
|
-
body=json.dumps(models.serialize_camera_settings(body)),
|
|
716
|
-
)
|
|
717
|
-
parsed = None
|
|
718
|
-
|
|
719
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
720
|
-
is_unavailable = response.status == 503
|
|
721
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
722
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
723
|
-
|
|
724
|
-
return Response(
|
|
725
|
-
parsed,
|
|
726
|
-
response.status,
|
|
727
|
-
response
|
|
728
|
-
)
|
|
729
|
-
|
|
730
|
-
data: Data
|
|
731
|
-
settings: Settings
|
|
732
|
-
|
|
733
|
-
def __init__(self, request_manager: RequestManager):
|
|
734
|
-
self._request_manager = request_manager
|
|
735
|
-
self.data = Camera.Data(request_manager)
|
|
736
|
-
self.settings = Camera.Settings(request_manager)
|
|
869
|
+
self._request_manager = request_manager
|
|
870
|
+
self.data = Camera.Data(request_manager)
|
|
871
|
+
self.settings = Camera.Settings(request_manager)
|
|
737
872
|
|
|
738
873
|
class Faults:
|
|
739
|
-
|
|
740
|
-
|
|
874
|
+
_request_manager: RequestManager
|
|
875
|
+
class UserFaults:
|
|
876
|
+
def __init__(self, request_manager: RequestManager):
|
|
877
|
+
self._request_manager = request_manager
|
|
878
|
+
|
|
879
|
+
|
|
880
|
+
def trigger_user_fault(
|
|
881
|
+
self,
|
|
882
|
+
body: models.TriggerFaultRequest,
|
|
883
|
+
) -> Response[
|
|
884
|
+
Union[
|
|
885
|
+
models.ErrorResponse,
|
|
886
|
+
models.ErrorResponse,
|
|
887
|
+
None
|
|
888
|
+
],
|
|
889
|
+
None
|
|
890
|
+
]:
|
|
891
|
+
"""
|
|
892
|
+
Trigger user faults for routine
|
|
893
|
+
|
|
894
|
+
"""
|
|
895
|
+
path = "/api/v1/faults/user-fault"
|
|
896
|
+
try:
|
|
897
|
+
response = self._request_manager.request(
|
|
898
|
+
"POST",
|
|
899
|
+
path,
|
|
900
|
+
headers=self._request_manager.json_headers(),
|
|
901
|
+
body=json.dumps(models.serialize_trigger_fault_request(body)),
|
|
902
|
+
)
|
|
903
|
+
parsed = None
|
|
904
|
+
if response.status == 400:
|
|
905
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
906
|
+
|
|
907
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
908
|
+
is_unavailable = response.status == 503
|
|
909
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
910
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
911
|
+
|
|
912
|
+
return Response(
|
|
913
|
+
parsed,
|
|
914
|
+
response.status,
|
|
915
|
+
response
|
|
916
|
+
)
|
|
917
|
+
except urllib3.exceptions.MaxRetryError:
|
|
918
|
+
return Response(
|
|
919
|
+
models.ErrorResponse(
|
|
920
|
+
error=models.ErrorEnum.InternalServerError,
|
|
921
|
+
message="Connection Refused"
|
|
922
|
+
),
|
|
923
|
+
503,
|
|
924
|
+
None
|
|
925
|
+
)
|
|
926
|
+
|
|
927
|
+
user_faults: UserFaults
|
|
928
|
+
|
|
741
929
|
def __init__(self, request_manager: RequestManager):
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
def trigger_user_fault(
|
|
746
|
-
self,
|
|
747
|
-
body: models.TriggerFaultRequest,
|
|
748
|
-
) -> Response[
|
|
749
|
-
Union[
|
|
750
|
-
models.ErrorResponse,
|
|
751
|
-
models.ErrorResponse,
|
|
752
|
-
None
|
|
753
|
-
],
|
|
754
|
-
None
|
|
755
|
-
]:
|
|
756
|
-
"""
|
|
757
|
-
Trigger user faults for routine
|
|
758
|
-
|
|
759
|
-
"""
|
|
760
|
-
path = "/api/v1/faults/user-fault"
|
|
761
|
-
response = self._request_manager.request(
|
|
762
|
-
"POST",
|
|
763
|
-
path,
|
|
764
|
-
headers=self._request_manager.json_headers(),
|
|
765
|
-
body=json.dumps(models.serialize_trigger_fault_request(body)),
|
|
766
|
-
)
|
|
767
|
-
parsed = None
|
|
768
|
-
if response.status == 400:
|
|
769
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
770
|
-
|
|
771
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
772
|
-
is_unavailable = response.status == 503
|
|
773
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
774
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
775
|
-
|
|
776
|
-
return Response(
|
|
777
|
-
parsed,
|
|
778
|
-
response.status,
|
|
779
|
-
response
|
|
780
|
-
)
|
|
781
|
-
|
|
782
|
-
user_faults: UserFaults
|
|
783
|
-
|
|
784
|
-
def __init__(self, request_manager: RequestManager):
|
|
785
|
-
self._request_manager = request_manager
|
|
786
|
-
self.user_faults = Faults.UserFaults(request_manager)
|
|
930
|
+
self._request_manager = request_manager
|
|
931
|
+
self.user_faults = Faults.UserFaults(request_manager)
|
|
787
932
|
|
|
788
933
|
class ChatGPT:
|
|
789
|
-
|
|
790
|
-
|
|
934
|
+
_request_manager: RequestManager
|
|
935
|
+
class Data:
|
|
936
|
+
def __init__(self, request_manager: RequestManager):
|
|
937
|
+
self._request_manager = request_manager
|
|
938
|
+
|
|
939
|
+
|
|
940
|
+
def speech_to_text(
|
|
941
|
+
self,
|
|
942
|
+
body: models.SpeechToTextRequest,
|
|
943
|
+
) -> Response[
|
|
944
|
+
None,
|
|
945
|
+
None
|
|
946
|
+
]:
|
|
947
|
+
"""
|
|
948
|
+
Convert speech to text.
|
|
949
|
+
"""
|
|
950
|
+
path = "/api/v1/internal-only/speech-to-text"
|
|
951
|
+
try:
|
|
952
|
+
response = self._request_manager.request(
|
|
953
|
+
"POST",
|
|
954
|
+
path,
|
|
955
|
+
headers=self._request_manager.json_headers(),
|
|
956
|
+
body=json.dumps(models.serialize_speech_to_text_request(body)),
|
|
957
|
+
)
|
|
958
|
+
parsed = None
|
|
959
|
+
|
|
960
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
961
|
+
is_unavailable = response.status == 503
|
|
962
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
963
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
964
|
+
|
|
965
|
+
return Response(
|
|
966
|
+
parsed,
|
|
967
|
+
response.status,
|
|
968
|
+
response
|
|
969
|
+
)
|
|
970
|
+
except urllib3.exceptions.MaxRetryError:
|
|
971
|
+
return Response(
|
|
972
|
+
models.ErrorResponse(
|
|
973
|
+
error=models.ErrorEnum.InternalServerError,
|
|
974
|
+
message="Connection Refused"
|
|
975
|
+
),
|
|
976
|
+
503,
|
|
977
|
+
None
|
|
978
|
+
)
|
|
979
|
+
def text_to_skill(
|
|
980
|
+
self,
|
|
981
|
+
body: models.TextToSkillRequest,
|
|
982
|
+
) -> Response[
|
|
983
|
+
None,
|
|
984
|
+
None
|
|
985
|
+
]:
|
|
986
|
+
"""
|
|
987
|
+
Convert text to a skill.
|
|
988
|
+
"""
|
|
989
|
+
path = "/api/v1/internal-only/text-to-skill"
|
|
990
|
+
try:
|
|
991
|
+
response = self._request_manager.request(
|
|
992
|
+
"POST",
|
|
993
|
+
path,
|
|
994
|
+
headers=self._request_manager.json_headers(),
|
|
995
|
+
body=json.dumps(models.serialize_text_to_skill_request(body)),
|
|
996
|
+
)
|
|
997
|
+
parsed = None
|
|
998
|
+
|
|
999
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1000
|
+
is_unavailable = response.status == 503
|
|
1001
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1002
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1003
|
+
|
|
1004
|
+
return Response(
|
|
1005
|
+
parsed,
|
|
1006
|
+
response.status,
|
|
1007
|
+
response
|
|
1008
|
+
)
|
|
1009
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1010
|
+
return Response(
|
|
1011
|
+
models.ErrorResponse(
|
|
1012
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1013
|
+
message="Connection Refused"
|
|
1014
|
+
),
|
|
1015
|
+
503,
|
|
1016
|
+
None
|
|
1017
|
+
)
|
|
1018
|
+
|
|
1019
|
+
data: Data
|
|
1020
|
+
|
|
791
1021
|
def __init__(self, request_manager: RequestManager):
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
def speech_to_text(
|
|
796
|
-
self,
|
|
797
|
-
body: models.SpeechToTextRequest,
|
|
798
|
-
) -> Response[
|
|
799
|
-
None,
|
|
800
|
-
None
|
|
801
|
-
]:
|
|
802
|
-
"""
|
|
803
|
-
Convert speech to text.
|
|
804
|
-
"""
|
|
805
|
-
path = "/api/v1/internal-only/speech-to-text"
|
|
806
|
-
response = self._request_manager.request(
|
|
807
|
-
"POST",
|
|
808
|
-
path,
|
|
809
|
-
headers=self._request_manager.json_headers(),
|
|
810
|
-
body=json.dumps(models.serialize_speech_to_text_request(body)),
|
|
811
|
-
)
|
|
812
|
-
parsed = None
|
|
813
|
-
|
|
814
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
815
|
-
is_unavailable = response.status == 503
|
|
816
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
817
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
818
|
-
|
|
819
|
-
return Response(
|
|
820
|
-
parsed,
|
|
821
|
-
response.status,
|
|
822
|
-
response
|
|
823
|
-
)
|
|
824
|
-
|
|
825
|
-
def text_to_skill(
|
|
826
|
-
self,
|
|
827
|
-
body: models.TextToSkillRequest,
|
|
828
|
-
) -> Response[
|
|
829
|
-
None,
|
|
830
|
-
None
|
|
831
|
-
]:
|
|
832
|
-
"""
|
|
833
|
-
Convert text to a skill.
|
|
834
|
-
"""
|
|
835
|
-
path = "/api/v1/internal-only/text-to-skill"
|
|
836
|
-
response = self._request_manager.request(
|
|
837
|
-
"POST",
|
|
838
|
-
path,
|
|
839
|
-
headers=self._request_manager.json_headers(),
|
|
840
|
-
body=json.dumps(models.serialize_text_to_skill_request(body)),
|
|
841
|
-
)
|
|
842
|
-
parsed = None
|
|
843
|
-
|
|
844
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
845
|
-
is_unavailable = response.status == 503
|
|
846
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
847
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
848
|
-
|
|
849
|
-
return Response(
|
|
850
|
-
parsed,
|
|
851
|
-
response.status,
|
|
852
|
-
response
|
|
853
|
-
)
|
|
854
|
-
|
|
855
|
-
data: Data
|
|
856
|
-
|
|
857
|
-
def __init__(self, request_manager: RequestManager):
|
|
858
|
-
self._request_manager = request_manager
|
|
859
|
-
self.data = ChatGPT.Data(request_manager)
|
|
1022
|
+
self._request_manager = request_manager
|
|
1023
|
+
self.data = ChatGPT.Data(request_manager)
|
|
860
1024
|
|
|
861
1025
|
class IO:
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
1026
|
+
_request_manager: RequestManager
|
|
1027
|
+
class Control:
|
|
1028
|
+
def __init__(self, request_manager: RequestManager):
|
|
1029
|
+
self._request_manager = request_manager
|
|
1030
|
+
|
|
1031
|
+
|
|
1032
|
+
def update_io_state(
|
|
1033
|
+
self,
|
|
1034
|
+
body: models.IOStateUpdateRequest,
|
|
1035
|
+
) -> Response[
|
|
1036
|
+
Union[
|
|
1037
|
+
models.IOStateResponse,
|
|
1038
|
+
models.ErrorResponse,
|
|
1039
|
+
models.ErrorResponse,
|
|
1040
|
+
None
|
|
1041
|
+
],
|
|
1042
|
+
models.IOStateResponse
|
|
1043
|
+
]:
|
|
1044
|
+
"""
|
|
1045
|
+
Updates the state of I/O based on the provided action ('high' or 'low').
|
|
1046
|
+
"""
|
|
1047
|
+
path = "/api/v1/io"
|
|
1048
|
+
try:
|
|
1049
|
+
response = self._request_manager.request(
|
|
1050
|
+
"POST",
|
|
1051
|
+
path,
|
|
1052
|
+
headers=self._request_manager.json_headers(),
|
|
1053
|
+
body=json.dumps(models.serialize_io_state_update_request(body)),
|
|
1054
|
+
)
|
|
1055
|
+
parsed = None
|
|
1056
|
+
if response.status == 200:
|
|
1057
|
+
parsed = models.parse_io_state_response(json.loads(response.data))
|
|
1058
|
+
if response.status == 400:
|
|
1059
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1060
|
+
|
|
1061
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1062
|
+
is_unavailable = response.status == 503
|
|
1063
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1064
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1065
|
+
|
|
1066
|
+
return Response(
|
|
1067
|
+
parsed,
|
|
1068
|
+
response.status,
|
|
1069
|
+
response
|
|
1070
|
+
)
|
|
1071
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1072
|
+
return Response(
|
|
1073
|
+
models.ErrorResponse(
|
|
1074
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1075
|
+
message="Connection Refused"
|
|
1076
|
+
),
|
|
1077
|
+
503,
|
|
1078
|
+
None
|
|
1079
|
+
)
|
|
1080
|
+
class Status:
|
|
1081
|
+
def __init__(self, request_manager: RequestManager):
|
|
1082
|
+
self._request_manager = request_manager
|
|
1083
|
+
|
|
1084
|
+
|
|
1085
|
+
def get_io_state(
|
|
1086
|
+
self,
|
|
1087
|
+
) -> Response[
|
|
1088
|
+
Union[
|
|
1089
|
+
models.IOStateResponse,
|
|
1090
|
+
models.ErrorResponse,
|
|
1091
|
+
None
|
|
1092
|
+
],
|
|
1093
|
+
models.IOStateResponse
|
|
1094
|
+
]:
|
|
1095
|
+
"""
|
|
1096
|
+
Retrieves the current state of I/O.
|
|
1097
|
+
"""
|
|
1098
|
+
path = "/api/v1/io"
|
|
1099
|
+
try:
|
|
1100
|
+
response = self._request_manager.request(
|
|
1101
|
+
"GET",
|
|
1102
|
+
path,
|
|
1103
|
+
headers=self._request_manager.json_headers(),
|
|
1104
|
+
)
|
|
1105
|
+
parsed = None
|
|
1106
|
+
if response.status == 200:
|
|
1107
|
+
parsed = models.parse_io_state_response(json.loads(response.data))
|
|
1108
|
+
|
|
1109
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1110
|
+
is_unavailable = response.status == 503
|
|
1111
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1112
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1113
|
+
|
|
1114
|
+
return Response(
|
|
1115
|
+
parsed,
|
|
1116
|
+
response.status,
|
|
1117
|
+
response
|
|
1118
|
+
)
|
|
1119
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1120
|
+
return Response(
|
|
1121
|
+
models.ErrorResponse(
|
|
1122
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1123
|
+
message="Connection Refused"
|
|
1124
|
+
),
|
|
1125
|
+
503,
|
|
1126
|
+
None
|
|
1127
|
+
)
|
|
1128
|
+
|
|
1129
|
+
control: Control
|
|
1130
|
+
status: Status
|
|
1131
|
+
|
|
908
1132
|
def __init__(self, request_manager: RequestManager):
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
def get_io_state(
|
|
913
|
-
self,
|
|
914
|
-
) -> Response[
|
|
915
|
-
Union[
|
|
916
|
-
models.IOStateResponse,
|
|
917
|
-
models.ErrorResponse,
|
|
918
|
-
None
|
|
919
|
-
],
|
|
920
|
-
models.IOStateResponse
|
|
921
|
-
]:
|
|
922
|
-
"""
|
|
923
|
-
Retrieves the current state of I/O.
|
|
924
|
-
"""
|
|
925
|
-
path = "/api/v1/io"
|
|
926
|
-
response = self._request_manager.request(
|
|
927
|
-
"GET",
|
|
928
|
-
path,
|
|
929
|
-
headers=self._request_manager.json_headers(),
|
|
930
|
-
)
|
|
931
|
-
parsed = None
|
|
932
|
-
if response.status == 200:
|
|
933
|
-
parsed = models.parse_io_state_response(json.loads(response.data))
|
|
934
|
-
|
|
935
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
936
|
-
is_unavailable = response.status == 503
|
|
937
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
938
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
939
|
-
|
|
940
|
-
return Response(
|
|
941
|
-
parsed,
|
|
942
|
-
response.status,
|
|
943
|
-
response
|
|
944
|
-
)
|
|
945
|
-
|
|
946
|
-
control: Control
|
|
947
|
-
status: Status
|
|
948
|
-
|
|
949
|
-
def __init__(self, request_manager: RequestManager):
|
|
950
|
-
self._request_manager = request_manager
|
|
951
|
-
self.control = IO.Control(request_manager)
|
|
952
|
-
self.status = IO.Status(request_manager)
|
|
1133
|
+
self._request_manager = request_manager
|
|
1134
|
+
self.control = IO.Control(request_manager)
|
|
1135
|
+
self.status = IO.Status(request_manager)
|
|
953
1136
|
|
|
954
1137
|
class General:
|
|
955
|
-
|
|
956
|
-
|
|
1138
|
+
_request_manager: RequestManager
|
|
1139
|
+
class Joints:
|
|
1140
|
+
def __init__(self, request_manager: RequestManager):
|
|
1141
|
+
self._request_manager = request_manager
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
def get_joints_state(
|
|
1145
|
+
self,
|
|
1146
|
+
) -> Response[
|
|
1147
|
+
Union[
|
|
1148
|
+
models.JointsStateResponse,
|
|
1149
|
+
models.ErrorResponse,
|
|
1150
|
+
None
|
|
1151
|
+
],
|
|
1152
|
+
models.JointsStateResponse
|
|
1153
|
+
]:
|
|
1154
|
+
"""
|
|
1155
|
+
Retrieves information about the state of each joint
|
|
1156
|
+
"""
|
|
1157
|
+
path = "/api/v1/joints"
|
|
1158
|
+
try:
|
|
1159
|
+
response = self._request_manager.request(
|
|
1160
|
+
"GET",
|
|
1161
|
+
path,
|
|
1162
|
+
headers=self._request_manager.json_headers(),
|
|
1163
|
+
)
|
|
1164
|
+
parsed = None
|
|
1165
|
+
if response.status == 200:
|
|
1166
|
+
parsed = models.parse_joints_state_response(json.loads(response.data))
|
|
1167
|
+
|
|
1168
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1169
|
+
is_unavailable = response.status == 503
|
|
1170
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1171
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1172
|
+
|
|
1173
|
+
return Response(
|
|
1174
|
+
parsed,
|
|
1175
|
+
response.status,
|
|
1176
|
+
response
|
|
1177
|
+
)
|
|
1178
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1179
|
+
return Response(
|
|
1180
|
+
models.ErrorResponse(
|
|
1181
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1182
|
+
message="Connection Refused"
|
|
1183
|
+
),
|
|
1184
|
+
503,
|
|
1185
|
+
None
|
|
1186
|
+
)
|
|
1187
|
+
|
|
1188
|
+
joints: Joints
|
|
1189
|
+
|
|
1190
|
+
def __init__(self, request_manager: RequestManager):
|
|
1191
|
+
self._request_manager = request_manager
|
|
1192
|
+
self.joints = General.Joints(request_manager)
|
|
1193
|
+
|
|
1194
|
+
class Poses:
|
|
1195
|
+
_request_manager: RequestManager
|
|
1196
|
+
class ConstructPose:
|
|
1197
|
+
def __init__(self, request_manager: RequestManager):
|
|
1198
|
+
self._request_manager = request_manager
|
|
1199
|
+
|
|
1200
|
+
|
|
1201
|
+
def cartesian_pose(
|
|
1202
|
+
self,
|
|
1203
|
+
body: models.CartesianPoseRequest,
|
|
1204
|
+
) -> Response[
|
|
1205
|
+
Union[
|
|
1206
|
+
models.CartesianPoseResponse,
|
|
1207
|
+
models.ErrorResponse,
|
|
1208
|
+
models.ErrorResponse,
|
|
1209
|
+
None
|
|
1210
|
+
],
|
|
1211
|
+
models.CartesianPoseResponse
|
|
1212
|
+
]:
|
|
1213
|
+
"""
|
|
1214
|
+
Retrieve the cartesian pose based on euler angles
|
|
1215
|
+
|
|
1216
|
+
"""
|
|
1217
|
+
path = "/api/v1/poses/cartesian-pose"
|
|
1218
|
+
try:
|
|
1219
|
+
response = self._request_manager.request(
|
|
1220
|
+
"POST",
|
|
1221
|
+
path,
|
|
1222
|
+
headers=self._request_manager.json_headers(),
|
|
1223
|
+
body=json.dumps(models.serialize_cartesian_pose_request(body)),
|
|
1224
|
+
)
|
|
1225
|
+
parsed = None
|
|
1226
|
+
if response.status == 200:
|
|
1227
|
+
parsed = models.parse_cartesian_pose_response(json.loads(response.data))
|
|
1228
|
+
if response.status == 400:
|
|
1229
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1230
|
+
|
|
1231
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1232
|
+
is_unavailable = response.status == 503
|
|
1233
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1234
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1235
|
+
|
|
1236
|
+
return Response(
|
|
1237
|
+
parsed,
|
|
1238
|
+
response.status,
|
|
1239
|
+
response
|
|
1240
|
+
)
|
|
1241
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1242
|
+
return Response(
|
|
1243
|
+
models.ErrorResponse(
|
|
1244
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1245
|
+
message="Connection Refused"
|
|
1246
|
+
),
|
|
1247
|
+
503,
|
|
1248
|
+
None
|
|
1249
|
+
)
|
|
1250
|
+
def joint_pose(
|
|
1251
|
+
self,
|
|
1252
|
+
body: models.JointPoseRequest,
|
|
1253
|
+
) -> Response[
|
|
1254
|
+
Union[
|
|
1255
|
+
models.JointPoseResponse,
|
|
1256
|
+
models.ErrorResponse,
|
|
1257
|
+
models.ErrorResponse,
|
|
1258
|
+
None
|
|
1259
|
+
],
|
|
1260
|
+
models.JointPoseResponse
|
|
1261
|
+
]:
|
|
1262
|
+
"""
|
|
1263
|
+
Retrieve the cartesian pose based on joint angles
|
|
1264
|
+
|
|
1265
|
+
"""
|
|
1266
|
+
path = "/api/v1/poses/joint-pose"
|
|
1267
|
+
try:
|
|
1268
|
+
response = self._request_manager.request(
|
|
1269
|
+
"POST",
|
|
1270
|
+
path,
|
|
1271
|
+
headers=self._request_manager.json_headers(),
|
|
1272
|
+
body=json.dumps(models.serialize_joint_pose_request(body)),
|
|
1273
|
+
)
|
|
1274
|
+
parsed = None
|
|
1275
|
+
if response.status == 200:
|
|
1276
|
+
parsed = models.parse_joint_pose_response(json.loads(response.data))
|
|
1277
|
+
if response.status == 400:
|
|
1278
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1279
|
+
|
|
1280
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1281
|
+
is_unavailable = response.status == 503
|
|
1282
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1283
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1284
|
+
|
|
1285
|
+
return Response(
|
|
1286
|
+
parsed,
|
|
1287
|
+
response.status,
|
|
1288
|
+
response
|
|
1289
|
+
)
|
|
1290
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1291
|
+
return Response(
|
|
1292
|
+
models.ErrorResponse(
|
|
1293
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1294
|
+
message="Connection Refused"
|
|
1295
|
+
),
|
|
1296
|
+
503,
|
|
1297
|
+
None
|
|
1298
|
+
)
|
|
1299
|
+
class CartesianDistance:
|
|
1300
|
+
def __init__(self, request_manager: RequestManager):
|
|
1301
|
+
self._request_manager = request_manager
|
|
1302
|
+
|
|
1303
|
+
|
|
1304
|
+
def pose_distance(
|
|
1305
|
+
self,
|
|
1306
|
+
body: models.PoseDistanceRequest,
|
|
1307
|
+
) -> Response[
|
|
1308
|
+
Union[
|
|
1309
|
+
models.PoseDistanceResponse,
|
|
1310
|
+
models.ErrorResponse,
|
|
1311
|
+
models.ErrorResponse,
|
|
1312
|
+
None
|
|
1313
|
+
],
|
|
1314
|
+
models.PoseDistanceResponse
|
|
1315
|
+
]:
|
|
1316
|
+
"""
|
|
1317
|
+
Calculate the distance between two cartesian poses
|
|
1318
|
+
|
|
1319
|
+
"""
|
|
1320
|
+
path = "/api/v1/poses/pose-distance"
|
|
1321
|
+
try:
|
|
1322
|
+
response = self._request_manager.request(
|
|
1323
|
+
"POST",
|
|
1324
|
+
path,
|
|
1325
|
+
headers=self._request_manager.json_headers(),
|
|
1326
|
+
body=json.dumps(models.serialize_pose_distance_request(body)),
|
|
1327
|
+
)
|
|
1328
|
+
parsed = None
|
|
1329
|
+
if response.status == 200:
|
|
1330
|
+
parsed = models.parse_pose_distance_response(json.loads(response.data))
|
|
1331
|
+
if response.status == 400:
|
|
1332
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1333
|
+
|
|
1334
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1335
|
+
is_unavailable = response.status == 503
|
|
1336
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1337
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1338
|
+
|
|
1339
|
+
return Response(
|
|
1340
|
+
parsed,
|
|
1341
|
+
response.status,
|
|
1342
|
+
response
|
|
1343
|
+
)
|
|
1344
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1345
|
+
return Response(
|
|
1346
|
+
models.ErrorResponse(
|
|
1347
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1348
|
+
message="Connection Refused"
|
|
1349
|
+
),
|
|
1350
|
+
503,
|
|
1351
|
+
None
|
|
1352
|
+
)
|
|
1353
|
+
class PoseOperations:
|
|
1354
|
+
def __init__(self, request_manager: RequestManager):
|
|
1355
|
+
self._request_manager = request_manager
|
|
1356
|
+
|
|
1357
|
+
|
|
1358
|
+
def poses_addition(
|
|
1359
|
+
self,
|
|
1360
|
+
body: models.PoseOperationsRequest,
|
|
1361
|
+
) -> Response[
|
|
1362
|
+
Union[
|
|
1363
|
+
models.PoseOperationsResponse,
|
|
1364
|
+
models.ErrorResponse,
|
|
1365
|
+
models.ErrorResponse,
|
|
1366
|
+
None
|
|
1367
|
+
],
|
|
1368
|
+
models.PoseOperationsResponse
|
|
1369
|
+
]:
|
|
1370
|
+
"""
|
|
1371
|
+
Calculate the addition between two cartesian poses
|
|
1372
|
+
|
|
1373
|
+
"""
|
|
1374
|
+
path = "/api/v1/poses/add"
|
|
1375
|
+
try:
|
|
1376
|
+
response = self._request_manager.request(
|
|
1377
|
+
"POST",
|
|
1378
|
+
path,
|
|
1379
|
+
headers=self._request_manager.json_headers(),
|
|
1380
|
+
body=json.dumps(models.serialize_pose_operations_request(body)),
|
|
1381
|
+
)
|
|
1382
|
+
parsed = None
|
|
1383
|
+
if response.status == 200:
|
|
1384
|
+
parsed = models.parse_pose_operations_response(json.loads(response.data))
|
|
1385
|
+
if response.status == 400:
|
|
1386
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1387
|
+
|
|
1388
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1389
|
+
is_unavailable = response.status == 503
|
|
1390
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1391
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1392
|
+
|
|
1393
|
+
return Response(
|
|
1394
|
+
parsed,
|
|
1395
|
+
response.status,
|
|
1396
|
+
response
|
|
1397
|
+
)
|
|
1398
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1399
|
+
return Response(
|
|
1400
|
+
models.ErrorResponse(
|
|
1401
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1402
|
+
message="Connection Refused"
|
|
1403
|
+
),
|
|
1404
|
+
503,
|
|
1405
|
+
None
|
|
1406
|
+
)
|
|
1407
|
+
def poses_subtraction(
|
|
1408
|
+
self,
|
|
1409
|
+
body: models.PoseOperationsRequest,
|
|
1410
|
+
) -> Response[
|
|
1411
|
+
Union[
|
|
1412
|
+
models.PoseOperationsResponse,
|
|
1413
|
+
models.ErrorResponse,
|
|
1414
|
+
models.ErrorResponse,
|
|
1415
|
+
None
|
|
1416
|
+
],
|
|
1417
|
+
models.PoseOperationsResponse
|
|
1418
|
+
]:
|
|
1419
|
+
"""
|
|
1420
|
+
Calculate the subtraction between two cartesian poses
|
|
1421
|
+
|
|
1422
|
+
"""
|
|
1423
|
+
path = "/api/v1/poses/subtract"
|
|
1424
|
+
try:
|
|
1425
|
+
response = self._request_manager.request(
|
|
1426
|
+
"POST",
|
|
1427
|
+
path,
|
|
1428
|
+
headers=self._request_manager.json_headers(),
|
|
1429
|
+
body=json.dumps(models.serialize_pose_operations_request(body)),
|
|
1430
|
+
)
|
|
1431
|
+
parsed = None
|
|
1432
|
+
if response.status == 200:
|
|
1433
|
+
parsed = models.parse_pose_operations_response(json.loads(response.data))
|
|
1434
|
+
if response.status == 400:
|
|
1435
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1436
|
+
|
|
1437
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1438
|
+
is_unavailable = response.status == 503
|
|
1439
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1440
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1441
|
+
|
|
1442
|
+
return Response(
|
|
1443
|
+
parsed,
|
|
1444
|
+
response.status,
|
|
1445
|
+
response
|
|
1446
|
+
)
|
|
1447
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1448
|
+
return Response(
|
|
1449
|
+
models.ErrorResponse(
|
|
1450
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1451
|
+
message="Connection Refused"
|
|
1452
|
+
),
|
|
1453
|
+
503,
|
|
1454
|
+
None
|
|
1455
|
+
)
|
|
1456
|
+
def cartesian_offset(
|
|
1457
|
+
self,
|
|
1458
|
+
body: models.CartesianOffsetRequest,
|
|
1459
|
+
) -> Response[
|
|
1460
|
+
Union[
|
|
1461
|
+
models.CartesianOffsetResponse,
|
|
1462
|
+
models.ErrorResponse,
|
|
1463
|
+
models.ErrorResponse,
|
|
1464
|
+
None
|
|
1465
|
+
],
|
|
1466
|
+
models.CartesianOffsetResponse
|
|
1467
|
+
]:
|
|
1468
|
+
"""
|
|
1469
|
+
Determine the robot pose after applying the offset transformation
|
|
1470
|
+
|
|
1471
|
+
"""
|
|
1472
|
+
path = "/api/v1/poses/cartesian-offset"
|
|
1473
|
+
try:
|
|
1474
|
+
response = self._request_manager.request(
|
|
1475
|
+
"POST",
|
|
1476
|
+
path,
|
|
1477
|
+
headers=self._request_manager.json_headers(),
|
|
1478
|
+
body=json.dumps(models.serialize_cartesian_offset_request(body)),
|
|
1479
|
+
)
|
|
1480
|
+
parsed = None
|
|
1481
|
+
if response.status == 200:
|
|
1482
|
+
parsed = models.parse_cartesian_offset_response(json.loads(response.data))
|
|
1483
|
+
if response.status == 400:
|
|
1484
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1485
|
+
|
|
1486
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1487
|
+
is_unavailable = response.status == 503
|
|
1488
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1489
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1490
|
+
|
|
1491
|
+
return Response(
|
|
1492
|
+
parsed,
|
|
1493
|
+
response.status,
|
|
1494
|
+
response
|
|
1495
|
+
)
|
|
1496
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1497
|
+
return Response(
|
|
1498
|
+
models.ErrorResponse(
|
|
1499
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1500
|
+
message="Connection Refused"
|
|
1501
|
+
),
|
|
1502
|
+
503,
|
|
1503
|
+
None
|
|
1504
|
+
)
|
|
1505
|
+
class PoseRetrieval:
|
|
1506
|
+
def __init__(self, request_manager: RequestManager):
|
|
1507
|
+
self._request_manager = request_manager
|
|
1508
|
+
|
|
1509
|
+
|
|
1510
|
+
def get_joints_position(
|
|
1511
|
+
self,
|
|
1512
|
+
) -> Response[
|
|
1513
|
+
Union[
|
|
1514
|
+
models.JointsPositionResponse,
|
|
1515
|
+
models.ErrorResponse,
|
|
1516
|
+
None
|
|
1517
|
+
],
|
|
1518
|
+
models.JointsPositionResponse
|
|
1519
|
+
]:
|
|
1520
|
+
"""
|
|
1521
|
+
Get the joints position of the robot
|
|
1522
|
+
"""
|
|
1523
|
+
path = "/api/v1/poses/joints-position"
|
|
1524
|
+
try:
|
|
1525
|
+
response = self._request_manager.request(
|
|
1526
|
+
"GET",
|
|
1527
|
+
path,
|
|
1528
|
+
headers=self._request_manager.json_headers(),
|
|
1529
|
+
)
|
|
1530
|
+
parsed = None
|
|
1531
|
+
if response.status == 200:
|
|
1532
|
+
parsed = models.parse_joints_position_response(json.loads(response.data))
|
|
1533
|
+
|
|
1534
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1535
|
+
is_unavailable = response.status == 503
|
|
1536
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1537
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1538
|
+
|
|
1539
|
+
return Response(
|
|
1540
|
+
parsed,
|
|
1541
|
+
response.status,
|
|
1542
|
+
response
|
|
1543
|
+
)
|
|
1544
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1545
|
+
return Response(
|
|
1546
|
+
models.ErrorResponse(
|
|
1547
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1548
|
+
message="Connection Refused"
|
|
1549
|
+
),
|
|
1550
|
+
503,
|
|
1551
|
+
None
|
|
1552
|
+
)
|
|
1553
|
+
def get_tooltip_position(
|
|
1554
|
+
self,
|
|
1555
|
+
) -> Response[
|
|
1556
|
+
Union[
|
|
1557
|
+
models.TooltipPositionResponse,
|
|
1558
|
+
models.ErrorResponse,
|
|
1559
|
+
None
|
|
1560
|
+
],
|
|
1561
|
+
models.TooltipPositionResponse
|
|
1562
|
+
]:
|
|
1563
|
+
"""
|
|
1564
|
+
Get the tooltip position of the robot
|
|
1565
|
+
"""
|
|
1566
|
+
path = "/api/v1/poses/tooltip-position"
|
|
1567
|
+
try:
|
|
1568
|
+
response = self._request_manager.request(
|
|
1569
|
+
"GET",
|
|
1570
|
+
path,
|
|
1571
|
+
headers=self._request_manager.json_headers(),
|
|
1572
|
+
)
|
|
1573
|
+
parsed = None
|
|
1574
|
+
if response.status == 200:
|
|
1575
|
+
parsed = models.parse_tooltip_position_response(json.loads(response.data))
|
|
1576
|
+
|
|
1577
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1578
|
+
is_unavailable = response.status == 503
|
|
1579
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1580
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1581
|
+
|
|
1582
|
+
return Response(
|
|
1583
|
+
parsed,
|
|
1584
|
+
response.status,
|
|
1585
|
+
response
|
|
1586
|
+
)
|
|
1587
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1588
|
+
return Response(
|
|
1589
|
+
models.ErrorResponse(
|
|
1590
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1591
|
+
message="Connection Refused"
|
|
1592
|
+
),
|
|
1593
|
+
503,
|
|
1594
|
+
None
|
|
1595
|
+
)
|
|
1596
|
+
def get_flange_position(
|
|
1597
|
+
self,
|
|
1598
|
+
) -> Response[
|
|
1599
|
+
Union[
|
|
1600
|
+
models.FlangePositionResponse,
|
|
1601
|
+
models.ErrorResponse,
|
|
1602
|
+
None
|
|
1603
|
+
],
|
|
1604
|
+
models.FlangePositionResponse
|
|
1605
|
+
]:
|
|
1606
|
+
"""
|
|
1607
|
+
Get the flange position of the robot
|
|
1608
|
+
"""
|
|
1609
|
+
path = "/api/v1/poses/flange-position"
|
|
1610
|
+
try:
|
|
1611
|
+
response = self._request_manager.request(
|
|
1612
|
+
"GET",
|
|
1613
|
+
path,
|
|
1614
|
+
headers=self._request_manager.json_headers(),
|
|
1615
|
+
)
|
|
1616
|
+
parsed = None
|
|
1617
|
+
if response.status == 200:
|
|
1618
|
+
parsed = models.parse_flange_position_response(json.loads(response.data))
|
|
1619
|
+
|
|
1620
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1621
|
+
is_unavailable = response.status == 503
|
|
1622
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1623
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1624
|
+
|
|
1625
|
+
return Response(
|
|
1626
|
+
parsed,
|
|
1627
|
+
response.status,
|
|
1628
|
+
response
|
|
1629
|
+
)
|
|
1630
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1631
|
+
return Response(
|
|
1632
|
+
models.ErrorResponse(
|
|
1633
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1634
|
+
message="Connection Refused"
|
|
1635
|
+
),
|
|
1636
|
+
503,
|
|
1637
|
+
None
|
|
1638
|
+
)
|
|
1639
|
+
|
|
1640
|
+
construct_pose: ConstructPose
|
|
1641
|
+
cartesian_distance: CartesianDistance
|
|
1642
|
+
pose_operations: PoseOperations
|
|
1643
|
+
pose_retrieval: PoseRetrieval
|
|
1644
|
+
|
|
957
1645
|
def __init__(self, request_manager: RequestManager):
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
) -> Response[
|
|
964
|
-
Union[
|
|
965
|
-
models.JointsStateResponse,
|
|
966
|
-
models.ErrorResponse,
|
|
967
|
-
None
|
|
968
|
-
],
|
|
969
|
-
models.JointsStateResponse
|
|
970
|
-
]:
|
|
971
|
-
"""
|
|
972
|
-
Retrieves information about the state of each joint
|
|
973
|
-
"""
|
|
974
|
-
path = "/api/v1/joints"
|
|
975
|
-
response = self._request_manager.request(
|
|
976
|
-
"GET",
|
|
977
|
-
path,
|
|
978
|
-
headers=self._request_manager.json_headers(),
|
|
979
|
-
)
|
|
980
|
-
parsed = None
|
|
981
|
-
if response.status == 200:
|
|
982
|
-
parsed = models.parse_joints_state_response(json.loads(response.data))
|
|
983
|
-
|
|
984
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
985
|
-
is_unavailable = response.status == 503
|
|
986
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
987
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
988
|
-
|
|
989
|
-
return Response(
|
|
990
|
-
parsed,
|
|
991
|
-
response.status,
|
|
992
|
-
response
|
|
993
|
-
)
|
|
994
|
-
|
|
995
|
-
joints: Joints
|
|
996
|
-
|
|
997
|
-
def __init__(self, request_manager: RequestManager):
|
|
998
|
-
self._request_manager = request_manager
|
|
999
|
-
self.joints = General.Joints(request_manager)
|
|
1646
|
+
self._request_manager = request_manager
|
|
1647
|
+
self.construct_pose = Poses.ConstructPose(request_manager)
|
|
1648
|
+
self.cartesian_distance = Poses.CartesianDistance(request_manager)
|
|
1649
|
+
self.pose_operations = Poses.PoseOperations(request_manager)
|
|
1650
|
+
self.pose_retrieval = Poses.PoseRetrieval(request_manager)
|
|
1000
1651
|
|
|
1001
1652
|
class Recovery:
|
|
1002
|
-
|
|
1003
|
-
|
|
1653
|
+
_request_manager: RequestManager
|
|
1654
|
+
class Recover:
|
|
1655
|
+
def __init__(self, request_manager: RequestManager):
|
|
1656
|
+
self._request_manager = request_manager
|
|
1657
|
+
|
|
1658
|
+
|
|
1659
|
+
def recover(
|
|
1660
|
+
self,
|
|
1661
|
+
) -> Response[
|
|
1662
|
+
Union[
|
|
1663
|
+
models.RecoveryStatusResponse,
|
|
1664
|
+
models.ErrorResponse,
|
|
1665
|
+
models.ErrorResponse,
|
|
1666
|
+
None
|
|
1667
|
+
],
|
|
1668
|
+
models.RecoveryStatusResponse
|
|
1669
|
+
]:
|
|
1670
|
+
"""
|
|
1671
|
+
Recovers the robot from a fault state.
|
|
1672
|
+
|
|
1673
|
+
"""
|
|
1674
|
+
path = "/api/v1/recovery/recover"
|
|
1675
|
+
try:
|
|
1676
|
+
response = self._request_manager.request(
|
|
1677
|
+
"POST",
|
|
1678
|
+
path,
|
|
1679
|
+
headers=self._request_manager.json_headers(),
|
|
1680
|
+
)
|
|
1681
|
+
parsed = None
|
|
1682
|
+
if response.status == 200:
|
|
1683
|
+
parsed = models.parse_recovery_status_response(json.loads(response.data))
|
|
1684
|
+
if response.status == 400:
|
|
1685
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1686
|
+
|
|
1687
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1688
|
+
is_unavailable = response.status == 503
|
|
1689
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1690
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1691
|
+
|
|
1692
|
+
return Response(
|
|
1693
|
+
parsed,
|
|
1694
|
+
response.status,
|
|
1695
|
+
response
|
|
1696
|
+
)
|
|
1697
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1698
|
+
return Response(
|
|
1699
|
+
models.ErrorResponse(
|
|
1700
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1701
|
+
message="Connection Refused"
|
|
1702
|
+
),
|
|
1703
|
+
503,
|
|
1704
|
+
None
|
|
1705
|
+
)
|
|
1706
|
+
def get_status(
|
|
1707
|
+
self,
|
|
1708
|
+
) -> Response[
|
|
1709
|
+
Union[
|
|
1710
|
+
models.FailureStateResponse,
|
|
1711
|
+
models.ErrorResponse,
|
|
1712
|
+
None
|
|
1713
|
+
],
|
|
1714
|
+
models.FailureStateResponse
|
|
1715
|
+
]:
|
|
1716
|
+
"""
|
|
1717
|
+
Get the robot's recovery status.
|
|
1718
|
+
|
|
1719
|
+
"""
|
|
1720
|
+
path = "/api/v1/recovery/status"
|
|
1721
|
+
try:
|
|
1722
|
+
response = self._request_manager.request(
|
|
1723
|
+
"GET",
|
|
1724
|
+
path,
|
|
1725
|
+
headers=self._request_manager.json_headers(),
|
|
1726
|
+
)
|
|
1727
|
+
parsed = None
|
|
1728
|
+
if response.status == 200:
|
|
1729
|
+
parsed = models.parse_failure_state_response(json.loads(response.data))
|
|
1730
|
+
|
|
1731
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1732
|
+
is_unavailable = response.status == 503
|
|
1733
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1734
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1735
|
+
|
|
1736
|
+
return Response(
|
|
1737
|
+
parsed,
|
|
1738
|
+
response.status,
|
|
1739
|
+
response
|
|
1740
|
+
)
|
|
1741
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1742
|
+
return Response(
|
|
1743
|
+
models.ErrorResponse(
|
|
1744
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1745
|
+
message="Connection Refused"
|
|
1746
|
+
),
|
|
1747
|
+
503,
|
|
1748
|
+
None
|
|
1749
|
+
)
|
|
1750
|
+
|
|
1751
|
+
recover: Recover
|
|
1752
|
+
|
|
1004
1753
|
def __init__(self, request_manager: RequestManager):
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
def recover(
|
|
1009
|
-
self,
|
|
1010
|
-
) -> Response[
|
|
1011
|
-
Union[
|
|
1012
|
-
models.FailureStateResponse,
|
|
1013
|
-
models.ErrorResponse,
|
|
1014
|
-
models.ErrorResponse,
|
|
1015
|
-
None
|
|
1016
|
-
],
|
|
1017
|
-
models.FailureStateResponse
|
|
1018
|
-
]:
|
|
1019
|
-
"""
|
|
1020
|
-
Attempts to recover the robot from a fault state. Inspect the response to determine if additional recovery actions are required.
|
|
1021
|
-
|
|
1022
|
-
"""
|
|
1023
|
-
path = "/api/v1/recovery/recover"
|
|
1024
|
-
response = self._request_manager.request(
|
|
1025
|
-
"POST",
|
|
1026
|
-
path,
|
|
1027
|
-
headers=self._request_manager.json_headers(),
|
|
1028
|
-
)
|
|
1029
|
-
parsed = None
|
|
1030
|
-
if response.status == 200:
|
|
1031
|
-
parsed = models.parse_failure_state_response(json.loads(response.data))
|
|
1032
|
-
if response.status == 400:
|
|
1033
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
1034
|
-
|
|
1035
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
1036
|
-
is_unavailable = response.status == 503
|
|
1037
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
1038
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
1039
|
-
|
|
1040
|
-
return Response(
|
|
1041
|
-
parsed,
|
|
1042
|
-
response.status,
|
|
1043
|
-
response
|
|
1044
|
-
)
|
|
1045
|
-
|
|
1046
|
-
def get_status(
|
|
1047
|
-
self,
|
|
1048
|
-
) -> Response[
|
|
1049
|
-
Union[
|
|
1050
|
-
models.FailureStateResponse,
|
|
1051
|
-
models.ErrorResponse,
|
|
1052
|
-
None
|
|
1053
|
-
],
|
|
1054
|
-
models.FailureStateResponse
|
|
1055
|
-
]:
|
|
1056
|
-
"""
|
|
1057
|
-
Get the robot's recovery status.
|
|
1058
|
-
|
|
1059
|
-
"""
|
|
1060
|
-
path = "/api/v1/recovery/status"
|
|
1061
|
-
response = self._request_manager.request(
|
|
1062
|
-
"GET",
|
|
1063
|
-
path,
|
|
1064
|
-
headers=self._request_manager.json_headers(),
|
|
1065
|
-
)
|
|
1066
|
-
parsed = None
|
|
1067
|
-
if response.status == 200:
|
|
1068
|
-
parsed = models.parse_failure_state_response(json.loads(response.data))
|
|
1069
|
-
|
|
1070
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
1071
|
-
is_unavailable = response.status == 503
|
|
1072
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
1073
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
1074
|
-
|
|
1075
|
-
return Response(
|
|
1076
|
-
parsed,
|
|
1077
|
-
response.status,
|
|
1078
|
-
response
|
|
1079
|
-
)
|
|
1080
|
-
|
|
1081
|
-
recover: Recover
|
|
1082
|
-
|
|
1083
|
-
def __init__(self, request_manager: RequestManager):
|
|
1084
|
-
self._request_manager = request_manager
|
|
1085
|
-
self.recover = Recovery.Recover(request_manager)
|
|
1754
|
+
self._request_manager = request_manager
|
|
1755
|
+
self.recover = Recovery.Recover(request_manager)
|
|
1086
1756
|
|
|
1087
1757
|
class ROS:
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1758
|
+
_request_manager: RequestManager
|
|
1759
|
+
class Control:
|
|
1760
|
+
def __init__(self, request_manager: RequestManager):
|
|
1761
|
+
self._request_manager = request_manager
|
|
1762
|
+
|
|
1763
|
+
|
|
1764
|
+
def update_ros_control_state(
|
|
1765
|
+
self,
|
|
1766
|
+
body: models.ROSControlUpdateRequest,
|
|
1767
|
+
) -> Response[
|
|
1768
|
+
Union[
|
|
1769
|
+
models.ROSControlStateResponse,
|
|
1770
|
+
models.ErrorResponse,
|
|
1771
|
+
None
|
|
1772
|
+
],
|
|
1773
|
+
models.ROSControlStateResponse
|
|
1774
|
+
]:
|
|
1775
|
+
"""
|
|
1776
|
+
Updates the state of ROS control based on the provided action ('enable' or 'disable').
|
|
1777
|
+
"""
|
|
1778
|
+
path = "/api/v1/movement/ros/state"
|
|
1779
|
+
try:
|
|
1780
|
+
response = self._request_manager.request(
|
|
1781
|
+
"POST",
|
|
1782
|
+
path,
|
|
1783
|
+
headers=self._request_manager.json_headers(),
|
|
1784
|
+
body=json.dumps(models.serialize_ros_control_update_request(body)),
|
|
1785
|
+
)
|
|
1786
|
+
parsed = None
|
|
1787
|
+
if response.status == 200:
|
|
1788
|
+
parsed = models.parse_ros_control_state_response(json.loads(response.data))
|
|
1789
|
+
|
|
1790
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1791
|
+
is_unavailable = response.status == 503
|
|
1792
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1793
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1794
|
+
|
|
1795
|
+
return Response(
|
|
1796
|
+
parsed,
|
|
1797
|
+
response.status,
|
|
1798
|
+
response
|
|
1799
|
+
)
|
|
1800
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1801
|
+
return Response(
|
|
1802
|
+
models.ErrorResponse(
|
|
1803
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1804
|
+
message="Connection Refused"
|
|
1805
|
+
),
|
|
1806
|
+
503,
|
|
1807
|
+
None
|
|
1808
|
+
)
|
|
1809
|
+
class Status:
|
|
1810
|
+
def __init__(self, request_manager: RequestManager):
|
|
1811
|
+
self._request_manager = request_manager
|
|
1812
|
+
|
|
1813
|
+
|
|
1814
|
+
def get_ros_control_state(
|
|
1815
|
+
self,
|
|
1816
|
+
) -> Response[
|
|
1817
|
+
Union[
|
|
1818
|
+
models.ROSControlStateResponse,
|
|
1819
|
+
models.ErrorResponse,
|
|
1820
|
+
None
|
|
1821
|
+
],
|
|
1822
|
+
models.ROSControlStateResponse
|
|
1823
|
+
]:
|
|
1824
|
+
"""
|
|
1825
|
+
Retrieves the current state of ROS control.
|
|
1826
|
+
"""
|
|
1827
|
+
path = "/api/v1/movement/ros/state"
|
|
1828
|
+
try:
|
|
1829
|
+
response = self._request_manager.request(
|
|
1830
|
+
"GET",
|
|
1831
|
+
path,
|
|
1832
|
+
headers=self._request_manager.json_headers(),
|
|
1833
|
+
)
|
|
1834
|
+
parsed = None
|
|
1835
|
+
if response.status == 200:
|
|
1836
|
+
parsed = models.parse_ros_control_state_response(json.loads(response.data))
|
|
1837
|
+
|
|
1838
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1839
|
+
is_unavailable = response.status == 503
|
|
1840
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1841
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1842
|
+
|
|
1843
|
+
return Response(
|
|
1844
|
+
parsed,
|
|
1845
|
+
response.status,
|
|
1846
|
+
response
|
|
1847
|
+
)
|
|
1848
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1849
|
+
return Response(
|
|
1850
|
+
models.ErrorResponse(
|
|
1851
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1852
|
+
message="Connection Refused"
|
|
1853
|
+
),
|
|
1854
|
+
503,
|
|
1855
|
+
None
|
|
1856
|
+
)
|
|
1857
|
+
|
|
1858
|
+
control: Control
|
|
1859
|
+
status: Status
|
|
1860
|
+
|
|
1131
1861
|
def __init__(self, request_manager: RequestManager):
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
def get_ros_control_state(
|
|
1136
|
-
self,
|
|
1137
|
-
) -> Response[
|
|
1138
|
-
Union[
|
|
1139
|
-
models.ROSControlStateResponse,
|
|
1140
|
-
models.ErrorResponse,
|
|
1141
|
-
None
|
|
1142
|
-
],
|
|
1143
|
-
models.ROSControlStateResponse
|
|
1144
|
-
]:
|
|
1145
|
-
"""
|
|
1146
|
-
Retrieves the current state of ROS control.
|
|
1147
|
-
"""
|
|
1148
|
-
path = "/api/v1/movement/ros/state"
|
|
1149
|
-
response = self._request_manager.request(
|
|
1150
|
-
"GET",
|
|
1151
|
-
path,
|
|
1152
|
-
headers=self._request_manager.json_headers(),
|
|
1153
|
-
)
|
|
1154
|
-
parsed = None
|
|
1155
|
-
if response.status == 200:
|
|
1156
|
-
parsed = models.parse_ros_control_state_response(json.loads(response.data))
|
|
1157
|
-
|
|
1158
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
1159
|
-
is_unavailable = response.status == 503
|
|
1160
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
1161
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
1162
|
-
|
|
1163
|
-
return Response(
|
|
1164
|
-
parsed,
|
|
1165
|
-
response.status,
|
|
1166
|
-
response
|
|
1167
|
-
)
|
|
1168
|
-
|
|
1169
|
-
control: Control
|
|
1170
|
-
status: Status
|
|
1171
|
-
|
|
1172
|
-
def __init__(self, request_manager: RequestManager):
|
|
1173
|
-
self._request_manager = request_manager
|
|
1174
|
-
self.control = ROS.Control(request_manager)
|
|
1175
|
-
self.status = ROS.Status(request_manager)
|
|
1862
|
+
self._request_manager = request_manager
|
|
1863
|
+
self.control = ROS.Control(request_manager)
|
|
1864
|
+
self.status = ROS.Status(request_manager)
|
|
1176
1865
|
|
|
1177
1866
|
class RoutineEditor:
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1867
|
+
_request_manager: RequestManager
|
|
1868
|
+
class Routines:
|
|
1869
|
+
def __init__(self, request_manager: RequestManager):
|
|
1870
|
+
self._request_manager = request_manager
|
|
1871
|
+
|
|
1872
|
+
|
|
1873
|
+
def play(
|
|
1874
|
+
self,
|
|
1875
|
+
body: models.PlayRoutineRequest,
|
|
1876
|
+
routine_id: str,
|
|
1877
|
+
) -> Response[
|
|
1878
|
+
None,
|
|
1879
|
+
None
|
|
1880
|
+
]:
|
|
1881
|
+
"""
|
|
1882
|
+
Play a routine
|
|
1883
|
+
"""
|
|
1884
|
+
path = "/api/v1/routine-editor/routines/{routine_id}/play"
|
|
1885
|
+
path = path.replace("{routine_id}", str(routine_id))
|
|
1886
|
+
try:
|
|
1887
|
+
response = self._request_manager.request(
|
|
1888
|
+
"POST",
|
|
1889
|
+
path,
|
|
1890
|
+
headers=self._request_manager.json_headers(),
|
|
1891
|
+
body=json.dumps(models.serialize_play_routine_request(body)),
|
|
1892
|
+
)
|
|
1893
|
+
parsed = None
|
|
1894
|
+
|
|
1895
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1896
|
+
is_unavailable = response.status == 503
|
|
1897
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1898
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1899
|
+
|
|
1900
|
+
return Response(
|
|
1901
|
+
parsed,
|
|
1902
|
+
response.status,
|
|
1903
|
+
response
|
|
1904
|
+
)
|
|
1905
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1906
|
+
return Response(
|
|
1907
|
+
models.ErrorResponse(
|
|
1908
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1909
|
+
message="Connection Refused"
|
|
1910
|
+
),
|
|
1911
|
+
503,
|
|
1912
|
+
None
|
|
1913
|
+
)
|
|
1914
|
+
def pause(
|
|
1915
|
+
self,
|
|
1916
|
+
routine_id: str,
|
|
1917
|
+
) -> Response[
|
|
1918
|
+
None,
|
|
1919
|
+
None
|
|
1920
|
+
]:
|
|
1921
|
+
"""
|
|
1922
|
+
Pause a routine
|
|
1923
|
+
"""
|
|
1924
|
+
path = "/api/v1/routine-editor/routines/{routine_id}/pause"
|
|
1925
|
+
path = path.replace("{routine_id}", str(routine_id))
|
|
1926
|
+
try:
|
|
1927
|
+
response = self._request_manager.request(
|
|
1928
|
+
"POST",
|
|
1929
|
+
path,
|
|
1930
|
+
headers=self._request_manager.json_headers(),
|
|
1931
|
+
)
|
|
1932
|
+
parsed = None
|
|
1933
|
+
|
|
1934
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1935
|
+
is_unavailable = response.status == 503
|
|
1936
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1937
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1938
|
+
|
|
1939
|
+
return Response(
|
|
1940
|
+
parsed,
|
|
1941
|
+
response.status,
|
|
1942
|
+
response
|
|
1943
|
+
)
|
|
1944
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1945
|
+
return Response(
|
|
1946
|
+
models.ErrorResponse(
|
|
1947
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1948
|
+
message="Connection Refused"
|
|
1949
|
+
),
|
|
1950
|
+
503,
|
|
1951
|
+
None
|
|
1952
|
+
)
|
|
1953
|
+
def stop(
|
|
1954
|
+
self,
|
|
1955
|
+
) -> Response[
|
|
1956
|
+
None,
|
|
1957
|
+
None
|
|
1958
|
+
]:
|
|
1959
|
+
"""
|
|
1960
|
+
Stop running routine and all ongoing motions
|
|
1961
|
+
"""
|
|
1962
|
+
path = "/api/v1/routine-editor/stop"
|
|
1963
|
+
try:
|
|
1964
|
+
response = self._request_manager.request(
|
|
1965
|
+
"POST",
|
|
1966
|
+
path,
|
|
1967
|
+
headers=self._request_manager.json_headers(),
|
|
1968
|
+
)
|
|
1969
|
+
parsed = None
|
|
1970
|
+
|
|
1971
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
1972
|
+
is_unavailable = response.status == 503
|
|
1973
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1974
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1975
|
+
|
|
1976
|
+
return Response(
|
|
1977
|
+
parsed,
|
|
1978
|
+
response.status,
|
|
1979
|
+
response
|
|
1980
|
+
)
|
|
1981
|
+
except urllib3.exceptions.MaxRetryError:
|
|
1982
|
+
return Response(
|
|
1983
|
+
models.ErrorResponse(
|
|
1984
|
+
error=models.ErrorEnum.InternalServerError,
|
|
1985
|
+
message="Connection Refused"
|
|
1986
|
+
),
|
|
1987
|
+
503,
|
|
1988
|
+
None
|
|
1989
|
+
)
|
|
1990
|
+
def list(
|
|
1991
|
+
self,
|
|
1992
|
+
limit: int,
|
|
1993
|
+
offset: int,
|
|
1994
|
+
) -> Response[
|
|
1995
|
+
Union[
|
|
1996
|
+
models.RoutinesPaginatedResponse,
|
|
1997
|
+
models.ErrorResponse,
|
|
1998
|
+
None
|
|
1999
|
+
],
|
|
2000
|
+
models.RoutinesPaginatedResponse
|
|
2001
|
+
]:
|
|
2002
|
+
"""
|
|
2003
|
+
List routines defined in Routine Editor UI
|
|
2004
|
+
"""
|
|
2005
|
+
path = "/api/v1/routine-editor/routines"
|
|
2006
|
+
try:
|
|
2007
|
+
response = self._request_manager.request(
|
|
2008
|
+
"GET",
|
|
2009
|
+
path,
|
|
2010
|
+
headers=self._request_manager.json_headers(),
|
|
2011
|
+
fields={
|
|
2012
|
+
"limit": models.serialize_i_64(limit),
|
|
2013
|
+
"offset": models.serialize_i_64(offset),
|
|
2014
|
+
}
|
|
2015
|
+
)
|
|
2016
|
+
parsed = None
|
|
2017
|
+
if response.status == 200:
|
|
2018
|
+
parsed = models.parse_routines_paginated_response(json.loads(response.data))
|
|
2019
|
+
|
|
2020
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2021
|
+
is_unavailable = response.status == 503
|
|
2022
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2023
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2024
|
+
|
|
2025
|
+
return Response(
|
|
2026
|
+
parsed,
|
|
2027
|
+
response.status,
|
|
2028
|
+
response
|
|
2029
|
+
)
|
|
2030
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2031
|
+
return Response(
|
|
2032
|
+
models.ErrorResponse(
|
|
2033
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2034
|
+
message="Connection Refused"
|
|
2035
|
+
),
|
|
2036
|
+
503,
|
|
2037
|
+
None
|
|
2038
|
+
)
|
|
2039
|
+
def load(
|
|
2040
|
+
self,
|
|
2041
|
+
routine_id: str,
|
|
2042
|
+
) -> Response[
|
|
2043
|
+
Union[
|
|
2044
|
+
models.Routine,
|
|
2045
|
+
models.ErrorResponse,
|
|
2046
|
+
None
|
|
2047
|
+
],
|
|
2048
|
+
models.Routine
|
|
2049
|
+
]:
|
|
2050
|
+
"""
|
|
2051
|
+
Get routine data by ID
|
|
2052
|
+
"""
|
|
2053
|
+
path = "/api/v1/routine-editor/routines/{routine_id}"
|
|
2054
|
+
path = path.replace("{routine_id}", str(routine_id))
|
|
2055
|
+
try:
|
|
2056
|
+
response = self._request_manager.request(
|
|
2057
|
+
"GET",
|
|
2058
|
+
path,
|
|
2059
|
+
headers=self._request_manager.json_headers(),
|
|
2060
|
+
)
|
|
2061
|
+
parsed = None
|
|
2062
|
+
if response.status == 200:
|
|
2063
|
+
parsed = models.parse_routine(json.loads(response.data))
|
|
2064
|
+
|
|
2065
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2066
|
+
is_unavailable = response.status == 503
|
|
2067
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2068
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2069
|
+
|
|
2070
|
+
return Response(
|
|
2071
|
+
parsed,
|
|
2072
|
+
response.status,
|
|
2073
|
+
response
|
|
2074
|
+
)
|
|
2075
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2076
|
+
return Response(
|
|
2077
|
+
models.ErrorResponse(
|
|
2078
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2079
|
+
message="Connection Refused"
|
|
2080
|
+
),
|
|
2081
|
+
503,
|
|
2082
|
+
None
|
|
2083
|
+
)
|
|
2084
|
+
def list_spaces(
|
|
2085
|
+
self,
|
|
2086
|
+
routine_id: str,
|
|
2087
|
+
exclude_global_spaces: bool,
|
|
2088
|
+
) -> Response[
|
|
2089
|
+
Union[
|
|
2090
|
+
models.SpacesPaginatedResponse,
|
|
2091
|
+
models.ErrorResponse,
|
|
2092
|
+
None
|
|
2093
|
+
],
|
|
2094
|
+
models.SpacesPaginatedResponse
|
|
2095
|
+
]:
|
|
2096
|
+
"""
|
|
2097
|
+
List spaces from routine
|
|
2098
|
+
"""
|
|
2099
|
+
path = "/api/v1/routine-editor/routines/{routine_id}/spaces"
|
|
2100
|
+
path = path.replace("{routine_id}", str(routine_id))
|
|
2101
|
+
try:
|
|
2102
|
+
response = self._request_manager.request(
|
|
2103
|
+
"GET",
|
|
2104
|
+
path,
|
|
2105
|
+
headers=self._request_manager.json_headers(),
|
|
2106
|
+
fields={
|
|
2107
|
+
"exclude_global_spaces": models.serialize_bool(exclude_global_spaces),
|
|
2108
|
+
}
|
|
2109
|
+
)
|
|
2110
|
+
parsed = None
|
|
2111
|
+
if response.status == 200:
|
|
2112
|
+
parsed = models.parse_spaces_paginated_response(json.loads(response.data))
|
|
2113
|
+
|
|
2114
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2115
|
+
is_unavailable = response.status == 503
|
|
2116
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2117
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2118
|
+
|
|
2119
|
+
return Response(
|
|
2120
|
+
parsed,
|
|
2121
|
+
response.status,
|
|
2122
|
+
response
|
|
2123
|
+
)
|
|
2124
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2125
|
+
return Response(
|
|
2126
|
+
models.ErrorResponse(
|
|
2127
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2128
|
+
message="Connection Refused"
|
|
2129
|
+
),
|
|
2130
|
+
503,
|
|
2131
|
+
None
|
|
2132
|
+
)
|
|
2133
|
+
def get_step_variables(
|
|
2134
|
+
self,
|
|
2135
|
+
routine_id: str,
|
|
2136
|
+
step_id_map: bool,
|
|
2137
|
+
) -> Response[
|
|
2138
|
+
Union[
|
|
2139
|
+
models.RoutineStepVariablesResponse,
|
|
2140
|
+
models.ErrorResponse,
|
|
2141
|
+
None
|
|
2142
|
+
],
|
|
2143
|
+
models.RoutineStepVariablesResponse
|
|
2144
|
+
]:
|
|
2145
|
+
"""
|
|
2146
|
+
Get all step variables from a running routine.
|
|
2147
|
+
"""
|
|
2148
|
+
path = "/api/v1/routine-editor/routines/{routine_id}/step-variables"
|
|
2149
|
+
path = path.replace("{routine_id}", str(routine_id))
|
|
2150
|
+
try:
|
|
2151
|
+
response = self._request_manager.request(
|
|
2152
|
+
"GET",
|
|
2153
|
+
path,
|
|
2154
|
+
headers=self._request_manager.json_headers(),
|
|
2155
|
+
fields={
|
|
2156
|
+
"step_id_map": models.serialize_bool(step_id_map),
|
|
2157
|
+
}
|
|
2158
|
+
)
|
|
2159
|
+
parsed = None
|
|
2160
|
+
if response.status == 200:
|
|
2161
|
+
parsed = models.parse_routine_step_variables_response(json.loads(response.data))
|
|
2162
|
+
|
|
2163
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2164
|
+
is_unavailable = response.status == 503
|
|
2165
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2166
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2167
|
+
|
|
2168
|
+
return Response(
|
|
2169
|
+
parsed,
|
|
2170
|
+
response.status,
|
|
2171
|
+
response
|
|
2172
|
+
)
|
|
2173
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2174
|
+
return Response(
|
|
2175
|
+
models.ErrorResponse(
|
|
2176
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2177
|
+
message="Connection Refused"
|
|
2178
|
+
),
|
|
2179
|
+
503,
|
|
2180
|
+
None
|
|
2181
|
+
)
|
|
2182
|
+
def get_state(
|
|
2183
|
+
self,
|
|
2184
|
+
routine_id: str,
|
|
2185
|
+
) -> Response[
|
|
2186
|
+
Union[
|
|
2187
|
+
models.RoutineStateResponse,
|
|
2188
|
+
models.ErrorResponse,
|
|
2189
|
+
None
|
|
2190
|
+
],
|
|
2191
|
+
models.RoutineStateResponse
|
|
2192
|
+
]:
|
|
2193
|
+
"""
|
|
2194
|
+
Get the state from a running routine.
|
|
2195
|
+
"""
|
|
2196
|
+
path = "/api/v1/routine-editor/routines/{routine_id}/state"
|
|
2197
|
+
path = path.replace("{routine_id}", str(routine_id))
|
|
2198
|
+
try:
|
|
2199
|
+
response = self._request_manager.request(
|
|
2200
|
+
"GET",
|
|
2201
|
+
path,
|
|
2202
|
+
headers=self._request_manager.json_headers(),
|
|
2203
|
+
)
|
|
2204
|
+
parsed = None
|
|
2205
|
+
if response.status == 200:
|
|
2206
|
+
parsed = models.parse_routine_state_response(json.loads(response.data))
|
|
2207
|
+
|
|
2208
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2209
|
+
is_unavailable = response.status == 503
|
|
2210
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2211
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2212
|
+
|
|
2213
|
+
return Response(
|
|
2214
|
+
parsed,
|
|
2215
|
+
response.status,
|
|
2216
|
+
response
|
|
2217
|
+
)
|
|
2218
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2219
|
+
return Response(
|
|
2220
|
+
models.ErrorResponse(
|
|
2221
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2222
|
+
message="Connection Refused"
|
|
2223
|
+
),
|
|
2224
|
+
503,
|
|
2225
|
+
None
|
|
2226
|
+
)
|
|
2227
|
+
class Variables:
|
|
2228
|
+
def __init__(self, request_manager: RequestManager):
|
|
2229
|
+
self._request_manager = request_manager
|
|
2230
|
+
|
|
2231
|
+
|
|
2232
|
+
def load(
|
|
2233
|
+
self,
|
|
2234
|
+
variable_name: str,
|
|
2235
|
+
) -> Response[
|
|
2236
|
+
Union[
|
|
2237
|
+
models.RuntimeVariable,
|
|
2238
|
+
models.ErrorResponse,
|
|
2239
|
+
None
|
|
2240
|
+
],
|
|
2241
|
+
models.RuntimeVariable
|
|
2242
|
+
]:
|
|
2243
|
+
"""
|
|
2244
|
+
Returns current state of a variable
|
|
2245
|
+
"""
|
|
2246
|
+
path = "/api/v1/routine-editor/variables/{variable_name}"
|
|
2247
|
+
path = path.replace("{variable_name}", str(variable_name))
|
|
2248
|
+
try:
|
|
2249
|
+
response = self._request_manager.request(
|
|
2250
|
+
"GET",
|
|
2251
|
+
path,
|
|
2252
|
+
headers=self._request_manager.json_headers(),
|
|
2253
|
+
)
|
|
2254
|
+
parsed = None
|
|
2255
|
+
if response.status == 200:
|
|
2256
|
+
parsed = models.parse_runtime_variable(json.loads(response.data))
|
|
2257
|
+
|
|
2258
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2259
|
+
is_unavailable = response.status == 503
|
|
2260
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2261
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2262
|
+
|
|
2263
|
+
return Response(
|
|
2264
|
+
parsed,
|
|
2265
|
+
response.status,
|
|
2266
|
+
response
|
|
2267
|
+
)
|
|
2268
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2269
|
+
return Response(
|
|
2270
|
+
models.ErrorResponse(
|
|
2271
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2272
|
+
message="Connection Refused"
|
|
2273
|
+
),
|
|
2274
|
+
503,
|
|
2275
|
+
None
|
|
2276
|
+
)
|
|
2277
|
+
def update(
|
|
2278
|
+
self,
|
|
2279
|
+
body: models.RuntimeVariable,
|
|
2280
|
+
variable_name: str,
|
|
2281
|
+
) -> Response[
|
|
2282
|
+
Union[
|
|
2283
|
+
models.RuntimeVariable,
|
|
2284
|
+
models.ErrorResponse,
|
|
2285
|
+
None
|
|
2286
|
+
],
|
|
2287
|
+
models.RuntimeVariable
|
|
2288
|
+
]:
|
|
2289
|
+
"""
|
|
2290
|
+
Update the value of a variable
|
|
2291
|
+
"""
|
|
2292
|
+
path = "/api/v1/routine-editor/variables/{variable_name}"
|
|
2293
|
+
path = path.replace("{variable_name}", str(variable_name))
|
|
2294
|
+
try:
|
|
2295
|
+
response = self._request_manager.request(
|
|
2296
|
+
"POST",
|
|
2297
|
+
path,
|
|
2298
|
+
headers=self._request_manager.json_headers(),
|
|
2299
|
+
body=json.dumps(models.serialize_runtime_variable(body)),
|
|
2300
|
+
)
|
|
2301
|
+
parsed = None
|
|
2302
|
+
if response.status == 200:
|
|
2303
|
+
parsed = models.parse_runtime_variable(json.loads(response.data))
|
|
2304
|
+
|
|
2305
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2306
|
+
is_unavailable = response.status == 503
|
|
2307
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2308
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2309
|
+
|
|
2310
|
+
return Response(
|
|
2311
|
+
parsed,
|
|
2312
|
+
response.status,
|
|
2313
|
+
response
|
|
2314
|
+
)
|
|
2315
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2316
|
+
return Response(
|
|
2317
|
+
models.ErrorResponse(
|
|
2318
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2319
|
+
message="Connection Refused"
|
|
2320
|
+
),
|
|
2321
|
+
503,
|
|
2322
|
+
None
|
|
2323
|
+
)
|
|
2324
|
+
|
|
2325
|
+
routines: Routines
|
|
2326
|
+
variables: Variables
|
|
2327
|
+
|
|
1351
2328
|
def __init__(self, request_manager: RequestManager):
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
def load(
|
|
1356
|
-
self,
|
|
1357
|
-
variable_name: str,
|
|
1358
|
-
) -> Response[
|
|
1359
|
-
Union[
|
|
1360
|
-
models.RuntimeVariable,
|
|
1361
|
-
models.ErrorResponse,
|
|
1362
|
-
None
|
|
1363
|
-
],
|
|
1364
|
-
models.RuntimeVariable
|
|
1365
|
-
]:
|
|
1366
|
-
"""
|
|
1367
|
-
Returns current state of a variable
|
|
1368
|
-
"""
|
|
1369
|
-
path = "/api/v1/routine-editor/variables/{variable_name}"
|
|
1370
|
-
path = path.replace("{variable_name}", str(variable_name))
|
|
1371
|
-
response = self._request_manager.request(
|
|
1372
|
-
"GET",
|
|
1373
|
-
path,
|
|
1374
|
-
headers=self._request_manager.json_headers(),
|
|
1375
|
-
)
|
|
1376
|
-
parsed = None
|
|
1377
|
-
if response.status == 200:
|
|
1378
|
-
parsed = models.parse_runtime_variable(json.loads(response.data))
|
|
1379
|
-
|
|
1380
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
1381
|
-
is_unavailable = response.status == 503
|
|
1382
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
1383
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
1384
|
-
|
|
1385
|
-
return Response(
|
|
1386
|
-
parsed,
|
|
1387
|
-
response.status,
|
|
1388
|
-
response
|
|
1389
|
-
)
|
|
1390
|
-
|
|
1391
|
-
def update(
|
|
1392
|
-
self,
|
|
1393
|
-
body: models.RuntimeVariable,
|
|
1394
|
-
variable_name: str,
|
|
1395
|
-
) -> Response[
|
|
1396
|
-
Union[
|
|
1397
|
-
models.RuntimeVariable,
|
|
1398
|
-
models.ErrorResponse,
|
|
1399
|
-
None
|
|
1400
|
-
],
|
|
1401
|
-
models.RuntimeVariable
|
|
1402
|
-
]:
|
|
1403
|
-
"""
|
|
1404
|
-
Update the value of a variable
|
|
1405
|
-
"""
|
|
1406
|
-
path = "/api/v1/routine-editor/variables/{variable_name}"
|
|
1407
|
-
path = path.replace("{variable_name}", str(variable_name))
|
|
1408
|
-
response = self._request_manager.request(
|
|
1409
|
-
"POST",
|
|
1410
|
-
path,
|
|
1411
|
-
headers=self._request_manager.json_headers(),
|
|
1412
|
-
body=json.dumps(models.serialize_runtime_variable(body)),
|
|
1413
|
-
)
|
|
1414
|
-
parsed = None
|
|
1415
|
-
if response.status == 200:
|
|
1416
|
-
parsed = models.parse_runtime_variable(json.loads(response.data))
|
|
1417
|
-
|
|
1418
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
1419
|
-
is_unavailable = response.status == 503
|
|
1420
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
1421
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
1422
|
-
|
|
1423
|
-
return Response(
|
|
1424
|
-
parsed,
|
|
1425
|
-
response.status,
|
|
1426
|
-
response
|
|
1427
|
-
)
|
|
1428
|
-
|
|
1429
|
-
routines: Routines
|
|
1430
|
-
variables: Variables
|
|
1431
|
-
|
|
1432
|
-
def __init__(self, request_manager: RequestManager):
|
|
1433
|
-
self._request_manager = request_manager
|
|
1434
|
-
self.routines = RoutineEditor.Routines(request_manager)
|
|
1435
|
-
self.variables = RoutineEditor.Variables(request_manager)
|
|
2329
|
+
self._request_manager = request_manager
|
|
2330
|
+
self.routines = RoutineEditor.Routines(request_manager)
|
|
2331
|
+
self.variables = RoutineEditor.Variables(request_manager)
|
|
1436
2332
|
|
|
1437
2333
|
class Status:
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
2334
|
+
_request_manager: RequestManager
|
|
2335
|
+
class Control:
|
|
2336
|
+
def __init__(self, request_manager: RequestManager):
|
|
2337
|
+
self._request_manager = request_manager
|
|
2338
|
+
|
|
2339
|
+
|
|
2340
|
+
def set_configuration_control_state(
|
|
2341
|
+
self,
|
|
2342
|
+
body: models.RobotControlMode,
|
|
2343
|
+
) -> Response[
|
|
2344
|
+
Union[
|
|
2345
|
+
models.RobotControlMode,
|
|
2346
|
+
models.ErrorResponse,
|
|
2347
|
+
None
|
|
2348
|
+
],
|
|
2349
|
+
models.RobotControlMode
|
|
2350
|
+
]:
|
|
2351
|
+
"""
|
|
2352
|
+
Set the system which is controlling the robot
|
|
2353
|
+
"""
|
|
2354
|
+
path = "/api/v1/status/control-mode"
|
|
2355
|
+
try:
|
|
2356
|
+
response = self._request_manager.request(
|
|
2357
|
+
"POST",
|
|
2358
|
+
path,
|
|
2359
|
+
headers=self._request_manager.json_headers(),
|
|
2360
|
+
body=json.dumps(models.serialize_robot_control_mode(body)),
|
|
2361
|
+
)
|
|
2362
|
+
parsed = None
|
|
2363
|
+
if response.status == 200:
|
|
2364
|
+
parsed = models.parse_robot_control_mode(json.loads(response.data))
|
|
2365
|
+
|
|
2366
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2367
|
+
is_unavailable = response.status == 503
|
|
2368
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2369
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2370
|
+
|
|
2371
|
+
return Response(
|
|
2372
|
+
parsed,
|
|
2373
|
+
response.status,
|
|
2374
|
+
response
|
|
2375
|
+
)
|
|
2376
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2377
|
+
return Response(
|
|
2378
|
+
models.ErrorResponse(
|
|
2379
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2380
|
+
message="Connection Refused"
|
|
2381
|
+
),
|
|
2382
|
+
503,
|
|
2383
|
+
None
|
|
2384
|
+
)
|
|
2385
|
+
def get_configuration_state_control(
|
|
2386
|
+
self,
|
|
2387
|
+
) -> Response[
|
|
2388
|
+
Union[
|
|
2389
|
+
models.RobotControlMode,
|
|
2390
|
+
models.ErrorResponse,
|
|
2391
|
+
None
|
|
2392
|
+
],
|
|
2393
|
+
models.RobotControlMode
|
|
2394
|
+
]:
|
|
2395
|
+
"""
|
|
2396
|
+
Get the system which is controlling the robot
|
|
2397
|
+
"""
|
|
2398
|
+
path = "/api/v1/status/control-mode"
|
|
2399
|
+
try:
|
|
2400
|
+
response = self._request_manager.request(
|
|
2401
|
+
"GET",
|
|
2402
|
+
path,
|
|
2403
|
+
headers=self._request_manager.json_headers(),
|
|
2404
|
+
)
|
|
2405
|
+
parsed = None
|
|
2406
|
+
if response.status == 200:
|
|
2407
|
+
parsed = models.parse_robot_control_mode(json.loads(response.data))
|
|
2408
|
+
|
|
2409
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2410
|
+
is_unavailable = response.status == 503
|
|
2411
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2412
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2413
|
+
|
|
2414
|
+
return Response(
|
|
2415
|
+
parsed,
|
|
2416
|
+
response.status,
|
|
2417
|
+
response
|
|
2418
|
+
)
|
|
2419
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2420
|
+
return Response(
|
|
2421
|
+
models.ErrorResponse(
|
|
2422
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2423
|
+
message="Connection Refused"
|
|
2424
|
+
),
|
|
2425
|
+
503,
|
|
2426
|
+
None
|
|
2427
|
+
)
|
|
2428
|
+
class Health:
|
|
2429
|
+
def __init__(self, request_manager: RequestManager):
|
|
2430
|
+
self._request_manager = request_manager
|
|
2431
|
+
|
|
2432
|
+
|
|
2433
|
+
def get_health(
|
|
2434
|
+
self,
|
|
2435
|
+
) -> Response[
|
|
2436
|
+
Union[
|
|
2437
|
+
models.StatusHealthResponse,
|
|
2438
|
+
models.ErrorResponse,
|
|
2439
|
+
None
|
|
2440
|
+
],
|
|
2441
|
+
models.StatusHealthResponse
|
|
2442
|
+
]:
|
|
2443
|
+
"""
|
|
2444
|
+
Get the current health of the robot
|
|
2445
|
+
"""
|
|
2446
|
+
path = "/api/v1/status/health"
|
|
2447
|
+
try:
|
|
2448
|
+
response = self._request_manager.request(
|
|
2449
|
+
"GET",
|
|
2450
|
+
path,
|
|
2451
|
+
headers=self._request_manager.json_headers(),
|
|
2452
|
+
)
|
|
2453
|
+
parsed = None
|
|
2454
|
+
if response.status == 200:
|
|
2455
|
+
parsed = models.parse_status_health_response(json.loads(response.data))
|
|
2456
|
+
|
|
2457
|
+
is_user_error = response.status >= 400 and response.status <= 500
|
|
2458
|
+
is_unavailable = response.status == 503
|
|
2459
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
2460
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
2461
|
+
|
|
2462
|
+
return Response(
|
|
2463
|
+
parsed,
|
|
2464
|
+
response.status,
|
|
2465
|
+
response
|
|
2466
|
+
)
|
|
2467
|
+
except urllib3.exceptions.MaxRetryError:
|
|
2468
|
+
return Response(
|
|
2469
|
+
models.ErrorResponse(
|
|
2470
|
+
error=models.ErrorEnum.InternalServerError,
|
|
2471
|
+
message="Connection Refused"
|
|
2472
|
+
),
|
|
2473
|
+
503,
|
|
2474
|
+
None
|
|
2475
|
+
)
|
|
2476
|
+
|
|
2477
|
+
control: Control
|
|
2478
|
+
health: Health
|
|
2479
|
+
|
|
1515
2480
|
def __init__(self, request_manager: RequestManager):
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
def get_health(
|
|
1520
|
-
self,
|
|
1521
|
-
) -> Response[
|
|
1522
|
-
Union[
|
|
1523
|
-
models.StatusHealthResponse,
|
|
1524
|
-
models.ErrorResponse,
|
|
1525
|
-
None
|
|
1526
|
-
],
|
|
1527
|
-
models.StatusHealthResponse
|
|
1528
|
-
]:
|
|
1529
|
-
"""
|
|
1530
|
-
Get the current health of the robot
|
|
1531
|
-
"""
|
|
1532
|
-
path = "/api/v1/status/health"
|
|
1533
|
-
response = self._request_manager.request(
|
|
1534
|
-
"GET",
|
|
1535
|
-
path,
|
|
1536
|
-
headers=self._request_manager.json_headers(),
|
|
1537
|
-
)
|
|
1538
|
-
parsed = None
|
|
1539
|
-
if response.status == 200:
|
|
1540
|
-
parsed = models.parse_status_health_response(json.loads(response.data))
|
|
1541
|
-
|
|
1542
|
-
is_user_error = response.status >= 400 and response.status < 500
|
|
1543
|
-
is_unavailable = response.status == 503
|
|
1544
|
-
if parsed is None and (is_user_error or is_unavailable):
|
|
1545
|
-
parsed = models.parse_error_response(json.loads(response.data))
|
|
1546
|
-
|
|
1547
|
-
return Response(
|
|
1548
|
-
parsed,
|
|
1549
|
-
response.status,
|
|
1550
|
-
response
|
|
1551
|
-
)
|
|
1552
|
-
|
|
1553
|
-
control: Control
|
|
1554
|
-
health: Health
|
|
1555
|
-
|
|
1556
|
-
def __init__(self, request_manager: RequestManager):
|
|
1557
|
-
self._request_manager = request_manager
|
|
1558
|
-
self.control = Status.Control(request_manager)
|
|
1559
|
-
self.health = Status.Health(request_manager)
|
|
2481
|
+
self._request_manager = request_manager
|
|
2482
|
+
self.control = Status.Control(request_manager)
|
|
2483
|
+
self.health = Status.Health(request_manager)
|
|
1560
2484
|
|
|
1561
2485
|
|
|
1562
2486
|
|
|
1563
2487
|
|
|
1564
2488
|
class StandardBotsRobot(Default):
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
self
|
|
1605
|
-
|
|
2489
|
+
RobotKind = RobotKind
|
|
2490
|
+
|
|
2491
|
+
movement: Movement
|
|
2492
|
+
camera: Camera
|
|
2493
|
+
faults: Faults
|
|
2494
|
+
chat_gpt: ChatGPT
|
|
2495
|
+
io: IO
|
|
2496
|
+
general: General
|
|
2497
|
+
poses: Poses
|
|
2498
|
+
recovery: Recovery
|
|
2499
|
+
ros: ROS
|
|
2500
|
+
routine_editor: RoutineEditor
|
|
2501
|
+
status: Status
|
|
2502
|
+
def __init__(
|
|
2503
|
+
self,
|
|
2504
|
+
url: str,
|
|
2505
|
+
token: str,
|
|
2506
|
+
robot_kind: Union[RobotKind, str] = RobotKind.Live,
|
|
2507
|
+
pools: int = 10
|
|
2508
|
+
):
|
|
2509
|
+
super().__init__(RequestManager(
|
|
2510
|
+
urllib3.PoolManager(num_pools=2),
|
|
2511
|
+
token=token,
|
|
2512
|
+
host=url,
|
|
2513
|
+
robot_kind=RobotKind(robot_kind),
|
|
2514
|
+
))
|
|
2515
|
+
self.movement = Movement(self._request_manager)
|
|
2516
|
+
self.camera = Camera(self._request_manager)
|
|
2517
|
+
self.faults = Faults(self._request_manager)
|
|
2518
|
+
self.chat_gpt = ChatGPT(self._request_manager)
|
|
2519
|
+
self.io = IO(self._request_manager)
|
|
2520
|
+
self.general = General(self._request_manager)
|
|
2521
|
+
self.poses = Poses(self._request_manager)
|
|
2522
|
+
self.recovery = Recovery(self._request_manager)
|
|
2523
|
+
self.ros = ROS(self._request_manager)
|
|
2524
|
+
self.routine_editor = RoutineEditor(self._request_manager)
|
|
2525
|
+
self.status = Status(self._request_manager)
|
|
2526
|
+
|
|
2527
|
+
@contextmanager
|
|
2528
|
+
def connection(self):
|
|
2529
|
+
yield
|
|
2530
|
+
self._request_manager.close()
|