standardbots 2.0.0.dev1760378411__py3-none-any.whl → 2.0.0.dev1768505129__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.
@@ -240,6 +240,66 @@ def parse_arm_position_update_request_response_kind_enum(data: object) -> ArmPos
240
240
  def serialize_arm_position_update_request_response_kind_enum(data: Union[ArmPositionUpdateRequestResponseKindEnum, str]) -> object:
241
241
  return ArmPositionUpdateRequestResponseKindEnum(data).value
242
242
 
243
+ @dataclass
244
+ class BoltHeadPosition:
245
+ """Bolt head position in pitch, yaw, roll"""
246
+ pitch: Union[float, None] = None
247
+ yaw: Union[float, None] = None
248
+ roll: Union[float, None] = None
249
+
250
+ def validate_pitch(self, value: float) -> Tuple[bool, str]:
251
+ if value is None:
252
+ return [False, "pitch is required for BoltHeadPosition"]
253
+
254
+ if not isinstance(value, float):
255
+ return [False, "pitch must be of type float for BoltHeadPosition, got " + type(value).__name__]
256
+
257
+ return [True, ""]
258
+
259
+ def validate_yaw(self, value: float) -> Tuple[bool, str]:
260
+ if value is None:
261
+ return [False, "yaw is required for BoltHeadPosition"]
262
+
263
+ if not isinstance(value, float):
264
+ return [False, "yaw must be of type float for BoltHeadPosition, got " + type(value).__name__]
265
+
266
+ return [True, ""]
267
+
268
+ def validate_roll(self, value: float) -> Tuple[bool, str]:
269
+ if value is None:
270
+ return [False, "roll is required for BoltHeadPosition"]
271
+
272
+ if not isinstance(value, float):
273
+ return [False, "roll must be of type float for BoltHeadPosition, got " + type(value).__name__]
274
+
275
+ return [True, ""]
276
+
277
+ def __post_init__(self):
278
+ # Type check incoming model - raise error if invalid (required or wrong type)
279
+ is_valid, error_str = self.validate_pitch(self.pitch)
280
+ if not is_valid:
281
+ raise TypeError(error_str)
282
+ is_valid, error_str = self.validate_yaw(self.yaw)
283
+ if not is_valid:
284
+ raise TypeError(error_str)
285
+ is_valid, error_str = self.validate_roll(self.roll)
286
+ if not is_valid:
287
+ raise TypeError(error_str)
288
+
289
+ def parse_bolt_head_position(data: object):
290
+ return BoltHeadPosition(
291
+ pitch=parse_f_64(data["pitch"]) if "pitch" in data and data.get("pitch") is not None else None,
292
+ yaw=parse_f_64(data["yaw"]) if "yaw" in data and data.get("yaw") is not None else None,
293
+ roll=parse_f_64(data["roll"]) if "roll" in data and data.get("roll") is not None else None,
294
+ )
295
+
296
+ def serialize_bolt_head_position(data: BoltHeadPosition) -> object:
297
+ return {
298
+ "pitch": serialize_f_64(data.pitch),
299
+ "yaw": serialize_f_64(data.yaw),
300
+ "roll": serialize_f_64(data.roll),
301
+ }
302
+
243
303
  @dataclass
244
304
  class BotIdentityData:
245
305
  """Data about the robot's identity"""
@@ -387,6 +447,81 @@ def serialize_camera_configuration(data: CameraConfiguration) -> object:
387
447
  "height": None if data.height is None else serialize_u_32(data.height),
388
448
  }
389
449
 
450
+ @dataclass
451
+ class CameraFrameResponse:
452
+ """Response containing a camera frame and associated metadata."""
453
+ imageData: Union[str, None] = None
454
+ timestamp: Union[str, None] = None
455
+ camera_id: Union[str, None] = None
456
+ stream_name: Union[str, None] = None
457
+
458
+ def validate_imageData(self, value: str) -> Tuple[bool, str]:
459
+ if value is None:
460
+ return [True, ""]
461
+
462
+ if not isinstance(value, str):
463
+ return [False, "imageData must be of type str for CameraFrameResponse, got " + type(value).__name__]
464
+
465
+ return [True, ""]
466
+
467
+ def validate_timestamp(self, value: str) -> Tuple[bool, str]:
468
+ if value is None:
469
+ return [True, ""]
470
+
471
+ if not isinstance(value, str):
472
+ return [False, "timestamp must be of type str for CameraFrameResponse, got " + type(value).__name__]
473
+
474
+ return [True, ""]
475
+
476
+ def validate_camera_id(self, value: str) -> Tuple[bool, str]:
477
+ if value is None:
478
+ return [True, ""]
479
+
480
+ if not isinstance(value, str):
481
+ return [False, "camera_id must be of type str for CameraFrameResponse, got " + type(value).__name__]
482
+
483
+ return [True, ""]
484
+
485
+ def validate_stream_name(self, value: str) -> Tuple[bool, str]:
486
+ if value is None:
487
+ return [True, ""]
488
+
489
+ if not isinstance(value, str):
490
+ return [False, "stream_name must be of type str for CameraFrameResponse, got " + type(value).__name__]
491
+
492
+ return [True, ""]
493
+
494
+ def __post_init__(self):
495
+ # Type check incoming model - raise error if invalid (required or wrong type)
496
+ is_valid, error_str = self.validate_imageData(self.imageData)
497
+ if not is_valid:
498
+ raise TypeError(error_str)
499
+ is_valid, error_str = self.validate_timestamp(self.timestamp)
500
+ if not is_valid:
501
+ raise TypeError(error_str)
502
+ is_valid, error_str = self.validate_camera_id(self.camera_id)
503
+ if not is_valid:
504
+ raise TypeError(error_str)
505
+ is_valid, error_str = self.validate_stream_name(self.stream_name)
506
+ if not is_valid:
507
+ raise TypeError(error_str)
508
+
509
+ def parse_camera_frame_response(data: object):
510
+ return CameraFrameResponse(
511
+ imageData=parse_str(data["imageData"]) if "imageData" in data and data.get("imageData") is not None else None,
512
+ timestamp=parse_str(data["timestamp"]) if "timestamp" in data and data.get("timestamp") is not None else None,
513
+ camera_id=parse_str(data["camera_id"]) if "camera_id" in data and data.get("camera_id") is not None else None,
514
+ stream_name=parse_str(data["stream_name"]) if "stream_name" in data and data.get("stream_name") is not None else None,
515
+ )
516
+
517
+ def serialize_camera_frame_response(data: CameraFrameResponse) -> object:
518
+ return {
519
+ "imageData": None if data.imageData is None else serialize_str(data.imageData),
520
+ "timestamp": None if data.timestamp is None else serialize_str(data.timestamp),
521
+ "camera_id": None if data.camera_id is None else serialize_str(data.camera_id),
522
+ "stream_name": None if data.stream_name is None else serialize_str(data.stream_name),
523
+ }
524
+
390
525
  @dataclass
391
526
  class CameraIntrinsics:
392
527
  """Intrinsic parameters of the camera."""
@@ -1094,6 +1229,22 @@ def serialize_dhpgc_gripper_configuration(data: DHPGCGripperConfiguration) -> ob
1094
1229
  "diameter": serialize_f_64(data.diameter),
1095
1230
  }
1096
1231
 
1232
+ @dataclass
1233
+ class ElastokinConfig:
1234
+ """Elastokinematic configuration parameters (arbitrary JSON object from Cognibotics)"""
1235
+
1236
+ def __post_init__(self):
1237
+ # Type check incoming model - raise error if invalid (required or wrong type)
1238
+ pass
1239
+
1240
+ def parse_elastokin_config(data: object):
1241
+ return ElastokinConfig(
1242
+ )
1243
+
1244
+ def serialize_elastokin_config(data: ElastokinConfig) -> object:
1245
+ return {
1246
+ }
1247
+
1097
1248
  @dataclass
1098
1249
  class EngageEmergencyStopRequest:
1099
1250
  """Engage Emergency Stop. This will immediately stop the robot and prevent it from moving until the robot is unbraked.
@@ -1337,6 +1488,8 @@ class ErrorEnum(Enum):
1337
1488
  """Cannot change ROS state"""
1338
1489
  IoSafeguardError = "io_safeguard_error"
1339
1490
  """Cannot change IO state because of safeguard"""
1491
+ RobotOutOfComplianceBounds = "robot_out_of_compliance_bounds"
1492
+ """Cannot initiate compliance control: Robot is outside compliance bounds"""
1340
1493
 
1341
1494
  def parse_error_enum(data: object) -> ErrorEnum:
1342
1495
  return ErrorEnum(data)
@@ -1470,6 +1623,51 @@ def parse_force_unit_kind(data: object) -> ForceUnitKind:
1470
1623
  def serialize_force_unit_kind(data: Union[ForceUnitKind, str]) -> object:
1471
1624
  return ForceUnitKind(data).value
1472
1625
 
1626
+ @dataclass
1627
+ class GripperBounds:
1628
+ """Gripper bounds configuration"""
1629
+ min: Union[float, None] = None
1630
+ max: Union[float, None] = None
1631
+
1632
+ def validate_min(self, value: float) -> Tuple[bool, str]:
1633
+ if value is None:
1634
+ return [False, "min is required for GripperBounds"]
1635
+
1636
+ if not isinstance(value, float):
1637
+ return [False, "min must be of type float for GripperBounds, got " + type(value).__name__]
1638
+
1639
+ return [True, ""]
1640
+
1641
+ def validate_max(self, value: float) -> Tuple[bool, str]:
1642
+ if value is None:
1643
+ return [False, "max is required for GripperBounds"]
1644
+
1645
+ if not isinstance(value, float):
1646
+ return [False, "max must be of type float for GripperBounds, got " + type(value).__name__]
1647
+
1648
+ return [True, ""]
1649
+
1650
+ def __post_init__(self):
1651
+ # Type check incoming model - raise error if invalid (required or wrong type)
1652
+ is_valid, error_str = self.validate_min(self.min)
1653
+ if not is_valid:
1654
+ raise TypeError(error_str)
1655
+ is_valid, error_str = self.validate_max(self.max)
1656
+ if not is_valid:
1657
+ raise TypeError(error_str)
1658
+
1659
+ def parse_gripper_bounds(data: object):
1660
+ return GripperBounds(
1661
+ min=parse_f_64(data["min"]) if "min" in data and data.get("min") is not None else None,
1662
+ max=parse_f_64(data["max"]) if "max" in data and data.get("max") is not None else None,
1663
+ )
1664
+
1665
+ def serialize_gripper_bounds(data: GripperBounds) -> object:
1666
+ return {
1667
+ "min": serialize_f_64(data.min),
1668
+ "max": serialize_f_64(data.max),
1669
+ }
1670
+
1473
1671
  class GripperKindEnum(Enum):
1474
1672
  Onrobot2Fg7 = "onrobot_2fg7"
1475
1673
  """An OnRobot 2FG7 Gripper is connected"""
@@ -1487,6 +1685,10 @@ class GripperKindEnum(Enum):
1487
1685
  """A DH CGI Gripper is connected"""
1488
1686
  SchunkEgx = "schunk_egx"
1489
1687
  """A Schunk EGU / EGK Gripper is connected"""
1688
+ Robotiq2F = "robotiq_2f"
1689
+ """A Robotiq 2F parallel jaw gripper is connected"""
1690
+ RobotiqEpick = "robotiq_epick"
1691
+ """A Robotiq EPick vacuum gripper is connected"""
1490
1692
  NoneConnected = "none_connected"
1491
1693
  """No gripper is connected"""
1492
1694
 
@@ -1736,6 +1938,14 @@ def parse_max_joint_speeds(data: object) -> MaxJointSpeeds:
1736
1938
  def serialize_max_joint_speeds(data: MaxJointSpeeds) -> object:
1737
1939
  return [serialize_f_64(data[0]),serialize_f_64(data[1]),serialize_f_64(data[2]),serialize_f_64(data[3]),serialize_f_64(data[4]),serialize_f_64(data[5]),]
1738
1940
 
1941
+ MaxJointTorques = Tuple[float,float,float,float,float,float,]
1942
+
1943
+ def parse_max_joint_torques(data: object) -> MaxJointTorques:
1944
+ return (parse_f_64(data[0]),parse_f_64(data[1]),parse_f_64(data[2]),parse_f_64(data[3]),parse_f_64(data[4]),parse_f_64(data[5]),)
1945
+
1946
+ def serialize_max_joint_torques(data: MaxJointTorques) -> object:
1947
+ return [serialize_f_64(data[0]),serialize_f_64(data[1]),serialize_f_64(data[2]),serialize_f_64(data[3]),serialize_f_64(data[4]),serialize_f_64(data[5]),]
1948
+
1739
1949
  class MovementKindEnum(Enum):
1740
1950
  Joint = "joint"
1741
1951
  """Enum Joint = `joint`"""
@@ -2652,6 +2862,70 @@ def parse_robot_control_mode_enum(data: object) -> RobotControlModeEnum:
2652
2862
  def serialize_robot_control_mode_enum(data: Union[RobotControlModeEnum, str]) -> object:
2653
2863
  return RobotControlModeEnum(data).value
2654
2864
 
2865
+ class RobotFrame(Enum):
2866
+ World = "world"
2867
+ """Enum World = `world`"""
2868
+ Tooltip = "tooltip"
2869
+ """Enum Tooltip = `tooltip`"""
2870
+
2871
+ def parse_robot_frame(data: object) -> RobotFrame:
2872
+ return RobotFrame(data)
2873
+
2874
+ def serialize_robot_frame(data: Union[RobotFrame, str]) -> object:
2875
+ return RobotFrame(data).value
2876
+
2877
+ class Robotiq2FControlKindEnum(Enum):
2878
+ Move = "move"
2879
+ """Move jaws to the requested position"""
2880
+
2881
+ def parse_robotiq_2_f_control_kind_enum(data: object) -> Robotiq2FControlKindEnum:
2882
+ return Robotiq2FControlKindEnum(data)
2883
+
2884
+ def serialize_robotiq_2_f_control_kind_enum(data: Union[Robotiq2FControlKindEnum, str]) -> object:
2885
+ return Robotiq2FControlKindEnum(data).value
2886
+
2887
+ class RobotiqEPickControlKindEnum(Enum):
2888
+ Grip = "grip"
2889
+ """Grip with vacuum"""
2890
+ Release = "release"
2891
+ """Release vacuum"""
2892
+
2893
+ def parse_robotiq_e_pick_control_kind_enum(data: object) -> RobotiqEPickControlKindEnum:
2894
+ return RobotiqEPickControlKindEnum(data)
2895
+
2896
+ def serialize_robotiq_e_pick_control_kind_enum(data: Union[RobotiqEPickControlKindEnum, str]) -> object:
2897
+ return RobotiqEPickControlKindEnum(data).value
2898
+
2899
+ @dataclass
2900
+ class RobotiqEPickGripperConfiguration:
2901
+ """Configuration for Robotiq EPick vacuum gripper"""
2902
+ mass_kg: Union[float, None] = None
2903
+
2904
+ def validate_mass_kg(self, value: float) -> Tuple[bool, str]:
2905
+ if value is None:
2906
+ return [True, ""]
2907
+
2908
+ if not isinstance(value, float):
2909
+ return [False, "mass_kg must be of type float for RobotiqEPickGripperConfiguration, got " + type(value).__name__]
2910
+
2911
+ return [True, ""]
2912
+
2913
+ def __post_init__(self):
2914
+ # Type check incoming model - raise error if invalid (required or wrong type)
2915
+ is_valid, error_str = self.validate_mass_kg(self.mass_kg)
2916
+ if not is_valid:
2917
+ raise TypeError(error_str)
2918
+
2919
+ def parse_robotiq_e_pick_gripper_configuration(data: object):
2920
+ return RobotiqEPickGripperConfiguration(
2921
+ mass_kg=parse_f_64(data["mass_kg"]) if "mass_kg" in data and data.get("mass_kg") is not None else None,
2922
+ )
2923
+
2924
+ def serialize_robotiq_e_pick_gripper_configuration(data: RobotiqEPickGripperConfiguration) -> object:
2925
+ return {
2926
+ "mass_kg": None if data.mass_kg is None else serialize_f_64(data.mass_kg),
2927
+ }
2928
+
2655
2929
  class RobotStatusEnum(Enum):
2656
2930
  Idle = "Idle"
2657
2931
  """Enum Idle = `Idle`"""
@@ -3152,11 +3426,42 @@ def serialize_sensor_config(data: SensorConfig) -> object:
3152
3426
  "metadata": None if data.metadata is None else serialize_str(data.metadata),
3153
3427
  }
3154
3428
 
3429
+ @dataclass
3430
+ class SetFilterTypeRequest:
3431
+ """Request to set filter type"""
3432
+ filterType: Union[str, None] = None
3433
+
3434
+ def validate_filterType(self, value: str) -> Tuple[bool, str]:
3435
+ if value is None:
3436
+ return [False, "filterType is required for SetFilterTypeRequest"]
3437
+
3438
+ if not isinstance(value, str):
3439
+ return [False, "filterType must be of type str for SetFilterTypeRequest, got " + type(value).__name__]
3440
+
3441
+ return [True, ""]
3442
+
3443
+ def __post_init__(self):
3444
+ # Type check incoming model - raise error if invalid (required or wrong type)
3445
+ is_valid, error_str = self.validate_filterType(self.filterType)
3446
+ if not is_valid:
3447
+ raise TypeError(error_str)
3448
+
3449
+ def parse_set_filter_type_request(data: object):
3450
+ return SetFilterTypeRequest(
3451
+ filterType=parse_str(data["filterType"]) if "filterType" in data and data.get("filterType") is not None else None,
3452
+ )
3453
+
3454
+ def serialize_set_filter_type_request(data: SetFilterTypeRequest) -> object:
3455
+ return {
3456
+ "filterType": serialize_str(data.filterType),
3457
+ }
3458
+
3155
3459
  @dataclass
3156
3460
  class SetRatioControlRequest:
3157
3461
  """Request to set ratio control parameters"""
3158
3462
  enabled: Union[bool, None] = None
3159
- value: Union[float, None] = None
3463
+ movementValue: Union[float, None] = None
3464
+ rotationValue: Union[float, None] = None
3160
3465
 
3161
3466
  def validate_enabled(self, value: bool) -> Tuple[bool, str]:
3162
3467
  if value is None:
@@ -3167,12 +3472,21 @@ class SetRatioControlRequest:
3167
3472
 
3168
3473
  return [True, ""]
3169
3474
 
3170
- def validate_value(self, value: float) -> Tuple[bool, str]:
3475
+ def validate_movementValue(self, value: float) -> Tuple[bool, str]:
3476
+ if value is None:
3477
+ return [True, ""]
3478
+
3479
+ if not isinstance(value, float):
3480
+ return [False, "movementValue must be of type float for SetRatioControlRequest, got " + type(value).__name__]
3481
+
3482
+ return [True, ""]
3483
+
3484
+ def validate_rotationValue(self, value: float) -> Tuple[bool, str]:
3171
3485
  if value is None:
3172
3486
  return [True, ""]
3173
3487
 
3174
3488
  if not isinstance(value, float):
3175
- return [False, "value must be of type float for SetRatioControlRequest, got " + type(value).__name__]
3489
+ return [False, "rotationValue must be of type float for SetRatioControlRequest, got " + type(value).__name__]
3176
3490
 
3177
3491
  return [True, ""]
3178
3492
 
@@ -3181,20 +3495,25 @@ class SetRatioControlRequest:
3181
3495
  is_valid, error_str = self.validate_enabled(self.enabled)
3182
3496
  if not is_valid:
3183
3497
  raise TypeError(error_str)
3184
- is_valid, error_str = self.validate_value(self.value)
3498
+ is_valid, error_str = self.validate_movementValue(self.movementValue)
3499
+ if not is_valid:
3500
+ raise TypeError(error_str)
3501
+ is_valid, error_str = self.validate_rotationValue(self.rotationValue)
3185
3502
  if not is_valid:
3186
3503
  raise TypeError(error_str)
3187
3504
 
3188
3505
  def parse_set_ratio_control_request(data: object):
3189
3506
  return SetRatioControlRequest(
3190
3507
  enabled=parse_bool(data["enabled"]) if "enabled" in data and data.get("enabled") is not None else None,
3191
- value=parse_f_64(data["value"]) if "value" in data and data.get("value") is not None else None,
3508
+ movementValue=parse_f_64(data["movementValue"]) if "movementValue" in data and data.get("movementValue") is not None else None,
3509
+ rotationValue=parse_f_64(data["rotationValue"]) if "rotationValue" in data and data.get("rotationValue") is not None else None,
3192
3510
  )
3193
3511
 
3194
3512
  def serialize_set_ratio_control_request(data: SetRatioControlRequest) -> object:
3195
3513
  return {
3196
3514
  "enabled": None if data.enabled is None else serialize_bool(data.enabled),
3197
- "value": None if data.value is None else serialize_f_64(data.value),
3515
+ "movementValue": None if data.movementValue is None else serialize_f_64(data.movementValue),
3516
+ "rotationValue": None if data.rotationValue is None else serialize_f_64(data.rotationValue),
3198
3517
  }
3199
3518
 
3200
3519
  class SignalMessageType(Enum):
@@ -3318,42 +3637,80 @@ def serialize_status_version_data(data: StatusVersionData) -> object:
3318
3637
  "name": None if data.name is None else serialize_str(data.name),
3319
3638
  }
3320
3639
 
3640
+ StringArray = List[str]
3641
+
3642
+ def parse_string_array(data: object) -> StringArray:
3643
+ return [parse_str(item) for item in data]
3644
+
3645
+ def serialize_string_array(data: StringArray) -> List[object]:
3646
+ return [serialize_str(item) for item in data]
3647
+
3321
3648
  @dataclass
3322
- class StopRecordingRequest:
3323
- """Request to stop recording movement and camera data"""
3324
- delete: Union[bool, None] = None
3649
+ class TeleopClient:
3650
+ """Connected teleop client"""
3651
+ clientId: Union[str, None] = None
3652
+ clientType: Union[str, None] = None
3653
+ connectedAt: Union[str, None] = None
3325
3654
 
3326
- def validate_delete(self, value: bool) -> Tuple[bool, str]:
3655
+ def validate_clientId(self, value: str) -> Tuple[bool, str]:
3327
3656
  if value is None:
3328
3657
  return [True, ""]
3329
3658
 
3330
- if not isinstance(value, bool):
3331
- return [False, "delete must be of type bool for StopRecordingRequest, got " + type(value).__name__]
3659
+ if not isinstance(value, str):
3660
+ return [False, "clientId must be of type str for TeleopClient, got " + type(value).__name__]
3661
+
3662
+ return [True, ""]
3663
+
3664
+ def validate_clientType(self, value: str) -> Tuple[bool, str]:
3665
+ if value is None:
3666
+ return [True, ""]
3667
+
3668
+ if not isinstance(value, str):
3669
+ return [False, "clientType must be of type str for TeleopClient, got " + type(value).__name__]
3670
+
3671
+ return [True, ""]
3672
+
3673
+ def validate_connectedAt(self, value: str) -> Tuple[bool, str]:
3674
+ if value is None:
3675
+ return [True, ""]
3676
+
3677
+ if not isinstance(value, str):
3678
+ return [False, "connectedAt must be of type str for TeleopClient, got " + type(value).__name__]
3332
3679
 
3333
3680
  return [True, ""]
3334
3681
 
3335
3682
  def __post_init__(self):
3336
3683
  # Type check incoming model - raise error if invalid (required or wrong type)
3337
- is_valid, error_str = self.validate_delete(self.delete)
3684
+ is_valid, error_str = self.validate_clientId(self.clientId)
3685
+ if not is_valid:
3686
+ raise TypeError(error_str)
3687
+ is_valid, error_str = self.validate_clientType(self.clientType)
3688
+ if not is_valid:
3689
+ raise TypeError(error_str)
3690
+ is_valid, error_str = self.validate_connectedAt(self.connectedAt)
3338
3691
  if not is_valid:
3339
3692
  raise TypeError(error_str)
3340
3693
 
3341
- def parse_stop_recording_request(data: object):
3342
- return StopRecordingRequest(
3343
- delete=parse_bool(data["delete"]) if "delete" in data and data.get("delete") is not None else None,
3694
+ def parse_teleop_client(data: object):
3695
+ return TeleopClient(
3696
+ clientId=parse_str(data["clientId"]) if "clientId" in data and data.get("clientId") is not None else None,
3697
+ clientType=parse_str(data["clientType"]) if "clientType" in data and data.get("clientType") is not None else None,
3698
+ connectedAt=parse_str(data["connectedAt"]) if "connectedAt" in data and data.get("connectedAt") is not None else None,
3344
3699
  )
3345
3700
 
3346
- def serialize_stop_recording_request(data: StopRecordingRequest) -> object:
3701
+ def serialize_teleop_client(data: TeleopClient) -> object:
3347
3702
  return {
3348
- "delete": None if data.delete is None else serialize_bool(data.delete),
3703
+ "clientId": None if data.clientId is None else serialize_str(data.clientId),
3704
+ "clientType": None if data.clientType is None else serialize_str(data.clientType),
3705
+ "connectedAt": None if data.connectedAt is None else serialize_str(data.connectedAt),
3349
3706
  }
3350
3707
 
3351
- StringArray = List[str]
3708
+ TeleopErrorArray = List[str]
3352
3709
 
3353
- def parse_string_array(data: object) -> StringArray:
3710
+ def parse_teleop_error_array(data: object) -> TeleopErrorArray:
3354
3711
  return [parse_str(item) for item in data]
3355
3712
 
3356
- def serialize_string_array(data: StringArray) -> List[object]:
3713
+ def serialize_teleop_error_array(data: TeleopErrorArray) -> List[object]:
3357
3714
  return [serialize_str(item) for item in data]
3358
3715
 
3359
3716
  class TeleopStatus(Enum):
@@ -3668,6 +4025,36 @@ def parse_arm_position_update_request_response_event_stream_subscriptions_list(d
3668
4025
  def serialize_arm_position_update_request_response_event_stream_subscriptions_list(data: ArmPositionUpdateRequestResponseEventStreamSubscriptionsList) -> List[object]:
3669
4026
  return [serialize_arm_position_update_request_response_event_stream_subscription_kind_enum(item) for item in data]
3670
4027
 
4028
+ @dataclass
4029
+ class SetBoltHeadPositionRequest:
4030
+ """Request to set static bolt head position"""
4031
+ position: Union[BoltHeadPosition, None] = None
4032
+
4033
+ def validate_position(self, value: BoltHeadPosition) -> Tuple[bool, str]:
4034
+ if value is None:
4035
+ return [False, "position is required for SetBoltHeadPositionRequest"]
4036
+
4037
+ if not isinstance(value, BoltHeadPosition):
4038
+ return [False, "position must be of type BoltHeadPosition for SetBoltHeadPositionRequest, got " + type(value).__name__]
4039
+
4040
+ return [True, ""]
4041
+
4042
+ def __post_init__(self):
4043
+ # Type check incoming model - raise error if invalid (required or wrong type)
4044
+ is_valid, error_str = self.validate_position(self.position)
4045
+ if not is_valid:
4046
+ raise TypeError(error_str)
4047
+
4048
+ def parse_set_bolt_head_position_request(data: object):
4049
+ return SetBoltHeadPositionRequest(
4050
+ position=parse_bolt_head_position(data["position"]) if "position" in data and data.get("position") is not None else None,
4051
+ )
4052
+
4053
+ def serialize_set_bolt_head_position_request(data: SetBoltHeadPositionRequest) -> object:
4054
+ return {
4055
+ "position": serialize_bolt_head_position(data.position),
4056
+ }
4057
+
3671
4058
  @dataclass
3672
4059
  class BrakesState:
3673
4060
  """State of the robot joint brakes. Each joint contains a brake which can be engaged when the robot is at a standstill to prevent the robot from moving.
@@ -4211,7 +4598,7 @@ class ErrorResponse:
4211
4598
  if value is None:
4212
4599
  return [False, "error is required for ErrorResponse"]
4213
4600
 
4214
- 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', 'invalid_space_specified', 'invalid_parameters', 'routine_does_not_exist', 'cannot_play_routine', 'routine_must_be_playing', 'cannot_change_ros_state', 'io_safeguard_error']) or isinstance(value, ErrorEnum)):
4601
+ 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', 'invalid_space_specified', 'invalid_parameters', 'routine_does_not_exist', 'cannot_play_routine', 'routine_must_be_playing', 'cannot_change_ros_state', 'io_safeguard_error', 'robot_out_of_compliance_bounds']) or isinstance(value, ErrorEnum)):
4215
4602
  return [False, "error must be of type ErrorEnum for ErrorResponse, got " + type(value).__name__]
4216
4603
 
4217
4604
  return [True, ""]
@@ -4548,12 +4935,24 @@ def serialize_force_unit(data: ForceUnit) -> object:
4548
4935
  "value": None if data.value is None else serialize_f_64(data.value),
4549
4936
  }
4550
4937
 
4551
- @dataclass
4552
- class IOStateResponse:
4553
- """Response to a query for the current state of I/O."""
4554
- state: Union[IOStateMap, None] = None
4938
+ SecondaryBotGripperBounds = Dict[str, GripperBounds]
4555
4939
 
4556
- def validate_state(self, value: IOStateMap) -> Tuple[bool, str]:
4940
+ def parse_secondary_bot_gripper_bounds(data: object) -> SecondaryBotGripperBounds:
4941
+ return {
4942
+ parse_str(key): parse_gripper_bounds(value) for key, value in data.items()
4943
+ }
4944
+
4945
+ def serialize_secondary_bot_gripper_bounds(data: SecondaryBotGripperBounds) -> object:
4946
+ return {
4947
+ serialize_str(key): serialize_gripper_bounds(value) for key, value in data.items()
4948
+ }
4949
+
4950
+ @dataclass
4951
+ class IOStateResponse:
4952
+ """Response to a query for the current state of I/O."""
4953
+ state: Union[IOStateMap, None] = None
4954
+
4955
+ def validate_state(self, value: IOStateMap) -> Tuple[bool, str]:
4557
4956
  if value is None:
4558
4957
  return [True, ""]
4559
4958
 
@@ -4901,6 +5300,7 @@ class SpeedProfile:
4901
5300
  max_joint_speeds: Union[MaxJointSpeeds, None] = None
4902
5301
  max_joint_accelerations: Union[MaxJointAcclerations, None] = None
4903
5302
  max_tooltip_speed: Union[float, None] = None
5303
+ max_joint_torques: Union[MaxJointTorques, None] = None
4904
5304
  base_acceleration_scaling: Union[float, None] = None
4905
5305
  base_velocity_scaling: Union[float, None] = None
4906
5306
  scaling_factor: Union[float, None] = None
@@ -4932,6 +5332,15 @@ class SpeedProfile:
4932
5332
 
4933
5333
  return [True, ""]
4934
5334
 
5335
+ def validate_max_joint_torques(self, value: MaxJointTorques) -> Tuple[bool, str]:
5336
+ if value is None:
5337
+ return [True, ""]
5338
+
5339
+ if not (isinstance(value, tuple) and len(value) == 6):
5340
+ return [False, "max_joint_torques must be of type MaxJointTorques for SpeedProfile, got " + type(value).__name__]
5341
+
5342
+ return [True, ""]
5343
+
4935
5344
  def validate_base_acceleration_scaling(self, value: float) -> Tuple[bool, str]:
4936
5345
  if value is None:
4937
5346
  return [True, ""]
@@ -4968,6 +5377,9 @@ class SpeedProfile:
4968
5377
  if not is_valid:
4969
5378
  raise TypeError(error_str)
4970
5379
  is_valid, error_str = self.validate_max_tooltip_speed(self.max_tooltip_speed)
5380
+ if not is_valid:
5381
+ raise TypeError(error_str)
5382
+ is_valid, error_str = self.validate_max_joint_torques(self.max_joint_torques)
4971
5383
  if not is_valid:
4972
5384
  raise TypeError(error_str)
4973
5385
  is_valid, error_str = self.validate_base_acceleration_scaling(self.base_acceleration_scaling)
@@ -4985,6 +5397,7 @@ def parse_speed_profile(data: object):
4985
5397
  max_joint_speeds=parse_max_joint_speeds(data["max_joint_speeds"]) if "max_joint_speeds" in data and data.get("max_joint_speeds") is not None else None,
4986
5398
  max_joint_accelerations=parse_max_joint_acclerations(data["max_joint_accelerations"]) if "max_joint_accelerations" in data and data.get("max_joint_accelerations") is not None else None,
4987
5399
  max_tooltip_speed=parse_f_64(data["max_tooltip_speed"]) if "max_tooltip_speed" in data and data.get("max_tooltip_speed") is not None else None,
5400
+ max_joint_torques=parse_max_joint_torques(data["max_joint_torques"]) if "max_joint_torques" in data and data.get("max_joint_torques") is not None else None,
4988
5401
  base_acceleration_scaling=parse_f_64(data["base_acceleration_scaling"]) if "base_acceleration_scaling" in data and data.get("base_acceleration_scaling") is not None else None,
4989
5402
  base_velocity_scaling=parse_f_64(data["base_velocity_scaling"]) if "base_velocity_scaling" in data and data.get("base_velocity_scaling") is not None else None,
4990
5403
  scaling_factor=parse_f_64(data["scaling_factor"]) if "scaling_factor" in data and data.get("scaling_factor") is not None else None,
@@ -4995,6 +5408,7 @@ def serialize_speed_profile(data: SpeedProfile) -> object:
4995
5408
  "max_joint_speeds": None if data.max_joint_speeds is None else serialize_max_joint_speeds(data.max_joint_speeds),
4996
5409
  "max_joint_accelerations": None if data.max_joint_accelerations is None else serialize_max_joint_acclerations(data.max_joint_accelerations),
4997
5410
  "max_tooltip_speed": None if data.max_tooltip_speed is None else serialize_f_64(data.max_tooltip_speed),
5411
+ "max_joint_torques": None if data.max_joint_torques is None else serialize_max_joint_torques(data.max_joint_torques),
4998
5412
  "base_acceleration_scaling": None if data.base_acceleration_scaling is None else serialize_f_64(data.base_acceleration_scaling),
4999
5413
  "base_velocity_scaling": None if data.base_velocity_scaling is None else serialize_f_64(data.base_velocity_scaling),
5000
5414
  "scaling_factor": None if data.scaling_factor is None else serialize_f_64(data.scaling_factor),
@@ -6036,6 +6450,124 @@ def serialize_robot_control_mode(data: RobotControlMode) -> object:
6036
6450
  "kind": None if data.kind is None else serialize_robot_control_mode_enum(data.kind),
6037
6451
  }
6038
6452
 
6453
+ SecondaryBotRobotFrame = Dict[str, RobotFrame]
6454
+
6455
+ def parse_secondary_bot_robot_frame(data: object) -> SecondaryBotRobotFrame:
6456
+ return {
6457
+ parse_str(key): parse_robot_frame(value) for key, value in data.items()
6458
+ }
6459
+
6460
+ def serialize_secondary_bot_robot_frame(data: SecondaryBotRobotFrame) -> object:
6461
+ return {
6462
+ serialize_str(key): serialize_robot_frame(value) for key, value in data.items()
6463
+ }
6464
+
6465
+ @dataclass
6466
+ class RobotiqEPickGripperCommandRequest:
6467
+ """Control the Robotiq EPick vacuum gripper
6468
+ """
6469
+ control_kind: Union[RobotiqEPickControlKindEnum, None] = None
6470
+ mode: Union[str, None] = None
6471
+ target_force_percent: Union[float, None] = None
6472
+ min_force_percent: Union[float, None] = None
6473
+ timeout_ms: Union[float, None] = None
6474
+ blow_off_pressure_percent: Union[float, None] = None
6475
+
6476
+ def validate_control_kind(self, value: RobotiqEPickControlKindEnum) -> Tuple[bool, str]:
6477
+ if value is None:
6478
+ return [False, "control_kind is required for RobotiqEPickGripperCommandRequest"]
6479
+
6480
+ if not ((isinstance(value, str) and RobotiqEPickControlKindEnum in ['grip', 'release']) or isinstance(value, RobotiqEPickControlKindEnum)):
6481
+ return [False, "control_kind must be of type RobotiqEPickControlKindEnum for RobotiqEPickGripperCommandRequest, got " + type(value).__name__]
6482
+
6483
+ return [True, ""]
6484
+
6485
+ def validate_mode(self, value: str) -> Tuple[bool, str]:
6486
+ if value is None:
6487
+ return [True, ""]
6488
+
6489
+ if not isinstance(value, str):
6490
+ return [False, "mode must be of type str for RobotiqEPickGripperCommandRequest, got " + type(value).__name__]
6491
+
6492
+ return [True, ""]
6493
+
6494
+ def validate_target_force_percent(self, value: float) -> Tuple[bool, str]:
6495
+ if value is None:
6496
+ return [True, ""]
6497
+
6498
+ if not isinstance(value, float):
6499
+ return [False, "target_force_percent must be of type float for RobotiqEPickGripperCommandRequest, got " + type(value).__name__]
6500
+
6501
+ return [True, ""]
6502
+
6503
+ def validate_min_force_percent(self, value: float) -> Tuple[bool, str]:
6504
+ if value is None:
6505
+ return [True, ""]
6506
+
6507
+ if not isinstance(value, float):
6508
+ return [False, "min_force_percent must be of type float for RobotiqEPickGripperCommandRequest, got " + type(value).__name__]
6509
+
6510
+ return [True, ""]
6511
+
6512
+ def validate_timeout_ms(self, value: float) -> Tuple[bool, str]:
6513
+ if value is None:
6514
+ return [True, ""]
6515
+
6516
+ if not isinstance(value, float):
6517
+ return [False, "timeout_ms must be of type float for RobotiqEPickGripperCommandRequest, got " + type(value).__name__]
6518
+
6519
+ return [True, ""]
6520
+
6521
+ def validate_blow_off_pressure_percent(self, value: float) -> Tuple[bool, str]:
6522
+ if value is None:
6523
+ return [True, ""]
6524
+
6525
+ if not isinstance(value, float):
6526
+ return [False, "blow_off_pressure_percent must be of type float for RobotiqEPickGripperCommandRequest, got " + type(value).__name__]
6527
+
6528
+ return [True, ""]
6529
+
6530
+ def __post_init__(self):
6531
+ # Type check incoming model - raise error if invalid (required or wrong type)
6532
+ is_valid, error_str = self.validate_control_kind(self.control_kind)
6533
+ if not is_valid:
6534
+ raise TypeError(error_str)
6535
+ is_valid, error_str = self.validate_mode(self.mode)
6536
+ if not is_valid:
6537
+ raise TypeError(error_str)
6538
+ is_valid, error_str = self.validate_target_force_percent(self.target_force_percent)
6539
+ if not is_valid:
6540
+ raise TypeError(error_str)
6541
+ is_valid, error_str = self.validate_min_force_percent(self.min_force_percent)
6542
+ if not is_valid:
6543
+ raise TypeError(error_str)
6544
+ is_valid, error_str = self.validate_timeout_ms(self.timeout_ms)
6545
+ if not is_valid:
6546
+ raise TypeError(error_str)
6547
+ is_valid, error_str = self.validate_blow_off_pressure_percent(self.blow_off_pressure_percent)
6548
+ if not is_valid:
6549
+ raise TypeError(error_str)
6550
+
6551
+ def parse_robotiq_e_pick_gripper_command_request(data: object):
6552
+ return RobotiqEPickGripperCommandRequest(
6553
+ control_kind=parse_robotiq_e_pick_control_kind_enum(data["control_kind"]) if "control_kind" in data and data.get("control_kind") is not None else None,
6554
+ mode=parse_str(data["mode"]) if "mode" in data and data.get("mode") is not None else None,
6555
+ target_force_percent=parse_f_64(data["target_force_percent"]) if "target_force_percent" in data and data.get("target_force_percent") is not None else None,
6556
+ min_force_percent=parse_f_64(data["min_force_percent"]) if "min_force_percent" in data and data.get("min_force_percent") is not None else None,
6557
+ timeout_ms=parse_f_64(data["timeout_ms"]) if "timeout_ms" in data and data.get("timeout_ms") is not None else None,
6558
+ blow_off_pressure_percent=parse_f_64(data["blow_off_pressure_percent"]) if "blow_off_pressure_percent" in data and data.get("blow_off_pressure_percent") is not None else None,
6559
+ )
6560
+
6561
+ def serialize_robotiq_e_pick_gripper_command_request(data: RobotiqEPickGripperCommandRequest) -> object:
6562
+ return {
6563
+ "control_kind": serialize_robotiq_e_pick_control_kind_enum(data.control_kind),
6564
+ "mode": None if data.mode is None else serialize_str(data.mode),
6565
+ "target_force_percent": None if data.target_force_percent is None else serialize_f_64(data.target_force_percent),
6566
+ "min_force_percent": None if data.min_force_percent is None else serialize_f_64(data.min_force_percent),
6567
+ "timeout_ms": None if data.timeout_ms is None else serialize_f_64(data.timeout_ms),
6568
+ "blow_off_pressure_percent": None if data.blow_off_pressure_percent is None else serialize_f_64(data.blow_off_pressure_percent),
6569
+ }
6570
+
6039
6571
  @dataclass
6040
6572
  class PlayRoutineResponse:
6041
6573
  """Status response informs user of of robot state"""
@@ -6547,6 +7079,59 @@ def serialize_save_recording_response(data: SaveRecordingResponse) -> object:
6547
7079
  "errors": None if data.errors is None else serialize_string_array(data.errors),
6548
7080
  }
6549
7081
 
7082
+ @dataclass
7083
+ class StopRecordingRequest:
7084
+ """Request to stop recording movement and camera data"""
7085
+ delete: Union[bool, None] = None
7086
+ tags: Union[StringArray, None] = None
7087
+
7088
+ def validate_delete(self, value: bool) -> Tuple[bool, str]:
7089
+ if value is None:
7090
+ return [True, ""]
7091
+
7092
+ if not isinstance(value, bool):
7093
+ return [False, "delete must be of type bool for StopRecordingRequest, got " + type(value).__name__]
7094
+
7095
+ return [True, ""]
7096
+
7097
+ def validate_tags(self, value: StringArray) -> Tuple[bool, str]:
7098
+ if value is None:
7099
+ return [True, ""]
7100
+
7101
+ if not (isinstance(value, list) and all(isinstance(x, str) for x in value)):
7102
+ return [False, "tags must be of type StringArray for StopRecordingRequest, got " + type(value).__name__]
7103
+
7104
+ return [True, ""]
7105
+
7106
+ def __post_init__(self):
7107
+ # Type check incoming model - raise error if invalid (required or wrong type)
7108
+ is_valid, error_str = self.validate_delete(self.delete)
7109
+ if not is_valid:
7110
+ raise TypeError(error_str)
7111
+ is_valid, error_str = self.validate_tags(self.tags)
7112
+ if not is_valid:
7113
+ raise TypeError(error_str)
7114
+
7115
+ def parse_stop_recording_request(data: object):
7116
+ return StopRecordingRequest(
7117
+ delete=parse_bool(data["delete"]) if "delete" in data and data.get("delete") is not None else None,
7118
+ tags=parse_string_array(data["tags"]) if "tags" in data and data.get("tags") is not None else None,
7119
+ )
7120
+
7121
+ def serialize_stop_recording_request(data: StopRecordingRequest) -> object:
7122
+ return {
7123
+ "delete": None if data.delete is None else serialize_bool(data.delete),
7124
+ "tags": None if data.tags is None else serialize_string_array(data.tags),
7125
+ }
7126
+
7127
+ TeleopClientList = List[TeleopClient]
7128
+
7129
+ def parse_teleop_client_list(data: object) -> TeleopClientList:
7130
+ return [parse_teleop_client(item) for item in data]
7131
+
7132
+ def serialize_teleop_client_list(data: TeleopClientList) -> List[object]:
7133
+ return [serialize_teleop_client(item) for item in data]
7134
+
6550
7135
  @dataclass
6551
7136
  class BotTeleopDetails:
6552
7137
  """Details of the bot"""
@@ -6557,6 +7142,11 @@ class BotTeleopDetails:
6557
7142
  isSecondary: Union[bool, None] = None
6558
7143
  isEnabled: Union[bool, None] = None
6559
7144
  status: Union[TeleopStatus, None] = None
7145
+ errors: Union[TeleopErrorArray, None] = None
7146
+ gripperBounds: Union[GripperBounds, None] = None
7147
+ robotFrame: Union[RobotFrame, None] = None
7148
+ filterType: Union[str, None] = None
7149
+ activeClientId: Union[str, None] = None
6560
7150
 
6561
7151
  def validate_botId(self, value: str) -> Tuple[bool, str]:
6562
7152
  if value is None:
@@ -6621,6 +7211,51 @@ class BotTeleopDetails:
6621
7211
 
6622
7212
  return [True, ""]
6623
7213
 
7214
+ def validate_errors(self, value: TeleopErrorArray) -> Tuple[bool, str]:
7215
+ if value is None:
7216
+ return [True, ""]
7217
+
7218
+ if not (isinstance(value, list) and all(isinstance(x, str) for x in value)):
7219
+ return [False, "errors must be of type TeleopErrorArray for BotTeleopDetails, got " + type(value).__name__]
7220
+
7221
+ return [True, ""]
7222
+
7223
+ def validate_gripperBounds(self, value: GripperBounds) -> Tuple[bool, str]:
7224
+ if value is None:
7225
+ return [True, ""]
7226
+
7227
+ if not isinstance(value, GripperBounds):
7228
+ return [False, "gripperBounds must be of type GripperBounds for BotTeleopDetails, got " + type(value).__name__]
7229
+
7230
+ return [True, ""]
7231
+
7232
+ def validate_robotFrame(self, value: RobotFrame) -> Tuple[bool, str]:
7233
+ if value is None:
7234
+ return [True, ""]
7235
+
7236
+ if not ((isinstance(value, str) and RobotFrame in ['world', 'tooltip']) or isinstance(value, RobotFrame)):
7237
+ return [False, "robotFrame must be of type RobotFrame for BotTeleopDetails, got " + type(value).__name__]
7238
+
7239
+ return [True, ""]
7240
+
7241
+ def validate_filterType(self, value: str) -> Tuple[bool, str]:
7242
+ if value is None:
7243
+ return [True, ""]
7244
+
7245
+ if not isinstance(value, str):
7246
+ return [False, "filterType must be of type str for BotTeleopDetails, got " + type(value).__name__]
7247
+
7248
+ return [True, ""]
7249
+
7250
+ def validate_activeClientId(self, value: str) -> Tuple[bool, str]:
7251
+ if value is None:
7252
+ return [True, ""]
7253
+
7254
+ if not isinstance(value, str):
7255
+ return [False, "activeClientId must be of type str for BotTeleopDetails, got " + type(value).__name__]
7256
+
7257
+ return [True, ""]
7258
+
6624
7259
  def __post_init__(self):
6625
7260
  # Type check incoming model - raise error if invalid (required or wrong type)
6626
7261
  is_valid, error_str = self.validate_botId(self.botId)
@@ -6644,6 +7279,21 @@ class BotTeleopDetails:
6644
7279
  is_valid, error_str = self.validate_status(self.status)
6645
7280
  if not is_valid:
6646
7281
  raise TypeError(error_str)
7282
+ is_valid, error_str = self.validate_errors(self.errors)
7283
+ if not is_valid:
7284
+ raise TypeError(error_str)
7285
+ is_valid, error_str = self.validate_gripperBounds(self.gripperBounds)
7286
+ if not is_valid:
7287
+ raise TypeError(error_str)
7288
+ is_valid, error_str = self.validate_robotFrame(self.robotFrame)
7289
+ if not is_valid:
7290
+ raise TypeError(error_str)
7291
+ is_valid, error_str = self.validate_filterType(self.filterType)
7292
+ if not is_valid:
7293
+ raise TypeError(error_str)
7294
+ is_valid, error_str = self.validate_activeClientId(self.activeClientId)
7295
+ if not is_valid:
7296
+ raise TypeError(error_str)
6647
7297
 
6648
7298
  def parse_bot_teleop_details(data: object):
6649
7299
  return BotTeleopDetails(
@@ -6654,6 +7304,11 @@ def parse_bot_teleop_details(data: object):
6654
7304
  isSecondary=parse_bool(data["isSecondary"]) if "isSecondary" in data and data.get("isSecondary") is not None else None,
6655
7305
  isEnabled=parse_bool(data["isEnabled"]) if "isEnabled" in data and data.get("isEnabled") is not None else None,
6656
7306
  status=parse_teleop_status(data["status"]) if "status" in data and data.get("status") is not None else None,
7307
+ errors=parse_teleop_error_array(data["errors"]) if "errors" in data and data.get("errors") is not None else None,
7308
+ gripperBounds=parse_gripper_bounds(data["gripperBounds"]) if "gripperBounds" in data and data.get("gripperBounds") is not None else None,
7309
+ robotFrame=parse_robot_frame(data["robotFrame"]) if "robotFrame" in data and data.get("robotFrame") is not None else None,
7310
+ filterType=parse_str(data["filterType"]) if "filterType" in data and data.get("filterType") is not None else None,
7311
+ activeClientId=parse_str(data["activeClientId"]) if "activeClientId" in data and data.get("activeClientId") is not None else None,
6657
7312
  )
6658
7313
 
6659
7314
  def serialize_bot_teleop_details(data: BotTeleopDetails) -> object:
@@ -6665,6 +7320,11 @@ def serialize_bot_teleop_details(data: BotTeleopDetails) -> object:
6665
7320
  "isSecondary": None if data.isSecondary is None else serialize_bool(data.isSecondary),
6666
7321
  "isEnabled": None if data.isEnabled is None else serialize_bool(data.isEnabled),
6667
7322
  "status": None if data.status is None else serialize_teleop_status(data.status),
7323
+ "errors": None if data.errors is None else serialize_teleop_error_array(data.errors),
7324
+ "gripperBounds": None if data.gripperBounds is None else serialize_gripper_bounds(data.gripperBounds),
7325
+ "robotFrame": None if data.robotFrame is None else serialize_robot_frame(data.robotFrame),
7326
+ "filterType": None if data.filterType is None else serialize_str(data.filterType),
7327
+ "activeClientId": None if data.activeClientId is None else serialize_str(data.activeClientId),
6668
7328
  }
6669
7329
 
6670
7330
  @dataclass
@@ -6803,6 +7463,7 @@ class CalibrationData:
6803
7463
  timestamp: Union[str, None] = None
6804
7464
  armSerial: Union[str, None] = None
6805
7465
  urdfParameters: Union[URDFParameters, None] = None
7466
+ elastokinConfig: Union[ElastokinConfig, None] = None
6806
7467
 
6807
7468
  def validate_timestamp(self, value: str) -> Tuple[bool, str]:
6808
7469
  if value is None:
@@ -6831,6 +7492,15 @@ class CalibrationData:
6831
7492
 
6832
7493
  return [True, ""]
6833
7494
 
7495
+ def validate_elastokinConfig(self, value: ElastokinConfig) -> Tuple[bool, str]:
7496
+ if value is None:
7497
+ return [True, ""]
7498
+
7499
+ if not isinstance(value, ElastokinConfig):
7500
+ return [False, "elastokinConfig must be of type ElastokinConfig for CalibrationData, got " + type(value).__name__]
7501
+
7502
+ return [True, ""]
7503
+
6834
7504
  def __post_init__(self):
6835
7505
  # Type check incoming model - raise error if invalid (required or wrong type)
6836
7506
  is_valid, error_str = self.validate_timestamp(self.timestamp)
@@ -6842,12 +7512,16 @@ class CalibrationData:
6842
7512
  is_valid, error_str = self.validate_urdfParameters(self.urdfParameters)
6843
7513
  if not is_valid:
6844
7514
  raise TypeError(error_str)
7515
+ is_valid, error_str = self.validate_elastokinConfig(self.elastokinConfig)
7516
+ if not is_valid:
7517
+ raise TypeError(error_str)
6845
7518
 
6846
7519
  def parse_calibration_data(data: object):
6847
7520
  return CalibrationData(
6848
7521
  timestamp=parse_str(data["timestamp"]) if "timestamp" in data and data.get("timestamp") is not None else None,
6849
7522
  armSerial=parse_str(data["armSerial"]) if "armSerial" in data and data.get("armSerial") is not None else None,
6850
7523
  urdfParameters=parse_urdf_parameters(data["urdfParameters"]) if "urdfParameters" in data and data.get("urdfParameters") is not None else None,
7524
+ elastokinConfig=parse_elastokin_config(data["elastokinConfig"]) if "elastokinConfig" in data and data.get("elastokinConfig") is not None else None,
6851
7525
  )
6852
7526
 
6853
7527
  def serialize_calibration_data(data: CalibrationData) -> object:
@@ -6855,6 +7529,52 @@ def serialize_calibration_data(data: CalibrationData) -> object:
6855
7529
  "timestamp": serialize_str(data.timestamp),
6856
7530
  "armSerial": serialize_str(data.armSerial),
6857
7531
  "urdfParameters": serialize_urdf_parameters(data.urdfParameters),
7532
+ "elastokinConfig": None if data.elastokinConfig is None else serialize_elastokin_config(data.elastokinConfig),
7533
+ }
7534
+
7535
+ @dataclass
7536
+ class SetGripperBoundsRequest:
7537
+ """Request to set gripper bounds for primary and secondary bots"""
7538
+ primary: Union[GripperBounds, None] = None
7539
+ secondary: Union[SecondaryBotGripperBounds, None] = None
7540
+
7541
+ def validate_primary(self, value: GripperBounds) -> Tuple[bool, str]:
7542
+ if value is None:
7543
+ return [False, "primary is required for SetGripperBoundsRequest"]
7544
+
7545
+ if not isinstance(value, GripperBounds):
7546
+ return [False, "primary must be of type GripperBounds for SetGripperBoundsRequest, got " + type(value).__name__]
7547
+
7548
+ return [True, ""]
7549
+
7550
+ def validate_secondary(self, value: SecondaryBotGripperBounds) -> Tuple[bool, str]:
7551
+ if value is None:
7552
+ return [True, ""]
7553
+
7554
+ if not (isinstance(value, dict) and all((isinstance(k, str) and isinstance(val, GripperBounds)) for k, val in value.items())):
7555
+ return [False, "secondary must be of type SecondaryBotGripperBounds for SetGripperBoundsRequest, got " + type(value).__name__]
7556
+
7557
+ return [True, ""]
7558
+
7559
+ def __post_init__(self):
7560
+ # Type check incoming model - raise error if invalid (required or wrong type)
7561
+ is_valid, error_str = self.validate_primary(self.primary)
7562
+ if not is_valid:
7563
+ raise TypeError(error_str)
7564
+ is_valid, error_str = self.validate_secondary(self.secondary)
7565
+ if not is_valid:
7566
+ raise TypeError(error_str)
7567
+
7568
+ def parse_set_gripper_bounds_request(data: object):
7569
+ return SetGripperBoundsRequest(
7570
+ primary=parse_gripper_bounds(data["primary"]) if "primary" in data and data.get("primary") is not None else None,
7571
+ secondary=parse_secondary_bot_gripper_bounds(data["secondary"]) if "secondary" in data and data.get("secondary") is not None else None,
7572
+ )
7573
+
7574
+ def serialize_set_gripper_bounds_request(data: SetGripperBoundsRequest) -> object:
7575
+ return {
7576
+ "primary": serialize_gripper_bounds(data.primary),
7577
+ "secondary": None if data.secondary is None else serialize_secondary_bot_gripper_bounds(data.secondary),
6858
7578
  }
6859
7579
 
6860
7580
  ArmJointRotationsList = List[ArmJointRotations]
@@ -7199,229 +7919,230 @@ def serialize_on_robot_3_fg_15_gripper_command_request(data: OnRobot3FG15Gripper
7199
7919
  }
7200
7920
 
7201
7921
  @dataclass
7202
- class SchunkEGxGripperCommandRequest:
7203
- """Control the Schunk EGU / EGK gripper (end effector) of the robot
7922
+ class Robotiq2FGripperCommandRequest:
7923
+ """Control the Robotiq 2F parallel jaw gripper (2F-85 / 2F-140)
7204
7924
  """
7925
+ control_kind: Union[Robotiq2FControlKindEnum, None] = None
7205
7926
  target_grip_width: Union[LinearUnit, None] = None
7206
- control_kind: Union[SchunkEGxControlKindEnum, None] = None
7927
+ target_speed: Union[float, None] = None
7928
+ target_force: Union[ForceUnit, None] = None
7929
+
7930
+ def validate_control_kind(self, value: Robotiq2FControlKindEnum) -> Tuple[bool, str]:
7931
+ if value is None:
7932
+ return [False, "control_kind is required for Robotiq2FGripperCommandRequest"]
7933
+
7934
+ if not ((isinstance(value, str) and Robotiq2FControlKindEnum in ['move']) or isinstance(value, Robotiq2FControlKindEnum)):
7935
+ return [False, "control_kind must be of type Robotiq2FControlKindEnum for Robotiq2FGripperCommandRequest, got " + type(value).__name__]
7936
+
7937
+ return [True, ""]
7207
7938
 
7208
7939
  def validate_target_grip_width(self, value: LinearUnit) -> Tuple[bool, str]:
7209
7940
  if value is None:
7210
- return [True, ""]
7941
+ return [False, "target_grip_width is required for Robotiq2FGripperCommandRequest"]
7211
7942
 
7212
7943
  if not isinstance(value, LinearUnit):
7213
- return [False, "target_grip_width must be of type LinearUnit for SchunkEGxGripperCommandRequest, got " + type(value).__name__]
7944
+ return [False, "target_grip_width must be of type LinearUnit for Robotiq2FGripperCommandRequest, got " + type(value).__name__]
7214
7945
 
7215
7946
  return [True, ""]
7216
7947
 
7217
- def validate_control_kind(self, value: SchunkEGxControlKindEnum) -> Tuple[bool, str]:
7948
+ def validate_target_speed(self, value: float) -> Tuple[bool, str]:
7218
7949
  if value is None:
7219
- return [False, "control_kind is required for SchunkEGxGripperCommandRequest"]
7950
+ return [False, "target_speed is required for Robotiq2FGripperCommandRequest"]
7220
7951
 
7221
- if not ((isinstance(value, str) and SchunkEGxControlKindEnum in ['move']) or isinstance(value, SchunkEGxControlKindEnum)):
7222
- return [False, "control_kind must be of type SchunkEGxControlKindEnum for SchunkEGxGripperCommandRequest, got " + type(value).__name__]
7952
+ if not isinstance(value, float):
7953
+ return [False, "target_speed must be of type float for Robotiq2FGripperCommandRequest, got " + type(value).__name__]
7954
+
7955
+ return [True, ""]
7956
+
7957
+ def validate_target_force(self, value: ForceUnit) -> Tuple[bool, str]:
7958
+ if value is None:
7959
+ return [False, "target_force is required for Robotiq2FGripperCommandRequest"]
7960
+
7961
+ if not isinstance(value, ForceUnit):
7962
+ return [False, "target_force must be of type ForceUnit for Robotiq2FGripperCommandRequest, got " + type(value).__name__]
7223
7963
 
7224
7964
  return [True, ""]
7225
7965
 
7226
7966
  def __post_init__(self):
7227
7967
  # Type check incoming model - raise error if invalid (required or wrong type)
7968
+ is_valid, error_str = self.validate_control_kind(self.control_kind)
7969
+ if not is_valid:
7970
+ raise TypeError(error_str)
7228
7971
  is_valid, error_str = self.validate_target_grip_width(self.target_grip_width)
7229
7972
  if not is_valid:
7230
7973
  raise TypeError(error_str)
7231
- is_valid, error_str = self.validate_control_kind(self.control_kind)
7974
+ is_valid, error_str = self.validate_target_speed(self.target_speed)
7975
+ if not is_valid:
7976
+ raise TypeError(error_str)
7977
+ is_valid, error_str = self.validate_target_force(self.target_force)
7232
7978
  if not is_valid:
7233
7979
  raise TypeError(error_str)
7234
7980
 
7235
- def parse_schunk_e_gx_gripper_command_request(data: object):
7236
- return SchunkEGxGripperCommandRequest(
7981
+ def parse_robotiq_2_f_gripper_command_request(data: object):
7982
+ return Robotiq2FGripperCommandRequest(
7983
+ control_kind=parse_robotiq_2_f_control_kind_enum(data["control_kind"]) if "control_kind" in data and data.get("control_kind") is not None else None,
7237
7984
  target_grip_width=parse_linear_unit(data["target_grip_width"]) if "target_grip_width" in data and data.get("target_grip_width") is not None else None,
7238
- control_kind=parse_schunk_e_gx_control_kind_enum(data["control_kind"]) if "control_kind" in data and data.get("control_kind") is not None else None,
7985
+ target_speed=parse_f_64(data["target_speed"]) if "target_speed" in data and data.get("target_speed") is not None else None,
7986
+ target_force=parse_force_unit(data["target_force"]) if "target_force" in data and data.get("target_force") is not None else None,
7239
7987
  )
7240
7988
 
7241
- def serialize_schunk_e_gx_gripper_command_request(data: SchunkEGxGripperCommandRequest) -> object:
7989
+ def serialize_robotiq_2_f_gripper_command_request(data: Robotiq2FGripperCommandRequest) -> object:
7242
7990
  return {
7243
- "target_grip_width": None if data.target_grip_width is None else serialize_linear_unit(data.target_grip_width),
7244
- "control_kind": serialize_schunk_e_gx_control_kind_enum(data.control_kind),
7991
+ "control_kind": serialize_robotiq_2_f_control_kind_enum(data.control_kind),
7992
+ "target_grip_width": serialize_linear_unit(data.target_grip_width),
7993
+ "target_speed": serialize_f_64(data.target_speed),
7994
+ "target_force": serialize_force_unit(data.target_force),
7245
7995
  }
7246
7996
 
7247
7997
  @dataclass
7248
- class OffsetConfig:
7249
- """Config of the offset"""
7250
- position: Union[Position, None] = None
7251
- orientation: Union[Quaternion, None] = None
7998
+ class Robotiq2FGripperConfiguration:
7999
+ """Configuration for Robotiq 2F grippers (2F-85 / 2F-140)"""
8000
+ model_variant: Union[str, None] = None
8001
+ min_grip_width: Union[LinearUnit, None] = None
8002
+ max_grip_width: Union[LinearUnit, None] = None
7252
8003
 
7253
- def validate_position(self, value: Position) -> Tuple[bool, str]:
8004
+ def validate_model_variant(self, value: str) -> Tuple[bool, str]:
7254
8005
  if value is None:
7255
8006
  return [True, ""]
7256
8007
 
7257
- if not isinstance(value, Position):
7258
- return [False, "position must be of type Position for OffsetConfig, got " + type(value).__name__]
8008
+ if not isinstance(value, str):
8009
+ return [False, "model_variant must be of type str for Robotiq2FGripperConfiguration, got " + type(value).__name__]
7259
8010
 
7260
8011
  return [True, ""]
7261
8012
 
7262
- def validate_orientation(self, value: Quaternion) -> Tuple[bool, str]:
8013
+ def validate_min_grip_width(self, value: LinearUnit) -> Tuple[bool, str]:
7263
8014
  if value is None:
7264
8015
  return [True, ""]
7265
8016
 
7266
- if not isinstance(value, Quaternion):
7267
- return [False, "orientation must be of type Quaternion for OffsetConfig, got " + type(value).__name__]
8017
+ if not isinstance(value, LinearUnit):
8018
+ return [False, "min_grip_width must be of type LinearUnit for Robotiq2FGripperConfiguration, got " + type(value).__name__]
8019
+
8020
+ return [True, ""]
8021
+
8022
+ def validate_max_grip_width(self, value: LinearUnit) -> Tuple[bool, str]:
8023
+ if value is None:
8024
+ return [True, ""]
8025
+
8026
+ if not isinstance(value, LinearUnit):
8027
+ return [False, "max_grip_width must be of type LinearUnit for Robotiq2FGripperConfiguration, got " + type(value).__name__]
7268
8028
 
7269
8029
  return [True, ""]
7270
8030
 
7271
8031
  def __post_init__(self):
7272
8032
  # Type check incoming model - raise error if invalid (required or wrong type)
7273
- is_valid, error_str = self.validate_position(self.position)
8033
+ is_valid, error_str = self.validate_model_variant(self.model_variant)
7274
8034
  if not is_valid:
7275
8035
  raise TypeError(error_str)
7276
- is_valid, error_str = self.validate_orientation(self.orientation)
8036
+ is_valid, error_str = self.validate_min_grip_width(self.min_grip_width)
8037
+ if not is_valid:
8038
+ raise TypeError(error_str)
8039
+ is_valid, error_str = self.validate_max_grip_width(self.max_grip_width)
7277
8040
  if not is_valid:
7278
8041
  raise TypeError(error_str)
7279
8042
 
7280
- def parse_offset_config(data: object):
7281
- return OffsetConfig(
7282
- position=parse_position(data["position"]) if "position" in data and data.get("position") is not None else None,
7283
- orientation=parse_quaternion(data["orientation"]) if "orientation" in data and data.get("orientation") is not None else None,
8043
+ def parse_robotiq_2_f_gripper_configuration(data: object):
8044
+ return Robotiq2FGripperConfiguration(
8045
+ model_variant=parse_str(data["model_variant"]) if "model_variant" in data and data.get("model_variant") is not None else None,
8046
+ min_grip_width=parse_linear_unit(data["min_grip_width"]) if "min_grip_width" in data and data.get("min_grip_width") is not None else None,
8047
+ max_grip_width=parse_linear_unit(data["max_grip_width"]) if "max_grip_width" in data and data.get("max_grip_width") is not None else None,
7284
8048
  )
7285
8049
 
7286
- def serialize_offset_config(data: OffsetConfig) -> object:
8050
+ def serialize_robotiq_2_f_gripper_configuration(data: Robotiq2FGripperConfiguration) -> object:
7287
8051
  return {
7288
- "position": None if data.position is None else serialize_position(data.position),
7289
- "orientation": None if data.orientation is None else serialize_quaternion(data.orientation),
8052
+ "model_variant": None if data.model_variant is None else serialize_str(data.model_variant),
8053
+ "min_grip_width": None if data.min_grip_width is None else serialize_linear_unit(data.min_grip_width),
8054
+ "max_grip_width": None if data.max_grip_width is None else serialize_linear_unit(data.max_grip_width),
7290
8055
  }
7291
8056
 
7292
8057
  @dataclass
7293
- class GripperConfiguration:
7294
- """Configuration of gripper, also known as End Effector"""
7295
- kind: Union[GripperKindEnum, None] = None
7296
- onrobot_2fg7: Union[OnRobot2FG7GripperConfiguration, None] = None
7297
- onrobot_2fg14: Union[OnRobot2FG14GripperConfiguration, None] = None
7298
- onrobot_3fg15: Union[OnRobot3FG15GripperConfiguration, None] = None
7299
- onrobot_screwdriver: Union[OnRobotScrewdriverConfiguration, None] = None
7300
- dh_ag: Union[DHAGGripperConfiguration, None] = None
7301
- dh_pgc: Union[DHPGCGripperConfiguration, None] = None
7302
- dh_cgi: Union[DHCGIGripperConfiguration, None] = None
7303
-
7304
- def validate_kind(self, value: GripperKindEnum) -> Tuple[bool, str]:
7305
- if value is None:
7306
- return [False, "kind is required for GripperConfiguration"]
7307
-
7308
- if not ((isinstance(value, str) and GripperKindEnum in ['onrobot_2fg7', 'onrobot_2fg14', 'onrobot_3fg15', 'onrobot_screwdriver', 'dh_ag', 'dh_pgc', 'dh_cgi', 'schunk_egx', 'none_connected']) or isinstance(value, GripperKindEnum)):
7309
- return [False, "kind must be of type GripperKindEnum for GripperConfiguration, got " + type(value).__name__]
7310
-
7311
- return [True, ""]
7312
-
7313
- def validate_onrobot_2fg7(self, value: OnRobot2FG7GripperConfiguration) -> Tuple[bool, str]:
7314
- if value is None:
7315
- return [True, ""]
7316
-
7317
- if not isinstance(value, OnRobot2FG7GripperConfiguration):
7318
- return [False, "onrobot_2fg7 must be of type OnRobot2FG7GripperConfiguration for GripperConfiguration, got " + type(value).__name__]
7319
-
7320
- return [True, ""]
8058
+ class SchunkEGxGripperCommandRequest:
8059
+ """Control the Schunk EGU / EGK gripper (end effector) of the robot
8060
+ """
8061
+ target_grip_width: Union[LinearUnit, None] = None
8062
+ control_kind: Union[SchunkEGxControlKindEnum, None] = None
7321
8063
 
7322
- def validate_onrobot_2fg14(self, value: OnRobot2FG14GripperConfiguration) -> Tuple[bool, str]:
8064
+ def validate_target_grip_width(self, value: LinearUnit) -> Tuple[bool, str]:
7323
8065
  if value is None:
7324
8066
  return [True, ""]
7325
8067
 
7326
- if not isinstance(value, OnRobot2FG14GripperConfiguration):
7327
- return [False, "onrobot_2fg14 must be of type OnRobot2FG14GripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8068
+ if not isinstance(value, LinearUnit):
8069
+ return [False, "target_grip_width must be of type LinearUnit for SchunkEGxGripperCommandRequest, got " + type(value).__name__]
7328
8070
 
7329
8071
  return [True, ""]
7330
8072
 
7331
- def validate_onrobot_3fg15(self, value: OnRobot3FG15GripperConfiguration) -> Tuple[bool, str]:
8073
+ def validate_control_kind(self, value: SchunkEGxControlKindEnum) -> Tuple[bool, str]:
7332
8074
  if value is None:
7333
- return [True, ""]
8075
+ return [False, "control_kind is required for SchunkEGxGripperCommandRequest"]
7334
8076
 
7335
- if not isinstance(value, OnRobot3FG15GripperConfiguration):
7336
- return [False, "onrobot_3fg15 must be of type OnRobot3FG15GripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8077
+ if not ((isinstance(value, str) and SchunkEGxControlKindEnum in ['move']) or isinstance(value, SchunkEGxControlKindEnum)):
8078
+ return [False, "control_kind must be of type SchunkEGxControlKindEnum for SchunkEGxGripperCommandRequest, got " + type(value).__name__]
7337
8079
 
7338
8080
  return [True, ""]
7339
8081
 
7340
- def validate_onrobot_screwdriver(self, value: OnRobotScrewdriverConfiguration) -> Tuple[bool, str]:
7341
- if value is None:
7342
- return [True, ""]
7343
-
7344
- if not isinstance(value, OnRobotScrewdriverConfiguration):
7345
- return [False, "onrobot_screwdriver must be of type OnRobotScrewdriverConfiguration for GripperConfiguration, got " + type(value).__name__]
7346
-
7347
- return [True, ""]
8082
+ def __post_init__(self):
8083
+ # Type check incoming model - raise error if invalid (required or wrong type)
8084
+ is_valid, error_str = self.validate_target_grip_width(self.target_grip_width)
8085
+ if not is_valid:
8086
+ raise TypeError(error_str)
8087
+ is_valid, error_str = self.validate_control_kind(self.control_kind)
8088
+ if not is_valid:
8089
+ raise TypeError(error_str)
7348
8090
 
7349
- def validate_dh_ag(self, value: DHAGGripperConfiguration) -> Tuple[bool, str]:
7350
- if value is None:
7351
- return [True, ""]
8091
+ def parse_schunk_e_gx_gripper_command_request(data: object):
8092
+ return SchunkEGxGripperCommandRequest(
8093
+ target_grip_width=parse_linear_unit(data["target_grip_width"]) if "target_grip_width" in data and data.get("target_grip_width") is not None else None,
8094
+ control_kind=parse_schunk_e_gx_control_kind_enum(data["control_kind"]) if "control_kind" in data and data.get("control_kind") is not None else None,
8095
+ )
7352
8096
 
7353
- if not isinstance(value, DHAGGripperConfiguration):
7354
- return [False, "dh_ag must be of type DHAGGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8097
+ def serialize_schunk_e_gx_gripper_command_request(data: SchunkEGxGripperCommandRequest) -> object:
8098
+ return {
8099
+ "target_grip_width": None if data.target_grip_width is None else serialize_linear_unit(data.target_grip_width),
8100
+ "control_kind": serialize_schunk_e_gx_control_kind_enum(data.control_kind),
8101
+ }
7355
8102
 
7356
- return [True, ""]
8103
+ @dataclass
8104
+ class OffsetConfig:
8105
+ """Config of the offset"""
8106
+ position: Union[Position, None] = None
8107
+ orientation: Union[Quaternion, None] = None
7357
8108
 
7358
- def validate_dh_pgc(self, value: DHPGCGripperConfiguration) -> Tuple[bool, str]:
8109
+ def validate_position(self, value: Position) -> Tuple[bool, str]:
7359
8110
  if value is None:
7360
8111
  return [True, ""]
7361
8112
 
7362
- if not isinstance(value, DHPGCGripperConfiguration):
7363
- return [False, "dh_pgc must be of type DHPGCGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8113
+ if not isinstance(value, Position):
8114
+ return [False, "position must be of type Position for OffsetConfig, got " + type(value).__name__]
7364
8115
 
7365
8116
  return [True, ""]
7366
8117
 
7367
- def validate_dh_cgi(self, value: DHCGIGripperConfiguration) -> Tuple[bool, str]:
8118
+ def validate_orientation(self, value: Quaternion) -> Tuple[bool, str]:
7368
8119
  if value is None:
7369
8120
  return [True, ""]
7370
8121
 
7371
- if not isinstance(value, DHCGIGripperConfiguration):
7372
- return [False, "dh_cgi must be of type DHCGIGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8122
+ if not isinstance(value, Quaternion):
8123
+ return [False, "orientation must be of type Quaternion for OffsetConfig, got " + type(value).__name__]
7373
8124
 
7374
8125
  return [True, ""]
7375
8126
 
7376
8127
  def __post_init__(self):
7377
8128
  # Type check incoming model - raise error if invalid (required or wrong type)
7378
- is_valid, error_str = self.validate_kind(self.kind)
7379
- if not is_valid:
7380
- raise TypeError(error_str)
7381
- is_valid, error_str = self.validate_onrobot_2fg7(self.onrobot_2fg7)
7382
- if not is_valid:
7383
- raise TypeError(error_str)
7384
- is_valid, error_str = self.validate_onrobot_2fg14(self.onrobot_2fg14)
7385
- if not is_valid:
7386
- raise TypeError(error_str)
7387
- is_valid, error_str = self.validate_onrobot_3fg15(self.onrobot_3fg15)
7388
- if not is_valid:
7389
- raise TypeError(error_str)
7390
- is_valid, error_str = self.validate_onrobot_screwdriver(self.onrobot_screwdriver)
7391
- if not is_valid:
7392
- raise TypeError(error_str)
7393
- is_valid, error_str = self.validate_dh_ag(self.dh_ag)
7394
- if not is_valid:
7395
- raise TypeError(error_str)
7396
- is_valid, error_str = self.validate_dh_pgc(self.dh_pgc)
8129
+ is_valid, error_str = self.validate_position(self.position)
7397
8130
  if not is_valid:
7398
8131
  raise TypeError(error_str)
7399
- is_valid, error_str = self.validate_dh_cgi(self.dh_cgi)
8132
+ is_valid, error_str = self.validate_orientation(self.orientation)
7400
8133
  if not is_valid:
7401
8134
  raise TypeError(error_str)
7402
8135
 
7403
- def parse_gripper_configuration(data: object):
7404
- return GripperConfiguration(
7405
- kind=parse_gripper_kind_enum(data["kind"]) if "kind" in data and data.get("kind") is not None else None,
7406
- onrobot_2fg7=parse_on_robot_2_fg_7_gripper_configuration(data["onrobot_2fg7"]) if "onrobot_2fg7" in data and data.get("onrobot_2fg7") is not None else None,
7407
- onrobot_2fg14=parse_on_robot_2_fg_14_gripper_configuration(data["onrobot_2fg14"]) if "onrobot_2fg14" in data and data.get("onrobot_2fg14") is not None else None,
7408
- onrobot_3fg15=parse_on_robot_3_fg_15_gripper_configuration(data["onrobot_3fg15"]) if "onrobot_3fg15" in data and data.get("onrobot_3fg15") is not None else None,
7409
- onrobot_screwdriver=parse_on_robot_screwdriver_configuration(data["onrobot_screwdriver"]) if "onrobot_screwdriver" in data and data.get("onrobot_screwdriver") is not None else None,
7410
- dh_ag=parse_dhag_gripper_configuration(data["dh_ag"]) if "dh_ag" in data and data.get("dh_ag") is not None else None,
7411
- dh_pgc=parse_dhpgc_gripper_configuration(data["dh_pgc"]) if "dh_pgc" in data and data.get("dh_pgc") is not None else None,
7412
- dh_cgi=parse_dhcgi_gripper_configuration(data["dh_cgi"]) if "dh_cgi" in data and data.get("dh_cgi") is not None else None,
8136
+ def parse_offset_config(data: object):
8137
+ return OffsetConfig(
8138
+ position=parse_position(data["position"]) if "position" in data and data.get("position") is not None else None,
8139
+ orientation=parse_quaternion(data["orientation"]) if "orientation" in data and data.get("orientation") is not None else None,
7413
8140
  )
7414
8141
 
7415
- def serialize_gripper_configuration(data: GripperConfiguration) -> object:
8142
+ def serialize_offset_config(data: OffsetConfig) -> object:
7416
8143
  return {
7417
- "kind": serialize_gripper_kind_enum(data.kind),
7418
- "onrobot_2fg7": None if data.onrobot_2fg7 is None else serialize_on_robot_2_fg_7_gripper_configuration(data.onrobot_2fg7),
7419
- "onrobot_2fg14": None if data.onrobot_2fg14 is None else serialize_on_robot_2_fg_14_gripper_configuration(data.onrobot_2fg14),
7420
- "onrobot_3fg15": None if data.onrobot_3fg15 is None else serialize_on_robot_3_fg_15_gripper_configuration(data.onrobot_3fg15),
7421
- "onrobot_screwdriver": None if data.onrobot_screwdriver is None else serialize_on_robot_screwdriver_configuration(data.onrobot_screwdriver),
7422
- "dh_ag": None if data.dh_ag is None else serialize_dhag_gripper_configuration(data.dh_ag),
7423
- "dh_pgc": None if data.dh_pgc is None else serialize_dhpgc_gripper_configuration(data.dh_pgc),
7424
- "dh_cgi": None if data.dh_cgi is None else serialize_dhcgi_gripper_configuration(data.dh_cgi),
8144
+ "position": None if data.position is None else serialize_position(data.position),
8145
+ "orientation": None if data.orientation is None else serialize_quaternion(data.orientation),
7425
8146
  }
7426
8147
 
7427
8148
  @dataclass
@@ -7627,6 +8348,51 @@ def serialize_failure_state_response(data: FailureStateResponse) -> object:
7627
8348
  "failure": None if data.failure is None else serialize_failure_state_details(data.failure),
7628
8349
  }
7629
8350
 
8351
+ @dataclass
8352
+ class SetRobotFrameRequest:
8353
+ """Request to set robot frame"""
8354
+ primary: Union[RobotFrame, None] = None
8355
+ secondary: Union[SecondaryBotRobotFrame, None] = None
8356
+
8357
+ def validate_primary(self, value: RobotFrame) -> Tuple[bool, str]:
8358
+ if value is None:
8359
+ return [False, "primary is required for SetRobotFrameRequest"]
8360
+
8361
+ if not ((isinstance(value, str) and RobotFrame in ['world', 'tooltip']) or isinstance(value, RobotFrame)):
8362
+ return [False, "primary must be of type RobotFrame for SetRobotFrameRequest, got " + type(value).__name__]
8363
+
8364
+ return [True, ""]
8365
+
8366
+ def validate_secondary(self, value: SecondaryBotRobotFrame) -> Tuple[bool, str]:
8367
+ if value is None:
8368
+ return [True, ""]
8369
+
8370
+ if not (isinstance(value, dict) and all((isinstance(k, str) and ((isinstance(val, str) and RobotFrame in ['world', 'tooltip']) or isinstance(val, RobotFrame))) for k, val in value.items())):
8371
+ return [False, "secondary must be of type SecondaryBotRobotFrame for SetRobotFrameRequest, got " + type(value).__name__]
8372
+
8373
+ return [True, ""]
8374
+
8375
+ def __post_init__(self):
8376
+ # Type check incoming model - raise error if invalid (required or wrong type)
8377
+ is_valid, error_str = self.validate_primary(self.primary)
8378
+ if not is_valid:
8379
+ raise TypeError(error_str)
8380
+ is_valid, error_str = self.validate_secondary(self.secondary)
8381
+ if not is_valid:
8382
+ raise TypeError(error_str)
8383
+
8384
+ def parse_set_robot_frame_request(data: object):
8385
+ return SetRobotFrameRequest(
8386
+ primary=parse_robot_frame(data["primary"]) if "primary" in data and data.get("primary") is not None else None,
8387
+ secondary=parse_secondary_bot_robot_frame(data["secondary"]) if "secondary" in data and data.get("secondary") is not None else None,
8388
+ )
8389
+
8390
+ def serialize_set_robot_frame_request(data: SetRobotFrameRequest) -> object:
8391
+ return {
8392
+ "primary": serialize_robot_frame(data.primary),
8393
+ "secondary": None if data.secondary is None else serialize_secondary_bot_robot_frame(data.secondary),
8394
+ }
8395
+
7630
8396
  @dataclass
7631
8397
  class SensorsConfiguration:
7632
8398
  """Configuration of all sensors defined in custom equipment"""
@@ -7855,6 +8621,171 @@ def serialize_active_calibration_container(data: ActiveCalibrationContainer) ->
7855
8621
  "calibrationData": None if data.calibrationData is None else serialize_calibration_data(data.calibrationData),
7856
8622
  }
7857
8623
 
8624
+ @dataclass
8625
+ class GripperConfiguration:
8626
+ """Configuration of gripper, also known as End Effector"""
8627
+ kind: Union[GripperKindEnum, None] = None
8628
+ onrobot_2fg7: Union[OnRobot2FG7GripperConfiguration, None] = None
8629
+ onrobot_2fg14: Union[OnRobot2FG14GripperConfiguration, None] = None
8630
+ onrobot_3fg15: Union[OnRobot3FG15GripperConfiguration, None] = None
8631
+ onrobot_screwdriver: Union[OnRobotScrewdriverConfiguration, None] = None
8632
+ dh_ag: Union[DHAGGripperConfiguration, None] = None
8633
+ dh_pgc: Union[DHPGCGripperConfiguration, None] = None
8634
+ dh_cgi: Union[DHCGIGripperConfiguration, None] = None
8635
+ robotiq_2f: Union[Robotiq2FGripperConfiguration, None] = None
8636
+ robotiq_epick: Union[RobotiqEPickGripperConfiguration, None] = None
8637
+
8638
+ def validate_kind(self, value: GripperKindEnum) -> Tuple[bool, str]:
8639
+ if value is None:
8640
+ return [False, "kind is required for GripperConfiguration"]
8641
+
8642
+ if not ((isinstance(value, str) and GripperKindEnum in ['onrobot_2fg7', 'onrobot_2fg14', 'onrobot_3fg15', 'onrobot_screwdriver', 'dh_ag', 'dh_pgc', 'dh_cgi', 'schunk_egx', 'robotiq_2f', 'robotiq_epick', 'none_connected']) or isinstance(value, GripperKindEnum)):
8643
+ return [False, "kind must be of type GripperKindEnum for GripperConfiguration, got " + type(value).__name__]
8644
+
8645
+ return [True, ""]
8646
+
8647
+ def validate_onrobot_2fg7(self, value: OnRobot2FG7GripperConfiguration) -> Tuple[bool, str]:
8648
+ if value is None:
8649
+ return [True, ""]
8650
+
8651
+ if not isinstance(value, OnRobot2FG7GripperConfiguration):
8652
+ return [False, "onrobot_2fg7 must be of type OnRobot2FG7GripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8653
+
8654
+ return [True, ""]
8655
+
8656
+ def validate_onrobot_2fg14(self, value: OnRobot2FG14GripperConfiguration) -> Tuple[bool, str]:
8657
+ if value is None:
8658
+ return [True, ""]
8659
+
8660
+ if not isinstance(value, OnRobot2FG14GripperConfiguration):
8661
+ return [False, "onrobot_2fg14 must be of type OnRobot2FG14GripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8662
+
8663
+ return [True, ""]
8664
+
8665
+ def validate_onrobot_3fg15(self, value: OnRobot3FG15GripperConfiguration) -> Tuple[bool, str]:
8666
+ if value is None:
8667
+ return [True, ""]
8668
+
8669
+ if not isinstance(value, OnRobot3FG15GripperConfiguration):
8670
+ return [False, "onrobot_3fg15 must be of type OnRobot3FG15GripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8671
+
8672
+ return [True, ""]
8673
+
8674
+ def validate_onrobot_screwdriver(self, value: OnRobotScrewdriverConfiguration) -> Tuple[bool, str]:
8675
+ if value is None:
8676
+ return [True, ""]
8677
+
8678
+ if not isinstance(value, OnRobotScrewdriverConfiguration):
8679
+ return [False, "onrobot_screwdriver must be of type OnRobotScrewdriverConfiguration for GripperConfiguration, got " + type(value).__name__]
8680
+
8681
+ return [True, ""]
8682
+
8683
+ def validate_dh_ag(self, value: DHAGGripperConfiguration) -> Tuple[bool, str]:
8684
+ if value is None:
8685
+ return [True, ""]
8686
+
8687
+ if not isinstance(value, DHAGGripperConfiguration):
8688
+ return [False, "dh_ag must be of type DHAGGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8689
+
8690
+ return [True, ""]
8691
+
8692
+ def validate_dh_pgc(self, value: DHPGCGripperConfiguration) -> Tuple[bool, str]:
8693
+ if value is None:
8694
+ return [True, ""]
8695
+
8696
+ if not isinstance(value, DHPGCGripperConfiguration):
8697
+ return [False, "dh_pgc must be of type DHPGCGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8698
+
8699
+ return [True, ""]
8700
+
8701
+ def validate_dh_cgi(self, value: DHCGIGripperConfiguration) -> Tuple[bool, str]:
8702
+ if value is None:
8703
+ return [True, ""]
8704
+
8705
+ if not isinstance(value, DHCGIGripperConfiguration):
8706
+ return [False, "dh_cgi must be of type DHCGIGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8707
+
8708
+ return [True, ""]
8709
+
8710
+ def validate_robotiq_2f(self, value: Robotiq2FGripperConfiguration) -> Tuple[bool, str]:
8711
+ if value is None:
8712
+ return [True, ""]
8713
+
8714
+ if not isinstance(value, Robotiq2FGripperConfiguration):
8715
+ return [False, "robotiq_2f must be of type Robotiq2FGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8716
+
8717
+ return [True, ""]
8718
+
8719
+ def validate_robotiq_epick(self, value: RobotiqEPickGripperConfiguration) -> Tuple[bool, str]:
8720
+ if value is None:
8721
+ return [True, ""]
8722
+
8723
+ if not isinstance(value, RobotiqEPickGripperConfiguration):
8724
+ return [False, "robotiq_epick must be of type RobotiqEPickGripperConfiguration for GripperConfiguration, got " + type(value).__name__]
8725
+
8726
+ return [True, ""]
8727
+
8728
+ def __post_init__(self):
8729
+ # Type check incoming model - raise error if invalid (required or wrong type)
8730
+ is_valid, error_str = self.validate_kind(self.kind)
8731
+ if not is_valid:
8732
+ raise TypeError(error_str)
8733
+ is_valid, error_str = self.validate_onrobot_2fg7(self.onrobot_2fg7)
8734
+ if not is_valid:
8735
+ raise TypeError(error_str)
8736
+ is_valid, error_str = self.validate_onrobot_2fg14(self.onrobot_2fg14)
8737
+ if not is_valid:
8738
+ raise TypeError(error_str)
8739
+ is_valid, error_str = self.validate_onrobot_3fg15(self.onrobot_3fg15)
8740
+ if not is_valid:
8741
+ raise TypeError(error_str)
8742
+ is_valid, error_str = self.validate_onrobot_screwdriver(self.onrobot_screwdriver)
8743
+ if not is_valid:
8744
+ raise TypeError(error_str)
8745
+ is_valid, error_str = self.validate_dh_ag(self.dh_ag)
8746
+ if not is_valid:
8747
+ raise TypeError(error_str)
8748
+ is_valid, error_str = self.validate_dh_pgc(self.dh_pgc)
8749
+ if not is_valid:
8750
+ raise TypeError(error_str)
8751
+ is_valid, error_str = self.validate_dh_cgi(self.dh_cgi)
8752
+ if not is_valid:
8753
+ raise TypeError(error_str)
8754
+ is_valid, error_str = self.validate_robotiq_2f(self.robotiq_2f)
8755
+ if not is_valid:
8756
+ raise TypeError(error_str)
8757
+ is_valid, error_str = self.validate_robotiq_epick(self.robotiq_epick)
8758
+ if not is_valid:
8759
+ raise TypeError(error_str)
8760
+
8761
+ def parse_gripper_configuration(data: object):
8762
+ return GripperConfiguration(
8763
+ kind=parse_gripper_kind_enum(data["kind"]) if "kind" in data and data.get("kind") is not None else None,
8764
+ onrobot_2fg7=parse_on_robot_2_fg_7_gripper_configuration(data["onrobot_2fg7"]) if "onrobot_2fg7" in data and data.get("onrobot_2fg7") is not None else None,
8765
+ onrobot_2fg14=parse_on_robot_2_fg_14_gripper_configuration(data["onrobot_2fg14"]) if "onrobot_2fg14" in data and data.get("onrobot_2fg14") is not None else None,
8766
+ onrobot_3fg15=parse_on_robot_3_fg_15_gripper_configuration(data["onrobot_3fg15"]) if "onrobot_3fg15" in data and data.get("onrobot_3fg15") is not None else None,
8767
+ onrobot_screwdriver=parse_on_robot_screwdriver_configuration(data["onrobot_screwdriver"]) if "onrobot_screwdriver" in data and data.get("onrobot_screwdriver") is not None else None,
8768
+ dh_ag=parse_dhag_gripper_configuration(data["dh_ag"]) if "dh_ag" in data and data.get("dh_ag") is not None else None,
8769
+ dh_pgc=parse_dhpgc_gripper_configuration(data["dh_pgc"]) if "dh_pgc" in data and data.get("dh_pgc") is not None else None,
8770
+ dh_cgi=parse_dhcgi_gripper_configuration(data["dh_cgi"]) if "dh_cgi" in data and data.get("dh_cgi") is not None else None,
8771
+ robotiq_2f=parse_robotiq_2_f_gripper_configuration(data["robotiq_2f"]) if "robotiq_2f" in data and data.get("robotiq_2f") is not None else None,
8772
+ robotiq_epick=parse_robotiq_e_pick_gripper_configuration(data["robotiq_epick"]) if "robotiq_epick" in data and data.get("robotiq_epick") is not None else None,
8773
+ )
8774
+
8775
+ def serialize_gripper_configuration(data: GripperConfiguration) -> object:
8776
+ return {
8777
+ "kind": serialize_gripper_kind_enum(data.kind),
8778
+ "onrobot_2fg7": None if data.onrobot_2fg7 is None else serialize_on_robot_2_fg_7_gripper_configuration(data.onrobot_2fg7),
8779
+ "onrobot_2fg14": None if data.onrobot_2fg14 is None else serialize_on_robot_2_fg_14_gripper_configuration(data.onrobot_2fg14),
8780
+ "onrobot_3fg15": None if data.onrobot_3fg15 is None else serialize_on_robot_3_fg_15_gripper_configuration(data.onrobot_3fg15),
8781
+ "onrobot_screwdriver": None if data.onrobot_screwdriver is None else serialize_on_robot_screwdriver_configuration(data.onrobot_screwdriver),
8782
+ "dh_ag": None if data.dh_ag is None else serialize_dhag_gripper_configuration(data.dh_ag),
8783
+ "dh_pgc": None if data.dh_pgc is None else serialize_dhpgc_gripper_configuration(data.dh_pgc),
8784
+ "dh_cgi": None if data.dh_cgi is None else serialize_dhcgi_gripper_configuration(data.dh_cgi),
8785
+ "robotiq_2f": None if data.robotiq_2f is None else serialize_robotiq_2_f_gripper_configuration(data.robotiq_2f),
8786
+ "robotiq_epick": None if data.robotiq_epick is None else serialize_robotiq_e_pick_gripper_configuration(data.robotiq_epick),
8787
+ }
8788
+
7858
8789
  @dataclass
7859
8790
  class GripperCommandRequest:
7860
8791
  """Control the gripper (end effector) of the robot
@@ -7867,12 +8798,14 @@ class GripperCommandRequest:
7867
8798
  dh_pgc: Union[DHPGCGripperCommandRequest, None] = None
7868
8799
  dh_cgi: Union[DHCGIGripperCommandRequest, None] = None
7869
8800
  schunk_egx: Union[SchunkEGxGripperCommandRequest, None] = None
8801
+ robotiq_2f: Union[Robotiq2FGripperCommandRequest, None] = None
8802
+ robotiq_epick: Union[RobotiqEPickGripperCommandRequest, None] = None
7870
8803
 
7871
8804
  def validate_kind(self, value: GripperKindEnum) -> Tuple[bool, str]:
7872
8805
  if value is None:
7873
8806
  return [False, "kind is required for GripperCommandRequest"]
7874
8807
 
7875
- if not ((isinstance(value, str) and GripperKindEnum in ['onrobot_2fg7', 'onrobot_2fg14', 'onrobot_3fg15', 'onrobot_screwdriver', 'dh_ag', 'dh_pgc', 'dh_cgi', 'schunk_egx', 'none_connected']) or isinstance(value, GripperKindEnum)):
8808
+ if not ((isinstance(value, str) and GripperKindEnum in ['onrobot_2fg7', 'onrobot_2fg14', 'onrobot_3fg15', 'onrobot_screwdriver', 'dh_ag', 'dh_pgc', 'dh_cgi', 'schunk_egx', 'robotiq_2f', 'robotiq_epick', 'none_connected']) or isinstance(value, GripperKindEnum)):
7876
8809
  return [False, "kind must be of type GripperKindEnum for GripperCommandRequest, got " + type(value).__name__]
7877
8810
 
7878
8811
  return [True, ""]
@@ -7940,6 +8873,24 @@ class GripperCommandRequest:
7940
8873
 
7941
8874
  return [True, ""]
7942
8875
 
8876
+ def validate_robotiq_2f(self, value: Robotiq2FGripperCommandRequest) -> Tuple[bool, str]:
8877
+ if value is None:
8878
+ return [True, ""]
8879
+
8880
+ if not isinstance(value, Robotiq2FGripperCommandRequest):
8881
+ return [False, "robotiq_2f must be of type Robotiq2FGripperCommandRequest for GripperCommandRequest, got " + type(value).__name__]
8882
+
8883
+ return [True, ""]
8884
+
8885
+ def validate_robotiq_epick(self, value: RobotiqEPickGripperCommandRequest) -> Tuple[bool, str]:
8886
+ if value is None:
8887
+ return [True, ""]
8888
+
8889
+ if not isinstance(value, RobotiqEPickGripperCommandRequest):
8890
+ return [False, "robotiq_epick must be of type RobotiqEPickGripperCommandRequest for GripperCommandRequest, got " + type(value).__name__]
8891
+
8892
+ return [True, ""]
8893
+
7943
8894
  def __post_init__(self):
7944
8895
  # Type check incoming model - raise error if invalid (required or wrong type)
7945
8896
  is_valid, error_str = self.validate_kind(self.kind)
@@ -7966,6 +8917,12 @@ class GripperCommandRequest:
7966
8917
  is_valid, error_str = self.validate_schunk_egx(self.schunk_egx)
7967
8918
  if not is_valid:
7968
8919
  raise TypeError(error_str)
8920
+ is_valid, error_str = self.validate_robotiq_2f(self.robotiq_2f)
8921
+ if not is_valid:
8922
+ raise TypeError(error_str)
8923
+ is_valid, error_str = self.validate_robotiq_epick(self.robotiq_epick)
8924
+ if not is_valid:
8925
+ raise TypeError(error_str)
7969
8926
 
7970
8927
  def parse_gripper_command_request(data: object):
7971
8928
  return GripperCommandRequest(
@@ -7977,6 +8934,8 @@ def parse_gripper_command_request(data: object):
7977
8934
  dh_pgc=parse_dhpgc_gripper_command_request(data["dh_pgc"]) if "dh_pgc" in data and data.get("dh_pgc") is not None else None,
7978
8935
  dh_cgi=parse_dhcgi_gripper_command_request(data["dh_cgi"]) if "dh_cgi" in data and data.get("dh_cgi") is not None else None,
7979
8936
  schunk_egx=parse_schunk_e_gx_gripper_command_request(data["schunk_egx"]) if "schunk_egx" in data and data.get("schunk_egx") is not None else None,
8937
+ robotiq_2f=parse_robotiq_2_f_gripper_command_request(data["robotiq_2f"]) if "robotiq_2f" in data and data.get("robotiq_2f") is not None else None,
8938
+ robotiq_epick=parse_robotiq_e_pick_gripper_command_request(data["robotiq_epick"]) if "robotiq_epick" in data and data.get("robotiq_epick") is not None else None,
7980
8939
  )
7981
8940
 
7982
8941
  def serialize_gripper_command_request(data: GripperCommandRequest) -> object:
@@ -7989,6 +8948,8 @@ def serialize_gripper_command_request(data: GripperCommandRequest) -> object:
7989
8948
  "dh_pgc": None if data.dh_pgc is None else serialize_dhpgc_gripper_command_request(data.dh_pgc),
7990
8949
  "dh_cgi": None if data.dh_cgi is None else serialize_dhcgi_gripper_command_request(data.dh_cgi),
7991
8950
  "schunk_egx": None if data.schunk_egx is None else serialize_schunk_e_gx_gripper_command_request(data.schunk_egx),
8951
+ "robotiq_2f": None if data.robotiq_2f is None else serialize_robotiq_2_f_gripper_command_request(data.robotiq_2f),
8952
+ "robotiq_epick": None if data.robotiq_epick is None else serialize_robotiq_e_pick_gripper_command_request(data.robotiq_epick),
7992
8953
  }
7993
8954
 
7994
8955
  @dataclass
@@ -8189,6 +9150,7 @@ class RecorderConfig:
8189
9150
  offset: Union[OffsetConfig, None] = None
8190
9151
  sensors: Union[SensorConfigList, None] = None
8191
9152
  equipmentKeyAssignments: Union[EquipmentKeyAssignments, None] = None
9153
+ tags: Union[StringArray, None] = None
8192
9154
 
8193
9155
  def validate_isSecondary(self, value: bool) -> Tuple[bool, str]:
8194
9156
  if value is None:
@@ -8253,6 +9215,15 @@ class RecorderConfig:
8253
9215
 
8254
9216
  return [True, ""]
8255
9217
 
9218
+ def validate_tags(self, value: StringArray) -> Tuple[bool, str]:
9219
+ if value is None:
9220
+ return [True, ""]
9221
+
9222
+ if not (isinstance(value, list) and all(isinstance(x, str) for x in value)):
9223
+ return [False, "tags must be of type StringArray for RecorderConfig, got " + type(value).__name__]
9224
+
9225
+ return [True, ""]
9226
+
8256
9227
  def __post_init__(self):
8257
9228
  # Type check incoming model - raise error if invalid (required or wrong type)
8258
9229
  is_valid, error_str = self.validate_isSecondary(self.isSecondary)
@@ -8276,6 +9247,9 @@ class RecorderConfig:
8276
9247
  is_valid, error_str = self.validate_equipmentKeyAssignments(self.equipmentKeyAssignments)
8277
9248
  if not is_valid:
8278
9249
  raise TypeError(error_str)
9250
+ is_valid, error_str = self.validate_tags(self.tags)
9251
+ if not is_valid:
9252
+ raise TypeError(error_str)
8279
9253
 
8280
9254
  def parse_recorder_config(data: object):
8281
9255
  return RecorderConfig(
@@ -8286,6 +9260,7 @@ def parse_recorder_config(data: object):
8286
9260
  offset=parse_offset_config(data["offset"]) if "offset" in data and data.get("offset") is not None else None,
8287
9261
  sensors=parse_sensor_config_list(data["sensors"]) if "sensors" in data and data.get("sensors") is not None else None,
8288
9262
  equipmentKeyAssignments=parse_equipment_key_assignments(data["equipmentKeyAssignments"]) if "equipmentKeyAssignments" in data and data.get("equipmentKeyAssignments") is not None else None,
9263
+ tags=parse_string_array(data["tags"]) if "tags" in data and data.get("tags") is not None else None,
8289
9264
  )
8290
9265
 
8291
9266
  def serialize_recorder_config(data: RecorderConfig) -> object:
@@ -8297,6 +9272,7 @@ def serialize_recorder_config(data: RecorderConfig) -> object:
8297
9272
  "offset": None if data.offset is None else serialize_offset_config(data.offset),
8298
9273
  "sensors": None if data.sensors is None else serialize_sensor_config_list(data.sensors),
8299
9274
  "equipmentKeyAssignments": None if data.equipmentKeyAssignments is None else serialize_equipment_key_assignments(data.equipmentKeyAssignments),
9275
+ "tags": None if data.tags is None else serialize_string_array(data.tags),
8300
9276
  }
8301
9277
 
8302
9278
  @dataclass
@@ -8304,6 +9280,7 @@ class TeleopConfig:
8304
9280
  """Config of the teleop"""
8305
9281
  isSecondary: Union[bool, None] = None
8306
9282
  bots: Union[BotTeleopDetailsList, None] = None
9283
+ enableBoltHeadTracking: Union[bool, None] = None
8307
9284
 
8308
9285
  def validate_isSecondary(self, value: bool) -> Tuple[bool, str]:
8309
9286
  if value is None:
@@ -8323,6 +9300,15 @@ class TeleopConfig:
8323
9300
 
8324
9301
  return [True, ""]
8325
9302
 
9303
+ def validate_enableBoltHeadTracking(self, value: bool) -> Tuple[bool, str]:
9304
+ if value is None:
9305
+ return [True, ""]
9306
+
9307
+ if not isinstance(value, bool):
9308
+ return [False, "enableBoltHeadTracking must be of type bool for TeleopConfig, got " + type(value).__name__]
9309
+
9310
+ return [True, ""]
9311
+
8326
9312
  def __post_init__(self):
8327
9313
  # Type check incoming model - raise error if invalid (required or wrong type)
8328
9314
  is_valid, error_str = self.validate_isSecondary(self.isSecondary)
@@ -8331,17 +9317,22 @@ class TeleopConfig:
8331
9317
  is_valid, error_str = self.validate_bots(self.bots)
8332
9318
  if not is_valid:
8333
9319
  raise TypeError(error_str)
9320
+ is_valid, error_str = self.validate_enableBoltHeadTracking(self.enableBoltHeadTracking)
9321
+ if not is_valid:
9322
+ raise TypeError(error_str)
8334
9323
 
8335
9324
  def parse_teleop_config(data: object):
8336
9325
  return TeleopConfig(
8337
9326
  isSecondary=parse_bool(data["isSecondary"]) if "isSecondary" in data and data.get("isSecondary") is not None else None,
8338
9327
  bots=parse_bot_teleop_details_list(data["bots"]) if "bots" in data and data.get("bots") is not None else None,
9328
+ enableBoltHeadTracking=parse_bool(data["enableBoltHeadTracking"]) if "enableBoltHeadTracking" in data and data.get("enableBoltHeadTracking") is not None else None,
8339
9329
  )
8340
9330
 
8341
9331
  def serialize_teleop_config(data: TeleopConfig) -> object:
8342
9332
  return {
8343
9333
  "isSecondary": None if data.isSecondary is None else serialize_bool(data.isSecondary),
8344
9334
  "bots": None if data.bots is None else serialize_bot_teleop_details_list(data.bots),
9335
+ "enableBoltHeadTracking": None if data.enableBoltHeadTracking is None else serialize_bool(data.enableBoltHeadTracking),
8345
9336
  }
8346
9337
 
8347
9338
  @dataclass
@@ -8838,6 +9829,12 @@ class TeleopState:
8838
9829
  config: Union[TeleopConfig, None] = None
8839
9830
  status: Union[TeleopStatus, None] = None
8840
9831
  botsInSync: Union[bool, None] = None
9832
+ errors: Union[TeleopErrorArray, None] = None
9833
+ gripperBounds: Union[GripperBounds, None] = None
9834
+ robotFrame: Union[RobotFrame, None] = None
9835
+ filterType: Union[str, None] = None
9836
+ connectedClients: Union[TeleopClientList, None] = None
9837
+ activeClientId: Union[str, None] = None
8841
9838
 
8842
9839
  def validate_config(self, value: TeleopConfig) -> Tuple[bool, str]:
8843
9840
  if value is None:
@@ -8866,6 +9863,60 @@ class TeleopState:
8866
9863
 
8867
9864
  return [True, ""]
8868
9865
 
9866
+ def validate_errors(self, value: TeleopErrorArray) -> Tuple[bool, str]:
9867
+ if value is None:
9868
+ return [True, ""]
9869
+
9870
+ if not (isinstance(value, list) and all(isinstance(x, str) for x in value)):
9871
+ return [False, "errors must be of type TeleopErrorArray for TeleopState, got " + type(value).__name__]
9872
+
9873
+ return [True, ""]
9874
+
9875
+ def validate_gripperBounds(self, value: GripperBounds) -> Tuple[bool, str]:
9876
+ if value is None:
9877
+ return [True, ""]
9878
+
9879
+ if not isinstance(value, GripperBounds):
9880
+ return [False, "gripperBounds must be of type GripperBounds for TeleopState, got " + type(value).__name__]
9881
+
9882
+ return [True, ""]
9883
+
9884
+ def validate_robotFrame(self, value: RobotFrame) -> Tuple[bool, str]:
9885
+ if value is None:
9886
+ return [True, ""]
9887
+
9888
+ if not ((isinstance(value, str) and RobotFrame in ['world', 'tooltip']) or isinstance(value, RobotFrame)):
9889
+ return [False, "robotFrame must be of type RobotFrame for TeleopState, got " + type(value).__name__]
9890
+
9891
+ return [True, ""]
9892
+
9893
+ def validate_filterType(self, value: str) -> Tuple[bool, str]:
9894
+ if value is None:
9895
+ return [True, ""]
9896
+
9897
+ if not isinstance(value, str):
9898
+ return [False, "filterType must be of type str for TeleopState, got " + type(value).__name__]
9899
+
9900
+ return [True, ""]
9901
+
9902
+ def validate_connectedClients(self, value: TeleopClientList) -> Tuple[bool, str]:
9903
+ if value is None:
9904
+ return [True, ""]
9905
+
9906
+ if not (isinstance(value, list) and all(isinstance(x, TeleopClient) for x in value)):
9907
+ return [False, "connectedClients must be of type TeleopClientList for TeleopState, got " + type(value).__name__]
9908
+
9909
+ return [True, ""]
9910
+
9911
+ def validate_activeClientId(self, value: str) -> Tuple[bool, str]:
9912
+ if value is None:
9913
+ return [True, ""]
9914
+
9915
+ if not isinstance(value, str):
9916
+ return [False, "activeClientId must be of type str for TeleopState, got " + type(value).__name__]
9917
+
9918
+ return [True, ""]
9919
+
8869
9920
  def __post_init__(self):
8870
9921
  # Type check incoming model - raise error if invalid (required or wrong type)
8871
9922
  is_valid, error_str = self.validate_config(self.config)
@@ -8877,12 +9928,36 @@ class TeleopState:
8877
9928
  is_valid, error_str = self.validate_botsInSync(self.botsInSync)
8878
9929
  if not is_valid:
8879
9930
  raise TypeError(error_str)
9931
+ is_valid, error_str = self.validate_errors(self.errors)
9932
+ if not is_valid:
9933
+ raise TypeError(error_str)
9934
+ is_valid, error_str = self.validate_gripperBounds(self.gripperBounds)
9935
+ if not is_valid:
9936
+ raise TypeError(error_str)
9937
+ is_valid, error_str = self.validate_robotFrame(self.robotFrame)
9938
+ if not is_valid:
9939
+ raise TypeError(error_str)
9940
+ is_valid, error_str = self.validate_filterType(self.filterType)
9941
+ if not is_valid:
9942
+ raise TypeError(error_str)
9943
+ is_valid, error_str = self.validate_connectedClients(self.connectedClients)
9944
+ if not is_valid:
9945
+ raise TypeError(error_str)
9946
+ is_valid, error_str = self.validate_activeClientId(self.activeClientId)
9947
+ if not is_valid:
9948
+ raise TypeError(error_str)
8880
9949
 
8881
9950
  def parse_teleop_state(data: object):
8882
9951
  return TeleopState(
8883
9952
  config=parse_teleop_config(data["config"]) if "config" in data and data.get("config") is not None else None,
8884
9953
  status=parse_teleop_status(data["status"]) if "status" in data and data.get("status") is not None else None,
8885
9954
  botsInSync=parse_bool(data["botsInSync"]) if "botsInSync" in data and data.get("botsInSync") is not None else None,
9955
+ errors=parse_teleop_error_array(data["errors"]) if "errors" in data and data.get("errors") is not None else None,
9956
+ gripperBounds=parse_gripper_bounds(data["gripperBounds"]) if "gripperBounds" in data and data.get("gripperBounds") is not None else None,
9957
+ robotFrame=parse_robot_frame(data["robotFrame"]) if "robotFrame" in data and data.get("robotFrame") is not None else None,
9958
+ filterType=parse_str(data["filterType"]) if "filterType" in data and data.get("filterType") is not None else None,
9959
+ connectedClients=parse_teleop_client_list(data["connectedClients"]) if "connectedClients" in data and data.get("connectedClients") is not None else None,
9960
+ activeClientId=parse_str(data["activeClientId"]) if "activeClientId" in data and data.get("activeClientId") is not None else None,
8886
9961
  )
8887
9962
 
8888
9963
  def serialize_teleop_state(data: TeleopState) -> object:
@@ -8890,6 +9965,12 @@ def serialize_teleop_state(data: TeleopState) -> object:
8890
9965
  "config": None if data.config is None else serialize_teleop_config(data.config),
8891
9966
  "status": None if data.status is None else serialize_teleop_status(data.status),
8892
9967
  "botsInSync": None if data.botsInSync is None else serialize_bool(data.botsInSync),
9968
+ "errors": None if data.errors is None else serialize_teleop_error_array(data.errors),
9969
+ "gripperBounds": None if data.gripperBounds is None else serialize_gripper_bounds(data.gripperBounds),
9970
+ "robotFrame": None if data.robotFrame is None else serialize_robot_frame(data.robotFrame),
9971
+ "filterType": None if data.filterType is None else serialize_str(data.filterType),
9972
+ "connectedClients": None if data.connectedClients is None else serialize_teleop_client_list(data.connectedClients),
9973
+ "activeClientId": None if data.activeClientId is None else serialize_str(data.activeClientId),
8893
9974
  }
8894
9975
 
8895
9976
  @dataclass
@@ -9071,6 +10152,7 @@ class StopRecordingResponse:
9071
10152
  state: Union[RecorderState, None] = None
9072
10153
  startTimestamp: Union[str, None] = None
9073
10154
  endTimestamp: Union[str, None] = None
10155
+ status: Union[RecorderStatus, None] = None
9074
10156
 
9075
10157
  def validate_state(self, value: RecorderState) -> Tuple[bool, str]:
9076
10158
  if value is None:
@@ -9099,6 +10181,15 @@ class StopRecordingResponse:
9099
10181
 
9100
10182
  return [True, ""]
9101
10183
 
10184
+ def validate_status(self, value: RecorderStatus) -> Tuple[bool, str]:
10185
+ if value is None:
10186
+ return [True, ""]
10187
+
10188
+ if not ((isinstance(value, str) and RecorderStatus in ['not_recording', 'recording', 'error', 'complete', 'initializing']) or isinstance(value, RecorderStatus)):
10189
+ return [False, "status must be of type RecorderStatus for StopRecordingResponse, got " + type(value).__name__]
10190
+
10191
+ return [True, ""]
10192
+
9102
10193
  def __post_init__(self):
9103
10194
  # Type check incoming model - raise error if invalid (required or wrong type)
9104
10195
  is_valid, error_str = self.validate_state(self.state)
@@ -9110,12 +10201,16 @@ class StopRecordingResponse:
9110
10201
  is_valid, error_str = self.validate_endTimestamp(self.endTimestamp)
9111
10202
  if not is_valid:
9112
10203
  raise TypeError(error_str)
10204
+ is_valid, error_str = self.validate_status(self.status)
10205
+ if not is_valid:
10206
+ raise TypeError(error_str)
9113
10207
 
9114
10208
  def parse_stop_recording_response(data: object):
9115
10209
  return StopRecordingResponse(
9116
10210
  state=parse_recorder_state(data["state"]) if "state" in data and data.get("state") is not None else None,
9117
10211
  startTimestamp=parse_str(data["startTimestamp"]) if "startTimestamp" in data and data.get("startTimestamp") is not None else None,
9118
10212
  endTimestamp=parse_str(data["endTimestamp"]) if "endTimestamp" in data and data.get("endTimestamp") is not None else None,
10213
+ status=parse_recorder_status(data["status"]) if "status" in data and data.get("status") is not None else None,
9119
10214
  )
9120
10215
 
9121
10216
  def serialize_stop_recording_response(data: StopRecordingResponse) -> object:
@@ -9123,6 +10218,7 @@ def serialize_stop_recording_response(data: StopRecordingResponse) -> object:
9123
10218
  "state": None if data.state is None else serialize_recorder_state(data.state),
9124
10219
  "startTimestamp": None if data.startTimestamp is None else serialize_str(data.startTimestamp),
9125
10220
  "endTimestamp": None if data.endTimestamp is None else serialize_str(data.endTimestamp),
10221
+ "status": None if data.status is None else serialize_recorder_status(data.status),
9126
10222
  }
9127
10223
 
9128
10224
  @dataclass