UnderAutomation.ABB 1.0.2.0__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.
Files changed (207) hide show
  1. underautomation/__init__.py +0 -0
  2. underautomation/abb/__init__.py +7 -0
  3. underautomation/abb/abb_controller.py +81 -0
  4. underautomation/abb/common/__init__.py +0 -0
  5. underautomation/abb/common/external_joints.py +91 -0
  6. underautomation/abb/common/joint_target.py +50 -0
  7. underautomation/abb/common/pose.py +46 -0
  8. underautomation/abb/common/position.py +58 -0
  9. underautomation/abb/common/quaternion.py +68 -0
  10. underautomation/abb/common/rob_target.py +56 -0
  11. underautomation/abb/common/robot_configuration.py +68 -0
  12. underautomation/abb/common/robot_joints.py +88 -0
  13. underautomation/abb/connection_parameters.py +57 -0
  14. underautomation/abb/discovery/__init__.py +0 -0
  15. underautomation/abb/discovery/discovered_controller.py +85 -0
  16. underautomation/abb/lib/UnderAutomation.Abb.dll +0 -0
  17. underautomation/abb/lib/version.txt +1 -0
  18. underautomation/abb/license/__init__.py +0 -0
  19. underautomation/abb/license/invalid_license_exception.py +31 -0
  20. underautomation/abb/license/license_info.py +93 -0
  21. underautomation/abb/license/license_state.py +11 -0
  22. underautomation/abb/rws/__init__.py +0 -0
  23. underautomation/abb/rws/data/__init__.py +0 -0
  24. underautomation/abb/rws/data/axis_info.py +55 -0
  25. underautomation/abb/rws/data/backup_restore_ignore.py +8 -0
  26. underautomation/abb/rws/data/backup_restore_include.py +7 -0
  27. underautomation/abb/rws/data/backup_state.py +11 -0
  28. underautomation/abb/rws/data/backup_system_info.py +76 -0
  29. underautomation/abb/rws/data/base_frame.py +36 -0
  30. underautomation/abb/rws/data/calibration_info.py +77 -0
  31. underautomation/abb/rws/data/calibration_joint_info.py +62 -0
  32. underautomation/abb/rws/data/check_restore_result.py +51 -0
  33. underautomation/abb/rws/data/check_restore_status.py +10 -0
  34. underautomation/abb/rws/data/collision_detection_state.py +9 -0
  35. underautomation/abb/rws/data/controller_identity.py +75 -0
  36. underautomation/abb/rws/data/controller_info.py +76 -0
  37. underautomation/abb/rws/data/controller_level.py +7 -0
  38. underautomation/abb/rws/data/controller_restart_mode.py +10 -0
  39. underautomation/abb/rws/data/controller_state.py +12 -0
  40. underautomation/abb/rws/data/controller_type.py +7 -0
  41. underautomation/abb/rws/data/coordinate_system.py +9 -0
  42. underautomation/abb/rws/data/cyclic_brake_check_state.py +8 -0
  43. underautomation/abb/rws/data/cyclic_brake_check_status.py +66 -0
  44. underautomation/abb/rws/data/cyclic_brake_check_test_status.py +9 -0
  45. underautomation/abb/rws/data/device_item.py +74 -0
  46. underautomation/abb/rws/data/device_type.py +9 -0
  47. underautomation/abb/rws/data/directory_item.py +36 -0
  48. underautomation/abb/rws/data/directory_listing.py +81 -0
  49. underautomation/abb/rws/data/elog_domain.py +62 -0
  50. underautomation/abb/rws/data/elog_message.py +143 -0
  51. underautomation/abb/rws/data/elog_message_argument.py +53 -0
  52. underautomation/abb/rws/data/elog_message_order.py +6 -0
  53. underautomation/abb/rws/data/elog_message_type.py +8 -0
  54. underautomation/abb/rws/data/file_item.py +45 -0
  55. underautomation/abb/rws/data/file_system_item.py +53 -0
  56. underautomation/abb/rws/data/io_client_action.py +8 -0
  57. underautomation/abb/rws/data/io_device_configuration.py +125 -0
  58. underautomation/abb/rws/data/io_device_item.py +129 -0
  59. underautomation/abb/rws/data/io_device_logical_state.py +7 -0
  60. underautomation/abb/rws/data/io_device_physical_state.py +13 -0
  61. underautomation/abb/rws/data/io_device_upgrade_info.py +63 -0
  62. underautomation/abb/rws/data/io_firmware_module_info.py +93 -0
  63. underautomation/abb/rws/data/io_firmware_upgrade_state.py +19 -0
  64. underautomation/abb/rws/data/io_firmware_upgrade_status.py +9 -0
  65. underautomation/abb/rws/data/io_network_configuration.py +53 -0
  66. underautomation/abb/rws/data/io_network_configuration_type.py +9 -0
  67. underautomation/abb/rws/data/io_network_item.py +66 -0
  68. underautomation/abb/rws/data/io_network_logical_state.py +7 -0
  69. underautomation/abb/rws/data/io_network_physical_state.py +10 -0
  70. underautomation/abb/rws/data/io_signal_configuration.py +98 -0
  71. underautomation/abb/rws/data/io_signal_item.py +176 -0
  72. underautomation/abb/rws/data/io_signal_logical_state.py +7 -0
  73. underautomation/abb/rws/data/io_signal_physical_state.py +7 -0
  74. underautomation/abb/rws/data/io_signal_search_criteria.py +100 -0
  75. underautomation/abb/rws/data/io_signal_type.py +11 -0
  76. underautomation/abb/rws/data/jog_increment_mode.py +9 -0
  77. underautomation/abb/rws/data/jog_mode.py +11 -0
  78. underautomation/abb/rws/data/joint_solution.py +37 -0
  79. underautomation/abb/rws/data/lead_through_status.py +7 -0
  80. underautomation/abb/rws/data/mastership_domain.py +8 -0
  81. underautomation/abb/rws/data/mastership_holder.py +9 -0
  82. underautomation/abb/rws/data/mastership_info.py +93 -0
  83. underautomation/abb/rws/data/mechanical_unit_info.py +171 -0
  84. underautomation/abb/rws/data/mechanical_unit_item.py +64 -0
  85. underautomation/abb/rws/data/mechanical_unit_mode.py +7 -0
  86. underautomation/abb/rws/data/mechanical_unit_status.py +14 -0
  87. underautomation/abb/rws/data/mechanical_unit_type.py +10 -0
  88. underautomation/abb/rws/data/motion_error_state.py +13 -0
  89. underautomation/abb/rws/data/motion_supervision.py +44 -0
  90. underautomation/abb/rws/data/motion_system_error_state.py +55 -0
  91. underautomation/abb/rws/data/motion_system_info.py +71 -0
  92. underautomation/abb/rws/data/motor_calibration_name.py +53 -0
  93. underautomation/abb/rws/data/network_configuration_method.py +7 -0
  94. underautomation/abb/rws/data/network_interface_item.py +107 -0
  95. underautomation/abb/rws/data/operation_mode.py +12 -0
  96. underautomation/abb/rws/data/operation_mode_acknowledgement.py +7 -0
  97. underautomation/abb/rws/data/operation_mode_lock_state.py +10 -0
  98. underautomation/abb/rws/data/path_supervision.py +44 -0
  99. underautomation/abb/rws/data/rapid_activation_record.py +91 -0
  100. underautomation/abb/rws/data/rapid_alias_io_item.py +55 -0
  101. underautomation/abb/rws/data/rapid_breakpoint.py +71 -0
  102. underautomation/abb/rws/data/rapid_build_error.py +71 -0
  103. underautomation/abb/rws/data/rapid_execution_cycle.py +9 -0
  104. underautomation/abb/rws/data/rapid_execution_info.py +48 -0
  105. underautomation/abb/rws/data/rapid_execution_level.py +9 -0
  106. underautomation/abb/rws/data/rapid_execution_mode.py +11 -0
  107. underautomation/abb/rws/data/rapid_execution_state.py +7 -0
  108. underautomation/abb/rws/data/rapid_execution_type.py +11 -0
  109. underautomation/abb/rws/data/rapid_external_joint_states.py +82 -0
  110. underautomation/abb/rws/data/rapid_hold_to_run_state.py +7 -0
  111. underautomation/abb/rws/data/rapid_instruction_template.py +81 -0
  112. underautomation/abb/rws/data/rapid_instruction_template_argument.py +116 -0
  113. underautomation/abb/rws/data/rapid_joint_state.py +9 -0
  114. underautomation/abb/rws/data/rapid_mechanical_unit_item.py +57 -0
  115. underautomation/abb/rws/data/rapid_modifiable_position_item.py +80 -0
  116. underautomation/abb/rws/data/rapid_modifiable_positions.py +71 -0
  117. underautomation/abb/rws/data/rapid_module_attribute.py +11 -0
  118. underautomation/abb/rws/data/rapid_module_extension.py +53 -0
  119. underautomation/abb/rws/data/rapid_module_info.py +52 -0
  120. underautomation/abb/rws/data/rapid_module_item.py +46 -0
  121. underautomation/abb/rws/data/rapid_module_symbol.py +136 -0
  122. underautomation/abb/rws/data/rapid_module_text.py +53 -0
  123. underautomation/abb/rws/data/rapid_module_type.py +7 -0
  124. underautomation/abb/rws/data/rapid_object_child.py +59 -0
  125. underautomation/abb/rws/data/rapid_object_child_range.py +50 -0
  126. underautomation/abb/rws/data/rapid_object_list_extension.py +54 -0
  127. underautomation/abb/rws/data/rapid_object_list_type.py +13 -0
  128. underautomation/abb/rws/data/rapid_pallet_head_item.py +44 -0
  129. underautomation/abb/rws/data/rapid_pallet_item.py +71 -0
  130. underautomation/abb/rws/data/rapid_pointer_position.py +109 -0
  131. underautomation/abb/rws/data/rapid_pointer_sync_state.py +7 -0
  132. underautomation/abb/rws/data/rapid_pointers.py +45 -0
  133. underautomation/abb/rws/data/rapid_preferred_data_type_item.py +44 -0
  134. underautomation/abb/rws/data/rapid_program_counter_position.py +80 -0
  135. underautomation/abb/rws/data/rapid_program_info.py +44 -0
  136. underautomation/abb/rws/data/rapid_program_load_mode.py +6 -0
  137. underautomation/abb/rws/data/rapid_regain_mode.py +8 -0
  138. underautomation/abb/rws/data/rapid_routine_argument.py +116 -0
  139. underautomation/abb/rws/data/rapid_routine_info.py +82 -0
  140. underautomation/abb/rws/data/rapid_service_routine_item.py +53 -0
  141. underautomation/abb/rws/data/rapid_set_text_range_result.py +53 -0
  142. underautomation/abb/rws/data/rapid_spy_status.py +7 -0
  143. underautomation/abb/rws/data/rapid_start_condition.py +6 -0
  144. underautomation/abb/rws/data/rapid_stop_mode.py +8 -0
  145. underautomation/abb/rws/data/rapid_structural_change_count.py +44 -0
  146. underautomation/abb/rws/data/rapid_symbol_properties.py +154 -0
  147. underautomation/abb/rws/data/rapid_symbol_search_criteria.py +140 -0
  148. underautomation/abb/rws/data/rapid_symbol_search_view.py +8 -0
  149. underautomation/abb/rws/data/rapid_symbol_type.py +22 -0
  150. underautomation/abb/rws/data/rapid_symbol_value.py +54 -0
  151. underautomation/abb/rws/data/rapid_symbol_variable_type.py +9 -0
  152. underautomation/abb/rws/data/rapid_task_execution_mode.py +12 -0
  153. underautomation/abb/rws/data/rapid_task_execution_state.py +9 -0
  154. underautomation/abb/rws/data/rapid_task_info.py +118 -0
  155. underautomation/abb/rws/data/rapid_task_item.py +86 -0
  156. underautomation/abb/rws/data/rapid_task_scope.py +6 -0
  157. underautomation/abb/rws/data/rapid_task_selection_item.py +62 -0
  158. underautomation/abb/rws/data/rapid_task_state.py +10 -0
  159. underautomation/abb/rws/data/rapid_task_trust_level.py +9 -0
  160. underautomation/abb/rws/data/rapid_task_type.py +8 -0
  161. underautomation/abb/rws/data/rapid_text_position.py +49 -0
  162. underautomation/abb/rws/data/rapid_text_query_mode.py +6 -0
  163. underautomation/abb/rws/data/rapid_text_range.py +62 -0
  164. underautomation/abb/rws/data/rapid_text_replace_mode.py +7 -0
  165. underautomation/abb/rws/data/rapid_ui_instruction.py +75 -0
  166. underautomation/abb/rws/data/rapid_ui_instruction_event.py +8 -0
  167. underautomation/abb/rws/data/rapid_ui_instruction_parameter.py +44 -0
  168. underautomation/abb/rws/data/safety_configuration.py +126 -0
  169. underautomation/abb/rws/data/safety_load_operation_status.py +11 -0
  170. underautomation/abb/rws/data/safety_mode.py +9 -0
  171. underautomation/abb/rws/data/safety_mode_status.py +46 -0
  172. underautomation/abb/rws/data/safety_violation_info.py +154 -0
  173. underautomation/abb/rws/data/safety_violation_type.py +19 -0
  174. underautomation/abb/rws/data/smb_data.py +181 -0
  175. underautomation/abb/rws/data/smb_data_memory.py +6 -0
  176. underautomation/abb/rws/data/smb_data_status.py +9 -0
  177. underautomation/abb/rws/data/smb_data_transfer.py +6 -0
  178. underautomation/abb/rws/data/system_energy.py +121 -0
  179. underautomation/abb/rws/data/system_energy_axis.py +44 -0
  180. underautomation/abb/rws/data/system_energy_mechanical_unit.py +50 -0
  181. underautomation/abb/rws/data/system_energy_state.py +12 -0
  182. underautomation/abb/rws/data/system_info.py +203 -0
  183. underautomation/abb/rws/data/system_product.py +53 -0
  184. underautomation/abb/rws/data/time_server_info.py +45 -0
  185. underautomation/abb/rws/data/virtual_time_state.py +9 -0
  186. underautomation/abb/rws/internal/__init__.py +0 -0
  187. underautomation/abb/rws/internal/rws_client_base.py +115 -0
  188. underautomation/abb/rws/internal/rws_client_internal.py +26 -0
  189. underautomation/abb/rws/internal/rws_connect_parameters_base.py +81 -0
  190. underautomation/abb/rws/rws_client.py +42 -0
  191. underautomation/abb/rws/rws_connect_parameters.py +47 -0
  192. underautomation/abb/rws/rws_exception.py +51 -0
  193. underautomation/abb/rws/rws_version.py +6 -0
  194. underautomation/abb/rws/services/__init__.py +0 -0
  195. underautomation/abb/rws/services/controller_service.py +355 -0
  196. underautomation/abb/rws/services/elog_service.py +88 -0
  197. underautomation/abb/rws/services/file_service.py +124 -0
  198. underautomation/abb/rws/services/io_service.py +260 -0
  199. underautomation/abb/rws/services/mastership_service.py +57 -0
  200. underautomation/abb/rws/services/motion_system_service.py +438 -0
  201. underautomation/abb/rws/services/panel_service.py +124 -0
  202. underautomation/abb/rws/services/rapid_service.py +770 -0
  203. underautomation/abb/rws/services/system_service.py +82 -0
  204. underautomation_abb-1.0.2.0.dist-info/METADATA +583 -0
  205. underautomation_abb-1.0.2.0.dist-info/RECORD +207 -0
  206. underautomation_abb-1.0.2.0.dist-info/WHEEL +5 -0
  207. underautomation_abb-1.0.2.0.dist-info/top_level.txt +1 -0
File without changes
@@ -0,0 +1,7 @@
1
+ import clr
2
+ import os
3
+
4
+ _dll_path = os.path.realpath(os.path.join(os.path.dirname(__file__), 'lib', 'UnderAutomation.Abb.dll'))
5
+ clr.AddReference(_dll_path)
6
+
7
+ __author__ = 'UnderAutomation'
@@ -0,0 +1,81 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from underautomation.abb.connection_parameters import ConnectionParameters
4
+ from underautomation.abb.rws.internal.rws_client_internal import RwsClientInternal
5
+ from underautomation.abb.discovery.discovered_controller import DiscoveredController
6
+ from underautomation.abb.license.license_info import LicenseInfo
7
+ from UnderAutomation.ABB import AbbController as abb_controller
8
+
9
+ class AbbController:
10
+ '''Main class of the SDK that represents a connection to an ABB robot controller'''
11
+ def __init__(self, _internal = 0):
12
+ '''Instantiate a new ABB robot controller connection'''
13
+ if(_internal == 0):
14
+ self._instance = abb_controller()
15
+ else:
16
+ self._instance = _internal
17
+
18
+ def connect(self, ip_or_parameters: str | ConnectionParameters) -> None:
19
+ '''Connect to robot by IP with default connection parameters
20
+ Initialize a connection to the robot with specified parameters
21
+
22
+ :param ip_or_parameters: IP address or hostname of the robot controller — or — Connection parameters
23
+ '''
24
+ self._instance.Connect(getattr(ip_or_parameters, '_instance', ip_or_parameters))
25
+
26
+ def disconnect(self) -> None:
27
+ '''Disconnect from the robot controller'''
28
+ self._instance.Disconnect()
29
+
30
+ @staticmethod
31
+ def discover(timeoutMilliseconds: int=2000) -> typing.List[DiscoveredController]:
32
+ '''Search the local network for ABB robot controllers, during the given time. Two ways of finding a controller run together: the announcements the controllers of the network send, and a test of the ports this machine serves, which is what finds the virtual controllers of RobotStudio whatever port they were given. No license is needed.
33
+
34
+ :param timeoutMilliseconds: How long the search lasts, in milliseconds. Below 1000 ms a slow controller may be missed. Default is 2000 ms.
35
+ :returns: The controllers that answered, or an empty array when none did
36
+ '''
37
+ return [DiscoveredController(x) for x in abb_controller.Discover(timeoutMilliseconds)]
38
+
39
+ @staticmethod
40
+ def register_license(licensee: str, key: str) -> LicenseInfo:
41
+ '''If you have a license and a key, please call this static method to register the product and exit the trial period. You can register a product even if the trial period has ended.
42
+
43
+ :param licensee: Your organization name
44
+ :param key: The associated key supplied by UnderAutomation
45
+ :returns: Information about the supplied license
46
+ '''
47
+ return LicenseInfo(None, None, abb_controller.RegisterLicense(licensee, key))
48
+
49
+ @property
50
+ def address(self) -> str:
51
+ '''IP or robot name'''
52
+ return self._instance.Address
53
+
54
+ @property
55
+ def enabled(self) -> bool:
56
+ '''Check if the robot controller is connected'''
57
+ return self._instance.Enabled
58
+
59
+ @property
60
+ def rws(self) -> RwsClientInternal:
61
+ '''RWS client providing access to Robot Web Services API (controller, panel, IO, RAPID, file system, subscriptions)'''
62
+ return RwsClientInternal(self._instance.Rws)
63
+
64
+ @property
65
+ def license_info(self) -> LicenseInfo:
66
+ '''Return information about your license'''
67
+ return LicenseInfo(None, None, self._instance.LicenseInfo)
68
+
69
+ def __str__(self):
70
+ return self._instance.ToString() if self._instance is not None else ""
71
+
72
+ def __repr__(self):
73
+ return self.__str__()
74
+
75
+ def __eq__(self, other) -> bool:
76
+ if not isinstance(other, AbbController):
77
+ NotImplemented
78
+ return self._instance.Equals(other._instance)
79
+
80
+ def __hash__(self) -> int:
81
+ return self._instance.GetHashCode() if self._instance is not None else 0
File without changes
@@ -0,0 +1,91 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from UnderAutomation.ABB.Common import ExternalJoints as external_joints
4
+
5
+ class ExternalJoints:
6
+ '''The six external axis values that travel with a robot position. An axis the robot system does not define comes back as 9E9, which is how the controller says "not in use" rather than an actual position.'''
7
+ def __init__(self, axisA: float, axisB: float, axisC: float, axisD: float, axisE: float, axisF: float, _internal = 0):
8
+ '''Initializes the six external axes
9
+
10
+ :param axisA: Value of external axis A
11
+ :param axisB: Value of external axis B
12
+ :param axisC: Value of external axis C
13
+ :param axisD: Value of external axis D
14
+ :param axisE: Value of external axis E
15
+ :param axisF: Value of external axis F
16
+ '''
17
+ if(_internal == 0):
18
+ self._instance = external_joints(axisA, axisB, axisC, axisD, axisE, axisF)
19
+ else:
20
+ self._instance = _internal
21
+
22
+ @property
23
+ def axis_a(self) -> float:
24
+ '''Value of external axis A'''
25
+ return self._instance.AxisA
26
+
27
+ @axis_a.setter
28
+ def axis_a(self, value: float):
29
+ self._instance.AxisA = value
30
+
31
+ @property
32
+ def axis_b(self) -> float:
33
+ '''Value of external axis B'''
34
+ return self._instance.AxisB
35
+
36
+ @axis_b.setter
37
+ def axis_b(self, value: float):
38
+ self._instance.AxisB = value
39
+
40
+ @property
41
+ def axis_c(self) -> float:
42
+ '''Value of external axis C'''
43
+ return self._instance.AxisC
44
+
45
+ @axis_c.setter
46
+ def axis_c(self, value: float):
47
+ self._instance.AxisC = value
48
+
49
+ @property
50
+ def axis_d(self) -> float:
51
+ '''Value of external axis D'''
52
+ return self._instance.AxisD
53
+
54
+ @axis_d.setter
55
+ def axis_d(self, value: float):
56
+ self._instance.AxisD = value
57
+
58
+ @property
59
+ def axis_e(self) -> float:
60
+ '''Value of external axis E'''
61
+ return self._instance.AxisE
62
+
63
+ @axis_e.setter
64
+ def axis_e(self, value: float):
65
+ self._instance.AxisE = value
66
+
67
+ @property
68
+ def axis_f(self) -> float:
69
+ '''Value of external axis F'''
70
+ return self._instance.AxisF
71
+
72
+ @axis_f.setter
73
+ def axis_f(self, value: float):
74
+ self._instance.AxisF = value
75
+
76
+ def __str__(self):
77
+ return self._instance.ToString() if self._instance is not None else ""
78
+
79
+ def __repr__(self):
80
+ return self.__str__()
81
+
82
+ def __eq__(self, other) -> bool:
83
+ if not isinstance(other, ExternalJoints):
84
+ NotImplemented
85
+ return self._instance.Equals(other._instance)
86
+
87
+ def __hash__(self) -> int:
88
+ return self._instance.GetHashCode() if self._instance is not None else 0
89
+
90
+ # Value the controller reports for an external axis that is not in use
91
+ ExternalJoints.NotInUse = external_joints.NotInUse
@@ -0,0 +1,50 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from underautomation.abb.common.robot_joints import RobotJoints
4
+ from underautomation.abb.common.external_joints import ExternalJoints
5
+ from UnderAutomation.ABB.Common import JointTarget as joint_target
6
+
7
+ class JointTarget:
8
+ '''A robot position expressed joint by joint: the six axes of the arm and the six external axes.'''
9
+ def __init__(self, robotAxes: RobotJoints, externalAxes: ExternalJoints, _internal = 0):
10
+ '''Initializes a new joint target
11
+
12
+ :param robotAxes: Values of the six axes of the robot arm, zero when null
13
+ :param externalAxes: Values of the six external axes, zero when null
14
+ '''
15
+ if(_internal == 0):
16
+ self._instance = joint_target(robotAxes._instance if robotAxes else None, externalAxes._instance if externalAxes else None)
17
+ else:
18
+ self._instance = _internal
19
+
20
+ @property
21
+ def robot_axes(self) -> RobotJoints:
22
+ '''Values of the six axes of the robot arm. Never null.'''
23
+ return RobotJoints(None, None, None, None, None, None, self._instance.RobotAxes)
24
+
25
+ @robot_axes.setter
26
+ def robot_axes(self, value: RobotJoints):
27
+ self._instance.RobotAxes = value._instance if value else None
28
+
29
+ @property
30
+ def external_axes(self) -> ExternalJoints:
31
+ '''Values of the six external axes. Never null.'''
32
+ return ExternalJoints(None, None, None, None, None, None, self._instance.ExternalAxes)
33
+
34
+ @external_axes.setter
35
+ def external_axes(self, value: ExternalJoints):
36
+ self._instance.ExternalAxes = value._instance if value else None
37
+
38
+ def __str__(self):
39
+ return self._instance.ToString() if self._instance is not None else ""
40
+
41
+ def __repr__(self):
42
+ return self.__str__()
43
+
44
+ def __eq__(self, other) -> bool:
45
+ if not isinstance(other, JointTarget):
46
+ NotImplemented
47
+ return self._instance.Equals(other._instance)
48
+
49
+ def __hash__(self) -> int:
50
+ return self._instance.GetHashCode() if self._instance is not None else 0
@@ -0,0 +1,46 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from underautomation.abb.common.quaternion import Quaternion
4
+ from underautomation.abb.common.position import Position
5
+ from UnderAutomation.ABB.Common import Pose as pose
6
+
7
+ class Pose(Position):
8
+ '''A position and the orientation the robot holds there: a Position extended with a Quaternion.'''
9
+ def __init__(self, x: float, y: float, z: float, q1: float, q2: float, q3: float, q4: float, _internal = 0):
10
+ '''Initializes a new pose
11
+
12
+ :param x: Coordinate along the X axis
13
+ :param y: Coordinate along the Y axis
14
+ :param z: Coordinate along the Z axis
15
+ :param q1: Real component of the orientation
16
+ :param q2: First imaginary component of the orientation
17
+ :param q3: Second imaginary component of the orientation
18
+ :param q4: Third imaginary component of the orientation
19
+ '''
20
+ if(_internal == 0):
21
+ self._instance = pose(x, y, z, q1, q2, q3, q4)
22
+ else:
23
+ self._instance = _internal
24
+
25
+ @property
26
+ def orientation(self) -> Quaternion:
27
+ '''Orientation held at this position. Never null: a pose built without one carries the identity rotation.'''
28
+ return Quaternion(None, None, None, None, self._instance.Orientation)
29
+
30
+ @orientation.setter
31
+ def orientation(self, value: Quaternion):
32
+ self._instance.Orientation = value._instance if value else None
33
+
34
+ def __str__(self):
35
+ return self._instance.ToString() if self._instance is not None else ""
36
+
37
+ def __repr__(self):
38
+ return self.__str__()
39
+
40
+ def __eq__(self, other) -> bool:
41
+ if not isinstance(other, Pose):
42
+ NotImplemented
43
+ return self._instance.Equals(other._instance)
44
+
45
+ def __hash__(self) -> int:
46
+ return self._instance.GetHashCode() if self._instance is not None else 0
@@ -0,0 +1,58 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from UnderAutomation.ABB.Common import Position as position
4
+
5
+ class Position:
6
+ '''A point in space, expressed in the coordinate system of whoever produced it. Most readings of the controller express a position in millimetres, while the kinematics calculations work in metres. The method that returns or takes a position says which one it uses.'''
7
+ def __init__(self, x: float, y: float, z: float, _internal = 0):
8
+ '''Initializes a new position
9
+
10
+ :param x: Coordinate along the X axis
11
+ :param y: Coordinate along the Y axis
12
+ :param z: Coordinate along the Z axis
13
+ '''
14
+ if(_internal == 0):
15
+ self._instance = position(x, y, z)
16
+ else:
17
+ self._instance = _internal
18
+
19
+ @property
20
+ def x(self) -> float:
21
+ '''Coordinate along the X axis'''
22
+ return self._instance.X
23
+
24
+ @x.setter
25
+ def x(self, value: float):
26
+ self._instance.X = value
27
+
28
+ @property
29
+ def y(self) -> float:
30
+ '''Coordinate along the Y axis'''
31
+ return self._instance.Y
32
+
33
+ @y.setter
34
+ def y(self, value: float):
35
+ self._instance.Y = value
36
+
37
+ @property
38
+ def z(self) -> float:
39
+ '''Coordinate along the Z axis'''
40
+ return self._instance.Z
41
+
42
+ @z.setter
43
+ def z(self, value: float):
44
+ self._instance.Z = value
45
+
46
+ def __str__(self):
47
+ return self._instance.ToString() if self._instance is not None else ""
48
+
49
+ def __repr__(self):
50
+ return self.__str__()
51
+
52
+ def __eq__(self, other) -> bool:
53
+ if not isinstance(other, Position):
54
+ NotImplemented
55
+ return self._instance.Equals(other._instance)
56
+
57
+ def __hash__(self) -> int:
58
+ return self._instance.GetHashCode() if self._instance is not None else 0
@@ -0,0 +1,68 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from UnderAutomation.ABB.Common import Quaternion as quaternion
4
+
5
+ class Quaternion:
6
+ '''An orientation in space, expressed as a unit quaternion. The controller rejects a quaternion that is not normalized, so keep ² + ² + ² + ² equal to 1.'''
7
+ def __init__(self, q1: float, q2: float, q3: float, q4: float, _internal = 0):
8
+ '''Initializes a new quaternion
9
+
10
+ :param q1: Real component
11
+ :param q2: First imaginary component
12
+ :param q3: Second imaginary component
13
+ :param q4: Third imaginary component
14
+ '''
15
+ if(_internal == 0):
16
+ self._instance = quaternion(q1, q2, q3, q4)
17
+ else:
18
+ self._instance = _internal
19
+
20
+ @property
21
+ def q1(self) -> float:
22
+ '''Real component of the quaternion'''
23
+ return self._instance.Q1
24
+
25
+ @q1.setter
26
+ def q1(self, value: float):
27
+ self._instance.Q1 = value
28
+
29
+ @property
30
+ def q2(self) -> float:
31
+ '''First imaginary component of the quaternion'''
32
+ return self._instance.Q2
33
+
34
+ @q2.setter
35
+ def q2(self, value: float):
36
+ self._instance.Q2 = value
37
+
38
+ @property
39
+ def q3(self) -> float:
40
+ '''Second imaginary component of the quaternion'''
41
+ return self._instance.Q3
42
+
43
+ @q3.setter
44
+ def q3(self, value: float):
45
+ self._instance.Q3 = value
46
+
47
+ @property
48
+ def q4(self) -> float:
49
+ '''Third imaginary component of the quaternion'''
50
+ return self._instance.Q4
51
+
52
+ @q4.setter
53
+ def q4(self, value: float):
54
+ self._instance.Q4 = value
55
+
56
+ def __str__(self):
57
+ return self._instance.ToString() if self._instance is not None else ""
58
+
59
+ def __repr__(self):
60
+ return self.__str__()
61
+
62
+ def __eq__(self, other) -> bool:
63
+ if not isinstance(other, Quaternion):
64
+ NotImplemented
65
+ return self._instance.Equals(other._instance)
66
+
67
+ def __hash__(self) -> int:
68
+ return self._instance.GetHashCode() if self._instance is not None else 0
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from underautomation.abb.common.robot_configuration import RobotConfiguration
4
+ from underautomation.abb.common.external_joints import ExternalJoints
5
+ from underautomation.abb.common.quaternion import Quaternion
6
+ from underautomation.abb.common.pose import Pose
7
+ from UnderAutomation.ABB.Common import RobTarget as rob_target
8
+
9
+ class RobTarget(Pose):
10
+ '''A complete robot target: a Pose extended with the axis configuration used to reach it and the external axis values that travel with it.'''
11
+ def __init__(self, x: float, y: float, z: float, orientation: Quaternion, configuration: RobotConfiguration, externalAxes: ExternalJoints, _internal = 0):
12
+ '''Initializes a new target
13
+
14
+ :param x: Coordinate along the X axis
15
+ :param y: Coordinate along the Y axis
16
+ :param z: Coordinate along the Z axis
17
+ :param orientation: Orientation held at that position, the identity rotation when null
18
+ :param configuration: Axis configuration used to reach the pose, all zero when null
19
+ :param externalAxes: Values of the six external axes
20
+ '''
21
+ if(_internal == 0):
22
+ self._instance = rob_target(x, y, z, orientation._instance if orientation else None, configuration._instance if configuration else None, externalAxes._instance if externalAxes else None)
23
+ else:
24
+ self._instance = _internal
25
+
26
+ @property
27
+ def configuration(self) -> RobotConfiguration:
28
+ '''Axis configuration used to reach the pose. Never null.'''
29
+ return RobotConfiguration(None, None, None, None, self._instance.Configuration)
30
+
31
+ @configuration.setter
32
+ def configuration(self, value: RobotConfiguration):
33
+ self._instance.Configuration = value._instance if value else None
34
+
35
+ @property
36
+ def external_axes(self) -> ExternalJoints:
37
+ '''Values of the six external axes, null when the reading does not report them'''
38
+ return ExternalJoints(None, None, None, None, None, None, self._instance.ExternalAxes)
39
+
40
+ @external_axes.setter
41
+ def external_axes(self, value: ExternalJoints):
42
+ self._instance.ExternalAxes = value._instance if value else None
43
+
44
+ def __str__(self):
45
+ return self._instance.ToString() if self._instance is not None else ""
46
+
47
+ def __repr__(self):
48
+ return self.__str__()
49
+
50
+ def __eq__(self, other) -> bool:
51
+ if not isinstance(other, RobTarget):
52
+ NotImplemented
53
+ return self._instance.Equals(other._instance)
54
+
55
+ def __hash__(self) -> int:
56
+ return self._instance.GetHashCode() if self._instance is not None else 0
@@ -0,0 +1,68 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from UnderAutomation.ABB.Common import RobotConfiguration as robot_configuration
4
+
5
+ class RobotConfiguration:
6
+ '''The axis configuration the robot uses to reach a pose. Several joint combinations reach the same tool position and orientation. The configuration names the one to use, as the quarter revolution each of the deciding axes sits in.'''
7
+ def __init__(self, quarter1: int, quarter4: int, quarter6: int, quarterX: int, _internal = 0):
8
+ '''Initializes a new configuration
9
+
10
+ :param quarter1: Quarter revolution axis 1 sits in
11
+ :param quarter4: Quarter revolution axis 4 sits in
12
+ :param quarter6: Quarter revolution axis 6 sits in
13
+ :param quarterX: Index of the arm configuration
14
+ '''
15
+ if(_internal == 0):
16
+ self._instance = robot_configuration(quarter1, quarter4, quarter6, quarterX)
17
+ else:
18
+ self._instance = _internal
19
+
20
+ @property
21
+ def quarter1(self) -> int:
22
+ '''Quarter revolution axis 1 sits in'''
23
+ return self._instance.Quarter1
24
+
25
+ @quarter1.setter
26
+ def quarter1(self, value: int):
27
+ self._instance.Quarter1 = value
28
+
29
+ @property
30
+ def quarter4(self) -> int:
31
+ '''Quarter revolution axis 4 sits in'''
32
+ return self._instance.Quarter4
33
+
34
+ @quarter4.setter
35
+ def quarter4(self, value: int):
36
+ self._instance.Quarter4 = value
37
+
38
+ @property
39
+ def quarter6(self) -> int:
40
+ '''Quarter revolution axis 6 sits in'''
41
+ return self._instance.Quarter6
42
+
43
+ @quarter6.setter
44
+ def quarter6(self, value: int):
45
+ self._instance.Quarter6 = value
46
+
47
+ @property
48
+ def quarter_x(self) -> int:
49
+ '''Index of the arm configuration, which tells the remaining joint combinations apart'''
50
+ return self._instance.QuarterX
51
+
52
+ @quarter_x.setter
53
+ def quarter_x(self, value: int):
54
+ self._instance.QuarterX = value
55
+
56
+ def __str__(self):
57
+ return self._instance.ToString() if self._instance is not None else ""
58
+
59
+ def __repr__(self):
60
+ return self.__str__()
61
+
62
+ def __eq__(self, other) -> bool:
63
+ if not isinstance(other, RobotConfiguration):
64
+ NotImplemented
65
+ return self._instance.Equals(other._instance)
66
+
67
+ def __hash__(self) -> int:
68
+ return self._instance.GetHashCode() if self._instance is not None else 0
@@ -0,0 +1,88 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from UnderAutomation.ABB.Common import RobotJoints as robot_joints
4
+
5
+ class RobotJoints:
6
+ '''The six joint values of a robot arm. Readings of the controller express them in degrees, while the kinematics calculations work in radians. The method that returns or takes them says which one it uses.'''
7
+ def __init__(self, axis1: float, axis2: float, axis3: float, axis4: float, axis5: float, axis6: float, _internal = 0):
8
+ '''Initializes the six axes
9
+
10
+ :param axis1: Value of axis 1
11
+ :param axis2: Value of axis 2
12
+ :param axis3: Value of axis 3
13
+ :param axis4: Value of axis 4
14
+ :param axis5: Value of axis 5
15
+ :param axis6: Value of axis 6
16
+ '''
17
+ if(_internal == 0):
18
+ self._instance = robot_joints(axis1, axis2, axis3, axis4, axis5, axis6)
19
+ else:
20
+ self._instance = _internal
21
+
22
+ @property
23
+ def axis1(self) -> float:
24
+ '''Value of axis 1'''
25
+ return self._instance.Axis1
26
+
27
+ @axis1.setter
28
+ def axis1(self, value: float):
29
+ self._instance.Axis1 = value
30
+
31
+ @property
32
+ def axis2(self) -> float:
33
+ '''Value of axis 2'''
34
+ return self._instance.Axis2
35
+
36
+ @axis2.setter
37
+ def axis2(self, value: float):
38
+ self._instance.Axis2 = value
39
+
40
+ @property
41
+ def axis3(self) -> float:
42
+ '''Value of axis 3'''
43
+ return self._instance.Axis3
44
+
45
+ @axis3.setter
46
+ def axis3(self, value: float):
47
+ self._instance.Axis3 = value
48
+
49
+ @property
50
+ def axis4(self) -> float:
51
+ '''Value of axis 4'''
52
+ return self._instance.Axis4
53
+
54
+ @axis4.setter
55
+ def axis4(self, value: float):
56
+ self._instance.Axis4 = value
57
+
58
+ @property
59
+ def axis5(self) -> float:
60
+ '''Value of axis 5'''
61
+ return self._instance.Axis5
62
+
63
+ @axis5.setter
64
+ def axis5(self, value: float):
65
+ self._instance.Axis5 = value
66
+
67
+ @property
68
+ def axis6(self) -> float:
69
+ '''Value of axis 6'''
70
+ return self._instance.Axis6
71
+
72
+ @axis6.setter
73
+ def axis6(self, value: float):
74
+ self._instance.Axis6 = value
75
+
76
+ def __str__(self):
77
+ return self._instance.ToString() if self._instance is not None else ""
78
+
79
+ def __repr__(self):
80
+ return self.__str__()
81
+
82
+ def __eq__(self, other) -> bool:
83
+ if not isinstance(other, RobotJoints):
84
+ NotImplemented
85
+ return self._instance.Equals(other._instance)
86
+
87
+ def __hash__(self) -> int:
88
+ return self._instance.GetHashCode() if self._instance is not None else 0
@@ -0,0 +1,57 @@
1
+ from __future__ import annotations
2
+ import typing
3
+ from underautomation.abb.rws.rws_connect_parameters import RwsConnectParameters
4
+ from UnderAutomation.ABB import ConnectionParameters as connection_parameters
5
+
6
+ class ConnectionParameters:
7
+ '''Connection parameters for an ABB robot controller'''
8
+ def __init__(self, address: str, _internal = 0):
9
+ '''Instantiate new connection parameters with a specified address
10
+
11
+ :param address: IP address or hostname of the robot controller
12
+ '''
13
+ if(_internal == 0):
14
+ self._instance = connection_parameters(address)
15
+ else:
16
+ self._instance = _internal
17
+
18
+ @property
19
+ def address(self) -> str:
20
+ '''Address of the robot controller (IP or host name), default value is 127.0.0.1'''
21
+ return self._instance.Address
22
+
23
+ @address.setter
24
+ def address(self, value: str):
25
+ self._instance.Address = value
26
+
27
+ @property
28
+ def ping_before_connect(self) -> bool:
29
+ '''Send a ping command before initializing any connections'''
30
+ return self._instance.PingBeforeConnect
31
+
32
+ @ping_before_connect.setter
33
+ def ping_before_connect(self, value: bool):
34
+ self._instance.PingBeforeConnect = value
35
+
36
+ @property
37
+ def rws(self) -> RwsConnectParameters:
38
+ '''RWS2 (Robot Web Services 2) connection parameters'''
39
+ return RwsConnectParameters(self._instance.Rws)
40
+
41
+ @rws.setter
42
+ def rws(self, value: RwsConnectParameters):
43
+ self._instance.Rws = value._instance if value else None
44
+
45
+ def __str__(self):
46
+ return self._instance.ToString() if self._instance is not None else ""
47
+
48
+ def __repr__(self):
49
+ return self.__str__()
50
+
51
+ def __eq__(self, other) -> bool:
52
+ if not isinstance(other, ConnectionParameters):
53
+ NotImplemented
54
+ return self._instance.Equals(other._instance)
55
+
56
+ def __hash__(self) -> int:
57
+ return self._instance.GetHashCode() if self._instance is not None else 0
File without changes