wandelbots-api-client 25.11.0.dev12__py3-none-any.whl → 26.1.0.dev62__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 (43) hide show
  1. wandelbots_api_client/__init__.py +1 -1
  2. wandelbots_api_client/api/motion_api.py +3 -3
  3. wandelbots_api_client/api_client.py +1 -1
  4. wandelbots_api_client/configuration.py +1 -1
  5. wandelbots_api_client/models/__init__.py +3 -1
  6. wandelbots_api_client/models/virtual_controller_types.py +4 -4
  7. wandelbots_api_client/v2/__init__.py +1 -1
  8. wandelbots_api_client/v2/api/__init__.py +2 -0
  9. wandelbots_api_client/v2/api/bus_inputs_outputs_api.py +579 -0
  10. wandelbots_api_client/v2/api/jogging_api.py +1 -1
  11. wandelbots_api_client/v2/api/motion_group_models_api.py +795 -2
  12. wandelbots_api_client/v2/api/program_api.py +12 -12
  13. wandelbots_api_client/v2/api/robot_configurations_api.py +291 -0
  14. wandelbots_api_client/v2/api/trajectory_execution_api.py +1 -1
  15. wandelbots_api_client/v2/api_client.py +1 -1
  16. wandelbots_api_client/v2/configuration.py +1 -1
  17. wandelbots_api_client/v2/models/__init__.py +7 -3
  18. wandelbots_api_client/v2/models/blending_auto.py +1 -1
  19. wandelbots_api_client/v2/models/blending_position.py +15 -1
  20. wandelbots_api_client/v2/models/blending_space.py +37 -0
  21. wandelbots_api_client/v2/models/initialize_jogging_request.py +2 -4
  22. wandelbots_api_client/v2/models/inverse_kinematics_request.py +6 -4
  23. wandelbots_api_client/v2/models/kinematic_model.py +110 -0
  24. wandelbots_api_client/v2/models/motion_group_description.py +4 -2
  25. wandelbots_api_client/v2/models/virtual_controller.py +1 -2
  26. wandelbots_api_client/v2/models/virtual_controller_types.py +1 -1
  27. wandelbots_api_client/v2_pydantic/__init__.py +1 -1
  28. wandelbots_api_client/v2_pydantic/api/__init__.py +2 -0
  29. wandelbots_api_client/v2_pydantic/api/bus_inputs_outputs_api.py +585 -0
  30. wandelbots_api_client/v2_pydantic/api/jogging_api.py +1 -1
  31. wandelbots_api_client/v2_pydantic/api/motion_group_models_api.py +804 -2
  32. wandelbots_api_client/v2_pydantic/api/program_api.py +12 -12
  33. wandelbots_api_client/v2_pydantic/api/robot_configurations_api.py +294 -0
  34. wandelbots_api_client/v2_pydantic/api/trajectory_execution_api.py +1 -1
  35. wandelbots_api_client/v2_pydantic/api_client.py +1 -1
  36. wandelbots_api_client/v2_pydantic/configuration.py +1 -1
  37. wandelbots_api_client/v2_pydantic/models.py +471 -527
  38. wandelbots_api_client/v2_pydantic/virtual_controller_types.py +126 -0
  39. {wandelbots_api_client-25.11.0.dev12.dist-info → wandelbots_api_client-26.1.0.dev62.dist-info}/METADATA +2 -2
  40. {wandelbots_api_client-25.11.0.dev12.dist-info → wandelbots_api_client-26.1.0.dev62.dist-info}/RECORD +43 -38
  41. {wandelbots_api_client-25.11.0.dev12.dist-info → wandelbots_api_client-26.1.0.dev62.dist-info}/WHEEL +0 -0
  42. {wandelbots_api_client-25.11.0.dev12.dist-info → wandelbots_api_client-26.1.0.dev62.dist-info}/licenses/LICENSE +0 -0
  43. {wandelbots_api_client-25.11.0.dev12.dist-info → wandelbots_api_client-26.1.0.dev62.dist-info}/top_level.txt +0 -0
@@ -65,7 +65,7 @@ class ProgramApi:
65
65
  ) -> Program:
66
66
  """Get program
67
67
 
68
- Get details of a program.
68
+ <!-- theme: danger --> > **Experimental** Get details of a program.
69
69
 
70
70
  :param cell: Unique identifier addressing a cell in all API calls. (required)
71
71
  :type cell: str
@@ -137,7 +137,7 @@ class ProgramApi:
137
137
  ) -> ApiResponse[Program]:
138
138
  """Get program
139
139
 
140
- Get details of a program.
140
+ <!-- theme: danger --> > **Experimental** Get details of a program.
141
141
 
142
142
  :param cell: Unique identifier addressing a cell in all API calls. (required)
143
143
  :type cell: str
@@ -209,7 +209,7 @@ class ProgramApi:
209
209
  ) -> RESTResponseType:
210
210
  """Get program
211
211
 
212
- Get details of a program.
212
+ <!-- theme: danger --> > **Experimental** Get details of a program.
213
213
 
214
214
  :param cell: Unique identifier addressing a cell in all API calls. (required)
215
215
  :type cell: str
@@ -340,7 +340,7 @@ class ProgramApi:
340
340
  ) -> List[Program]:
341
341
  """List programs
342
342
 
343
- List details of all existing programs.
343
+ <!-- theme: danger --> > **Experimental** List details of all existing programs.
344
344
 
345
345
  :param cell: Unique identifier addressing a cell in all API calls. (required)
346
346
  :type cell: str
@@ -408,7 +408,7 @@ class ProgramApi:
408
408
  ) -> ApiResponse[List[Program]]:
409
409
  """List programs
410
410
 
411
- List details of all existing programs.
411
+ <!-- theme: danger --> > **Experimental** List details of all existing programs.
412
412
 
413
413
  :param cell: Unique identifier addressing a cell in all API calls. (required)
414
414
  :type cell: str
@@ -476,7 +476,7 @@ class ProgramApi:
476
476
  ) -> RESTResponseType:
477
477
  """List programs
478
478
 
479
- List details of all existing programs.
479
+ <!-- theme: danger --> > **Experimental** List details of all existing programs.
480
480
 
481
481
  :param cell: Unique identifier addressing a cell in all API calls. (required)
482
482
  :type cell: str
@@ -603,7 +603,7 @@ class ProgramApi:
603
603
  ) -> ProgramRun:
604
604
  """Start the program
605
605
 
606
- This endpoint starts a new program execution. The program will be executed asynchronously.
606
+ <!-- theme: danger --> > **Experimental** This endpoint starts a new program execution. The program will be executed asynchronously.
607
607
 
608
608
  :param cell: Unique identifier addressing a cell in all API calls. (required)
609
609
  :type cell: str
@@ -684,7 +684,7 @@ class ProgramApi:
684
684
  ) -> ApiResponse[ProgramRun]:
685
685
  """Start the program
686
686
 
687
- This endpoint starts a new program execution. The program will be executed asynchronously.
687
+ <!-- theme: danger --> > **Experimental** This endpoint starts a new program execution. The program will be executed asynchronously.
688
688
 
689
689
  :param cell: Unique identifier addressing a cell in all API calls. (required)
690
690
  :type cell: str
@@ -765,7 +765,7 @@ class ProgramApi:
765
765
  ) -> RESTResponseType:
766
766
  """Start the program
767
767
 
768
- This endpoint starts a new program execution. The program will be executed asynchronously.
768
+ <!-- theme: danger --> > **Experimental** This endpoint starts a new program execution. The program will be executed asynchronously.
769
769
 
770
770
  :param cell: Unique identifier addressing a cell in all API calls. (required)
771
771
  :type cell: str
@@ -921,7 +921,7 @@ class ProgramApi:
921
921
  ) -> None:
922
922
  """Stop program run
923
923
 
924
- Stop a specific program run.
924
+ <!-- theme: danger --> > **Experimental** Stop a specific program run.
925
925
 
926
926
  :param cell: Unique identifier addressing a cell in all API calls. (required)
927
927
  :type cell: str
@@ -994,7 +994,7 @@ class ProgramApi:
994
994
  ) -> ApiResponse[None]:
995
995
  """Stop program run
996
996
 
997
- Stop a specific program run.
997
+ <!-- theme: danger --> > **Experimental** Stop a specific program run.
998
998
 
999
999
  :param cell: Unique identifier addressing a cell in all API calls. (required)
1000
1000
  :type cell: str
@@ -1067,7 +1067,7 @@ class ProgramApi:
1067
1067
  ) -> RESTResponseType:
1068
1068
  """Stop program run
1069
1069
 
1070
- Stop a specific program run.
1070
+ <!-- theme: danger --> > **Experimental** Stop a specific program run.
1071
1071
 
1072
1072
  :param cell: Unique identifier addressing a cell in all API calls. (required)
1073
1073
  :type cell: str
@@ -0,0 +1,291 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Wandelbots NOVA API
5
+
6
+ Interact with robots in an easy and intuitive way.
7
+
8
+ The version of the OpenAPI document: 2.1.0 dev
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+ from furl import furl
15
+ import json
16
+ import humps
17
+ import re
18
+ import warnings
19
+ import websockets
20
+ from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt
21
+ from typing import Any, AsyncGenerator, Callable, Dict, List, Optional, Tuple, Union
22
+ from typing_extensions import Annotated
23
+ from urllib.parse import quote
24
+
25
+ from pydantic import StrictStr
26
+ from typing import List
27
+
28
+ from wandelbots_api_client.v2.api_client import ApiClient, RequestSerialized
29
+ from wandelbots_api_client.v2.api_response import ApiResponse
30
+ from wandelbots_api_client.v2.rest import RESTResponseType
31
+
32
+ class RobotConfigurationsApi:
33
+ """NOTE: This class is auto generated by OpenAPI Generator
34
+ Ref: https://openapi-generator.tech
35
+
36
+ Do not edit the class manually.
37
+ """
38
+
39
+ def __init__(self, api_client=None) -> None:
40
+ if api_client is None:
41
+ api_client = ApiClient.get_default()
42
+ self.api_client = api_client
43
+
44
+ @validate_call
45
+ async def get_robot_configurations(
46
+ self,
47
+ _request_timeout: Union[
48
+ None,
49
+ Annotated[StrictFloat, Field(gt=0)],
50
+ Tuple[
51
+ Annotated[StrictFloat, Field(gt=0)],
52
+ Annotated[StrictFloat, Field(gt=0)]
53
+ ]
54
+ ] = None,
55
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
56
+ _content_type: Optional[StrictStr] = None,
57
+ _headers: Optional[Dict[StrictStr, Any]] = None,
58
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
59
+ ) -> List[str]:
60
+ """List Robot Configurations
61
+
62
+ Returns the identifiers of available robot configurations. A robot configuration represents a robot controller with one or more attached motion groups.
63
+
64
+ :param _request_timeout: timeout setting for this request. If one
65
+ number provided, it will be total request
66
+ timeout. It can also be a pair (tuple) of
67
+ (connection, read) timeouts.
68
+ :type _request_timeout: int, tuple(int, int), optional
69
+ :param _request_auth: set to override the auth_settings for an a single
70
+ request; this effectively ignores the
71
+ authentication in the spec for a single request.
72
+ :type _request_auth: dict, optional
73
+ :param _content_type: force content-type for the request.
74
+ :type _content_type: str, Optional
75
+ :param _headers: set to override the headers for a single
76
+ request; this effectively ignores the headers
77
+ in the spec for a single request.
78
+ :type _headers: dict, optional
79
+ :param _host_index: set to override the host_index for a single
80
+ request; this effectively ignores the host_index
81
+ in the spec for a single request.
82
+ :type _host_index: int, optional
83
+ :return: Returns the result object.
84
+ """ # noqa: E501
85
+
86
+ _param = self._get_robot_configurations_serialize(
87
+ _request_auth=_request_auth,
88
+ _content_type=_content_type,
89
+ _headers=_headers,
90
+ _host_index=_host_index
91
+ )
92
+
93
+ _response_types_map: Dict[str, Optional[str]] = {
94
+ '200': "List[str]",
95
+ '404': None,
96
+ '500': None,
97
+ }
98
+ response_data = await self.api_client.call_api(
99
+ *_param,
100
+ _request_timeout=_request_timeout
101
+ )
102
+ await response_data.read()
103
+ return self.api_client.response_deserialize(
104
+ response_data=response_data,
105
+ response_types_map=_response_types_map,
106
+ ).data
107
+
108
+
109
+ @validate_call
110
+ async def get_robot_configurations_with_http_info(
111
+ self,
112
+ _request_timeout: Union[
113
+ None,
114
+ Annotated[StrictFloat, Field(gt=0)],
115
+ Tuple[
116
+ Annotated[StrictFloat, Field(gt=0)],
117
+ Annotated[StrictFloat, Field(gt=0)]
118
+ ]
119
+ ] = None,
120
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
121
+ _content_type: Optional[StrictStr] = None,
122
+ _headers: Optional[Dict[StrictStr, Any]] = None,
123
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
124
+ ) -> ApiResponse[List[str]]:
125
+ """List Robot Configurations
126
+
127
+ Returns the identifiers of available robot configurations. A robot configuration represents a robot controller with one or more attached motion groups.
128
+
129
+ :param _request_timeout: timeout setting for this request. If one
130
+ number provided, it will be total request
131
+ timeout. It can also be a pair (tuple) of
132
+ (connection, read) timeouts.
133
+ :type _request_timeout: int, tuple(int, int), optional
134
+ :param _request_auth: set to override the auth_settings for an a single
135
+ request; this effectively ignores the
136
+ authentication in the spec for a single request.
137
+ :type _request_auth: dict, optional
138
+ :param _content_type: force content-type for the request.
139
+ :type _content_type: str, Optional
140
+ :param _headers: set to override the headers for a single
141
+ request; this effectively ignores the headers
142
+ in the spec for a single request.
143
+ :type _headers: dict, optional
144
+ :param _host_index: set to override the host_index for a single
145
+ request; this effectively ignores the host_index
146
+ in the spec for a single request.
147
+ :type _host_index: int, optional
148
+ :return: Returns the result object.
149
+ """ # noqa: E501
150
+
151
+ _param = self._get_robot_configurations_serialize(
152
+ _request_auth=_request_auth,
153
+ _content_type=_content_type,
154
+ _headers=_headers,
155
+ _host_index=_host_index
156
+ )
157
+
158
+ _response_types_map: Dict[str, Optional[str]] = {
159
+ '200': "List[str]",
160
+ '404': None,
161
+ '500': None,
162
+ }
163
+ response_data = await self.api_client.call_api(
164
+ *_param,
165
+ _request_timeout=_request_timeout
166
+ )
167
+ await response_data.read()
168
+ return self.api_client.response_deserialize(
169
+ response_data=response_data,
170
+ response_types_map=_response_types_map,
171
+ )
172
+
173
+
174
+ @validate_call
175
+ async def get_robot_configurations_without_preload_content(
176
+ self,
177
+ _request_timeout: Union[
178
+ None,
179
+ Annotated[StrictFloat, Field(gt=0)],
180
+ Tuple[
181
+ Annotated[StrictFloat, Field(gt=0)],
182
+ Annotated[StrictFloat, Field(gt=0)]
183
+ ]
184
+ ] = None,
185
+ _request_auth: Optional[Dict[StrictStr, Any]] = None,
186
+ _content_type: Optional[StrictStr] = None,
187
+ _headers: Optional[Dict[StrictStr, Any]] = None,
188
+ _host_index: Annotated[StrictInt, Field(ge=0, le=0)] = 0,
189
+ ) -> RESTResponseType:
190
+ """List Robot Configurations
191
+
192
+ Returns the identifiers of available robot configurations. A robot configuration represents a robot controller with one or more attached motion groups.
193
+
194
+ :param _request_timeout: timeout setting for this request. If one
195
+ number provided, it will be total request
196
+ timeout. It can also be a pair (tuple) of
197
+ (connection, read) timeouts.
198
+ :type _request_timeout: int, tuple(int, int), optional
199
+ :param _request_auth: set to override the auth_settings for an a single
200
+ request; this effectively ignores the
201
+ authentication in the spec for a single request.
202
+ :type _request_auth: dict, optional
203
+ :param _content_type: force content-type for the request.
204
+ :type _content_type: str, Optional
205
+ :param _headers: set to override the headers for a single
206
+ request; this effectively ignores the headers
207
+ in the spec for a single request.
208
+ :type _headers: dict, optional
209
+ :param _host_index: set to override the host_index for a single
210
+ request; this effectively ignores the host_index
211
+ in the spec for a single request.
212
+ :type _host_index: int, optional
213
+ :return: Returns the result object.
214
+ """ # noqa: E501
215
+
216
+ _param = self._get_robot_configurations_serialize(
217
+ _request_auth=_request_auth,
218
+ _content_type=_content_type,
219
+ _headers=_headers,
220
+ _host_index=_host_index
221
+ )
222
+
223
+ _response_types_map: Dict[str, Optional[str]] = {
224
+ '200': "List[str]",
225
+ '404': None,
226
+ '500': None,
227
+ }
228
+ response_data = await self.api_client.call_api(
229
+ *_param,
230
+ _request_timeout=_request_timeout
231
+ )
232
+ return response_data.response
233
+
234
+
235
+ def _get_robot_configurations_serialize(
236
+ self,
237
+ _request_auth,
238
+ _content_type,
239
+ _headers,
240
+ _host_index,
241
+ ) -> RequestSerialized:
242
+
243
+ _host = None
244
+
245
+ _collection_formats: Dict[str, str] = {
246
+ }
247
+
248
+ _path_params: Dict[str, str] = {}
249
+ _query_params: List[Tuple[str, str]] = []
250
+ _header_params: Dict[str, Optional[str]] = _headers or {}
251
+ _form_params: List[Tuple[str, str]] = []
252
+ _files: Dict[str, Union[str, bytes]] = {}
253
+ _body_params: Optional[bytes] = None
254
+
255
+ # process the path parameters
256
+ # process the query parameters
257
+ # process the header parameters
258
+ # process the form parameters
259
+ # process the body parameter
260
+
261
+
262
+ # set the HTTP header `Accept`
263
+ _header_params['Accept'] = self.api_client.select_header_accept(
264
+ [
265
+ 'application/json'
266
+ ]
267
+ )
268
+
269
+
270
+ # authentication setting
271
+ _auth_settings: List[str] = [
272
+ 'BasicAuth',
273
+ 'BearerAuth'
274
+ ]
275
+
276
+ return self.api_client.param_serialize(
277
+ method='GET',
278
+ resource_path='/robot-configurations',
279
+ path_params=_path_params,
280
+ query_params=_query_params,
281
+ header_params=_header_params,
282
+ body=_body_params,
283
+ post_params=_form_params,
284
+ files=_files,
285
+ auth_settings=_auth_settings,
286
+ collection_formats=_collection_formats,
287
+ _host=_host,
288
+ _request_auth=_request_auth
289
+ )
290
+
291
+
@@ -47,7 +47,7 @@ class TrajectoryExecutionApi:
47
47
  async def execute_trajectory(self, cell: Annotated[StrictStr, Field(description="Unique identifier addressing a cell in all API calls. ")], controller: Annotated[StrictStr, Field(description="Unique identifier to address a controller in the cell.")], client_request_generator: Callable[[AsyncGenerator[ExecuteTrajectoryResponse, None]], AsyncGenerator[ExecuteTrajectoryRequest, None]]) -> None: # noqa: E501
48
48
  """Execute Trajectory # noqa: E501
49
49
 
50
- <!-- theme: success --> > Websocket endpoint Provides execution control over a previously [planned trajectory](planTrajectory). Enables the caller to attach input/output actions to the trajectory. ### Movement behavior | Virtual controller | Physical controller | |------------------|-------------------| | Desired joint configurations are commanded to each motion group and **applied immediately** | Move to desired **actual joint configuration**, **if possible** | ### Concept of location - The location or path parameter specifies the exact position along a trajectory. - The location is a scalar value that ranges from 0 to `n`, where `n` denotes the number of motion commands, or trajectory segments, e.g., line, p2p, etc. See [planTrajectory](planTrajectory). - Each integer value of the location corresponds to one motion command, e.g., 3.0 to 3.999 could be a line. ### Preconditions - The motion group's control mode is not claimed by any other endpoint. - The motion group's joint position are at start location specified with `InitializeMovementRequest`. - Use [executeToTrajectory](executeToTrajectory) to move the robot to the start location. ### Requests #### 1. Send `InitializeMovementRequest` to lock the trajectory to this connection The following actions are executed: - Sets robot controller mode to control mode, - Sets start location of the execution Keep in mind that only a single trajectory can be locked to a websocket connection at a time and not unlocked anymore. To execute another trajectory, a new connection must be established. #### 2. Send `StartMovementRequest` to start the movement Sets direction of movement, default is forward. #### **Optional** - To pause, send `PauseMovementRequest` before the movement has reached its end location. - Change the movement's velocity with `PlaybackSpeedRequest` after initializing the movement with `InitializeMovementRequest`. ### Responses - `InitializeMovementResponse` is sent to signal the success or failure of the `InitializeMovementRequest`. - Movement responses are streamed after a `StartMovementRequest` successfully started the movement. Movement responses are streamed in a rate that is defined as the multiple of the controller step-rate closest to but not exceeding the rate configured by `InitializeMovementRequest`. - Standstill response is sent once the movement has finished or has come to a standstill due to a pause. - `PauseMovementResponse` is sent to signal the success of the `PauseMovementRequest`. It does not signal the end of the movement. End of movement is signaled by Standstill response. - `PlaybackSpeedResponse` is sent to signal the success of the `PlaybackSpeedRequest`. - `MovementError` with error details is sent in case of an unexpected error, e.g., controller disconnects during movement. ### Tips and Tricks - A movement can be paused and resumed by sending `PauseMovementRequest` and `StartMovementRequest`. - Send `PlaybackSpeedRequest` before `StartMovementRequest` to reduce the velocity of the movement before it starts. - Send `PlaybackSpeedRequest` repeatedly to implement a slider. The velocity of the motion group can be adjusted with each controller step. Therefore, if your app needs a slider-like UI to alter the velocity of a currently running movement, you can send `PlaybackSpeedRequest` with different speed values repeatedly during the movement. - A closed trajectory (end and start joint position are equal) can be repeated by sending `StartMovementRequest` after the movement has finished. # noqa: E501
50
+ <!-- theme: success --> > Websocket endpoint Provides execution control over a previously [planned trajectory](planTrajectory). Enables the caller to attach input/output actions to the trajectory. ### Movement behavior | Virtual controller | Physical controller | |------------------|-------------------| | Desired joint configurations are commanded to each motion group and **applied immediately** | Move to desired **actual joint configuration**, **if possible** | ### Concept of location - The location or path parameter specifies the exact position along a trajectory. - The location is a scalar value that ranges from 0 to `n`, where `n` denotes the number of motion commands, or trajectory segments, e.g., line, p2p, etc. See [planTrajectory](planTrajectory). - Each integer value of the location corresponds to one motion command, e.g., 3.0 to 3.999 could be a line. ### Preconditions - The motion group's control mode is not claimed by any other endpoint. - The motion group's joint position are at start location specified with `InitializeMovementRequest`. - Use [executeToTrajectory](executeToTrajectory) to move the robot to the start location. ### Requests #### 1. Send `InitializeMovementRequest` to lock the trajectory to this connection The following actions are executed: - Sets robot controller mode to control mode, - Sets start location of the execution Keep in mind that only a single trajectory can be locked to a websocket connection at a time. Pausing the current movement enables you to send another `InitializeMovementRequest` to execute another trajectory on the same connection. #### 2. Send `StartMovementRequest` to start the movement Sets direction of movement, default is forward. #### **Optional** - To pause, send `PauseMovementRequest` before the movement has reached its end location. - Change the movement's velocity with `PlaybackSpeedRequest` after initializing the movement with `InitializeMovementRequest`. ### Responses To monitor the state of the movement, listen to the [state stream](streamMotionGroupState). The state is published via nats as well. Field `execute` in the `MotionGroupState` indicates whether a movement is ongoing and carries execution details. Each request has a corresponding acknowledgment response. They signal success or failure of the request. Especially for `PauseMovementResponse`, it does not signal the end of the movement. Additionally, `MovementError` messages can be sent in case of unexpected errors during the execution, e.g., controller disconnects during movement. ### Tips and Tricks - A movement can be paused and resumed by sending `PauseMovementRequest` and `StartMovementRequest`. - Send `PlaybackSpeedRequest` before `StartMovementRequest` to reduce the velocity of the movement before it starts. - Send `PlaybackSpeedRequest` repeatedly to implement a slider. The velocity of the motion group can be adjusted with each controller step. Therefore, if your app needs a slider-like UI to alter the velocity of a currently running movement, you can send `PlaybackSpeedRequest` with different speed values repeatedly during the movement. - A closed trajectory (end and start joint position are equal) can be repeated by sending `StartMovementRequest` after the movement has finished. # noqa: E501
51
51
  :param client_request_generator: An AsyncGenerator that yields request of type ExecuteTrajectoryRequest and takes an AsyncGenerator of ExecuteTrajectoryResponse as an input argument (required)
52
52
  :info All responses from the server will be yielded to client_request_generator through the (AsyncGenerator[ExecuteTrajectoryResponse, None])
53
53
  :type AsyncGenerator[ExecuteTrajectoryRequest, None]
@@ -91,7 +91,7 @@ class ApiClient:
91
91
  self.default_headers[header_name] = header_value
92
92
  self.cookie = cookie
93
93
  # Set default User-Agent.
94
- self.user_agent = 'Wandelbots-Nova-API-Python-Client/25.11.0.dev12'
94
+ self.user_agent = 'Wandelbots-Nova-API-Python-Client/26.1.0.dev62'
95
95
  self.client_side_validation = configuration.client_side_validation
96
96
 
97
97
  async def __aenter__(self):
@@ -535,7 +535,7 @@ conf = wandelbots_api_client.v2.Configuration(
535
535
  "OS: {env}\n"\
536
536
  "Python Version: {pyversion}\n"\
537
537
  "Version of the API: 2.1.0 dev\n"\
538
- "SDK Package Version: 25.11.0.dev12".\
538
+ "SDK Package Version: 26.1.0.dev62".\
539
539
  format(env=sys.platform, pyversion=sys.version)
540
540
 
541
541
  def get_host_settings(self) -> List[HostSetting]:
@@ -25,6 +25,7 @@ from .app import App
25
25
  from .behavior import Behavior
26
26
  from .blending_auto import BlendingAuto
27
27
  from .blending_position import BlendingPosition
28
+ from .blending_space import BlendingSpace
28
29
  from .boolean_value import BooleanValue
29
30
  from .box import Box
30
31
  from .bus_io_description import BusIODescription
@@ -134,6 +135,7 @@ from .joint_limits import JointLimits
134
135
  from .joint_trajectory import JointTrajectory
135
136
  from .joint_velocity_request import JointVelocityRequest
136
137
  from .joint_velocity_response import JointVelocityResponse
138
+ from .kinematic_model import KinematicModel
137
139
  from .kuka_controller import KukaController
138
140
  from .kuka_controller_rsi_server import KukaControllerRsiServer
139
141
  from .license import License
@@ -253,10 +255,10 @@ from .validation_error import ValidationError
253
255
  from .validation_error2 import ValidationError2
254
256
  from .validation_error_loc_inner import ValidationErrorLocInner
255
257
  from .virtual_controller import VirtualController
256
- from .virtual_controller_types import VirtualControllerTypes
257
258
  from .virtual_robot_configuration import VirtualRobotConfiguration
258
259
  from .wait_for_io_event_request import WaitForIOEventRequest
259
260
  from .yaskawa_controller import YaskawaController
261
+ from .virtual_controller_types import VirtualControllerTypes
260
262
 
261
263
  __all__ = [
262
264
  "AbbController",
@@ -271,6 +273,7 @@ __all__ = [
271
273
  "Behavior",
272
274
  "BlendingAuto",
273
275
  "BlendingPosition",
276
+ "BlendingSpace",
274
277
  "BooleanValue",
275
278
  "Box",
276
279
  "BusIODescription",
@@ -380,6 +383,7 @@ __all__ = [
380
383
  "JointTrajectory",
381
384
  "JointVelocityRequest",
382
385
  "JointVelocityResponse",
386
+ "KinematicModel",
383
387
  "KukaController",
384
388
  "KukaControllerRsiServer",
385
389
  "License",
@@ -499,8 +503,8 @@ __all__ = [
499
503
  "ValidationError2",
500
504
  "ValidationErrorLocInner",
501
505
  "VirtualController",
502
- "VirtualControllerTypes",
503
506
  "VirtualRobotConfiguration",
504
507
  "WaitForIOEventRequest",
508
+ "VirtualControllerTypes",
505
509
  "YaskawaController"
506
- ]
510
+ ]
@@ -27,7 +27,7 @@ class BlendingAuto(BaseModel):
27
27
  """
28
28
  BlendingAuto
29
29
  """ # noqa: E501
30
- min_velocity_in_percent: Optional[Annotated[int, Field(le=100, strict=True, ge=0)]] = Field(default=None, description="Auto-blending is used to keep a constant velocity when blending between two motion commands. It changes the TCP path around the target point of the motion command. The value represents the percentage of the original velocity. ")
30
+ min_velocity_in_percent: Optional[Annotated[int, Field(le=100, strict=True, ge=0)]] = Field(default=None, description="Auto-blending is used to keep a constant velocity when blending between two motion commands. To use auto-blending, the TCP velocity limit must be set. It changes the TCP path around the target point of the motion command. The value represents the percentage of the original velocity. Auto-blending is always performed in cartesian space. ")
31
31
  blending_name: str = "BlendingAuto"
32
32
  __properties: ClassVar[List[str]] = ["min_velocity_in_percent", "blending_name"]
33
33
 
@@ -19,6 +19,8 @@ import json
19
19
 
20
20
  from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr, field_validator
21
21
  from typing import Any, ClassVar, Dict, List, Optional, Union
22
+ from typing_extensions import Annotated
23
+ from wandelbots_api_client.v2.models.blending_space import BlendingSpace
22
24
  from typing import Optional, Set
23
25
  from typing_extensions import Self
24
26
 
@@ -27,8 +29,14 @@ class BlendingPosition(BaseModel):
27
29
  BlendingPosition
28
30
  """ # noqa: E501
29
31
  position_zone_radius: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Specifies the maximum radius in [mm] around the motion command's target point where the TCP path can be altered to blend the motion command into the following one. If auto-blending blends too much of the resulting trajectory, use position-blending to restrict the blending zone radius. ")
32
+ position_zone_percentage: Optional[Union[Annotated[float, Field(le=100, strict=True, ge=0)], Annotated[int, Field(le=100, strict=True, ge=0)]]] = Field(default=None, description="Specifies the maximum blending percentage based on the trajectory length in position space around the motion command's target point. Percentage indicated in 0.0 - 100.0. ")
33
+ orientation_zone_radius: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Specifies the maximum radius in [rad] for orientation blending around the motion command's target orientation. At the target's orientation, the TCP orientation can be altered to blend into the following motion. ")
34
+ orientation_zone_percentage: Optional[Union[Annotated[float, Field(le=100, strict=True, ge=0)], Annotated[int, Field(le=100, strict=True, ge=0)]]] = Field(default=None, description="Specifies the maximum blending percentage for orientation blending based on the trajectory length in orientation space. Percentage indicated in 0.0 - 100.0. ")
35
+ joints_zone_radius: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Specifies the maximum radius in [rad] for joint space blending around the motion command's target joint configuration. At the target joint configuration, the joint path can be altered to blend into the following motion. ")
36
+ joints_zone_percentage: Optional[Union[Annotated[float, Field(le=100, strict=True, ge=0)], Annotated[int, Field(le=100, strict=True, ge=0)]]] = Field(default=None, description="Specifies the maximum blending percentage for joint space blending based on the trajectory length in joint space. Percentage indicated in 0.0 to 100.0. ")
37
+ space: Optional[BlendingSpace] = Field(default=None, description="Defines the space in which blending is performed. ")
30
38
  blending_name: str = "BlendingPosition"
31
- __properties: ClassVar[List[str]] = ["position_zone_radius", "blending_name"]
39
+ __properties: ClassVar[List[str]] = ["position_zone_radius", "position_zone_percentage", "orientation_zone_radius", "orientation_zone_percentage", "joints_zone_radius", "joints_zone_percentage", "space", "blending_name"]
32
40
 
33
41
  @field_validator('blending_name')
34
42
  def blending_name_validate_enum(cls, value):
@@ -93,6 +101,12 @@ class BlendingPosition(BaseModel):
93
101
 
94
102
  _obj = cls.model_validate({
95
103
  "position_zone_radius": obj.get("position_zone_radius"),
104
+ "position_zone_percentage": obj.get("position_zone_percentage"),
105
+ "orientation_zone_radius": obj.get("orientation_zone_radius"),
106
+ "orientation_zone_percentage": obj.get("orientation_zone_percentage"),
107
+ "joints_zone_radius": obj.get("joints_zone_radius"),
108
+ "joints_zone_percentage": obj.get("joints_zone_percentage"),
109
+ "space": obj.get("space"),
96
110
  "blending_name": obj.get("blending_name")
97
111
  })
98
112
  return _obj
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Wandelbots NOVA API
5
+
6
+ Interact with robots in an easy and intuitive way.
7
+
8
+ The version of the OpenAPI document: 2.1.0 dev
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import json
17
+ from enum import Enum
18
+ from typing_extensions import Self
19
+
20
+
21
+ class BlendingSpace(str, Enum):
22
+ """
23
+ Defines the space in which blending is performed. - `JOINT`: Zone blending is performed in joint space - `CARTESIAN`: Auto-blending is performed in cartesian space
24
+ """
25
+
26
+ """
27
+ allowed enum values
28
+ """
29
+ JOINT = 'JOINT'
30
+ CARTESIAN = 'CARTESIAN'
31
+
32
+ @classmethod
33
+ def from_json(cls, json_str: str) -> Self:
34
+ """Create an instance of BlendingSpace from a JSON string"""
35
+ return cls(json.loads(json_str))
36
+
37
+
@@ -29,8 +29,7 @@ class InitializeJoggingRequest(BaseModel):
29
29
  message_type: str = "InitializeJoggingRequest"
30
30
  motion_group: StrictStr = Field(description="Identifier of the motion group.")
31
31
  tcp: Optional[StrictStr] = Field(default=None, description="Identifier of the tool. Required for robots (all limits, including TCP limits, are respected at all times regardless of the motion). Not required for external axes. ")
32
- response_coordinate_system: Optional[StrictStr] = Field(default=None, description="Unique identifier addressing a coordinate system to which the responses are transformed. If not set, world coordinate system is used. ")
33
- __properties: ClassVar[List[str]] = ["message_type", "motion_group", "tcp", "response_coordinate_system"]
32
+ __properties: ClassVar[List[str]] = ["message_type", "motion_group", "tcp"]
34
33
 
35
34
  @field_validator('message_type')
36
35
  def message_type_validate_enum(cls, value):
@@ -96,8 +95,7 @@ class InitializeJoggingRequest(BaseModel):
96
95
  _obj = cls.model_validate({
97
96
  "message_type": obj.get("message_type"),
98
97
  "motion_group": obj.get("motion_group"),
99
- "tcp": obj.get("tcp"),
100
- "response_coordinate_system": obj.get("response_coordinate_system")
98
+ "tcp": obj.get("tcp")
101
99
  })
102
100
  return _obj
103
101
 
@@ -17,8 +17,8 @@ import pprint
17
17
  import re # noqa: F401
18
18
  import json
19
19
 
20
- from pydantic import BaseModel, ConfigDict, Field, StrictStr
21
- from typing import Any, ClassVar, Dict, List, Optional
20
+ from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt, StrictStr
21
+ from typing import Any, ClassVar, Dict, List, Optional, Union
22
22
  from wandelbots_api_client.v2.models.collision_setup import CollisionSetup
23
23
  from wandelbots_api_client.v2.models.limit_range import LimitRange
24
24
  from wandelbots_api_client.v2.models.pose import Pose
@@ -35,7 +35,8 @@ class InverseKinematicsRequest(BaseModel):
35
35
  mounting: Optional[Pose] = Field(default=None, description="Offset from the world frame to the motion group base.")
36
36
  joint_position_limits: Optional[List[LimitRange]] = Field(default=None, description="Joint position limits in [rad], indexed starting from base. ")
37
37
  collision_setups: Optional[Dict[str, CollisionSetup]] = Field(default=None, description="Collision layers to be respected by the motion planner when planning for a single motion group. Each setup represents one layer, e.g., the safety zones and shapes or a fine grained tool and workpiece model. Layers are checked individually along the trajectory and independently of other layers. To respect the safety zones of the controller and check for collision: 1. Fetch the safety zones, link and tool shapes from the controller. 2. Add the fetched zones, links and tools to a layer. 3. Create other layers from your own 3D data as needed. 4. Plan trajectory. 5. The response highlights the layer in which a collision was detected by key. ")
38
- __properties: ClassVar[List[str]] = ["motion_group_model", "tcp_poses", "tcp_offset", "mounting", "joint_position_limits", "collision_setups"]
38
+ reference_joint_position: Optional[List[Union[StrictFloat, StrictInt]]] = None
39
+ __properties: ClassVar[List[str]] = ["motion_group_model", "tcp_poses", "tcp_offset", "mounting", "joint_position_limits", "collision_setups", "reference_joint_position"]
39
40
 
40
41
  model_config = ConfigDict(
41
42
  populate_by_name=True,
@@ -148,7 +149,8 @@ class InverseKinematicsRequest(BaseModel):
148
149
  for _k, _v in obj["collision_setups"].items()
149
150
  )
150
151
  if obj.get("collision_setups") is not None
151
- else None
152
+ else None,
153
+ "reference_joint_position": obj.get("reference_joint_position")
152
154
  })
153
155
  return _obj
154
156