standardbots 2.20240401.11__tar.gz → 2.20240614.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of standardbots might be problematic. Click here for more details.
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/PKG-INFO +1 -1
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/setup.py +1 -1
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots/auto_generated/apis.py +332 -4
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots/auto_generated/models.py +579 -3
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots.egg-info/PKG-INFO +1 -1
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/setup.cfg +0 -0
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots/__init__.py +0 -0
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots/auto_generated/__init__.py +0 -0
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots.egg-info/SOURCES.txt +0 -0
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots.egg-info/dependency_links.txt +0 -0
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots.egg-info/requires.txt +0 -0
- {standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots.egg-info/top_level.txt +0 -0
{standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots/auto_generated/apis.py
RENAMED
|
@@ -138,6 +138,48 @@ class Default:
|
|
|
138
138
|
),
|
|
139
139
|
),
|
|
140
140
|
)
|
|
141
|
+
def dh_pgc_grip(
|
|
142
|
+
self,
|
|
143
|
+
target_diameter: float,
|
|
144
|
+
target_force: float | None,
|
|
145
|
+
target_speed: float | None,
|
|
146
|
+
):
|
|
147
|
+
"""
|
|
148
|
+
Control the DH PGC gripper.
|
|
149
|
+
Args:
|
|
150
|
+
- target_diameter: 0.0 - 1.0
|
|
151
|
+
- target_force: 0.2 - 1.0
|
|
152
|
+
- target_speed: 0.01 - 1.0
|
|
153
|
+
"""
|
|
154
|
+
return self.control_gripper(
|
|
155
|
+
body=models.GripperCommandRequest(
|
|
156
|
+
kind=models.GripperKindEnum.DhPgc,
|
|
157
|
+
dh_pgc=models.DHPGCGripperCommandRequest(
|
|
158
|
+
target_diameter, target_force, target_speed
|
|
159
|
+
),
|
|
160
|
+
),
|
|
161
|
+
)
|
|
162
|
+
def dh_cgi_grip(
|
|
163
|
+
self,
|
|
164
|
+
target_diameter: float,
|
|
165
|
+
target_force: float | None,
|
|
166
|
+
target_speed: float | None,
|
|
167
|
+
):
|
|
168
|
+
"""
|
|
169
|
+
Control the DH CGI gripper.
|
|
170
|
+
Args:
|
|
171
|
+
- target_diameter: 0.0 - 1.0
|
|
172
|
+
- target_force: 0.2 - 1.0
|
|
173
|
+
- target_speed: 0.01 - 1.0
|
|
174
|
+
"""
|
|
175
|
+
return self.control_gripper(
|
|
176
|
+
body=models.GripperCommandRequest(
|
|
177
|
+
kind=models.GripperKindEnum.DhCgi,
|
|
178
|
+
dh_pgc=models.DHCGIGripperCommandRequest(
|
|
179
|
+
target_diameter, target_force, target_speed
|
|
180
|
+
),
|
|
181
|
+
),
|
|
182
|
+
)
|
|
141
183
|
|
|
142
184
|
|
|
143
185
|
def control_gripper(
|
|
@@ -683,7 +725,7 @@ class Camera:
|
|
|
683
725
|
self.data = Camera.Data(request_manager)
|
|
684
726
|
self.settings = Camera.Settings(request_manager)
|
|
685
727
|
|
|
686
|
-
class
|
|
728
|
+
class ChatGPT:
|
|
687
729
|
_request_manager: RequestManager
|
|
688
730
|
class Data:
|
|
689
731
|
def __init__(self, request_manager: RequestManager):
|
|
@@ -754,7 +796,285 @@ class ChatGpt:
|
|
|
754
796
|
|
|
755
797
|
def __init__(self, request_manager: RequestManager):
|
|
756
798
|
self._request_manager = request_manager
|
|
757
|
-
self.data =
|
|
799
|
+
self.data = ChatGPT.Data(request_manager)
|
|
800
|
+
|
|
801
|
+
class IO:
|
|
802
|
+
_request_manager: RequestManager
|
|
803
|
+
class Control:
|
|
804
|
+
def __init__(self, request_manager: RequestManager):
|
|
805
|
+
self._request_manager = request_manager
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
def update_io_state(
|
|
809
|
+
self,
|
|
810
|
+
body: models.IOStateUpdateRequest,
|
|
811
|
+
) -> Response[
|
|
812
|
+
Union[
|
|
813
|
+
models.IOStateResponse,
|
|
814
|
+
models.ErrorResponse,
|
|
815
|
+
models.ErrorResponse,
|
|
816
|
+
None
|
|
817
|
+
],
|
|
818
|
+
models.IOStateResponse
|
|
819
|
+
]:
|
|
820
|
+
"""
|
|
821
|
+
Updates the state of I/O based on the provided action ('high' or 'low').
|
|
822
|
+
"""
|
|
823
|
+
path = "/api/v1/io"
|
|
824
|
+
response = self._request_manager.request(
|
|
825
|
+
"POST",
|
|
826
|
+
path,
|
|
827
|
+
headers=self._request_manager.json_headers(),
|
|
828
|
+
body=json.dumps(models.serialize_io_state_update_request(body)),
|
|
829
|
+
)
|
|
830
|
+
parsed = None
|
|
831
|
+
if response.status == 200:
|
|
832
|
+
parsed = models.parse_io_state_response(json.loads(response.data))
|
|
833
|
+
if response.status == 400:
|
|
834
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
835
|
+
|
|
836
|
+
is_user_error = response.status >= 400 and response.status < 500
|
|
837
|
+
is_unavailable = response.status == 503
|
|
838
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
839
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
840
|
+
|
|
841
|
+
return Response(
|
|
842
|
+
parsed,
|
|
843
|
+
response.status,
|
|
844
|
+
response
|
|
845
|
+
)
|
|
846
|
+
|
|
847
|
+
class Status:
|
|
848
|
+
def __init__(self, request_manager: RequestManager):
|
|
849
|
+
self._request_manager = request_manager
|
|
850
|
+
|
|
851
|
+
|
|
852
|
+
def get_io_state(
|
|
853
|
+
self,
|
|
854
|
+
) -> Response[
|
|
855
|
+
Union[
|
|
856
|
+
models.IOStateResponse,
|
|
857
|
+
models.ErrorResponse,
|
|
858
|
+
None
|
|
859
|
+
],
|
|
860
|
+
models.IOStateResponse
|
|
861
|
+
]:
|
|
862
|
+
"""
|
|
863
|
+
Retrieves the current state of I/O.
|
|
864
|
+
"""
|
|
865
|
+
path = "/api/v1/io"
|
|
866
|
+
response = self._request_manager.request(
|
|
867
|
+
"GET",
|
|
868
|
+
path,
|
|
869
|
+
headers=self._request_manager.json_headers(),
|
|
870
|
+
)
|
|
871
|
+
parsed = None
|
|
872
|
+
if response.status == 200:
|
|
873
|
+
parsed = models.parse_io_state_response(json.loads(response.data))
|
|
874
|
+
|
|
875
|
+
is_user_error = response.status >= 400 and response.status < 500
|
|
876
|
+
is_unavailable = response.status == 503
|
|
877
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
878
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
879
|
+
|
|
880
|
+
return Response(
|
|
881
|
+
parsed,
|
|
882
|
+
response.status,
|
|
883
|
+
response
|
|
884
|
+
)
|
|
885
|
+
|
|
886
|
+
control: Control
|
|
887
|
+
status: Status
|
|
888
|
+
|
|
889
|
+
def __init__(self, request_manager: RequestManager):
|
|
890
|
+
self._request_manager = request_manager
|
|
891
|
+
self.control = IO.Control(request_manager)
|
|
892
|
+
self.status = IO.Status(request_manager)
|
|
893
|
+
|
|
894
|
+
class General:
|
|
895
|
+
_request_manager: RequestManager
|
|
896
|
+
class Joints:
|
|
897
|
+
def __init__(self, request_manager: RequestManager):
|
|
898
|
+
self._request_manager = request_manager
|
|
899
|
+
|
|
900
|
+
|
|
901
|
+
def get_joints_state(
|
|
902
|
+
self,
|
|
903
|
+
) -> Response[
|
|
904
|
+
Union[
|
|
905
|
+
models.JointsStateResponse,
|
|
906
|
+
models.ErrorResponse,
|
|
907
|
+
None
|
|
908
|
+
],
|
|
909
|
+
models.JointsStateResponse
|
|
910
|
+
]:
|
|
911
|
+
"""
|
|
912
|
+
Retrieves information about the state of each joint
|
|
913
|
+
"""
|
|
914
|
+
path = "/api/v1/joints"
|
|
915
|
+
response = self._request_manager.request(
|
|
916
|
+
"GET",
|
|
917
|
+
path,
|
|
918
|
+
headers=self._request_manager.json_headers(),
|
|
919
|
+
)
|
|
920
|
+
parsed = None
|
|
921
|
+
if response.status == 200:
|
|
922
|
+
parsed = models.parse_joints_state_response(json.loads(response.data))
|
|
923
|
+
|
|
924
|
+
is_user_error = response.status >= 400 and response.status < 500
|
|
925
|
+
is_unavailable = response.status == 503
|
|
926
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
927
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
928
|
+
|
|
929
|
+
return Response(
|
|
930
|
+
parsed,
|
|
931
|
+
response.status,
|
|
932
|
+
response
|
|
933
|
+
)
|
|
934
|
+
|
|
935
|
+
joints: Joints
|
|
936
|
+
|
|
937
|
+
def __init__(self, request_manager: RequestManager):
|
|
938
|
+
self._request_manager = request_manager
|
|
939
|
+
self.joints = General.Joints(request_manager)
|
|
940
|
+
|
|
941
|
+
class Recovery:
|
|
942
|
+
_request_manager: RequestManager
|
|
943
|
+
class Recover:
|
|
944
|
+
def __init__(self, request_manager: RequestManager):
|
|
945
|
+
self._request_manager = request_manager
|
|
946
|
+
|
|
947
|
+
|
|
948
|
+
def recover(
|
|
949
|
+
self,
|
|
950
|
+
) -> Response[
|
|
951
|
+
Union[
|
|
952
|
+
models.ErrorResponse,
|
|
953
|
+
models.ErrorResponse,
|
|
954
|
+
None
|
|
955
|
+
],
|
|
956
|
+
None
|
|
957
|
+
]:
|
|
958
|
+
"""
|
|
959
|
+
Recovers the robot from a fault state.
|
|
960
|
+
|
|
961
|
+
"""
|
|
962
|
+
path = "/api/v1/recovery/recover"
|
|
963
|
+
response = self._request_manager.request(
|
|
964
|
+
"POST",
|
|
965
|
+
path,
|
|
966
|
+
headers=self._request_manager.json_headers(),
|
|
967
|
+
)
|
|
968
|
+
parsed = None
|
|
969
|
+
if response.status == 400:
|
|
970
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
971
|
+
|
|
972
|
+
is_user_error = response.status >= 400 and response.status < 500
|
|
973
|
+
is_unavailable = response.status == 503
|
|
974
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
975
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
976
|
+
|
|
977
|
+
return Response(
|
|
978
|
+
parsed,
|
|
979
|
+
response.status,
|
|
980
|
+
response
|
|
981
|
+
)
|
|
982
|
+
|
|
983
|
+
recover: Recover
|
|
984
|
+
|
|
985
|
+
def __init__(self, request_manager: RequestManager):
|
|
986
|
+
self._request_manager = request_manager
|
|
987
|
+
self.recover = Recovery.Recover(request_manager)
|
|
988
|
+
|
|
989
|
+
class ROS:
|
|
990
|
+
_request_manager: RequestManager
|
|
991
|
+
class Control:
|
|
992
|
+
def __init__(self, request_manager: RequestManager):
|
|
993
|
+
self._request_manager = request_manager
|
|
994
|
+
|
|
995
|
+
|
|
996
|
+
def update_ros_control_state(
|
|
997
|
+
self,
|
|
998
|
+
body: models.ROSControlUpdateRequest,
|
|
999
|
+
) -> Response[
|
|
1000
|
+
Union[
|
|
1001
|
+
models.ROSControlStateResponse,
|
|
1002
|
+
models.ErrorResponse,
|
|
1003
|
+
None
|
|
1004
|
+
],
|
|
1005
|
+
models.ROSControlStateResponse
|
|
1006
|
+
]:
|
|
1007
|
+
"""
|
|
1008
|
+
Updates the state of ROS control based on the provided action ('enable' or 'disable').
|
|
1009
|
+
"""
|
|
1010
|
+
path = "/api/v1/movement/ros/state"
|
|
1011
|
+
response = self._request_manager.request(
|
|
1012
|
+
"POST",
|
|
1013
|
+
path,
|
|
1014
|
+
headers=self._request_manager.json_headers(),
|
|
1015
|
+
body=json.dumps(models.serialize_ros_control_update_request(body)),
|
|
1016
|
+
)
|
|
1017
|
+
parsed = None
|
|
1018
|
+
if response.status == 200:
|
|
1019
|
+
parsed = models.parse_ros_control_state_response(json.loads(response.data))
|
|
1020
|
+
|
|
1021
|
+
is_user_error = response.status >= 400 and response.status < 500
|
|
1022
|
+
is_unavailable = response.status == 503
|
|
1023
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1024
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1025
|
+
|
|
1026
|
+
return Response(
|
|
1027
|
+
parsed,
|
|
1028
|
+
response.status,
|
|
1029
|
+
response
|
|
1030
|
+
)
|
|
1031
|
+
|
|
1032
|
+
class Status:
|
|
1033
|
+
def __init__(self, request_manager: RequestManager):
|
|
1034
|
+
self._request_manager = request_manager
|
|
1035
|
+
|
|
1036
|
+
|
|
1037
|
+
def get_ros_control_state(
|
|
1038
|
+
self,
|
|
1039
|
+
) -> Response[
|
|
1040
|
+
Union[
|
|
1041
|
+
models.ROSControlStateResponse,
|
|
1042
|
+
models.ErrorResponse,
|
|
1043
|
+
None
|
|
1044
|
+
],
|
|
1045
|
+
models.ROSControlStateResponse
|
|
1046
|
+
]:
|
|
1047
|
+
"""
|
|
1048
|
+
Retrieves the current state of ROS control.
|
|
1049
|
+
"""
|
|
1050
|
+
path = "/api/v1/movement/ros/state"
|
|
1051
|
+
response = self._request_manager.request(
|
|
1052
|
+
"GET",
|
|
1053
|
+
path,
|
|
1054
|
+
headers=self._request_manager.json_headers(),
|
|
1055
|
+
)
|
|
1056
|
+
parsed = None
|
|
1057
|
+
if response.status == 200:
|
|
1058
|
+
parsed = models.parse_ros_control_state_response(json.loads(response.data))
|
|
1059
|
+
|
|
1060
|
+
is_user_error = response.status >= 400 and response.status < 500
|
|
1061
|
+
is_unavailable = response.status == 503
|
|
1062
|
+
if parsed is None and (is_user_error or is_unavailable):
|
|
1063
|
+
parsed = models.parse_error_response(json.loads(response.data))
|
|
1064
|
+
|
|
1065
|
+
return Response(
|
|
1066
|
+
parsed,
|
|
1067
|
+
response.status,
|
|
1068
|
+
response
|
|
1069
|
+
)
|
|
1070
|
+
|
|
1071
|
+
control: Control
|
|
1072
|
+
status: Status
|
|
1073
|
+
|
|
1074
|
+
def __init__(self, request_manager: RequestManager):
|
|
1075
|
+
self._request_manager = request_manager
|
|
1076
|
+
self.control = ROS.Control(request_manager)
|
|
1077
|
+
self.status = ROS.Status(request_manager)
|
|
758
1078
|
|
|
759
1079
|
class RoutineEditor:
|
|
760
1080
|
_request_manager: RequestManager
|
|
@@ -1232,7 +1552,11 @@ class StandardBotsRobot(Default):
|
|
|
1232
1552
|
|
|
1233
1553
|
movement: Movement
|
|
1234
1554
|
camera: Camera
|
|
1235
|
-
chat_gpt:
|
|
1555
|
+
chat_gpt: ChatGPT
|
|
1556
|
+
io: IO
|
|
1557
|
+
general: General
|
|
1558
|
+
recovery: Recovery
|
|
1559
|
+
ros: ROS
|
|
1236
1560
|
routine_editor: RoutineEditor
|
|
1237
1561
|
status: Status
|
|
1238
1562
|
teleoperation: Teleoperation
|
|
@@ -1251,7 +1575,11 @@ class StandardBotsRobot(Default):
|
|
|
1251
1575
|
))
|
|
1252
1576
|
self.movement = Movement(self._request_manager)
|
|
1253
1577
|
self.camera = Camera(self._request_manager)
|
|
1254
|
-
self.chat_gpt =
|
|
1578
|
+
self.chat_gpt = ChatGPT(self._request_manager)
|
|
1579
|
+
self.io = IO(self._request_manager)
|
|
1580
|
+
self.general = General(self._request_manager)
|
|
1581
|
+
self.recovery = Recovery(self._request_manager)
|
|
1582
|
+
self.ros = ROS(self._request_manager)
|
|
1255
1583
|
self.routine_editor = RoutineEditor(self._request_manager)
|
|
1256
1584
|
self.status = Status(self._request_manager)
|
|
1257
1585
|
self.teleoperation = Teleoperation(self._request_manager)
|
{standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots/auto_generated/models.py
RENAMED
|
@@ -476,6 +476,20 @@ def serialize_camera_settings(data: CameraSettings) -> object:
|
|
|
476
476
|
"autoWhiteBalance": None if data.autoWhiteBalance is None else serialize_bool(data.autoWhiteBalance),
|
|
477
477
|
}
|
|
478
478
|
|
|
479
|
+
class ConnectionStatus(Enum):
|
|
480
|
+
Connected = "connected"
|
|
481
|
+
"""Enum Connected = `connected`"""
|
|
482
|
+
Disconnected = "disconnected"
|
|
483
|
+
"""Enum Disconnected = `disconnected`"""
|
|
484
|
+
Ready = "ready"
|
|
485
|
+
"""Enum Ready = `ready`"""
|
|
486
|
+
|
|
487
|
+
def parse_connection_status(data: object) -> ConnectionStatus:
|
|
488
|
+
return ConnectionStatus(data)
|
|
489
|
+
|
|
490
|
+
def serialize_connection_status(data: Union[ConnectionStatus, str]) -> object:
|
|
491
|
+
return ConnectionStatus(data).value
|
|
492
|
+
|
|
479
493
|
@dataclass
|
|
480
494
|
class DHAGGripperCommandRequest:
|
|
481
495
|
"""Control the DH AG gripper (end effector) of the robot
|
|
@@ -567,6 +581,188 @@ def serialize_dhag_gripper_configuration(data: DHAGGripperConfiguration) -> obje
|
|
|
567
581
|
"diameter": serialize_f_64(data.diameter),
|
|
568
582
|
}
|
|
569
583
|
|
|
584
|
+
@dataclass
|
|
585
|
+
class DHCGIGripperCommandRequest:
|
|
586
|
+
"""Control the DH CGI gripper (end effector) of the robot
|
|
587
|
+
"""
|
|
588
|
+
target_diameter: Union[float, None] = None
|
|
589
|
+
target_force: Union[float, None] = None
|
|
590
|
+
target_speed: Union[float, None] = None
|
|
591
|
+
|
|
592
|
+
def validate_target_diameter(self, value: float) -> Tuple[bool, str]:
|
|
593
|
+
if value is None:
|
|
594
|
+
return [False, "target_diameter is required for DHCGIGripperCommandRequest"]
|
|
595
|
+
|
|
596
|
+
if not isinstance(value, float):
|
|
597
|
+
return [False, "target_diameter must be of type float for DHCGIGripperCommandRequest, got " + type(value).__name__]
|
|
598
|
+
|
|
599
|
+
return [True, ""]
|
|
600
|
+
|
|
601
|
+
def validate_target_force(self, value: float) -> Tuple[bool, str]:
|
|
602
|
+
if value is None:
|
|
603
|
+
return [True, ""]
|
|
604
|
+
|
|
605
|
+
if not isinstance(value, float):
|
|
606
|
+
return [False, "target_force must be of type float for DHCGIGripperCommandRequest, got " + type(value).__name__]
|
|
607
|
+
|
|
608
|
+
return [True, ""]
|
|
609
|
+
|
|
610
|
+
def validate_target_speed(self, value: float) -> Tuple[bool, str]:
|
|
611
|
+
if value is None:
|
|
612
|
+
return [True, ""]
|
|
613
|
+
|
|
614
|
+
if not isinstance(value, float):
|
|
615
|
+
return [False, "target_speed must be of type float for DHCGIGripperCommandRequest, got " + type(value).__name__]
|
|
616
|
+
|
|
617
|
+
return [True, ""]
|
|
618
|
+
|
|
619
|
+
def __post_init__(self):
|
|
620
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
621
|
+
is_valid, error_str = self.validate_target_diameter(self.target_diameter)
|
|
622
|
+
if not is_valid:
|
|
623
|
+
raise TypeError(error_str)
|
|
624
|
+
is_valid, error_str = self.validate_target_force(self.target_force)
|
|
625
|
+
if not is_valid:
|
|
626
|
+
raise TypeError(error_str)
|
|
627
|
+
is_valid, error_str = self.validate_target_speed(self.target_speed)
|
|
628
|
+
if not is_valid:
|
|
629
|
+
raise TypeError(error_str)
|
|
630
|
+
|
|
631
|
+
def parse_dhcgi_gripper_command_request(data: object):
|
|
632
|
+
return DHCGIGripperCommandRequest(
|
|
633
|
+
target_diameter=parse_f_64(data["target_diameter"]) if "target_diameter" in data else None,
|
|
634
|
+
target_force=parse_f_64(data["target_force"]) if "target_force" in data else None,
|
|
635
|
+
target_speed=parse_f_64(data["target_speed"]) if "target_speed" in data else None,
|
|
636
|
+
)
|
|
637
|
+
|
|
638
|
+
def serialize_dhcgi_gripper_command_request(data: DHCGIGripperCommandRequest) -> object:
|
|
639
|
+
return {
|
|
640
|
+
"target_diameter": serialize_f_64(data.target_diameter),
|
|
641
|
+
"target_force": None if data.target_force is None else serialize_f_64(data.target_force),
|
|
642
|
+
"target_speed": None if data.target_speed is None else serialize_f_64(data.target_speed),
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
@dataclass
|
|
646
|
+
class DHCGIGripperConfiguration:
|
|
647
|
+
"""Configuration for DH CGI Gripper"""
|
|
648
|
+
diameter: Union[float, None] = None
|
|
649
|
+
|
|
650
|
+
def validate_diameter(self, value: float) -> Tuple[bool, str]:
|
|
651
|
+
if value is None:
|
|
652
|
+
return [False, "diameter is required for DHCGIGripperConfiguration"]
|
|
653
|
+
|
|
654
|
+
if not isinstance(value, float):
|
|
655
|
+
return [False, "diameter must be of type float for DHCGIGripperConfiguration, got " + type(value).__name__]
|
|
656
|
+
|
|
657
|
+
return [True, ""]
|
|
658
|
+
|
|
659
|
+
def __post_init__(self):
|
|
660
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
661
|
+
is_valid, error_str = self.validate_diameter(self.diameter)
|
|
662
|
+
if not is_valid:
|
|
663
|
+
raise TypeError(error_str)
|
|
664
|
+
|
|
665
|
+
def parse_dhcgi_gripper_configuration(data: object):
|
|
666
|
+
return DHCGIGripperConfiguration(
|
|
667
|
+
diameter=parse_f_64(data["diameter"]) if "diameter" in data else None,
|
|
668
|
+
)
|
|
669
|
+
|
|
670
|
+
def serialize_dhcgi_gripper_configuration(data: DHCGIGripperConfiguration) -> object:
|
|
671
|
+
return {
|
|
672
|
+
"diameter": serialize_f_64(data.diameter),
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
@dataclass
|
|
676
|
+
class DHPGCGripperCommandRequest:
|
|
677
|
+
"""Control the DH PGC gripper (end effector) of the robot
|
|
678
|
+
"""
|
|
679
|
+
target_diameter: Union[float, None] = None
|
|
680
|
+
target_force: Union[float, None] = None
|
|
681
|
+
target_speed: Union[float, None] = None
|
|
682
|
+
|
|
683
|
+
def validate_target_diameter(self, value: float) -> Tuple[bool, str]:
|
|
684
|
+
if value is None:
|
|
685
|
+
return [False, "target_diameter is required for DHPGCGripperCommandRequest"]
|
|
686
|
+
|
|
687
|
+
if not isinstance(value, float):
|
|
688
|
+
return [False, "target_diameter must be of type float for DHPGCGripperCommandRequest, got " + type(value).__name__]
|
|
689
|
+
|
|
690
|
+
return [True, ""]
|
|
691
|
+
|
|
692
|
+
def validate_target_force(self, value: float) -> Tuple[bool, str]:
|
|
693
|
+
if value is None:
|
|
694
|
+
return [True, ""]
|
|
695
|
+
|
|
696
|
+
if not isinstance(value, float):
|
|
697
|
+
return [False, "target_force must be of type float for DHPGCGripperCommandRequest, got " + type(value).__name__]
|
|
698
|
+
|
|
699
|
+
return [True, ""]
|
|
700
|
+
|
|
701
|
+
def validate_target_speed(self, value: float) -> Tuple[bool, str]:
|
|
702
|
+
if value is None:
|
|
703
|
+
return [True, ""]
|
|
704
|
+
|
|
705
|
+
if not isinstance(value, float):
|
|
706
|
+
return [False, "target_speed must be of type float for DHPGCGripperCommandRequest, got " + type(value).__name__]
|
|
707
|
+
|
|
708
|
+
return [True, ""]
|
|
709
|
+
|
|
710
|
+
def __post_init__(self):
|
|
711
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
712
|
+
is_valid, error_str = self.validate_target_diameter(self.target_diameter)
|
|
713
|
+
if not is_valid:
|
|
714
|
+
raise TypeError(error_str)
|
|
715
|
+
is_valid, error_str = self.validate_target_force(self.target_force)
|
|
716
|
+
if not is_valid:
|
|
717
|
+
raise TypeError(error_str)
|
|
718
|
+
is_valid, error_str = self.validate_target_speed(self.target_speed)
|
|
719
|
+
if not is_valid:
|
|
720
|
+
raise TypeError(error_str)
|
|
721
|
+
|
|
722
|
+
def parse_dhpgc_gripper_command_request(data: object):
|
|
723
|
+
return DHPGCGripperCommandRequest(
|
|
724
|
+
target_diameter=parse_f_64(data["target_diameter"]) if "target_diameter" in data else None,
|
|
725
|
+
target_force=parse_f_64(data["target_force"]) if "target_force" in data else None,
|
|
726
|
+
target_speed=parse_f_64(data["target_speed"]) if "target_speed" in data else None,
|
|
727
|
+
)
|
|
728
|
+
|
|
729
|
+
def serialize_dhpgc_gripper_command_request(data: DHPGCGripperCommandRequest) -> object:
|
|
730
|
+
return {
|
|
731
|
+
"target_diameter": serialize_f_64(data.target_diameter),
|
|
732
|
+
"target_force": None if data.target_force is None else serialize_f_64(data.target_force),
|
|
733
|
+
"target_speed": None if data.target_speed is None else serialize_f_64(data.target_speed),
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
@dataclass
|
|
737
|
+
class DHPGCGripperConfiguration:
|
|
738
|
+
"""Configuration for DH PGC Gripper"""
|
|
739
|
+
diameter: Union[float, None] = None
|
|
740
|
+
|
|
741
|
+
def validate_diameter(self, value: float) -> Tuple[bool, str]:
|
|
742
|
+
if value is None:
|
|
743
|
+
return [False, "diameter is required for DHPGCGripperConfiguration"]
|
|
744
|
+
|
|
745
|
+
if not isinstance(value, float):
|
|
746
|
+
return [False, "diameter must be of type float for DHPGCGripperConfiguration, got " + type(value).__name__]
|
|
747
|
+
|
|
748
|
+
return [True, ""]
|
|
749
|
+
|
|
750
|
+
def __post_init__(self):
|
|
751
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
752
|
+
is_valid, error_str = self.validate_diameter(self.diameter)
|
|
753
|
+
if not is_valid:
|
|
754
|
+
raise TypeError(error_str)
|
|
755
|
+
|
|
756
|
+
def parse_dhpgc_gripper_configuration(data: object):
|
|
757
|
+
return DHPGCGripperConfiguration(
|
|
758
|
+
diameter=parse_f_64(data["diameter"]) if "diameter" in data else None,
|
|
759
|
+
)
|
|
760
|
+
|
|
761
|
+
def serialize_dhpgc_gripper_configuration(data: DHPGCGripperConfiguration) -> object:
|
|
762
|
+
return {
|
|
763
|
+
"diameter": serialize_f_64(data.diameter),
|
|
764
|
+
}
|
|
765
|
+
|
|
570
766
|
@dataclass
|
|
571
767
|
class EngageEmergencyStopRequest:
|
|
572
768
|
"""Engage Emergency Stop. This will immediately stop the robot and prevent it from moving until the robot is unbraked.
|
|
@@ -671,6 +867,8 @@ class ErrorEnum(Enum):
|
|
|
671
867
|
"""Robot brakes engage failed"""
|
|
672
868
|
RequestFailedValidation = "request_failed_validation"
|
|
673
869
|
"""Request failed validation"""
|
|
870
|
+
RobotNotIdle = "robot_not_idle"
|
|
871
|
+
"""Robot must be idle"""
|
|
674
872
|
BrakesMustBeEngaged = "brakes_must_be_engaged"
|
|
675
873
|
"""Brakes must be_engaged"""
|
|
676
874
|
BrakesMustBeDisengaged = "brakes_must_be_disengaged"
|
|
@@ -687,6 +885,8 @@ class ErrorEnum(Enum):
|
|
|
687
885
|
"""Camera settings timed out"""
|
|
688
886
|
InternalServerError = "internal_server_error"
|
|
689
887
|
"""Internal server error occurred"""
|
|
888
|
+
RecoveryError = "recovery_error"
|
|
889
|
+
"""Recovery error occurred"""
|
|
690
890
|
NotFound = "not_found"
|
|
691
891
|
"""Requested resource not found"""
|
|
692
892
|
|
|
@@ -715,6 +915,10 @@ class GripperKindEnum(Enum):
|
|
|
715
915
|
"""An OnRobot 3FG15 Gripper is connected"""
|
|
716
916
|
DhAg = "dh_ag"
|
|
717
917
|
"""A DH AG Gripper is connected"""
|
|
918
|
+
DhPgc = "dh_pgc"
|
|
919
|
+
"""A DH PGC Gripper is connected"""
|
|
920
|
+
DhCgi = "dh_cgi"
|
|
921
|
+
"""A DH CGI Gripper is connected"""
|
|
718
922
|
NoneConnected = "none_connected"
|
|
719
923
|
"""No gripper is connected"""
|
|
720
924
|
|
|
@@ -724,6 +928,66 @@ def parse_gripper_kind_enum(data: object) -> GripperKindEnum:
|
|
|
724
928
|
def serialize_gripper_kind_enum(data: Union[GripperKindEnum, str]) -> object:
|
|
725
929
|
return GripperKindEnum(data).value
|
|
726
930
|
|
|
931
|
+
@dataclass
|
|
932
|
+
class IOStateResponse:
|
|
933
|
+
"""Response to a query for the current state of I/O."""
|
|
934
|
+
state: Union[str, None] = None
|
|
935
|
+
|
|
936
|
+
def validate_state(self, value: str) -> Tuple[bool, str]:
|
|
937
|
+
if value is None:
|
|
938
|
+
return [True, ""]
|
|
939
|
+
|
|
940
|
+
if not isinstance(value, str):
|
|
941
|
+
return [False, "state must be of type str for IOStateResponse, got " + type(value).__name__]
|
|
942
|
+
|
|
943
|
+
return [True, ""]
|
|
944
|
+
|
|
945
|
+
def __post_init__(self):
|
|
946
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
947
|
+
is_valid, error_str = self.validate_state(self.state)
|
|
948
|
+
if not is_valid:
|
|
949
|
+
raise TypeError(error_str)
|
|
950
|
+
|
|
951
|
+
def parse_io_state_response(data: object):
|
|
952
|
+
return IOStateResponse(
|
|
953
|
+
state=parse_str(data["state"]) if "state" in data else None,
|
|
954
|
+
)
|
|
955
|
+
|
|
956
|
+
def serialize_io_state_response(data: IOStateResponse) -> object:
|
|
957
|
+
return {
|
|
958
|
+
"state": None if data.state is None else serialize_str(data.state),
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
@dataclass
|
|
962
|
+
class IOStateUpdateRequest:
|
|
963
|
+
"""Request to update the state of I/O to either start or stop."""
|
|
964
|
+
state: Union[str, None] = None
|
|
965
|
+
|
|
966
|
+
def validate_state(self, value: str) -> Tuple[bool, str]:
|
|
967
|
+
if value is None:
|
|
968
|
+
return [True, ""]
|
|
969
|
+
|
|
970
|
+
if not isinstance(value, str):
|
|
971
|
+
return [False, "state must be of type str for IOStateUpdateRequest, got " + type(value).__name__]
|
|
972
|
+
|
|
973
|
+
return [True, ""]
|
|
974
|
+
|
|
975
|
+
def __post_init__(self):
|
|
976
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
977
|
+
is_valid, error_str = self.validate_state(self.state)
|
|
978
|
+
if not is_valid:
|
|
979
|
+
raise TypeError(error_str)
|
|
980
|
+
|
|
981
|
+
def parse_io_state_update_request(data: object):
|
|
982
|
+
return IOStateUpdateRequest(
|
|
983
|
+
state=parse_str(data["state"]) if "state" in data else None,
|
|
984
|
+
)
|
|
985
|
+
|
|
986
|
+
def serialize_io_state_update_request(data: IOStateUpdateRequest) -> object:
|
|
987
|
+
return {
|
|
988
|
+
"state": None if data.state is None else serialize_str(data.state),
|
|
989
|
+
}
|
|
990
|
+
|
|
727
991
|
JointRotations = Tuple[float,float,float,float,float,float,]
|
|
728
992
|
|
|
729
993
|
def parse_joint_rotations(data: object) -> JointRotations:
|
|
@@ -990,6 +1254,18 @@ def parse_robot_control_mode_enum(data: object) -> RobotControlModeEnum:
|
|
|
990
1254
|
def serialize_robot_control_mode_enum(data: Union[RobotControlModeEnum, str]) -> object:
|
|
991
1255
|
return RobotControlModeEnum(data).value
|
|
992
1256
|
|
|
1257
|
+
class ROSControlStateEnum(Enum):
|
|
1258
|
+
Enabled = "enabled"
|
|
1259
|
+
"""ROS control is enabled."""
|
|
1260
|
+
Disabled = "disabled"
|
|
1261
|
+
"""ROS control is disabled."""
|
|
1262
|
+
|
|
1263
|
+
def parse_ros_control_state_enum(data: object) -> ROSControlStateEnum:
|
|
1264
|
+
return ROSControlStateEnum(data)
|
|
1265
|
+
|
|
1266
|
+
def serialize_ros_control_state_enum(data: Union[ROSControlStateEnum, str]) -> object:
|
|
1267
|
+
return ROSControlStateEnum(data).value
|
|
1268
|
+
|
|
993
1269
|
RoutineVariablesStateMap = Dict[str, str]
|
|
994
1270
|
|
|
995
1271
|
def parse_routine_variables_state_map(data: object) -> RoutineVariablesStateMap:
|
|
@@ -1338,6 +1614,81 @@ def serialize_camera_frame_request(data: CameraFrameRequest) -> object:
|
|
|
1338
1614
|
"camera_settings": None if data.camera_settings is None else serialize_camera_settings(data.camera_settings),
|
|
1339
1615
|
}
|
|
1340
1616
|
|
|
1617
|
+
@dataclass
|
|
1618
|
+
class JointState:
|
|
1619
|
+
"""State of a joint"""
|
|
1620
|
+
braked: Union[bool, None] = None
|
|
1621
|
+
connectionStatus: Union[ConnectionStatus, None] = None
|
|
1622
|
+
inCollision: Union[bool, None] = None
|
|
1623
|
+
disturbance: Union[float, None] = None
|
|
1624
|
+
|
|
1625
|
+
def validate_braked(self, value: bool) -> Tuple[bool, str]:
|
|
1626
|
+
if value is None:
|
|
1627
|
+
return [True, ""]
|
|
1628
|
+
|
|
1629
|
+
if not isinstance(value, bool):
|
|
1630
|
+
return [False, "braked must be of type bool for JointState, got " + type(value).__name__]
|
|
1631
|
+
|
|
1632
|
+
return [True, ""]
|
|
1633
|
+
|
|
1634
|
+
def validate_connectionStatus(self, value: ConnectionStatus) -> Tuple[bool, str]:
|
|
1635
|
+
if value is None:
|
|
1636
|
+
return [True, ""]
|
|
1637
|
+
|
|
1638
|
+
if not ((isinstance(value, str) and ConnectionStatus in ['connected', 'disconnected', 'ready']) or isinstance(value, ConnectionStatus)):
|
|
1639
|
+
return [False, "connectionStatus must be of type ConnectionStatus for JointState, got " + type(value).__name__]
|
|
1640
|
+
|
|
1641
|
+
return [True, ""]
|
|
1642
|
+
|
|
1643
|
+
def validate_inCollision(self, value: bool) -> Tuple[bool, str]:
|
|
1644
|
+
if value is None:
|
|
1645
|
+
return [True, ""]
|
|
1646
|
+
|
|
1647
|
+
if not isinstance(value, bool):
|
|
1648
|
+
return [False, "inCollision must be of type bool for JointState, got " + type(value).__name__]
|
|
1649
|
+
|
|
1650
|
+
return [True, ""]
|
|
1651
|
+
|
|
1652
|
+
def validate_disturbance(self, value: float) -> Tuple[bool, str]:
|
|
1653
|
+
if value is None:
|
|
1654
|
+
return [True, ""]
|
|
1655
|
+
|
|
1656
|
+
if not isinstance(value, float):
|
|
1657
|
+
return [False, "disturbance must be of type float for JointState, got " + type(value).__name__]
|
|
1658
|
+
|
|
1659
|
+
return [True, ""]
|
|
1660
|
+
|
|
1661
|
+
def __post_init__(self):
|
|
1662
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
1663
|
+
is_valid, error_str = self.validate_braked(self.braked)
|
|
1664
|
+
if not is_valid:
|
|
1665
|
+
raise TypeError(error_str)
|
|
1666
|
+
is_valid, error_str = self.validate_connectionStatus(self.connectionStatus)
|
|
1667
|
+
if not is_valid:
|
|
1668
|
+
raise TypeError(error_str)
|
|
1669
|
+
is_valid, error_str = self.validate_inCollision(self.inCollision)
|
|
1670
|
+
if not is_valid:
|
|
1671
|
+
raise TypeError(error_str)
|
|
1672
|
+
is_valid, error_str = self.validate_disturbance(self.disturbance)
|
|
1673
|
+
if not is_valid:
|
|
1674
|
+
raise TypeError(error_str)
|
|
1675
|
+
|
|
1676
|
+
def parse_joint_state(data: object):
|
|
1677
|
+
return JointState(
|
|
1678
|
+
braked=parse_bool(data["braked"]) if "braked" in data else None,
|
|
1679
|
+
connectionStatus=parse_connection_status(data["connectionStatus"]) if "connectionStatus" in data else None,
|
|
1680
|
+
inCollision=parse_bool(data["inCollision"]) if "inCollision" in data else None,
|
|
1681
|
+
disturbance=parse_f_64(data["disturbance"]) if "disturbance" in data else None,
|
|
1682
|
+
)
|
|
1683
|
+
|
|
1684
|
+
def serialize_joint_state(data: JointState) -> object:
|
|
1685
|
+
return {
|
|
1686
|
+
"braked": None if data.braked is None else serialize_bool(data.braked),
|
|
1687
|
+
"connectionStatus": None if data.connectionStatus is None else serialize_connection_status(data.connectionStatus),
|
|
1688
|
+
"inCollision": None if data.inCollision is None else serialize_bool(data.inCollision),
|
|
1689
|
+
"disturbance": None if data.disturbance is None else serialize_f_64(data.disturbance),
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1341
1692
|
EnvironmentVariablesList = List[EnvironmentVariable]
|
|
1342
1693
|
|
|
1343
1694
|
def parse_environment_variables_list(data: object) -> EnvironmentVariablesList:
|
|
@@ -1356,7 +1707,7 @@ class ErrorResponse:
|
|
|
1356
1707
|
if value is None:
|
|
1357
1708
|
return [False, "error is required for ErrorResponse"]
|
|
1358
1709
|
|
|
1359
|
-
if not ((isinstance(value, str) and ErrorEnum in ['authorization_required', 'routine_must_be_running', 'api_control_required', 'robot_brakes_disengage_failed', 'robot_brakes_engage_failed', 'request_failed_validation', 'brakes_must_be_engaged', 'brakes_must_be_disengaged', 'equipment_no_matching', 'service_initializing', 'camera_disconnected', 'settings_validation_error', 'settings_timeout', 'internal_server_error', 'not_found']) or isinstance(value, ErrorEnum)):
|
|
1710
|
+
if not ((isinstance(value, str) and ErrorEnum in ['authorization_required', 'routine_must_be_running', 'api_control_required', 'robot_brakes_disengage_failed', 'robot_brakes_engage_failed', 'request_failed_validation', 'robot_not_idle', 'brakes_must_be_engaged', 'brakes_must_be_disengaged', 'equipment_no_matching', 'service_initializing', 'camera_disconnected', 'settings_validation_error', 'settings_timeout', 'internal_server_error', 'recovery_error', 'not_found']) or isinstance(value, ErrorEnum)):
|
|
1360
1711
|
return [False, "error must be of type ErrorEnum for ErrorResponse, got " + type(value).__name__]
|
|
1361
1712
|
|
|
1362
1713
|
return [True, ""]
|
|
@@ -1442,12 +1793,14 @@ class GripperConfiguration:
|
|
|
1442
1793
|
"""Configuration of gripper, also known as End Effector"""
|
|
1443
1794
|
kind: Union[GripperKindEnum, None] = None
|
|
1444
1795
|
dh_ag: Union[DHAGGripperConfiguration, None] = None
|
|
1796
|
+
dh_pgc: Union[DHPGCGripperConfiguration, None] = None
|
|
1797
|
+
dh_cgi: Union[DHCGIGripperConfiguration, None] = None
|
|
1445
1798
|
|
|
1446
1799
|
def validate_kind(self, value: GripperKindEnum) -> Tuple[bool, str]:
|
|
1447
1800
|
if value is None:
|
|
1448
1801
|
return [False, "kind is required for GripperConfiguration"]
|
|
1449
1802
|
|
|
1450
|
-
if not ((isinstance(value, str) and GripperKindEnum in ['onrobot_2fg7', 'onrobot_3fg15', 'dh_ag', 'none_connected']) or isinstance(value, GripperKindEnum)):
|
|
1803
|
+
if not ((isinstance(value, str) and GripperKindEnum in ['onrobot_2fg7', 'onrobot_3fg15', 'dh_ag', 'dh_pgc', 'dh_cgi', 'none_connected']) or isinstance(value, GripperKindEnum)):
|
|
1451
1804
|
return [False, "kind must be of type GripperKindEnum for GripperConfiguration, got " + type(value).__name__]
|
|
1452
1805
|
|
|
1453
1806
|
return [True, ""]
|
|
@@ -1461,6 +1814,24 @@ class GripperConfiguration:
|
|
|
1461
1814
|
|
|
1462
1815
|
return [True, ""]
|
|
1463
1816
|
|
|
1817
|
+
def validate_dh_pgc(self, value: DHPGCGripperConfiguration) -> Tuple[bool, str]:
|
|
1818
|
+
if value is None:
|
|
1819
|
+
return [True, ""]
|
|
1820
|
+
|
|
1821
|
+
if not isinstance(value, DHPGCGripperConfiguration):
|
|
1822
|
+
return [False, "dh_pgc must be of type DHPGCGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
|
|
1823
|
+
|
|
1824
|
+
return [True, ""]
|
|
1825
|
+
|
|
1826
|
+
def validate_dh_cgi(self, value: DHCGIGripperConfiguration) -> Tuple[bool, str]:
|
|
1827
|
+
if value is None:
|
|
1828
|
+
return [True, ""]
|
|
1829
|
+
|
|
1830
|
+
if not isinstance(value, DHCGIGripperConfiguration):
|
|
1831
|
+
return [False, "dh_cgi must be of type DHCGIGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
|
|
1832
|
+
|
|
1833
|
+
return [True, ""]
|
|
1834
|
+
|
|
1464
1835
|
def __post_init__(self):
|
|
1465
1836
|
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
1466
1837
|
is_valid, error_str = self.validate_kind(self.kind)
|
|
@@ -1469,17 +1840,27 @@ class GripperConfiguration:
|
|
|
1469
1840
|
is_valid, error_str = self.validate_dh_ag(self.dh_ag)
|
|
1470
1841
|
if not is_valid:
|
|
1471
1842
|
raise TypeError(error_str)
|
|
1843
|
+
is_valid, error_str = self.validate_dh_pgc(self.dh_pgc)
|
|
1844
|
+
if not is_valid:
|
|
1845
|
+
raise TypeError(error_str)
|
|
1846
|
+
is_valid, error_str = self.validate_dh_cgi(self.dh_cgi)
|
|
1847
|
+
if not is_valid:
|
|
1848
|
+
raise TypeError(error_str)
|
|
1472
1849
|
|
|
1473
1850
|
def parse_gripper_configuration(data: object):
|
|
1474
1851
|
return GripperConfiguration(
|
|
1475
1852
|
kind=parse_gripper_kind_enum(data["kind"]) if "kind" in data else None,
|
|
1476
1853
|
dh_ag=parse_dhag_gripper_configuration(data["dh_ag"]) if "dh_ag" in data else None,
|
|
1854
|
+
dh_pgc=parse_dhpgc_gripper_configuration(data["dh_pgc"]) if "dh_pgc" in data else None,
|
|
1855
|
+
dh_cgi=parse_dhcgi_gripper_configuration(data["dh_cgi"]) if "dh_cgi" in data else None,
|
|
1477
1856
|
)
|
|
1478
1857
|
|
|
1479
1858
|
def serialize_gripper_configuration(data: GripperConfiguration) -> object:
|
|
1480
1859
|
return {
|
|
1481
1860
|
"kind": serialize_gripper_kind_enum(data.kind),
|
|
1482
1861
|
"dh_ag": None if data.dh_ag is None else serialize_dhag_gripper_configuration(data.dh_ag),
|
|
1862
|
+
"dh_pgc": None if data.dh_pgc is None else serialize_dhpgc_gripper_configuration(data.dh_pgc),
|
|
1863
|
+
"dh_cgi": None if data.dh_cgi is None else serialize_dhcgi_gripper_configuration(data.dh_cgi),
|
|
1483
1864
|
}
|
|
1484
1865
|
|
|
1485
1866
|
@dataclass
|
|
@@ -1716,6 +2097,66 @@ def serialize_robot_control_mode(data: RobotControlMode) -> object:
|
|
|
1716
2097
|
"kind": None if data.kind is None else serialize_robot_control_mode_enum(data.kind),
|
|
1717
2098
|
}
|
|
1718
2099
|
|
|
2100
|
+
@dataclass
|
|
2101
|
+
class ROSControlStateResponse:
|
|
2102
|
+
"""Response to a query for the current state of ROS control."""
|
|
2103
|
+
state: Union[ROSControlStateEnum, None] = None
|
|
2104
|
+
|
|
2105
|
+
def validate_state(self, value: ROSControlStateEnum) -> Tuple[bool, str]:
|
|
2106
|
+
if value is None:
|
|
2107
|
+
return [True, ""]
|
|
2108
|
+
|
|
2109
|
+
if not ((isinstance(value, str) and ROSControlStateEnum in ['enabled', 'disabled']) or isinstance(value, ROSControlStateEnum)):
|
|
2110
|
+
return [False, "state must be of type ROSControlStateEnum for ROSControlStateResponse, got " + type(value).__name__]
|
|
2111
|
+
|
|
2112
|
+
return [True, ""]
|
|
2113
|
+
|
|
2114
|
+
def __post_init__(self):
|
|
2115
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
2116
|
+
is_valid, error_str = self.validate_state(self.state)
|
|
2117
|
+
if not is_valid:
|
|
2118
|
+
raise TypeError(error_str)
|
|
2119
|
+
|
|
2120
|
+
def parse_ros_control_state_response(data: object):
|
|
2121
|
+
return ROSControlStateResponse(
|
|
2122
|
+
state=parse_ros_control_state_enum(data["state"]) if "state" in data else None,
|
|
2123
|
+
)
|
|
2124
|
+
|
|
2125
|
+
def serialize_ros_control_state_response(data: ROSControlStateResponse) -> object:
|
|
2126
|
+
return {
|
|
2127
|
+
"state": None if data.state is None else serialize_ros_control_state_enum(data.state),
|
|
2128
|
+
}
|
|
2129
|
+
|
|
2130
|
+
@dataclass
|
|
2131
|
+
class ROSControlUpdateRequest:
|
|
2132
|
+
"""Request to update the state of direct ROS control."""
|
|
2133
|
+
action: Union[ROSControlStateEnum, None] = None
|
|
2134
|
+
|
|
2135
|
+
def validate_action(self, value: ROSControlStateEnum) -> Tuple[bool, str]:
|
|
2136
|
+
if value is None:
|
|
2137
|
+
return [True, ""]
|
|
2138
|
+
|
|
2139
|
+
if not ((isinstance(value, str) and ROSControlStateEnum in ['enabled', 'disabled']) or isinstance(value, ROSControlStateEnum)):
|
|
2140
|
+
return [False, "action must be of type ROSControlStateEnum for ROSControlUpdateRequest, got " + type(value).__name__]
|
|
2141
|
+
|
|
2142
|
+
return [True, ""]
|
|
2143
|
+
|
|
2144
|
+
def __post_init__(self):
|
|
2145
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
2146
|
+
is_valid, error_str = self.validate_action(self.action)
|
|
2147
|
+
if not is_valid:
|
|
2148
|
+
raise TypeError(error_str)
|
|
2149
|
+
|
|
2150
|
+
def parse_ros_control_update_request(data: object):
|
|
2151
|
+
return ROSControlUpdateRequest(
|
|
2152
|
+
action=parse_ros_control_state_enum(data["action"]) if "action" in data else None,
|
|
2153
|
+
)
|
|
2154
|
+
|
|
2155
|
+
def serialize_ros_control_update_request(data: ROSControlUpdateRequest) -> object:
|
|
2156
|
+
return {
|
|
2157
|
+
"action": None if data.action is None else serialize_ros_control_state_enum(data.action),
|
|
2158
|
+
}
|
|
2159
|
+
|
|
1719
2160
|
@dataclass
|
|
1720
2161
|
class PlayRoutineRequest:
|
|
1721
2162
|
"""Request to play a routine"""
|
|
@@ -1897,6 +2338,111 @@ def serialize_arm_position_update_request_response_event_stream_details(data: Ar
|
|
|
1897
2338
|
"subscriptions": serialize_arm_position_update_request_response_event_stream_subscriptions_list(data.subscriptions),
|
|
1898
2339
|
}
|
|
1899
2340
|
|
|
2341
|
+
@dataclass
|
|
2342
|
+
class JointsStateResponse:
|
|
2343
|
+
"""Response to a query for the current state of the joints"""
|
|
2344
|
+
J0: Union[JointState, None] = None
|
|
2345
|
+
J1: Union[JointState, None] = None
|
|
2346
|
+
J2: Union[JointState, None] = None
|
|
2347
|
+
J3: Union[JointState, None] = None
|
|
2348
|
+
J4: Union[JointState, None] = None
|
|
2349
|
+
J5: Union[JointState, None] = None
|
|
2350
|
+
|
|
2351
|
+
def validate_J0(self, value: JointState) -> Tuple[bool, str]:
|
|
2352
|
+
if value is None:
|
|
2353
|
+
return [True, ""]
|
|
2354
|
+
|
|
2355
|
+
if not isinstance(value, JointState):
|
|
2356
|
+
return [False, "J0 must be of type JointState for JointsStateResponse, got " + type(value).__name__]
|
|
2357
|
+
|
|
2358
|
+
return [True, ""]
|
|
2359
|
+
|
|
2360
|
+
def validate_J1(self, value: JointState) -> Tuple[bool, str]:
|
|
2361
|
+
if value is None:
|
|
2362
|
+
return [True, ""]
|
|
2363
|
+
|
|
2364
|
+
if not isinstance(value, JointState):
|
|
2365
|
+
return [False, "J1 must be of type JointState for JointsStateResponse, got " + type(value).__name__]
|
|
2366
|
+
|
|
2367
|
+
return [True, ""]
|
|
2368
|
+
|
|
2369
|
+
def validate_J2(self, value: JointState) -> Tuple[bool, str]:
|
|
2370
|
+
if value is None:
|
|
2371
|
+
return [True, ""]
|
|
2372
|
+
|
|
2373
|
+
if not isinstance(value, JointState):
|
|
2374
|
+
return [False, "J2 must be of type JointState for JointsStateResponse, got " + type(value).__name__]
|
|
2375
|
+
|
|
2376
|
+
return [True, ""]
|
|
2377
|
+
|
|
2378
|
+
def validate_J3(self, value: JointState) -> Tuple[bool, str]:
|
|
2379
|
+
if value is None:
|
|
2380
|
+
return [True, ""]
|
|
2381
|
+
|
|
2382
|
+
if not isinstance(value, JointState):
|
|
2383
|
+
return [False, "J3 must be of type JointState for JointsStateResponse, got " + type(value).__name__]
|
|
2384
|
+
|
|
2385
|
+
return [True, ""]
|
|
2386
|
+
|
|
2387
|
+
def validate_J4(self, value: JointState) -> Tuple[bool, str]:
|
|
2388
|
+
if value is None:
|
|
2389
|
+
return [True, ""]
|
|
2390
|
+
|
|
2391
|
+
if not isinstance(value, JointState):
|
|
2392
|
+
return [False, "J4 must be of type JointState for JointsStateResponse, got " + type(value).__name__]
|
|
2393
|
+
|
|
2394
|
+
return [True, ""]
|
|
2395
|
+
|
|
2396
|
+
def validate_J5(self, value: JointState) -> Tuple[bool, str]:
|
|
2397
|
+
if value is None:
|
|
2398
|
+
return [True, ""]
|
|
2399
|
+
|
|
2400
|
+
if not isinstance(value, JointState):
|
|
2401
|
+
return [False, "J5 must be of type JointState for JointsStateResponse, got " + type(value).__name__]
|
|
2402
|
+
|
|
2403
|
+
return [True, ""]
|
|
2404
|
+
|
|
2405
|
+
def __post_init__(self):
|
|
2406
|
+
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
2407
|
+
is_valid, error_str = self.validate_J0(self.J0)
|
|
2408
|
+
if not is_valid:
|
|
2409
|
+
raise TypeError(error_str)
|
|
2410
|
+
is_valid, error_str = self.validate_J1(self.J1)
|
|
2411
|
+
if not is_valid:
|
|
2412
|
+
raise TypeError(error_str)
|
|
2413
|
+
is_valid, error_str = self.validate_J2(self.J2)
|
|
2414
|
+
if not is_valid:
|
|
2415
|
+
raise TypeError(error_str)
|
|
2416
|
+
is_valid, error_str = self.validate_J3(self.J3)
|
|
2417
|
+
if not is_valid:
|
|
2418
|
+
raise TypeError(error_str)
|
|
2419
|
+
is_valid, error_str = self.validate_J4(self.J4)
|
|
2420
|
+
if not is_valid:
|
|
2421
|
+
raise TypeError(error_str)
|
|
2422
|
+
is_valid, error_str = self.validate_J5(self.J5)
|
|
2423
|
+
if not is_valid:
|
|
2424
|
+
raise TypeError(error_str)
|
|
2425
|
+
|
|
2426
|
+
def parse_joints_state_response(data: object):
|
|
2427
|
+
return JointsStateResponse(
|
|
2428
|
+
J0=parse_joint_state(data["J0"]) if "J0" in data else None,
|
|
2429
|
+
J1=parse_joint_state(data["J1"]) if "J1" in data else None,
|
|
2430
|
+
J2=parse_joint_state(data["J2"]) if "J2" in data else None,
|
|
2431
|
+
J3=parse_joint_state(data["J3"]) if "J3" in data else None,
|
|
2432
|
+
J4=parse_joint_state(data["J4"]) if "J4" in data else None,
|
|
2433
|
+
J5=parse_joint_state(data["J5"]) if "J5" in data else None,
|
|
2434
|
+
)
|
|
2435
|
+
|
|
2436
|
+
def serialize_joints_state_response(data: JointsStateResponse) -> object:
|
|
2437
|
+
return {
|
|
2438
|
+
"J0": None if data.J0 is None else serialize_joint_state(data.J0),
|
|
2439
|
+
"J1": None if data.J1 is None else serialize_joint_state(data.J1),
|
|
2440
|
+
"J2": None if data.J2 is None else serialize_joint_state(data.J2),
|
|
2441
|
+
"J3": None if data.J3 is None else serialize_joint_state(data.J3),
|
|
2442
|
+
"J4": None if data.J4 is None else serialize_joint_state(data.J4),
|
|
2443
|
+
"J5": None if data.J5 is None else serialize_joint_state(data.J5),
|
|
2444
|
+
}
|
|
2445
|
+
|
|
1900
2446
|
@dataclass
|
|
1901
2447
|
class Routine:
|
|
1902
2448
|
"""Robot Routine containing steps to automate robot movement and operations"""
|
|
@@ -2299,12 +2845,14 @@ class GripperCommandRequest:
|
|
|
2299
2845
|
onrobot_2fg7: Union[OnRobot2FG7GripperCommandRequest, None] = None
|
|
2300
2846
|
onrobot_3fg15: Union[OnRobot3FG15GripperCommandRequest, None] = None
|
|
2301
2847
|
dh_ag: Union[DHAGGripperCommandRequest, None] = None
|
|
2848
|
+
dh_pgc: Union[DHPGCGripperCommandRequest, None] = None
|
|
2849
|
+
dh_cgi: Union[DHCGIGripperCommandRequest, None] = None
|
|
2302
2850
|
|
|
2303
2851
|
def validate_kind(self, value: GripperKindEnum) -> Tuple[bool, str]:
|
|
2304
2852
|
if value is None:
|
|
2305
2853
|
return [False, "kind is required for GripperCommandRequest"]
|
|
2306
2854
|
|
|
2307
|
-
if not ((isinstance(value, str) and GripperKindEnum in ['onrobot_2fg7', 'onrobot_3fg15', 'dh_ag', 'none_connected']) or isinstance(value, GripperKindEnum)):
|
|
2855
|
+
if not ((isinstance(value, str) and GripperKindEnum in ['onrobot_2fg7', 'onrobot_3fg15', 'dh_ag', 'dh_pgc', 'dh_cgi', 'none_connected']) or isinstance(value, GripperKindEnum)):
|
|
2308
2856
|
return [False, "kind must be of type GripperKindEnum for GripperCommandRequest, got " + type(value).__name__]
|
|
2309
2857
|
|
|
2310
2858
|
return [True, ""]
|
|
@@ -2336,6 +2884,24 @@ class GripperCommandRequest:
|
|
|
2336
2884
|
|
|
2337
2885
|
return [True, ""]
|
|
2338
2886
|
|
|
2887
|
+
def validate_dh_pgc(self, value: DHPGCGripperCommandRequest) -> Tuple[bool, str]:
|
|
2888
|
+
if value is None:
|
|
2889
|
+
return [True, ""]
|
|
2890
|
+
|
|
2891
|
+
if not isinstance(value, DHPGCGripperCommandRequest):
|
|
2892
|
+
return [False, "dh_pgc must be of type DHPGCGripperCommandRequest for GripperCommandRequest, got " + type(value).__name__]
|
|
2893
|
+
|
|
2894
|
+
return [True, ""]
|
|
2895
|
+
|
|
2896
|
+
def validate_dh_cgi(self, value: DHCGIGripperCommandRequest) -> Tuple[bool, str]:
|
|
2897
|
+
if value is None:
|
|
2898
|
+
return [True, ""]
|
|
2899
|
+
|
|
2900
|
+
if not isinstance(value, DHCGIGripperCommandRequest):
|
|
2901
|
+
return [False, "dh_cgi must be of type DHCGIGripperCommandRequest for GripperCommandRequest, got " + type(value).__name__]
|
|
2902
|
+
|
|
2903
|
+
return [True, ""]
|
|
2904
|
+
|
|
2339
2905
|
def __post_init__(self):
|
|
2340
2906
|
# Type check incoming model - raise error if invalid (required or wrong type)
|
|
2341
2907
|
is_valid, error_str = self.validate_kind(self.kind)
|
|
@@ -2350,6 +2916,12 @@ class GripperCommandRequest:
|
|
|
2350
2916
|
is_valid, error_str = self.validate_dh_ag(self.dh_ag)
|
|
2351
2917
|
if not is_valid:
|
|
2352
2918
|
raise TypeError(error_str)
|
|
2919
|
+
is_valid, error_str = self.validate_dh_pgc(self.dh_pgc)
|
|
2920
|
+
if not is_valid:
|
|
2921
|
+
raise TypeError(error_str)
|
|
2922
|
+
is_valid, error_str = self.validate_dh_cgi(self.dh_cgi)
|
|
2923
|
+
if not is_valid:
|
|
2924
|
+
raise TypeError(error_str)
|
|
2353
2925
|
|
|
2354
2926
|
def parse_gripper_command_request(data: object):
|
|
2355
2927
|
return GripperCommandRequest(
|
|
@@ -2357,6 +2929,8 @@ def parse_gripper_command_request(data: object):
|
|
|
2357
2929
|
onrobot_2fg7=parse_on_robot_2_fg_7_gripper_command_request(data["onrobot_2fg7"]) if "onrobot_2fg7" in data else None,
|
|
2358
2930
|
onrobot_3fg15=parse_on_robot_3_fg_15_gripper_command_request(data["onrobot_3fg15"]) if "onrobot_3fg15" in data else None,
|
|
2359
2931
|
dh_ag=parse_dhag_gripper_command_request(data["dh_ag"]) if "dh_ag" in data else None,
|
|
2932
|
+
dh_pgc=parse_dhpgc_gripper_command_request(data["dh_pgc"]) if "dh_pgc" in data else None,
|
|
2933
|
+
dh_cgi=parse_dhcgi_gripper_command_request(data["dh_cgi"]) if "dh_cgi" in data else None,
|
|
2360
2934
|
)
|
|
2361
2935
|
|
|
2362
2936
|
def serialize_gripper_command_request(data: GripperCommandRequest) -> object:
|
|
@@ -2365,6 +2939,8 @@ def serialize_gripper_command_request(data: GripperCommandRequest) -> object:
|
|
|
2365
2939
|
"onrobot_2fg7": None if data.onrobot_2fg7 is None else serialize_on_robot_2_fg_7_gripper_command_request(data.onrobot_2fg7),
|
|
2366
2940
|
"onrobot_3fg15": None if data.onrobot_3fg15 is None else serialize_on_robot_3_fg_15_gripper_command_request(data.onrobot_3fg15),
|
|
2367
2941
|
"dh_ag": None if data.dh_ag is None else serialize_dhag_gripper_command_request(data.dh_ag),
|
|
2942
|
+
"dh_pgc": None if data.dh_pgc is None else serialize_dhpgc_gripper_command_request(data.dh_pgc),
|
|
2943
|
+
"dh_cgi": None if data.dh_cgi is None else serialize_dhcgi_gripper_command_request(data.dh_cgi),
|
|
2368
2944
|
}
|
|
2369
2945
|
|
|
2370
2946
|
@dataclass
|
|
File without changes
|
|
File without changes
|
{standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots/auto_generated/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
{standardbots-2.20240401.11 → standardbots-2.20240614.1}/standardbots.egg-info/top_level.txt
RENAMED
|
File without changes
|