openapi: 3.1.0 info: title: Wandelbots NOVA API license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html description: | Interact with robots in an easy and intuitive way. contact: name: Copyright (c) 2025 Wandelbots GmbH url: https://www.wandelbots.com version: 2.5.0 servers: - url: /api/v2 security: - BearerAuth: [] tags: - name: System description: Endpoints for system-level operations, configuration, and status. - name: Cell description: API for managing and monitoring individual robot cells. - name: Controller description: Operations related to robot controllers within a cell. - name: Controller Inputs/Outputs description: Access and manage controller I/O interfaces and data. - name: BUS Inputs/Outputs description: Endpoints for bus-based I/O communication and management. - name: Motion Group description: Manage and monitor robot motion groups and their states. - name: Motion Group Models description: Access models describing robot motion groups and their properties. - name: Kinematics description: Endpoints for robot kinematic calculations and queries. - name: Trajectory Planning description: Plan and validate robot movement trajectories. - name: Trajectory Execution description: Execute and monitor robot trajectory operations. - name: Trajectory Caching description: Manage cached robot trajectories for faster execution. - name: Jogging description: Endpoints for manual or incremental robot movement (jogging). - name: Program description: Manage and execute robot programs and workflows. - name: Virtual Controller description: Simulate and interact with virtual robot controllers. - name: Virtual Controller Inputs/Outputs description: Access I/O data for virtual robot controllers. - name: Virtual Controller Behavior description: Configure and monitor virtual controller behaviors. - name: Application description: Endpoints for managing robot applications and their lifecycle. - name: Store description: Manage persistent storage of robot-related data and objects. - name: Store Object description: Access and manage individual objects in the robot store. - name: Store Program description: Store and retrieve robot programs in persistent storage. - name: Store Collision Components description: Manage collision components used for robot safety and planning. - name: Store Collision Setups description: Configure and manage collision setups for robot operations. - name: License description: Endpoints for license management and activation. - name: Version description: Retrieve the current version of the NOVA API. - name: Session description: Endpoints for retrieving authenticated user session information. paths: /cells: get: summary: List Cells description: |- **Required permissions:** `can_access_system` - View system status and metadata ___ List all deployed cell names. If no cells are deployed, an empty list is returned. operationId: listCells x-scope: can_access_system tags: - Cell responses: '200': description: A Successful operation content: application/json: schema: $ref: '#/components/schemas/NameList' post: summary: Add Cell description: |- **Required permissions:** `can_manage_cells` - Create, update, or delete cells ___ Deploy an entire cell with all its resources. A cell can be used to deploy a robot controller, one or more robots, as well as custom applications. Refer to the [Wandelbots NOVA documentation](https://docs.wandelbots.io/latest/setup-cell) for more information. operationId: deployCell x-scope: can_manage_cells tags: - Cell parameters: - $ref: '#/components/parameters/Timeout' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Cell' examples: default: $ref: '#/components/examples/DefaultCell' responses: '200': description: The creation was successfully completed. '202': description: The creation was initiated. '403': description: This operation is not allowed. content: application/json: schema: $ref: '#/components/schemas/Error' '409': description: A cell with this name already exists. /cells/{cell}: get: summary: Configuration description: | **Required permissions:** `can_access_system` - View system status and metadata ___ List all cell resources. operationId: getCell x-scope: can_access_system tags: - Cell parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/Cell' '404': $ref: '#/components/responses/NotFound' put: summary: Update Configuration description: | **Required permissions:** `can_manage_cells` - Create, update, or delete cells ___ Update the definition of the entire cell. > **NOTE** > > This endpoint replaces the full cell configuration and is not a partial update. > To change only one field: > 1. Get the current configuration via [Cell > Configuration](#/operations/getCell). > 2. Send the full configuration with your intended changes via [Cell > Update Configuration](#/operations/updateCell). Omitting existing sections may reset or remove their current configuration. operationId: updateCell x-scope: can_manage_cells tags: - Cell parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Timeout' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Cell' examples: default: $ref: '#/components/examples/DefaultCell' responses: '200': description: The update was successfully completed. '202': description: The update was initiated. '400': description: The provided parameters are invalid content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: This operation is not allowed. content: application/json: schema: $ref: '#/components/schemas/Error' '404': $ref: '#/components/responses/NotFound' delete: summary: Delete Cell description: |- **Required permissions:** `can_manage_cells` - Create, update, or delete cells ___ Delete an entire cell. operationId: deleteCell x-scope: can_manage_cells tags: - Cell parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Timeout' responses: '200': description: Deletion was successfully completed. '202': description: Deletion was initiated. '404': $ref: '#/components/responses/NotFound' /cells/{cell}/status: get: summary: Service Status description: |- **Required permissions:** `can_access_system` - View system status and metadata ___ List the status of all cell resources. operationId: getCellStatus x-scope: can_access_system tags: - Cell parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/ServiceStatusResponse' '404': $ref: '#/components/responses/NotFound' put: summary: Operating State description: |- **Required permissions:** `can_manage_cells` - Create, update, or delete cells ___ Deactivate or activate the services of a cell. operationId: setCellStatus x-scope: can_manage_cells tags: - Cell parameters: - $ref: '#/components/parameters/Cell' - in: query name: operating_state required: true schema: $ref: '#/components/schemas/OperatingState' description: Set state of the cell. Active or inactive. responses: '202': description: The update was initiated. '404': $ref: '#/components/responses/NotFound' /cells/{cell}/update: put: summary: Update Cell Version description: | **Required permissions:** `can_manage_cells` - Create, update, or delete cells ___ Update the Foundation chart version for a single cell based on a release channel. The resulting version is capped at the current system version. operationId: updateCellVersion x-scope: can_manage_cells tags: - Cell parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCellVersionRequest' responses: '202': description: The update was initiated. '400': description: The provided parameters are invalid. content: application/json: schema: $ref: '#/components/schemas/Error' '404': $ref: '#/components/responses/NotFound' get: summary: Check Cell Update description: | **Required permissions:** `can_manage_cells` - Create, update, or delete cells ___ Check if a more recent Wandelbots NOVA version is available for the cell. Updates greater than the system version are ignored. operationId: checkCellVersionUpdate x-scope: can_manage_cells tags: - Cell parameters: - $ref: '#/components/parameters/Cell' - name: channel in: query required: true schema: $ref: '#/components/schemas/ReleaseChannel' responses: '200': description: An update is available content: text/plain: schema: type: string description: The Wandelbots NOVA version. example: 24.1.0 '204': description: No update available /cells/{cell}/controllers: get: summary: List Robot Controllers description: |- **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ List the names of all deployed robot controllers. operationId: listRobotControllers x-scope: can_operate_controllers tags: - Controller parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/NameList' post: summary: Add Robot Controller description: | **Required permissions:** `can_manage_controllers` - Create, update, or delete robot controllers ___ Add a robot controller to the cell. operationId: addRobotController x-scope: can_manage_controllers tags: - Controller parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Timeout' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RobotController' examples: Abb: $ref: '#/components/examples/AbbController' Fanuc: $ref: '#/components/examples/FanucController' Kuka: $ref: '#/components/examples/KukaController' UniversalRobots: $ref: '#/components/examples/UrController' Virtual: $ref: '#/components/examples/VirtualController' Yaskawa: $ref: '#/components/examples/YaskawaController' responses: '200': description: The creation was successfully completed. '202': description: The creation was initiated. '403': description: This operation is not allowed. content: application/json: schema: $ref: '#/components/schemas/Error' '404': $ref: '#/components/responses/NotFound' '409': description: A robot controller with this name already exists in the cell. delete: summary: Clear Robot Controllers description: | **Required permissions:** `can_manage_controllers` - Create, update, or delete robot controllers ___ Delete all robot controllers from the cell. To replace all robot controllers in a cell, use this endpoint in combination with [addRobotController](#/operations/addRobotController). operationId: clearRobotControllers x-scope: can_manage_controllers tags: - Controller parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Timeout' responses: '200': description: Deletion was successfully completed. '202': description: Deletion was initiated. '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}: get: summary: Robot Controller description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Get the configuration for a robot controller. operationId: getRobotController x-scope: can_operate_controllers tags: - Controller parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/RobotController' '404': $ref: '#/components/responses/NotFound' put: summary: Update Robot Controller description: | **Required permissions:** `can_manage_controllers` - Create, update, or delete robot controllers ___ Update the configuration of a robot controller. Reconfigure certain options of a robot controller, or deploy a specific container image of a robot controller. To update a virtual controller, the previous controller will be deleted and a new one created. Changes to the configuration, e.g., TCPs, coordinate systems, mounting, are **not** transferred to the new robot. > **NOTE** > > An update is not a reset. To do a reset: > 1. Get the current configuration via [getRobotController](#/operations/getRobotController). > 2. Delete the existing virtual robot controller via [deleteRobotController](#/operations/deleteRobotController). > 3. Add a virtual robot controller with [addRobotController](#/operations/addRobotController). operationId: updateRobotController x-scope: can_manage_controllers tags: - Controller parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/Timeout' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RobotController' examples: Abb: $ref: '#/components/examples/AbbController' Fanuc: $ref: '#/components/examples/FanucController' Kuka: $ref: '#/components/examples/KukaController' UniversalRobots: $ref: '#/components/examples/UrController' Virtual: $ref: '#/components/examples/VirtualController' Yaskawa: $ref: '#/components/examples/YaskawaController' responses: '200': description: The update was successfully completed. '202': description: The update was initiated. '404': $ref: '#/components/responses/NotFound' delete: summary: Delete Robot Controller description: | **Required permissions:** `can_manage_controllers` - Create, update, or delete robot controllers ___ Delete a robot controller from the cell. operationId: deleteRobotController x-scope: can_manage_controllers tags: - Controller parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/Timeout' responses: '200': description: Deletion was successfully completed. '202': description: Deletion was initiated. '404': $ref: '#/components/responses/NotFound' /cells/{cell}/apps: get: summary: List Applications description: | **Required permissions:** `can_access_apps` - View application configurations ___ List all GUI applications that have been added to a cell with [addApp](#/operations/addApp). If the cell does not contain GUI applications, the list is returned empty. operationId: listApps x-scope: can_access_apps tags: - Application parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/NameList' post: summary: Add Application description: | **Required permissions:** `can_manage_apps` - Install, update, or remove applications ___ Install a basic, containerized web application to the cell to control robots with a customized frontend. #### Prerequisites - A Docker hub account or similar container registry account, with valid credentials. #### Workflow After adding the application to the cell, open the application on the Wandelbots NOVA home screen. Read [build your application](https://docs.wandelbots.io/latest/developing-introduction) for more information. #### Predefined environment variables > **NOTE** > - `NOVA_API`: The API endpoint accessible from within the application container. > - `NATS_BROKER`: The NATS broker endpoint accessible from within the application container. > - `BASE_PATH`: The application's root path, accessible at http://$host/$BASE_PATH > - `CELL_NAME`: The name of the cell hosting the deployed application. operationId: addApp x-scope: can_manage_apps tags: - Application parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Timeout' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/App' examples: swagger-ui: $ref: '#/components/examples/AppSwaggerUI' responses: '200': description: The creation was successfully completed. '202': description: The creation was initiated. '409': description: An app with this name already exists in this cell. delete: summary: Clear Applications description: |- **Required permissions:** `can_manage_apps` - Install, update, or remove applications ___ Delete all GUI applications from the cell. operationId: clearApps x-scope: can_manage_apps tags: - Application parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Timeout' responses: '200': description: Deletion was successfully completed. '202': description: Deletion was initiated. '404': $ref: '#/components/responses/NotFound' /cells/{cell}/apps/{app}: get: summary: Configuration description: | **Required permissions:** `can_access_apps` - View application configurations ___ Get the configuration for an active GUI application in the cell. To update the configuration of a GUI application in the cell, use this configuration with [updateApp](#/operations/updateApp). operationId: getApp x-scope: can_access_apps tags: - Application parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/App' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/App' '404': $ref: '#/components/responses/NotFound' put: summary: Update Configuration description: |- **Required permissions:** `can_manage_apps` - Install, update, or remove applications ___ Update the configuration of a GUI application in the cell. operationId: updateApp x-scope: can_manage_apps tags: - Application parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/App' - $ref: '#/components/parameters/Timeout' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/App' examples: swagger-ui: $ref: '#/components/examples/AppSwaggerUI' responses: '200': description: The update was successfully completed. '202': description: The update was initiated. '400': description: The provided parameters are invalid content: application/json: schema: $ref: '#/components/schemas/Error' '404': $ref: '#/components/responses/NotFound' delete: summary: Delete Application description: |- **Required permissions:** `can_manage_apps` - Install, update, or remove applications ___ Delete a GUI application from the cell. operationId: deleteApp x-scope: can_manage_apps tags: - Application parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/App' - $ref: '#/components/parameters/Timeout' responses: '200': description: Deletion was successfully completed. '202': description: Deletion was initiated. '404': $ref: '#/components/responses/NotFound' /cells/{cell}/bus-ios: get: summary: Get Service description: |- **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get deployed BUS inputs/outputs service. operationId: getBusIOService x-scope: can_operate_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/BusIOType' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' post: summary: Add Service description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Add the BUS inputs/outputs service to the cell. Starts a containerized service that enables BUS connections via the specified ethernet port. operationId: addBusIOService x-scope: can_manage_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Timeout' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/BusIOType' examples: PROFINET: $ref: '#/components/examples/ProfinetClientService' PROFINET-Virtual: $ref: '#/components/examples/ProfinetVirtualService' MODBUS-Server: $ref: '#/components/examples/ModbusServerService' MODBUS-Client: $ref: '#/components/examples/ModbusClientService' MODBUS-Virtual: $ref: '#/components/examples/ModbusVirtualService' Snap7: $ref: '#/components/examples/Snap7Service' responses: '200': description: The creation was successfully completed. '202': description: The creation was initiated. '403': description: This operation is not allowed. content: application/json: schema: $ref: '#/components/schemas/Error' '404': $ref: '#/components/responses/NotFound' '409': description: A BUS inputs/uutputs service already exists in the cell. delete: summary: Clear Service description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Remove the BUS inputs/outputs service from the cell. operationId: clearBusIOService x-scope: can_manage_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Timeout' responses: '200': description: Deletion was successfully completed. '202': description: Deletion was initiated. '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /system/update: put: summary: Update Wandelbots NOVA version description: | **Required permissions:** `can_update_system` - Update system versions and services ___ Update the Wandelbots NOVA version and all attached services. Sending this API Request will trigger an update of all NOVA services that are part of a cell. Previous cells and cell configurations will remain on the instance. If the update fails, the previous Wandelbots NOVA version is restored. System updates only apply to cells without an explicit chart version. Pinned versions are always preserved; setting `update_cells=false` pins unversioned cells to the current system version before updating. operationId: updateNovaVersion x-scope: can_update_system tags: - System requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateNovaVersionRequest' responses: '200': description: The update was triggered successfully. '204': description: No update available '400': description: An invalid request was provided. '501': description: This instance of Wandelbots NOVA cannot be updated. get: summary: Check update description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Check if a more recent Wandelbots NOVA Version is available. operationId: checkNovaVersionUpdate x-scope: can_access_system tags: - System parameters: - name: channel in: query required: true schema: $ref: '#/components/schemas/ReleaseChannel' responses: '200': description: An update is available content: text/plain: schema: type: string description: The Wandelbots NOVA version. example: 24.1.0 '204': description: No update available /system/version: get: summary: Wandelbots NOVA Version description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Get the current Wandelbots NOVA version. operationId: getSystemVersion x-scope: can_access_system tags: - System responses: '200': description: The operation was successful. content: text/plain: schema: type: string description: The Wandelbots NOVA version. example: 24.1.0 /system/status: get: summary: Wandelbots NOVA status description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Get the status of all system services. operationId: getSystemStatus x-scope: can_access_system tags: - System responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/ServiceStatusList' /session: get: tags: - Session summary: Get current user session information description: |- **Required permissions:** `can_access_system` - View system status and metadata ___ Returns - session metadata, - user identity, - capabilities, and - token lifetime. When authentication and authorization are configured, the response reflects the currently authenticated user. On unmanaged instances (no authentication and authorization is configured), a default anonymous session is returned with empty user fields, no capabilities, and zero-value timestamps. operationId: getSession x-scope: can_access_system security: - BearerAuth: [] - {} responses: '200': description: Session information resolved successfully. content: application/json: schema: $ref: '#/components/schemas/SessionResponse' '401': description: Authentication is required or the token is invalid. content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: Session access is forbidden. content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: An internal error occurred during session resolution. content: application/json: schema: $ref: '#/components/schemas/Error' /system/diagnosis-package/zip: get: summary: Download Diagnosis Package description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Collects information on the current status of all NOVA services and exports them as a .zip file. Includes information on all cells on the instance such as the service logs and virtual robot controllers. From each cell the logs of all services are included, as well as the configuration of each connected controller to start virtual robots. operationId: getDiagnosePackage x-scope: can_access_system tags: - System responses: '200': description: Diagnose package successfully created. content: application/zip: schema: type: string format: binary /experimental/system/network/status: get: summary: Network State description: | **Required permissions:** `can_access_system` - View system status and metadata ___ > **Experimental** Get the current state of the network. operationId: getNetworkState x-scope: can_access_system tags: - System responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/NetworkState' '404': $ref: '#/components/responses/NotFound' /experimental/system/network/interfaces: get: summary: Network Interfaces description: | **Required permissions:** `can_access_system` - View system status and metadata ___ > **Experimental** Get the network interfaces of the system. operationId: getNetworkInterfaces x-scope: can_access_system tags: - System responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/NetworkInterfaces' '404': $ref: '#/components/responses/NotFound' /experimental/system/network/arp-scan: get: tags: - System summary: Get ARP-Scan description: | **Required permissions:** `can_access_system` - View system status and metadata ___ > **Experimental** Performs an address resolution protocol (ARP) scan on the specified interface/classless inter-domain routing (CIDR) and returns all discovered devices on the network by CIDR notation. operationId: getArpScan x-scope: can_access_system parameters: - name: interface in: query schema: type: string description: | Network interface to perform the ARP scan on. example: eth0 - name: cidr in: query schema: type: string description: | The CIDR notation of the network device. - name: timeout in: query schema: type: integer description: | Timeout for the ARP scan listen timeout after sending ARP requests, in milliseconds. minimum: 100 default: 500 responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ArpScanResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /system/configuration/resources: get: tags: - System summary: List Configuration Resources description: | **Required permissions:** `can_backup_system` - Create system backups ___ Retrieves a list of all available configuration resources for backup purposes. operationId: listConfigurationResources x-scope: can_backup_system responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/ConfigurationResourceArray' examples: DefaultCell: $ref: '#/components/examples/CellDefault' /system/configuration: get: tags: - System summary: Retrieve Configuration Backup description: | **Required permissions:** `can_backup_system` - Create system backups ___ Retrieves a configuration backup based on provided resource identifiers. If an empty array of resources is provided, a backup for all resources will be retrieved. operationId: backupConfiguration x-scope: can_backup_system parameters: - name: resources in: query style: form explode: false required: false description: List of resource identifiers to include in the retrieval. schema: type: array items: $ref: '#/components/schemas/ConfigurationResourceId' - $ref: '#/components/parameters/Metadata' responses: '200': description: Successful response headers: X-Backup-Id: description: Unique identifier of the backup. schema: type: string format: uuid content: application/gzip: schema: $ref: '#/components/schemas/ConfigurationArchive' '400': description: Invalid configuration resources provided content: application/json: schema: $ref: '#/components/schemas/Error' post: tags: - System summary: Restore Configuration Backup description: | **Required permissions:** `can_restore_system` - Restore system backups ___ Restores a previously backed up configuration. If an empty array of resources is provided, all resources from the backup will be restored. operationId: restoreConfiguration x-scope: can_restore_system parameters: - name: resources in: query style: form explode: false required: false description: List of resource identifiers to restore. If empty, all resources from the backup will be restored. schema: type: array items: $ref: '#/components/schemas/ConfigurationResourceId' requestBody: description: Backup file stream containing the configuration to restore. required: true content: application/gzip: schema: $ref: '#/components/schemas/ConfigurationArchive' responses: '200': description: Successful response '400': description: Invalid configuration resources or backup file provided content: application/json: schema: $ref: '#/components/schemas/Error' /system/configuration/status: get: summary: Retrieve Backup Status description: |- **Required permissions:** `can_backup_system` - Create system backups ___ Retrieves the status of a configuration backup. The status can only be requested for 5 minutes after backup creation. After 5 minutes, 404 is returned. operationId: getConfigurationBackupStatus x-scope: can_backup_system tags: - System parameters: - in: query required: true name: operation_id schema: description: Backup operation identifier format: uuid type: string responses: '200': description: Successful response content: application/json: schema: $ref: '#/components/schemas/ConfigurationArchiveStatus' '404': description: Backup not found. content: application/json: schema: $ref: '#/components/schemas/Error' /license: get: tags: - License summary: Get license description: |- **Required permissions:** `can_access_license` - View license status ___ Get information on the license used with the Wandelbots NOVA instance, e.g., licensed product, expiration date, license status. operationId: getLicense x-scope: can_access_license responses: '200': description: Current license information content: application/json: schema: $ref: '#/components/schemas/License' '404': description: No license found content: application/json: schema: $ref: '#/components/schemas/Error' post: tags: - License summary: Activate license description: | **Required permissions:** `can_manage_license` - Manage license configuration ___ Activates a license using the provided license owner authentication token. The refresh token is used to enable communication with the license provider without requiring user interaction. operationId: activateLicense x-scope: can_manage_license requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ActivateLicenseRequest' responses: '200': description: The license was sucessfully activated content: application/json: schema: $ref: '#/components/schemas/License' '403': description: The provided license owner cannot be authenticated content: application/json: schema: $ref: '#/components/schemas/Error' '404': description: No license found for the provided license owner content: application/json: schema: $ref: '#/components/schemas/Error' delete: tags: - License summary: Deactivate license description: |- **Required permissions:** `can_manage_license` - Manage license configuration ___ Deactivates active license. operationId: deactivateLicense x-scope: can_manage_license responses: '200': description: The license was sucessfully deactivated /license/status: get: tags: - License summary: Get license status description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Get the license status. - If `valid`, Wandelbots NOVA can be used. - If `expired`, the license has to be renewed in order to use Wandelbots NOVA. operationId: getLicenseStatus x-scope: can_access_system responses: '200': description: The license is valid content: application/json: schema: $ref: '#/components/schemas/LicenseStatus' '403': description: The license is expired content: application/json: schema: $ref: '#/components/schemas/LicenseStatus' /motion-group-models: get: tags: - Motion Group Models summary: Motion Group Models operationId: getMotionGroupModels x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the list of supported motion group models. responses: '200': description: OK content: application/json: schema: type: array items: type: string description: The name of the motion group model. '404': description: Not found content: {} '500': description: Internal server error post: tags: - Motion Group Models summary: Import Motion Group Model operationId: importMotionGroupModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Imports a motion group model from a tar.gz archive and registers it as a new custom model. The tar.gz archive must have been produced by the export endpoint. requestBody: required: true content: application/gzip: schema: type: string format: binary responses: '200': description: Motion group model imported and registered successfully. content: application/json: schema: $ref: '#/components/schemas/MotionGroupModelDescription' '400': description: Invalid or malformed tar.gz archive. content: {} '409': description: A motion group model with the specified name already exists. content: {} '500': description: Internal server error content: {} /motion-group-models/{motion-group-model}/collision: get: tags: - Motion Group Models summary: Get Collision Model operationId: getMotionGroupCollisionModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the default collision link chain for a given motion group model. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported motion group models. The default link chain is derived from 3D models and optimized for collision detection within NOVA. The default link chain includes link shapes only. It does not include any attached components like wire feeders or sensors. Attach additional shapes to the link reference frames by extending the link dictionaries before further use. Additional shapes may overlap each other per link and may also overlap the respective link's default shape. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/LinkChain' '404': description: Motion group model not found or collision data unavailable content: {} '500': description: Internal server error /motion-group-models/{motion-group-model}/glb: get: tags: - Motion Group Models summary: Download GLB Model operationId: getMotionGroupGlbModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the GLB asset for the specified motion group model. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported identifiers. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '200': description: GLB asset content: application/octet-stream: schema: type: string format: binary '404': description: Motion group model or GLB asset not found content: {} '500': description: Internal server error content: {} /motion-group-models/{motion-group-model}/usd: get: tags: - Motion Group Models summary: Download USD Model operationId: getMotionGroupUsdModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the USD scene model for the specified motion group model. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported identifiers. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '200': description: USD asset content: application/octet-stream: schema: type: string format: binary '404': description: Motion group model or USD asset not found content: {} '500': description: Internal server error content: {} /motion-group-models/{motion-group-model}/kinematic: get: tags: - Motion Group Models summary: Get Kinematics operationId: getMotionGroupKinematicModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the kinematics model (DH parameters) for the given motion group model. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported motion group models. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/KinematicModel' '404': description: Motion group model or kinematics not found content: {} '500': description: Internal server error /experimental/motion-group-models/{motion-group-model}: get: tags: - Motion Group Models summary: Export Motion Group Model operationId: exportMotionGroupModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Exports the specified motion group model as a tar.gz archive. The resulting tar.gz file can be imported on another system using the import endpoint. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '200': description: Motion group model tar.gz archive. headers: Content-Disposition: schema: type: string description: Attachment filename, e.g. `attachment; filename="UniversalRobots_UR10e.tar.gz"` content: application/gzip: schema: type: string format: binary '404': description: Motion group model not found. content: {} '500': description: Internal server error content: {} post: tags: - Motion Group Models summary: Copy Motion Group Model operationId: copyMotionGroupModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Creates a copy of the specified motion group model and registers the copy under a new name as a custom model. Both built-in base models and existing custom models can be copied. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CopyMotionGroupModelRequest' responses: '201': description: Motion group model copied and registered successfully. content: application/json: schema: $ref: '#/components/schemas/MotionGroupModelDescription' '404': description: Source motion group model not found. content: {} '409': description: A motion group model with the specified name already exists. content: {} '500': description: Internal server error content: {} delete: tags: - Motion Group Models summary: Delete Motion Group Model operationId: deleteExperimentalMotionGroupModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Deletes a custom motion group model. Only custom models (where `is_custom` is `true`) can be deleted. Built-in base models cannot be removed. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '204': description: Motion group model deleted successfully. '404': description: Motion group model not found. content: {} '409': description: The motion group model is a built-in base model and cannot be deleted. content: {} '500': description: Internal server error content: {} /experimental/motion-group-models/{motion-group-model}/homejoints: get: tags: - Motion Group Models summary: Get Homejoints operationId: getMotionGroupHomejoints x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the default joint positions from which a virtual robot is started. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported motion group models. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Joints' '404': description: Not found content: {} '500': description: Internal server error /experimental/motion-group-models/{motion-group-model}/dynamic: get: tags: - Motion Group Models summary: Get Dynamics operationId: getMotionGroupDynamicModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the dynamics model (mass, center of mass, inertia, friction parameters) for the given motion group model. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported motion group models. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/DynamicModel' '404': description: Motion group model or dynamics not found content: {} '500': description: Internal server error content: {} /experimental/motion-group-models/{motion-group-model}/limit: get: tags: - Motion Group Models summary: Get Limits operationId: getMotionGroupLimitModel x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the operation limits for the given motion group model. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported motion group models. parameters: - $ref: '#/components/parameters/MotionGroupModelParameter' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/OperationLimits' '404': description: Motion group model or limits not found content: {} '500': description: Internal server error /robot-configurations: get: tags: - Robot Configurations summary: List Robot Configurations operationId: getRobotConfigurations x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns the identifiers of available robot configurations. A robot configuration represents a robot controller with one or more attached motion groups. responses: '200': description: OK content: application/json: schema: type: array items: type: string description: Name of the robot configuration. '404': description: Not found content: {} '500': description: Internal server error /experimental/system/network/controllers: post: tags: - Robot Configurations summary: Robot Controller Configurations operationId: getControllerConfigFromArpScan x-scope: can_access_system description: | **Required permissions:** `can_access_system` - View system status and metadata ___ Returns all robot controller configurations that match the provided [ARP scan result](#/operations/getArpScan). requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/RobotControllerConfigurationRequest' responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/RobotController' '404': description: Not found content: {} '500': description: Internal server error /cells/{cell}/controllers/{controller}/description: get: tags: - Controller summary: Description description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Get description of a configured robot controller including a list of connected motion group identifiers. Use [getMotionGroupDescription](#/operations/getMotionGroupDescription) to get more information about the motion group. operationId: getControllerDescription x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ControllerDescription' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/free-drive-stream: get: tags: - Controller summary: Stream Free Drive description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ > Websocket endpoint Sets the robot controller into freedrive mode and stays in freedrive until the websocket connection is closed by the client. In freedrive mode, it is possible to move the attached motion groups by hand. This is a blocking call. As long as the websocket connection is open, no other endpoint can control or move the robot. > **DANGER** > > Danger caused by robot. Improper assessment by the integrator of the application-specific hazards can result in people being > crushed, drawn in or caught due to the robot's complex movement sequences. Before opening the websocket, ensure that > > - The robot is in a safe state, > - The right payload is set, > - No humans or object are within the robot's reach or within the cell. As long as the websocket connection is open you will get the current state of the robot system in the response in the specified `response_rate`. If the activation failed, the returned status will return possible reasons for the failure. Free drive mode is only available for robot controllers that support it, in particular cobots. Use [listRobotControllers](#/operations/listRobotControllers) to check if the robot controller supports free drive mode. operationId: streamFreeDrive x-scope: can_operate_controllers x-serverstream: true parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: response_rate in: query schema: type: integer format: int32 minimum: 0 maximum: 2147483647 description: Update rate for the response message in ms. If not set 200ms are used. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/RobotControllerState' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/ios/description: get: tags: - Controller Inputs/Outputs summary: List Descriptions description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Lists the input/output descriptions of the robot controller. The input/output descriptions contain information like name, type and unit.\ Available inputs/outputs are defined by the robot controller\ Each input/output has a unique identifier. - If no identifiers and no filters are specified in the request, all available inputs/outputs are retrieved by this endpoint. - If a filter, e.g., `direction`, `value_type`, `group` is applied, only matching inputs/outputs are returned. operationId: listIODescriptions x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: ios in: query schema: type: array description: | Array of input/output identifiers to retrieve the descriptions for. If empty or not provided, descriptions of all available inputs/outputs for the requested robot controller will be returned. items: type: string - name: direction in: query schema: $ref: '#/components/schemas/IODirection' description: | Return only inputs/outputs with the specified direction. - name: value_type in: query schema: $ref: '#/components/schemas/IOValueType' description: | Return only inputs/outputs with the specified value type. - name: group in: query schema: type: string description: | Return only inputs/outputs from the specified group. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListIODescriptionsResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/ios/stream: get: tags: - Controller Inputs/Outputs summary: Stream Input/Output Values description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ > Websocket endpoint Continuously receive updates of input/output values via websocket. Updates are sent in the update rate of the controller. > **NOTE** > > If you request many values simultaneously, the request is likely to fail. The amount of values that can be streamed simultaneously depends on the specific robot controller. > **NOTE** > > The inputs and outputs are sent in the update rate of the controller to prevent losing any values. This can lead to a high amount of data transmitted. operationId: streamIOValues x-scope: can_operate_controllers x-serverstream: true x-paramQuotingRequired: true x-quotedParam: ios parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: ios in: query schema: type: array items: type: string description: | Array of input/output identifiers to retrieve the values for. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/StreamIOValuesResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/ios/values: get: tags: - Controller Inputs/Outputs summary: Get Input/Output Values description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Retrieves the current values of inputs/outputs. The identifiers of the inputs/outputs must be provided in the request. Request all available input/output identifiers via [listIODescriptions](#/operations/listIODescriptions). operationId: listIOValues x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: ios in: query schema: type: array items: type: string description: | Array of input/output identifiers to retrieve the values for. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListIOValuesResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' put: tags: - Controller Inputs/Outputs summary: Set Output Values description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Set the values of outputs. All available output identifiers and possible value ranges can be requested via [listIODescriptions](#/operations/listIODescriptions). The call will return once the values have been set on and accepted by the robot. This can take up to 200 milliseconds. > **NOTE** > > Do not call this endpoint while another request is still in progress. The second call will fail. operationId: setOutputValues x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: content: application/json: schema: description: List of output values to set. type: array items: $ref: '#/components/schemas/IOValue' example: - io: io1 value: true value_type: boolean - io: io2 value: '42' value_type: integer - io: io3 value: 3.14 value_type: float required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '429': $ref: '#/components/responses/TooManyRequests' /cells/{cell}/controllers/{controller}/ios/wait-for: post: tags: - Controller Inputs/Outputs summary: Wait For description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Wait until an input/output reaches a certain value. This call returns as soon as the condition is met or the request fails. The `comparison_type` value is used to define how the current value of the input/output is compared with given value. Only set the value that corresponds to the `value_type` of the input/output. See [listIODescriptions](#/operations/listIODescriptions) for more information. **Examples** 1. Wait until analog input `AI_1` < 10: ``` io: "AI_1" comparison_type: "COMPARISON_LESS" value: 10 ``` 2. Wait until analog input `AI_2` > 5.0: ``` io: "AI_2" comparison_type: "COMPARISON_GREATER" value: 5.0 ``` 3. Wait until digital input `DI_3` is true: ``` io: "DI_3" comparison_type: "COMPARISON_EQUAL" value: true ``` operationId: waitForIOEvent x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/WaitForIOEventRequest' responses: '200': description: OK content: application/json: schema: type: boolean '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/mode: put: tags: - Controller summary: Set Default Mode description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Switch between monitor and control usage as default for a robot controller. Monitoring mode is used to read information from the robot controller and control mode is used to command the robot system. As long as the robot controller is connected via network, monitoring mode is always possible. To switch to control mode the robot controller must be in `automatic` or `manual` operating mode and safety state `normal` or `reduced`. If the robot controller is in `manual` operating mode, you have to manually confirm the control usage activation on the robot control panel. This manual confirmation can't be replaced with this API. Without manual confirmation the robot controller will stay in monitor mode. The robot system will try to activate the required operation mode for the requested usage unless no active call requires a different mode. > **NOTE** > > `setDefaultMode` enables the robot controller to stay in control mode to keep the motors activated. > This allows for faster execution of sequential movements as no mode switches are required. > **NOTE** > > Some robot controllers prevent the external activation of automatic operating mode. In this case, changing the operating mode manually at the robot controller is mandatory. > **NOTE** > > The current operation mode and safety state can be requested via [getCurrentRobotControllerState](#/operations/getCurrentRobotControllerState). If a mode change is not possible, the response lists reasons for the failed change. operationId: setDefaultMode x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: mode in: query required: true schema: $ref: '#/components/schemas/SettableRobotSystemMode' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/state: get: tags: - Controller summary: State description: |- **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Get the current state of a robot controller. operationId: getCurrentRobotControllerState x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/RobotControllerState' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/state-stream: get: tags: - Controller summary: Stream State description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ > Websocket endpoint Receive updates of the state of a robot controller. The stream can be opened before the controller is registered. To register a controller, call [addRobotController](#/operations/addRobotController). While connecting, the stream sends initialization updates. Once the controller reaches `MODE_MONITOR`, it sends controller state updates. operationId: streamRobotControllerState x-scope: can_operate_controllers x-serverstream: true parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: response_rate in: query schema: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | Update rate for the response message in ms. If not, controller cycle rate is used. - name: add_controller_timeout in: query schema: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | Timeout for adding a new controller in ms using [addRobotController](#/operations/addRobotController). Default: 1 second. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/RobotControllerState' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/virtual-robot-configuration: get: tags: - Controller summary: Virtual Controller Configuration description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Receive data to configure a virtual robot controller based on another controller. This can be used to create a virtual clone of a specific physical robot. When adding a virtual controller, use the Virtual configuration variant of [addRobotController](#/operations/addRobotController) and pass the content string from this endpoint as the `json` field. Omit the `type` field that selects a preset configuration, which is not required when providing a complete configuration. operationId: getVirtualControllerConfiguration x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/VirtualRobotConfiguration' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/coordinate-systems: get: tags: - Controller summary: List Coordinate Systems description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Lists all specifications of coordinate systems from robot controllers. Use parameter `orientation_type` to get the orientation part of the transformation offset of the coordinate system returned in the requested orientation notation. If parameter `orientation_type` is not set, the orientation part of the transformation offset of the coordinate system is returned in rotation vector notation. The coordinate systems from the robot controller are loaded when the motion group associated with the coordinate system is activated. With deactivation of the motion group, the associated coordinate systems are removed from NOVA. The unique identifier of the coordinate systems from the robot controllers are suffixed with `On` + the unique identifier of the robot controller. operationId: listCoordinateSystems x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: orientation_type in: query schema: $ref: '#/components/schemas/OrientationType' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListCoordinateSystemsResponse' '400': $ref: '#/components/responses/BadRequest' /cells/{cell}/controllers/{controller}/coordinate-systems/{coordinate-system}: get: tags: - Controller summary: Coordinate System description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Request a coordinate system specification for a given identifier. Use parameter `orientation_type` to get the orientation part of the transformation offset of the coordinate system returned in the requested orientation notation. If parameter `orientation_type` is not set, the orientation part of the transformation offset of the coordinate system is returned in rotation vector notation. The coordinate systems from the robot controller are loaded when the motion group associated with the coordinate system is activated. With deactivation of the motion group, the associated coordinate systems are removed from NOVA. The unique identifier of the coordinate systems from the robot controllers are suffixed with `On` + the unique identifier of the robot controller. operationId: getCoordinateSystem x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/CoordinateSystem' - name: orientation_type in: query schema: $ref: '#/components/schemas/OrientationType' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CoordinateSystem' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/motion-groups/{motion-group}/description: get: tags: - Motion Group summary: Description description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Get the set of parameters that describe the motion group and its configuration including safety zones, limits, etc. This data can change upon connection to the robot. operationId: getMotionGroupDescription x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MotionGroupDescription' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/motion-groups/{motion-group}/state: get: tags: - Motion Group summary: State description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Returns the current state of the selected motion group including the current joint position, velocity, pose, and more. operationId: getCurrentMotionGroupState x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' - name: response_coordinate_system in: query schema: type: string description: | Unique identifier addressing a coordinate system to which the responses should be converted. If not set, world coordinate system is used. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MotionGroupState' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/motion-groups/{motion-group}/state-stream: get: tags: - Motion Group summary: Stream State description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ > Websocket endpoint Receive updates of the motion group state. The stream will be closed from the server if the controller is disconnected. operationId: streamMotionGroupState x-scope: can_operate_controllers x-serverstream: true parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' - $ref: '#/components/parameters/ResponseRate' - $ref: '#/components/parameters/ResponseCoordinateSystem' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MotionGroupState' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/trajectory-planning/plan-trajectory: post: tags: - Trajectory Planning operationId: planTrajectory x-scope: can_plan_motion summary: Plan Trajectory description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ Plans a new trajectory for a single motion group. Describe the trajectory as a sequence of motion commands that the robots TCP should follow. Use the following workflow to execute a planned trajectory: 1. Plan a trajectory. 2. Optional: Load the planned trajectory into the cache using the [addTrajectory](#/operations/addTrajectory) endpoint. 3. Execute the (cached) trajectory using the [executeTrajectory](#/operations/executeTrajectory) endpoint. If the trajectory is not executable, the response will contain the joint trajectory up until the error, e.g., all samples until a collision occurs. > #### Exception > > If a CartesianPTP or JointPTP motion command has an invalid target, the response will contain the trajectory up until the start of the invalid PTP motion. parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PlanTrajectoryRequest' examples: UR5e_Line: $ref: '#/components/examples/PlanTrajectoryRequest_UR5e_Line' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/PlanTrajectoryResponse' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/Plan422Response' '500': description: Internal server error /cells/{cell}/trajectory-planning/plan-collision-free: post: tags: - Trajectory Planning operationId: planCollisionFree x-scope: can_plan_motion summary: Plan Collision-Free Trajectory description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ Plans a collision-free trajectory for a single motion group using point-to-point (PTP) motions. This endpoint is specifically designed for collision-free path planning algorithms that find a trajectory from a start joint position to a target position while avoiding obstacles. Use the following workflow to execute a planned collision-free trajectory: 1. Plan a collision-free trajectory. 2. Optional: Load the planned trajectory into the cache using the [addTrajectory](#/operations/addTrajectory) endpoint. 3. Execute the (cached) trajectory using the [executeTrajectory](#/operations/executeTrajectory) endpoint. If the trajectory planning fails due to collision or algorithm constraints, the response will contain error information about the failure. parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/PlanCollisionFreeRequest' examples: UR5e_Simple: $ref: '#/components/examples/PlanCollisionFreeRequest_UR5e_Simple' UR10e_Complex: $ref: '#/components/examples/PlanCollisionFreeRequest_UR10e_Complex' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/PlanCollisionFreeResponse' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/Plan422Response' '500': description: Internal server error /experimental/cells/{cell}/trajectory-planning/search-collision-free-multi-motion-group: post: x-scope: can_plan_motion tags: - Trajectory Planning operationId: searchCollisionFreeMultiMotionGroup summary: Search Collision-Free Trajectories for Multiple Motion Groups description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ > **Experimental** Searches collision-free trajectories for multiple motion groups simultaneously within a cell. This is the multi-robot variant of collision-free path search — it coordinates paths so that several motion groups, e.g., multiple robot arms, can move from start to target positions without colliding with each other or with the environment. The caller provides per-motion-group setups (robot model, cycle time, mounting, TCP offset, limits, payload, collision geometry), per-motion-group point-to-point path definitions (start and target joint positions), optional cross-group collision setups defining which link-chain/tool colliders to consider between groups plus static environment colliders, and optional RRT-Connect algorithm settings (max iterations, step size, smoothing, blending). On success the response contains a time-synchronized trajectory with joint positions per motion group at shared timestamps so their motions are temporally coordinated. On failure it returns feedback indicating why planning failed, e.g., max iterations exceeded. parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MultiSearchCollisionFreeRequest' examples: UR5e: $ref: '#/components/examples/MultiSearchCollisionFreeRequest_UR5e' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MultiSearchCollisionFreeResponse' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/MultiSearchCollisionFree422Response' '500': description: Internal server error /experimental/cells/{cell}/trajectory-planning/merge-trajectories: post: tags: - Trajectory Planning operationId: mergeTrajectories x-scope: can_plan_motion summary: Merge Trajectories description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ > **Experimental** Merges a list of joint trajectories into a single trajectory with collision-aware blending. This endpoint merges a list of separate trajectories by connecting them via blending. The blending is performed with collision checking to ensure the merged trajectory is safe to execute. Timescaling will be applied to the blended area to ensure all limits are respected. parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/MergeTrajectoriesRequest' examples: UR5e: $ref: '#/components/examples/MergeTrajectoriesRequest_UR5e' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MergeTrajectoriesResponse' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/MergeTrajectories422Response' '500': description: Internal server error /cells/{cell}/kinematic/inverse: post: tags: - Kinematics operationId: inverseKinematics x-scope: can_plan_motion summary: Inverse kinematics description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ Returns the reachable joint positions for a list of given poses. parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/InverseKinematicsRequest' examples: UR5e: $ref: '#/components/examples/InverseKinematicsRequest_UR5e' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/InverseKinematicsResponse' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/InverseKinematics422Response' '500': description: Internal server error /experimental/cells/{cell}/kinematic/configured-pose-inverse: post: tags: - Kinematics operationId: configuredPoseInverse x-scope: can_plan_motion summary: Inverse kinematics configured pose description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ Returns the reachable joint positions for a list of given poses. parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ConfiguredPoseInverseRequest' examples: UR5e: $ref: '#/components/examples/ConfiguredPoseInverseRequest_UR5e' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ConfiguredPoseInverseResponse' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ConfiguredPoseInverse422Response' '500': description: Internal server error /experimental/cells/{cell}/kinematic/convert-vendor-configured-pose: post: tags: - Kinematics operationId: convertVendorConfiguredPose x-scope: can_plan_motion summary: Convert vendor-configured pose description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ Converts a vendor-specific pose with configuration data to a vendor-independent pose with kinematic configuration. parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ConvertVendorConfiguredPoseRequest' examples: ABB: $ref: '#/components/examples/ConvertVendorConfiguredPoseRequest_ABB' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ConfiguredPoseList' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ConvertVendorConfiguredPose422Response' '500': description: Internal server error /cells/{cell}/kinematic/forward: post: tags: - Kinematics operationId: forwardKinematics x-scope: can_plan_motion summary: Forward kinematics description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ Returns the TCP poses for a list of given joint positions. parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ForwardKinematicsRequest' examples: UR5e: $ref: '#/components/examples/ForwardKinematicsRequest_UR5e' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ForwardKinematicsResponse' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ForwardKinematics422Response' '500': description: Internal server error /experimental/cells/{cell}/kinematic/project-joint-position-direction-constraint: post: tags: - Kinematics operationId: projectJointPositionDirectionConstraint x-scope: can_plan_motion summary: Project joint position to direction constraint description: | **Required permissions:** `can_plan_motion` - Plan robot motions and trajectories ___ > **Experimental** Returns the projected joint position that satisfies the direction constraint for a given target joint position. This may alter the TCP pose. To project the cartesian pose instead, use the following code snippet: ```python import numpy as np from scipy.spatial.transform import Rotation as R def project_cartesian_pose_direction_constraint(T_world_tcp: models.Pose, constraint: models.DirectionConstraint) -> models.Pose: constraint_tcp = np.array(constraint.tcp) target_constraint_world = np.array(constraint.world) R_world_tcp = R.from_rotvec(T_world_tcp.orientation.root) current_constraint_world = R_world_tcp.apply(constraint_tcp) R_corr, _ = R.align_vectors([target_constraint_world], [current_constraint_world]) R_world_tcp_new = R_corr * R_world_tcp return models.Pose(position=T_world_tcp.position, orientation=R_world_tcp_new.as_rotvec()) ``` parameters: - $ref: '#/components/parameters/Cell' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ProjectJointPositionDirectionConstraintRequest' examples: UR5e: $ref: '#/components/examples/ProjectJointPositionDirectionConstraintRequest_UR5e' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProjectJointPositionDirectionConstraintResponse' '404': description: Not found '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/ProjectJointPositionDirectionConstraint422Response' '500': description: Internal server error /cells/{cell}/controllers/{controller}/trajectories: post: tags: - Trajectory Caching summary: Add Trajectory description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Loads and validates the data of a trajectory into the execution cache, rendering the trajectory executable. > #### NOTE > > Using the trajectory cache is an optional performance optimization. It is not necessary to use the cache to execute trajectories. The response contains the result of the validation of the trajectory. Validation can lead to three different results: - Fully valid: The whole trajectory can be executed from start to end. The response will contain an unique identifier which is used to move the robot. - Partially valid: Only parts of the trajectory can be executed. The response will contain an unique identifier to move the robot and information about the failure for the part that is not executable. - Invalid: The trajectory can not be executed. The response will tell you the reason of failure. If the trajectory is at least partially valid, the parts of the trajectory that are valid can be executed using the [executeTrajectory](#/operations/executeTrajectory) endpoint. The workflow is as follows: - Generate a trajectory with [planTrajectory](#/operations/planTrajectory) or your own motion planner, - Send the trajectory to this endpoint to validate it and get a unique identifier for it, - The unique identifier will appear in the list of available trajectories, see [listTrajectories](#/operations/listTrajectories) endpoint, if it is at least partially executable. - Execute your trajectory using the [executeTrajectory](#/operations/executeTrajectory) endpoint. operationId: addTrajectory x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: content: application/json: schema: $ref: '#/components/schemas/AddTrajectoryRequest' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AddTrajectoryResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' get: tags: - Trajectory Caching summary: List Trajectories description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ List currently cached trajectories. Use [addTrajectory](#/operations/addTrajectory) to add a new trajectory. Adding trajectories is necessary to execute them. Trajectories are removed if the corresponding motion group or controller disconnects. operationId: listTrajectories x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListTrajectoriesResponse' '400': $ref: '#/components/responses/BadRequest' delete: tags: - Trajectory Caching summary: Clear Trajectories description: |- **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Clear the trajectory cache. operationId: clearTrajectories x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' /cells/{cell}/controllers/{controller}/trajectories/{trajectory}: get: tags: - Trajectory Caching summary: Get Trajectory description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Get a previously created trajectory from cache. Use [listTrajectories](#/operations/listTrajectories) to list all cached trajectories. operationId: getTrajectory x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/Trajectory' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/GetTrajectoryResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' delete: tags: - Trajectory Caching summary: Delete Trajectory description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ Delete a previously created trajectory from cache. Use [listTrajectories](#/operations/listTrajectories) to list all cached trajectories. Trajectories are removed automatically if the motion group or the corresponding controller is disconnected. operationId: deleteTrajectory x-scope: can_operate_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/Trajectory' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/execution/trajectory: get: tags: - Trajectory Execution summary: Execute Trajectory description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ > Websocket endpoint Provides execution control over a previously [planned trajectory](#/operations/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](#/operations/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](#/operations/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](#/operations/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. operationId: executeTrajectory x-scope: can_operate_controllers x-bidistream: true parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: content: application/json: schema: $ref: '#/components/schemas/ExecuteTrajectoryRequest' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ExecuteTrajectoryResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/controllers/{controller}/execution/jogging: get: tags: - Jogging summary: Execute Jogging description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ > Websocket endpoint Provides execution control over a dynamically adaptable jogging motion for a motion group. Jogging describes controlling a motion group by sending real-time commands to move either its joints or the TCP. The commands contain target velocities that may change at any time during execution, so the resulting motion cannot be computed upfront. ### Preconditions The motion group is not moved by any other endpoint. ### Requests #### 1. Send `InitializeJoggingRequest` to configure the jogging. - Sets the robot controller mode to control mode. - Claims the motion group for jogging. For robotic arms, TCP is required to ensure that limits, including TCP limits, are respected. #### 2. Send `JointVelocityRequest` or `TcpVelocityRequest` to start the jogging motion. - Commands can only be processed in the cycle rate of the controller - Sending commands faster will not increase the responsiveness of the jogging motion, it will lead to dropped commands - It is recommended to couple sending commands with the [state stream](#/operations/streamMotionGroupState), which can be subscribed to via nats as well. #### 3. Change or stop the jogging motion - Change the jogging direction and/or velocity during the jogging motion with `JointVelocityRequest` or `TcpVelocityRequest`. - To stop the jogging motion, send zero velocities via either request or `PauseJoggingRequest`. ### Responses - Each request is acknowledged with a corresponding response: - `InitializeJoggingResponse` after `InitializeJoggingRequest` - `JointVelocityResponse` after `JointVelocityRequest` - `TcpVelocityResponse` after `TcpVelocityRequest` - `PauseJoggingResponse` after `PauseJoggingRequest` The responses confirm that the requests were received. They do not signal that the operation was successful; check the [motion group state](#/operations/streamMotionGroupState) for that. - `MovementErrorResponse` with error details is sent in case of an unexpected error, e.g., controller disconnects during jogging. ### Tips and Tricks - Ensure that the websocket connection remains open until the jogging motion is stopped to avoid unexpected stops. operationId: executeJogging x-scope: can_operate_controllers x-bidistream: true parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: content: application/json: schema: $ref: '#/components/schemas/ExecuteJoggingRequest' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ExecuteJoggingResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /experimental/cells/{cell}/controllers/{controller}/execution/jogging: get: tags: - Jogging summary: Execute Waypoint Jogging description: | **Required permissions:** `can_operate_controllers` - Operate and monitor robot controllers ___ > **Experimental** > > This endpoint is experimental and its behavior may change in future releases. > Websocket endpoint Provides waypoint-based jogging control for a motion group. Instead of commanding target velocities (see [executeJogging](#/operations/executeJogging)), waypoint jogging streams a queue of timed waypoints that the robot moves through by best effort. This can be used for realtime action chunk streaming, e.g., from a Vision-Language-Action (VLA) model. ### Preconditions The motion group is not moved by any other endpoint. ### Requests #### 1. Send `InitializeJoggingRequest` to configure the jogging. - Sets the robot controller mode to control mode. - Claims the motion group for jogging. For robotic arms, TCP is required to ensure that limits, including TCP limits, are respected. #### 2. Send `JointWaypointsRequest` or `PoseWaypointsRequest` to stream waypoints. - The first waypoints message starts an internal clock. - Each waypoint carries a timestamp relative to that clock for when it should be reached. - Existing waypoints in the queue that are older than the first new timestamp are removed. - The current session timestamp is reported in `execute.details.jogger_session_timestamp_ms` of the [streamRobotControllerState](#/operations/streamRobotControllerState) endpoint. #### 3. Stop the jogging motion - Send `PauseJoggingRequest` to stop the motion. ### Responses - Each request is acknowledged with a corresponding response: - `InitializeJoggingResponse` after `InitializeJoggingRequest` - `JointWaypointsResponse` after `JointWaypointsRequest` - `PoseWaypointsResponse` after `PoseWaypointsRequest` - `PauseJoggingResponse` after `PauseJoggingRequest` The responses confirm that the requests were received. They do not signal that the operation was successful; check the [motion group state](#/operations/streamMotionGroupState) for that. - `MovementErrorResponse` with error details is sent in case of an unexpected error, e.g., controller disconnects during jogging. ### Tips and Tricks - Ensure that the websocket connection remains open until the jogging motion is stopped to avoid unexpected stops. operationId: executeWaypointJogging x-scope: can_operate_controllers x-bidistream: true parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: content: application/json: schema: $ref: '#/components/schemas/ExecuteWaypointJoggingRequest' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ExecuteWaypointJoggingResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /experimental/cells/{cell}/programs: get: tags: - Program summary: List programs description: | **Required permissions:** `can_operate_programs` - Execute and monitor programs ___ > **Experimental** List details of all existing programs. operationId: listPrograms x-scope: can_operate_programs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: Successful Response content: application/json: schema: title: Response of list programs type: array items: $ref: '#/components/schemas/Program' examples: two_programs: summary: Example with two programs description: Sample response showing two different programs value: - program: pick_and_place name: Pick and Place Operation description: A program that picks up objects from a conveyor and places them in designated locations app: app1 - program: welding_sequence name: Automated Welding Sequence description: Complex welding program with multiple passes and quality checks app: app2 '500': description: Internal server error /experimental/cells/{cell}/programs/{program}: get: tags: - Program summary: Get program description: | **Required permissions:** `can_operate_programs` - Execute and monitor programs ___ > **Experimental** Get details of a program. operationId: getProgram x-scope: can_operate_programs parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Program' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/Program' example: program: pick_and_place name: Pick and Place Demo description: A demo program for pick and place operations app: app1 '500': description: Internal server error /experimental/cells/{cell}/programs/{program}/start: post: tags: - Program summary: Start the program description: | **Required permissions:** `can_operate_programs` - Execute and monitor programs ___ > **Experimental** This endpoint starts a new program execution. The program will be executed asynchronously. operationId: startProgram x-scope: can_operate_programs parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Program' requestBody: content: application/json: schema: $ref: '#/components/schemas/ProgramStartRequest' required: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ProgramRun' examples: minimal: summary: Minimal example value: run: run_125 program: app1.pick_and_place state: PREPARING start_time: '2024-01-15T12:00:00Z' '400': description: Either a syntax or a runtime error '404': description: Not found '406': description: A program run is already running '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' '452': description: | Robot is not able to perform the motion due to hard or soft restrictions. This can be due to a variety of reasons: - The robot is too close to a singularity, - The robot is too close to a joint limit, - Robot operating mode could not be set to the desired mode, - An operating mode change occurred during the motion. In the case of an error, the full error will be returned in the response body. '500': description: Internal server error /experimental/cells/{cell}/programs/{program}/stop: post: tags: - Program summary: Stop program run description: | **Required permissions:** `can_operate_programs` - Execute and monitor programs ___ > **Experimental** Stop a specific program run. operationId: stopProgram x-scope: can_operate_programs parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Program' responses: '204': description: Successful Response. Will also be returned if the run is not running. '404': description: Not found '500': description: Internal server error /experimental/cloud/connect: post: operationId: connectToNovaCloud x-scope: can_manage_cloud_connection summary: Connect to NOVA Cloud tags: - NOVA Cloud description: |- **Required permissions:** `can_manage_cloud_connection` - Manage NOVA Cloud connection ___ > **Experimental** Register this instance with the NOVA Cloud fleet manager and configure the local NATS server to establish a leafnode connection. The fleet manager will then be able to receive event data from this instance, allowing it to monitor the connected robots. Establishing the connection can take some time (~30-60 seconds), as the NATS server pod in the cluster needs to restart to apply the new configuration. parameters: - schema: type: integer minimum: 1 description: |- The maximum time (**in seconds**) spent waiting until the operation is complete. If the parameter is set, the request will wait for completion until the specified time is up. For POST and PUT requests completion means that all resources are running and usable. For DELETE completion means that the deletion process is completed. required: false description: |- The maximum time (**in seconds**) spent waiting until the operation is complete. If the parameter is set, the request will wait for completion until the specified time is up. For POST and PUT requests completion means that all resources are running and usable. For DELETE completion means that the deletion process is completed. name: completion_timeout in: query requestBody: content: application/json: schema: $ref: '#/components/schemas/CloudConnectionRequest' responses: '200': description: The instance was successfully connected to NOVA Cloud. content: application/json: schema: $ref: '#/components/schemas/CloudRegistrationSuccessResponse' '202': description: The instance was registered and the connection process has started. content: application/json: schema: $ref: '#/components/schemas/CloudRegistrationSuccessResponse' '400': description: The request parameters failed to validate. content: application/json: schema: $ref: '#/components/schemas/ZodValidationError' '424': description: The connection to NOVA Cloud could not be established. content: application/json: schema: $ref: '#/components/schemas/CloudConnectionError' /experimental/cloud/config: delete: operationId: disconnectFromNovaCloud x-scope: can_manage_cloud_connection summary: Disconnect from NOVA Cloud tags: - NOVA Cloud description: |- **Required permissions:** `can_manage_cloud_connection` - Manage NOVA Cloud connection ___ > **Experimental** Disconnects this instance from NOVA Cloud and removes the local NATS leafnode configuration. parameters: - schema: type: integer minimum: 1 description: |- The maximum time (**in seconds**) spent waiting until the operation is complete. If the parameter is set, the request will wait for completion until the specified time is up. For POST and PUT requests completion means that all resources are running and usable. For DELETE completion means that the deletion process is completed. required: false description: |- The maximum time (**in seconds**) spent waiting until the operation is complete. If the parameter is set, the request will wait for completion until the specified time is up. For POST and PUT requests completion means that all resources are running and usable. For DELETE completion means that the deletion process is completed. name: completion_timeout in: query responses: '200': description: The instance was successfully disconnected from NOVA Cloud. content: application/json: schema: $ref: '#/components/schemas/CloudDisconnectionStatusDisconnected' '202': description: The connection configuration was removed and the NATS server is restarting to apply the changes. content: application/json: schema: $ref: '#/components/schemas/CloudDisconnectionStatusDisconnecting' '424': description: The instance could not be disconnected from NOVA Cloud. content: application/json: schema: $ref: '#/components/schemas/CloudDisconnectionError' get: operationId: getNovaCloudConfig x-scope: can_access_system summary: Get Connection Config tags: - NOVA Cloud description: |- **Required permissions:** `can_access_system` - View system status and metadata ___ > **Experimental** Get the current NOVA Cloud connection config for this instance. responses: '200': description: Configuration details content: application/json: schema: $ref: '#/components/schemas/CloudConfigStatus' /cells/{cell}/virtual-controllers/{controller}/motion-groups: get: tags: - Virtual Controller summary: Motion Group Description description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Gets information on the motion group. operationId: getMotionGroups x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MotionGroupInfos' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' post: tags: - Virtual Controller summary: Add Motion Group description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Adds a motion group configuration for the virtual robot controller. Fields: - Only one of **motion_group_model** or **json_data** should be set. - **motion_group_model**: Identifies a single motion group. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported types. - **json_data**: Full JSON configuration of the virtual robot controller. This can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration). - **extracted_motion_group_id** (required when using json_data): The motion group identifier to extract from the provided JSON configuration. - **motion_group**: Unique identifier for the motion group to be added. - **initial_joint_position**: Specifies the initial joint position for the added motion group. > #### NOTE > > When a motion group is added, **the virtual robot is restarted** to apply the new configuration. > > During this restart: > - Robot visualization can temporarily disappear or appear outdated in the UI. > - Motion group changes are not immediately visible in visualizations. > - All connections to virtual robot are closed and re-established, which introduces a short delay before the system is fully operational again. > > The API call itself **does not wait until the restart and re-synchronization are complete**. > This means that immediately after a successful response, the new motion group may not yet be available for use. operationId: addVirtualControllerMotionGroup x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AddVirtualControllerMotionGroupRequest' examples: usingType: summary: Using predefined type value: motion_group: '1' motion_group_model: Yaskawa_TURN2 initial_joint_position: '[0.0, 1.0]' usingJson: summary: Using custom JSON configuration value: motion_group: '1' json_data: ... long JSON string ... extracted_motion_group_id: '2' initial_joint_position: '[0.0, 1.0]' responses: '200': description: Motion group added successfully content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/safety-zones: get: tags: - Virtual Controller summary: List Safety Zones description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Gets all safety zones configured in the virtual robot controller. Safety zones define geometric boundaries that restrict robot motion or define protected areas in the workspace. operationId: getVirtualControllerSafetyZones x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SafetyZones' examples: fanuc: summary: Safety zones from a FANUC controller value: safety_zones: - id: 1 name: Cell priority: 0 restricted: true geometry: id: '' box: center: - 900 - -1000 - -1000 neighbour: - -1000 - -1000 - -1000 - 900 - 400 - -1000 - 900 - -1000 - 1500 inverted: true mg_uid: 0 uid_ref_cs: '101' active: true - id: 2 name: Table priority: 0 restricted: true geometry: id: '' box: center: - -1500 - -1000 - -400 neighbour: - 2000 - -1000 - -400 - -1500 - 1500 - -400 - -1500 - -1000 - 2000 inverted: true mg_uid: 0 uid_ref_cs: '101' active: true yaskawa: summary: Safety zones from a Yaskawa controller value: safety_zones: - id: 1 name: '' priority: 0 restricted: true geometry: id: '' prism: point: - 1850 - 1100 - -1000 - 1100 - -1000 - -1200 - 1850 - -1200 top: 1400 bottom: -530 inverted: true mg_uid: 0 uid_ref_cs: '' active: true - id: 2 name: '' priority: 0 restricted: true geometry: id: '' prism: point: - 400 - 1000 - 1850 - 1000 - 1850 - -1000 - 400 - -1000 top: -125 bottom: -530 inverted: false mg_uid: 0 uid_ref_cs: '' active: true - id: 3 name: '' priority: 0 restricted: true geometry: id: '' prism: point: - 400 - -1040 - 1850 - -1040 - 1850 - -1200 - 400 - -1200 top: 1400 bottom: -530 inverted: false mg_uid: 0 uid_ref_cs: '' active: true abb: summary: Safety zones from an ABB controller (ABB_1) value: safety_zones: - id: 1 name: Safe_Zone priority: 0 restricted: true geometry: id: '' prism: point: - 900 - -1000 - 900 - 800 - -700 - 800 - -700 - -1000 top: 2000 bottom: 0 inverted: true mg_uid: 0 uid_ref_cs: '' active: true '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' post: tags: - Virtual Controller summary: Add Safety Zone description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Adds a new safety zone to the virtual robot controller. Safety zones define geometric boundaries that restrict or permit robot motion in 3D space. Each zone has a `geometry` that defines its shape, and two flags that control its behavior: - **`restricted: true`** the robot is not allowed to enter this zone. - **`inverted: true`** the zone applies to the **outside** of the shape, meaning the shape defines the *allowed* region; everything outside is the zone. Combined with `restricted: true`, the robot must stay **inside** the shape. Common combinations: | `restricted` | `inverted` | Effect | |---|---|---| | `true` | `false` | Keep-out zone, the robot cannot enter the shape, e.g., obstacle, table, wall | | `true` | `true` | Keep-in zone, the robot must stay inside the shape, e.g., workspace envelope / cell boundary | The `mg_uid` field specifies which motion group the safety zone is enforced for and must match an existing motion group UID on the controller. The `uid_ref_cs` field defines the coordinate system in which the geometry coordinates are expressed. The coordinate system must be defined on the controller beforehand. If empty (`""`), the World coordinate system is used. Using an incorrect coordinate system places the safety zone in a different physical location. --- ## Geometry Shape Reference All coordinates are in **millimetres (mm)**. Choose the shape that best fits the physical boundary. --- ### Box A rectangular cuboid defined by one **corner point** (`center`) and **three adjacent corners** (`neighbour`). Despite the field name, `center` is not the geometric centroid but one corner of the box, and each `neighbour` is the corner directly connected to it by one edge. This format is used directly by robot controllers (FANUC, KUKA, etc.) and supports arbitrary orientations, including left-handed coordinate systems that parametric (size + quaternion) formats cannot represent. **When to use:** Cell workspace envelope, machine enclosure, table, rectangular obstacle, pallet zone. **How to define:** ``` center → one corner of the box [x, y, z] neighbour = [ x1, y1, z1, ← corner connected by the first edge x2, y2, z2, ← corner connected by the second edge x3, y3, z3 ← corner connected by the third edge ] edge_length_i = ||neighbour_i − corner|| ``` The three edge vectors and the geometric centroid are: ``` d0 = neighbour[0] − corner d1 = neighbour[1] − corner d2 = neighbour[2] − corner centroid = corner + (d0 + d1 + d2) / 2 ``` For an **axis-aligned** box with one corner at `[cx, cy, cz]` and edge lengths `[ex, ey, ez]`: ``` corner = [cx, cy, cz] neighbour = [cx+ex, cy, cz, cx, cy+ey, cz, cx, cy, cz+ez] ``` --- ### Prism An extruded polygon is a 2D closed polygon (defined in the XY plane) extruded vertically between `bottom` and `top` Z coordinates. The polygon can be convex or concave. **When to use:** Irregular floor-plan areas (aisles, loading bays, L-shaped zones), conveyor corridors, or any zone with a non-rectangular footprint. **How to define:** ``` point = [x1, y1, x2, y2, x3, y3, ...] ← 2D vertices (XY), flattened, ≥ 3 points top = upper Z bound [mm] bottom = lower Z bound [mm] ``` Points must form a closed polygon; the last point implicitly connects to the first. --- ### Sphere A perfect sphere defined by its **center point** and **radius**. **When to use:** Protection zones around sensors, cameras, workpieces, point-like obstacles, singularity avoidance zones around the robot base. **How to define:** ``` center = [x, y, z] ← center of the sphere [mm] radius ← radius [mm] ``` --- ### Capsule A cylinder with hemispherical caps at each end, defined by two axis endpoints (`top`, `bottom`) and a **radius**. The axis can have any orientation. **When to use:** Pipes, cable trays, vertical columns, horizontal beams, or tube-shaped obstacles. **How to define:** ``` top = [x, y, z] ← center of the top hemisphere [mm] bottom = [x, y, z] ← center of the bottom hemisphere [mm] radius ← cylinder + hemisphere radius [mm] ``` The total length of the capsule is `||top − bottom|| + 2 × radius`. --- ### Lozenge A rounded rectangle (stadium/discorectangle shape) in a plane, defined by a **center pose**, two **dimensions**, and a **corner radius**. The plane orientation is defined by the quaternion in `center`. **When to use:** Conveyor belt surfaces, worktables with rounded edges, or flat rectangular zones in arbitrary orientations. **How to define:** ``` center.x/y/z ← position of the center [mm] center.qx/qy/qz/qw ← orientation as unit quaternion (identity = XY plane) x_dimension ← total length along local X axis [mm] y_dimension ← total width along local Y axis [mm] radius ← corner rounding radius [mm] ``` For a horizontal lozenge, use identity quaternion `(qx=0, qy=0, qz=0, qw=1)`. --- ### Plane A mathematical half-space plane defined by its **3D vertices**. All vertices must be coplanar. The plane is unbounded (infinite extent in all directions parallel to the surface). The points define the plane's orientation and position only. **When to use:** Floor boundaries, virtual walls, tilted surfaces, e.g., ramps, inclined conveyors, or flat custom barriers. **How to define:** ``` point = [x1, y1, z1, x2, y2, z2, x3, y3, z3, ...] ← 3D vertices, flattened, ≥ 3 points ``` Points must be coplanar and form a closed polygon. --- > #### NOTE > > When a safety zone is added, **the virtual robot is restarted** to apply the new configuration. > > During this restart: > - All connections to the virtual robot are closed and re-established, introducing a short delay before the system is fully operational again. > - The safety checksum is automatically updated to reflect the configuration change. > > The API call **does not wait until the restart and re-synchronization are complete**. operationId: addVirtualControllerSafetyZone x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/SafetyZone' examples: box_keep_in: summary: Box, keep-in zone (cell workspace envelope) description: | The robot must stay inside this box, e.g., workspace boundary / cell envelope. restricted=true + inverted=true → outside the box is forbidden. Corner at (-1200, 900, -800). The three neighbour points are the adjacent corners connected by edges along X, Y, and Z respectively. Replace center and neighbour values to match your cell dimensions. value: id: 1 name: Cell priority: 0 restricted: true active: true mg_uid: 0 uid_ref_cs: '' geometry: id: '' box: center: - -1200 - 900 - -800 neighbour: - 1700 - 900 - -800 - -1200 - -1600 - -800 - -1200 - 900 - 3000 inverted: true box_keep_out: summary: Box, keep-out zone (robot table / obstacle) description: | The robot must not enter this box, e.g., robot table or machine enclosure. restricted=true + inverted=false → inside the box is forbidden. Corner at (-1200, 800, -800). Neighbour points are the adjacent corners connected by edges along X, Y, and Z respectively. Replace center and neighbour values to match your obstacle dimensions. value: id: 2 name: robot table priority: 0 restricted: true active: true mg_uid: 0 uid_ref_cs: '' geometry: id: '' box: center: - -1200 - 800 - -800 neighbour: - 1200 - 800 - -800 - -1200 - -450 - -800 - -1200 - 800 - -450 inverted: false prism_keep_in: summary: Prism, keep-in zone (workspace envelope) description: | The robot must stay inside this prism, e.g., outer workspace boundary. restricted=true + inverted=true → outside the polygon is forbidden. A 4-point rectangular footprint is extruded from Z=-500 to Z=3000mm. Points are XY pairs [x1,y1, x2,y2, ...] that form a closed polygon. Replace point coordinates `top` and `bottom` to match your workspace. value: id: 1 name: workspace boundary priority: 0 restricted: true active: true mg_uid: 0 uid_ref_cs: '' geometry: id: '' prism: point: - 1600 - -794.35 - 1600 - 805.65 - -1100 - 805.65 - -1100 - -794.35 top: 3000 bottom: -500 inverted: true prism_keep_out: summary: Prism, keep-out zone (inner restricted area) description: | The robot must not enter this prism volume, e.g., area below robot table. restricted=true + inverted=false → inside the polygon is forbidden. A 4-point rectangular footprint is extruded from Z=-500 to Z=150mm. Replace point coordinates `top` and `bottom` to match your obstacle. value: id: 2 name: restricted area priority: 0 restricted: true active: true mg_uid: 0 uid_ref_cs: '' geometry: id: '' prism: point: - 1500 - -694.35 - 1500 - 705.65 - 400 - 705.65 - 400 - -694.35 top: 150 bottom: -500 inverted: false sphere_keep_out: summary: Sphere, keep-out zone (sensor / camera protection) description: | The robot must not approach within 350mm of a fixed camera at (600, -300, 1200). restricted=true + inverted=false → inside the sphere is forbidden. Adjust the center to the sensor or workpiece position and adjust the radius to match the required safety margin. value: id: 5 name: Camera protection priority: 0 restricted: true active: true mg_uid: 0 uid_ref_cs: '' geometry: id: '' sphere: center: - 600 - -300 - 1200 radius: 350 inverted: false capsule_keep_out: summary: Capsule, keep-out zone (vertical pipe / column) description: | The robot must not approach the vertical steel column. The column runs from the floor (Z=0) to the ceiling (Z=3000), centered at (1200, -700). Radius includes the pipe diameter plus a 100mm safety margin. Adjust `top` and `bottom` for the pipe length, and adjust the radius to match the pipe size and required clearance. value: id: 6 name: Steel column priority: 0 restricted: true active: true mg_uid: 0 uid_ref_cs: '' geometry: id: '' capsule: top: - 1200 - -700 - 3000 bottom: - 1200 - -700 - 0 radius: 200 inverted: false lozenge_keep_out: summary: Lozenge , keep-out zone (conveyor belt surface) description: | The robot must not contact or cross the horizontal conveyor belt surface. The lozenge is a planar shape (zero thickness). The controller enforces it as a one-sided surface barrier, not a volumetric zone. The forbidden side is determined by the face normal, which poinbts in the +Z direction for identity quaternion. It is centered at (900, 0, 850) and lies in the XY plane (identity quaternion). x_dimension=2400mm (belt length), y_dimension=600mm (belt width), radius=50mm (corner rounding). For a tilted surface, rotate the quaternion to match the belt's tilt angle. value: id: 7 name: Conveyor belt priority: 0 restricted: true active: true mg_uid: 0 uid_ref_cs: '' geometry: id: '' lozenge: center: x: 900 'y': 0 z: 850 qx: 0 qy: 0 qz: 0 qw: 1 x_dimension: 2400 y_dimension: 600 radius: 50 inverted: false plane_keep_out: summary: Plane, keep-out zone (virtual floor boundary) description: | The robot must not cross below Z=0 (virtual floor plane). Defined by three coplanar points in the Z=0 plane, e.g., origin, the +X axis, and the +Y axis. The plane shape is a one-sided surface barrier. The face normal points in the direction of the outward-facing side of the polygon (for a floor at Z=0, the normal points upward along +Z). The forbidden half-space lies on the opposite side of the normal, Z<0 in this case. For a wall or tilted surface, define the vertices so that the face normal points away from the permitted workspace. The robot is then blocked from crossing to the other side. restricted=true + inverted=false → the half-space behind the polygon normal is forbidden. value: id: 8 name: Floor plane priority: 0 restricted: true active: true mg_uid: 0 uid_ref_cs: '' geometry: id: '' plane: point: - 3000 - 3000 - 0 - -3000 - 3000 - 0 - -3000 - -3000 - 0 - 3000 - -3000 - 0 inverted: false responses: '200': description: Safety zone added successfully content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/safety-zones/{id}: delete: tags: - Virtual Controller summary: Delete Safety Zone description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Removes a safety zone from the virtual robot controller. > #### NOTE > > When a safety zone is removed, **the virtual robot is restarted** to apply the new configuration. > > During this restart: > - All connections to the virtual robot are closed and re-established, which introduces a short delay before the system is fully operational again. > - The safety checksum is automatically updated to reflect the configuration change. > > The API call itself **does not wait until the restart and re-synchronization are complete**. operationId: deleteVirtualControllerSafetyZone x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: id in: path description: The unique identifier of the safety zone to delete. required: true schema: type: integer format: int32 minimum: 0 maximum: 2147483647 responses: '200': description: Safety zone deleted successfully content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/ios/values: get: tags: - Virtual Controller Inputs/Outputs summary: Get Input/Output Values description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Retrieves the current values of inputs/outputs of the virtual controller. The identifiers of inputs/outputs must be provided in the request. Request all available input/output identifiers via [listVirtualControllerIODescriptions](#/operations/listVirtualControllerIODescriptions). operationId: listIOs x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: ios in: query required: true schema: type: array items: type: string description: | Array of input/output identifiers to retrieve the values for. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListIOValuesResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' put: tags: - Virtual Controller Inputs/Outputs summary: Set Input/Ouput Values description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Sets a list of values of a virtual controller inputs/outputs. operationId: setIOValues x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: content: application/json: schema: type: array items: $ref: '#/components/schemas/IOValue' example: - io: io1 value: true value_type: boolean - io: io2 value: '42' value_type: integer - io: io3 value: 3.14 value_type: float required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '501': $ref: '#/components/responses/NotImplemented' /cells/{cell}/virtual-controllers/{controller}/ios/description: get: tags: - Virtual Controller Inputs/Outputs summary: List Descriptions description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Lists the input/output descriptions of the virtual robot controller. The input/output descriptions contain information like name, type and unit.\ Available inputs/outputs are defined by the virtual robot controller.\ Each input/output has a unique identifier. - If no identifiers and no filters are specified in the request, all available inputs/outputs are retrieved by this endpoint. - If a filter, e.g., `direction`, `value_type`, `group` is applied, only matching inputs/outputs are returned. operationId: listVirtualControllerIODescriptions x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: ios in: query schema: type: array description: | Array of input/output identifiers to retrieve the descriptions for. If empty or not provided, descriptions of all available inputs/outputs for the requested robot controller will be returned. items: type: string - name: direction in: query schema: $ref: '#/components/schemas/IODirection' description: | Return only inputs/outputs with the specified direction. - name: value_type in: query schema: $ref: '#/components/schemas/IOValueType' description: | Return only inputs/outputs with the specified value type. - name: group in: query schema: type: string description: | Return only inputs/outputs from the specified group. responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListIODescriptionsResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/motion-groups/{motion-group}/state: get: tags: - Virtual Controller summary: Get Motion Group State description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Get the current motion group state which provides values for the joints' position, velocity and acceleration. operationId: getMotionGroupState x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/MotionGroupJoints' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' put: tags: - Virtual Controller summary: Set Motion Group State description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Sets the values for joint position, joint velocity or joint acceleration of a motion group state. The values are immediately applied to the joints of the motion group. > #### NOTE > > Only use the endpoint when the motion group is in monitor mode. If the motion group is controlled, currently jogging or planning motions, > the values are overridden by the controller or an error may occur. operationId: setMotionGroupState x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' requestBody: content: application/json: schema: $ref: '#/components/schemas/MotionGroupJoints' required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/motion-groups/{motion-group}: delete: tags: - Virtual Controller summary: Delete Motion Group description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Removes a motion group configuration from the virtual controller. > #### NOTE > > When a motion group is removed, **the virtual robot is restarted** to apply the new configuration. > > During this restart: > - Robot visualization can temporarily disappear or appear outdated in the UI. > - Motion group changes are not immediately visible in visualizations. > - All connections to virtual robot are closed and re-established, which introduces a short delay before the system is fully operational again. > > The API call itself **does not wait until the restart and re-synchronization are complete**. operationId: deleteVirtualControllerMotionGroup x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' responses: '200': description: Motion group deleted successfully content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/coordinate-systems: get: tags: - Virtual Controller summary: List Coordinate Systems description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Lists all coordinate systems on the robot controller. operationId: listVirtualControllerCoordinateSystems x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListCoordinateSystemsResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/coordinate-systems/{coordinate-system}: put: tags: - Virtual Controller summary: Add Coordinate Systems description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Adds a coordinate system to the robot controller. > #### NOTE > > When a new coordinate system is added, the **virtual robot is restarted** to apply the new configuration. > > During this restart: > - Robot visualization can temporarily disappear or appear outdated in the UI. > - Coordinate system changes are not immediately visible in visualizations. > - All connections to virtual robot are closed and re-established, which introduces a short delay before the system is fully operational again. > > The API call itself does **not wait until the restart and re-synchronization are complete**. > This means that immediately after a successful response, the new coordinate system may not yet be available for visualization or program execution. operationId: addVirtualControllerCoordinateSystem x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/CoordinateSystem' requestBody: content: application/json: schema: $ref: '#/components/schemas/CoordinateSystemData' example: name: CS-user position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 orientation_type: ROTATION_VECTOR required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' delete: tags: - Virtual Controller summary: Delete Coordinate System description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Deletes a coordinate system from the virtual controller. This will remove the coordinate system from the list of coordinate systems and also remove all dependent coordinate systems that use the deleted coordinate system as reference. > #### NOTE > > When a new coordinate system is removed, the **virtual robot is restarted** to apply the new configuration. > > During this restart: > - Robot visualization can temporarily disappear or appear outdated in the UI. > - Coordinate system changes are not immediately visible in visualizations. > - All connections to virtual robot are closed and re-established, which introduces a short delay before the system is fully operational again. > > The API call itself does **not wait until the restart and re-synchronization are complete**. > This means that immediately after a successful response, the new coordinate system may not yet be available for visualization or program execution. operationId: deleteVirtualControllerCoordinateSystem x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/CoordinateSystem' - name: delete_dependent in: query schema: type: boolean default: false description: If true, all dependent coordinate systems will be deleted as well. responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/motion-groups/{motion-group}/mounting: get: tags: - Virtual Controller summary: Get Mounting description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Gets motion group mounting. The motion group is based on the origin of the returned coordinate system. operationId: getVirtualControllerMounting x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CoordinateSystem' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' put: tags: - Virtual Controller summary: Set Mounting description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Sets the motion group mounting by specifying a coordinate system. The motion group will be based on the coordinate system's origin. The coordinate system defines a transformation offset, which consists of: - A unique identifier - A user-facing name - An offset in another coordinate system, referenced by the unique identifier of the reference coordinate system. > #### Changing the mounting configuration is considered a setup change > > When the mounting is set to a new coordinate system, the **virtual robot is restarted** to apply the new configuration. > > During this restart: > - Robot visualization can temporarily disappear or not reflect the new mounting immediately. > - Motion group state and coordinate system alignment may not be immediately visible in visualizations. > - All connections to virtual robot are closed and re-established, which introduces a short delay before the system is fully operational again. > > The API call itself does **not wait until the restart and re-synchronization are complete**. > A successful response indicates that the request was accepted, but the updated mounting may not yet be visible. operationId: setVirtualControllerMounting x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' requestBody: content: application/json: schema: $ref: '#/components/schemas/CoordinateSystem' example: coordinate_system: world name: mounting position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 orientation_type: ROTATION_VECTOR required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CoordinateSystem' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/motion-groups/{motion-group}/tcps: get: tags: - Virtual Controller summary: List TCPs description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Lists TCPs of the motion group. An empty TCP list is valid, e.g., for external axes. operationId: listVirtualControllerTcps x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/RobotTcps' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/motion-groups/{motion-group}/tcps/{tcp}: put: tags: - Virtual Controller summary: Add TCP description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Adds a new TCP or updates an existing TCP in the motion group. The position and rotation values in the request body are defined within the flange's coordinate system. > **NOTE** > > Ensure the TCP's position is within the robot's reach. Refer to the robot's documentation or data sheet for details like joint limits or reach. > #### NOTE > > When adding or updating a TCP, the **virtual robot is restarted** to apply the new configuration. > > During this restart: > - Robot visualization can temporarily disappear. > - The TCP may not be immediately visible or appear outdated in visualizations. > - All connections to virtual robot are closed and re-established, which introduces a short delay before the TCP is available for operation. > > The API call itself does **not wait until the restart and re-synchronization are complete**. > A successful response indicates that the request was accepted, but the TCP may not yet be visible nor usable. operationId: addVirtualControllerTcp x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' - $ref: '#/components/parameters/Tcp' requestBody: content: application/json: schema: $ref: '#/components/schemas/RobotTcpData' examples: add-tcp-only: summary: Add TCP without payload value: id: kuka name: kuka-TOOL position: - 2.2 - 0 - 0 orientation: - 0 - 1.1 - 0 orientation_type: ROTATION_VECTOR add-tcp-with-payload: summary: Add TCP with payload value: id: kuka name: kuka-TOOL position: - 2.2 - 0 - 0 orientation: - 0 - 1.1 - 0 orientation_type: ROTATION_VECTOR payload: name: kuka-payload mass: 0.34 center_of_mass: - 0.1 - 0 - 0 moment_of_inertia: - 0 - 0 - 2.1 required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' delete: tags: - Virtual Controller summary: Remove TCP description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Removes the TCP (Tool Center Point) from the motion group. An unknown TCP is a valid input and will simply be ignored. > #### NOTE > > When removing a TCP, the **virtual robot is restarted** to apply the new configuration. > > During this restart: > - Robot visualization can temporarily disappear. > - The removal of the TCP may not be immediately visible or appear outdated in visualizations. > - All connections to virtual robot are closed and re-established, which introduces a short delay before the system is fully operational again. > > The API call itself does **not wait until the restart and re-synchronization are complete**. > A successful response indicates that the request was accepted, but the then used TCP may not yet be visible nor usable. operationId: deleteVirtualControllerTcp x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - $ref: '#/components/parameters/MotionGroup' - $ref: '#/components/parameters/Tcp' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/emergency-stop: get: tags: - Virtual Controller summary: Get Emergency Stop State description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Requests the Emergency Stop state of the virtual robot controller. Use [getCurrentMotionGroupState](#/operations/getCurrentMotionGroupState) to get the Emergency Stop state with `safety_state` regardless of the controller type. > **NOTE** > > The Emergency Stop state can only be changed when using virtual robot controllers. operationId: getEmergencyStop x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Flag' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' put: tags: - Virtual Controller summary: Push or Release Emergency Stop description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Activates or releases the Emergency Stop on the virtual robot controller. Activating the Emergency Stop stops the execution of all motions. The stop is executed on physical controllers immediately not gracefully and not on paths. Due to restricted physical behavior of the virtual robot controller, the Emergency Stop is executed on paths. To return to normal operation the Emergency Stop needs to be released. Use [getCurrentMotionGroupState](#/operations/getCurrentMotionGroupState) to get the Emergency Stop state with `safety_state` regardless of the controller type. > **NOTE** > > The Emergency Stop state can only be changed via API when using virtual robot controllers. operationId: setEmergencyStop x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: active in: query schema: type: boolean responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/operationmode: get: tags: - Virtual Controller summary: Get Operation Mode description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Requests the operation mode of the virtual robot controller. To get the operation mode regardless of the controller type, use [getCurrentMotionGroupState](#/operations/getCurrentMotionGroupState). > **NOTE** > > The operation mode can only be changed via API when using virtual robot controllers. operationId: getOperationMode x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/OpMode' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' put: tags: - Virtual Controller summary: Set Operation Mode description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Changes the operation mode of the virtual robot controller to the specified value. To get the operation mode regardless of the controller type, use [getCurrentMotionGroupState](#/operations/getCurrentMotionGroupState). > **NOTE** > > The operation mode can only be changed via API when using virtual robot controllers. operationId: setOperationMode x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: mode in: query required: true schema: $ref: '#/components/schemas/OperationMode' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/cycle-time: get: tags: - Virtual Controller Behavior summary: Get Cycle Time description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Get the cycle time of controller communication in [ms]. operationId: getCycleTime x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CycleTime' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/behavior: get: tags: - Virtual Controller Behavior summary: Get Behavior description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Get the current virtual controller behavior. See [setVirtualControllerBehavior](#/operations/setVirtualControllerBehavior) and the body for details. operationId: getVirtualControllerBehavior x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Behavior' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' put: tags: - Virtual Controller Behavior summary: Set Behavior description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ Set virtual controller behavior. See query parameters for details. operationId: setVirtualControllerBehavior x-scope: can_operate_virtual_controllers parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' - name: behavior in: query schema: $ref: '#/components/schemas/Behavior' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/virtual-controllers/{controller}/external-joints-stream: get: tags: - Virtual Controller Behavior summary: Stream Joint Configuration description: | **Required permissions:** `can_operate_virtual_controllers` - Operate and configure virtual controllers ___ > Websocket endpoint Sends the **commanded** state, e.g., joint positions, velocities, accelerations, torques, for each motion group of the virtual controller and sets the joint configuration. Use [planTrajectory](#/operations/planTrajectory) and [executeTrajectory](#/operations/executeTrajectory) to move motion groups on virtual controllers. Learn more about the [movement behavior of virtual controllers in comparison to physical controllers](#/operations/executeTrajectory#movement-behavior). > **NOTE** > > Incoming joint configurations are not visualized and their velocity limits are not checked. #### Use cases 1. Creating a robotic application that dynamically adapts to the configured joints on the robot controller, using this stream to feed new joint configurations back to the motion groups.\ The stream only sends data to the robot controller if a motion is executed.\ If the robot controller's joint configuration differs too much from the incoming joint configuration, a following error occurs. Joint configurations that result in following errors are executed only for motions with a low velocity. 2. Mimic freedrive motions. > **DANGER** > > If the incoming joint configuration is set to maximum velocity, the movement to reach this incoming joint configuration > will be executed with maximum speed regardless of safety zones and mechanical limits. operationId: externalJointsStream x-scope: can_operate_virtual_controllers x-bidistream: true parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Controller' requestBody: content: application/json: schema: $ref: '#/components/schemas/ExternalJointStreamRequest' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ExternalJointStreamDatapoints' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' /cells/{cell}/store/objects: get: tags: - Store Object summary: List all Object Keys description: | **Required permissions:** `can_read_objects` - Read stored objects ___ List the keys for all objects. operationId: listAllObjectKeys x-scope: can_read_objects parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: Successful Response content: application/json: schema: type: array items: $ref: '#/components/schemas/Key' delete: tags: - Store Object summary: Clear all Objects description: | **Required permissions:** `can_write_objects` - Write stored objects ___ Delete all objects. > This will delete ALL your persistently stored data. operationId: clearAllObjects x-scope: can_write_objects parameters: - $ref: '#/components/parameters/Cell' responses: '204': description: Successful Response /cells/{cell}/store/objects/{key}: head: tags: - Store Object summary: Get Object Metadata description: | **Required permissions:** `can_read_objects` - Read stored objects ___ Returns metadata. Object content is not returned. operationId: getObjectMetadata x-scope: can_read_objects parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Key' responses: '200': description: Successful Response headers: Content-Type: $ref: '#/components/headers/Content-Type' Content-Length: $ref: '#/components/headers/Content-Length' Last-Modified: $ref: '#/components/headers/Last-Modified' X-Metadata: $ref: '#/components/headers/Metadata' '404': $ref: '#/components/responses/NotFound' get: tags: - Store Object summary: Get Object description: | **Required permissions:** `can_read_objects` - Read stored objects ___ Returns content and metadata of a stored object. operationId: getObject x-scope: can_read_objects parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Key' responses: '200': content: '*/*': schema: $ref: '#/components/schemas/BinaryObject' headers: Content-Type: $ref: '#/components/headers/Content-Type' Content-Length: $ref: '#/components/headers/Content-Length' Last-Modified: $ref: '#/components/headers/Last-Modified' X-Metadata: $ref: '#/components/headers/Metadata' description: Successful Response '404': $ref: '#/components/responses/NotFound' put: tags: - Store Object summary: Store Object description: | **Required permissions:** `can_write_objects` - Write stored objects ___ Store any data as an object. Using a key which already contains an object will override the previously stored object. Use [getObjectMetadata](#/operations/getObjectMetadata) to verify that the key does not contain objects. #### Optional Specify metadata as a dictionary with names and values. operationId: storeObject x-scope: can_write_objects parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Key' - $ref: '#/components/parameters/MetadataHeader' requestBody: content: multipart/form-data: schema: type: object properties: any_value: {} required: true responses: '204': description: Successful Response '400': description: Failed to store object content: application/json: schema: $ref: '#/components/schemas/Error' delete: tags: - Store Object summary: Delete Object description: | **Required permissions:** `can_write_objects` - Write stored objects ___ Delete an object > This will delete persistently stored data. operationId: deleteObject x-scope: can_write_objects parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Key' responses: '204': description: Successful Response '404': $ref: '#/components/responses/NotFound' /cells/{cell}/store/collision/colliders: get: tags: - Store Collision Components summary: List Colliders operationId: listStoredColliders x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns all stored colliders. parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ColliderDictionary' /cells/{cell}/store/collision/colliders-keys: get: tags: - Store Collision Components summary: List Collider Keys operationId: listStoredCollidersKeys x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns a list of keys for stored colliders. parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: type: array items: type: string description: List of collider keys /cells/{cell}/store/collision/colliders/{collider}: get: tags: - Store Collision Components summary: Get Collider operationId: getStoredCollider x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns the collider. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Collider' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Collider' '404': description: Not found content: {} put: tags: - Store Collision Components summary: Store Collider operationId: storeCollider x-scope: can_write_collision_world description: | **Required permissions:** `can_write_collision_world` - Write collision models and scenes ___ Stores collider. - If the collider does not exist, it will be created. - If the collider exists, it will be updated. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Collider' requestBody: content: application/json: schema: $ref: '#/components/schemas/Collider' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Collider' delete: tags: - Store Collision Components summary: Delete Collider operationId: deleteStoredCollider x-scope: can_write_collision_world description: | **Required permissions:** `can_write_collision_world` - Write collision models and scenes ___ Deletes the stored collider. > This will delete persistently stored data. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Collider' responses: '204': description: Deleted content: {} /cells/{cell}/store/collision/link-chains: get: tags: - Store Collision Components summary: List Link Chains operationId: listCollisionLinkChains x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns the stored link chains. parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: type: object additionalProperties: $ref: '#/components/schemas/LinkChain' /cells/{cell}/store/collision/link-chains-keys: get: tags: - Store Collision Components summary: List Link Chain Keys operationId: listCollisionLinkChainsKeys x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns a list of keys for stored link chains. parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: type: array items: type: string description: List of link chain keys /cells/{cell}/store/collision/link-chains/{link-chain}: get: tags: - Store Collision Components summary: Get Link Chain operationId: getStoredCollisionLinkChain x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns the collision link chain. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/LinkChain' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/LinkChain' '404': description: Not found content: {} put: tags: - Store Collision Components summary: Store Link Chain operationId: storeCollisionLinkChain x-scope: can_write_collision_world description: | **Required permissions:** `can_write_collision_world` - Write collision models and scenes ___ Stores link chain. - If the link chain does not exist, it will be created. - If the link chain exists, it will be updated. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/LinkChain' requestBody: content: application/json: schema: $ref: '#/components/schemas/LinkChain' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/LinkChain' delete: tags: - Store Collision Components summary: Delete Link Chain operationId: deleteStoredCollisionLinkChain x-scope: can_write_collision_world description: | **Required permissions:** `can_write_collision_world` - Write collision models and scenes ___ Deletes the stored link chain. > This will delete persistently stored data. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/LinkChain' responses: '204': description: Deleted content: {} /cells/{cell}/store/collision/tools: get: tags: - Store Collision Components summary: List Tools description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns the list of stored tools. operationId: listStoredCollisionTools x-scope: can_read_collision_world parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: type: object additionalProperties: $ref: '#/components/schemas/Tool' /cells/{cell}/store/collision/tools-keys: get: tags: - Store Collision Components summary: List Tool Keys operationId: listStoredCollisionToolsKeys x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns a list of keys for stored tools. parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: type: array items: type: string description: List of tool keys /cells/{cell}/store/collision/tools/{tool}: get: tags: - Store Collision Components operationId: getStoredCollisionTool x-scope: can_read_collision_world summary: Get Tool description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns the stored tool. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Tool' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Tool' '404': description: Not found content: {} put: tags: - Store Collision Components operationId: storeCollisionTool x-scope: can_write_collision_world summary: Store Tool description: | **Required permissions:** `can_write_collision_world` - Write collision models and scenes ___ Stores the tool. - If the tool does not exist, it will be created. - If the tool exists, it will be updated. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Tool' requestBody: content: application/json: schema: $ref: '#/components/schemas/Tool' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Tool' delete: tags: - Store Collision Components operationId: deleteStoredCollisionTool x-scope: can_write_collision_world summary: Delete Tool description: | **Required permissions:** `can_write_collision_world` - Write collision models and scenes ___ Deletes the stored tool. > This will delete persistently stored data. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Tool' responses: '204': description: Deleted content: {} /cells/{cell}/store/collision/setups: get: tags: - Store Collision Setups summary: List Collision Setups operationId: listStoredCollisionSetups x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns a list of stored collision setups. parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: type: object additionalProperties: $ref: '#/components/schemas/CollisionSetup' /cells/{cell}/store/collision/setups-keys: get: tags: - Store Collision Setups summary: List Collision Setup Keys operationId: listStoredCollisionSetupsKeys x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns a list of keys for stored collision setups. parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: type: array items: type: string description: List of collision setup keys /cells/{cell}/store/collision/setups/{setup}: get: tags: - Store Collision Setups summary: Get Collision Setup operationId: getStoredCollisionSetup x-scope: can_read_collision_world description: | **Required permissions:** `can_read_collision_world` - Read collision models and scenes ___ Returns the stored collision setup. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Setup' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CollisionSetup' '404': description: Not found content: {} put: tags: - Store Collision Setups summary: Store Collision Setup operationId: storeCollisionSetup x-scope: can_write_collision_world description: | **Required permissions:** `can_write_collision_world` - Write collision models and scenes ___ Stores collision setup. - If the collision setup does not exist, it will be created. - If the collision setup exists, it will be updated. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Setup' requestBody: content: application/json: schema: $ref: '#/components/schemas/CollisionSetup' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CollisionSetup' delete: tags: - Store Collision Setups summary: Delete Collision Setup operationId: deleteStoredCollisionSetup x-scope: can_write_collision_world description: | **Required permissions:** `can_write_collision_world` - Write collision models and scenes ___ Deletes the stored collision setup. > This will delete persistently stored data. parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/Setup' responses: '204': description: Deleted content: {} /cells/{cell}/bus-ios/ios/description: get: summary: List Descriptions description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ List all input/output descriptions for configured BUS services. The input/output descriptions contain information like name, type and unit. The input/output direction is given in perspective of the BUS service. operationId: listBusIODescriptions x-scope: can_operate_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/ListBusIODescriptionsResponse' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/state: get: summary: State description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get the current state of the BUS Inputs/Outputs service. operationId: getBusIOState x-scope: can_operate_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/BusIOsState' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/ios/values: get: tags: - BUS Inputs/Outputs summary: Get Input/Output Values description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Retrieves the current values of inputs/outputs. The identifiers of the inputs/outputs must be provided in the request. Request all available input/output identifiers via [listBusIODescriptions](#/operations/listBusIODescriptions). operationId: getBusIOValues x-scope: can_operate_bus_ios parameters: - $ref: '#/components/parameters/Cell' - name: ios in: query schema: type: array items: type: string description: | Array of input/output identifiers to retrieve the values for. example: - bLightGreen - bLightYellow responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ListIOValuesResponse' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' put: tags: - BUS Inputs/Outputs summary: Set Output Values description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Set values of outputs. In case of virtual Bus Input/Outputs, also inputs can be set. All available output identifiers can be requested via [listBusIODescriptions](#/operations/listBusIODescriptions). The call will return once the values have been set and accepted by the service. operationId: setBusIOValues x-scope: can_operate_bus_ios parameters: - $ref: '#/components/parameters/Cell' requestBody: content: application/json: schema: type: array items: $ref: '#/components/schemas/IOValue' example: - io: io1 value: true value_type: boolean - io: io2 value: '42' value_type: integer - io: io3 value: 3.14 value_type: float required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/profinet/description: get: tags: - BUS Inputs/Outputs summary: Get PROFINET Description description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get description of NOVA as a PROFINET device. operationId: getProfinetDescription x-scope: can_operate_bus_ios parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProfinetDescription' '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/profinet/ios: get: summary: List PROFINET Input/Output Configuration description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ List descriptions for all configured input/output variables of the PROFINET service. The input/output descriptions contain information like name, type, and unit. The input/output direction is given in perspective of the PROFINET device, e.g., the configured PROFINET service. - The byte and bit addresses are the locations in the PROFINET input/output process image the variable points to. - The PROFINET controller, as well as NOVA's PROFINET service, use an input/output variable configuration to interpret the bits of the input and output process image. - The NOVA PROFINET service's configuration is modified via [addProfinetIO](#/operations/addProfinetIO) and [setProfinetIOsFromFile](#/operations/setProfinetIOsFromFile). For the PROFINET controller, e.g., a connected PLC, refer to the corresponding third party software, e.g., TIA portal. operationId: listProfinetIOs x-scope: can_operate_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/ProfinetIOs' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' delete: summary: Remove all PROFINET Input/Outputs description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Removes all input/output variable configurations from the PROFINET device, e.g., NOVA's PROFINET service. operationId: deleteAllProfinetIOs x-scope: can_manage_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/profinet/ios/{io}: put: tags: - BUS Inputs/Outputs summary: Add PROFINET Input/Output description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Adds an input/output variable to or updates an input/output variable on the PROFINET device, e.g., NOVA's PROFINET service. The inputs/outputs map variables to specific memory addresses in the process image. The default process image has buffer lengths of 64 bytes for input and output. - The size of the buffer is determined by the `config_file_content` that is passed in [addBusIOService](#/operations/addBusIOService) and has to be in accordance with the GSDML file describing the PROFINET device. The PROFINET controller as well as NOVA's PROFINET service use an input/output variable configuration to interpret the bits of the input/output process image. - The NOVA's PROFINET service's configuration can be viewed via [listProfinetIOs](#/operations/listProfinetIOs). For the PROFINET controller, e.g., a connected PLC, refer to the corresponding third party software, e.g., TIA portal). operationId: addProfinetIO x-scope: can_manage_bus_ios parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/IO' requestBody: content: application/json: schema: $ref: '#/components/schemas/ProfinetIOData' example: description: Counter type: PROFINET_IO_TYPE_INT direction: PROFINET_IO_DIRECTION_INPUT byte_address: 0 required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' delete: tags: - BUS Inputs/Outputs summary: Remove PROFINET Input/Ouptut description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Removes an input/output variable configuration from the PROFINET device, e.g., NOVA's PROFINET service. operationId: deleteProfinetIO x-scope: can_manage_bus_ios parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/IO' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/profinet/iofile: put: tags: - BUS Inputs/Outputs summary: Set PROFINET Inputs/Outputs from File description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Sets input/output variable configuration on the PROFINET device (i.e. NOVA's PROFINET service) from XML file. The inputs/outputs map variables to specific memory addresses in the process image. The default process image has buffer lengths of 64 bytes for input and output. - The size of the buffer is determined by the `config_file_content` that is passed in [addBusIOService](#/operations/addBusIOService) and has to be in accordance with the GSDML file describing the PROFINET device. The PROFINET controller, as well as NOVA's PROFINET service, use an input/output variable configuration to interpret the bits of the input/output process image. - The NOVA's PROFINET service's configuration can be viewed via [listProfinetIOs](#/operations/listProfinetIOs). For the PROFINET controller, e.g., a connected PLC, refer to the corresponding engineering system, e.g., TIA portal. #### Export variables You can export the variable configuration of the PROFINET controller as an XML file from your engineering system, e.g., TIA portal. - The endpoint is built so that the perspective of input and output (PROFINET Device's input is PROFINET Controller's output) is internally handled (PROFINET device input is PROFINET controller output), meaning that you can paste the exported XML file here without modifying. operationId: setProfinetIOsFromFile x-scope: can_manage_bus_ios parameters: - $ref: '#/components/parameters/Cell' requestBody: content: application/json: schema: $ref: '#/components/schemas/ProfinetInputOutputConfig' required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' get: tags: - BUS Inputs/Outputs summary: PROFINET Inputs/Outputs to File description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Get input/output variable configuration of the PROFINET device, e.g., NOVA's PROFINET service as file. You can specify byte offsets for the input and output variable addresses to get an XML tagmap that is ready to paste to the third party software, e.g., TIA portal. operationId: getProfinetIOsFromFile x-scope: can_operate_bus_ios parameters: - $ref: '#/components/parameters/Cell' - name: input_offset in: query schema: type: integer format: int32 default: 0 minimum: 0 description: Offset in bytes for the input (perspective of the controller) variables. The offset is added to the byte addresses of the PROFINET device, e.g., NOVA's PROFINET service. example: 0 - name: output_offset in: query schema: type: integer format: int32 default: 0 minimum: 0 description: Offset in bytes for the output (perspective of the controller) variables. The offset is added to the byte addresses of the PROFINET device, e.g., NOVA's PROFINET service. example: 0 responses: '200': description: OK content: application/json: schema: type: string description: Content of the input output configuration file. example: '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/profinet/gsdml: get: tags: - BUS Inputs/Outputs summary: Get PROFINET GSDML File description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ Returns the Generic Station Description Markup Language (GSDML) file for the PROFINET device. The GSDML file describes the PROFINET device configuration and capabilities, and can be imported into PROFINET engineering tools, e.g., TIA Portal, or other PLC programming environments. The returned GSDML file matches the current slot configuration of the PROFINET device. operationId: getProfinetGSDML x-scope: can_operate_bus_ios parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK - GSDML file content content: application/xml: schema: type: string description: GSDML XML file content '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/modbus/ios: get: summary: List MODBUS Input/Output Configuration description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ List descriptions for all configured input/output variables of the MODBUS service. The input/output descriptions contain information like name, type, and address. The input/output direction is given in perspective of the active MODBUS type (service or client). - The byte and bit addresses are the locations in the MODBUS input/output process image the variable points to. - The MODBUS controller, as well as NOVA's MODBUS service, use an input/output variable configuration to interpret the bits of the input and output process image. - The NOVA MODBUS service's configuration is modified via [addModbusIO](#/operations/addModbusIO). operationId: listModbusIOs x-scope: can_operate_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/ModbusIOs' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' delete: summary: Remove all MODBUS Input/Outputs description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Removes all input/output variable configurations from the MODBUS device, e.g., NOVA's MODBUS service. operationId: deleteAllModbusIOs x-scope: can_manage_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/modbus/ios/{io}: put: tags: - BUS Inputs/Outputs summary: Add MODBUS Input/Output description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Adds an input/output variable to or updates an input/output variable on the MODBUS device, e.g., NOVA's MODBUS service. The inputs/outputs map variables to specific memory addresses in the process image. The NOVA's MODBUS service's configuration can be viewed via [listModbusIOs](#/operations/listModbusIOs). operationId: addModbusIO x-scope: can_manage_bus_ios parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/IO' requestBody: content: application/json: schema: $ref: '#/components/schemas/ModbusIOData' example: description: Counter address: 0 type: MODBUS_IO_TYPE_UINT16 byte_order: MODBUS_IO_BYTE_ORDER_ABCD area: MODBUS_IO_AREA_HOLDING_REGISTERS required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' delete: tags: - BUS Inputs/Outputs summary: Remove MODBUS Input/Output description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Removes an input/output variable configuration from the MODBUS device, e.g., NOVA's MODBUS service. operationId: deleteModbusIO x-scope: can_manage_bus_ios parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/IO' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/snap7/ios: get: summary: List Snap7 Input/Output Configuration description: | **Required permissions:** `can_operate_bus_ios` - Read and write BUS IO values ___ List descriptions for all configured input/output variables of the Snap7 service. The Snap7 service communicates with Siemens PLCs and PLCSIM Advanced instances via the S7 protocol. operationId: listSnap7IOs x-scope: can_operate_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: The operation was successful. content: application/json: schema: $ref: '#/components/schemas/Snap7IOs' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' delete: summary: Remove all Snap7 Input/Outputs description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Removes all input/output variable configurations from the Snap7 service. operationId: deleteAllSnap7IOs x-scope: can_manage_bus_ios tags: - BUS Inputs/Outputs parameters: - $ref: '#/components/parameters/Cell' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /cells/{cell}/bus-ios/snap7/ios/{io}: put: tags: - BUS Inputs/Outputs summary: Add Snap7 Input/Output description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Adds or updates an input/output variable on the Snap7 service. The inputs/outputs map variables to specific memory locations in a Siemens PLC or PLCSIM Advanced instance accessed via the S7 protocol. operationId: addSnap7IO x-scope: can_manage_bus_ios parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/IO' requestBody: content: application/json: schema: $ref: '#/components/schemas/Snap7IOData' example: description: Counter area: SNAP7_IO_AREA_DATA_BLOCK db_number: 1 byte_address: 0 type: SNAP7_IO_TYPE_INT direction: SNAP7_IO_DIRECTION_INPUT required: true responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' delete: tags: - BUS Inputs/Outputs summary: Remove Snap7 Input/Output description: | **Required permissions:** `can_manage_bus_ios` - Manage BUS IO configuration ___ Removes an input/output variable configuration from the Snap7 service. operationId: deleteSnap7IO x-scope: can_manage_bus_ios parameters: - $ref: '#/components/parameters/Cell' - $ref: '#/components/parameters/IO' responses: '200': description: OK content: {} '400': $ref: '#/components/responses/BadRequest' '404': $ref: '#/components/responses/NotFound' '412': $ref: '#/components/responses/PreconditionFailed' /version: get: tags: - Version summary: API Version description: |- **Required permissions:** `can_access_system` - View system status and metadata ___ Retrieves the version of the NOVA API. operationId: getApiVersion x-scope: can_access_system responses: '200': description: Successfully retrieved the API version. content: application/json: schema: $ref: '#/components/schemas/ApiVersion' components: securitySchemes: BearerAuth: type: http scheme: bearer bearerFormat: JWT schemas: NameList: description: A list of names type: array items: type: string CellName: type: string description: | A unique name for the cell used as an identifier for addressing the cell in all API calls. It must be a valid k8s label name as defined by [RFC 1123](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#dns-label-names). pattern: ^[a-z][a-z0-9-]{0,30}[a-z0-9]$ default: cell CellDescription: type: string maxLength: 200 description: | A description of the cell. AbbController: title: AbbController description: | The configuration of a physical ABB robot controller has to contain IP address. Additionally an EGM server configuration has to be specified in order to control the robot. Deploying the server is a functionality of this API. type: object required: - kind - controller_ip - controller_port - egm_server properties: kind: type: string enum: - AbbController x-go-type-skip-optional-pointer: true x-is-discriminator: true controller_ip: type: string controller_port: description: | Default values: 80, 443. If custom value is set, field is required. type: integer default: 80 egm_server: description: The EGM server runs inside of the cell, thus its IP must be in the same network as the 'controller_ip' type: object required: - ip - port properties: ip: type: string port: type: integer default: 32112 FanucController: title: FanucController description: The configuration of a physical FANUC robot controller has to contain IP address of the controller. type: object required: - kind - controller_ip properties: kind: type: string enum: - FanucController x-go-type-skip-optional-pointer: true x-is-discriminator: true controller_ip: type: string KukaController: title: KukaController description: | The configuration of a physical KUKA robot controller has to contain an IP address. Additionally an RSI server configuration has to be specified in order to control the robot. Deploying the server is a functionality of this API. type: object required: - kind - controller_ip - controller_port - rsi_server properties: kind: type: string enum: - KukaController x-go-type-skip-optional-pointer: true x-is-discriminator: true controller_ip: type: string controller_port: type: integer default: 54600 rsi_server: description: The RSI server runs inside of the cell. type: object required: - ip - port properties: ip: type: string default: 0.0.0.0 port: type: integer default: 30152 slow_cycle_rate: type: boolean default: false description: | If true, uses slower cycle time of 12ms instead of 4ms. UniversalrobotsController: title: UniversalrobotsController description: The configuration of a physical Universal Robots controller has to contain IP address of the controller. type: object required: - kind - controller_ip properties: kind: type: string enum: - UniversalrobotsController x-go-type-skip-optional-pointer: true x-is-discriminator: true controller_ip: type: string Manufacturer: type: string enum: - abb - fanuc - kuka - staubli - universalrobots - yaskawa VirtualController: title: VirtualController description: | The configuration of a virtual robot controller has to contain the manufacturer string, an optional joint position string array, and either a preset `type` **or** the complete JSON configuration. type: object required: - kind - manufacturer properties: kind: type: string enum: - VirtualController x-go-type-skip-optional-pointer: true x-is-discriminator: true manufacturer: $ref: '#/components/schemas/Manufacturer' type: type: string description: | Preset type of the virtual robot controller. See [getRobotConfigurations](#/operations/getRobotConfigurations) for supported types. examples: - abb-irb1200_7 - abb-irb1010_037_15 - abb-irb2600ID_200_8 - fanuc-arc_mate_120iD12L - fanuc-crx10ial - fanuc-lr_mate_200iD4S - fanuc-r2000ic125l - kuka-kr10_r1100_2 - kuka-kr210_r2700_extra - kuka-lbr_iisy_11_r1300 - universalrobots-ur10cb - yaskawa-ar1440 - yaskawa-gp180-120 - yaskawa-hc20dtp json: type: string description: | Complete JSON configuration of the virtual robot controller. Can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration). If provided, the `type` field should not be used. initial_joint_position: type: string description: | Initial joint position of the first motion group from the virtual robot controller. Provides the joint position as a JSON array of float values in radians, where the array length must match the robot's degrees of freedom (DOF), e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. YaskawaController: title: YaskawaController description: The configuration of a physical Yaskawa robot controller has to contain IP address of the controller. type: object required: - kind - controller_ip properties: kind: type: string enum: - YaskawaController x-go-type-skip-optional-pointer: true x-is-discriminator: true controller_ip: type: string RobotController: type: object description: The configuration of a physical or virtual robot controller. required: - name - configuration properties: name: description: | Unique name of controller within the cell. It must be a valid k8s label name as defined by [RFC 1035](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#rfc-1035-label-names). type: string pattern: ^[a-z][a-z0-9-]{0,61}[a-z0-9]$ configuration: oneOf: - $ref: '#/components/schemas/AbbController' - $ref: '#/components/schemas/FanucController' - $ref: '#/components/schemas/KukaController' - $ref: '#/components/schemas/UniversalrobotsController' - $ref: '#/components/schemas/VirtualController' - $ref: '#/components/schemas/YaskawaController' discriminator: propertyName: kind x-go-type-name: ControllerConfig ImageCredentials: type: object description: | User provided credentials for creating a secret to pull an image from a registry. required: - registry - user - password properties: registry: type: string user: type: string password: type: string ContainerImage: type: object description: | A user provided, custom container image and the required credentials to pull it from a registry. required: - image properties: image: description: The location of a container image in the form of `/:`. type: string minLength: 1 credentials: $ref: '#/components/schemas/ImageCredentials' secrets: type: array description: Known secrets for authentication with the container registry. items: type: object required: - name properties: name: type: string ContainerEnvironment: type: array description: | A list of environment variables with name and their value. These can be used to configure the containerized application, and turn features on or off. items: type: object required: - name - value properties: name: type: string value: type: string Capacity: type: string description: The amount of requested storage capacity. pattern: ^[0-9]+(\\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|B)?$ example: 100Mi ContainerStorage: type: object description: | The path and capacity of a volume that retains data across application restarts. The maximal requestable capacity is 300Mi. If you need more capacity consider using [storeObject](#/operations/storeObject). required: - mount_path - capacity properties: mount_path: type: string format: path example: /data capacity: $ref: '#/components/schemas/Capacity' description: | The amount of local storage available for the application. **NOTE:** The capacity can NEVER be reduced! ContainerResources: type: object description: Additional resources that the application requires. properties: intel_gpu: type: integer description: Number of GPUs the application requires. minimum: 0 maximum: 1 memory_limit: type: string description: The maximum memory allocated to this application. example: 1000Mi App: type: object description: | An App is defined by a webserver, packed inside a container, serving a web-application. required: - name - app_icon - container_image properties: name: description: | The name of the provided application. The name must be unique within the cell and is used as a identifier for addressing the application in all API calls , e.g., when updating the application. It also defines where the application is reachable (/$cell/$name). It must be a valid k8s label name as defined by [RFC 1035](https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#rfc-1035-label-names). type: string pattern: ^[a-z][a-z0-9-]{0,61}[a-z0-9]$ minLength: 1 app_icon: description: The path of the icon for the App (/$cell/$name/$app_icon). type: string minLength: 1 container_image: $ref: '#/components/schemas/ContainerImage' port: description: The port the containerized webserver is listening on. type: integer default: 8080 environment: $ref: '#/components/schemas/ContainerEnvironment' storage: $ref: '#/components/schemas/ContainerStorage' resources: $ref: '#/components/schemas/ContainerResources' health_path: description: | Defines the URL path suffix used to check the application's health status. The complete health check URL is constructed as `/$cell/$name/$health_path`. When the application is working as expected, the endpoint returns an HTTP 200 status code. If not specified, the system will default to using the application icon path suffix (the value of `app_icon`) as the health check endpoint, resulting in `/$cell/$name/$app_icon`. If the health check fails (no response or non-200 status code), the system will automatically restart the application container to restore service. type: string diagnosis_path: description: | Defines the URL path suffix used to provide an endpoint for diagnosis data collection. The complete diagnosis check URL is constructed as `/$cell/$name/$diagnosis_path`. The endpoint is called when a diagnosis package is requested via the diagnosis API. The endpoint needs to return the data within a zip file `application/zip` response. type: string Cell: type: object description: | To create a robot cell, only a valid name is required. Once created, a robot cell provides access to the Wandelbots NOVA foundation services. The configuration can be customized, e.g., robot controllers, also within apps. required: - name additionalProperties: {} properties: name: $ref: '#/components/schemas/CellName' default: cell version: description: | Wandelbots NOVA version of the cell. This version must not exceed the current system version. type: string description: $ref: '#/components/schemas/CellDescription' controllers: type: array items: $ref: '#/components/schemas/RobotController' apps: type: array items: $ref: '#/components/schemas/App' Error: type: object required: - message properties: code: type: string message: type: string OperatingState: format: enum type: string enum: - ACTIVE - INACTIVE description: The operating state. ServiceGroup: type: string enum: - SystemService - CellService - RobotController - App ServiceStatusSeverity: type: string enum: - INFO - WARNING - ERROR ServiceStatusPhase: type: string enum: - Terminating - Initialized - Running - NoReady - Completed - ContainerCreating - PodInitializing - Unknown - CrashLoopBackOff - Error - ImagePullBackOff - OOMKilled - Pending - Evicted ServiceStatus: type: object required: - service - group - status properties: service: type: string group: $ref: '#/components/schemas/ServiceGroup' status: type: object required: - severity - code properties: severity: $ref: '#/components/schemas/ServiceStatusSeverity' code: $ref: '#/components/schemas/ServiceStatusPhase' reason: type: string ServiceStatusList: type: array items: $ref: '#/components/schemas/ServiceStatus' ServiceStatusResponse: type: object description: | Response containing both the overall operating state of the cell and detailed status information for each service within the cell. The operating state indicates whether the cell is active or inactive, while the service statuses provide specific health and operational information for individual service running in the cell. required: - operating_state - service_status properties: operating_state: $ref: '#/components/schemas/OperatingState' service_status: $ref: '#/components/schemas/ServiceStatusList' ReleaseChannel: type: string enum: - stable - next description: | The channel that defines what a new Wandelbots NOVA version is. * `next` the latest version * `stable` newest patch of the current version UpdateCellVersionRequest: title: updateCellVersionRequest type: object description: | Update a single cell's Foundation chart version based on the indicated release channel. required: - channel properties: channel: $ref: '#/components/schemas/ReleaseChannel' BusIOProfinetIpConfig: type: object description: | Network configuration or IPv4 record of the virtual ethernet interface (pnio1) created by the PROFINET driver. The IPv4 record is used in combination with the Name of Station (NoS) to identify your device in the PROFINET network. The `ip_config` will be used as IPv4 record if no REMA XML file is already present on your machine and no `rema_xml_content` is provided. required: - ip - netmask - gateway properties: ip: type: string description: IP address for the device's virtual ethernet interface (pnio1). example: 192.168.1.100 netmask: type: string description: Network mask for the device's virtual ethernet interface (pnio1). example: 255.255.255.0 gateway: type: string description: Gateway for connections to other devices outside of the virtual ethernet interface's subnet. example: 192.168.178.1 BusIOProfinetNetwork: type: object properties: device_name: type: string description: | Name of Station (NoS) of the PROFINET device. The NoS is used in combination with IPv4 record to identify your device in the PROFINET network. The `device_name` will be used as NoS if no REMA XML file is already present on your machine and no `rema_xml_content` is provided. example: pnDevice ip_config: $ref: '#/components/schemas/BusIOProfinetIpConfig' rema_xml_content: type: string description: | Content of the PROFINET REMA XML file. Is used when PROFINET service is added for the first time to create the REMA XML file that holds data to be kept for the next session. Stores information like IP address, Name of Station (NoS) and hardware configuration. If you use a PROFINET controller to assign an IP address to the PROFINET device, this information will be written to the REMA XML file. Refer to the PDF version of the "PN Driver I/O Base programming interface" documentation for more information and an example REMA file. BusIOProfinetSlot: title: BusIOProfinetSlot description: | Configuration for one PROFINET process data slot. type: object required: - slot - input_size_bytes - output_size_bytes properties: slot: type: integer minimum: 1 maximum: 12 description: | Slot identifier on the PROFINET device. example: 1 input_size_bytes: type: integer minimum: 0 description: | Process data size in bytes for the input direction (device → controller). example: 64 output_size_bytes: type: integer minimum: 0 description: | Process data size in bytes for the output direction (controller → device). example: 64 BusIOProfinetDefaultRoute: type: object description: | Current default route configuration of your NOVA instance. The default route is a setting that tells data where to go if there isn’t a specific path already known for its destination. Usually this will be the path to your router, enabling accessing the internet. On Linux, use `ip route show` to view your default routes and match the output `default via dev ...` to get your gateway and interface. required: - gateway - interface properties: gateway: type: string description: Gateway for the default route. example: 192.168.124.1 interface: type: string description: Interface for the default route. example: enp3s0 BusIOProfinet: title: BusIOProfinet description: | PROFINET BUS inputs/outputs service configuration. type: object required: - bus_type - mac - plc_ip properties: bus_type: type: string enum: - profinet x-go-type-skip-optional-pointer: true x-is-discriminator: true network_config: description: | Used to enable IP communication through the same physical ethernet interface while PROFINET driver is active. Optional for SR-IOV-based bus I/O recreation. If omitted and an existing PROFINET bus I/O configuration for the same MAC address already exists, the previous network settings are reused. $ref: '#/components/schemas/BusIOProfinetNetwork' plc_ip: type: string description: | IP address of the PLC to establish PROFINET communication with. The IP address is used to configure the host machine's firewall. The firewall configuration is applied while the BUS input/output service is active. Without proper firewall configuration, PROFINET device discovery, configuration exchanges, and real-time cyclic data communication will fail. example: 192.168.1.100 mac: type: string description: | MAC address of the physical ethernet interface that you want to use for PROFINET communication. example: '00:11:22:33:44:55' slots: type: array description: | Optional PROFINET slot configuration. If not provided, the default configuration is used for backward compatibility: one slot with a size of 64 bytes. minItems: 1 maxItems: 12 items: $ref: '#/components/schemas/BusIOProfinetSlot' default_route: $ref: '#/components/schemas/BusIOProfinetDefaultRoute' deprecated: true BusIOProfinetVirtual: title: BusIOProfinetVirtual description: | Virtual PROFINET BUS inputs/outputs service configuration. type: object required: - bus_type properties: bus_type: type: string enum: - profinet_virtual x-go-type-skip-optional-pointer: true x-is-discriminator: true BusIOModbusTCPServer: type: object required: - port properties: network_type: type: string enum: - tcp x-go-type-skip-optional-pointer: true x-is-discriminator: true port: type: integer format: int32 minimum: 1 maximum: 65534 description: | Port number of the MODBUS server to establish communication with. example: 502 BusIOModbusServer: title: MODBUS-Server description: | MODBUS server inputs/outputs service configuration. type: object required: - bus_type - network - connections - coils_size - discrete_inputs_size - holding_registers_size - input_registers_size properties: bus_type: type: string enum: - modbus_server x-go-type-skip-optional-pointer: true x-is-discriminator: true network: $ref: '#/components/schemas/BusIOModbusTCPServer' connections: type: integer format: int32 minimum: 0 maximum: 255 description: | Number of connections this MODBUS server can handle. example: 2 coils_size: type: integer format: int32 minimum: 0 maximum: 65535 description: | Size of the Coils memory area. example: 10 discrete_inputs_size: type: integer format: int32 minimum: 0 maximum: 65535 description: | Size of the Discrete Inputs memory area. example: 10 holding_registers_size: type: integer format: int32 minimum: 0 maximum: 65535 description: | Size of the Holding Registers memory area. example: 10 input_registers_size: type: integer format: int32 minimum: 0 maximum: 65535 description: | Size of the Input Registers memory area. example: 10 BusIOModbusTCPClient: type: object required: - ip - port properties: network_type: type: string enum: - tcp x-go-type-skip-optional-pointer: true x-is-discriminator: true ip: type: string description: | IP address of the MODBUS server to establish communication with. example: 192.168.1.100 port: type: integer format: int32 minimum: 1 maximum: 65534 description: | Port number of the MODBUS server to establish communication with. example: 502 BusIOModbusClient: title: MODBUS-Client description: | MODBUS client inputs/outputs service configuration. type: object required: - bus_type - network properties: bus_type: type: string enum: - modbus_client x-go-type-skip-optional-pointer: true x-is-discriminator: true network: $ref: '#/components/schemas/BusIOModbusTCPClient' BusIOModbusVirtual: title: MODBUS-Virtual description: | Virtual MODBUS inputs/outputs service configuration. type: object required: - bus_type properties: bus_type: type: string enum: - modbus_virtual x-go-type-skip-optional-pointer: true x-is-discriminator: true BusIOSnap7: title: Snap7 description: | Snap7 BUS inputs/outputs service configuration. type: object required: - bus_type - address properties: bus_type: type: string enum: - snap7 x-go-type-skip-optional-pointer: true x-is-discriminator: true address: type: string description: | IP address or hostname of the Siemens PLC or PLCSIM Advanced endpoint. example: 192.168.1.100 rack: type: integer format: int32 default: 0 minimum: 0 description: | Rack number of the PLC CPU. Standard value for S7-1200/1500 is 0. slot: type: integer format: int32 default: 1 minimum: 0 description: | Slot number of the PLC CPU. Standard value for S7-1200/1500 is 1. BusIOType: oneOf: - $ref: '#/components/schemas/BusIOProfinet' - $ref: '#/components/schemas/BusIOProfinetVirtual' - $ref: '#/components/schemas/BusIOModbusServer' - $ref: '#/components/schemas/BusIOModbusClient' - $ref: '#/components/schemas/BusIOModbusVirtual' - $ref: '#/components/schemas/BusIOSnap7' discriminator: propertyName: bus_type mapping: profinet: '#/components/schemas/BusIOProfinet' profinet_virtual: '#/components/schemas/BusIOProfinetVirtual' modbus_server: '#/components/schemas/BusIOModbusServer' modbus_client: '#/components/schemas/BusIOModbusClient' modbus_virtual: '#/components/schemas/BusIOModbusVirtual' snap7: '#/components/schemas/BusIOSnap7' x-go-type-name: BusIOType UpdateNovaVersionRequest: title: updateNovaVersionRequest type: object description: | An update is defined by the indicated Wandelbots NOVA release channel. required: - channel properties: channel: $ref: '#/components/schemas/ReleaseChannel' update_cells: type: boolean default: true description: | Update unpinned cells during system update. Cells with an explicit chart version are never updated by a system update, regardless of this setting. User: type: object title: User description: Identity information for the session user. On unmanaged instances all fields are empty strings representing an anonymous user. required: - id - name - email properties: id: type: string description: Subject identifier of the user. Empty on unmanaged instances. example: auth0|507f1f77bcf86cd799439011 name: type: string description: Display name of the user. Empty on unmanaged instances. example: Jane Doe email: type: string description: Email address of the user. Empty on unmanaged instances. example: jane@example.com CapabilityEntry: type: object title: CapabilityEntry description: A capability granted to the authenticated user. If `resource_ids` is absent or empty, the capability is granted globally without resource restriction. required: - capability properties: capability: type: string description: Capability relation name. example: can_manage_cells resource_ids: type: array description: Resource identifiers the capability is scoped to. Absent or empty means the capability is granted globally. Resource IDs are deduplicated and sorted in ascending order. items: type: string example: - cell-a - cell-b SessionResponse: type: object title: SessionResponse description: Session information including user identity, capabilities, and token lifetime metadata. On unmanaged instances (no authentication or authorization configured), a default anonymous session is returned with `session_id` "default", empty user fields, no capabilities, and zero-value timestamps. required: - session_id - user - capabilities - issued_at - expires_at properties: session_id: type: string description: Unique identifier for the current session. For authenticated sessions this is derived from the access token. Unmanaged instances return "default". example: sess-507f1f77bcf86cd799439011 user: $ref: '#/components/schemas/User' capabilities: type: array description: Capability entries resolved for the user. Empty on unmanaged instances. items: $ref: '#/components/schemas/CapabilityEntry' issued_at: type: string format: date-time description: Timestamp when the underlying access token was issued. Zero-value on unmanaged instances. example: '2026-04-10T10:00:00Z' expires_at: type: string format: date-time description: Timestamp when the underlying access token expires. Zero-value on unmanaged instances. example: '2026-04-10T22:00:00Z' NetworkState: type: object required: - internet_connected properties: internet_connected: type: boolean description: | Indicates whether the system is connected to the internet. connection_type: type: string description: | Type of the active network link (e.g., ethernet, wifi, cellular, vpn, unknown). enum: - ethernet - wifi - cellular - vpn - unknown signal_strength: type: integer format: int32 description: | Received signal strength in dBm for wireless interfaces; negative values indicate weaker signals. link_quality: type: number format: float minimum: 0 maximum: 1 description: | Normalized link quality metric from 0 (poor) to 1 (excellent) when provided by the interface. latency_ms: type: number format: float description: | Round-trip latency to the probe endpoint measured in milliseconds. bandwidth_mbps: type: number format: float description: | Estimated downstream bandwidth in megabits per second based on the probe. NetworkInterface: type: object required: - name - ip - mac - cidr properties: name: type: string description: | The name of the network interface. ip: type: string format: ipv4 description: | The IPv4 address assigned to the network interface. mac: type: string description: | The MAC address of the network interface. cidr: type: string description: | The CIDR notation of the network interface. Example: "192.168.1.0/24" NetworkInterfaces: type: array items: $ref: '#/components/schemas/NetworkInterface' description: Array of network interface configurations. NetworkDevice: type: object required: - ip - mac properties: ip: type: string format: ipv4 description: | The IPv4 address assigned to the network device. mac: type: string description: | The MAC address of the network device. vendor: type: string description: | The vendor of the network device. ArpScanResponse: type: array items: $ref: '#/components/schemas/NetworkDevice' description: Array of network devices. ConfigurationResourceId: description: Identifier of a configuration resource. type: string ConfigurationResourceArray: type: array description: Array of configuration resources. items: $ref: '#/components/schemas/ConfigurationResource' ConfigurationResource: type: object description: Configuration resource object. properties: id: $ref: '#/components/schemas/ConfigurationResourceId' name: type: string description: Human-readable name of the configuration resource. children: $ref: '#/components/schemas/ConfigurationResourceArray' required: - id - name Metadata: description: Additional metadata to add to the backup type: object additionalProperties: type: string ConfigurationArchive: description: Binary data representing a configuration archive. type: string format: binary ConfigurationArchiveStatusCreating: title: ConfigurationArchiveStatusCreating type: object required: - status - progress properties: status: type: string enum: - creating description: Backup is in progress. progress: type: number format: float minimum: 0 maximum: 1 description: Current completion ratio (0 – 1). example: status: creating progress: 0.42 ConfigurationArchiveStatusError: title: ConfigurationArchiveStatusError type: object required: - status - message properties: status: type: string enum: - error message: type: string description: Human-readable explanation of the failure. example: status: error message: Disk quota exceeded ConfigurationArchiveStatusSuccess: title: ConfigurationArchiveStatusSuccess type: object required: - status properties: status: type: string enum: - success description: Backup successfully created. example: status: success ConfigurationArchiveStatus: description: Result of a backup operation. type: object discriminator: propertyName: status mapping: creating: '#/components/schemas/ConfigurationArchiveStatusCreating' error: '#/components/schemas/ConfigurationArchiveStatusError' success: '#/components/schemas/ConfigurationArchiveStatusSuccess' oneOf: - $ref: '#/components/schemas/ConfigurationArchiveStatusCreating' - $ref: '#/components/schemas/ConfigurationArchiveStatusError' - $ref: '#/components/schemas/ConfigurationArchiveStatusSuccess' LicenseStatusEnum: type: string enum: - OK - EXPIRED - SUSPENDED - GRACE_PERIOD_OVER - NOT_FOUND LicenseStatus: description: Status of the license. type: object required: - status - message properties: status: $ref: '#/components/schemas/LicenseStatusEnum' message: type: string License: type: object required: - product_name - owner_email - license_key - status - grace_period_expiry_date - consumed_activations - allowed_activations properties: product_name: description: Name of the licensed product. type: string owner_email: description: Mail address of the license owner. type: string format: email license_key: description: Identification key of the license. type: string license_expiry_date: description: Expiration date of the license. type: string format: date grace_period_expiry_date: description: End date of grace period, given if instance is not connected to internet. type: string format: date-time consumed_activations: description: Amount of times the license was activated. type: integer allowed_activations: description: Amount of times the license can be activated. type: integer feature_limitations: description: Feature limitations of the license. type: object additionalProperties: type: integer feature_flags: description: Features enabled by a license. type: array items: type: string status: $ref: '#/components/schemas/LicenseStatus' ActivateLicenseRequest: title: activateLicenseRequest type: object description: The authentication token to fetch the license from the license server. required: - owner_refresh_token properties: owner_refresh_token: type: string MotionGroupModelDescription: type: object description: Metadata about a motion group model. required: - name - manufacturer - is_custom properties: name: type: string description: Identifier of the motion group model. example: UniversalRobots_UR10e manufacturer: $ref: '#/components/schemas/Manufacturer' readable_name: type: string description: Readable name for the motion group model. example: UR10e is_custom: type: boolean description: Indicates whether this motion group model is a user-defined custom model or a built-in base model. Sphere: title: Sphere type: object properties: shape_type: type: string enum: - sphere radius: type: number format: double description: The radius of the sphere in [mm]. required: - shape_type - radius description: Defines a spherical shape centred around the origin. Box: title: Box type: object properties: shape_type: type: string enum: - box size_x: type: number format: double description: The dimension in x-direction in [mm]. size_y: type: number format: double description: The dimension in y-direction in [mm]. size_z: type: number format: double description: The dimension in z-direction in [mm]. box_type: type: string enum: - HOLLOW - FULL default: FULL description: The box type defines if the box is hollow or full. required: - shape_type - size_x - size_y - size_z - box_type description: | Defines a cuboid shape centred around an origin. If a margin is applied to the box type full, it is added to all size values. The shape will keep its edges. The hollow box type consists of thin boxes that make up its walls. If a margin is applied to the box type hollow, its size values are reduced by the margin. Rectangle: title: Rectangle type: object properties: shape_type: type: string enum: - rectangle size_x: type: number format: double description: The dimension in x-direction in [mm]. size_y: type: number format: double description: The dimension in y-direction in [mm]. required: - shape_type - size_x - size_y description: Defines an x/y-plane with finite size. Centred around the z-axis. Plane: title: Plane type: object properties: shape_type: type: string enum: - plane required: - shape_type description: Defines an x/y-plane with infinite size. Cylinder: title: Cylinder type: object properties: shape_type: type: string enum: - cylinder radius: type: number format: double description: The radius of the cylinder in [mm]. height: type: number format: double description: The height of the cylinder in [mm]. required: - shape_type - radius - height description: | Defines a cylindrical shape. Centred around origin, symmetric around z-axis. If a margin is applied, it is added to radius and height. The shape will keep its edges. Capsule: title: Capsule type: object properties: shape_type: type: string enum: - capsule radius: type: number format: double description: The radius of the cylinder and semi-spheres in [mm]. cylinder_height: type: number format: double description: The height of the inner cylinder in [mm]. required: - shape_type - radius - cylinder_height description: | Defines a cylindrical shape with 2 semi-spheres on the top and bottom. Centred around origin, symmetric around z-axis. RectangularCapsule: title: RectangularCapsule type: object properties: shape_type: type: string enum: - rectangular_capsule radius: type: number format: double description: The radius of the inner spheres in [mm]. sphere_center_distance_x: type: number format: double description: The distance of the sphere center in x-direction in [mm]. sphere_center_distance_y: type: number format: double description: The distance of the sphere center in y-direction in [mm]. required: - shape_type - radius - sphere_center_distance_x - sphere_center_distance_y description: | Convex hull around four spheres. Sphere center points in x/y-plane, offset by either combination "+/- sizeX" or "+/- sizeY". Alternative description: Rectangle in x/y-plane with a 3D padding. Vector3d: title: Vector3d type: array maxItems: 3 minItems: 3 items: type: number format: double prefixItems: - title: x - title: 'y' - title: z description: | A three-dimensional vector [x, y, z] with double precision. ConvexHull: title: ConvexHull type: object properties: shape_type: type: string enum: - convex_hull vertices: type: array items: $ref: '#/components/schemas/Vector3d' description: The list of encapsulated points. required: - shape_type - vertices description: Defines a convex hull encapsulating a set of vertices. RotationVector: title: RotationVector type: array maxItems: 3 minItems: 3 items: type: number format: double prefixItems: - title: rx - title: ry - title: rz description: | Defines a rotation in 3D space. A three-dimensional Vector [rx, ry, rz] with double precision. Rotation is applied around the vector. The angle of rotation equals the length of the vector. Pose: title: Pose type: object properties: position: $ref: '#/components/schemas/Vector3d' orientation: $ref: '#/components/schemas/RotationVector' default: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 description: | Defines a pose in 3D space. A pose is a combination of a position and an orientation. The position is applied before the orientation. Collider: title: Collider type: object description: | Defines a collider with a single shape. A collider is an object that is used for collision detection. It defines the `shape` that is attached with the offset of `pose` to a reference frame. Use colliders to: - Define the shape of a workpiece. The reference frame is the scene origin. - Define the shape of a link in a motion group. The reference frame is the link coordinate system. - Define the shape of a tool. The reference frame is the flange coordinate system. properties: shape: oneOf: - $ref: '#/components/schemas/Sphere' - $ref: '#/components/schemas/Box' - $ref: '#/components/schemas/Rectangle' - $ref: '#/components/schemas/Plane' - $ref: '#/components/schemas/Cylinder' - $ref: '#/components/schemas/Capsule' - $ref: '#/components/schemas/RectangularCapsule' - $ref: '#/components/schemas/ConvexHull' discriminator: propertyName: shape_type mapping: sphere: '#/components/schemas/Sphere' box: '#/components/schemas/Box' rectangle: '#/components/schemas/Rectangle' plane: '#/components/schemas/Plane' cylinder: '#/components/schemas/Cylinder' capsule: '#/components/schemas/Capsule' rectangular_capsule: '#/components/schemas/RectangularCapsule' convex_hull: '#/components/schemas/ConvexHull' pose: $ref: '#/components/schemas/Pose' margin: type: number description: Increases the shape's size in all dimensions. Applied in [mm]. Can be used to keep a safe distance to the shape. format: float default: 0 required: - shape examples: - shape: shape_type: sphere radius: 10 Link: type: object title: Collision Motion Group Link additionalProperties: $ref: '#/components/schemas/Collider' LinkChain: title: Link Chain type: array description: | A link chain is a kinematic chain of links that is connected via joints. A motion group can be used to control the motion of the joints in a link chain. A link is a group of colliders that is attached to the link reference frame. The reference frame of a link is obtained after applying all sets of Denavit-Hartenberg-parameters from base to (including) the link index. This means that the reference frame of the link is on the rotation axis of the next joint in the kinematic chain. Example: For a motion group with 2 joints, the collider reference frame (CRF) for link 1 is on the rotation axis of joint 2. The chain looks like: - Origin >> Mounting >> Base >> (CRF Base) Joint 0 >> Link 0 >> (CRF Link 0) Joint 1 >> Link 1 >> (CRF Link 1) Flange (CRF Tool) >> TCP Adjacent links in the kinematic chain of the motion group are not checked for mutual collision. items: $ref: '#/components/schemas/Link' examples: - - link_0_sphere: shape: shape_type: sphere radius: 10 pose: position: - 0 - 0 - -10 link_0_capsule: shape: shape_type: capsule radius: 5 cylinder_height: 20 - {} - link_2_capsule: shape: shape_type: capsule radius: 5 cylinder_height: 20 JointTypeEnum: type: string enum: - REVOLUTE_JOINT - PRISMATIC_JOINT default: REVOLUTE_JOINT DHParameter: type: object properties: alpha: type: number description: Angle about x-axis in [rad]. format: double theta: type: number description: Angle about z-axis in [rad]. format: double a: type: number description: Offset along x-axis in [mm]. format: double d: type: number description: Offset along z-axis in [mm]. format: double reverse_rotation_direction: type: boolean description: True, if rotation direction of joint is reversed. type: $ref: '#/components/schemas/JointTypeEnum' description: A single set of DH parameters. KinematicModel: type: object properties: dh_parameters: type: array items: $ref: '#/components/schemas/DHParameter' kinematic_chain_offset: description: Constant coordinate transformation between the motion group base frame and the start of the kinematic chain modeled by Denavit-Hartenberg parameters. $ref: '#/components/schemas/Pose' flange_offset: description: | Constant coordinate transformation between the end of the kinematic chain modelled by Denavit-Hartenberg parameters and the flange frame. This can be used, e.g., to ensure that the flange frame has a certain orientation. $ref: '#/components/schemas/Pose' inverse_solver: type: string description: Optional name of the inverse kinematics solver. description: Kinematics model described by Denavit-Hartenberg parameters. CopyMotionGroupModelRequest: type: object description: Request body for copying a motion group model under a new name. required: - name properties: name: type: string description: The name to register the copied motion group model with. example: MyCustomRobot_UR10e Joints: type: array items: type: number format: double description: | This structure describes a set of joint values, e.g., positions, currents, torques, of a motion group. Float precision is the default. CenterOfMass: type: array items: type: number format: double prefixItems: - title: x - title: 'y' - title: z minItems: 3 maxItems: 3 description: Center of mass coordinates [x, y, z] in mm InertiaTensor: type: object required: - xx - yy - zz - xy - xz - yz properties: xx: type: number format: double description: Inertia tensor component Ixx yy: type: number format: double description: Inertia tensor component Iyy zz: type: number format: double description: Inertia tensor component Izz xy: type: number format: double description: Inertia tensor component Ixy xz: type: number format: double description: Inertia tensor component Ixz yz: type: number format: double description: Inertia tensor component Iyz description: Inertia tensor components in kg⋅mm² DynamicModel: type: object properties: mass: type: number format: float description: Mass of the link in kg center_of_mass: $ref: '#/components/schemas/CenterOfMass' inertia: $ref: '#/components/schemas/InertiaTensor' actuator_inertia: type: number format: float description: Actuator moment of inertia in kg⋅mm² static_friction: type: number format: float description: Static friction coefficient viscous_friction: type: number format: float description: Viscous friction coefficient LimitRange: type: object properties: lower_limit: type: number format: double upper_limit: type: number format: double description: The upper_limit must be greater then the lower_limit. JointLimits: title: JointLimits type: object properties: position: $ref: '#/components/schemas/LimitRange' velocity: type: number format: double acceleration: type: number format: double jerk: type: number format: double description: | > **NOTE** > > This limit type is experimental and its behavior may change in future releases. torque: type: number format: double CartesianLimits: title: CartesianLimits type: object properties: velocity: type: number format: double acceleration: type: number format: double jerk: type: number format: double description: | > **NOTE** > > This limit type is experimental and its behavior may change in future releases. orientation_velocity: type: number format: double orientation_acceleration: type: number format: double orientation_jerk: type: number format: double description: | > **NOTE** > > This limit type is experimental and its behavior may change in future releases. LimitSet: title: LimitSet type: object properties: joints: type: array items: $ref: '#/components/schemas/JointLimits' tcp: $ref: '#/components/schemas/CartesianLimits' elbow: $ref: '#/components/schemas/CartesianLimits' flange: $ref: '#/components/schemas/CartesianLimits' coupled_shoulder_elbow_joint: $ref: '#/components/schemas/JointLimits' OperationLimits: title: OperationLimits type: object properties: auto_limits: $ref: '#/components/schemas/LimitSet' manual_limits: $ref: '#/components/schemas/LimitSet' manual_t1_limits: $ref: '#/components/schemas/LimitSet' manual_t2_limits: $ref: '#/components/schemas/LimitSet' safety_limit_elbow_flange_velocity_in_auto: type: boolean default: false description: Flag to indicate whether the TCP velocity limit is also applied for the elbow and flange in auto mode. RobotControllerConfigurationRequest: type: object description: Information to generate all robot controller configurations that match a given ARP scan result. required: - ip - network_devices properties: ip: type: string format: ipv4 description: | The IPv4 address assigned to the network interface where the ARP scan was performed. network_devices: $ref: '#/components/schemas/ArpScanResponse' ControllerDescription: title: ControllerDescription required: - connected_motion_groups - supports_freedrive - supports_control - supports_safety_zones type: object properties: connected_motion_groups: type: array items: type: string description: | Unique identifier of the motion group connected to the controller. Use [getMotionGroupDescription](#/operations/getMotionGroupDescription) to get more information about the motion group. supports_freedrive: type: boolean description: Can this controller be moved through freedrive (true), or not (false). supports_control: type: boolean description: Can this controller be controlled with NOVA (true) or is it only possible to read data (false). supports_safety_zones: type: boolean description: | True if NOVA supports reading safety zone-, tool- and link-geometries for this motion group. Safety zones are used to define areas where the robot should slow down or stop. If false, NOVA can't guarantee that the executed motions respect safety zones defined on the controller. description: The data type to describe a robot controller. RobotSystemMode: enum: - MODE_CONTROLLER_NOT_CONFIGURED - MODE_INITIALIZING - MODE_MONITOR - MODE_CONTROL - MODE_FREE_DRIVE type: string description: | Defines the current system mode of the robot system, including NOVA communicating with the robot controller. ### MODE_CONTROLLER_NOT_CONFIGURED No controller with the specified identifier is configured. Call [addRobotController](#/operations/addRobotController) to register a controller. ### MODE_INITIALIZING Indicates that a connection to the robot controller is established or reestablished in case of a disconnect. On success, the controller is set to MODE_MONITOR. On failure, the initialization process is retried until successful or cancelled by the user. ### MODE_MONITOR Read-only mode with an active controller connection. - Receives robot state and I/O signals - Move requests are rejected - No commands are sent to the controller ### MODE_CONTROL Active control mode. **Movement is possible in this mode** The robot is cyclically commanded to hold its current position. The robot state is received in sync with the controller cycle. Motion and jogging requests are accepted and executed. Input/Output interaction is enabled. ### MODE_FREE_DRIVE Read-only mode with servo motors enabled for manual movement (Free Drive). Move requests are rejected. Not supported by all robots: Use [getSupportedModes](#/operations/getSupportedModes) to check Free Drive availability. format: enum OperationMode: enum: - OPERATION_MODE_UNKNOWN - OPERATION_MODE_NO_CONTROLLER - OPERATION_MODE_DISCONNECTED - OPERATION_MODE_POWER_ON - OPERATION_MODE_PENDING - OPERATION_MODE_MANUAL - OPERATION_MODE_MANUAL_T1 - OPERATION_MODE_MANUAL_T2 - OPERATION_MODE_AUTO - OPERATION_MODE_RECOVERY type: string format: enum description: | Current operation mode of the configured robot controller. Operation modes in which the attached motion groups can be moved are: - OPERATION_MODE_MANUAL (if enabling switch is pressed) - OPERATION_MODE_MANUAL_T1 (if enabling switch is pressed) - OPERATION_MODE_MANUAL_T2 (if enabling switch is pressed) - OPERATION_MODE_AUTO (without needing to press enabling switch) All other modes are considered as non-operational. SafetyStateType: enum: - SAFETY_STATE_UNKNOWN - SAFETY_STATE_FAULT - SAFETY_STATE_NORMAL - SAFETY_STATE_MASTERING - SAFETY_STATE_CONFIRM_SAFETY - SAFETY_STATE_OPERATOR_SAFETY - SAFETY_STATE_PROTECTIVE_STOP - SAFETY_STATE_REDUCED - SAFETY_STATE_STOP - SAFETY_STATE_STOP_0 - SAFETY_STATE_STOP_1 - SAFETY_STATE_STOP_2 - SAFETY_STATE_RECOVERY - SAFETY_STATE_DEVICE_EMERGENCY_STOP - SAFETY_STATE_ROBOT_EMERGENCY_STOP - SAFETY_STATE_VIOLATION type: string format: enum description: | Current safety state of the configured robot controller. Operation modes in which the attached motion groups can be moved are: - SAFETY_STATE_NORMAL - SAFETY_STATE_REDUCED All other modes are considered as non-operational. MotionGroupState_JointLimitReached: type: object required: - limit_reached properties: limit_reached: type: array items: type: boolean description: If true, operational (soft) jointLimit is reached for specific joint. description: | Indicates which joint of the motion group is in a limit. If a joint is in its limit, only this joint can be moved. Movements that affect any other joints are not executed. JoggingRunning: title: JoggingRunning type: object required: - kind properties: kind: type: string enum: - RUNNING description: | Jogging is active. JoggingPausedByUser: title: JoggingPausedByUser type: object required: - kind properties: kind: type: string enum: - PAUSED_BY_USER description: | User has paused jogging. JoggingPausedOnIO: title: JoggingPausedOnIO type: object required: - kind properties: kind: type: string enum: - PAUSED_ON_IO description: | Jogging was paused because of an I/O event. JoggingPausedNearJointLimit: title: JoggingPausedNearJointLimit type: object required: - kind - joint_indices properties: kind: type: string enum: - PAUSED_NEAR_JOINT_LIMIT joint_indices: type: array items: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | Jogging was paused because a joint is near its limit. JoggingPausedNearCollision: title: JoggingPausedNearCollision type: object required: - kind - description properties: kind: type: string enum: - PAUSED_NEAR_COLLISION description: type: string description: | Jogging was paused because the motion group neared a collision. JoggingPausedNearSingularity: title: JoggingPausedNearSingularity type: object required: - kind - description properties: kind: type: string enum: - PAUSED_NEAR_SINGULARITY description: type: string description: | Jogging was paused because the motion group neared a singularity or the workspace boundary. JoggingDetails: title: JoggingDetails type: object required: - state - kind properties: state: oneOf: - $ref: '#/components/schemas/JoggingRunning' - $ref: '#/components/schemas/JoggingPausedByUser' - $ref: '#/components/schemas/JoggingPausedOnIO' - $ref: '#/components/schemas/JoggingPausedNearJointLimit' - $ref: '#/components/schemas/JoggingPausedNearCollision' - $ref: '#/components/schemas/JoggingPausedNearSingularity' discriminator: propertyName: kind mapping: RUNNING: '#/components/schemas/JoggingRunning' PAUSED_BY_USER: '#/components/schemas/JoggingPausedByUser' PAUSED_ON_IO: '#/components/schemas/JoggingPausedOnIO' PAUSED_NEAR_JOINT_LIMIT: '#/components/schemas/JoggingPausedNearJointLimit' PAUSED_NEAR_COLLISION: '#/components/schemas/JoggingPausedNearCollision' PAUSED_NEAR_SINGULARITY: '#/components/schemas/JoggingPausedNearSingularity' jogger_session_timestamp_ms: type: integer format: int64 minimum: 0 maximum: 9223372036854776000 description: | Timestamp of the current jogger session in milliseconds. Only waypoint sessions are supported. Other sessions return 0. > **NOTE** > > This field is experimental and its behavior may change in future releases. kind: type: string enum: - JOGGING description: | State of jogging execution. This state is sent during jogging movement, response-rate closest to the nearest multiple of controller step-rate but not exceeding the configured rate. The jogging state can be one of the following: - RUNNING: Jogging is active. - PAUSED_BY_USER: User has paused jogging. - PAUSED_NEAR_JOINT_LIMIT: Jogging was paused because a joint is near its limit. - PAUSED_NEAR_COLLISION: Jogging was paused because the motion group neared a collision. - PAUSED_NEAR_SINGULARITY: Jogging was paused because the motion group neared a singularity or the workspace boundary. - PAUSED_ON_IO: Jogging was paused because of an I/O event. Location: type: number format: double description: | - The location is a scalar value that defines a position along a path, typically ranging from 0 to `n`, where `n` denotes the number of motion commands - Each integer value of the location corresponds to a specific motion command, while non-integer values interpolate positions within the segments. - The location is calculated from the joint path TrajectoryRunning: title: TrajectoryRunning type: object required: - kind - time_to_end properties: kind: type: string enum: - RUNNING time_to_end: type: integer description: Remaining time in milliseconds (ms) to reach the end of the motion. format: int64 minimum: 0 maximum: 4294967295 description: | Trajectory is being executed. TrajectoryPausedByUser: title: TrajectoryPausedByUser type: object required: - kind properties: kind: type: string enum: - PAUSED_BY_USER description: | User has paused execution. TrajectoryEnded: title: TrajectoryEnded type: object required: - kind properties: kind: type: string enum: - END_OF_TRAJECTORY description: | First or last sample (depending on direction) of trajectory has been sent. TrajectoryWaitForIO: title: TrajectoryWaitForIO type: object required: - kind properties: kind: type: string enum: - WAIT_FOR_IO description: | Waiting for an I/O event to start execution. TrajectoryPausedOnIO: title: TrajectoryPausedOnIO type: object required: - kind properties: kind: type: string enum: - PAUSED_ON_IO description: | Execution was paused because of an I/O event. TrajectoryDetails: title: TrajectoryDetails type: object required: - trajectory - location - state - kind properties: trajectory: type: string description: | Unique identifier of the trajectory being executed. location: $ref: '#/components/schemas/Location' description: | Location of current joint position commmand on the trajectory being executed. state: oneOf: - $ref: '#/components/schemas/TrajectoryRunning' - $ref: '#/components/schemas/TrajectoryPausedByUser' - $ref: '#/components/schemas/TrajectoryEnded' - $ref: '#/components/schemas/TrajectoryWaitForIO' - $ref: '#/components/schemas/TrajectoryPausedOnIO' discriminator: propertyName: kind mapping: RUNNING: '#/components/schemas/TrajectoryRunning' PAUSED_BY_USER: '#/components/schemas/TrajectoryPausedByUser' END_OF_TRAJECTORY: '#/components/schemas/TrajectoryEnded' WAIT_FOR_IO: '#/components/schemas/TrajectoryWaitForIO' PAUSED_ON_IO: '#/components/schemas/TrajectoryPausedOnIO' kind: type: string enum: - TRAJECTORY description: | Discriminator for OpenApi generators, which is always "TRAJECTORY" for this schema. description: | State of trajectory execution. This state is sent during trajectory movement, response-rate closest to the nearest multiple of controller step-rate but not exceeding the configured rate. The trajectory state can be one of the following: - RUNNING: Trajectory is being executed. - PAUSED_BY_USER: User has paused execution. - END_OF_TRAJECTORY: First or last sample (depending on direction) of trajectory has been sent. - WAIT_FOR_IO: Waiting for an I/O event to start execution. - PAUSED_ON_IO: Execution was paused because of an I/O event. Execute: title: Execute type: object required: - joint_position properties: joint_position: type: array items: type: number format: double description: | Commanded joint position of each joint. This command was sent in the time step the corresponding state was received. The unit depends on the type of joint: For revolute joints, the angle is given in [rad]; for prismatic joints, the displacement is given in [mm]. details: oneOf: - $ref: '#/components/schemas/JoggingDetails' - $ref: '#/components/schemas/TrajectoryDetails' discriminator: propertyName: kind mapping: JOGGING: '#/components/schemas/JoggingDetails' TRAJECTORY: '#/components/schemas/TrajectoryDetails' description: | Details about the state of the motion execution. The details are either for a jogging or a trajectory. If NOVA is not controlling this motion group at the moment, this field is omitted. MotionGroupState: required: - timestamp - sequence_number - motion_group - controller - joint_position - joint_limit_reached - standstill - description_revision type: object properties: timestamp: type: string format: date-time description: Timestamp for when data was received from the robot controller. sequence_number: type: integer format: int64 minimum: 0 maximum: 4294967295 description: | Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller. The sequence number is reset when the connection to the physical controller is closed and re-established. motion_group: type: string description: Identifier of the motion group. controller: type: string description: 'Convenience: Identifier of the robot controller the motion group is attached to.' joint_position: $ref: '#/components/schemas/Joints' description: | Current joint position of each joint. The unit depends on the type of joint: For revolute joints, the angle is given in [rad]; for prismatic joints, the displacement is given in [mm]. joint_limit_reached: $ref: '#/components/schemas/MotionGroupState_JointLimitReached' description: | Indicates whether the joint is in a limit for all joints of the motion group. joint_torque: $ref: '#/components/schemas/Joints' description: | Current joint torque of each joint in [Nm]. Is only available if the robot controller supports it, e.g., available for UR controllers. joint_current: $ref: '#/components/schemas/Joints' description: | Current at TCP in [A]. Is only available if the robot controller supports it, e.g., available for UR controllers. flange_pose: $ref: '#/components/schemas/Pose' description: | Pose of the flange. Positions are in [mm]. Orientations are in [rad]. The pose is relative to the response_coordinate_system specified in the request. For robot arms, a flange pose is always returned. For positioners, the flange might not be available, depending on the model. tcp: type: string description: | Unique identifier addressing the active TCP. Might not be returned for positioners as some do not support TCPs, depending on the model. tcp_pose: $ref: '#/components/schemas/Pose' description: | Pose of the TCP selected on the robot control panel. Positions are in [mm]. Orientations are in [rad]. The pose is relative to the response_coordinate_system specified in the request. Might not be returned for positioners as some do not support TCPs, depending on the model. coordinate_system: type: string description: | Unique identifier addressing the reference coordinate system of the cartesian data. Might not be returned for positioners as some do not support TCPs, depending on the model. Default: world coordinate system of corresponding controller. payload: type: string description: | Unique identifier addressing the active payload. Only fetchable via GET endpoint, not available in WebSocket. standstill: type: boolean description: | Indicates whether the motion group is in standstill. Convenience: Signals that NOVA treats measured joint velocities as 0. execute: $ref: '#/components/schemas/Execute' description: | Data that was commanded to the motion group. Includes additional data on NOVA's execution components for executing trajectories and jogging. This is a convenience field to indicate the last command sent to the motion group. It is not available in all cases, e.g., if the motion group is not moved by NOVA. description_revision: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | Revision number of the motion group description. The revision is incremented whenever the motion group description changes due to a modification of the tools or the payloads in the robot configuration. The robot controller is polled every 10 s during Monitoring Mode to detect those changes. Use to trigger fetching based on robot configuration changes. description: Presents the current state of the motion group. RobotControllerState: required: - mode - timestamp - sequence_number - controller - operation_mode - safety_state - motion_groups type: object properties: mode: $ref: '#/components/schemas/RobotSystemMode' description: Mode of communication and control between NOVA and the robot controller. last_error: type: array items: type: string description: | Last error stack encountered during initialization process or after a controller disconnect. At this stage, it's unclear whether the error is fatal. Evaluate `last_error` to decide whether to remove the controller using `deleteController`. Examples: - Delete required: Host resolution fails repeatedly due to an incorrect IP. - Delete not required: Temporary network delay caused a disconnect; the system will auto-reconnect. timestamp: type: string format: date-time description: Timestamp indicating when the represented information was received from the robot controller. sequence_number: type: integer format: int64 minimum: 0 maximum: 4294967295 description: | Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller. The sequence number is reset when the connection to the physical controller is closed and re-established. controller: type: string default: controller description: Identifier of the configured robot controller. operation_mode: $ref: '#/components/schemas/OperationMode' safety_state: $ref: '#/components/schemas/SafetyStateType' velocity_override: type: integer description: | If made available by the robot controller, returns the current velocity override in [percentage] for movements adjusted on robot control panel. Valid value range: 1 - 100. format: int32 minimum: 1 maximum: 100 motion_groups: title: MotionGroupState[] type: array items: $ref: '#/components/schemas/MotionGroupState' description: | State of indicated motion groups. In case of state request via controller all configured motion groups are returned. In case of executing a motion only the affected motion groups are returned. description: Returns the whole current state of robot controller. IODirection: enum: - IO_TYPE_INPUT - IO_TYPE_OUTPUT type: string description: Identifies the input/output type. format: enum IOValueType: enum: - IO_VALUE_BOOLEAN - IO_VALUE_ANALOG_FLOAT - IO_VALUE_ANALOG_INTEGER type: string description: Data type of the input/output. format: enum UnitType: enum: - UNIT_NONE - UNIT_KILOGRAM - UNIT_AMPERE - UNIT_KELVIN - UNIT_HERTZ - UNIT_NEWTON - UNIT_VOLT - UNIT_CELSIUS - UNIT_NEWTON_METER - UNIT_METER type: string description: The unit of input/output value. format: enum BooleanValue: required: - value_type - value type: object properties: value: type: boolean value_type: type: string enum: - boolean x-go-type-skip-optional-pointer: true x-is-discriminator: true description: | Value of a digital input/output. title: BooleanValue IntegerValue: required: - value_type - value type: object properties: value: type: string value_type: type: string enum: - integer x-go-type-skip-optional-pointer: true x-is-discriminator: true description: | Value of an input/output with integer representation. > The integral value is transmitted as a string to avoid precision loss during conversion to JSON. > Recommended: Use int64 in your implementation. If you want to interact with int64 in numbers, > JS bigint libraries can help you to parse the string into an integral value. title: IntegerValue FloatValue: required: - value_type - value type: object properties: value: type: number description: | Value of an analog input/output in floating number representation. format: double value_type: type: string enum: - float x-go-type-skip-optional-pointer: true x-is-discriminator: true title: FloatValue IOBoundary: title: IOBoundary type: object oneOf: - $ref: '#/components/schemas/BooleanValue' - $ref: '#/components/schemas/IntegerValue' - $ref: '#/components/schemas/FloatValue' discriminator: propertyName: value_type mapping: boolean: '#/components/schemas/BooleanValue' integer: '#/components/schemas/IntegerValue' float: '#/components/schemas/FloatValue' IODescription: required: - io - name - direction - value_type type: object properties: io: type: string description: | Unique identifier of the input/output. name: type: string description: | Name of the input/output. Customize it on the physical controller or in the virtual robot specification. group: type: string description: | Name of the input/output group. Customize it on the physical controller or in the virtual robot specification. direction: $ref: '#/components/schemas/IODirection' value_type: $ref: '#/components/schemas/IOValueType' unit: $ref: '#/components/schemas/UnitType' min: $ref: '#/components/schemas/IOBoundary' max: $ref: '#/components/schemas/IOBoundary' ListIODescriptionsResponse: type: array items: $ref: '#/components/schemas/IODescription' IOBooleanValue: title: IOBooleanValue required: - io - value - value_type type: object properties: io: type: string description: Unique identifier of the input/output. value: type: boolean description: | Value of a digital input/output. value_type: type: string enum: - boolean x-go-type-skip-optional-pointer: true x-is-discriminator: true description: Input/Output boolean value representation. IOIntegerValue: required: - value_type - io - value type: object properties: io: type: string description: Unique identifier of the input/output. value: type: string description: | Value of an input/output with integer representation. > The integral value is transmitted as a string to avoid precision loss during conversion to JSON. > Recommended: Use int64 in your implementation. If you want to interact with int64 in numbers, > JS bigint libraries can help you to parse the string into an integral value. value_type: type: string enum: - integer x-go-type-skip-optional-pointer: true x-is-discriminator: true title: IOIntegerValue IOFloatValue: required: - value_type - io - value type: object properties: io: type: string description: Unique identifier of the input/output. value: type: number description: | Value of an analog input/output in floating number representation. format: double value_type: type: string enum: - float x-go-type-skip-optional-pointer: true x-is-discriminator: true title: IOFloatValue IOValue: oneOf: - $ref: '#/components/schemas/IOBooleanValue' - $ref: '#/components/schemas/IOIntegerValue' - $ref: '#/components/schemas/IOFloatValue' discriminator: propertyName: value_type mapping: boolean: '#/components/schemas/IOBooleanValue' integer: '#/components/schemas/IOIntegerValue' float: '#/components/schemas/IOFloatValue' StreamIOValuesResponse: required: - io_values - timestamp - sequence_number type: object properties: io_values: type: array items: $ref: '#/components/schemas/IOValue' timestamp: type: string format: date-time description: Timestamp indicating when the represented information was received from the robot controller. sequence_number: type: integer format: int64 minimum: 0 maximum: 4294967295 description: | Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller. The sequence number is reset when the connection to the physical controller is closed and re-established. description: Array of input/output values. example: io_values: - io: io1 value: true value_type: boolean - io: io2 value: '42' value_type: integer - io: io3 value: 3.14 value_type: float ListIOValuesResponse: type: array items: $ref: '#/components/schemas/IOValue' description: Array of input/output values. example: - io: io1 value: true value_type: boolean - io: io2 value: '42' value_type: integer - io: io3 value: 3.14 value_type: float Comparator: enum: - COMPARATOR_EQUALS - COMPARATOR_NOT_EQUALS - COMPARATOR_GREATER - COMPARATOR_GREATER_EQUAL - COMPARATOR_LESS - COMPARATOR_LESS_EQUAL type: string format: enum description: | Comparator for the comparison of two values. The comparator is used to compare two values and return a boolean result. The default comparator is unknown. WaitForIOEventRequest: title: WaitForIOEventRequest type: object required: - io - comparator properties: io: $ref: '#/components/schemas/IOValue' comparator: $ref: '#/components/schemas/Comparator' description: | Comparator for the comparison of two values. Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b. description: The value to compare with the current value of the input/output. SettableRobotSystemMode: enum: - ROBOT_SYSTEM_MODE_MONITOR - MODE_MONITOR - ROBOT_SYSTEM_MODE_CONTROL - MODE_CONTROL type: string format: enum description: | Defines available system modes of the robot system. Short versions (no "ROBOT_SYSTEM_" prefix) are provided, reusing strings from [getMode](#/operations/getMode) responses. VirtualRobotConfiguration: required: - name - content type: object properties: name: type: string description: | Name of the configuration file generated by the unique identifier of the controller and a time stamp. content: type: string description: | Content of the configuration file. Copy & paste to the [addRobotController](#/operations/addRobotController) configuration.json parameter. OrientationType: enum: - ROTATION_VECTOR - QUATERNION - EULER_ANGLES_INTRINSIC_ZXZ - EULER_ANGLES_INTRINSIC_XYX - EULER_ANGLES_INTRINSIC_YZY - EULER_ANGLES_INTRINSIC_ZYZ - EULER_ANGLES_INTRINSIC_XZX - EULER_ANGLES_INTRINSIC_YXY - EULER_ANGLES_INTRINSIC_XYZ - EULER_ANGLES_INTRINSIC_YZX - EULER_ANGLES_INTRINSIC_ZXY - EULER_ANGLES_INTRINSIC_XZY - EULER_ANGLES_INTRINSIC_ZYX - EULER_ANGLES_INTRINSIC_YXZ - EULER_ANGLES_EXTRINSIC_ZXZ - EULER_ANGLES_EXTRINSIC_XYX - EULER_ANGLES_EXTRINSIC_YZY - EULER_ANGLES_EXTRINSIC_ZYZ - EULER_ANGLES_EXTRINSIC_XZX - EULER_ANGLES_EXTRINSIC_YXY - EULER_ANGLES_EXTRINSIC_ZYX - EULER_ANGLES_EXTRINSIC_XZY - EULER_ANGLES_EXTRINSIC_YXZ - EULER_ANGLES_EXTRINSIC_YZX - EULER_ANGLES_EXTRINSIC_XYZ - EULER_ANGLES_EXTRINSIC_ZXY type: string description: | The type of rotation description that is used to specify the orientation. **Rotation Vector notation** * The rotation is represented using an axis-angle representation: > axis = Vector[0:2] > angle = |axis| in [rad] > axis.normalized * angle **Quaternion notation** * The rotation is represented using a unit quaternion: [x, y, z, w]. * The vector part [x, y, z] is the imaginary part of the quaternion, and the scalar part [w] is the real part. **Euler notation** * *extrinsic* fixed external reference system * *intrinsic* reference system fixed to rotation body > angles = Vector[0:2] in [rad]. * ZYX, ZXZ,... - mapping of the given angles values to the (either intrinsic or extrinsic) axes in the stated order. > Example ZYX: Z = Vector[0], Y = Vector[1], X = Vector[2]. format: enum default: ROTATION_VECTOR Orientation: title: Orientation type: array maxItems: 4 minItems: 3 items: type: number format: double prefixItems: - title: x - title: 'y' - title: z - title: w description: | Describes an orientation in 3D space. A tree-to-four-dimensional vector [x, y, z, w] with double precision. CoordinateSystemData: type: object properties: name: type: string description: Human readable name of this coordinate system. reference_coordinate_system: type: string description: The identifier of the reference coordinate system. Empty if world is used. position: $ref: '#/components/schemas/Vector3d' orientation: $ref: '#/components/schemas/Orientation' orientation_type: $ref: '#/components/schemas/OrientationType' CoordinateSystem: allOf: - type: object required: - coordinate_system properties: coordinate_system: type: string description: Unique identifier of the coordinate system. - $ref: '#/components/schemas/CoordinateSystemData' ListCoordinateSystemsResponse: type: array items: $ref: '#/components/schemas/CoordinateSystem' MotionGroupModel: title: MotionGroupModel type: string description: | Identifies a single motion group model. See [getMotionGroupModels](#/operations/getMotionGroupModels) for supported types. examples: - ABB_1010_037_15 - FANUC_ARC_Mate_100iD - KUKA_KR10_R1100 - UniversalRobots_UR10 - Yaskawa_AR1440 TcpOffset: title: TcpOffset required: - name - pose type: object properties: name: type: string description: A readable and changeable name for frontend visualization. pose: $ref: '#/components/schemas/Pose' ColliderDictionary: type: object title: ColliderDictionary description: A collection of identifiable colliders. additionalProperties: $ref: '#/components/schemas/Collider' Payload: required: - name - payload type: object properties: name: type: string payload: type: number description: Mass of payload in [kg]. format: double center_of_mass: $ref: '#/components/schemas/Vector3d' description: Center of mass of payload as a three-dimensional position vector [x, y, z] in [mm]. moment_of_inertia: $ref: '#/components/schemas/Vector3d' description: Principal moments of inertia of payload as three-dimensional vector [I_xx, I_yy, I_zz] in [kg·m²]. MotionGroupDescription: required: - motion_group_model - operation_limits type: object properties: motion_group_model: $ref: '#/components/schemas/MotionGroupModel' mounting: $ref: '#/components/schemas/Pose' description: The offset from the world frame to the motion group base. tcps: type: object title: TcpOffsetDictionary description: | Maps a TCP name to its offset relative to the flange coordinate system. Key must be a TCP identifier. Values are TcpOffsets. additionalProperties: $ref: '#/components/schemas/TcpOffset' safety_zones: $ref: '#/components/schemas/ColliderDictionary' description: | SafetyZones are areas which cannot be entered or where certain limits apply. SafetyZones are defined in the world coordinate system. safety_link_colliders: type: array items: $ref: '#/components/schemas/ColliderDictionary' description: | The shape of the MotionGroups links to validate against safety zones. Indexed along the kinematic chain, starting with a static base shape before first joint. safety_tool_colliders: type: object title: SafetyToolColliders additionalProperties: $ref: '#/components/schemas/ColliderDictionary' description: | Maps a TCP name to its tool collider. Key must be a TCP identifier. Values are ColliderDictionaries that make up the shape of one tool to validate against safety zones. operation_limits: $ref: '#/components/schemas/OperationLimits' payloads: type: object title: PayloadDictionary description: | Maps a payload name to its configuration. Key must be a payload identifier. Values are payload objects. additionalProperties: $ref: '#/components/schemas/Payload' cycle_time: type: integer format: int32 minimum: 0 maximum: 2147483647 description: '[ms] cycle time of the motion group controller. A trajectory for this motion group should be computed to this resolution.' dh_parameters: type: array items: $ref: '#/components/schemas/DHParameter' description: The Denavit-Hartenberg parameters describing the motion group kinematics. kinematic_chain_offset: description: | Constant coordinate transformation between the motion group base frame and the start of the kinematic chain modelled by Denavit-Hartenberg parameters. Unlike the mounting, which is used to set the actual position and orientation of the motion group within a cell, this offset is fixed. It is part of the description of the kinematical structure of the motion group. $ref: '#/components/schemas/Pose' flange_offset: description: | Constant coordinate transformation between the end of the kinematic chain modelled by Denavit-Hartenberg parameters and the flange frame. This can be used, e.g., to ensure that the flange frame has a certain orientation. $ref: '#/components/schemas/Pose' serial_number: type: string description: | The serial number of the motion group, if available. If not available, the serial number of the robot controller. If not available, empty. description_revision: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | Revision number of the motion group description. The revision is incremented whenever the motion group description changes due to a modification of the tools or the payloads in the robot configuration. The robot controller is polled every 10 s in Monitoring Mode to detect those changes. Use to detect changes since the last retrieval. description: | The configuration of a motion-group used for motion planning. The parameters `mounting`, `kinematic_chain_offset`, `dh_parameters`, `flange_offset` and `tcp_offset` are used to model the kinematic structure of the motion group. They can be used to compute the coordinate transformations from world to tcp frame: [world frame] -> mounting -> [base frame] -> kinematic chain offset + motion group kinematics (Denavit-Hartenberg parameters) -> [end of kinematic chain frame] -> flange_offset -> [flange frame] -> tcp_offset -> [tcp frame]. Tool: type: object title: Collision Motion Group Tool description: | Defines the shape of a tool. A tool is a dictionary of colliders. All colliders that make up a tool are attached to the flange frame of the motion group. additionalProperties: $ref: '#/components/schemas/Collider' CollisionSetup: title: CollisionSetup type: object properties: colliders: $ref: '#/components/schemas/ColliderDictionary' description: | Colliders are checked against links and tool. link_chain: $ref: '#/components/schemas/LinkChain' description: | The shape of the motion groups links to validate against colliders. Indexed along the kinematic chain, starting with a static base shape before first joint. The base of the motion group is not checked for collision against the environment. tool: $ref: '#/components/schemas/Tool' description: | Shape of the tool to validate against colliders. self_collision_detection: type: boolean description: | If true, self-collision detection is enabled for the motion group. Self-collision detection checks if links in the kinematic chain of the motion group collide with each other. Adjacent links in the kinematic chain of the motion group are not checked for mutual collision. The tool is treated like a link at the end of the kinematic chain. It is checked against all links except the last one. Default is true. default: true CollisionSetups: title: CollisionSetups type: object additionalProperties: $ref: '#/components/schemas/CollisionSetup' 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. MotionGroupSetup: title: MotionGroupSetup type: object required: - motion_group_model - cycle_time properties: motion_group_model: $ref: '#/components/schemas/MotionGroupModel' cycle_time: type: integer format: int32 minimum: 0 maximum: 2147483647 description: '[ms] cycle time of the motion group controller. A trajectory for this motion group should be computed to this resolution.' mounting: $ref: '#/components/schemas/Pose' description: The offset from the world frame to the motion group base. tcp_offset: $ref: '#/components/schemas/Pose' global_limits: $ref: '#/components/schemas/LimitSet' payload: $ref: '#/components/schemas/Payload' collision_setups: $ref: '#/components/schemas/CollisionSetups' DoubleArray: type: array items: type: number format: double BlendingAuto: title: BlendingAuto type: object properties: min_velocity_in_percent: type: integer format: int32 minimum: 0 maximum: 100 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. blending_name: type: string enum: - BlendingAuto required: - blending_name BlendingSpace: enum: - JOINT - CARTESIAN type: string description: | Defines the space in which blending is performed. - `JOINT`: Zone blending is performed in joint space - `CARTESIAN`: Auto-blending is performed in cartesian space BlendingPosition: title: BlendingPosition type: object properties: position_zone_radius: type: number format: double 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. position_zone_percentage: type: number format: double minimum: 0 maximum: 100 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. orientation_zone_radius: type: number format: double 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. orientation_zone_percentage: type: number format: double minimum: 0 maximum: 100 description: | Specifies the maximum blending percentage for orientation blending based on the trajectory length in orientation space. Percentage indicated in 0.0 - 100.0. joints_zone_radius: type: number format: double 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. joints_zone_percentage: type: number format: double minimum: 0 maximum: 100 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. space: $ref: '#/components/schemas/BlendingSpace' description: | Defines the space in which blending is performed. blending_name: type: string enum: - BlendingPosition required: - blending_name LimitsOverride: type: object properties: joint_velocity_limits: type: array items: type: number format: double description: | Maximum joint velocity in [rad/s] for each joint. Either leave this field empty or set a value for each joint. joint_acceleration_limits: type: array items: type: number format: double description: | Maximum joint acceleration in [rad/s^2] for each joint. Either leave this field empty or set a value for each joint. joint_jerk_limits: type: array items: type: number format: double description: | Maximum joint jerk in [rad/s^3] for each joint. Either leave this field empty or set a value for each joint. > **NOTE** > > This limit type is experimental and its behavior may change in future releases. tcp_velocity_limit: type: number format: double description: | Maximum allowed TCP velocity in [mm/s]. tcp_acceleration_limit: type: number format: double description: | Maximum allowed TCP acceleration in [mm/s^2]. tcp_jerk_limit: type: number format: double description: | Maximum allowed TCP jerk in [mm/s^3]. > **NOTE** > > This limit type is experimental and its behavior may change in future releases. tcp_orientation_velocity_limit: type: number format: double description: | Maximum allowed TCP rotation velocity in [rad/s]. tcp_orientation_acceleration_limit: type: number format: double description: | Maximum allowed TCP rotation acceleration in [rad/s^2]. tcp_orientation_jerk_limit: type: number format: double description: | Maximum allowed TCP rotation jerk in [rad/s^3]. > **NOTE** > > This limit type is experimental and its behavior may change in future releases. description: | If a limit is not set, the default value will be used. KinematicBranchWrist: enum: - FLIP - NO_FLIP type: string KinematicBranchElbow: enum: - UP - DOWN type: string KinematicBranchShoulder: enum: - FRONT - BACK type: string KinematicBranch: type: object required: - shoulder_branch - elbow_branch - wrist_branch properties: wrist_branch: $ref: '#/components/schemas/KinematicBranchWrist' elbow_branch: $ref: '#/components/schemas/KinematicBranchElbow' shoulder_branch: $ref: '#/components/schemas/KinematicBranchShoulder' description: | A 6-DOF robot with spherical wrist has up to 8 inverse kinematics solutions for a given TCP pose (2^3 branches). Each branch represents one side of a kinematic singularity boundary. The three binary choices are shoulder, elbow, and wrist. > **NOTE** > > `FRONT`/`BACK`, `UP`/`DOWN`, `NO_FLIP`/`FLIP` are conventional > labels for the two sides of each branch. The labels describe the > typical geometric interpretation for common poses, but are not absolute spatial > directions. The labels are consistent within a given solver: The same physical > arm shape maps to the same branch value. The branch values are purely > geometric and describe the same physical configuration regardless of > vendor convention. AxisRange: type: object required: - axis - range properties: axis: type: integer range: $ref: '#/components/schemas/LimitRange' description: | Per-joint constraint beyond the 8 inverse kinematic branches. Maps a joint index (0-based) to an allowed angle interval (in radians). KinematicConfiguration: type: object required: - kinematic_branch properties: kinematic_branch: $ref: '#/components/schemas/KinematicBranch' axis_ranges: type: array items: $ref: '#/components/schemas/AxisRange' description: | Vendor-independent kinematic configuration for 6-DOF industrial robots with spherical wrist. Combines the discrete branch selection with optional per-joint axis range constraints. PathCartesianPTP: title: CartesianPTP type: object required: - target_pose - path_definition_name properties: target_pose: $ref: '#/components/schemas/Pose' kinematic_configuration: $ref: '#/components/schemas/KinematicConfiguration' path_definition_name: type: string enum: - PathCartesianPTP description: | A cartesian point-to-point is representing a joint point-to-point motion from start point to the indicated target pose. The target pose is a joint point-to-point given in cartesian space. The target joint configuration will be calculated to be in the same kinematic configuration as the start point is. If that is not possible, planning will fail. Alternatively, a kinematic configuration can be provided to specify the target kinematic branch and axis ranges. The kinematic configuration can be obtained from [convertVendorConfiguredPose](#/operations/convertVendorConfiguredPose). > **NOTE** > > The `kinematic_configuration` property is experimental and its structure or behavior may change in future releases. CubicSplineParameter: title: CubicSplineParameter required: - pose - path_parameter type: object properties: pose: $ref: '#/components/schemas/Pose' path_parameter: type: number format: double PathCubicSpline: title: CubicSpline required: - parameters - path_definition_name type: object properties: parameters: type: array items: $ref: '#/components/schemas/CubicSplineParameter' path_definition_name: type: string enum: - PathCubicSpline description: | A [cubic spline](https://de.wikipedia.org/wiki/Spline-Interpolation) represents a cartesian cubic spline in translative and orientational space from start point to indicated target pose via control points. PathLine: title: Line type: object required: - target_pose - path_definition_name properties: target_pose: $ref: '#/components/schemas/Pose' path_definition_name: type: string enum: - PathLine description: | A line represents a straight line from start position to indicated target position. The orientation is calculated via a quaternion [slerp](https://en.wikipedia.org/wiki/Slerp) from start orientation to indicated target orientation. PathCircle: title: Circle type: object required: - via_pose - target_pose - path_definition_name properties: via_pose: $ref: '#/components/schemas/Pose' target_pose: $ref: '#/components/schemas/Pose' path_definition_name: type: string enum: - PathCircle description: | A circular constructs a circle in translative space from 1) the start position which is provided via position, and 2) the indicated target position. The orientation is calculated via a [bezier spline](https://en.wikipedia.org/wiki/B%C3%A9zier_curve) from start orientation to the indicated target orientation. The via point defines the control point for the bezier spline. Therefore, the control point will not be hit directly. PathJointPTP: title: JointPTP type: object required: - target_joint_position - path_definition_name properties: target_joint_position: $ref: '#/components/schemas/DoubleArray' path_definition_name: type: string enum: - PathJointPTP description: | A joint point-to-point represents a line in joint space. All joints will be moved synchronously. ConstrainedPose: title: ConstrainedPose type: object properties: position: $ref: '#/components/schemas/Vector3d' orientation: type: number format: double default: position: - 0 - 0 - 0 rotation: - 0 description: | Defines a rotationally constrained pose in 3D space. The orientation is constrained to rotations around a single axis. required: - position - orientation DirectionConstraint: title: DirectionConstraint type: object properties: world: $ref: '#/components/schemas/Vector3d' description: The direction constraint vector in world frame. tcp: $ref: '#/components/schemas/Vector3d' description: The direction constraint vector in the TCP frame. tolerance: type: number description: | The tolerance in degrees for the direction constraint. The planner will try to satisfy the constraint within this tolerance. Start and target orientations must also satisfy it within this tolerance. constraint_name: type: string enum: - DirectionConstraint required: - constraint_name - world - tcp - tolerance default: world: - 0 - 0 - 1 tcp: - 0 - 0 - -1 tolerance: 0.00001 description: | A direction constraint is defined by a vector in world frame and a vector in the TCP frame. The direction constraint is satisfied when the vectors are aligned with each other, which the planner attempts to achieve. Example: If the world vector is [0, 0, 1] and the TCP vector is [0, 0, -1], the planner will try to keep the TCP facing downward during the motion. The constraint vectors must be normalized. PathDirectionConstrainedCartesianPTP: title: DirectionConstrainedCartesianPTP type: object required: - target_pose - constraint - path_definition_name properties: target_pose: $ref: '#/components/schemas/ConstrainedPose' constraint: $ref: '#/components/schemas/DirectionConstraint' path_definition_name: type: string enum: - DirectionConstrainedCartesianPTP description: | A direction-constrained cartesian point-to-point motion is a joint point-to-point motion to a target pose in cartesian space while satisfying a direction constraint. The direction constraint is defined by a vector in the world frame and a vector in the TCP frame. The constraint is satisfied when the vectors are aligned with each other. The vectors must be normalized. > **NOTE** > > This motion type is experimental and its behavior may change in future releases. PathDirectionConstrainedJointPTP: title: DirectionConstrainedJointPTP type: object required: - target_joint_position - constraint - path_definition_name properties: target_joint_position: $ref: '#/components/schemas/DoubleArray' constraint: $ref: '#/components/schemas/DirectionConstraint' path_definition_name: type: string enum: - DirectionConstrainedJointPTP description: | A direction-constrained joint point-to-point motion is a direct motion in joint space while satisfying a direction constraint. The direction constraint is defined by a vector in the world frame and a vector in the TCP frame. The constraint is satisfied when the vectors are aligned with each other. The vectors must be normalized. > **NOTE** > > This motion type is experimental and its behavior may change in future releases. MotionCommand: title: MotionCommand type: object required: - path properties: blending: oneOf: - $ref: '#/components/schemas/BlendingAuto' - $ref: '#/components/schemas/BlendingPosition' discriminator: propertyName: blending_name description: | Blending alters the TCP path at the target point of a motion command to ensure that the velocity does not drop to zero between two motion commands. limits_override: $ref: '#/components/schemas/LimitsOverride' description: | Limits override is used to override the global limits of the motion group for this segment of the motion. path: oneOf: - $ref: '#/components/schemas/PathCartesianPTP' - $ref: '#/components/schemas/PathCubicSpline' - $ref: '#/components/schemas/PathLine' - $ref: '#/components/schemas/PathCircle' - $ref: '#/components/schemas/PathJointPTP' - $ref: '#/components/schemas/PathDirectionConstrainedCartesianPTP' - $ref: '#/components/schemas/PathDirectionConstrainedJointPTP' discriminator: propertyName: path_definition_name PlanTrajectoryRequest: title: PlanTrajectoryRequest type: object required: - motion_group_setup - start_joint_position - motion_commands properties: motion_group_setup: $ref: '#/components/schemas/MotionGroupSetup' description: The data to assemble the robot setup can be retrieved from [getMotionGroupDescription](#/operations/getMotionGroupDescription) endpoint. start_joint_position: $ref: '#/components/schemas/DoubleArray' description: | To define a motion the start joints have to be indicated. Cartesian movements will be in the same kinematic configuration as the start joint position until the first joint point-to-point motion. Motions can only be executed if the start joint position is the current joint position of the motion group. To retrieve the current joint position use the endpoint [getCurrentMotionGroupState](#/operations/getCurrentMotionGroupState). To move the robot to the start joint position use the endpoint [streamMoveToTrajectoryViaJointP2P](#/operations/streamMoveToTrajectoryViaJointP2P). motion_commands: type: array items: $ref: '#/components/schemas/MotionCommand' description: | List of motion commands. A command consists of a path definition (line, circle, joint_ptp, cartesian_ptp, cubic_spline), blending, and limits override. JointTrajectory: title: JointTrajectory required: - joint_positions - times - locations type: object properties: joint_positions: type: array items: $ref: '#/components/schemas/Joints' description: | List of joint positions for each sample. The number of samples must match the number of timestamps provided in the times field. The unit depends on the type of joint: For revolute joints, the angle is given in [rad]; for prismatic joints, the displacement is given in [mm]. times: type: array items: type: number format: double description: Timestamp for each sample [s]. locations: type: array items: $ref: '#/components/schemas/Location' FeedbackDirectionConstraintNoSolutionExists: title: FeedbackDirectionConstraintNoSolutionExists type: object properties: target_joint_position: $ref: '#/components/schemas/DoubleArray' error_feedback_name: type: string enum: - FeedbackDirectionConstraintNoSolutionExists description: No ptp motion to the target exists that fulfills the direction constraint. required: - error_feedback_name FeedbackDirectionConstraintNotMet: title: FeedbackDirectionConstraintNotMet type: object properties: invalid_joint_position: $ref: '#/components/schemas/DoubleArray' error_feedback_name: type: string enum: - FeedbackDirectionConstraintNotMet description: The provided joint position does not satisfy the direction constraint. required: - error_feedback_name FeedbackDirectionConstraintNotNormalized: title: FeedbackDirectionConstraintNotNormalized type: object properties: direction_constraint: $ref: '#/components/schemas/Vector3d' description: | The direction constraint that is not normalized. error_feedback_name: type: string enum: - FeedbackDirectionConstraintNotNormalized description: The provided direction constraint is not normalized. required: - error_feedback_name FeedbackOutOfWorkspace: title: FeedbackOutOfWorkspace type: object properties: invalid_tcp_pose: $ref: '#/components/schemas/Pose' error_feedback_name: type: string enum: - FeedbackOutOfWorkspace description: Requested TCP pose is outside of motion group's workspace. required: - error_feedback_name FeedbackNoSolutionInCurrentConfiguration: title: FeedbackNoSolutionInCurrentConfiguration type: object properties: invalid_tcp_pose: $ref: '#/components/schemas/Pose' error_feedback_name: type: string enum: - FeedbackNoSolutionInCurrentConfiguration description: Moving to the requested TCP pose would change the robot's configuration. required: - error_feedback_name SingularityTypeEnum: type: string enum: - WRIST - ELBOW - SHOULDER FeedbackSingularity: title: FeedbackSingularity type: object properties: singularity_type: $ref: '#/components/schemas/SingularityTypeEnum' singular_joint_position: $ref: '#/components/schemas/DoubleArray' error_feedback_name: type: string enum: - FeedbackSingularity description: | A singularity is a point in the robot's workspace where the robot loses one or more degrees of freedom with regards to moving its TCP. This means the robot cannot move or rotate the TCP in a certain direction from this specific point. Use PTP motions if possible. They will almost never fail due to singularities (only if the target point is at a singularity). Alternatively change the robot TCP's path to avoid moving through this point or try to move the TCP through this point in a different direction. required: - error_feedback_name FeedbackJointLimitExceeded: title: FeedbackJointLimitExceeded type: object properties: joint_index: type: integer format: int32 minimum: 0 maximum: 2147483647 joint_position: $ref: '#/components/schemas/DoubleArray' error_feedback_name: type: string enum: - FeedbackJointLimitExceeded description: | This error is returned when a joint position limit is exceeded. The joint index denotes which joint is out of its limits, starting with 0 and followed by the full joint position. required: - error_feedback_name CollisionContact: title: CollisionContact type: object properties: local: $ref: '#/components/schemas/Vector3d' root: $ref: '#/components/schemas/Vector3d' Collision: title: Collision type: object properties: id_of_a: type: string id_of_b: type: string id_of_layer: type: string normal_root_on_b: $ref: '#/components/schemas/Vector3d' position_on_a: $ref: '#/components/schemas/CollisionContact' position_on_b: $ref: '#/components/schemas/CollisionContact' FeedbackCollision: title: FeedbackCollision type: object properties: collisions: type: array items: $ref: '#/components/schemas/Collision' joint_position: $ref: '#/components/schemas/DoubleArray' tcp_pose: $ref: '#/components/schemas/Pose' error_feedback_name: type: string enum: - FeedbackCollision required: - error_feedback_name FeedbackInvalidNanValue: title: FeedbackInvalidNanValue type: object properties: value: $ref: '#/components/schemas/DoubleArray' error_feedback_name: type: string enum: - FeedbackInvalidNanValue description: | Some vector provided in the plan command contains not-a-number (NaN). required: - error_feedback_name FeedbackInvalidDof: title: FeedbackInvalidDof type: object properties: joint_position: $ref: '#/components/schemas/Joints' motion_group_dof: type: integer error_feedback_name: type: string enum: - FeedbackInvalidDof description: | Some vector provided in the plan command has an invalid number of entries. required: - error_feedback_name FeedbackTorqueExceeded: title: FeedbackTorqueExceeded type: object properties: torque_value: type: number torque_limit: type: number error_feedback_name: type: string enum: - FeedbackTorqueExceeded description: | The trajectory cannot be planned because the torque limit would be exceeded. required: - error_feedback_name FeedbackCommandsMissing: title: FeedbackCommandsMissing type: object properties: error_feedback_name: type: string enum: - FeedbackCommandsMissing description: | No commands have been provided in the plan request. required: - error_feedback_name FeedbackStartJointsMissing: title: FeedbackStartJointsMissing type: object properties: start_joints_dof: type: integer motion_group_dof: type: integer error_feedback_name: type: string enum: - FeedbackStartJointsMissing description: | The provided start joints have an incorrect dimension. required: - error_feedback_name FeedbackCubicSplineIsNotIncreasing: title: FeedbackCubicSplineIsNotIncreasing type: object properties: index: type: integer previous_value: type: number current_value: type: number error_feedback_name: type: string enum: - FeedbackCubicSplineIsNotIncreasing description: | The path parameter provided in the cubic spline command is not increasing at a certain index. required: - error_feedback_name FeedbackCubicSplineNotAtStartPose: title: FeedbackCubicSplineNotAtStartPose type: object properties: first_spline_pose: $ref: '#/components/schemas/Pose' start_pose: $ref: '#/components/schemas/Pose' error_feedback_name: type: string enum: - FeedbackCubicSplineNotAtStartPose description: | The first pose provided in the cubic spline command is not the same as the end pose of the preceeding command. required: - error_feedback_name FeedbackInvalidSamplingTime: title: FeedbackInvalidSamplingTime type: object properties: sampling_time: type: number error_feedback_name: type: string enum: - FeedbackInvalidSamplingTime description: | The provided sampling time is invalid. It has to be a positive number. required: - error_feedback_name PlanTrajectoryFailedResponse: title: PlanTrajectoryFailedResponse type: object required: - error_feedback - error_location_on_trajectory properties: error_feedback: oneOf: - $ref: '#/components/schemas/FeedbackDirectionConstraintNoSolutionExists' - $ref: '#/components/schemas/FeedbackDirectionConstraintNotMet' - $ref: '#/components/schemas/FeedbackDirectionConstraintNotNormalized' - $ref: '#/components/schemas/FeedbackOutOfWorkspace' - $ref: '#/components/schemas/FeedbackNoSolutionInCurrentConfiguration' - $ref: '#/components/schemas/FeedbackSingularity' - $ref: '#/components/schemas/FeedbackJointLimitExceeded' - $ref: '#/components/schemas/FeedbackCollision' - $ref: '#/components/schemas/FeedbackInvalidNanValue' - $ref: '#/components/schemas/FeedbackInvalidDof' - $ref: '#/components/schemas/FeedbackTorqueExceeded' - $ref: '#/components/schemas/FeedbackCommandsMissing' - $ref: '#/components/schemas/FeedbackStartJointsMissing' - $ref: '#/components/schemas/FeedbackCubicSplineIsNotIncreasing' - $ref: '#/components/schemas/FeedbackCubicSplineNotAtStartPose' - $ref: '#/components/schemas/FeedbackInvalidSamplingTime' discriminator: propertyName: error_feedback_name error_location_on_trajectory: $ref: '#/components/schemas/Location' joint_trajectory: $ref: '#/components/schemas/JointTrajectory' description: | The joint trajectory from the start joint position to the error. PlanTrajectoryResponse: title: PlanTrajectoryResponse type: object required: - response properties: response: oneOf: - $ref: '#/components/schemas/JointTrajectory' - $ref: '#/components/schemas/PlanTrajectoryFailedResponse' ValidationError: properties: loc: items: oneOf: - type: string - type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type input: type: object additionalProperties: true type: object required: - loc - msg - type - input title: ValidationError ErrorInvalidJointCount: title: ErrorInvalidJointCount type: object properties: expected_joint_count: type: integer description: | The expected number of joints for this motion group. provided_joint_count: type: integer description: | The number of provided joints. error_feedback_name: type: string enum: - ErrorInvalidJointCount description: | The provided joint data does not match the expected number of joints for this motion group. required: - expected_joint_count - provided_joint_count - error_feedback_name ErrorJointLimitExceeded: title: ErrorJointLimitExceeded type: object properties: joint_index: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | Index of the joint exceeding its limits (0-based). joint_position: $ref: '#/components/schemas/DoubleArray' description: | The joint position violating the limits. error_feedback_name: type: string enum: - ErrorJointLimitExceeded description: | A reference joint position (start or target) exceeds the configured joint limits. required: - error_feedback_name ErrorJointPositionCollision: title: ErrorJointPositionCollision type: object properties: collisions: type: array items: $ref: '#/components/schemas/Collision' joint_position: $ref: '#/components/schemas/DoubleArray' description: | The joint position that collides. error_feedback_name: type: string enum: - ErrorJointPositionCollision description: | A reference joint position, e.g., start or target joint position, results in collisions that prevent processing. required: - error_feedback_name ErrorDirectionConstraintNotMet: title: ErrorDirectionConstraintNotMet type: object properties: joint_position: $ref: '#/components/schemas/DoubleArray' description: | The joint position violating the direction constraint. error_feedback_name: type: string enum: - ErrorDirectionConstraintNotMet description: | A reference joint position (start or target) violates the direction constraint. required: - error_feedback_name ErrorDirectionConstraintNotNormalized: title: ErrorDirectionConstraintNotNormalized type: object properties: direction_constraint: $ref: '#/components/schemas/Vector3d' description: | The direction constraint that is not normalized. error_feedback_name: type: string enum: - ErrorDirectionConstraintNotNormalized description: | The provided direction constraint is not normalized. required: - error_feedback_name ErrorUnsupportedOperation: title: ErrorUnsupportedOperation type: object properties: error_feedback_name: type: string enum: - ErrorUnsupportedOperation description: | The operation requested is not supported. required: - error_feedback_name PlanValidationError: allOf: - $ref: '#/components/schemas/ValidationError' - type: object properties: data: oneOf: - $ref: '#/components/schemas/ErrorInvalidJointCount' - $ref: '#/components/schemas/ErrorJointLimitExceeded' - $ref: '#/components/schemas/ErrorJointPositionCollision' - $ref: '#/components/schemas/ErrorDirectionConstraintNotMet' - $ref: '#/components/schemas/ErrorDirectionConstraintNotNormalized' - $ref: '#/components/schemas/ErrorUnsupportedOperation' discriminator: propertyName: error_feedback_name description: | Optional data further specifying the validation error. title: PlanValidationError Plan422Response: properties: detail: items: $ref: '#/components/schemas/PlanValidationError' type: array title: Detail type: object title: Plan422Response ColliderValue: title: ColliderValue description: An inline Collider object wrapped for discriminator support. type: object required: - source - collider properties: source: type: string enum: - value description: Discriminator value indicating an inline value. collider: $ref: '#/components/schemas/Collider' description: The inline Collider definition. StorageKey: title: StorageKey description: | A reference to an object stored in the storage service. The key is resolved against the appropriate S3 path prefix depending on context (e.g. collision/setups/, collision/colliders/). type: object required: - source - key properties: source: type: string enum: - key description: Discriminator value indicating a storage reference. key: type: string description: | The storage key identifying the object. Resolved against the storage service using the {cell} path parameter of the request URL as the storage bucket. Keys correspond to identifiers used in the Storage Service API (e.g. the {tool} parameter in GET /api/v2/cells/{cell}/store/collision/tools/{tool}). ColliderValueOrKey: title: ColliderValueOrKey description: | Either an inline Collider object or a storage key referencing a stored Collider. Discriminated by the "source" property. oneOf: - $ref: '#/components/schemas/ColliderValue' - $ref: '#/components/schemas/StorageKey' discriminator: propertyName: source mapping: value: '#/components/schemas/ColliderValue' key: '#/components/schemas/StorageKey' CollidersValueOrKey: title: CollidersValueOrKey description: | A dictionary of colliders where each value is either an inline Collider object or a string key referencing a stored Collider. type: object additionalProperties: $ref: '#/components/schemas/ColliderValueOrKey' LinkChainValue: title: LinkChainValue description: An inline link chain wrapped for discriminator support. type: object required: - source - link_chain properties: source: type: string enum: - value description: Discriminator value indicating an inline value. link_chain: $ref: '#/components/schemas/LinkChain' description: The inline link chain definition. LinkChainValueOrKey: title: LinkChainValueOrKey description: | Either an inline link chain or a storage key referencing a stored link chain. Discriminated by the "source" property. oneOf: - $ref: '#/components/schemas/LinkChainValue' - $ref: '#/components/schemas/StorageKey' discriminator: propertyName: source mapping: value: '#/components/schemas/LinkChainValue' key: '#/components/schemas/StorageKey' ToolValue: title: ToolValue description: An inline tool collider wrapped for discriminator support. type: object required: - source - tool properties: source: type: string enum: - value description: Discriminator value indicating an inline value. tool: $ref: '#/components/schemas/Tool' description: The inline tool collider definition. ToolValueOrKey: title: ToolValueOrKey description: | Either an inline tool collider or a storage key referencing a stored tool. Discriminated by the "source" property. oneOf: - $ref: '#/components/schemas/ToolValue' - $ref: '#/components/schemas/StorageKey' discriminator: propertyName: source mapping: value: '#/components/schemas/ToolValue' key: '#/components/schemas/StorageKey' CollisionSetupValue: title: CollisionSetupValue description: | An inline collision setup wrapped for discriminator support. Colliders, tool, and link_chain can each be either inline values or storage key references. type: object required: - source properties: source: type: string enum: - value description: Discriminator value indicating an inline value. colliders: $ref: '#/components/schemas/CollidersValueOrKey' description: | Colliders checked against links and tool. Each value is either an inline Collider or a store key. link_chain: $ref: '#/components/schemas/LinkChainValueOrKey' description: | The shape of the motion group links. Either an inline LinkChain or a store key. tool: $ref: '#/components/schemas/ToolValueOrKey' description: | Shape of the tool. Either an inline tool collider or a store key. self_collision_detection: type: boolean description: | If true, self-collision detection is enabled. Default is true. default: true CollisionSetupValueOrKey: title: CollisionSetupValueOrKey description: | Either an inline collision setup or a storage key referencing a complete stored CollisionSetup. Discriminated by the "source" property. oneOf: - $ref: '#/components/schemas/CollisionSetupValue' - $ref: '#/components/schemas/StorageKey' discriminator: propertyName: source mapping: value: '#/components/schemas/CollisionSetupValue' key: '#/components/schemas/StorageKey' CollisionSetupsValueOrKey: title: CollisionSetupsValueOrKey description: | Collision layers with support for storage references. Each value is either a store key referencing a stored CollisionSetup, or an inline collision setup object with optional store key references. All storage keys are resolved against the {cell} path parameter of the request URL, which determines the storage bucket. If set on the request, overrides motion_group_setup.collision_setups. type: object additionalProperties: $ref: '#/components/schemas/CollisionSetupValueOrKey' Range: type: object required: - min - max properties: min: type: number format: double max: type: number format: double description: Inclusive range defined by minimum and maximum. [max] must be greater than [min]. RRTConnectAlgorithm: title: RRTConnectAlgorithm type: object required: - algorithm_name properties: algorithm_name: type: string enum: - RRTConnectAlgorithm description: | Algorithm discriminator. RRT Connect algorithm configuration for collision-free path planning. Rapidly-exploring Random Trees (RRT) builds trees of valid configurations by randomly sampling the joint space and connecting feasible points with JointPTP motions. RRT Connect grows two trees simultaneously from start and target positions until they meet. This is a custom implementation optimized for manipulator kinematics and collision checking in industrial contexts. max_iterations: type: integer default: 10000 minimum: 1 description: | Maximum number of iterations for the RRT Connect algorithm. Higher values increase likelihood of success, but also computation time. max_step_size: deprecated: true type: number default: 0.1 description: Deprecated in favor of [step_size]. Maximum step size for tree extension in joint space. adaptive_step_size: deprecated: true type: boolean default: true description: Deprecated in favor of [step_size]. Adjust the maximum step size during the search based on the recent success rate of tree expansion. step_size: oneOf: - type: number - $ref: '#/components/schemas/Range' - enum: - null description: Step size for tree extension in joint space. If a range is given, the step size is adaptively adjusted based on the recent success rate. apply_smoothing: type: boolean default: true description: Apply smoothing after the search has succeeded. This will remove as many intermediate points as possible while keeping the path valid. apply_blending: type: boolean default: true description: Apply blending after the search has succeeded and smoothing has been applied. This will apply the largest viable blending at each intermediate point. MidpointInsertionAlgorithm: title: MidpointInsertionAlgorithm type: object required: - algorithm_name properties: algorithm_name: type: string enum: - MidpointInsertionAlgorithm description: | Algorithm discriminator. Midpoint insertion algorithm configuration for collision-free path planning. This algorithm adds a single midpoint between the start and target joint position to find collision-free paths. max_iterations: type: integer default: 1000 minimum: 1 description: | Maximum number of iterations for the midpoint insertion algorithm. Higher values increase likelyhood of success, but also computation time (linear). CollisionFreeAlgorithm: title: CollisionFreeAlgorithm type: object oneOf: - $ref: '#/components/schemas/RRTConnectAlgorithm' - $ref: '#/components/schemas/MidpointInsertionAlgorithm' discriminator: propertyName: algorithm_name description: | Configuration for collision-free path planning algorithms. Different algorithms may have different parameters and behavior. Recommendation: - For **cells with many obstacles**, use the RRTConnect algorithm. Use it as a starting point. - For **simple cells with very few obstacles** and when a faster solution is needed, try the MidpointInsertion algorithm. PlanCollisionFreeRequest: title: PlanCollisionFreeRequest type: object required: - motion_group_setup - start_joint_position - target - algorithm properties: motion_group_setup: $ref: '#/components/schemas/MotionGroupSetup' description: The data to assemble the robot setup can be retrieved from the [getMotionGroupDescription](#/operations/getMotionGroupDescription) endpoint. collision_setups: $ref: '#/components/schemas/CollisionSetupsValueOrKey' description: | Optional collision setups with support for store keys. If set, overrides motion_group_setup.collision_setups. Each value is either an inline CollisionSetup object or a storage key reference. Storage keys are resolved against the {cell} path parameter of the request URL, which determines the storage bucket. start_joint_position: $ref: '#/components/schemas/DoubleArray' description: | Starting joint position for the collision-free motion. Must contain exactly the same number of values as joints in the motion group. To retrieve the current joint position, use the endpoint [getCurrentMotionGroupState](#/operations/getCurrentMotionGroupState). target: $ref: '#/components/schemas/DoubleArray' description: | The target joint position of the motion. Must contain exactly the same number of values as joints in the motion group. To compute target joint position from a TCP pose, use the endpoint [inverseKinematics](#/operations/inverseKinematics). constraint: $ref: '#/components/schemas/DirectionConstraint' description: | Optional constraint for the motion. If provided, the motion will be constrained accordingly. > **NOTE** > > Constraints are experimental and their behavior may change in future releases. algorithm: $ref: '#/components/schemas/CollisionFreeAlgorithm' ErrorMaxIterationsExceeded: title: ErrorMaxIterationsExceeded type: object properties: max_iterations: type: integer description: | The maximum number of iterations that was reached. error_feedback_name: type: string enum: - ErrorMaxIterationsExceeded description: | The collision-free planning algorithm reached its maximum iteration limit without finding a valid path. Increase max_iterations or modify the start/target positions. required: - error_feedback_name PlanCollisionFreeFailedResponse: title: PlanCollisionFreeFailedResponse type: object required: - error_feedback properties: error_feedback: $ref: '#/components/schemas/ErrorMaxIterationsExceeded' description: | Response when collision-free trajectory planning fails. Contains specific feedback about why the planning failed. PlanCollisionFreeResponse: title: PlanCollisionFreeResponse type: object required: - response properties: response: oneOf: - $ref: '#/components/schemas/JointTrajectory' - $ref: '#/components/schemas/PlanCollisionFreeFailedResponse' description: | Response from collision-free trajectory planning. Contains either a successful joint trajectory or failure information. MotionGroupSetupDictionary: type: object title: MotionGroupSetupDictionary description: A collection of motion group setups. additionalProperties: $ref: '#/components/schemas/MotionGroupSetup' JointPTPMotion: title: JointPTPMotion type: object required: - start_joint_position - target_joint_position properties: start_joint_position: $ref: '#/components/schemas/DoubleArray' description: | Starting joint position for the collision-free motion. Must contain exactly the same number of values as joints in the motion group. To retrieve the current joint position, use the endpoint [getCurrentMotionGroupState](#/operations/getCurrentMotionGroupState). target_joint_position: $ref: '#/components/schemas/DoubleArray' description: | The target joint position of the motion. Must contain exactly the same number of values as joints in the motion group. To compute target joint position from a TCP pose, use the endpoint [inverseKinematics](#/operations/inverseKinematics). limits_override: $ref: '#/components/schemas/LimitsOverride' JointPTPMotionDictionary: type: object title: JointPTPMotionDictionary description: A collection of joint PTP path definitions. additionalProperties: $ref: '#/components/schemas/JointPTPMotion' CollisionMotionGroup: title: CollisionMotionGroup type: object properties: link_chain: $ref: '#/components/schemas/LinkChain' description: | The shape of the motion groups links to validate against colliders. Indexed along the kinematic chain, starting with a static base shape before first joint. The base of the motion group is not checked for collision against the environment. tool: $ref: '#/components/schemas/Tool' description: | Shape of the tool to validate against colliders. self_collision_detection: type: boolean description: | If true, self-collision detection is enabled for the motion group. Self-collision detection checks if links in the kinematic chain of the motion group collide with each other. Adjacent links in the kinematic chain of the motion group are not checked for mutual collision. The tool is treated like a link at the end of the kinematic chain. It is checked against all links except the last one. Default is true. default: true CollisionMotionGroupDictionary: type: object title: CollisionMotionGroupDictionary description: A collection of collision motion groups. additionalProperties: $ref: '#/components/schemas/CollisionMotionGroup' MultiCollisionSetup: title: MultiCollisionSetup type: object properties: collision_motion_groups_by_motion_group_key: $ref: '#/components/schemas/CollisionMotionGroupDictionary' description: | Dictionary of motion group collision motion groups containing link chain and tool colliders. colliders: $ref: '#/components/schemas/ColliderDictionary' description: | Colliders are checked against links and tool. MultiCollisionSetupDictionary: type: object title: MultiCollisionSetupDictionary description: A collection of multi collision setups. additionalProperties: $ref: '#/components/schemas/MultiCollisionSetup' MultiSearchCollisionFreeRequest: title: MultiSearchCollisionFreeRequest type: object required: - motion_group_setups_by_motion_group_key - path_definitions_by_motion_group_key properties: motion_group_setups_by_motion_group_key: $ref: '#/components/schemas/MotionGroupSetupDictionary' description: | Dictionary of motion group setups. path_definitions_by_motion_group_key: $ref: '#/components/schemas/JointPTPMotionDictionary' description: | Dictionary of path definitions. The keys must match the ones in `motion_group_setups_by_motion_group_key`. collision_setups: $ref: '#/components/schemas/MultiCollisionSetupDictionary' description: | Dictionary of collision setups. Defines cross-group collision checking: which link-chain/tool colliders from each motion group to consider, plus static environment colliders. algorithm_settings: $ref: '#/components/schemas/RRTConnectAlgorithm' description: | Configuration for the RRT-Connect algorithm (Rapidly-exploring Random Trees). JointPositionsArray: title: JointPositionsArray type: array items: $ref: '#/components/schemas/Joints' description: | List of joint positions for each sample. The number of samples must match the number of timestamps provided in the times field. The unit depends on the type of joint: For revolute joints, the angle is given in [rad]; for prismatic joints, the displacement is given in [mm]. JointPositionArrayDictionary: type: object title: JointPositionArrayDictionary description: A collection of joint position arrays. additionalProperties: $ref: '#/components/schemas/JointPositionsArray' MultiJointTrajectory: title: MultiJointTrajectory required: - joint_positions_by_motion_group_key - times - locations type: object properties: joint_positions_by_motion_group_key: $ref: '#/components/schemas/JointPositionArrayDictionary' description: | For each motion group, this dictionary contains a list of joint positions for each sample. The number of samples must match the number of timestamps provided in the times field. The unit depends on the type of joint: For revolute joints, the angle is given in [rad]; for prismatic joints, the displacement is given in [mm]. times: type: array items: type: number format: double description: Timestamp for each sample [s]. locations: type: array items: $ref: '#/components/schemas/Location' MultiSearchCollisionFreeResponse: title: MultiSearchCollisionFreeResponse type: object properties: response: oneOf: - $ref: '#/components/schemas/MultiJointTrajectory' - $ref: '#/components/schemas/PlanCollisionFreeFailedResponse' description: | Dictionary of joint trajectories. ErrorInvalidJointCountDictionary: title: ErrorInvalidJointCountDictionary type: object additionalProperties: $ref: '#/components/schemas/ErrorInvalidJointCount' MultiErrorInvalidJointCount: title: MultiErrorInvalidJointCount type: object properties: invalid_joint_count_errors_by_motion_group_key: $ref: '#/components/schemas/ErrorInvalidJointCountDictionary' description: | The provided joint data does not match the expected number of joints for the respective motion group. ErrorJointLimitExceededDictionary: title: ErrorJointLimitExceededDictionary type: object additionalProperties: $ref: '#/components/schemas/ErrorJointLimitExceeded' MultiErrorJointLimitExceeded: title: MultiErrorJointLimitExceeded type: object properties: joint_limit_exceeded_errors_by_motion_group_key: $ref: '#/components/schemas/ErrorJointLimitExceededDictionary' description: | A reference joint position (start or target) exceeds the configured joint limits of the respective motion group. DoubleArrayDictionary: type: object title: DoubleArrayDictionary description: A collection of single joint positions. additionalProperties: $ref: '#/components/schemas/DoubleArray' MultiErrorJointPositionCollision: title: MultiErrorJointPositionCollision type: object properties: collisions: type: array items: $ref: '#/components/schemas/Collision' joint_positions_by_motion_group_key: $ref: '#/components/schemas/DoubleArrayDictionary' description: | The joint positions of all motion groups as the collision occurs. description: | A reference joint position, e.g., start or target joint position, results in collisions that prevent processing. ErrorMotionGroupKeyMismatch: title: ErrorMotionGroupKeyMismatch type: object properties: invalid_motion_group_keys: type: array items: type: string description: | Motion group keys that have no matching motion group setup. MultiSearchCollisionFreeValidationError: allOf: - $ref: '#/components/schemas/ValidationError' - type: object properties: data: oneOf: - $ref: '#/components/schemas/MultiErrorInvalidJointCount' - $ref: '#/components/schemas/MultiErrorJointLimitExceeded' - $ref: '#/components/schemas/MultiErrorJointPositionCollision' - $ref: '#/components/schemas/ErrorMotionGroupKeyMismatch' description: | Optional data further specifying the validation error. title: MultiSearchCollisionFreeValidationError MultiSearchCollisionFree422Response: properties: detail: items: $ref: '#/components/schemas/MultiSearchCollisionFreeValidationError' type: array title: Detail type: object title: MultiSearchCollisionFree422Response MergeTrajectoriesSegment: title: MergeTrajectoriesSegment type: object required: - trajectory properties: trajectory: $ref: '#/components/schemas/JointTrajectory' description: | The trajectory segment to merge. Both the time and location arrays must start at 0 and be strictly increasing. limits_override: $ref: '#/components/schemas/LimitsOverride' description: | Limits override is used to override the global limits of the motion group for the blending at the end of this segment. blending: $ref: '#/components/schemas/BlendingPosition' description: | Blending configuration for merging this trajectory segment with the next one. Specifies how the end of this trajectory should be blended with the start of the next trajectory. Ignored for the last segment. collision_setups: $ref: '#/components/schemas/CollisionSetups' description: | Collision setups set here override the collsion setups of the Motion Group Configuration. Collisions are checked only on the trajectory section that deviates from the original path due to blending. MergeTrajectoriesRequest: title: MergeTrajectoriesRequest type: object required: - motion_group_setup - trajectory_segments properties: motion_group_setup: $ref: '#/components/schemas/MotionGroupSetup' description: The motion group setup required for collision checking and timescaling. trajectory_segments: type: array items: $ref: '#/components/schemas/MergeTrajectoriesSegment' description: | List of trajectory segments to merge together. Each segment contains a trajectory with its own limits override, blending configuration and collision setup. MergeTrajectoriesError: title: MergeTrajectoriesError type: object required: - error_feedback - error_location_on_trajectory properties: error_feedback: oneOf: - $ref: '#/components/schemas/FeedbackOutOfWorkspace' - $ref: '#/components/schemas/FeedbackSingularity' - $ref: '#/components/schemas/FeedbackJointLimitExceeded' - $ref: '#/components/schemas/FeedbackCollision' discriminator: propertyName: error_feedback_name error_location_on_trajectory: $ref: '#/components/schemas/Location' TrajectorySection: title: TrajectorySection type: object required: - start_location - end_location properties: start_location: type: number format: double end_location: type: number format: double MergeTrajectoriesResponse: title: MergeTrajectoriesResponse type: object properties: joint_trajectory: $ref: '#/components/schemas/JointTrajectory' description: | The merged joint trajectory. If a blending was requested on a segment but could not be applied, the trajectory is merged without blending. The feedback will contain further information on why blending could not be applied. feedback: type: array items: oneOf: - $ref: '#/components/schemas/MergeTrajectoriesError' - $ref: '#/components/schemas/TrajectorySection' description: | For each blending, feedback will either contain the section in which the trajectory deviates from the original path, or an error message stating why blending could not be applied. The response will include `trajectory_segments` - 1 elements. If no blending was requested at the corresponding segment, the feedback will be a null section where `start_location == end_location`. MergeTrajectoriesValidationError: allOf: - $ref: '#/components/schemas/ValidationError' - type: object properties: data: $ref: '#/components/schemas/ErrorInvalidJointCount' description: | Optional data further specifying the merge validation error. title: MergeTrajectoriesValidationError MergeTrajectories422Response: properties: detail: items: $ref: '#/components/schemas/MergeTrajectoriesValidationError' type: array title: Detail type: object title: MergeTrajectories422Response JointPositionLimits: title: JointPositionLimits type: array items: $ref: '#/components/schemas/LimitRange' description: | Joint position limits, indexed starting from base. The unit depends on the type of joint: For revolute joints, the limit is given in [rad]; for prismatic joints, it is given in [mm]. InverseKinematicsRequest: title: InverseKinematicsRequest type: object required: - motion_group_model - tcp_poses properties: motion_group_model: $ref: '#/components/schemas/MotionGroupModel' tcp_poses: type: array items: $ref: '#/components/schemas/Pose' description: | List of TCP poses for which the inverse solutions are computed. tcp_offset: $ref: '#/components/schemas/Pose' mounting: $ref: '#/components/schemas/Pose' description: Offset from the world frame to the motion group base. joint_position_limits: $ref: '#/components/schemas/JointPositionLimits' collision_setups: $ref: '#/components/schemas/CollisionSetups' reference_joint_position: $ref: '#/components/schemas/DoubleArray' description: | If present, all solutions are shifted to the same periodicity as the reference: Each individual joint angle is shifted by integer multiples of 2 pi (whole revolutions) until it's as close to the reference as possible. The solutions are sorted by ascending distance (L2 norm) from the reference. InverseKinematicsResponse: title: InverseKinematicsResponse type: object required: - joints properties: joints: type: array items: type: array items: $ref: '#/components/schemas/DoubleArray' InverseKinematicsValidationError: allOf: - $ref: '#/components/schemas/ValidationError' - type: object properties: data: oneOf: - $ref: '#/components/schemas/ErrorInvalidJointCount' - $ref: '#/components/schemas/ErrorJointLimitExceeded' discriminator: propertyName: error_feedback_name description: | Optional data further specifying the validation error. title: InverseKinematicsValidationError InverseKinematics422Response: properties: detail: items: $ref: '#/components/schemas/InverseKinematicsValidationError' type: array title: Detail type: object title: InverseKinematics422Response ConfiguredPose: type: object required: - pose - kinematic_configuration properties: pose: $ref: '#/components/schemas/Pose' kinematic_configuration: $ref: '#/components/schemas/KinematicConfiguration' ConfiguredPoseList: type: array items: $ref: '#/components/schemas/ConfiguredPose' ConfiguredPoseInverseRequest: title: ConfiguredPoseInverseRequest type: object required: - motion_group_model - tcp_poses properties: motion_group_model: $ref: '#/components/schemas/MotionGroupModel' tcp_poses: $ref: '#/components/schemas/ConfiguredPoseList' description: | List of TCP poses for which the inverse solutions are computed. tcp_offset: $ref: '#/components/schemas/Pose' mounting: $ref: '#/components/schemas/Pose' description: Offset from the world frame to the motion group base. joint_position_limits: $ref: '#/components/schemas/JointPositionLimits' collision_setups: $ref: '#/components/schemas/CollisionSetups' DoubleArrayList: type: array items: $ref: '#/components/schemas/DoubleArray' FeedbackAxisRangeExceeded: title: FeedbackAxisRangeExceeded type: object properties: joint_index: type: integer format: int32 minimum: 0 maximum: 2147483647 joint_position: $ref: '#/components/schemas/DoubleArray' error_feedback_name: type: string enum: - FeedbackAxisRangeExceeded description: | This error is returned when a joint position limit is exceeded. The joint index denotes which joint is out of its limits, starting with 0 and followed by the full joint position. required: - error_feedback_name InverseFeedbackAtIndex: title: InverseFeedbackAtIndex type: object required: - error_feedback - error_index properties: error_feedback: oneOf: - $ref: '#/components/schemas/FeedbackOutOfWorkspace' - $ref: '#/components/schemas/FeedbackSingularity' - $ref: '#/components/schemas/FeedbackJointLimitExceeded' - $ref: '#/components/schemas/FeedbackAxisRangeExceeded' - $ref: '#/components/schemas/FeedbackCollision' discriminator: propertyName: error_feedback_name error_index: type: integer ConfiguredPoseInverseFailedResponse: title: ConfiguredPoseInverseFailedResponse type: object required: - joint_positions properties: joint_positions: $ref: '#/components/schemas/DoubleArrayList' feedbacks: type: array items: $ref: '#/components/schemas/InverseFeedbackAtIndex' ConfiguredPoseInverseResponse: title: ConfiguredPoseInverseResponse type: object required: - response properties: response: oneOf: - $ref: '#/components/schemas/DoubleArrayList' - $ref: '#/components/schemas/ConfiguredPoseInverseFailedResponse' ConfiguredPoseInverse422Response: title: ConfiguredPoseInverse422Response type: object properties: detail: type: array title: Detail items: $ref: '#/components/schemas/ValidationError' AbbPose: title: AbbPose description: ABB pose with position (`x`, `y`, `z`) and quaternion orientation (`q1`, `q2`, `q3`, `q4`). type: object required: - x - 'y' - z - q1 - q2 - q3 - q4 properties: x: type: number format: double 'y': type: number format: double z: type: number format: double q1: type: number format: double q2: type: number format: double q3: type: number format: double q4: type: number format: double AbbConfdata: title: AbbConfdata type: object required: - cf1 - cf4 - cf6 - cfx properties: cf1: type: integer description: | Quadrant number for axis 1. Quadrant n means the axis angle is in the interval [n*90deg, (n+1)*90deg). Can be negative. cf4: type: integer description: | Quadrant number for axis 4. Quadrant n means the axis angle is in the interval [n*90deg, (n+1)*90deg). Can be negative. cf6: type: integer description: | Quadrant number for axis 6. Quadrant n means the axis angle is in the interval [n*90deg, (n+1)*90deg). Can be negative. cfx: type: integer minimum: 0 maximum: 7 description: | 3 branch bits composing the kinematic configuration: - Bit 0 (Wrist): 0 = positive axis 5 angle `NO_FLIP`, 1 = negative `FLIP`. - Bit 1 (Elbow): 0 = in front of lower arm `DOWN`, 1 = behind `UP`. - Bit 2 (Shoulder): 0 = in front of axis 1 `LEFT`, 1 = behind `RIGHT`. AbbConfiguredPose: title: AbbConfiguredPose description: A pose combined with ABB kinematic configuration data, `confdata`. type: object required: - pose - confdata properties: pose: $ref: '#/components/schemas/AbbPose' confdata: $ref: '#/components/schemas/AbbConfdata' AbbConfiguredPoseList: type: array items: $ref: '#/components/schemas/AbbConfiguredPose' KukaPose: title: KukaPose description: | KUKA E6POS position and Euler ZYX intrinsic orientation. Position in [mm], orientation as A (Z), B (Y'), C (X'') in degrees. type: object required: - x - 'y' - z - a - b - c properties: x: type: number format: double description: X position in mm. 'y': type: number format: double description: Y position in mm. z: type: number format: double description: Z position in mm. a: type: number format: double description: Rotation around Z axis in degrees. b: type: number format: double description: Rotation around Y' axis in degrees. c: type: number format: double description: Rotation around X'' axis in degrees. KukaStatusAndTurnBits: title: KukaStatusAndTurnBits description: | KUKA status/turn kinematic configuration bits. S (3-bit status): Encodes shoulder, elbow, and wrist configuration. T (6-bit turn): Encodes axis angle signs for A1-A6. type: object required: - s - t properties: s: type: integer minimum: 0 maximum: 7 description: | 3 status bits: - Bit 0 (Shoulder): 0 = `LEFT`, 1 = `RIGHT` - Bit 1 (Elbow): 0 = `UP`, 1 = `DOWN` - Bit 2 (Wrist): 0 = `NO_FLIP`, 1 = `FLIP` t: type: integer minimum: 0 maximum: 63 description: | 6 turn bits: - Bits 0-5: Encode the sign of axes A1-A6. - Bit N = 0: axis N+1 angle >= 0 deg - Bit N = 1: axis N+1 angle < 0 deg KukaConfiguredPose: title: KukaConfiguredPose description: A KUKA E6POS pose combined with status/turn kinematic configuration data. type: object required: - pose - status_and_turn_bits properties: pose: $ref: '#/components/schemas/KukaPose' status_and_turn_bits: $ref: '#/components/schemas/KukaStatusAndTurnBits' KukaConfiguredPoseList: type: array items: $ref: '#/components/schemas/KukaConfiguredPose' ConvertVendorConfiguredPoseRequest: type: object required: - vendor_configured_poses properties: vendor_configured_poses: oneOf: - $ref: '#/components/schemas/AbbConfiguredPoseList' - $ref: '#/components/schemas/KukaConfiguredPoseList' ConvertVendorConfiguredPose422Response: title: ConvertVendorConfiguredPose422Response type: object properties: detail: type: array title: Detail items: $ref: '#/components/schemas/ValidationError' ForwardKinematicsRequest: title: ForwardKinematicsRequest type: object required: - motion_group_model - joint_positions properties: motion_group_model: $ref: '#/components/schemas/MotionGroupModel' joint_positions: type: array items: $ref: '#/components/schemas/DoubleArray' description: | List of joint positions for which TCP poses are computed. The unit depends on the type of joint: For revolute joints, the angle is given in [rad]; for prismatic joints, the displacement is given in [mm]. tcp_offset: $ref: '#/components/schemas/Pose' mounting: $ref: '#/components/schemas/Pose' description: Offset from the world frame to the motion group base. ForwardKinematicsResponse: title: ForwardKinematicsResponse type: object required: - tcp_poses properties: tcp_poses: type: array items: $ref: '#/components/schemas/Pose' description: | List of computed TCP poses corresponding to the input joint positions. ForwardKinematicsValidationError: allOf: - $ref: '#/components/schemas/ValidationError' - type: object properties: data: $ref: '#/components/schemas/ErrorInvalidJointCount' title: ForwardKinematicsValidationError ForwardKinematics422Response: properties: detail: items: $ref: '#/components/schemas/ForwardKinematicsValidationError' type: array title: Detail type: object title: ForwardKinematics422Response ProjectJointPositionDirectionConstraintRequest: title: ProjectJointPositionDirectionConstraintRequest type: object required: - motion_group_model - joint_positions - constraint properties: motion_group_model: $ref: '#/components/schemas/MotionGroupModel' joint_positions: type: array items: $ref: '#/components/schemas/DoubleArray' description: | List of joint positions for which the direction constraint is applied. constraint: $ref: '#/components/schemas/DirectionConstraint' tcp_offset: $ref: '#/components/schemas/Pose' mounting: $ref: '#/components/schemas/Pose' description: Offset from the world frame to the motion group base. joint_position_limits: $ref: '#/components/schemas/JointPositionLimits' collision_setups: $ref: '#/components/schemas/CollisionSetups' ProjectJointPositionDirectionConstraintResponse: title: ProjectJointPositionDirectionConstraintResponse type: object required: - projected_joint_positions properties: projected_joint_positions: type: array items: oneOf: - $ref: '#/components/schemas/DoubleArray' - enum: - null description: | List of projected joint positions. If the resulting joint position is in collision or violates joint limits, the corresponding entry is null. ProjectJointPositionDirectionConstraintValidationError: allOf: - $ref: '#/components/schemas/ValidationError' - type: object properties: data: oneOf: - $ref: '#/components/schemas/ErrorDirectionConstraintNotNormalized' - $ref: '#/components/schemas/ErrorInvalidJointCount' - $ref: '#/components/schemas/ErrorUnsupportedOperation' discriminator: propertyName: error_feedback_name description: | Optional data further specifying the validation error. title: ProjectJointPositionDirectionConstraintValidationError ProjectJointPositionDirectionConstraint422Response: properties: detail: items: $ref: '#/components/schemas/ProjectJointPositionDirectionConstraintValidationError' type: array title: Detail type: object title: ProjectJointPositionDirectionConstraint422Response ListTrajectoriesResponse: type: object properties: trajectories: type: array items: type: string description: | Identifiers of trajectories which are currently cached. Use [addTrajectory](#/operations/addTrajectory) to add a new trajectory. Adding trajectories is necessary to execute them. Trajectories are removed if the corresponding motion group or controller disconnects. AddTrajectoryRequest: type: object required: - motion_group - trajectory properties: motion_group: type: string description: Unique identifier of the motion group the trajectory is planned for. trajectory: $ref: '#/components/schemas/JointTrajectory' description: | The trajectory consisting of a list of joint positions and an equal number of corresponding timestamps. tcp: type: string description: Unique identifier of the tool the trajectory is planned for. TcpRequiredError: title: TcpRequiredError type: object required: - kind properties: kind: type: string enum: - TcpRequiredError x-is-discriminator: true tcp_missing: properties: {} description: Requested motion group requires TCP to be defined. InconsistentTrajectorySizeError: title: InconsistentTrajectorySizeError type: object required: - kind properties: kind: type: string enum: - InconsistentTrajectorySizeError x-is-discriminator: true inconsistent_trajectory_size: type: object properties: joint_position_size: type: integer format: int32 times_size: type: integer format: int32 locations_size: type: integer format: int32 description: | Indicates that the trajectory contains an inconsistent number of joint positions, times, or locations. JointLimitExceededError: title: JointLimitExceededError type: object required: - kind properties: kind: type: string enum: - JointLimitExceededError x-is-discriminator: true joint_limit_exceeded: $ref: '#/components/schemas/FeedbackJointLimitExceeded' CollisionError: title: CollisionError type: object required: - kind properties: kind: type: string enum: - CollisionError x-is-discriminator: true collision: $ref: '#/components/schemas/FeedbackCollision' TorqueExceededError: title: TorqueExceededError type: object required: - kind properties: kind: type: string enum: - TorqueExceededError x-is-discriminator: true torque_exceeded: type: object properties: torque_value: type: number format: double description: | The torque value that was exceeded. torque_limit: type: number format: double description: | The value of the torque limit that was exceeded. InvalidDofError: title: InvalidDofError type: object required: - kind properties: kind: type: string enum: - InvalidDofError x-is-discriminator: true invalid_dof: type: object properties: valid_dof: type: integer format: int32 description: | The valid degrees of freedom for the motion group. joint_position: type: array items: type: number format: double description: The joint position that is out of its limits. NanValueError: title: NanValueError type: object required: - kind properties: kind: type: string enum: - NanValueError x-is-discriminator: true nan_value: type: object properties: joint_position: type: array items: type: number format: double description: The joint position that is out of its limits. description: Requested joint position contains NaN values. AddTrajectoryError: title: AddTrajectoryError type: object properties: message: type: string location: $ref: '#/components/schemas/Location' description: | Location on trajectory where the error occurred. data: oneOf: - $ref: '#/components/schemas/TcpRequiredError' - $ref: '#/components/schemas/InconsistentTrajectorySizeError' - $ref: '#/components/schemas/JointLimitExceededError' - $ref: '#/components/schemas/CollisionError' - $ref: '#/components/schemas/TorqueExceededError' - $ref: '#/components/schemas/InvalidDofError' - $ref: '#/components/schemas/NanValueError' discriminator: propertyName: kind mapping: TcpRequiredError: '#/components/schemas/TcpRequiredError' InconsistentTrajectorySizeError: '#/components/schemas/InconsistentTrajectorySizeError' JointLimitExceededError: '#/components/schemas/JointLimitExceededError' CollisionError: '#/components/schemas/CollisionError' TorqueExceededError: '#/components/schemas/TorqueExceededError' InvalidDofError: '#/components/schemas/InvalidDofError' NanValueError: '#/components/schemas/NanValueError' AddTrajectoryResponse: title: AddTrajectoryResponse type: object properties: trajectory: type: string description: | The unique identifier of the trajectory. Use this identifier to execute the trajectory with the [executeTrajectory](#/operations/executeTrajectory) endpoint. error: $ref: '#/components/schemas/AddTrajectoryError' description: | Always check this field first. If this field is present, the trajectory has an error and is only partially or not executable. description: | The response signals if the trajectory is valid or faulty, resulting in an executable, partially executable or non-executable state. - valid trajectory: response contains only the unique identifier for the trajectory - trajectory has error on path: response contains the unique identifier for the trajectory and information about the failure. It is executable up to the point of failure. - trajectory has error at start or invalid data: response contains only information about the failure. To execute the trajectory, use the unique identifier for calling [executeTrajectory](#/operations/executeTrajectory). If you want to validate your trajectory before execution, execute it with a virtual motion group and check the state in the response stream of [executeTrajectory](#/operations/executeTrajectory). GetTrajectoryResponse: type: object required: - motion_group - trajectory - tcp properties: motion_group: type: string description: Unique identifier of the motion group the trajectory is planned for. trajectory: $ref: '#/components/schemas/JointTrajectory' description: | The trajectory consisting of a list of joint positions and an equal number of corresponding timestamps. tcp: type: string description: Unique identifier of the tool the trajectory is planned for. TrajectoryId: title: TrajectoryId required: - id - message_type type: object properties: message_type: type: string enum: - TrajectoryId description: | Type specifier for server, set automatically. id: type: string description: | The identifier of the trajectory which was returned by the [addTrajectory](#/operations/addTrajectory) endpoint. TrajectoryData: title: TrajectoryData required: - data - message_type type: object properties: message_type: type: string enum: - TrajectoryData description: | Type specifier for server, set automatically. motion_group: type: string description: Identifier of the motion-group. data: $ref: '#/components/schemas/JointTrajectory' description: | The trajectory consisting of a list of joint positions and an equal number of corresponding timestamps. tcp: type: string description: Unique identifier of the tool the trajectory is planned for. InitializeMovementRequest: title: InitializeMovementRequest required: - message_type - trajectory type: object properties: message_type: type: string enum: - InitializeMovementRequest description: | Type specifier for server, set automatically. trajectory: oneOf: - $ref: '#/components/schemas/TrajectoryId' - $ref: '#/components/schemas/TrajectoryData' discriminator: propertyName: message_type description: | The trajectory which should be executed and locked to the connection. initial_location: $ref: '#/components/schemas/Location' description: | Location on trajectory where the execution will start. Defaults to 0.0, start of the trajectory. ATTENTION: The robot has to be at the position of the initial location when initializing the movement. If not, an error is returned. response_coordinate_system: type: string description: | Unique identifier addressing a coordinate system to which the responses are transformed. If not set, world coordinate system is used. ignore_controller_limits: type: boolean default: false description: | If the flag is `true`, controller limits are ignored. Changes to controller limits are not applied to the trajectory. description: | Sets up connection by locking a trajectory for execution. The robot controller mode is set to control mode. ATTENTION: This request has to be sent before any StartMovementRequest is sent. If initializing the movement was successful, no further movements can be initialized. To execute another trajectory, another connection has to be established. Direction: format: enum type: string enum: - DIRECTION_FORWARD - DIRECTION_BACKWARD default: DIRECTION_FORWARD description: | The direction in which the trajectory is executed. Default: Forward. IOOrigin: enum: - CONTROLLER - BUS_IO type: string format: enum description: | States the source of the input/output signal. SetIO: required: - io - location - io_origin type: object properties: io: $ref: '#/components/schemas/IOValue' location: type: number description: The location on the trajectory where the input/output should be set. format: double io_origin: $ref: '#/components/schemas/IOOrigin' description: Defines an input/output that should be set upon reaching a specified location on the trajectory. StartOnIO: required: - io - comparator - io_origin type: object properties: io: $ref: '#/components/schemas/IOValue' comparator: $ref: '#/components/schemas/Comparator' description: | Comparator for the comparison of two values. Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b. io_origin: $ref: '#/components/schemas/IOOrigin' description: Defines an input/output that the motion should wait for to start the execution. PauseOnIO: required: - io - comparator - io_origin type: object properties: io: $ref: '#/components/schemas/IOValue' comparator: $ref: '#/components/schemas/Comparator' description: | Comparator for the comparison of two values. Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b. io_origin: $ref: '#/components/schemas/IOOrigin' description: Defines an input/output that the motion will be paused for. The motion will stop gracefully on path. StartMovementRequest: title: StartMovementRequest type: object required: - message_type properties: message_type: type: string enum: - StartMovementRequest description: | Type specifier for server, set automatically. direction: $ref: '#/components/schemas/Direction' target_location: $ref: '#/components/schemas/Location' description: | The target location to which the motion group moves along the trajectory to. If `direction` and `target_location` are both specified, target location takes precedence. If neither is specified, the default is `DIRECTION_FORWARD`. set_outputs: type: array items: $ref: '#/components/schemas/SetIO' description: | Attaches a list of output commands to the trajectory. The outputs are set to the specified values right after the specified location was reached. If the specified location is located before the start location (forward direction: value is smaller, backward direction: value is bigger), the output is not set. start_on_io: $ref: '#/components/schemas/StartOnIO' description: | Defines an input/output that is listened to before the movement. Execution starts if the defined comparator evaluates to `true`. pause_on_io: $ref: '#/components/schemas/PauseOnIO' description: | Defines an input/output that is listened to during the movement. Execution pauses if the defined comparator evaluates to `true`. description: | Moves the motion group along a trajectory, added via [planTrajectory](#/operations/planTrajectory) or [planMotion](#/operations/planMotion). Trajectories can be executed forwards or backwards("in reverse"). Pause the execution with PauseMovementRequest. Resume execution with StartMovementRequest. Precondition: To start execution, the motion group must be located at the trajectory's start location specified in InitializeMovementRequest. PauseMovementRequest: title: PauseMovementRequest type: object required: - message_type properties: message_type: type: string enum: - PauseMovementRequest description: | Type specifier for server, set automatically. description: | Request to pause the movement execution. Movement pauses as soon as a [Standstill](Standstill.yaml) is sent back to the client. Resume movement with StartMovementRequest. PlaybackSpeedRequest: title: PlaybackSpeedRequest required: - message_type - playback_speed_in_percent type: object properties: message_type: type: string enum: - PlaybackSpeedRequest description: | Type specifier for server, set automatically. playback_speed_in_percent: type: integer format: int32 minimum: 0 maximum: 100 description: | Sets velocity for executed movements of the trajectory, in percent. 100% means that the motion group moves as fast as possible without violating any planning and motion group limits. Setting this value does not affect the overall shape of the velocity profile. The velocity profile of the trajectory is scaled down by the same factor. Therefore, this should only be used for teaching and trajectory evaluation purposes. To maintain a specific velocity, set the respective limits when planning the trajectory. description: | Sets velocity for executed movements of the motion, in percent. Send after initializing the connection with InitializeMovementRequest. ExecuteTrajectoryRequest: title: ExecuteTrajectoryRequest type: object oneOf: - $ref: '#/components/schemas/InitializeMovementRequest' - $ref: '#/components/schemas/StartMovementRequest' - $ref: '#/components/schemas/PauseMovementRequest' - $ref: '#/components/schemas/PlaybackSpeedRequest' discriminator: propertyName: message_type InitializeMovementResponse: title: InitializeMovementResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid InitializeMovementRequest. add_trajectory_error: $ref: '#/components/schemas/AddTrajectoryError' description: | Error can occur if joint trajectory was added by InitializeMovementRequest and the trajectory is invalid. kind: type: string enum: - INITIALIZE_RECEIVED description: | Response for InitializeMovementRequest message. StartMovementResponse: title: StartMovementResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid StartMovementResquest. kind: type: string enum: - START_RECEIVED description: | Acknowledgment for StartMovementRequest message. ATTENTION: No confirmation that the movement was started. Confirmation that the StartMovementRequest was received and is processed. Fields `execute` and `standstill` of response of [streamMotionGroupState](#/operations/streamMotionGroupState) signal start of movement execution. PauseMovementResponse: title: PauseMovementResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid PauseMovementRequest. kind: type: string enum: - PAUSE_RECEIVED description: | Acknowledgment for PauseMovementRequest message. ATTENTION: No confirmation that the movement was paused. Confirmation that the PauseMovementRequest was received and is processed. End of movement execution is signalled by [state stream](#/operations/streamMotionGroupState) response. See TrajectoryDetails of details in execute. PlaybackSpeedResponse: title: PlaybackSpeedResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid PlaybackSpeedRequest. kind: type: string enum: - PLAYBACK_SPEED_RECEIVED description: | Acknowledgment for PlaybackSpeedRequest message. MovementErrorResponse: title: MovementErrorResponse type: object required: - message - kind properties: message: type: string description: Detailed error message describing the issue encountered during movement execution. kind: type: string enum: - MOTION_ERROR description: | Error message in case an error occurs during movement execution. ExecuteTrajectoryResponse: title: ExecuteTrajectoryResponse type: object oneOf: - $ref: '#/components/schemas/InitializeMovementResponse' - $ref: '#/components/schemas/StartMovementResponse' - $ref: '#/components/schemas/PauseMovementResponse' - $ref: '#/components/schemas/PlaybackSpeedResponse' - $ref: '#/components/schemas/MovementErrorResponse' discriminator: propertyName: kind mapping: INITIALIZE_RECEIVED: '#/components/schemas/InitializeMovementResponse' START_RECEIVED: '#/components/schemas/StartMovementResponse' PAUSE_RECEIVED: '#/components/schemas/PauseMovementResponse' PLAYBACK_SPEED_RECEIVED: '#/components/schemas/PlaybackSpeedResponse' MOTION_ERROR: '#/components/schemas/MovementErrorResponse' InitializeJoggingRequest: title: InitializeJoggingRequest type: object required: - message_type - motion_group properties: message_type: type: string enum: - InitializeJoggingRequest description: | Type specifier for server, set automatically. motion_group: type: string description: Identifier of the motion group. tcp: type: string 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. description: Send this message to start jogging a motion group. JointVelocityRequest: title: JointVelocityRequest type: object required: - message_type - velocity properties: message_type: type: string enum: - JointVelocityRequest description: Type specifier for server, set automatically. velocity: $ref: '#/components/schemas/Joints' description: in [rad/s] description: Sets target joint velocities for jogging a motion group. TcpVelocityRequest: title: TcpVelocityRequest type: object required: - message_type - translation - rotation properties: message_type: type: string enum: - TcpVelocityRequest description: | Type specifier for server, set automatically. translation: $ref: '#/components/schemas/Vector3d' rotation: $ref: '#/components/schemas/Vector3d' use_tool_coordinate_system: type: boolean default: false description: | If true, TCP velocities are interpreted in the tool coordinate system, specified by the TCP. If false, TCP velocities are interpreted in the world coordinate system. description: | Sets target TCP velocities for jogging a motion group. The motion group needs to have an inverse kinematic solver to be jogged by TCP velocities. Check `supports_inverse_kinematics` field in response of [listController](#/operations/listController) for the motion group. PauseJoggingRequest: title: PauseJoggingRequest type: object required: - message_type properties: message_type: type: string enum: - PauseJoggingRequest description: | Type specifier for server, set automatically. description: | Request to pause jogging. If successful, `execute` jogging state in [MotionGroupState](MotionGroupState.yaml) is set to `PAUSED_BY_USER`. ExecuteJoggingRequest: title: ExecuteJoggingRequest type: object oneOf: - $ref: '#/components/schemas/InitializeJoggingRequest' - $ref: '#/components/schemas/JointVelocityRequest' - $ref: '#/components/schemas/TcpVelocityRequest' - $ref: '#/components/schemas/PauseJoggingRequest' discriminator: propertyName: message_type InitializeJoggingResponse: title: InitializeJoggingResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid InitializeJoggingRequest. kind: type: string enum: - INITIALIZE_RECEIVED description: | Acknowledgment to an InitializeJoggingRequest. PauseJoggingResponse: title: PauseJoggingResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid PauseJoggingRequest. kind: type: string enum: - PAUSE_RECEIVED description: | Acknowledgment to a PauseJoggingRequest. TcpVelocityResponse: title: TcpVelocityResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid TcpVelocityRequest. kind: type: string enum: - TCP_VELOCITY_RECEIVED description: | Acknowledgment to a TcpVelocityRequest. JointVelocityResponse: title: JointVelocityResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid JointVelocityRequest. kind: type: string enum: - JOINT_VELOCITY_RECEIVED description: | Acknowledgment to a JointVelocityRequest. ExecuteJoggingResponse: title: ExecuteJoggingResponse type: object oneOf: - $ref: '#/components/schemas/InitializeJoggingResponse' - $ref: '#/components/schemas/PauseJoggingResponse' - $ref: '#/components/schemas/TcpVelocityResponse' - $ref: '#/components/schemas/JointVelocityResponse' - $ref: '#/components/schemas/MovementErrorResponse' discriminator: propertyName: kind mapping: INITIALIZE_RECEIVED: '#/components/schemas/InitializeJoggingResponse' PAUSE_RECEIVED: '#/components/schemas/PauseJoggingResponse' TCP_VELOCITY_RECEIVED: '#/components/schemas/TcpVelocityResponse' JOINT_VELOCITY_RECEIVED: '#/components/schemas/JointVelocityResponse' MOTION_ERROR: '#/components/schemas/MovementErrorResponse' JointWaypoint: title: JointWaypoint type: object required: - timestamp - joints properties: timestamp: type: integer format: int64 description: Time since session start for when this waypoint should be reached [ms]. joints: $ref: '#/components/schemas/Joints' description: Joint positions for this waypoint [rad]. description: | A waypoint in joint space for jogging. > **NOTE** > > This type is experimental and its behavior may change in future releases. JointWaypointsRequest: title: JointWaypointsRequest type: object required: - message_type - waypoints properties: message_type: type: string enum: - JointWaypointsRequest description: | Type specifier for server, set automatically. waypoints: type: array items: $ref: '#/components/schemas/JointWaypoint' description: | List of joint waypoints. description: | Adds joint waypoints to the jogging queue. The robot will try to move through each waypoint by best effort. Existing waypoints in the queue that are older than the first new timestamp will be removed. The first message of this kind starts an internal clock. The current session timestamp is reported in `execute.details.jogger_session_timestamp_ms` of the [streamRobotControllerState](#/operations/streamRobotControllerState) endpoint. This can be used for realtime action chunk streaming, e.g., from a Vision-Language-Action (VLA) model. > **NOTE** > > This jogging type is experimental and its behavior may change in future releases. PoseWaypoint: title: PoseWaypoint type: object required: - timestamp - pose properties: timestamp: type: integer format: int64 description: Time since session start for when this waypoint should be reached [ms]. pose: $ref: '#/components/schemas/Pose' description: Cartesian pose for this waypoint. description: | A waypoint in Cartesian space for jogging. > **NOTE** > > This type is experimental and its behavior may change in future releases. PoseWaypointsRequest: title: PoseWaypointsRequest type: object required: - message_type - waypoints properties: message_type: type: string enum: - PoseWaypointsRequest description: | Type specifier for server, set automatically. waypoints: type: array items: $ref: '#/components/schemas/PoseWaypoint' description: | List of pose waypoints. description: | Adds pose waypoints to the jogging queue. The robot will try to move through each waypoint by best effort. Existing waypoints in the queue that are older than the first new timestamp will be removed. The first message of this kind starts an internal clock. The current session timestamp is reported in `execute.details.jogger_session_timestamp_ms` of the [streamRobotControllerState](#/operations/streamRobotControllerState) endpoint. This can be used for realtime action chunk streaming, e.g., from a Vision-Language-Action (VLA) model. > **NOTE** > > This jogging type is experimental and its behavior may change in future releases. ExecuteWaypointJoggingRequest: title: ExecuteWaypointJoggingRequest type: object oneOf: - $ref: '#/components/schemas/InitializeJoggingRequest' - $ref: '#/components/schemas/JointWaypointsRequest' - $ref: '#/components/schemas/PoseWaypointsRequest' - $ref: '#/components/schemas/PauseJoggingRequest' discriminator: propertyName: message_type JointWaypointsResponse: title: JointWaypointsResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid JointWaypointsRequest. kind: type: string enum: - JOINT_WAYPOINTS_RECEIVED description: | Acknowledgment to a JointWaypointsRequest. PoseWaypointsResponse: title: PoseWaypointsResponse type: object required: - kind properties: message: type: string description: Error message in case of invalid PoseWaypointsRequest. kind: type: string enum: - POSE_WAYPOINTS_RECEIVED description: | Acknowledgment to a PoseWaypointsRequest. ExecuteWaypointJoggingResponse: title: ExecuteWaypointJoggingResponse type: object oneOf: - $ref: '#/components/schemas/InitializeJoggingResponse' - $ref: '#/components/schemas/PauseJoggingResponse' - $ref: '#/components/schemas/JointWaypointsResponse' - $ref: '#/components/schemas/PoseWaypointsResponse' - $ref: '#/components/schemas/MovementErrorResponse' discriminator: propertyName: kind mapping: INITIALIZE_RECEIVED: '#/components/schemas/InitializeJoggingResponse' PAUSE_RECEIVED: '#/components/schemas/PauseJoggingResponse' JOINT_WAYPOINTS_RECEIVED: '#/components/schemas/JointWaypointsResponse' POSE_WAYPOINTS_RECEIVED: '#/components/schemas/PoseWaypointsResponse' MOTION_ERROR: '#/components/schemas/MovementErrorResponse' Program: title: Program description: A program is a collection of instructions that are executed in the robot cell. type: object properties: program: title: Unique program identifier type: string example: my_program pattern: ^[a-zA-Z0-9_-]+$ minLength: 1 maxLength: 255 name: title: Program name type: string description: title: Program description type: string app: title: The app containing the program. type: string input_schema: title: Program input json schema type: object preconditions: title: Preconditions before the program can be started type: object required: - program - app ProgramStartRequest: title: ProgramStartRequest description: The state of a program run. type: object properties: arguments: type: object default: {} description: The arguments to pass to the program. required: - arguments ProgramRunState: title: ProgramRunState description: The state of a program run. type: string format: enum enum: - PREPARING - RUNNING - COMPLETED - FAILED - STOPPED ProgramRun: title: ProgramRun description: Holds the state of a program run. type: object properties: run: title: Run Id description: Unique identifier of the program run type: string program: title: Program Id description: Unique identifier of the program type: string app: title: App Id description: Identifier of the app that produced the program run type: string state: title: State description: State of the program run $ref: '#/components/schemas/ProgramRunState' logs: title: Logs description: Logs of the program run type: string stdout: title: Stdout description: Stdout of the program run type: string stderr: title: Stderr description: Stderr of the program run type: string error: title: Error description: Error message of the program run, if any type: string traceback: title: Traceback description: Traceback of the program run, if any type: string start_time: title: Start Time description: Start time of the program run in RFC3339 format type: string format: date-time end_time: title: End Time description: End time of the program run in RFC3339 format type: string format: date-time input_data: title: Input Data description: Input data of the program run type: object required: - run - program - state ValidationError-2: title: ValidationError description: A validation error of a program. type: object properties: loc: items: type: integer type: array title: Location msg: type: string title: Message type: type: string title: Error Type required: - loc - msg - type HTTPValidationError: title: HTTPValidationError type: object properties: detail: items: $ref: '#/components/schemas/ValidationError-2' type: array title: Detail CloudConnectionRequest: type: object properties: cloud_hostname: type: string example: novacloud.dev.wandelbots.io token: type: string description: Auth token of the user registering the instance. This must be a valid oauth token granting access to the NOVA Cloud API. example: eyJ0eXAiOiJKV1QiLCJhbGciOiJ... instance_name: type: string description: Human-readable name to identify the instance in the fleet manager dashboard. example: Leafnode Test instance_url: type: string format: uri description: Optional local network url for the instance, used to link users directly from the fleet manager. If not specified, will be inferred from the request URL. example: http://nova.instance required: - cloud_hostname - token - instance_name example: cloud_hostname: novacloud.dev.wandelbots.io token: eyJ0eXAiOiJKV1QiLCJhbGciOiJ... instance_name: Leafnode Test CloudRegistrationSuccessResponse: type: object properties: instance: type: integer minimum: 1 description: Instance identifier received from cloud registration required: - instance example: instance: 123 title: CloudRegistrationSuccessResponse ZodValidationError: type: object properties: error: type: object properties: code: type: string enum: - validation_error message: type: string description: Human-readable summary of the validation errors details: type: array items: type: object properties: code: type: string path: type: array items: oneOf: - type: string - type: number message: type: string required: - code - path - message description: Array of Zod issue objects describing the validation errors required: - code - message - details required: - error CloudConnectionErrorInvalidToken: type: object properties: code: type: string enum: - invalid_cloud_token message: type: string example: The provided NOVA Cloud oauth token is invalid. details: type: object properties: cloud_response: type: object properties: status: type: integer headers: {} body: type: string required: - status - body required: - cloud_response required: - code - message - details title: CloudConnectionErrorInvalidToken CloudConnectionErrorUnexpectedResponse: type: object properties: code: type: string enum: - unexpected_cloud_response message: type: string example: The NOVA Cloud API returned an unexpected response. details: type: object properties: cloud_response: type: object properties: status: type: integer headers: type: object additionalProperties: {} body: type: string required: - status - headers - body required: - cloud_response required: - code - message - details title: CloudConnectionErrorUnexpectedResponse CloudConnectionErrorNatsFailed: type: object properties: code: type: string enum: - nats_connection_failed message: type: string example: Failed to connect to the NOVA Cloud NATS server with the provided configuration. details: type: object properties: nats_server_url: type: string nats_error_message: type: string required: - nats_server_url - nats_error_message required: - code - message - details title: CloudConnectionErrorNatsFailed CloudConnectionErrorLeafnodeRestartTimeout: type: object properties: code: type: string enum: - leafnode_restart_timeout message: type: string example: Timeout waiting for NATS pod to restart required: - code - message title: CloudConnectionErrorLeafnodeRestartTimeout CloudConnectionErrorLeafnodeConnectionError: type: object properties: code: type: string enum: - leafnode_connection_error message: type: string example: 'NATS leafnode connection error: Read Error - Account: NOVA_REMOTE' details: type: object properties: log_line: type: string example: '2026/02/11 14:30:58.988180 [INF] 10.20.128.16:443 - lid_ws:212 - Leafnode connection closed: Read Error - Account: NOVA_REMOTE' required: - log_line required: - code - message - details title: CloudConnectionErrorLeafnodeConnectionError CloudConnectionErrorLeafnodeConnectionTimeout: type: object properties: code: type: string enum: - leafnode_connection_timeout message: type: string example: Timeout waiting for NATS leafnode connection log message to appear required: - code - message title: CloudConnectionErrorLeafnodeConnectionTimeout CloudConnectionError: type: object properties: error: oneOf: - $ref: '#/components/schemas/CloudConnectionErrorInvalidToken' - $ref: '#/components/schemas/CloudConnectionErrorUnexpectedResponse' - $ref: '#/components/schemas/CloudConnectionErrorNatsFailed' - $ref: '#/components/schemas/CloudConnectionErrorLeafnodeRestartTimeout' - $ref: '#/components/schemas/CloudConnectionErrorLeafnodeConnectionError' - $ref: '#/components/schemas/CloudConnectionErrorLeafnodeConnectionTimeout' discriminator: propertyName: code mapping: invalid_cloud_token: '#/components/schemas/CloudConnectionErrorInvalidToken' unexpected_cloud_response: '#/components/schemas/CloudConnectionErrorUnexpectedResponse' nats_connection_failed: '#/components/schemas/CloudConnectionErrorNatsFailed' leafnode_restart_timeout: '#/components/schemas/CloudConnectionErrorLeafnodeRestartTimeout' leafnode_connection_error: '#/components/schemas/CloudConnectionErrorLeafnodeConnectionError' leafnode_connection_timeout: '#/components/schemas/CloudConnectionErrorLeafnodeConnectionTimeout' required: - error CloudConfiguration: type: object properties: cloud_hostname: type: string example: novacloud.dev.wandelbots.io instance: type: integer minimum: 1 description: Instance identifier received from cloud registration required: - cloud_hostname - instance CloudConfigStatusConfigured: type: object properties: status: type: string enum: - configured config: $ref: '#/components/schemas/CloudConfiguration' required: - status - config title: CloudConfigStatusConfigured CloudConfigStatusNotConfigured: type: object properties: status: type: string enum: - not_configured required: - status title: CloudConfigStatusNotConfigured CloudConfigStatus: oneOf: - $ref: '#/components/schemas/CloudConfigStatusConfigured' - $ref: '#/components/schemas/CloudConfigStatusNotConfigured' discriminator: propertyName: status mapping: configured: '#/components/schemas/CloudConfigStatusConfigured' not_configured: '#/components/schemas/CloudConfigStatusNotConfigured' CloudDisconnectionStatusDisconnected: type: object properties: status: type: string enum: - disconnected required: - status CloudDisconnectionStatusDisconnecting: type: object properties: status: type: string enum: - disconnecting required: - status CloudDisconnectionError: type: object properties: error: $ref: '#/components/schemas/CloudConnectionErrorLeafnodeRestartTimeout' required: - error MotionGroupInfo: required: - motion_group - name - dof type: object properties: motion_group: type: string description: | The unique identifier of the motion group. Use it to refer to the motion group in other calls. name: type: string description: | The name of the motion group for display purposes. dof: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | The number of joints aka degrees of freedom in the motion group. MotionGroupInfos: type: array items: $ref: '#/components/schemas/MotionGroupInfo' MotionGroupFromType: title: Motion Group from Model type: object required: - motion_group_model - motion_group properties: motion_group: type: string description: Unique identifier for the motion group to be added. motion_group_model: $ref: '#/components/schemas/MotionGroupModel' initial_joint_position: type: string description: | Initial joint position of the added motion group. Provides the joint position as a JSON array of float values in radians, where the array length must match the robot's degrees of freedom (DOF), e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted; if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. MotionGroupFromJson: title: Motion Group from JSON type: object required: - json_data - extracted_motion_group_id - motion_group properties: motion_group: type: string description: Unique identifier for the motion group to be added. json_data: type: string description: | Full JSON configuration of the virtual robot controller. This can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](#/operations/getVirtualControllerConfiguration). extracted_motion_group_id: type: string description: | The identifier of the motion group that needs to be extracted from the provided JSON configuration. initial_joint_position: type: string description: | Initial joint position of the added motion group. Provides the joint position as a JSON array of float values in radians, where the array length must match the robot's degrees of freedom (DOF), e.g., `"[0, 0, 0, 0, 0, 0]"` for a 6-DOF robot. If the provided array length does not match the robot's DOF, the array will be adjusted: if it is longer, extra values will be truncated; if it is shorter, missing values will be filled with zeros. AddVirtualControllerMotionGroupRequest: title: AddVirtualControllerMotionGroupRequest description: | Request body wrapper for `addVirtualControllerMotionGroup`. Allow callers to either reference a predefined motion group model or upload a full JSON configuration that the backend extracts into a motion group description. oneOf: - $ref: '#/components/schemas/MotionGroupFromType' - $ref: '#/components/schemas/MotionGroupFromJson' SafetyGeometrySphere: title: SafetyGeometrySphere type: object required: - center - radius properties: center: type: array items: type: number format: double minItems: 3 maxItems: 3 description: Center of the sphere as Vector3 [x, y, z] in [mm]. radius: type: number format: double description: Radius of the sphere in [mm]. description: | Sphere shape defined by a center point and a radius. SafetyGeometryCapsule: title: SafetyGeometryCapsule type: object required: - top - bottom - radius properties: top: type: array items: type: number format: double minItems: 3 maxItems: 3 description: Top endpoint of the capsule axis as Vector3 [x, y, z] in [mm]. bottom: type: array items: type: number format: double minItems: 3 maxItems: 3 description: Bottom endpoint of the capsule axis as Vector3 [x, y, z] in [mm]. radius: type: number format: double description: Radius of the capsule in [mm]. description: | Capsule shape defined by two axis endpoints and a radius. SafetyZonePose: title: SafetyZonePose type: object required: - x - 'y' - z - qx - qy - qz - qw properties: x: type: number format: double description: X position in [mm]. 'y': type: number format: double description: Y position in [mm]. z: type: number format: double description: Z position in [mm]. qx: type: number format: double description: Quaternion X component. qy: type: number format: double description: Quaternion Y component. qz: type: number format: double description: Quaternion Z component. qw: type: number format: double description: Quaternion W component. description: | Pose with position (x, y, z) in [mm] and orientation as quaternion (qx, qy, qz, qw). SafetyGeometryLozenge: title: SafetyGeometryLozenge type: object required: - center - x_dimension - y_dimension - radius properties: center: $ref: '#/components/schemas/SafetyZonePose' description: Center pose of the lozenge (position and quaternion orientation). x_dimension: type: number format: double description: Dimension in x-direction in [mm]. y_dimension: type: number format: double description: Dimension in y-direction in [mm]. radius: type: number format: double description: Corner radius in [mm]. description: | Lozenge shape defined by a center pose, two dimensions, and a corner radius. SafetyGeometryBox: title: SafetyGeometryBox type: object required: - center - neighbour properties: center: type: array items: type: number format: double minItems: 3 maxItems: 3 description: Center of the box as Vector3 [x, y, z] in [mm]. neighbour: type: array items: type: number format: double minItems: 9 maxItems: 9 description: | Three edge midpoint coordinates as a flattened array [x1, y1, z1, x2, y2, z2, x3, y3, z3] in [mm]. Each triplet represents the midpoint of one of the three orthogonal box edges originating from the center. Together, these points define an orthogonal basis that encodes the box’s orientation and size. The distance from the center to each midpoint equals half of the corresponding edge length. This representation supports arbitrary orientations, including left-handed coordinate systems used by robot controllers. description: | Box shape defined by a center point and three orthogonal edge midpoints. This representation matches the robot controller's internal format and the `Box` message in the virtual robot. Unlike a parametric size-and-pose box definition, this format can represent all box orientations produced by the robot controller, including left-handed coordinate systems. SafetyGeometryPrism: title: SafetyGeometryPrism type: object required: - point - top - bottom properties: point: type: array minItems: 6 items: type: number format: double description: | 2D points defining the base polygon as a flattened array [x1, y1, x2, y2, ...] in [mm]. Minimum 3 points required (6 values). Points should form a closed polygon in the XY plane. top: type: number format: double description: Top z-coordinate of the prism in [mm]. bottom: type: number format: double description: Bottom z-coordinate of the prism in [mm]. description: | Prism (extruded polygon) shape. The base polygon is defined by 2D points in the XY plane, and the prism extends along the Z axis between the bottom and top Z coordinates. SafetyGeometryPlane: title: SafetyGeometryPlane type: object required: - point properties: point: type: array minItems: 9 items: type: number format: double description: | Vertices defining a plane as a flattened array [x1, y1, z1, x2, y2, z2, x3, y3, z3, ...] in [mm]. Minimum 3 points required (9 values). Points define plane orientation and position; the plane is mathematically unbounded. description: | Mathematical half-space plane shape defined by its 3D vertices. A minimum of three coplanar points is required to define the plane's orientation. The plane extends infinitely in all directions parallel to the defined surface. For collision avoidance, planner implementations may approximate it using a large, thin box proxy. SafetyGeometry: title: SafetyGeometry type: object required: - id - inverted properties: id: type: string description: Unique identifier of this geometry. sphere: $ref: '#/components/schemas/SafetyGeometrySphere' capsule: $ref: '#/components/schemas/SafetyGeometryCapsule' lozenge: $ref: '#/components/schemas/SafetyGeometryLozenge' box: $ref: '#/components/schemas/SafetyGeometryBox' prism: $ref: '#/components/schemas/SafetyGeometryPrism' plane: $ref: '#/components/schemas/SafetyGeometryPlane' inverted: type: boolean description: If `true`, the geometry is inverted (outside is restricted, inside is safe). default: false description: | Geometric shape definition for a safety zone. Exactly one shape field (sphere, capsule, lozenge, box, prism, or plane) should be set. SafetyZone: title: SafetyZone type: object required: - id - name - geometry properties: id: type: integer format: int32 description: Unique identifier of the safety zone. name: type: string description: Name of the safety zone. priority: type: integer format: int32 description: Priority of the safety zone. default: 0 restricted: type: boolean description: If `true`, the zone is restricted and the robot cannot enter it. default: false geometry: $ref: '#/components/schemas/SafetyGeometry' description: The geometric shape of the safety zone. mg_uid: type: integer format: int32 description: | UID of the motion group this safety zone is attached to. Must match an existing motion group UID on the controller. uid_ref_cs: type: string description: | UID of the coordinate system in which the geometry coordinates are expressed. The coordinate system must be defined on the controller beforehand. If empty (""), the World coordinate system is used. active: type: boolean description: If `true`, the safety zone is active. default: true description: | Defines a safety zone with geometric boundaries and constraints. Safety zones are used to restrict robot motion or define protected areas. SafetyZones: title: SafetyZones type: object required: - safety_zones properties: safety_zones: type: array items: $ref: '#/components/schemas/SafetyZone' description: List of all safety zones. description: Response containing all safety zones. MotionGroupJoints: required: - positions type: object properties: positions: type: array items: type: number format: double description: | The joint positions of the motion group. velocities: type: array items: type: number format: double description: | The joint velocities of the motion group. accelerations: type: array items: type: number format: double description: | The joint accelerations of the motion group. torques: type: array items: type: number format: double description: | The joint torques of the motion group. description: |- Ensure to provide one value for each joint. See [getMotionGroups](#/operations/getMotionGroups) for the number of joints. Everything but positions is optional. FlangePayload: required: - name - mass type: object properties: name: type: string description: A readable name for the flange payload. mass: type: number description: Mass of payload in [kg]. format: double center_of_mass: $ref: '#/components/schemas/Vector3d' description: Center of mass of payload as a three-dimensional position vector [x, y, z] in [mm]. moment_of_inertia: $ref: '#/components/schemas/Vector3d' description: Principal moments of inertia of payload as three-dimensional vector [I_xx, I_yy, I_zz] in [kg·m²]. RobotTcpData: required: - position type: object properties: name: type: string description: A readable and changeable name for frontend visualization. position: $ref: '#/components/schemas/Vector3d' orientation: $ref: '#/components/schemas/Orientation' orientation_type: $ref: '#/components/schemas/OrientationType' payload: $ref: '#/components/schemas/FlangePayload' RobotTcp: allOf: - type: object required: - id properties: id: type: string description: Identifier of this tcp. - $ref: '#/components/schemas/RobotTcpData' RobotTcps: type: array items: $ref: '#/components/schemas/RobotTcp' example: - id: BASE/schmalz_gripper name: BASE/schmalz_gripper position: - 0 - 0 - 110 orientation: - 0 - 0 - 0 - 1 orientation_type: QUATERNION - id: WB_EGM/egm_tool name: WB_EGM/egm_tool position: - 400 - 250 - 0 orientation: - 1.57079632679 - 0 - 3.14159265359 orientation_type: ROTATION_VECTOR Flag: required: - active type: object properties: active: type: boolean OpMode: required: - mode type: object description: | Controllers have two operating modes: AUTOMATIC and MANUAL. MANUAL mode is mainly used for teaching a robot application. To ensure safe operation the velocity of the robot is limited to 250 mm/s. Running the finished application is done in AUTOMATIC operating mode without the limited velocity of the MANUAL mode. properties: mode: $ref: '#/components/schemas/OperationMode' CycleTime: required: - cycle_time_ms type: object properties: cycle_time_ms: type: integer description: Cycle time of controller communication in [ms]. format: int64 minimum: 0 maximum: 4294967295 Behavior: enum: - BEHAVIOR_AUTOMATIC - BEHAVIOR_AUTOMATIC_NOT_COMPLY_WITH_CYCLETIME - BEHAVIOR_EXTERNAL_SOURCE description: | ## BEHAVIOR_AUTOMATIC This is the default behavior. The motion groups of the controller take commanded joint configuration as actual joint state. Configures the compliance of the virtual robot with the normal ControllerState cycle time. If set, the virtual robot will act like a physical one, e.g., with a cycle time of 8ms to respond to a new joint state command. ## BEHAVIOR_AUTOMATIC_NOT_COMPLY_WITH_CYCLETIME Configures the compliance of the virtual robot with the normal ControllerState cycle time. If set, the robot will respond as fast as possible, limited only by software execution speed. Because of that, the execution of a movement requires less time than with BEHAVIOR_AUTOMATIC. ## BEHAVIOR_EXTERNAL_SOURCE The external client is the only source of actual joint state changes. This mode is used to enable third party software indicating the current joint state via [externalJointsStream](#/operations/externalJointsStream). type: string format: enum ExternalJointStreamDatapoint: required: - motion_group - value type: object properties: motion_group: type: string description: | The unique identifier of the motion group. value: $ref: '#/components/schemas/MotionGroupJoints' description: A datapoint inside external joint stream. ExternalJointStreamDatapoints: type: array items: $ref: '#/components/schemas/ExternalJointStreamDatapoint' ExternalJointStreamRequest: type: object required: - states properties: states: $ref: '#/components/schemas/ExternalJointStreamDatapoints' Key: title: Key description: | Unique identifier describing to adress an object. Special characters, such as `;`, `/`, `?`, `:`, `@`, `=` and `&`, have to be URL encoded. type: string MetadataObject: description: A metadata object. type: object additionalProperties: type: string example: alias: Some Other Name is_hidden: false BinaryObject: description: Any value encoded as a binary string. format: binary title: BinaryObject type: string BusIODescription: required: - io - name - direction - value_type type: object properties: io: type: string description: | Unique identifier of the input/output. name: type: string description: | Name of the input/output. Customize it using the respective BUS service, e.g., [addProfinetIO](#/operations/addProfinetIO) for PROFINET service. direction: $ref: '#/components/schemas/IODirection' value_type: $ref: '#/components/schemas/IOValueType' unit: $ref: '#/components/schemas/UnitType' min: $ref: '#/components/schemas/IOBoundary' max: $ref: '#/components/schemas/IOBoundary' ListBusIODescriptionsResponse: type: array items: $ref: '#/components/schemas/BusIODescription' BusIOsStateEnum: enum: - BUS_IOS_STATE_UNKNOWN - BUS_IOS_STATE_INITIALIZING - BUS_IOS_STATE_CONNECTED - BUS_IOS_STATE_DISCONNECTED type: string format: enum description: | Current state of the BUS input/output service. BusIOsState: type: object required: - state properties: state: $ref: '#/components/schemas/BusIOsStateEnum' message: type: string description: | A message providing additional information on the input/output service, e.g., BUS service status, encountered errors. May be empty if no additional information is available. ProfinetSubSlotDescription: type: object required: - number - input_length - output_length properties: number: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | The number/index of the PROFINET subslot. input_length: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | The amount of bytes allocated for the subslot in the input process image buffer. output_length: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | The amount of bytes allocated for the subslot in the output process image buffer. ProfinetSlotDescription: type: object description: | An array of PROFINET slots. PROFINET models each device’s input/output hardware as a hierarchy of slots (modules) and subslots (submodules). A slot can represent a physical or virtual input/output card and each subslot one of its individual channels or functions. Every slot and subslot has unique identifiers that the controller uses to map cyclic input/output data and parameter records to its process image. This slot/subslot separation enables e.g., addressing each input/output stream when establishing input/output application relations (I/O-AR). required: - number - api - subslots properties: number: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | The number/index of the PROFINET slot. Per default, slot 0 is reserved for the device access point (DAP). Slots that are part of the cyclic input/output data exchange start at number 1. api: type: integer format: int32 minimum: 0 maximum: 2147483647 description: | The application process identifier (API) number of the PROFINET input. The API identifies the application relation (AR) that is using the slot. subslots: type: array items: $ref: '#/components/schemas/ProfinetSubSlotDescription' description: | An array of PROFINET subslots. ProfinetDescription: type: object required: - vendor_id - device_id properties: vendor_id: type: string description: | The vendor identifier of the PROFINET device, identifying the manufacturer. device_id: type: string description: | The device identifier of the PROFINET device, identifying the specific device within the vendor's range. slots: type: array items: $ref: '#/components/schemas/ProfinetSlotDescription' device_name: type: string description: | Name of Station (NoS) of the PROFINET device. The NoS is used in combination with IPv4 record to identify your device in the PROFINET network. The `device_name` will be used as NoS if no REMA XML file is already present on your NOVA instance and no `rema_xml_content` is provided. example: pnDevice ip_config: $ref: '#/components/schemas/BusIOProfinetIpConfig' ProfinetIOTypeEnum: enum: - PROFINET_IO_TYPE_UNKNOWN - PROFINET_IO_TYPE_BOOL - PROFINET_IO_TYPE_USINT - PROFINET_IO_TYPE_SINT - PROFINET_IO_TYPE_UINT - PROFINET_IO_TYPE_INT - PROFINET_IO_TYPE_UDINT - PROFINET_IO_TYPE_DINT - PROFINET_IO_TYPE_REAL - PROFINET_IO_TYPE_LREAL type: string format: enum description: | Value type of the PROFINET input/output variable. Is used to interpret the corresponding bits correctly. ProfinetIODirection: enum: - PROFINET_IO_DIRECTION_INPUT - PROFINET_IO_DIRECTION_OUTPUT - PROFINET_IO_DIRECTION_INOUT type: string description: The direction of the input/output variable, indicating whether it is an input or output for the PROFINET device, e.g., NOVA's PROFINET service. format: enum ProfinetIOData: type: object required: - description - type - direction - byte_address properties: description: type: string description: | Descriptive name or note for the input/output variable. type: $ref: '#/components/schemas/ProfinetIOTypeEnum' direction: $ref: '#/components/schemas/ProfinetIODirection' description: | The direction of the input/output variable, indicating whether it is an input or output for the PROFINET device, e.g., NOVA's PROFINET service. byte_address: type: integer format: int32 minimum: 0 maximum: 65535 description: | The byte address in the PROFINET device's process image, with offset 0. The slot is automatically determined based on this address and the configured slot layout. For example, with two slots of 64 bytes each: - Bytes 0-63: Slot 1 - Bytes 64-127: Slot 2 When importing from a tag table, e.g., TIA Portal, use `input_offset`/`output_offset` to convert global PLC addresses to device-local addresses: `device_byte_address` = `plc_byte_address` - offset example: 68 bit_address: type: integer format: int32 minimum: 0 maximum: 7 description: | The bit offset within the byte specified by `byte_address`. Only relevant for boolean/bit-type variables. Valid values are 0-7 (8 bits per byte). For byte/word/dword types, this field is typically omitted or set to 0. ProfinetIO: allOf: - type: object required: - io properties: io: type: string description: | The unique identifier for the input/output value. This identifier is used to reference the specific input/output variable in the PROFINET device, e.g., NOVA's PROFINET service. - $ref: '#/components/schemas/ProfinetIOData' ProfinetIOs: type: array items: $ref: '#/components/schemas/ProfinetIO' description: Array of PROFINET input/output variable configurations. ProfinetInputOutputConfig: type: object required: - config - input_offset - output_offset properties: config: type: string description: | Content of the input/output variable configuration XML file. The XML File has to be embedded as a string by escaping quotes, line breaks and so forth. example: | \n bLightRed\n nCounter\n input_offset: type: integer format: int32 default: 0 minimum: 0 maximum: 2147483647 description: Offset in bytes for the address of the input (perspective of the controller) variables. The offset will be subtracted from to the byte addresses of the sent XML content. example: 100 output_offset: type: integer format: int32 default: 0 minimum: 0 maximum: 2147483647 description: Offset in bytes for the address of the output (perspective of the controller) variables. The offset will be subtracted from to the byte addresses of the sent XML content. example: 800 ModbusIOTypeEnum: enum: - MODBUS_IO_TYPE_UNKNOWN - MODBUS_IO_TYPE_BOOL - MODBUS_IO_TYPE_UINT16 - MODBUS_IO_TYPE_FLOAT32 type: string format: enum description: | Value type of the MODBUS input/output variable. Used to interpret the corresponding bits correctly. ModbusIOByteOrder: enum: - MODBUS_IO_BYTE_ORDER_UNKNOWN - MODBUS_IO_BYTE_ORDER_ABCD - MODBUS_IO_BYTE_ORDER_BADC - MODBUS_IO_BYTE_ORDER_CDAB - MODBUS_IO_BYTE_ORDER_DCBA type: string format: enum description: | Byte order of the MODBUS input/output variable. Used to interpret the corresponding bits correctly. ModbusIOArea: enum: - MODBUS_IO_AREA_UNKNOWN - MODBUS_IO_AREA_COILS - MODBUS_IO_AREA_DISCRETE_INPUTS - MODBUS_IO_AREA_HOLDING_REGISTERS - MODBUS_IO_AREA_INPUT_REGISTERS type: string format: enum description: | Area of the MODBUS input/output variable. Is used to interpret the corresponding bits correctly. ModbusIOData: type: object required: - description - address - type - byte_order - area properties: description: type: string description: | Descriptive name or note for the input/output variable. address: type: integer format: int32 minimum: 0 maximum: 65535 description: | The byte address of the input/output variable in the MODBUS device, e.g., NOVA's MODBUS service. Used to locate the input/output variable within the device's memory or data structure. type: $ref: '#/components/schemas/ModbusIOTypeEnum' byte_order: $ref: '#/components/schemas/ModbusIOByteOrder' description: | The byte sequence of the input/output variable, indicating the order of bytes in memory for the MODBUS device, e.g., NOVA's MODBUS service. area: $ref: '#/components/schemas/ModbusIOArea' description: | The area of the input/output variable, indicating the memory region it belongs to for the MODBUS device, e.g., NOVA's MODBUS service. ModbusIO: allOf: - type: object required: - io properties: io: type: string description: | The unique identifier for the input/output value. Used to reference the input/output variable in the MODBUS device, e.g., NOVA's MODBUS service. - $ref: '#/components/schemas/ModbusIOData' ModbusIOs: type: array items: $ref: '#/components/schemas/ModbusIO' description: Array of MODBUS input/output variable configurations. Snap7IOArea: enum: - SNAP7_IO_AREA_UNKNOWN - SNAP7_IO_AREA_PROCESS_INPUTS - SNAP7_IO_AREA_PROCESS_OUTPUTS - SNAP7_IO_AREA_MERKERS - SNAP7_IO_AREA_DATA_BLOCK type: string format: enum description: | PLC memory area of the Snap7 input/output variable. Snap7IOTypeEnum: enum: - SNAP7_IO_TYPE_UNKNOWN - SNAP7_IO_TYPE_BOOL - SNAP7_IO_TYPE_BYTE - SNAP7_IO_TYPE_WORD - SNAP7_IO_TYPE_DWORD - SNAP7_IO_TYPE_INT - SNAP7_IO_TYPE_DINT - SNAP7_IO_TYPE_REAL type: string format: enum description: | PLC data type of the Snap7 input/output variable. Used to interpret the corresponding PLC memory correctly. Snap7IODirection: enum: - SNAP7_IO_DIRECTION_UNKNOWN - SNAP7_IO_DIRECTION_INPUT - SNAP7_IO_DIRECTION_OUTPUT type: string format: enum description: | Direction of the Snap7 input/output variable from the perspective of this service. Snap7IOData: type: object required: - description - area - byte_address - type - direction properties: description: type: string description: | Descriptive name or note for the input/output variable. area: $ref: '#/components/schemas/Snap7IOArea' description: | PLC memory area the variable resides in. db_number: type: integer format: int32 minimum: 1 description: | Data block number. Only required when `area` is `SNAP7_IO_AREA_DATA_BLOCK`. byte_address: type: integer format: int32 minimum: 0 description: | Byte offset within the selected PLC memory area or data block. bit_address: type: integer format: int32 minimum: 0 maximum: 7 description: | Bit offset within the byte. Only relevant for `SNAP7_IO_TYPE_BOOL`. type: $ref: '#/components/schemas/Snap7IOTypeEnum' direction: $ref: '#/components/schemas/Snap7IODirection' Snap7IO: allOf: - type: object required: - io properties: io: type: string description: | Unique identifier for the input/output variable as used by this service. - $ref: '#/components/schemas/Snap7IOData' Snap7IOs: type: array items: $ref: '#/components/schemas/Snap7IO' description: Array of Snap7 input/output variable configurations. ApiVersion: type: object required: - version properties: version: type: string description: The version of the API. parameters: Timeout: name: completion_timeout in: query schema: type: integer minimum: 1 description: | The maximum time (**in seconds**) spent waiting until the operation is complete. If the parameter is set, the request will wait for completion until the specified time is up. For POST and PUT requests completion means that all resources are running and usable. For DELETE completion means that the deletion process is completed. x-go-name: CompletionTimeout Cell: name: cell in: path description: | Unique identifier addressing a cell in all API calls. required: true schema: type: string default: cell x-go-name: CellID Controller: name: controller in: path description: Unique identifier to address a controller in the cell. required: true schema: type: string x-go-name: ControllerID App: name: app in: path required: true schema: type: string description: | The name of the provided application. The name must be unique within the cell and is used as a identifier for addressing the application in all API calls, e.g., when updating the application. x-go-name: AppID Metadata: name: metadata in: query style: form explode: false description: Additional metadata to add to the backup schema: $ref: '#/components/schemas/Metadata' MotionGroupModelParameter: name: motion-group-model in: path description: | Unique identifier for the model of a motion group, e.g., `UniversalRobots_UR10e`. Get the `model` of a configured motion group with [getOptimizerConfiguration](#/operations/getOptimizerConfiguration). required: true schema: type: string CoordinateSystem: name: coordinate-system in: path description: Unique identifier addressing a coordinate system. required: true schema: type: string x-go-name: CoordinateSystemID MotionGroup: name: motion-group in: path description: The motion-group identifier. required: true schema: type: string x-go-name: MotionGroupID ResponseRate: name: response_rate in: query schema: type: integer format: int32 minimum: 0 maximum: 2147483647 description: |- Update rate for the response message in milliseconds (ms). Default is 200 ms. We recommend to use the step rate of the controller or a multiple of the step rate as NOVA updates the state in the controller's step rate as well. Minimal response rate is the step rate of controller. ResponseCoordinateSystem: name: response_coordinate_system in: query schema: type: string description: | Unique identifier addressing a coordinate system to which the cartesian data of the responses should be converted. Default is the world coordinate system. Trajectory: name: trajectory in: path description: | This represents the unique identifier of a trajectory. Every executable or partially executable trajectory is cached and an unique identifier is returned. Indicate the unique identifier to execute the trajectory or retrieve information on the trajectory. required: true schema: type: string Program: name: program in: path required: true x-go-name: ProgramId schema: title: Program Name description: The program identifier in the format `app.program` type: string example: app.my_program pattern: ^[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+$ minLength: 1 maxLength: 255 Tcp: name: tcp in: path description: The unique identifier of a TCP. required: true schema: type: string example: TRobUtility/current_tool Key: name: key in: path required: true explode: false style: simple schema: $ref: '#/components/schemas/Key' x-go-name: ObjectKey MetadataHeader: name: X-Metadata in: header required: false explode: false schema: $ref: '#/components/schemas/MetadataObject' Collider: name: collider in: path description: Unique identifier addressing a collider. required: true schema: type: string x-go-name: ColliderID LinkChain: name: link-chain in: path description: Unique identifier addressing a collision link chain. required: true schema: type: string x-go-name: LinkChainID Tool: name: tool in: path description: Unique identifier addressing a collision tool. required: true schema: type: string x-go-name: ToolID Setup: name: setup in: path required: true schema: type: string description: Identifier of the collision setup IO: name: io in: path description: Unique identifier to address an Input/Output in the cell. required: true schema: type: string x-go-name: IOID examples: DefaultCell: summary: A cell with the default configured Foundation Services value: name: cell AbbController: value: name: abb-robot configuration: kind: AbbController controller_ip: 192.168.125.1 controller_port: 80 egm_server: ip: 192.168.125.100 port: 32112 FanucController: value: name: fanuc-robot configuration: kind: FanucController controller_ip: 192.168.100.1 KukaController: value: name: kuka-robot configuration: kind: KukaController controller_ip: 192.168.1.29 controller_port: 54600 rsi_server: ip: 0.0.0.0 port: 30152 UrController: value: name: ur-robot configuration: kind: UniversalrobotsController controller_ip: 192.168.1.1 VirtualController: value: name: virtual-robot configuration: kind: VirtualController manufacturer: universalrobots type: universalrobots-ur5e initial_joint_position: '' YaskawaController: value: name: yaskawa-robot configuration: kind: YaskawaController controller_ip: 192.168.255.1 AppSwaggerUI: summary: SwaggerUI App example value: name: swagger-ui app_icon: favicon-32x32.png container_image: image: docker.io/swaggerapi/swagger-ui environment: - name: BASE_URL value: /swagger-ui ProfinetClientService: value: bus_type: profinet plc_ip: 192.168.1.100 mac: '00:11:22:33:44:55' network_config: device_name: pnDevice ProfinetVirtualService: value: bus_type: profinet_virtual ModbusServerService: value: bus_type: modbus_server network: network_type: tcp port: 30502 connections: 2 coils_size: 10 discrete_inputs_size: 10 holding_registers_size: 10 input_registers_size: 10 ModbusClientService: value: bus_type: modbus_client network: network_type: tcp ip: 192.168.3.100 port: 30501 ModbusVirtualService: value: bus_type: modbus_virtual Snap7Service: value: bus_type: snap7 address: 192.168.1.100 rack: 0 slot: 1 CellDefault: value: - id: /cells/default name: default children: - id: /cells/default/controllers/yaskawa-gp7 name: yaskawa-gp7 - id: /cells/default/apps/my-app name: my-app PlanTrajectoryRequest_UR5e_Line: value: motion_group_setup: motion_group_model: UniversalRobots_UR5e cycle_time: 8 mounting: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 tcp_offset: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 global_limits: joints: - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 - position: lower_limit: -2.8623399732707004 upper_limit: 2.8623399732707004 velocity: 3.14 acceleration: 40 - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 start_joint_position: - 1.169 - -1.57 - 1.36 - 1.029 - 1.289 - 1.279 motion_commands: - path: target_pose: position: - 400 - 0 - 100 orientation: - 0 - 0 - 0 path_definition_name: PathLine limits_override: tcp_velocity_limit: 200 PlanCollisionFreeRequest_UR5e_Simple: value: motion_group_setup: motion_group_model: UniversalRobots_UR5e cycle_time: 8 global_limits: joints: - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 tcp: velocity: 300 collision_setups: default: colliders: annoying_obstacle: shape: shape_type: sphere radius: 100 pose: position: - 400 - -400 - 400 margin: 0 link_chain: - link_0_sphere: shape: shape_type: sphere radius: 100 pose: position: - 0 - 0 - -10 link_0_capsule: shape: shape_type: capsule radius: 50 cylinder_height: 20 - {} - link_2_sphere: shape: shape_type: sphere radius: 100 - {} - {} - link_5_sphere: shape: shape_type: sphere radius: 100 self_collision_detection: true start_joint_position: - 1.169 - -1.57 - 1.36 - 1.029 - 1.289 - 1.279 target: - 2.86521247 - -0.85477865 - 2.39700269 - 3.17016494 - 1.57079633 - -1.29441614 algorithm: algorithm_name: MidpointInsertionAlgorithm max_iterations: 1000 PlanCollisionFreeRequest_UR10e_Complex: value: motion_group_setup: motion_group_model: UniversalRobots_UR10e cycle_time: 8 mounting: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 tcp_offset: position: - 0 - 0 - 100 orientation: - 0 - 0 - 0 global_limits: joints: - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 tcp: velocity: 300 collision_setups: default: colliders: annoying_obstacle: shape: shape_type: box size_x: 400 size_y: 50 size_z: 100 box_type: FULL pose: position: - 500 - 0 - -250 margin: 0 base: shape: shape_type: cylinder radius: 200 height: 300 pose: position: - 0 - 0 - -300 margin: 0 floor: shape: shape_type: box size_x: 2000 size_y: 2000 size_z: 10 box_type: FULL pose: position: - 0 - 0 - -550 margin: 0 link_chain: - link_0_compound_convexHull: shape: shape_type: convex_hull vertices: - - 56.38827227077839 - 49.10684638328093 - 99.20429438352585 - - 91.81896681711423 - -16.771828400911453 - 22.3514987410473 - - 54.53735054247006 - 77.62744500845461 - 0.05855427502689248 - - -59.66566891395459 - 73.84710741016391 - 0.059186014080281346 - - -43.170050354058795 - -61.10288334529101 - 99.2043378009488 - - 11.699891337372666 - -94.12819662016197 - 0.05860819339107565 - - -11.461974912494453 - 73.93905447360368 - 99.14657312530356 - - 88.24518008515422 - 32.650576992238136 - 20.628508273680055 - - 60.986030927863894 - -43.28880418148677 - 99.20433163642883 - - 92.16440672570201 - -22.390336485437167 - 0.10236673578890854 - - -81.07480003673209 - -49.12690107161393 - 0.00137543488314823 - - 20.62727860069093 - 71.93860546659451 - 99.11235772863627 - - -11.411194938818557 - 93.7783286022478 - 15.134138762722364 - - -53.77230386138555 - 52.01117323669192 - 99.20429438352585 - - 73.93975511075192 - 11.636810109313702 - 99.1970215873067 - - 66.75571409011314 - 64.90732284192217 - 24.58604253656592 - - 11.707645905796948 - -73.90241196918333 - 99.1420714151646 - - 86.70477160188445 - 38.34067501342202 - 0.027568493573354447 - - 61.67356398058195 - -71.85053871135106 - 16.870326452255988 - - 94.14734534239162 - 11.65292671820115 - 0.11816170432611683 - - -41.91118458354338 - -84.42620483528339 - 18.722188391737625 - - 11.723005095299126 - 73.85818996803883 - 99.20427948236465 - - -13.254341009434876 - 93.91527496725296 - 0.14046855674716696 - - -43.44921559095383 - 82.78557658195496 - 24.139175191521648 - - 27.608110768010622 - 90.0492993269122 - 18.67596563820628 - - -73.63406469193744 - -13.262757437021122 - 99.20431789448139 - - 70.27427646196644 - 25.777562061373654 - 99.1776801598409 - - 71.95946057826048 - -20.363261627746876 - 99.20431915215657 - - 77.2925240842348 - 52.49962010127847 - 24.255513432235865 - - 38.138089616330724 - 64.44568083632768 - 99.09962507131587 - - 20.569083680581056 - -71.89711857530371 - 99.20433908700943 - - 77.66607396476127 - -54.4973277932878 - 0.05859575079979196 - - 94.15334950541313 - -10.017663286394086 - 15.490382708152131 - - 90.23446863774923 - 29.657103976551955 - 6.344800489744971 - - 94.10877010548361 - -11.672506509106281 - 0.05858230870874753 - - -34.678228881519594 - -88.2498846903852 - 0.02346915672341021 - - -70.14565468623236 - -61.2642895326637 - 25.00412784446542 - - -13.263927860873087 - -73.63851291198232 - 99.20433805445263 - - -20.33627398326411 - 71.96005815578168 - 99.20427948236465 - - -2.3351790019313095 - 93.60758651825437 - 22.332015362833236 - - 13.461051978576965 - 93.95365331794734 - 0.05086115924667067 - - -63.177174180454735 - 70.0507976900071 - 18.811783085210575 - - -29.46288852345959 - 90.22665545949177 - 0.18408667096642822 - - 45.56914965368784 - 82.7078731284794 - 18.763782965668128 - - 22.703168874717456 - 90.11972351157353 - 25.56642500096593 - - 72.02890358600823 - 20.386050655691786 - 99.176791831316 - - 86.67571118152541 - -34.60800100531924 - 24.23444573583457 - - 81.0359272347894 - 49.14026245852543 - 11.813785645514274 - - 79.360509683957 - 48.83938455548662 - 24.974887561953572 - - 43.33636026261716 - 60.976964600760205 - 99.20428842396869 - - 43.409883975982666 - -61.000101268291466 - 99.20433908700943 - - 22.451519522702984 - -92.05664971117845 - 16.98634841911579 - - 49.17121291642734 - -81.07279700131953 - 0.10645699969873829 - - 91.93806697631932 - -20.416122443738583 - 16.98600151059508 - - 73.96945601530642 - -11.564037665055778 - 99.15791672651875 - - 93.88495215266305 - 11.388283533235107 - 17.022983454545866 - - 90.29172327982874 - 29.39992636683794 - 0.17860174411122448 - - 92.11897463349372 - 22.360723223256763 - 0.058571625346365286 - - -59.65154902338887 - -73.84062644782765 - 0.0586018222783688 - - -7.798265466047937 - -93.72421213770562 - 18.795815865042 - - -54.18648943660606 - -75.58158541223423 - 25.19903574951483 - - -87.97955218656797 - -33.19011304860468 - 20.631183441725515 - - -64.41842957111463 - -38.08956123884809 - 99.12003228600283 - - -30.799486504320754 - -68.1538260462593 - 99.20433908700943 margin: 1 - link_1_compound_convexHull: shape: shape_type: convex_hull vertices: - - 54.37229484972766 - 84.61314332722765 - -30.993279888156923 - - 72.74231980425552 - 16.930159245686447 - 94.23885046563719 - - 69.48523113949189 - -81.40001251362189 - -27.318010360498555 - - -56.75563065832366 - -81.40001780986783 - -48.781234727133025 - - -63.68454978381185 - 86.8099849635954 - 33.558413948265745 - - -12.692985007608007 - -73.75189261613725 - 94.19541438080272 - - 12.081688868899828 - 29.664824227482132 - -75.24446479410726 - - 74.52490831689661 - 55.00120263962714 - -13.98952241618953 - - 28.146811062572702 - 93.10406603076312 - 64.23647957414391 - - 59.4636285047389 - -45.3596176622245 - 94.00969482981327 - - -15.886517779573978 - -81.39998055696488 - 73.26579199186594 - - -73.67899196840031 - -12.624265154619103 - 94.23886380092094 - - 12.130261743516938 - -81.40002526044843 - -73.72508774203074 - - -40.64754447650306 - 79.83526605342168 - -51.87063488964463 - - 74.75939507029871 - -53.53547346793887 - 5.530533374480235 - - 51.454842737419405 - 41.08027846873664 - -55.04592890544584 - - 67.65598742461151 - 85.5669149980069 - 24.051935299064166 - - 56.008604684812425 - -81.39998800754547 - 49.809368242151514 - - 62.98418343067169 - -40.47745056152345 - 94.23887729644774 - - -75.41551815440091 - 53.370289811601054 - -11.272470706731355 - - -65.23294746752353 - -81.39998833588594 - 36.86873771819061 - - -40.53664999654785 - 62.944103173363466 - 94.23708751820476 - - -30.508040280969148 - -81.40002526044843 - -68.5143290374334 - - 15.341985774741625 - 71.78747767255977 - -68.5079624022116 - - -56.49975441490514 - 86.29642315390595 - -19.333269238260524 - - 74.76495592611217 - 2.0808646379522107 - 94.21098644604916 - - 72.8658973735792 - -81.40000684721548 - -15.94688581101967 - - 61.03945934222921 - 75.82971621628975 - -36.82541074173625 - - 64.52870136929714 - 45.14516485112163 - -40.20465624054712 - - 36.61651478694124 - 33.345159285342945 - -66.95293116000363 - - 60.79429082075865 - 89.70486280446784 - 19.187556860096795 - - 56.14146290552683 - 49.54072154890799 - 94.1891683156922 - - 74.3541870257659 - 64.78872900525758 - 15.277867636271901 - - 30.175912182436736 - -68.5158332608732 - 94.13721051592726 - - 16.77736214100121 - -81.39998055696488 - 72.97633930124537 - - -20.97808926636041 - -71.86612295437862 - 94.23670047262009 - - 64.54567517051046 - -81.39998800754547 - 38.059097907885324 - - -73.82621798394293 - 11.94754371506324 - 94.23885402215363 - - -60.20839874510507 - 40.52784980153289 - -46.92034265937025 - - -73.58306539056277 - -81.40000520811293 - -12.572876579714007 - - -28.074970236503056 - 93.17633497399787 - 64.16680348633936 - - -12.826132387771954 - -81.40002526044843 - -73.65194860905092 - - -29.392851986412996 - 34.82230853649004 - -70.28810748357606 - - 3.8063385484074166 - 81.16763648821099 - -61.02114971130133 - - -70.22737597729711 - 81.73994057052806 - -9.160572793671502 - - 74.62354925293067 - 63.211901021931794 - 5.983206174165373 - - 72.81661009079991 - 49.796086842403476 - -22.601247993828597 - - 74.74399025190212 - -53.54073446084445 - -4.455150328982687 - - 72.99374991592236 - -81.39999926240749 - 15.345324692813286 - - 67.72865550971555 - 83.37191664916594 - -12.370763595463727 - - 41.447999662417494 - 76.5319723513497 - -54.925200144436154 - - 57.89880903165377 - -81.40001780986783 - -47.20778456651658 - - 55.902075695807596 - 70.67345064089137 - -45.063397155060606 - - 30.29901629958476 - -81.40002526044843 - -68.582950008069 - - 25.311625938873934 - 33.730826006505296 - -71.83195489601786 - - 50.0540070678931 - 91.37808349449766 - 47.677121099171885 - - 0.4693661998806197 - 83.03588001956054 - -56.325982683927336 - - 67.84932002753429 - 31.598157627370774 - 94.23064356421906 - - 16.91451080413365 - 72.90606553728854 - 94.15951898969337 - - 71.00158307716768 - 82.83174254530996 - 13.75608002937422 - - 74.77136086070777 - 3.7845249060934028 - 93.08924546707104 - - 46.46120815712717 - -58.63297368712883 - 94.18516667065335 - - 2.000075925245588 - -81.39998055696488 - 74.78975620687655 - - 13.648378037738416 - -73.58525290122121 - 94.17503195217652 margin: 1 - link_2_compound_convexHull_0: shape: shape_type: convex_hull vertices: - - 633.3170124782349 - 71.59973077276247 - 94.59997713565828 - - 684.5549538880651 - 5.79133558376336 - 236.12422187819095 - - 658.1962324425898 - -59.162265841632866 - 94.59996223449706 - - 516.3576448673398 - -72.48599555157381 - 158.42940047702717 - - 469.348602114183 - 42.675390256900165 - 210.28790035385282 - - 618.8582792823836 - -71.84648302836749 - 254.7436729345781 - - 469.34859816671695 - -6.629573044160848 - 121.40094942600535 - - 685.4363695629456 - 18.170837841250695 - 94.59997713565826 - - 625.0066304016142 - 69.90501763724765 - 254.26809683225252 - - 670.4194767928662 - -44.26704068331676 - 236.08076701560964 - - 632.9906713689086 - -71.68019624468602 - 94.59995478391646 - - 469.3485988019806 - -37.805801777084234 - 215.45047642982877 - - 469.3486013089047 - 49.69472871298105 - 153.06301894483553 - - 678.1821991920472 - 38.98451142311092 - 211.46126091480255 - - 667.1428566953208 - -25.712936717874328 - 257.4298465379794 - - 652.4764389497301 - -64.89125139643252 - 216.32905480357485 - - 684.9707107151355 - -19.398695774821213 - 94.59996968507767 - - 593.7597725550277 - -72.01305656938385 - 94.59994733333586 - - 516.3576375365258 - -71.10924949067135 - 197.39583644764332 - - 469.3485966263832 - -49.87144388178175 - 153.52864003934522 - - 543.0758084473393 - 18.437744870327887 - 267.48928872609315 - - 574.1277203183859 - 63.840249644948905 - 94.59996411121229 - - 516.3575928330422 - 70.93255343158815 - 197.86146386345447 - - 652.3954025147209 - 63.25077131629741 - 94.59997713565828 - - 664.2061977477059 - 43.55014663386143 - 253.3943026380232 - - 684.7455295496566 - 24.656900706549077 - 205.29599430630796 - - 677.7459798862171 - -26.6993141340601 - 247.16783721242902 - - 650.5131344914437 - -59.15632433891301 - 252.8175711631775 - - 677.231600135312 - -39.64981581139477 - 211.86807704011525 - - 639.4152073866896 - -71.49231328047088 - 222.63809245070863 - - 600.3223421906207 - -71.37418031426998 - 255.9318815185916 - - 469.34859764362 - -50.18119181245659 - 197.65452207964063 - - 516.3576447114663 - -65.694192142935 - 140.77488059717894 - - 469.3485967998862 - -37.34210298465777 - 136.13861015855974 - - 579.1470942774798 - 61.130565623167115 - 264.007952112342 - - 469.3486011545749 - 11.8673661599311 - 229.3079036871486 - - 469.3486003496348 - 36.555169656338535 - 135.44157072367113 - - 542.997760683211 - -26.17125578502594 - 94.59994733333588 - - 469.3486020069933 - 50.0044808483825 - 198.12013497512677 - - 516.3576002836228 - 70.62281264521425 - 153.32170219643945 - - 637.8516283261077 - 71.38720834900624 - 226.31654285427916 - - 677.5724723911076 - 37.080549489967304 - 94.59997713565828 - - 676.8130581498147 - 30.03484420776363 - 246.61551415920258 - - 663.3598716639929 - -51.21183762925682 - 243.0930486639869 - - 663.7554717371637 - -46.27798394295854 - 251.62284701579074 - - 632.0029778026518 - -65.70006903602574 - 257.9163379970797 - - 671.2237316613997 - -46.27831331125923 - 94.59996396490149 - - 676.9677493809969 - -32.18523374709213 - 242.61002368582461 - - 684.2899858415135 - -26.36730610578569 - 207.07278852393958 - - 637.4719583190141 - -71.66883974912624 - 226.26419251971816 - - 645.2924587166975 - -64.13166195705361 - 248.5507958753538 - - 565.7929513275624 - -53.46042997837071 - 264.9892568588257 - - 574.7056343413626 - -64.14357709758387 - 94.59994733333586 - - 592.9675007658899 - 70.32949718355994 - 255.99564301701457 - - 632.3773538374068 - 65.5718408135624 - 257.87397872744043 - - 591.3081314075124 - 60.18972059803238 - 264.89607345381086 - - 555.1437691461649 - 43.09088983292568 - 265.7215166442455 - - 469.3485988886904 - 11.650289449175064 - 122.63848116052549 - - 469.3486007518119 - 42.23863485920566 - 141.07924736076163 - - 512.6865918931477 - 71.21391409367821 - 178.24559874234066 - - 574.3690162523809 - 61.65694461944287 - 261.1011648661945 - - 586.6426040581946 - 70.25881669755792 - 94.59996968507768 - - 638.5119866602394 - 70.32699846040819 - 143.09154799567372 - - 650.6825583344623 - 63.2867583037519 - 228.83304047941562 margin: 1 - link_2_compound_convexHull_1: shape: shape_type: convex_hull vertices: - - 76.92195434570317 - 56.29356351878979 - 165.67906516404648 - - 87.56933637457018 - 31.022420396991755 - 221.3799784188908 - - 87.56933128154469 - -37.3421740557084 - 136.13852993595555 - - -24.461236312061942 - -52.187333879831414 - 112.59985715150832 - - -42.33370761871333 - 36.68697588443752 - 224.03007745742798 - - 13.52388275998328 - 55.96675133411202 - 112.59987950325014 - - 87.56933550854728 - 42.238590773158194 - 141.07928800957998 - - 7.933800253351137 - 55.544048368201494 - 234.746551799982 - - -10.615752108660104 - -51.85108722853973 - 235.89793431403132 - - 51.4375305106654 - -26.740316004065644 - 112.59987217450966 - - -56.44296932693942 - 12.823164410243809 - 112.59986460208893 - - 87.5693374527682 - 48.367436253476555 - 202.0413294575401 - - 87.56933552473902 - 49.694656430715405 - 153.06303766752976 - - -18.482300299859048 - 56.81910694035828 - 202.553624742633 - - 87.5693325269716 - -43.12874051346446 - 209.63139901073853 - - -30.676091886420636 - 38.507715004868125 - 234.96039216887954 - - 49.801773005405494 - -24.905396866719027 - 245.78811018961784 - - 26.231166076010595 - -51.25837970286318 - 112.59986460208891 - - 87.56933344584274 - 11.65029859655789 - 122.63845369509998 - - -55.19256032097485 - -13.16412345243875 - 214.71916777440606 - - 33.925889973035964 - 42.739697098640335 - 243.40470826125244 - - 76.92195434570317 - 56.405336970071644 - 185.4001869725117 - - -30.686676713147904 - 48.91957756353722 - 112.59987341337367 - - -11.395690683106295 - 56.49130327402281 - 112.59987950325014 - - -21.085781315401277 - 49.50756667800304 - 232.61790320124092 - - -30.495862982259382 - -34.60028023078436 - 236.33018005712893 - - 87.56933464740007 - -13.191378451096876 - 228.98156503492874 - - 26.03067574447084 - -49.03881637875417 - 239.34020727470434 - - 43.48683232179542 - -38.35527539092473 - 112.59987205266951 - - 87.56933317560618 - -46.496380315809134 - 204.75253064721736 - - 15.082037700077308 - -58.02749327325538 - 220.99086516414025 - - 87.56933216585162 - -12.974339831168207 - 122.96471145496687 - - 51.9030813096133 - 25.51241868625107 - 112.59987950325012 - - -56.598573175625006 - 18.68561041973122 - 191.55168405737834 - - -48.26118898253037 - 18.169747012757405 - 230.12637966703082 - - -48.450476695378825 - -31.16414718103442 - 112.59985715150833 - - 26.416551293517273 - 48.696260655579785 - 239.76429384021176 - - -41.258890606602904 - 43.07974211773801 - 198.03066125495303 - - -34.49263902952464 - 44.1506534835811 - 226.11790163536432 - - -5.161123550262801 - 55.18206486516514 - 233.9330854710912 - - 16.523258635352363 - -43.70778478650374 - 243.30955784509575 - - -31.6437388121318 - -50.71643712645975 - 197.01767586167162 - - 87.56933387791855 - -31.243736452283677 - 221.2639903542983 - - 50.76050795846038 - 23.135178155348004 - 245.8761967296151 - - 37.65158882558012 - -43.56601197267352 - 112.59986795071498 - - 0.8889247366078052 - -57.94727176905381 - 200.66847961022955 - - 38.34852543166744 - 42.9482336863874 - 112.59987950325014 - - -56.18708402086088 - -19.981645431618475 - 191.586461559423 - - -42.056425968272606 - 31.441314475789774 - 230.38857527824734 - - -55.750792754657596 - 5.184531221099754 - 219.75124476976154 - - -47.605450558183065 - 29.856230633154617 - 220.5058441430439 - - -49.10688893659483 - 30.21276680615023 - 112.59986671221684 - - -29.45103184840093 - 48.509451178344456 - 221.74265111904484 - - -17.10125731611754 - 54.860155984031714 - 214.541752549387 - - 16.22444355456753 - 47.33645437632356 - 242.38059585119942 - - 33.157083638004224 - -41.87618420331975 - 244.13306957994016 - - -34.534463215539745 - -44.19579310083312 - 226.01761366475074 - - -36.38678615061508 - -44.68655331475563 - 112.59985715150832 - - 87.56933563621908 - 11.867347487329146 - 229.30782792949026 - - -18.958136844634964 - -56.913356852531464 - 202.88479328155518 - - 87.56933413239256 - 30.638033000800334 - 130.41806935949023 - - 44.143266417962764 - 37.40391364605725 - 112.59987950325014 - - -56.314632701873734 - -13.880516958236708 - 112.59985715150833 - - -48.13665443858065 - -30.96430774759411 - 207.39164552805008 margin: 1 - link_2_compound_convexHull_2: shape: shape_type: convex_hull vertices: - - 469.3486013089047 - 49.69472871298105 - 153.06301894483553 - - 469.348602114183 - 42.675390256900165 - 210.28790035385282 - - 469.3485966263832 - -49.87144388178175 - 153.52864003934522 - - 36.79722977316044 - -50.42947937619642 - 146.35510538529306 - - 87.56933648866186 - 50.004364066144305 - 198.12009068546035 - - 87.56933350848942 - -37.805826271824195 - 215.45049371217917 - - 37.14565948997756 - 6.50115784773519 - 112.5998737732187 - - 469.3486020069933 - 50.0044808483825 - 198.12013497512677 - - 469.3485988019806 - -37.805801777084234 - 215.45047642982877 - - 36.79796999640814 - -50.769472321927466 - 204.85110441867843 - - 87.56933563621908 - 11.867347487329146 - 229.30782792949026 - - 469.34859816671695 - -6.629573044160848 - 121.40094942600535 - - 87.56933552473902 - 49.694656430715405 - 153.06303766752976 - - 76.9218947410584 - -50.90167547784124 - 202.82115414980387 - - 35.28923191648482 - -46.76172626082658 - 137.2747469779343 - - 37.145657489391624 - 6.501154060088634 - 207.9480608495382 - - 87.56933637457018 - 31.022420396991755 - 221.3799784188908 - - 87.56933464740007 - -13.191378451096876 - 228.98156503492874 - - 469.3486011545749 - 11.8673661599311 - 229.3079036871486 - - 469.3486003496348 - 36.555169656338535 - 135.44157072367113 - - 76.92195434570317 - -50.46499297977997 - 148.54596354095403 - - 469.34859764362 - -50.18119181245659 - 197.65452207964063 - - 469.3485977449875 - -26.091528557814712 - 128.03180043230188 - - 87.56933685489219 - 42.675291038455335 - 210.28784149037517 - - 469.3486018929183 - 31.022464718508907 - 221.38006286654212 - - 469.3486004517982 - -13.191395150844722 - 228.98159625269764 - - 469.3485988886904 - 11.650289449175064 - 122.63848116052549 - - 87.56933550854728 - 42.238590773158194 - 141.07928800957998 - - 469.3485980453339 - -43.12869070887776 - 209.6313646331131 - - 469.3485967998862 - -37.34210298465777 - 136.13861015855974 - - 469.3486007518119 - 42.23863485920566 - 141.07924736076163 - - 87.56933483126556 - 36.555148147296165 - 135.4415950023511 margin: 1 - link_3_compound_convexHull_0: shape: shape_type: convex_hull vertices: - - 473.137961895848 - 36.89718162533745 - 15.895021637526984 - - 473.0332122188894 - 20.08269809000303 - 77.19937208169837 - - 472.5927942281463 - -42.24779260763575 - 31.39726533865284 - - 66.73421831600263 - -34.85626584406495 - 12.059432703729472 - - 86.36995459061495 - 36.835621497138405 - 59.70379001352184 - - 86.36995465152359 - -18.694426120767975 - 76.63597485112074 - - 472.55370114907873 - -14.331490420376497 - -2.0958331097323635 - - 472.82166071123356 - -36.437656010761884 - 15.458056950194475 - - 472.7467213117718 - 37.68023500966437 - 60.28679121172071 - - 86.36995159447247 - 24.825018033620466 - 4.427323517825153 - - 472.85460009336293 - -19.191973961742793 - 77.58398331530516 - - 86.36995293361883 - -41.26512494895526 - 48.970528194758494 - - 65.7677281091701 - 27.083752021205196 - 73.76358347726784 - - 472.5792392860259 - -24.847717247351596 - 3.1684350563889203 - - 86.3699519968045 - 35.92027480488738 - 16.569330904243532 - - 67.12886697404565 - -16.20058219183082 - -2.1324202017050897 - - 472.64567523543747 - 15.370536854574482 - -1.8786535641148705 - - 66.68611664999753 - 23.017271321126554 - 76.28558876887368 - - 472.7376831649194 - -42.2651547155035 - 49.21713688680824 - - 86.36995359311709 - -36.48318025793425 - 60.21467264233941 - - 86.36995192576637 - -41.68799686643042 - 32.11135202587985 - - 472.3185818046102 - 26.360659509139662 - 72.9473691901421 - - 65.72203247875473 - -32.38136231277983 - 8.512654601877264 - - 68.51559740208677 - 28.4423594126538 - 62.89071091093035 - - 65.58520288412069 - -25.531773652082933 - 2.3962944733011913 - - 472.83410327797515 - 25.529288905981247 - 3.632355750917005 - - 86.36995107505345 - 15.070607888494692 - -0.938570839504615 - - 472.4304226301907 - -37.2207068837064 - 60.72375940689196 margin: 1 - link_3_compound_convexHull_1: shape: shape_type: convex_hull vertices: - - 566.4685180762414 - 54.91349542803998 - 52.05549421471479 - - 625.6292034208312 - 20.355039837735323 - 112.61627069397106 - - 587.7223336590731 - -7.843638841001767 - 18.8280190704228 - - 492.70679257009647 - -54.39105534647748 - 20.907465408712493 - - 473.6509496712076 - 8.280321460091567 - 81.65143042247888 - - 591.2472431918145 - -54.408991722431296 - 112.49145120382308 - - 490.0856046676636 - 20.04771344661714 - -14.061901718378062 - - 611.663353815531 - 25.247210738588496 - 55.51938128347746 - - 556.0193966560523 - 55.66048108880935 - 112.43337071018043 - - 625.180436007733 - -18.285964951657053 - 84.48206636864114 - - 569.9956429342543 - -41.66212948405386 - 24.272523071299357 - - 490.03623609155466 - -49.066851948192536 - 66.42535228085671 - - 550.820789499859 - 36.72991806695026 - 6.336037253309877 - - 473.4644375376067 - -18.502752335427232 - -0.6294562693174964 - - 601.9494933725151 - 48.324645032929006 - 84.3624418969748 - - 489.82624178821754 - 55.703049818521116 - 43.51930074697445 - - 522.7031340025696 - 30.974382683759845 - 112.4017056167906 - - 626.0418869278012 - -19.411258282219816 - 112.54836943544014 - - 625.2006526809691 - 14.861474920368249 - 78.69349447865991 - - 571.000900422595 - -52.77165600901498 - 47.36510214142333 - - 611.2072321696762 - -24.86760074434498 - 54.9615629790693 - - 532.4776285734558 - -18.59362317732302 - -12.01073375099886 - - 522.7419822435545 - -30.944554411225337 - 111.96691291365212 - - 489.67592726706414 - -54.76077656867601 - 50.04270121362228 - - 580.6982175915921 - 25.815628046558313 - 19.022523080886927 - - 588.650576402296 - 41.67129336680727 - 42.967039372778785 - - 602.0797930550344 - 49.114940430058226 - 112.22933240103777 - - 473.3151896057567 - 42.19174024741255 - 27.519412620175995 - - 585.4057242280497 - 56.11308221304131 - 112.4914512038231 - - 492.8646786207529 - 49.484684449696005 - 9.681709105110386 - - 474.046465043427 - 35.07886545416251 - 64.9963499258351 - - 620.0993089675903 - -31.505267691612257 - 112.53898590803146 - - 625.0144392610792 - -7.649698310473655 - 73.12900475371777 - - 618.6787549001191 - 31.072603628474393 - 84.38246218966836 - - 546.1406621336131 - -53.29176628851709 - 28.435240500065532 - - 581.0956216387244 - -24.873967379214097 - 18.608694587437927 - - 593.8884523985275 - -41.01465941632868 - 48.29841304601127 - - 531.964910840944 - 15.755181500322951 - -13.130020429291015 - - 490.0856046676636 - -20.047839355468735 - -14.061903581023214 - - 550.6554229685656 - -53.85854426020596 - 112.16757305638222 - - 473.9179010337351 - -24.49540942574753 - 75.29430933773223 - - 515.5326573521158 - -13.939567810560785 - 112.05866093106829 - - 489.79394414923286 - -54.64276853532626 - 25.612941936629728 - - 599.5220740433351 - 9.190796708360317 - 30.794231758923804 - - 606.3519514051247 - 36.90881696888157 - 61.45729631325288 - - 585.0295565837407 - 54.13045541526101 - 71.68782376375621 - - 599.3899256875974 - 30.814727800191424 - 43.183546123478195 - - 569.0176457684312 - 41.628812497315174 - 23.963989221648035 - - 473.5229539977787 - -40.62673131516884 - 54.44788122797273 - - 473.6430448379689 - 19.393469057699946 - -0.2448535086794655 - - 489.944250658995 - 55.585040416753365 - 32.136335345061205 - - 619.7103290557861 - 31.994734334945665 - 112.6074269413948 - - 474.11280609878463 - 25.051353975742455 - 75.09297270503518 - - 473.8823129771247 - 40.90216263930954 - 54.13799039736242 - - 540.5195813504569 - 48.774886131591614 - 112.33426910286768 - - 606.9599310796598 - -41.57829023377654 - 72.88937762377495 - - 618.7937489873449 - -13.63240259601271 - 60.97171659765813 - - 618.8436229775876 - 14.123149313415936 - 61.199701067029594 - - 624.6754675836087 - 21.445432930915253 - 90.69980039038558 - - 619.1680127280017 - 25.642471088180667 - 72.64276770186186 - - 584.3992117115342 - -53.15350361396462 - 65.66244386069228 - - 557.6064515877514 - -46.79723472749544 - 22.875164494477907 - - 598.9065023809881 - -25.001305111868852 - 37.36070683080588 - - 563.245626919265 - -14.132469715964305 - 0.7020112966771612 margin: 1 - link_3_compound_convexHull_2: shape: shape_type: convex_hull vertices: - - 71.1526907934649 - 41.50183912728877 - 27.781046644708614 - - 86.36995459061495 - 36.835621497138405 - 59.70379001352184 - - 86.36995094593067 - -35.56783910772783 - 16.058458375711478 - - -14.463458642093428 - -41.08084592777817 - -5.215041201226964 - - -36.74268436431885 - 25.979940223693838 - 95.49957513809204 - - 29.891064647068106 - 30.46345575735811 - -15.292405605786472 - - 86.36995159447247 - 24.825018033620466 - 4.427323517825153 - - -15.000614516674887 - 42.09195077221316 - 95.49958258867265 - - 18.522162891601283 - -40.77380142341456 - 95.49959003925322 - - 30.148100787502244 - -30.064000988587534 - -15.147561935902734 - - -31.085398104537944 - 25.42700293238781 - -8.587783997900058 - - 86.3699519968045 - 35.92027480488738 - 16.569330904243532 - - 12.381302682423893 - 43.102241457423226 - 95.49959003925325 - - 86.36995465152359 - -18.694426120767975 - 76.63597485112074 - - -37.67239761352539 - -24.612601470947276 - 95.49957513809204 - - 86.36995192576637 - -41.68799686643042 - 32.11135202587985 - - 17.69962269502753 - -39.92382370751682 - -11.629716617960987 - - 86.36995076886092 - -14.104927679803097 - -1.1766391855096388 - - -20.687150295181254 - 42.0394521392377 - 17.1233705252908 - - -10.134293276192693 - -33.01674534112166 - -13.61365541622133 - - 19.3836784797345 - 38.86629819799853 - -12.465866485260399 - - 71.29192377178128 - 41.73970173981566 - 49.08754784328369 - - 40.08827968001037 - 19.728303087693867 - 95.49959748983383 - - -15.267387557240681 - -41.97621519763427 - 95.49957955651118 - - -43.01666662881303 - -8.117220105621413 - 1.1689776244743262 - - 86.36995359311709 - -36.48318025793425 - 60.21467264233941 - - 16.71028423309326 - -38.28244991302489 - -13.903557322919378 - - 39.535166091190604 - -18.65425813298722 - -15.226652737310106 - - 86.36995107505345 - 15.070607888494692 - -0.938570839504615 - - -42.47850801753748 - 19.6454148429008 - 25.59147844426542 - - -26.217402953155215 - 36.20292095921622 - 95.49957794143397 - - -2.2683677535576408 - 42.47687545643075 - -10.230875639728186 - - -19.616544008470783 - 42.117945976230004 - 14.621330682755238 - - -8.849709585955907 - 34.02344608809801 - -13.59523966588623 - - 13.502366510116417 - 41.240618341370464 - -10.467133594999565 - - 40.71653646192749 - -18.637803558429987 - 95.49959748983383 - - 86.3699553336462 - 19.5510005104514 - 76.18630615561392 - - -30.552227389627205 - -35.541406015013855 - 19.474217386256026 - - 86.36995293361883 - -41.26512494895526 - 48.970528194758494 - - -21.10210667253932 - -41.918111243988996 - 17.70442885557799 - - -31.391353318348365 - -25.09299727325404 - -8.553683537286275 - - -10.391756158568569 - -40.40709483184597 - -9.970234282001522 - - 39.75837740432917 - 18.49967890824789 - -14.870849301838224 - - -30.131040194179604 - 30.313540988490217 - -4.926330757190233 - - -42.82018600403035 - 9.085463735979175 - 1.306915962627083 - - -43.92554712022206 - 8.643551876098208 - 95.49957513809204 - - -37.125951063309685 - 14.87483764246784 - -7.924758632609611 - - -19.505736694664392 - 35.98437588968227 - -9.44255800618926 - - -5.2244613475681945 - 39.1623254030807 - -12.490454305840634 - - 24.12205353866011 - 37.64540909692233 - 95.49959226303885 - - -26.55895443567374 - -35.90549233077376 - 95.49957513809203 - - -42.88485823245014 - -18.297275823922952 - 27.08019887807348 - - -26.032021947252815 - -34.39367897768105 - -4.013282829276614 - - -4.454928397927006 - -38.62169568045604 - -12.94292959560324 - - -20.26158098329597 - -36.07324393212869 - -8.840227260103786 - - -36.089975138166665 - 24.808488171025687 - 0.8258379319531273 - - -24.654253155641754 - 35.288636505503206 - -4.885349094180798 - - -37.603410175518775 - -13.50675842578161 - -7.871372646826353 - - -31.844223501086617 - -34.487477868617255 - 21.70895747465937 - - -36.56613540649414 - -24.706761908531178 - 0.9027507621794885 - - -42.646707249508154 - -14.015274992583862 - 95.49957513809204 - - -30.884010550552375 - -29.3485536449395 - -5.0962322222328345 - - -13.984535634161148 - 41.24428881291587 - -5.403472943315284 - - -42.19236316784463 - -18.819298304604875 - 22.765681427201795 margin: 1 - link_4_compound_convexHull_0: shape: shape_type: convex_hull vertices: - - 25.76960115228644 - -31.960172979774033 - -55.574874432562396 - - 43.14961747136908 - 7.044977020751268 - -45.69228016651391 - - 43.42374718989004 - -78.89139899015427 - 11.725451011552046 - - -18.832848342007537 - -40.8041877898373 - 56.400086355209346 - - -34.30636106257907 - 14.919941628715401 - -51.17144953540909 - - 43.92254945700415 - 8.612951695191928 - 56.40008952079757 - - 40.817516597954636 - -78.89138408899306 - -18.735917642678267 - - 23.877607941379665 - 25.4280049246912 - -50.689073077540755 - - 46.59677751525646 - -1.9823831731911679 - -29.52122472283304 - - 18.520306306322027 - -78.89139899015429 - 41.00677397697569 - - -44.78794821766519 - -6.98100340408558 - -8.485656250380575 - - 39.63746426252419 - -17.50124077169935 - -51.22385179265488 - - -30.66873264312744 - -78.89136918783187 - -32.780681180954 - - -28.073899764505086 - -25.276248896065628 - -55.747206639860295 - - 28.04703326715162 - 33.277016103072064 - -41.01323999060382 - - 44.667931036944765 - -78.89139153957368 - 4.715480777575771 - - 43.2327860737862 - 12.023770387041248 - 12.123098796997231 - - 26.67421331379046 - -36.20488588741861 - 56.40008611681323 - - -20.92236590443622 - 29.503404356266934 - -49.91538286452821 - - -19.988646574030554 - -39.11587212042019 - 56.33151994812653 - - 27.965345534014205 - -78.89136918783187 - -35.101132640697365 - - 43.30355569058679 - -6.844615725477048 - -48.273816952009895 - - 38.17963886260986 - -3.558720135688764 - -53.203840184211714 - - -43.59861974276055 - -6.858811990947779 - -46.965588078442295 - - -21.745373575815393 - -78.89139899015429 - 39.443900123673124 - - 40.83139686262007 - -78.9623843458622 - 18.748324933364863 - - -10.812881875839139 - -78.89136918783187 - -43.48717293909372 - - 36.10730331536524 - 18.720304461662543 - -48.626722742264285 - - 44.71509816425532 - 4.884157842473346 - 56.400086501702404 - - 43.07846964779674 - 9.579542234001783 - -43.16937661925484 - - 42.893582206391784 - 13.472539852686092 - 43.663134985160475 - - 4.5189431921648975 - -78.89139899015429 - 44.82281343055691 - - 42.975740777347255 - 8.854185470131402 - 56.27337143996393 - - -30.55872320245703 - 19.707892982588355 - -51.052863689464765 - - 22.36852971286271 - 35.60645983803408 - -44.09164286393003 - - 34.952205928688045 - -78.89137663841247 - -28.17675486272575 - - 32.81660048703566 - -25.8562482301075 - -54.244308209147206 - - 42.09955924168776 - -11.436582394460778 - -49.3183709877051 - - 44.64050131251156 - -78.89139153957368 - -4.734026765800798 - - 43.27335688165249 - 2.48608524978561 - -47.5088471405771 - - 34.71478206985262 - -11.94680609674808 - -54.50274377270632 - - -44.36695136784897 - -78.89137663841248 - -7.156363348534746 - - -44.38951263168042 - -2.1086476096134934 - -43.663408648275094 - - -39.11951555604014 - -16.435982222946084 - -52.21960934311 - - 38.558300775810494 - -23.06899312299529 - 56.40008579872816 - - -7.254940010661812 - -42.11136044609058 - -55.889080152928834 - - -22.55457536170843 - -78.89136918783187 - -38.78408167285264 - - 10.440883169118933 - -78.89136918783187 - -43.600566368882575 - - 36.9932495413766 - 8.395439268080816 - -51.838382610994834 - - 44.582358496415054 - -5.5097795398523 - 56.40008635520937 - - 36.181972402548126 - 24.885827731417 - -40.81432335596348 - - 40.623310537353746 - 16.466398922750006 - -43.26002524263617 - - 4.499702445274352 - -44.52760833856607 - 56.400082772010556 - - 11.601304868493116 - -78.89139899015429 - 43.507048135364464 - - -10.900868351221334 - -78.89139899015429 - 43.70825398722629 - - 42.81136226726221 - 13.777466422148999 - 43.66129103742211 - - -33.96433692570213 - 2.5326705169771864 - -53.30911943840485 - - 14.237223054988362 - 29.025235220661266 - -50.7264901789183 - - 27.75633004739734 - 29.312757871489843 - -47.39166187285669 - - 39.64612570829331 - -78.89138408899306 - -21.042583552438522 - - 24.410302170992736 - -78.89136918783187 - -37.645273347854534 - - 43.37357614983739 - -78.89138408899308 - -11.719594141621037 - - 39.80137419409857 - -12.870866381387748 - -52.126126731931016 - - 45.717553236000185 - -10.483776108102417 - -35.780668024627325 margin: 1 - link_4_compound_convexHull_1: shape: shape_type: convex_hull vertices: - - -34.186270556409454 - -2.2219841817447774 - -53.739173235809034 - - -20.34508591649319 - 33.59210630063097 - -47.53181146292944 - - -21.745373575815393 - -78.89139899015429 - 39.443900123673124 - - -34.14720665240725 - -29.13998382835035 - 56.40009475675731 - - -42.63185391456227 - 14.277153954844582 - 56.400109029380666 - - -19.35815222634028 - -40.50090133283376 - 56.400086355209346 - - -44.36695136784897 - -78.89137663841248 - -7.156363348534746 - - -20.840332968119355 - 19.659156498294173 - -51.82537984954967 - - -43.79198258456063 - 16.459855270540128 - -24.909057129652517 - - -28.187029394206547 - -34.842432465361895 - 56.40008820619394 - - -34.941974848821474 - 26.231223675046355 - 56.11812890328875 - - -41.381505637676355 - -78.89138408899309 - 17.64635709412729 - - -32.17923635786224 - 18.975217278278556 - -50.64278014263001 - - -43.25750991037762 - -79.18054857254029 - -7.354808178656306 - - -17.989663334894658 - -63.993895854159696 - 41.409013062938755 - - -46.40998138874352 - 4.41941284670757 - -26.94983517994569 - - -24.957993310953043 - -37.26780899716243 - 56.40008635520935 - - -20.51657309244274 - 38.52463852160152 - -39.95160124752009 - - -37.02651288563766 - 25.17590218442965 - 56.40011615753177 - - -34.201340938790054 - -78.89139295980482 - 29.22918725509242 - - -44.301744878422824 - -6.828848603131146 - 56.40010125637056 - - -33.96433692570213 - 2.5326705169771864 - -53.30911943840485 - - -20.43375911825524 - 29.975406941153032 - -49.8483421079069 - - -36.39428608589378 - -2.2637675324132025 - -53.40352806519613 - - -43.711763071103405 - -78.89138013580464 - 10.572046528713933 - - -44.881658872099706 - 13.494531235524942 - -23.778991627932207 - - -42.611686955257255 - 8.375780316636813 - -46.41900454906979 - - -31.63927310735471 - 29.41632682643335 - -43.27741680967402 - - -17.93380334406379 - -53.121969830261186 - 41.450078741325974 - - -38.9710636138916 - 22.49946198463437 - 56.40011615753176 - - -28.74639766268342 - 34.5736942565319 - -21.465123601038258 - - -28.23717998559573 - -78.89139899015429 - 35.08409204244125 - - -22.779739366090098 - -79.1805709242821 - 37.53930624888499 - - -43.694378892004806 - 9.685317913443047 - 56.4001052902102 - - -41.28707878570094 - -17.29864536808196 - 56.400101256370554 - - -29.822425838616937 - 21.38842196803241 - -50.71329458026212 - - -36.87971307857515 - 8.39382211255957 - -51.846964516963446 - - -42.79744338989258 - -13.906295084953339 - 56.400101256370554 - - -42.833047512521034 - -2.147775101679009 - -48.92236017414203 - - -44.92133032150218 - 13.129798651164704 - -26.22444455819194 - - -23.520201707989827 - 35.301998023748034 - -43.791637487367225 - - -35.37547302246094 - 20.028268313407914 - -48.49911146163938 - - -38.75953417852929 - 21.098457539305446 - -40.90532305547702 - - -20.154344584531827 - 38.04933815706911 - -42.083689671937904 - - -38.996145237908195 - 25.873331413390485 - -21.15370517098204 - - -30.523876469470224 - 31.61399403281222 - -39.618827024321845 - - -24.80202925302501 - -78.89139899015429 - 37.56492674026605 - - -37.65731259117433 - -78.89138408899309 - 24.662818265975055 - - -46.12777758399261 - 7.512746707052867 - -25.997835211116634 - - -37.712108285041495 - -24.23332549372031 - 56.400099560067616 - - -20.726813112179343 - 25.484005527366968 - -51.006833823283884 - - -26.155588150024414 - 30.600105738639847 - -47.34015874862668 - - -35.136630310196324 - 2.5096072441577015 - -53.1121170558782 - - -41.7290776403504 - -16.349979602975548 - -43.598296116142826 - - -46.03481185644614 - -8.129984944572625 - -34.65278440652873 - - -39.24024864844296 - 1.0964275652651683 - -52.06140930460015 - - -40.16894336572386 - 8.252046045195549 - -49.80251568214819 - - -35.71259126290988 - 14.226126513208863 - -50.628690614071665 - - -41.029012326035854 - 15.438475140403105 - -43.16250083118282 - - -36.55225322170281 - 22.34812685061444 - -45.0240029693208 - - -27.021918365158626 - 34.0523155631362 - -40.90354667722154 - - -21.494005331522658 - 36.41675329046952 - -43.810143313780955 - - -39.92306033244563 - 24.00126133543632 - -19.087579919397076 - - -37.66466505217818 - 27.553002529559627 - -17.82559358974972 margin: 1 - link_4_compound_convexHull_2: shape: shape_type: convex_hull vertices: - - 43.32667076234861 - 9.047757852528056 - -42.8205848272947 - - -36.60738482633883 - 25.752781548114914 - 56.40011615753177 - - -28.295930965156003 - 33.26117284233427 - -40.10094196521091 - - -35.45362609896847 - 27.340791669903556 - 56.40011615753177 - - 43.92254945700415 - 8.612951695191928 - 56.40008952079757 - - -36.85245028057125 - 28.79013431137833 - -17.535375010171478 - - 43.08676713220734 - -2.4170607946121407 - -32.07296261882186 - - 19.703029797669615 - 42.64686676870895 - -12.728154898064284 - - -16.63303199676193 - 43.82171964890197 - -11.778513565116763 - - 44.93539859891598 - -2.1636094669408337 - -15.782726690901486 - - -37.13089853972565 - 25.25174292232171 - -0.012533952000399196 - - -20.811270770341025 - 29.10667906560746 - -50.13920848339926 - - 39.68208558479205 - 25.024385994169087 - -19.828684218165552 - - 10.234888799334158 - 43.73059165862378 - 56.40010870695118 - - -25.900893719816622 - 39.15390600171529 - -13.912871055149377 - - 5.776300796306259 - 42.45561881877335 - -41.745807979645896 - - -37.02988420306042 - 25.178351593816846 - 54.578170873570585 - - 45.801653732039995 - -2.3569752488150315 - -34.51718841915502 - - -37.22215305232089 - 27.647401053900676 - -21.492574373044693 - - 45.82822598339885 - 9.815948145118977 - -25.774820006730206 - - 30.21519182873476 - 33.01547294496237 - 56.400101256370576 - - -9.5302336438574 - 43.95946845684483 - 56.40011615753178 - - 0.9753457025283296 - 46.69745469245647 - -10.264699091779313 - - -30.619833628628385 - 35.368742399787216 - -15.003367863382477 - - -20.008028317213757 - 38.8341288843378 - -39.8065118393035 - - 21.568149164650777 - 29.02204628922501 - -49.82563039757382 - - 46.46072436621171 - -1.583780950688934 - -29.296781874351495 - - 45.018055603714856 - -2.119648089779685 - -36.514370145268 - - -35.51898481354215 - 30.567479949100324 - -18.859187371481582 - - 42.10947020009098 - 15.450985916411955 - 56.40009514586047 - - 40.97405829582249 - 16.847074291761192 - -41.21598630918938 - - 45.61902205642127 - 2.3178256434653837 - -33.40110557381132 - - 27.944142695335813 - 37.741244977831805 - -14.715517222571533 - - 22.04484316222488 - 38.94882472456845 - 56.400105285322 - - -26.150492083887002 - 36.578237430768326 - 56.40011615753177 - - 8.021859099650783 - 46.13735434408421 - -13.109945408521078 - - -7.375967856652551 - 46.20765243599306 - -13.056220530572041 - - -30.656560171313913 - 35.37481098360988 - -17.555839001212334 - - -16.85647842918752 - 43.760019194661545 - -14.050336236530805 - - -24.863024652462627 - 36.43682835590444 - -37.53616262203418 - - -8.404471551481492 - 40.253983868365985 - -44.93390501533052 - - -19.27730427604797 - 34.54514785304365 - -47.19916880052891 - - 8.274030521768964 - 29.28778255414803 - -50.98300732457584 - - 43.58790492879439 - 8.433940285256275 - -42.45804821889009 - - 45.13317785685035 - -2.2044539983649667 - -36.16909714769636 - - -35.3206290172368 - 30.833057438824007 - -17.308634792885854 - - 43.22859814744265 - 18.111102178138577 - -22.468106193627072 - - 43.42914133422482 - 10.934344889411282 - 56.40009140036164 - - 37.29581151913021 - 24.805566133923495 - 56.400101256370576 - - 44.41861226696983 - 14.242819191369632 - -26.14065046243956 - - 42.09913994792714 - 13.200378988097944 - -42.454941224094874 - - 37.32193545878158 - 28.334781835169885 - -19.074274835703093 - - 28.89679141022725 - 32.86272636337766 - -39.69599217339798 - - 17.53168648754786 - 41.35972059480807 - 56.40010870695118 - - 24.273957971572827 - 40.210781019955085 - -13.724140725976763 - - 25.82499788489963 - 36.76635424280957 - 56.400101828403024 - - -20.025351824666814 - 40.11462470720312 - 56.40011615753178 - - 7.925919925991366 - 46.12301169395261 - -10.683494408583677 - - 15.013160670041998 - 41.344332357328156 - -37.30236810848289 - - 2.1361351527154966 - 43.82294278003805 - -37.443842660419115 - - -13.07203279712894 - 44.9872521283551 - -11.662584850613266 - - -7.2310403170192785 - 46.18199712040403 - -10.617690092322938 - - -10.83546610814551 - 42.54854712750422 - -37.469750561731765 - - -25.825889929571304 - 35.2874015840256 - -39.69592524423142 margin: 1 - link_5_compound_convexHull_0: shape: shape_type: convex_hull vertices: - - 27.018073081970215 - 63.30498495101927 - -35.94153621196752 - - 44.7536735534668 - 4.699135208129848 - 56.299452996253905 - - 42.80987512117349 - -7.949420619356868 - -46.432865895619074 - - -9.053700914097135 - -42.94550103272132 - -37.820523292132215 - - -42.93086781136776 - 13.272839793612905 - 56.299452996253905 - - 26.10429931774206 - -36.6103167245992 - 56.299438095092704 - - -30.37554592949823 - 27.207819349831933 - -55.13784684799621 - - 44.529693971955794 - 63.285483681462495 - -6.299950337512669 - - 40.70804128248005 - -18.604124962363777 - 56.299438095092704 - - 25.854722181928082 - -35.27148808661706 - -39.85597910814477 - - -26.05817823927805 - -36.636731750981916 - 56.299438095092704 - - 18.904199214046002 - 36.17803066526605 - -56.39701828645594 - - -44.10377418150847 - 63.27752624005407 - 8.66081731674889 - - 46.40174263434824 - -4.256987002109164 - -27.1178583836317 - - 39.63349254012087 - 17.51145042309599 - -51.320507713762346 - - 6.983556741059374 - -46.345581221262364 - -11.076560822120296 - - 36.75747203826904 - -29.16238269805911 - -19.946525478363107 - - 10.322691973505925 - -29.746641740924822 - -50.877841081520565 - - -43.903346891041565 - -16.43227016653845 - -24.948904928791084 - - -5.781422642349526 - 63.30498495101927 - -44.55764532511934 - - -43.02328802278498 - 63.3311543771875 - 12.922715328270769 - - 46.446724107437376 - 4.218985621386004 - -30.52243184861382 - - 44.050147964518146 - -8.01834713043871 - 56.29943809509271 - - 38.55737218681202 - 63.29829366673558 - -23.114675085972735 - - 28.986114959179986 - 31.26621526277918 - -54.43089788333929 - - 24.879940367642348 - -39.72352337524758 - -15.751915556459474 - - 6.798865609967379 - -42.954450879100015 - -39.925042115077 - - -7.855531692504883 - -46.29299602508548 - -11.009077215194775 - - 7.004261645038241 - -44.268489495416915 - 56.29943434910384 - - 33.430399838643325 - -30.125771594484387 - 56.299438095092704 - - 42.92203873145945 - -18.616211492601348 - -21.901718919450335 - - 37.508804103378225 - -21.565121074368346 - -44.64545680191117 - - -20.004911203657457 - 33.085610543156164 - -56.53887465139481 - - 36.887221477551066 - -7.953611761263285 - -52.0535401359796 - - -32.68379759853292 - -18.686398734006136 - -50.7856207792212 - - -42.89115505141626 - -13.468931103016407 - 56.29943809509271 - - -42.82722549850769 - 8.913387249569123 - -48.52215135176864 - - 11.186907474665304 - 63.30498495101927 - -43.48699357998639 - - -36.44669487124588 - 63.30498495101927 - -26.302742956925997 - - 10.124134261080599 - 63.30498495101926 - 43.80189313733764 - - 42.90583152036038 - 8.897156992810206 - -48.58441276711976 - - 44.02831394318059 - -1.5961799210693541 - -45.40951615793335 - - 46.30299808184782 - -7.9342962377917425 - -26.861271674481515 - - 21.919497649253117 - 36.82756204933527 - -55.120529039924996 - - 34.437186763800355 - 26.850403137999404 - -52.31045117014428 - - 28.151672114482608 - -37.59800339662055 - -15.889764503146106 - - 15.502237051804968 - -43.98500421466716 - -14.421889171205075 - - 16.371997181408233 - -36.37841201695628 - -46.808507153908344 - - -0.452878478037519 - -44.21173292700361 - -32.52005126034289 - - -27.91095046020223 - -37.763282185853754 - -14.774560329941645 - - -8.022054253005308 - -44.16146447306845 - 56.29943597089166 - - 38.7730903688514 - -22.777648485338 - 56.299438095092704 - - 43.116019032673194 - -12.413256651190272 - 56.29943809509271 - - 32.08513748070527 - -30.140563251889073 - -39.976361309382135 - - 39.74370595899745 - -24.800614203551877 - -21.269444344397364 - - 41.81359979083186 - -14.252500614023637 - -42.10269346118943 - - 20.083261351938972 - 33.084212492034126 - -56.5086976168572 - - -3.6794942079686734 - 42.220321799618546 - -56.29841434434645 - - -23.81576249997738 - 63.30498495101927 - -38.1069461485106 - - 38.569199915041736 - -14.0792692202422 - -48.9861898292651 - - 36.33742794549357 - 15.1832824142553 - -54.27518604699142 - - -12.397516201661574 - -36.6688410064716 - -47.76178432063737 - - -34.17508237980246 - -4.8630964341518235 - -53.121958749023875 - - -36.44251629774203 - -25.98472664538275 - 56.299438095092704 margin: 1 - link_5_compound_convexHull_1: shape: shape_type: convex_hull vertices: - - 43.42171267990511 - 63.60169687271116 - -6.433382256231354 - - 44.107025498927214 - 63.304984951019264 - 8.64328558473197 - - 44.529693971955794 - 63.285483681462495 - -6.299950337512669 - - 44.530467601051896 - -6.147506376584015 - -14.032869090954565 - - 19.04764573204443 - 40.675237794098976 - 56.2994665361774 - - 44.7536735534668 - 4.699135208129848 - 56.299452996253905 - - 44.23713083177768 - 9.172407817586762 - -14.038157644684217 - - 18.808853800669567 - 63.30498495101926 - 40.8250406051764 - - 44.55199214933009 - -5.995824273197083 - -14.032580526238975 - - 44.69686650493031 - -5.080696820656714 - 41.5786292013033 - - 19.55479913646377 - 63.60169687271115 - 39.29960969630112 - - 19.55479913646377 - 52.543306732177705 - 39.29960969630112 - - 35.46543987799532 - 63.30498495101926 - 27.619394759326823 - - 43.58943590457693 - 4.855826597937154 - 56.299452996253905 - - 19.442696687427542 - 39.34806376737954 - 56.29945760965425 - - 44.718391053208734 - -4.929014717269746 - 41.578917766020055 - - 19.85599657876628 - 40.79230624047302 - 40.852893053425625 - - 42.93398264060829 - 13.260455433970522 - 56.299452996253905 - - 28.08847362099118 - 63.30498495101926 - 35.09102660715796 - - 40.690299850049314 - 63.29720811789431 - 19.11911976189164 - - 44.533930377637944 - -6.147997762386147 - -0.9478010342309076 - - 19.72067249799693 - 38.65403503892621 - 48.016621644926694 - - 23.724198001801142 - 63.30498495101926 - 38.16885203865583 - - 38.86592236277784 - 22.64056856590895 - 56.29945299625391 - - 43.044026500074324 - 63.304984951019264 - 12.845592274510622 - - 37.62923245820025 - 63.30498495101926 - 24.55957661347928 - - 19.63164050319483 - 63.30498495101926 - 40.4370185115789 - - 34.24784242560281 - 28.99682505685334 - 56.29945299625391 - - 40.78059205433328 - 18.43189035163651 - 56.29945299625391 - - 26.188828169855014 - 36.55220621482475 - 56.2994534748865 - - 30.094206168452956 - 33.12038723502772 - 56.29945299625391 margin: 1 - link_6_compound_convexHull: shape: shape_type: convex_hull vertices: - - 6.411412797885305 - 44.513967026775944 - -59.69690255095025 - - 43.71572939888688 - 9.99193282924489 - -9.00055117607121 - - 40.84082599918588 - -15.557723548393525 - -61.520855164949324 - - -1.4888183749733344 - -51.097127606603784 - -38.7682058126134 - - -42.6571285922314 - 13.511194984511066 - -8.840240956173258 - - 30.78100753783542 - -32.718144718831624 - -8.977297670596165 - - -37.872172481649386 - -21.755737812006608 - -61.47889759334806 - - 38.90086838167235 - 22.56688014237723 - -59.69836458495626 - - 3.676215473024058 - 44.5047990060588 - -8.850665899384285 - - 42.69213363690665 - -13.594005742782555 - -8.903546469002155 - - 25.378252031662214 - -37.11184433026591 - -59.76445622444158 - - -24.38367287409733 - -35.42349027970492 - -7.057853395953836 - - -3.618370930827041 - 43.5594159790149 - -61.4996790004242 - - 44.639124566792816 - 5.3872293502924995 - -59.764426422119186 - - 25.306017911158733 - 37.0344790518255 - -9.000521373748816 - - 37.12040989351317 - -25.358183853689248 - -59.76445622444158 - - 3.3502730387940574 - -50.95227703658389 - -36.31266717148496 - - 12.6909202113211 - -41.79728091916829 - -61.504567041336465 - - -27.956504021991122 - -35.24736165173976 - -59.655488022489415 - - -40.64309797485362 - -19.131168123314932 - -9.000551176071216 - - 27.97032446073308 - -13.474423528151867 - -0.5450352422919339 - - -43.56489239345524 - 1.7140279933997244 - -61.52082629203801 - - 36.252926300882564 - 24.364040199320172 - -61.46649309360998 - - -6.3168482845699145 - 44.46360947398918 - -59.76439661979679 - - 43.59850430166739 - 10.821013886186348 - -59.764426422119186 - - 44.576925867018645 - -5.516833426841843 - -59.764445067677684 - - 16.321508153842387 - 41.77540628150847 - -8.86257830321812 - - 37.045647535071566 - 25.281302288704328 - -9.000551176071207 - - 39.85270403460004 - -20.7572602825414 - -9.000578047563357 - - 41.86016021786372 - -16.444686968547224 - -59.73666285839881 - - 33.39302806489013 - -28.063633376336767 - -61.48856532880965 - - 34.34190872962563 - -28.96767147560094 - -59.76445622444158 - - 23.68774086208896 - -38.18898778004808 - -8.935966383751643 - - -9.890437612662708 - -43.662858812279524 - -8.888386316762999 - - 10.97577522980373 - -43.626562567992394 - -59.724428104586146 - - -23.63779399260511 - -38.19929391642141 - -8.922405287878698 - - -19.810947288063062 - -38.96854413595099 - -61.50732194948214 - - -30.577357625254535 - -3.6616185212020724 - -0.4901981372123609 - - -37.07417129113264 - -25.37868257555514 - -59.76443520316122 - - 42.79822505790435 - -2.7509577604295696 - -7.023598516682399 - - -44.4376568306709 - -5.434927744316552 - -8.861023756748297 - - 40.88861688883799 - 15.43194288733524 - -61.51062583534056 - - 18.158388497449096 - 39.70852025078017 - -61.48215017256654 - - -3.577996898484116 - 44.50932734421151 - -8.846137561231604 - - -35.17045284172514 - 27.9300042136351 - -59.76439661979679 - - 41.749243160313426 - 16.267641122736226 - -9.000551176071209 - - 43.642548509048765 - -0.8907025192704842 - -61.52082629203801 - - 44.57559673767605 - -4.513425067433564 - -8.824012348827297 - - 10.896859658957737 - 43.48136609003495 - -9.000521373748816 - - 13.465028167466016 - 27.917705431947454 - -0.501787979613419 - - 34.43072687340555 - 28.92100762387004 - -59.741146796206344 - - 36.26729736483048 - -26.41081802507664 - -8.923205664785092 - - 39.068859964267176 - -18.138450136985163 - -7.15980775820447 - - 39.85269727795844 - -20.757237360027514 - -48.75056095123296 - - 41.71623073836372 - -16.362314139698714 - -9.000580978393604 - - 43.60262720751052 - -10.95920738298039 - -59.764456224441574 - - 36.2311340411095 - -24.39004876670129 - -61.40371203010333 - - 19.84738449046972 - -38.93276488007755 - -61.51250513529718 - - 28.932257299107505 - -34.35864650537766 - -59.76445622444158 - - 30.00323986058538 - -33.49674537124163 - -9.000580978393607 - - -2.220424982515624 - -50.94462485547118 - -32.760025592471735 - - 8.091740955919022 - -29.7991987122843 - -0.49039156550356416 - - 2.367977804788552 - -51.11717990636829 - -38.100892706050374 - - -34.288175684959015 - -28.902870703729366 - -9.000559818243751 margin: 1 tool: tool: shape: shape_type: box size_x: 5 size_y: 5 size_z: 100 box_type: FULL pose: position: - 0 - 0 - 50 margin: 0 self_collision_detection: true start_joint_position: - 3.1796927452087402 - -0.4525286555290222 - 1.8372150659561157 - 0.22418241202831268 - 2.355468988418579 - 1.6246520280838013 target: - 0.95139851 - -1.1544104 - 1.51209009 - 0.0130628 - 0.72503735 - 0.49837699 algorithm: algorithm_name: RRTConnectAlgorithm step_size: min: 0.01 max: 0.2 MultiSearchCollisionFreeRequest_UR5e: value: motion_group_setups_by_motion_group_key: '0': motion_group_model: UniversalRobots_UR5e cycle_time: 8 mounting: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 global_limits: joints: - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 tcp: velocity: 300 '1': motion_group_model: UniversalRobots_UR5e cycle_time: 8 mounting: position: - 700 - 0 - 0 orientation: - 0 - 0 - 0 global_limits: joints: - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 - position: lower_limit: -6.283185307179586 upper_limit: 6.283185307179586 tcp: velocity: 300 path_definitions_by_motion_group_key: '0': start_joint_position: - 2.1396 - -1.2019 - 1.353 - 1.4196 - 1.5708 - 0.5688 target_joint_position: - 3.5569 - -1.2019 - 1.353 - 1.4196 - 1.5708 - 1.9861 '1': start_joint_position: - -1.002 - -1.2019 - 1.353 - 1.4196 - 1.5708 - 3.7104 target_joint_position: - 0.4153 - -1.2019 - 1.353 - 1.4196 - 1.5708 - 5.1277 collision_setups: default: collision_motion_groups_by_motion_group_key: '0': self_collision_detection: true link_chain: - link_0_sphere: shape: shape_type: sphere radius: 100 pose: position: - 0 - 0 - -10 link_0_capsule: shape: shape_type: capsule radius: 50 cylinder_height: 20 - {} - link_2_sphere: shape: shape_type: sphere radius: 100 - {} - {} - link_5_sphere: shape: shape_type: sphere radius: 100 '1': self_collision_detection: true link_chain: - link_0_sphere: shape: shape_type: sphere radius: 100 pose: position: - 0 - 0 - -10 link_0_capsule: shape: shape_type: capsule radius: 50 cylinder_height: 20 - {} - link_2_sphere: shape: shape_type: sphere radius: 100 - {} - {} - link_5_sphere: shape: shape_type: sphere radius: 100 algorithm_settings: algorithm_name: RRTConnectAlgorithm max_iterations: 10000 MergeTrajectoriesRequest_UR5e: value: motion_group_setup: motion_group_model: UniversalRobots_UR5e cycle_time: 8 mounting: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 tcp_offset: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 global_limits: joints: - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 - position: lower_limit: -2.8623399732707004 upper_limit: 2.8623399732707004 velocity: 3.14 acceleration: 40 - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 - position: lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 velocity: 3.14 acceleration: 40 trajectory_segments: - trajectory: joint_positions: - - 0 - -1.57 - 1.36 - 0 - 0 - 0 - - 0.12 - -1.57 - 1.36 - 0 - 0 - 0 - - 0.24 - -1.57 - 1.36 - 0 - 0 - 0 - - 0.36 - -1.57 - 1.36 - 0 - 0 - 0 - - 0.48 - -1.57 - 1.36 - 0 - 0 - 0 - - 0.6 - -1.57 - 1.36 - 0 - 0 - 0 times: - 0 - 0.1 - 0.2 - 0.3 - 0.4 - 0.5 locations: - 0 - 0.2 - 0.4 - 0.6 - 0.8 - 1 blending: blending_name: BlendingPosition position_zone_radius: 50 - trajectory: joint_positions: - - 0.6 - -1.57 - 1.36 - 0 - 0 - 0 - - 0.6 - -1.496 - 1.288 - 0 - 0 - 0 - - 0.6 - -1.422 - 1.216 - 0 - 0 - 0 - - 0.6 - -1.348 - 1.144 - 0 - 0 - 0 - - 0.6 - -1.274 - 1.072 - 0 - 0 - 0 - - 0.6 - -1.2 - 1 - 0 - 0 - 0 times: - 0 - 0.1 - 0.2 - 0.3 - 0.4 - 0.5 locations: - 0 - 0.2 - 0.4 - 0.6 - 0.8 - 1 blending: blending_name: BlendingPosition position_zone_radius: 50 - trajectory: joint_positions: - - 0.6 - -1.2 - 1 - 0 - 0 - 0 - - 0.48 - -1.274 - 1.072 - 0 - 0 - 0 - - 0.36 - -1.348 - 1.144 - 0 - 0 - 0 - - 0.24 - -1.422 - 1.216 - 0 - 0 - 0 - - 0.12 - -1.496 - 1.288 - 0 - 0 - 0 - - 0 - -1.57 - 1.36 - 0 - 0 - 0 times: - 0 - 0.1 - 0.2 - 0.3 - 0.4 - 0.5 locations: - 0 - 0.2 - 0.4 - 0.6 - 0.8 - 1 InverseKinematicsRequest_UR5e: value: motion_group_model: UniversalRobots_UR5e mounting: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 tcp_offset: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 joint_position_limits: - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 - lower_limit: -2.8623399732707004 upper_limit: 2.8623399732707004 - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 tcp_poses: - position: - 400 - 0 - 100 orientation: - 0 - 0 - 0 - position: - 400 - 0 - 150 orientation: - 0 - 0 - 0 ConfiguredPoseInverseRequest_UR5e: value: motion_group_model: UniversalRobots_UR5e tcp_poses: - pose: position: - 400 - 0 - 400 orientation: - 0 - 3.141592653589793 - 0 kinematic_configuration: kinematic_branch: wrist_branch: FLIP elbow_branch: DOWN shoulder_branch: FRONT - pose: position: - 350 - 150 - 500 orientation: - 0 - 3.141592653589793 - 0 kinematic_configuration: kinematic_branch: wrist_branch: NO_FLIP elbow_branch: UP shoulder_branch: FRONT - pose: position: - 450 - -100 - 300 orientation: - 0 - 3.141592653589793 - 0 kinematic_configuration: kinematic_branch: wrist_branch: FLIP elbow_branch: DOWN shoulder_branch: FRONT ConvertVendorConfiguredPoseRequest_ABB: value: vendor_configured_poses: - pose: x: 600 'y': 0 z: 800 q1: 0 q2: 0 q3: 1 q4: 0 confdata: cf1: 0 cf4: 0 cf6: 0 cfx: 1 - pose: x: 600 'y': 200 z: 700 q1: 0 q2: 0 q3: 1 q4: 0 confdata: cf1: 0 cf4: 0 cf6: 0 cfx: 6 - pose: x: 500 'y': -150 z: 900 q1: 0 q2: 0 q3: 1 q4: 0 confdata: cf1: -1 cf4: 0 cf6: -1 cfx: 2 ForwardKinematicsRequest_UR5e: value: motion_group_model: UniversalRobots_UR5e joint_positions: - - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0.1 ProjectJointPositionDirectionConstraintRequest_UR5e: value: motion_group_model: UniversalRobots_UR5e mounting: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 tcp_offset: position: - 0 - 0 - 0 orientation: - 0 - 0 - 0 joint_position_limits: - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 - lower_limit: -2.8623399732707004 upper_limit: 2.8623399732707004 - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 - lower_limit: -6.284930636431581 upper_limit: 6.284930636431581 joint_positions: - - 0 - 0 - 0 - 0 - 0 - 0 - - 0 - 0 - 0 - 0 - 0 - 0.1 constraint: constraint_name: DirectionConstraint world: - 0 - 0 - 1 tcp: - 0 - 0 - -1 tolerance: 0.00001 responses: NotFound: description: Specified resource could not be found. content: application/json: schema: $ref: '#/components/schemas/Error' PreconditionFailed: description: Request violated precondition(s) and could not be processed. content: application/json: schema: $ref: '#/components/schemas/Error' BadRequest: description: | The request was invalid or couldn't be sent due to other reasons. Client side error, e.g., malformed request syntax, invalid request parameters, or invalid content. content: application/json: schema: $ref: '#/components/schemas/Error' TooManyRequests: description: | Too many requests sent in a given amount of time. The client needs to wait before sending additional requests. content: application/json: schema: $ref: '#/components/schemas/Error' NotImplemented: description: | Server does not recognize the request method or lacks the functionality to fulfil it. content: application/json: schema: $ref: '#/components/schemas/Error' headers: Content-Type: explode: false style: simple schema: type: string Content-Length: explode: false style: simple schema: type: integer minimum: 0 Last-Modified: explode: false style: simple schema: type: string format: date-time Metadata: explode: false style: simple schema: $ref: '#/components/schemas/MetadataObject'