wandelbots-api-client 25.6.0.dev7__py3-none-any.whl → 25.10.0rc2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wandelbots_api_client/__init__.py +2 -3
- wandelbots_api_client/api/__init__.py +2 -0
- wandelbots_api_client/api/application_api.py +1 -2
- wandelbots_api_client/api/cell_api.py +1 -2
- wandelbots_api_client/api/controller_api.py +13 -8
- wandelbots_api_client/api/controller_ios_api.py +3 -6
- wandelbots_api_client/api/coordinate_systems_api.py +1 -2
- wandelbots_api_client/api/device_configuration_api.py +1 -2
- wandelbots_api_client/api/library_program_api.py +1 -2
- wandelbots_api_client/api/library_program_metadata_api.py +1 -2
- wandelbots_api_client/api/library_recipe_api.py +1 -2
- wandelbots_api_client/api/library_recipe_metadata_api.py +1 -2
- wandelbots_api_client/api/license_api.py +1 -2
- wandelbots_api_client/api/motion_api.py +59 -8
- wandelbots_api_client/api/motion_group_api.py +1 -2
- wandelbots_api_client/api/motion_group_infos_api.py +3 -2
- wandelbots_api_client/api/motion_group_jogging_api.py +53 -8
- wandelbots_api_client/api/motion_group_kinematic_api.py +1 -2
- wandelbots_api_client/api/program_api.py +1 -2
- wandelbots_api_client/api/program_operator_api.py +1 -2
- wandelbots_api_client/api/program_values_api.py +1 -2
- wandelbots_api_client/api/store_collision_components_api.py +10 -8
- wandelbots_api_client/api/store_collision_scenes_api.py +1 -2
- wandelbots_api_client/api/store_object_api.py +1 -2
- wandelbots_api_client/api/system_api.py +1 -2
- wandelbots_api_client/api/version_api.py +284 -0
- wandelbots_api_client/api/virtual_robot_api.py +1 -2
- wandelbots_api_client/api/virtual_robot_behavior_api.py +27 -5
- wandelbots_api_client/api/virtual_robot_mode_api.py +1 -2
- wandelbots_api_client/api/virtual_robot_setup_api.py +16 -17
- wandelbots_api_client/api_client.py +14 -7
- wandelbots_api_client/authorization.py +244 -0
- wandelbots_api_client/configuration.py +18 -7
- wandelbots_api_client/exceptions.py +1 -1
- wandelbots_api_client/models/__init__.py +3 -4
- wandelbots_api_client/models/abb_controller.py +5 -5
- wandelbots_api_client/models/abb_controller_egm_server.py +3 -3
- wandelbots_api_client/models/activate_license_request.py +2 -2
- wandelbots_api_client/models/add_request.py +3 -3
- wandelbots_api_client/models/all_joint_positions_request.py +3 -3
- wandelbots_api_client/models/all_joint_positions_response.py +2 -2
- wandelbots_api_client/{v2/models/error2.py → models/api_version.py} +10 -10
- wandelbots_api_client/models/app.py +8 -8
- wandelbots_api_client/models/array_input.py +2 -2
- wandelbots_api_client/models/array_output.py +2 -2
- wandelbots_api_client/models/behavior.py +1 -1
- wandelbots_api_client/models/blending_auto.py +3 -3
- wandelbots_api_client/models/blending_position.py +3 -3
- wandelbots_api_client/models/box.py +5 -5
- wandelbots_api_client/models/box2.py +6 -6
- wandelbots_api_client/models/box3.py +6 -6
- wandelbots_api_client/models/capsule.py +3 -3
- wandelbots_api_client/models/capsule2.py +4 -4
- wandelbots_api_client/models/capsule3.py +4 -4
- wandelbots_api_client/models/capture.py +2 -2
- wandelbots_api_client/models/cell.py +4 -4
- wandelbots_api_client/models/circle.py +3 -3
- wandelbots_api_client/models/code_with_arguments.py +7 -6
- wandelbots_api_client/models/collection_value.py +1 -1
- wandelbots_api_client/models/collider.py +4 -4
- wandelbots_api_client/models/collider_input.py +4 -4
- wandelbots_api_client/models/collider_output.py +4 -4
- wandelbots_api_client/models/collider_output_shape.py +1 -1
- wandelbots_api_client/models/collider_shape.py +1 -41
- wandelbots_api_client/models/collision.py +7 -7
- wandelbots_api_client/models/collision_contact.py +3 -3
- wandelbots_api_client/models/collision_motion_group.py +7 -6
- wandelbots_api_client/models/collision_motion_group_assembly.py +9 -8
- wandelbots_api_client/models/collision_robot_configuration_input.py +12 -10
- wandelbots_api_client/models/collision_robot_configuration_output.py +12 -10
- wandelbots_api_client/models/collision_scene.py +11 -9
- wandelbots_api_client/models/collision_scene_assembly.py +14 -12
- wandelbots_api_client/models/command.py +7 -7
- wandelbots_api_client/models/command_settings.py +4 -4
- wandelbots_api_client/models/comparator.py +1 -1
- wandelbots_api_client/models/compound.py +2 -2
- wandelbots_api_client/models/container_environment_inner.py +3 -3
- wandelbots_api_client/models/container_image.py +4 -4
- wandelbots_api_client/models/container_image_secrets_inner.py +2 -2
- wandelbots_api_client/models/container_resources.py +2 -2
- wandelbots_api_client/models/container_storage.py +3 -3
- wandelbots_api_client/models/controller_capabilities.py +3 -3
- wandelbots_api_client/models/controller_instance.py +9 -9
- wandelbots_api_client/models/controller_instance_list.py +2 -2
- wandelbots_api_client/models/convex_hull.py +2 -2
- wandelbots_api_client/models/convex_hull2.py +3 -3
- wandelbots_api_client/models/convex_hull3.py +3 -3
- wandelbots_api_client/models/coordinate_system.py +6 -6
- wandelbots_api_client/models/coordinate_systems.py +2 -2
- wandelbots_api_client/models/create_device_request_inner.py +1 -1
- wandelbots_api_client/models/create_program_run200_response.py +2 -2
- wandelbots_api_client/models/create_program_run_request.py +2 -2
- wandelbots_api_client/models/create_trigger200_response.py +2 -2
- wandelbots_api_client/models/create_trigger_request.py +7 -7
- wandelbots_api_client/models/cubic_spline.py +2 -2
- wandelbots_api_client/models/cubic_spline_cubic_spline_parameter.py +3 -3
- wandelbots_api_client/models/cubic_spline_parameter.py +3 -3
- wandelbots_api_client/models/cycle_time.py +2 -2
- wandelbots_api_client/models/cylinder.py +3 -3
- wandelbots_api_client/models/cylinder2.py +4 -4
- wandelbots_api_client/models/cylinder3.py +4 -4
- wandelbots_api_client/models/dh_parameter.py +6 -6
- wandelbots_api_client/models/direction.py +1 -1
- wandelbots_api_client/models/direction_jogging_request.py +10 -10
- wandelbots_api_client/models/error.py +3 -3
- wandelbots_api_client/models/execute_trajectory_request.py +1 -1
- wandelbots_api_client/models/execute_trajectory_response.py +1 -1
- wandelbots_api_client/models/execution_result.py +4 -4
- wandelbots_api_client/models/external_joint_stream_datapoint.py +3 -3
- wandelbots_api_client/models/external_joint_stream_datapoint_value.py +5 -5
- wandelbots_api_client/models/fanuc_controller.py +3 -3
- wandelbots_api_client/models/feedback_collision.py +5 -5
- wandelbots_api_client/models/feedback_joint_limit_exceeded.py +4 -4
- wandelbots_api_client/models/feedback_out_of_workspace.py +3 -3
- wandelbots_api_client/models/feedback_singularity.py +4 -4
- wandelbots_api_client/models/flag.py +2 -2
- wandelbots_api_client/models/force_vector.py +4 -4
- wandelbots_api_client/models/geometry.py +12 -12
- wandelbots_api_client/models/get_all_program_runs200_response.py +2 -2
- wandelbots_api_client/models/get_all_triggers200_response.py +2 -2
- wandelbots_api_client/models/get_mode_response.py +2 -2
- wandelbots_api_client/models/get_trajectory_response.py +2 -2
- wandelbots_api_client/models/get_trajectory_sample_response.py +2 -2
- wandelbots_api_client/models/google_protobuf_any.py +2 -2
- wandelbots_api_client/models/http_exception_response.py +2 -2
- wandelbots_api_client/models/http_validation_error.py +2 -2
- wandelbots_api_client/models/http_validation_error2.py +2 -2
- wandelbots_api_client/models/image_credentials.py +4 -4
- wandelbots_api_client/models/info_service_capabilities.py +8 -8
- wandelbots_api_client/models/initialize_movement_request.py +6 -6
- wandelbots_api_client/models/initialize_movement_response.py +2 -2
- wandelbots_api_client/models/initialize_movement_response_init_response.py +3 -3
- wandelbots_api_client/models/io.py +6 -6
- wandelbots_api_client/models/io_description.py +10 -10
- wandelbots_api_client/models/io_value.py +5 -5
- wandelbots_api_client/models/ios.py +2 -2
- wandelbots_api_client/models/jogging_response.py +4 -4
- wandelbots_api_client/models/jogging_service_capabilities.py +3 -3
- wandelbots_api_client/models/joint_jogging_request.py +6 -6
- wandelbots_api_client/models/joint_limit.py +5 -5
- wandelbots_api_client/models/joint_limit_exceeded.py +3 -3
- wandelbots_api_client/models/joint_position_request.py +4 -4
- wandelbots_api_client/models/joint_trajectory.py +4 -4
- wandelbots_api_client/models/joints.py +2 -2
- wandelbots_api_client/models/kinematic_service_capabilities.py +4 -4
- wandelbots_api_client/models/kuka_controller.py +10 -8
- wandelbots_api_client/models/kuka_controller_rsi_server.py +3 -3
- wandelbots_api_client/models/license.py +11 -11
- wandelbots_api_client/models/license_status.py +3 -3
- wandelbots_api_client/models/license_status_enum.py +1 -1
- wandelbots_api_client/models/limit_settings.py +13 -13
- wandelbots_api_client/models/limits_override.py +7 -7
- wandelbots_api_client/models/list_devices200_response_inner.py +1 -1
- wandelbots_api_client/models/list_io_descriptions_response.py +2 -2
- wandelbots_api_client/models/list_io_values_response.py +2 -2
- wandelbots_api_client/models/list_payloads_response.py +2 -2
- wandelbots_api_client/models/list_program_metadata_response.py +2 -2
- wandelbots_api_client/models/list_recipe_metadata_response.py +2 -2
- wandelbots_api_client/models/list_response.py +2 -2
- wandelbots_api_client/models/list_tcps_response.py +2 -2
- wandelbots_api_client/models/manufacturer.py +1 -1
- wandelbots_api_client/models/mode_change_response.py +5 -5
- wandelbots_api_client/models/motion_command.py +4 -4
- wandelbots_api_client/models/motion_command_blending.py +1 -1
- wandelbots_api_client/models/motion_command_path.py +1 -1
- wandelbots_api_client/models/motion_group_behavior_getter.py +2 -2
- wandelbots_api_client/models/motion_group_info.py +4 -4
- wandelbots_api_client/models/motion_group_infos.py +2 -2
- wandelbots_api_client/models/motion_group_instance.py +6 -6
- wandelbots_api_client/models/motion_group_instance_list.py +2 -2
- wandelbots_api_client/models/motion_group_joints.py +5 -5
- wandelbots_api_client/models/motion_group_physical.py +6 -6
- wandelbots_api_client/models/motion_group_specification.py +3 -3
- wandelbots_api_client/models/motion_group_state.py +13 -13
- wandelbots_api_client/models/motion_group_state_joint_limit_reached.py +2 -2
- wandelbots_api_client/models/motion_group_state_response.py +3 -3
- wandelbots_api_client/models/motion_id.py +2 -2
- wandelbots_api_client/models/motion_ids_list_response.py +2 -2
- wandelbots_api_client/models/motion_vector.py +4 -4
- wandelbots_api_client/models/mounting.py +3 -3
- wandelbots_api_client/models/move_request.py +9 -9
- wandelbots_api_client/models/move_response.py +3 -3
- wandelbots_api_client/models/move_to_trajectory_via_joint_ptp_request.py +5 -5
- wandelbots_api_client/models/movement.py +2 -2
- wandelbots_api_client/models/movement_error.py +2 -2
- wandelbots_api_client/models/movement_error_error.py +2 -2
- wandelbots_api_client/models/movement_movement.py +4 -4
- wandelbots_api_client/models/op_mode.py +2 -2
- wandelbots_api_client/models/opcua_node_value_trigger_config.py +4 -4
- wandelbots_api_client/models/opcua_node_value_trigger_config_node_value.py +1 -1
- wandelbots_api_client/models/optimizer_setup.py +8 -8
- wandelbots_api_client/models/out_of_workspace.py +2 -2
- wandelbots_api_client/models/path.py +2 -2
- wandelbots_api_client/models/path_cartesian_ptp.py +3 -3
- wandelbots_api_client/models/path_circle.py +4 -4
- wandelbots_api_client/models/path_cubic_spline.py +3 -3
- wandelbots_api_client/models/path_joint_ptp.py +3 -3
- wandelbots_api_client/models/path_line.py +3 -3
- wandelbots_api_client/models/pause_movement_request.py +3 -3
- wandelbots_api_client/models/pause_movement_response.py +2 -2
- wandelbots_api_client/models/pause_movement_response_pause_response.py +3 -3
- wandelbots_api_client/models/pause_on_io.py +3 -3
- wandelbots_api_client/models/payload.py +5 -5
- wandelbots_api_client/models/plan_collision_free_ptp_request.py +10 -9
- wandelbots_api_client/models/plan_collision_free_ptp_request_target.py +1 -1
- wandelbots_api_client/models/plan_failed_on_trajectory_response.py +10 -10
- wandelbots_api_client/models/plan_failed_response.py +8 -8
- wandelbots_api_client/models/plan_request.py +6 -6
- wandelbots_api_client/models/plan_response.py +4 -4
- wandelbots_api_client/models/plan_successful_response.py +3 -3
- wandelbots_api_client/models/plan_trajectory_failed_response.py +4 -4
- wandelbots_api_client/models/plan_trajectory_failed_response_error_feedback.py +1 -1
- wandelbots_api_client/models/plan_trajectory_request.py +10 -9
- wandelbots_api_client/models/plan_trajectory_response.py +2 -2
- wandelbots_api_client/models/plan_trajectory_response_response.py +1 -1
- wandelbots_api_client/models/plane2.py +2 -2
- wandelbots_api_client/models/plane3.py +2 -2
- wandelbots_api_client/models/planned_motion.py +6 -6
- wandelbots_api_client/models/planner_pose.py +3 -3
- wandelbots_api_client/models/planning_limits.py +13 -13
- wandelbots_api_client/models/planning_limits_limit_range.py +3 -3
- wandelbots_api_client/models/playback_speed_request.py +3 -3
- wandelbots_api_client/models/playback_speed_response.py +2 -2
- wandelbots_api_client/models/playback_speed_response_playback_speed_response.py +2 -2
- wandelbots_api_client/models/point_cloud.py +2 -2
- wandelbots_api_client/models/pose.py +4 -4
- wandelbots_api_client/models/pose2.py +3 -3
- wandelbots_api_client/models/program_metadata.py +7 -7
- wandelbots_api_client/models/program_run.py +15 -14
- wandelbots_api_client/models/program_run_object.py +7 -7
- wandelbots_api_client/models/program_run_state.py +1 -1
- wandelbots_api_client/models/program_runner_reference.py +3 -3
- wandelbots_api_client/models/pyjectory_datatypes_core_pose.py +3 -3
- wandelbots_api_client/models/pyjectory_datatypes_serializer_orientation.py +2 -2
- wandelbots_api_client/models/pyjectory_datatypes_serializer_pose.py +2 -2
- wandelbots_api_client/models/pyjectory_datatypes_serializer_position.py +2 -2
- wandelbots_api_client/models/pyriphery_etcd_etcd_configuration.py +5 -5
- wandelbots_api_client/models/pyriphery_hardware_isaac_isaac_configuration.py +5 -5
- wandelbots_api_client/models/pyriphery_opcua_opcua_configuration.py +4 -4
- wandelbots_api_client/models/pyriphery_pyrae_controller_controller_configuration.py +7 -7
- wandelbots_api_client/models/pyriphery_pyrae_robot_robot_configuration.py +8 -8
- wandelbots_api_client/models/pyriphery_robotics_configurable_collision_scene_configurable_collision_scene_configuration_input.py +13 -11
- wandelbots_api_client/models/pyriphery_robotics_configurable_collision_scene_configurable_collision_scene_configuration_output.py +13 -11
- wandelbots_api_client/models/pyriphery_robotics_robotcell_timer_configuration.py +3 -3
- wandelbots_api_client/models/pyriphery_robotics_simulation_robot_with_view_open3d_configuration.py +4 -4
- wandelbots_api_client/models/pyriphery_robotics_simulation_simulated_io_configuration.py +3 -3
- wandelbots_api_client/models/pyriphery_robotics_simulation_simulated_opcua_configuration.py +3 -3
- wandelbots_api_client/models/quaternion.py +5 -5
- wandelbots_api_client/models/recipe_metadata.py +8 -8
- wandelbots_api_client/models/rectangle.py +3 -3
- wandelbots_api_client/models/rectangle2.py +4 -4
- wandelbots_api_client/models/rectangle3.py +4 -4
- wandelbots_api_client/models/rectangular_capsule.py +4 -4
- wandelbots_api_client/models/rectangular_capsule2.py +5 -5
- wandelbots_api_client/models/rectangular_capsule3.py +5 -5
- wandelbots_api_client/models/release_channel.py +1 -1
- wandelbots_api_client/models/request.py +1 -1
- wandelbots_api_client/models/request1.py +1 -1
- wandelbots_api_client/models/response_get_value_programs_values_key_get.py +1 -1
- wandelbots_api_client/models/response_get_values_programs_values_get_value.py +1 -1
- wandelbots_api_client/models/robot_controller.py +3 -3
- wandelbots_api_client/models/robot_controller_configuration.py +1 -1
- wandelbots_api_client/models/robot_controller_state.py +8 -8
- wandelbots_api_client/models/robot_link_geometry.py +3 -3
- wandelbots_api_client/models/robot_state.py +3 -3
- wandelbots_api_client/models/robot_system_mode.py +1 -1
- wandelbots_api_client/models/robot_tcp.py +5 -5
- wandelbots_api_client/models/robot_tcps.py +2 -2
- wandelbots_api_client/models/rotation_angle_types.py +1 -1
- wandelbots_api_client/models/rotation_angles.py +3 -3
- wandelbots_api_client/models/safety_configuration.py +6 -6
- wandelbots_api_client/models/safety_setup.py +5 -5
- wandelbots_api_client/models/safety_setup_safety_settings.py +3 -3
- wandelbots_api_client/models/safety_setup_safety_zone.py +5 -5
- wandelbots_api_client/models/safety_zone.py +4 -4
- wandelbots_api_client/models/safety_zone_limits.py +3 -3
- wandelbots_api_client/models/safety_zone_violation.py +2 -2
- wandelbots_api_client/models/service_status.py +3 -3
- wandelbots_api_client/models/service_status_phase.py +1 -1
- wandelbots_api_client/models/service_status_severity.py +1 -1
- wandelbots_api_client/models/service_status_status.py +4 -4
- wandelbots_api_client/models/set_io.py +3 -3
- wandelbots_api_client/models/set_playback_speed.py +3 -3
- wandelbots_api_client/models/single_joint_limit.py +3 -3
- wandelbots_api_client/models/singularity.py +3 -3
- wandelbots_api_client/models/singularity_type_enum.py +1 -1
- wandelbots_api_client/models/sphere.py +2 -2
- wandelbots_api_client/models/sphere2.py +3 -3
- wandelbots_api_client/models/sphere3.py +3 -3
- wandelbots_api_client/models/standstill.py +2 -2
- wandelbots_api_client/models/standstill_reason.py +1 -1
- wandelbots_api_client/models/standstill_standstill.py +4 -4
- wandelbots_api_client/models/start_movement_request.py +6 -6
- wandelbots_api_client/models/start_on_io.py +3 -3
- wandelbots_api_client/models/status.py +4 -4
- wandelbots_api_client/models/stop_response.py +4 -4
- wandelbots_api_client/models/store_value.py +1 -1
- wandelbots_api_client/models/stream_move_backward.py +2 -2
- wandelbots_api_client/models/stream_move_forward.py +2 -2
- wandelbots_api_client/models/stream_move_playback_speed.py +2 -2
- wandelbots_api_client/models/stream_move_request.py +1 -1
- wandelbots_api_client/models/stream_move_response.py +4 -4
- wandelbots_api_client/models/stream_move_to_trajectory.py +2 -2
- wandelbots_api_client/models/stream_stop.py +2 -2
- wandelbots_api_client/models/tcp_pose.py +5 -5
- wandelbots_api_client/models/tcp_pose_request.py +5 -5
- wandelbots_api_client/models/tool_geometry.py +3 -3
- wandelbots_api_client/models/trajectory_sample.py +12 -12
- wandelbots_api_client/models/trigger_object.py +11 -11
- wandelbots_api_client/models/trigger_type.py +1 -1
- wandelbots_api_client/models/universalrobots_controller.py +3 -3
- wandelbots_api_client/models/update_nova_version_request.py +2 -2
- wandelbots_api_client/models/update_program_metadata_request.py +4 -4
- wandelbots_api_client/models/update_recipe_metadata_request.py +4 -4
- wandelbots_api_client/models/update_trigger_request.py +6 -6
- wandelbots_api_client/models/validation_error.py +4 -4
- wandelbots_api_client/models/validation_error2.py +4 -4
- wandelbots_api_client/models/validation_error2_loc_inner.py +1 -1
- wandelbots_api_client/models/validation_error_loc_inner.py +1 -1
- wandelbots_api_client/models/value.py +1 -1
- wandelbots_api_client/models/vector3d.py +4 -4
- wandelbots_api_client/models/version_number.py +9 -9
- wandelbots_api_client/models/virtual_controller.py +7 -7
- wandelbots_api_client/models/virtual_controller_types.py +17 -2
- wandelbots_api_client/models/virtual_robot_configuration.py +3 -3
- wandelbots_api_client/models/yaskawa_controller.py +3 -3
- wandelbots_api_client/rest.py +3 -2
- wandelbots_api_client/v2/__init__.py +3 -4
- wandelbots_api_client/v2/api/__init__.py +16 -16
- wandelbots_api_client/v2/api/application_api.py +11 -12
- wandelbots_api_client/v2/api/bus_inputs_outputs_api.py +4555 -0
- wandelbots_api_client/v2/api/cell_api.py +8 -9
- wandelbots_api_client/v2/api/controller_api.py +206 -202
- wandelbots_api_client/v2/api/controller_inputs_outputs_api.py +45 -44
- wandelbots_api_client/v2/api/jogging_api.py +33 -11
- wandelbots_api_client/v2/api/kinematics_api.py +636 -0
- wandelbots_api_client/v2/api/license_api.py +8 -9
- wandelbots_api_client/v2/api/motion_group_api.py +61 -31
- wandelbots_api_client/v2/api/motion_group_models_api.py +557 -0
- wandelbots_api_client/v2/api/program_api.py +167 -1308
- wandelbots_api_client/v2/api/store_collision_components_api.py +823 -50
- wandelbots_api_client/v2/api/store_collision_setups_api.py +1404 -0
- wandelbots_api_client/v2/api/store_object_api.py +11 -12
- wandelbots_api_client/v2/api/system_api.py +282 -18
- wandelbots_api_client/v2/api/trajectory_caching_api.py +94 -20
- wandelbots_api_client/v2/api/trajectory_execution_api.py +33 -11
- wandelbots_api_client/v2/api/trajectory_planning_api.py +68 -323
- wandelbots_api_client/v2/api/{inverse_kinematics_api.py → version_api.py} +24 -81
- wandelbots_api_client/v2/api/virtual_controller_api.py +4565 -0
- wandelbots_api_client/v2/api/virtual_controller_behavior_api.py +982 -0
- wandelbots_api_client/v2/api/virtual_controller_inputs_outputs_api.py +1003 -0
- wandelbots_api_client/v2/api_client.py +15 -8
- wandelbots_api_client/v2/configuration.py +19 -8
- wandelbots_api_client/v2/exceptions.py +2 -2
- wandelbots_api_client/v2/models/__init__.py +210 -159
- wandelbots_api_client/v2/models/abb_controller.py +8 -11
- wandelbots_api_client/v2/models/abb_controller_egm_server.py +4 -4
- wandelbots_api_client/v2/models/activate_license_request.py +3 -3
- wandelbots_api_client/v2/models/add_trajectory_error.py +5 -5
- wandelbots_api_client/v2/models/add_trajectory_error_data.py +66 -66
- wandelbots_api_client/v2/models/add_trajectory_request.py +5 -5
- wandelbots_api_client/v2/models/add_trajectory_response.py +4 -4
- wandelbots_api_client/v2/models/{jogging_error_response_error.py → api_version.py} +9 -9
- wandelbots_api_client/v2/models/app.py +19 -11
- wandelbots_api_client/v2/models/behavior.py +3 -3
- wandelbots_api_client/v2/models/blending_auto.py +6 -5
- wandelbots_api_client/v2/models/blending_position.py +4 -4
- wandelbots_api_client/v2/models/boolean_value.py +7 -10
- wandelbots_api_client/v2/models/box.py +7 -7
- wandelbots_api_client/v2/models/{program_run_object.py → bus_io_description.py} +31 -20
- wandelbots_api_client/v2/models/{jogging_error_response.py → bus_io_modbus_client.py} +23 -14
- wandelbots_api_client/v2/models/bus_io_modbus_server.py +115 -0
- wandelbots_api_client/v2/models/bus_io_modbus_tcp_client.py +106 -0
- wandelbots_api_client/v2/models/bus_io_modbus_tcp_server.py +104 -0
- wandelbots_api_client/v2/models/{movement_error_error.py → bus_io_modbus_virtual.py} +17 -10
- wandelbots_api_client/v2/models/bus_io_profinet.py +114 -0
- wandelbots_api_client/v2/models/{motion_group_behavior_getter.py → bus_io_profinet_default_route.py} +12 -11
- wandelbots_api_client/v2/models/bus_io_profinet_ip_config.py +95 -0
- wandelbots_api_client/v2/models/{update_trigger_request.py → bus_io_profinet_network.py} +18 -18
- wandelbots_api_client/v2/models/bus_io_profinet_virtual.py +98 -0
- wandelbots_api_client/v2/models/bus_io_type.py +212 -0
- wandelbots_api_client/v2/models/{create_trigger200_response.py → bus_ios_state.py} +12 -9
- wandelbots_api_client/v2/models/bus_ios_state_enum.py +39 -0
- wandelbots_api_client/v2/models/capsule.py +5 -5
- wandelbots_api_client/v2/models/{robot_state.py → cartesian_limits.py} +15 -15
- wandelbots_api_client/v2/models/cell.py +7 -7
- wandelbots_api_client/v2/models/collider.py +5 -5
- wandelbots_api_client/v2/models/collider_shape.py +2 -42
- wandelbots_api_client/v2/models/collision.py +11 -11
- wandelbots_api_client/v2/models/collision_contact.py +6 -6
- wandelbots_api_client/v2/models/{collision2.py → collision_error.py} +7 -7
- wandelbots_api_client/v2/models/collision_free_algorithm.py +155 -0
- wandelbots_api_client/v2/models/{collision_motion_group_assembly.py → collision_setup.py} +32 -18
- wandelbots_api_client/v2/models/comparator.py +2 -2
- wandelbots_api_client/v2/models/configuration_archive_status.py +174 -0
- wandelbots_api_client/v2/models/{joints.py → configuration_archive_status_creating.py} +20 -10
- wandelbots_api_client/v2/models/configuration_archive_status_error.py +100 -0
- wandelbots_api_client/v2/models/configuration_archive_status_success.py +98 -0
- wandelbots_api_client/v2/models/configuration_resource.py +5 -5
- wandelbots_api_client/v2/models/container_environment_inner.py +4 -4
- wandelbots_api_client/v2/models/container_image.py +5 -5
- wandelbots_api_client/v2/models/container_image_secrets_inner.py +3 -3
- wandelbots_api_client/v2/models/{create_program_operator_run200_response.py → container_resources.py} +12 -9
- wandelbots_api_client/v2/models/container_storage.py +4 -4
- wandelbots_api_client/v2/models/{create_trigger_request.py → controller_description.py} +16 -21
- wandelbots_api_client/v2/models/convex_hull.py +4 -4
- wandelbots_api_client/v2/models/coordinate_system.py +11 -11
- wandelbots_api_client/v2/models/coordinate_system_data.py +101 -0
- wandelbots_api_client/v2/models/cubic_spline_parameter.py +4 -4
- wandelbots_api_client/v2/models/cycle_time.py +5 -4
- wandelbots_api_client/v2/models/cylinder.py +5 -5
- wandelbots_api_client/v2/models/dh_parameter.py +7 -7
- wandelbots_api_client/v2/models/direction.py +2 -2
- wandelbots_api_client/v2/models/error.py +4 -4
- wandelbots_api_client/v2/models/{jogging_paused_collision.py → error_invalid_joint_count.py} +21 -14
- wandelbots_api_client/v2/models/error_joint_limit_exceeded.py +103 -0
- wandelbots_api_client/v2/models/{coordinate_systems.py → error_joint_position_collision.py} +30 -19
- wandelbots_api_client/v2/models/error_max_iterations_exceeded.py +100 -0
- wandelbots_api_client/v2/models/execute.py +97 -0
- wandelbots_api_client/v2/models/{set_io_values_request_inner.py → execute_details.py} +47 -43
- wandelbots_api_client/v2/models/execute_jogging_request.py +52 -10
- wandelbots_api_client/v2/models/execute_jogging_response.py +87 -26
- wandelbots_api_client/v2/models/execute_trajectory_request.py +30 -2
- wandelbots_api_client/v2/models/execute_trajectory_response.py +61 -42
- wandelbots_api_client/v2/models/external_joint_stream_datapoint.py +6 -6
- wandelbots_api_client/v2/models/{robot_tcps.py → external_joint_stream_request.py} +17 -17
- wandelbots_api_client/v2/models/fanuc_controller.py +6 -9
- wandelbots_api_client/v2/models/feedback_collision.py +6 -6
- wandelbots_api_client/v2/models/feedback_joint_limit_exceeded.py +7 -6
- wandelbots_api_client/v2/models/feedback_out_of_workspace.py +4 -4
- wandelbots_api_client/v2/models/feedback_singularity.py +5 -5
- wandelbots_api_client/v2/models/flag.py +3 -3
- wandelbots_api_client/v2/models/float_value.py +8 -11
- wandelbots_api_client/v2/models/{get_all_triggers200_response.py → forward_kinematics422_response.py} +17 -17
- wandelbots_api_client/v2/models/forward_kinematics_request.py +104 -0
- wandelbots_api_client/v2/models/{controllers_list.py → forward_kinematics_response.py} +18 -18
- wandelbots_api_client/v2/models/{list_coordinate_systems_response.py → forward_kinematics_validation_error.py} +30 -18
- wandelbots_api_client/v2/models/get_trajectory_response.py +5 -5
- wandelbots_api_client/v2/models/http_validation_error.py +5 -5
- wandelbots_api_client/v2/models/image_credentials.py +5 -5
- wandelbots_api_client/v2/models/{inconsitent_trajectory_size.py → inconsistent_trajectory_size_error.py} +9 -9
- wandelbots_api_client/v2/models/{inconsitent_trajectory_size_inconsistent_trajectory_size.py → inconsistent_trajectory_size_error_inconsistent_trajectory_size.py} +9 -9
- wandelbots_api_client/v2/models/initialize_jogging_request.py +9 -16
- wandelbots_api_client/v2/models/initialize_jogging_response.py +17 -12
- wandelbots_api_client/v2/models/initialize_movement_request.py +7 -12
- wandelbots_api_client/v2/models/initialize_movement_request_trajectory.py +2 -2
- wandelbots_api_client/v2/models/initialize_movement_response.py +22 -11
- wandelbots_api_client/v2/models/integer_value.py +8 -11
- wandelbots_api_client/v2/models/{invalid_dof.py → invalid_dof_error.py} +9 -9
- wandelbots_api_client/v2/models/{invalid_dof_invalid_dof.py → invalid_dof_error_invalid_dof.py} +8 -8
- wandelbots_api_client/v2/models/{motion_group_infos.py → inverse_kinematics422_response.py} +18 -18
- wandelbots_api_client/v2/models/inverse_kinematics_request.py +51 -31
- wandelbots_api_client/v2/models/inverse_kinematics_response.py +3 -3
- wandelbots_api_client/v2/models/inverse_kinematics_validation_error.py +120 -0
- wandelbots_api_client/v2/models/inverse_kinematics_validation_error_all_of_data.py +155 -0
- wandelbots_api_client/v2/models/io_boolean_value.py +8 -11
- wandelbots_api_client/v2/models/{io_description_min.py → io_boundary.py} +10 -25
- wandelbots_api_client/v2/models/io_description.py +15 -15
- wandelbots_api_client/v2/models/io_direction.py +2 -2
- wandelbots_api_client/v2/models/io_float_value.py +9 -12
- wandelbots_api_client/v2/models/io_integer_value.py +9 -12
- wandelbots_api_client/v2/models/{trigger_type.py → io_origin.py} +7 -6
- wandelbots_api_client/v2/models/{set_output_values_request_inner.py → io_value.py} +10 -25
- wandelbots_api_client/v2/models/io_value_type.py +2 -2
- wandelbots_api_client/v2/models/{movement_movement.py → jogging_details.py} +21 -16
- wandelbots_api_client/v2/models/{jogging_state.py → jogging_details_state.py} +76 -43
- wandelbots_api_client/v2/models/{program_run_reference.py → jogging_paused_by_user.py} +17 -13
- wandelbots_api_client/v2/models/{jogging_paused_collision_paused_near_collision.py → jogging_paused_near_collision.py} +19 -10
- wandelbots_api_client/v2/models/{jogging_paused_joint_limit_paused_near_joint_limit.py → jogging_paused_near_joint_limit.py} +20 -10
- wandelbots_api_client/v2/models/jogging_paused_on_io.py +14 -7
- wandelbots_api_client/v2/models/jogging_running.py +14 -7
- wandelbots_api_client/v2/models/{joint_limit_exceeded.py → joint_limit_exceeded_error.py} +7 -7
- wandelbots_api_client/v2/models/joint_limits.py +101 -0
- wandelbots_api_client/v2/models/joint_trajectory.py +6 -23
- wandelbots_api_client/v2/models/joint_velocity_request.py +7 -14
- wandelbots_api_client/v2/models/joint_velocity_response.py +100 -0
- wandelbots_api_client/v2/models/kuka_controller.py +12 -13
- wandelbots_api_client/v2/models/kuka_controller_rsi_server.py +4 -4
- wandelbots_api_client/v2/models/license.py +12 -12
- wandelbots_api_client/v2/models/license_status.py +4 -4
- wandelbots_api_client/v2/models/license_status_enum.py +2 -2
- wandelbots_api_client/v2/models/{planning_limits_limit_range.py → limit_range.py} +8 -8
- wandelbots_api_client/v2/models/limit_set.py +129 -0
- wandelbots_api_client/v2/models/limits_override.py +8 -8
- wandelbots_api_client/v2/models/list_trajectories_response.py +3 -3
- wandelbots_api_client/v2/models/manufacturer.py +2 -2
- wandelbots_api_client/v2/models/midpoint_insertion_algorithm.py +101 -0
- wandelbots_api_client/v2/models/modbus_io.py +105 -0
- wandelbots_api_client/v2/models/modbus_io_area.py +40 -0
- wandelbots_api_client/v2/models/modbus_io_byte_order.py +40 -0
- wandelbots_api_client/v2/models/modbus_io_data.py +103 -0
- wandelbots_api_client/v2/models/modbus_io_type_enum.py +39 -0
- wandelbots_api_client/v2/models/motion_command.py +5 -5
- wandelbots_api_client/v2/models/motion_command_blending.py +2 -2
- wandelbots_api_client/v2/models/motion_command_path.py +2 -2
- wandelbots_api_client/v2/models/{planning_parameters.py → motion_group_description.py} +40 -35
- wandelbots_api_client/v2/models/motion_group_info.py +7 -6
- wandelbots_api_client/v2/models/motion_group_joints.py +6 -6
- wandelbots_api_client/v2/models/{robot_setup.py → motion_group_setup.py} +33 -35
- wandelbots_api_client/v2/models/motion_group_state.py +32 -44
- wandelbots_api_client/v2/models/motion_group_state_joint_limit_reached.py +3 -3
- wandelbots_api_client/v2/models/movement_error_response.py +100 -0
- wandelbots_api_client/v2/models/{nan_value.py → nan_value_error.py} +9 -9
- wandelbots_api_client/v2/models/{nan_value_nan_value.py → nan_value_error_nan_value.py} +6 -6
- wandelbots_api_client/v2/models/op_mode.py +3 -3
- wandelbots_api_client/v2/models/operating_state.py +2 -2
- wandelbots_api_client/v2/models/operation_limits.py +110 -0
- wandelbots_api_client/v2/models/operation_mode.py +2 -2
- wandelbots_api_client/v2/models/orientation_type.py +2 -2
- wandelbots_api_client/v2/models/path_cartesian_ptp.py +4 -4
- wandelbots_api_client/v2/models/path_circle.py +5 -5
- wandelbots_api_client/v2/models/path_cubic_spline.py +4 -4
- wandelbots_api_client/v2/models/path_joint_ptp.py +4 -4
- wandelbots_api_client/v2/models/path_line.py +4 -4
- wandelbots_api_client/v2/models/pause_jogging_request.py +98 -0
- wandelbots_api_client/v2/models/{initialize_jogging_response_init_response.py → pause_jogging_response.py} +19 -12
- wandelbots_api_client/v2/models/pause_movement_request.py +7 -12
- wandelbots_api_client/v2/models/pause_movement_response.py +17 -12
- wandelbots_api_client/v2/models/pause_on_io.py +11 -8
- wandelbots_api_client/v2/models/payload.py +6 -6
- wandelbots_api_client/v2/models/{http_validation_error2.py → plan422_response.py} +9 -9
- wandelbots_api_client/v2/models/{movement.py → plan_collision_free_failed_response.py} +13 -13
- wandelbots_api_client/v2/models/{jogging_response_jogging.py → plan_collision_free_request.py} +25 -21
- wandelbots_api_client/v2/models/{standstill.py → plan_collision_free_response.py} +13 -13
- wandelbots_api_client/{models/create_trigger_request_config.py → v2/models/plan_collision_free_response_response.py} +34 -20
- wandelbots_api_client/v2/models/plan_trajectory_failed_response.py +5 -5
- wandelbots_api_client/v2/models/plan_trajectory_failed_response_error_feedback.py +2 -2
- wandelbots_api_client/v2/models/plan_trajectory_request.py +11 -11
- wandelbots_api_client/v2/models/plan_trajectory_response.py +3 -3
- wandelbots_api_client/v2/models/plan_trajectory_response_response.py +2 -2
- wandelbots_api_client/v2/models/{get_all_program_operator_runs200_response.py → plan_validation_error.py} +30 -18
- wandelbots_api_client/v2/models/plan_validation_error_all_of_data.py +174 -0
- wandelbots_api_client/v2/models/plane.py +3 -3
- wandelbots_api_client/v2/models/playback_speed_request.py +7 -9
- wandelbots_api_client/v2/models/playback_speed_response.py +17 -12
- wandelbots_api_client/v2/models/pose.py +4 -4
- wandelbots_api_client/v2/models/profinet_description.py +120 -0
- wandelbots_api_client/v2/models/{opcua_node_value_trigger_config.py → profinet_input_output_config.py} +14 -17
- wandelbots_api_client/v2/models/profinet_io.py +104 -0
- wandelbots_api_client/v2/models/{program_request.py → profinet_io_data.py} +20 -39
- wandelbots_api_client/v2/models/profinet_io_direction.py +38 -0
- wandelbots_api_client/v2/models/profinet_io_type_enum.py +45 -0
- wandelbots_api_client/v2/models/{list_io_descriptions_response.py → profinet_slot_description.py} +23 -18
- wandelbots_api_client/v2/models/profinet_sub_slot_description.py +96 -0
- wandelbots_api_client/v2/models/program.py +109 -0
- wandelbots_api_client/v2/models/program_run.py +23 -35
- wandelbots_api_client/v2/models/program_run_state.py +8 -8
- wandelbots_api_client/v2/models/{jogging_paused_user_request.py → program_start_request.py} +10 -10
- wandelbots_api_client/v2/models/rectangle.py +5 -5
- wandelbots_api_client/v2/models/rectangular_capsule.py +6 -6
- wandelbots_api_client/v2/models/release_channel.py +2 -2
- wandelbots_api_client/v2/models/robot_controller.py +4 -4
- wandelbots_api_client/v2/models/robot_controller_configuration.py +2 -2
- wandelbots_api_client/v2/models/robot_controller_state.py +17 -11
- wandelbots_api_client/v2/models/robot_system_mode.py +8 -8
- wandelbots_api_client/v2/models/robot_tcp.py +10 -10
- wandelbots_api_client/v2/models/{motion_vector.py → robot_tcp_data.py} +16 -13
- wandelbots_api_client/v2/models/rrt_connect_algorithm.py +109 -0
- wandelbots_api_client/v2/models/safety_state_type.py +2 -2
- wandelbots_api_client/v2/models/service_group.py +2 -2
- wandelbots_api_client/v2/models/service_status.py +5 -5
- wandelbots_api_client/v2/models/service_status_phase.py +2 -2
- wandelbots_api_client/v2/models/service_status_response.py +4 -4
- wandelbots_api_client/v2/models/service_status_severity.py +2 -2
- wandelbots_api_client/v2/models/service_status_status.py +5 -5
- wandelbots_api_client/v2/models/{standstill_standstill.py → set_io.py} +17 -17
- wandelbots_api_client/v2/models/settable_robot_system_mode.py +2 -2
- wandelbots_api_client/v2/models/singularity_type_enum.py +2 -2
- wandelbots_api_client/v2/models/sphere.py +4 -4
- wandelbots_api_client/v2/models/start_movement_request.py +14 -15
- wandelbots_api_client/v2/models/start_movement_response.py +100 -0
- wandelbots_api_client/v2/models/start_on_io.py +11 -8
- wandelbots_api_client/v2/models/{list_io_values_response.py → stream_io_values_response.py} +17 -11
- wandelbots_api_client/v2/models/tcp_offset.py +4 -4
- wandelbots_api_client/v2/models/{tcp_required.py → tcp_required_error.py} +6 -6
- wandelbots_api_client/v2/models/tcp_velocity_request.py +6 -9
- wandelbots_api_client/v2/models/tcp_velocity_response.py +100 -0
- wandelbots_api_client/v2/models/{torque_exceeded.py → torque_exceeded_error.py} +9 -9
- wandelbots_api_client/v2/models/{torque_exceeded_torque_exceeded.py → torque_exceeded_error_torque_exceeded.py} +8 -8
- wandelbots_api_client/v2/models/trajectory_data.py +6 -6
- wandelbots_api_client/v2/models/trajectory_details.py +108 -0
- wandelbots_api_client/v2/models/trajectory_details_state.py +212 -0
- wandelbots_api_client/v2/models/trajectory_ended.py +98 -0
- wandelbots_api_client/v2/models/trajectory_id.py +4 -4
- wandelbots_api_client/v2/models/{get_mode_response.py → trajectory_paused_by_user.py} +17 -11
- wandelbots_api_client/v2/models/trajectory_paused_on_io.py +98 -0
- wandelbots_api_client/v2/models/trajectory_running.py +101 -0
- wandelbots_api_client/v2/models/{create_program_operator_run_request.py → trajectory_wait_for_io.py} +17 -10
- wandelbots_api_client/v2/models/unit_type.py +3 -3
- wandelbots_api_client/v2/models/universalrobots_controller.py +6 -9
- wandelbots_api_client/v2/models/update_nova_version_request.py +3 -3
- wandelbots_api_client/v2/models/validation_error.py +9 -7
- wandelbots_api_client/v2/models/validation_error2.py +6 -6
- wandelbots_api_client/v2/models/validation_error_loc_inner.py +2 -2
- wandelbots_api_client/v2/models/virtual_controller.py +11 -14
- wandelbots_api_client/v2/models/virtual_controller_types.py +18 -3
- wandelbots_api_client/v2/models/virtual_robot_configuration.py +4 -4
- wandelbots_api_client/v2/models/wait_for_io_event_request.py +6 -6
- wandelbots_api_client/v2/models/yaskawa_controller.py +6 -9
- wandelbots_api_client/v2/rest.py +4 -3
- wandelbots_api_client/v2_pydantic/__init__.py +50 -0
- wandelbots_api_client/v2_pydantic/api/__init__.py +51 -0
- wandelbots_api_client/{v2/api/virtual_robot_api.py → v2_pydantic/api/application_api.py} +327 -426
- wandelbots_api_client/v2_pydantic/api/bus_inputs_outputs_api.py +4603 -0
- wandelbots_api_client/{v2/api/virtual_robot_setup_api.py → v2_pydantic/api/cell_api.py} +291 -771
- wandelbots_api_client/v2_pydantic/api/controller_api.py +3721 -0
- wandelbots_api_client/v2_pydantic/api/controller_inputs_outputs_api.py +1395 -0
- wandelbots_api_client/v2_pydantic/api/jogging_api.py +125 -0
- wandelbots_api_client/v2_pydantic/api/kinematics_api.py +642 -0
- wandelbots_api_client/{v2/api/store_collision_scenes_api.py → v2_pydantic/api/license_api.py} +158 -248
- wandelbots_api_client/{v2/api/virtual_robot_behavior_api.py → v2_pydantic/api/motion_group_api.py} +156 -131
- wandelbots_api_client/v2_pydantic/api/motion_group_models_api.py +563 -0
- wandelbots_api_client/{v2/api/store_program_api.py → v2_pydantic/api/program_api.py} +191 -181
- wandelbots_api_client/v2_pydantic/api/store_collision_components_api.py +4170 -0
- wandelbots_api_client/v2_pydantic/api/store_collision_setups_api.py +1419 -0
- wandelbots_api_client/v2_pydantic/api/store_object_api.py +1719 -0
- wandelbots_api_client/{v2/api/program_operator_api.py → v2_pydantic/api/system_api.py} +625 -476
- wandelbots_api_client/{v2/api/virtual_robot_mode_api.py → v2_pydantic/api/trajectory_caching_api.py} +208 -162
- wandelbots_api_client/v2_pydantic/api/trajectory_execution_api.py +125 -0
- wandelbots_api_client/v2_pydantic/api/trajectory_planning_api.py +642 -0
- wandelbots_api_client/v2_pydantic/api/version_api.py +287 -0
- wandelbots_api_client/v2_pydantic/api/virtual_controller_api.py +4610 -0
- wandelbots_api_client/v2_pydantic/api/virtual_controller_behavior_api.py +991 -0
- wandelbots_api_client/v2_pydantic/api/virtual_controller_inputs_outputs_api.py +1012 -0
- wandelbots_api_client/v2_pydantic/api_client.py +809 -0
- wandelbots_api_client/v2_pydantic/api_response.py +21 -0
- wandelbots_api_client/v2_pydantic/configuration.py +606 -0
- wandelbots_api_client/v2_pydantic/exceptions.py +216 -0
- wandelbots_api_client/v2_pydantic/models.py +4561 -0
- wandelbots_api_client/v2_pydantic/py.typed +0 -0
- wandelbots_api_client/v2_pydantic/rest.py +213 -0
- wandelbots_api_client-25.10.0rc2.dist-info/METADATA +62 -0
- wandelbots_api_client-25.10.0rc2.dist-info/RECORD +640 -0
- {wandelbots_api_client-25.6.0.dev7.dist-info → wandelbots_api_client-25.10.0rc2.dist-info}/WHEEL +2 -1
- wandelbots_api_client-25.10.0rc2.dist-info/top_level.txt +1 -0
- wandelbots_api_client/v2/models/collision_motion_group.py +0 -121
- wandelbots_api_client/v2/models/collision_scene.py +0 -119
- wandelbots_api_client/v2/models/collision_scene_assembly.py +0 -129
- wandelbots_api_client/v2/models/controller.py +0 -132
- wandelbots_api_client/v2/models/external_joint_stream_datapoint_value.py +0 -97
- wandelbots_api_client/v2/models/initialize_movement_response_init_response.py +0 -93
- wandelbots_api_client/v2/models/jogging_paused_joint_limit.py +0 -95
- wandelbots_api_client/v2/models/jogging_response.py +0 -95
- wandelbots_api_client/v2/models/motion_group_instance.py +0 -101
- wandelbots_api_client/v2/models/motion_group_state_without_payload.py +0 -146
- wandelbots_api_client/v2/models/movement_error.py +0 -95
- wandelbots_api_client/v2/models/opcua_node_value_trigger_config_node_value.py +0 -160
- wandelbots_api_client/v2/models/pause_movement_response_pause_response.py +0 -93
- wandelbots_api_client/v2/models/planning_limits.py +0 -130
- wandelbots_api_client/v2/models/playback_speed_response_playback_speed_response.py +0 -91
- wandelbots_api_client/v2/models/program_run_result.py +0 -108
- wandelbots_api_client/v2/models/single_motion_group_collision_scene.py +0 -135
- wandelbots_api_client/v2/models/standstill_reason.py +0 -39
- wandelbots_api_client/v2/models/trigger_object.py +0 -111
- wandelbots_api_client/v2/models/version_number.py +0 -105
- wandelbots_api_client-25.6.0.dev7.dist-info/METADATA +0 -63
- wandelbots_api_client-25.6.0.dev7.dist-info/RECORD +0 -580
- {wandelbots_api_client-25.6.0.dev7.dist-info → wandelbots_api_client-25.10.0rc2.dist-info/licenses}/LICENSE +0 -0
|
@@ -0,0 +1,4561 @@
|
|
|
1
|
+
# generated by datamodel-codegen:
|
|
2
|
+
# filename: public.openapi.yaml
|
|
3
|
+
# timestamp: 2025-12-02T14:18:24+00:00
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
from datetime import date
|
|
8
|
+
from enum import Enum
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Annotated, Any, Dict, List, Literal, Optional, Union
|
|
11
|
+
|
|
12
|
+
from pydantic import AwareDatetime, BaseModel, EmailStr, Field, RootModel
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class NameList(RootModel):
|
|
16
|
+
"""
|
|
17
|
+
A list of names
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
root: List[str]
|
|
21
|
+
"""
|
|
22
|
+
A list of names
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __getitem__(self, index: int) -> str:
|
|
26
|
+
"""
|
|
27
|
+
Make list RootModel directly indexable.
|
|
28
|
+
"""
|
|
29
|
+
return self.root[index]
|
|
30
|
+
|
|
31
|
+
def __setitem__(self, index: int, value: str) -> None:
|
|
32
|
+
"""
|
|
33
|
+
Make list RootModel directly indexable.
|
|
34
|
+
"""
|
|
35
|
+
self.root[index] = value
|
|
36
|
+
|
|
37
|
+
def __len__(self) -> int:
|
|
38
|
+
"""
|
|
39
|
+
Make list RootModel directly usable with len().
|
|
40
|
+
"""
|
|
41
|
+
return len(self.root)
|
|
42
|
+
|
|
43
|
+
def __iter__(self):
|
|
44
|
+
"""
|
|
45
|
+
Make list RootModel directly iterable.
|
|
46
|
+
"""
|
|
47
|
+
return iter(self.root)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class CellName(RootModel):
|
|
51
|
+
root: Annotated[str, Field(pattern='^[a-z][a-z0-9-]{0,30}[a-z0-9]$')]
|
|
52
|
+
"""
|
|
53
|
+
A unique name for the cell used as an identifier for addressing the cell in all API calls.
|
|
54
|
+
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).
|
|
55
|
+
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class CellDescription(RootModel):
|
|
60
|
+
root: Annotated[str, Field(max_length=200)]
|
|
61
|
+
"""
|
|
62
|
+
A description of the cell.
|
|
63
|
+
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class EgmServer(BaseModel):
|
|
68
|
+
"""
|
|
69
|
+
The EGM server runs inside of the cell, thus its IP must be in the same network as the 'controller_ip'
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
ip: str
|
|
73
|
+
port: int
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class AbbController(BaseModel):
|
|
77
|
+
"""
|
|
78
|
+
The configuration of a physical ABB robot controller has to contain IP address.
|
|
79
|
+
Additionally an EGM server configuration has to be specified in order to control the robot.
|
|
80
|
+
Deploying the server is a functionality of this API.
|
|
81
|
+
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
kind: Literal['AbbController'] = 'AbbController'
|
|
85
|
+
controller_ip: str
|
|
86
|
+
controller_port: int
|
|
87
|
+
"""
|
|
88
|
+
Default values: 80, 443. If custom value is set, field is required.
|
|
89
|
+
|
|
90
|
+
"""
|
|
91
|
+
egm_server: EgmServer
|
|
92
|
+
"""
|
|
93
|
+
The EGM server runs inside of the cell, thus its IP must be in the same network as the 'controller_ip'
|
|
94
|
+
"""
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
class FanucController(BaseModel):
|
|
98
|
+
"""
|
|
99
|
+
The configuration of a physical FANUC robot controller has to contain IP address of the controller.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
kind: Literal['FanucController'] = 'FanucController'
|
|
103
|
+
controller_ip: str
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class RsiServer(BaseModel):
|
|
107
|
+
"""
|
|
108
|
+
The RSI server runs inside of the cell.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
ip: str
|
|
112
|
+
port: int
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class KukaController(BaseModel):
|
|
116
|
+
"""
|
|
117
|
+
The configuration of a physical KUKA robot controller has to contain an IP address.
|
|
118
|
+
Additionally an RSI server configuration has to be specified in order to control the robot.
|
|
119
|
+
Deploying the server is a functionality of this API.
|
|
120
|
+
|
|
121
|
+
"""
|
|
122
|
+
|
|
123
|
+
kind: Literal['KukaController'] = 'KukaController'
|
|
124
|
+
controller_ip: str
|
|
125
|
+
controller_port: int
|
|
126
|
+
rsi_server: RsiServer
|
|
127
|
+
"""
|
|
128
|
+
The RSI server runs inside of the cell.
|
|
129
|
+
"""
|
|
130
|
+
slow_cycle_rate: Optional[bool] = False
|
|
131
|
+
"""
|
|
132
|
+
If true, uses slower cycle time of 12ms instead of 4ms.
|
|
133
|
+
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class UniversalrobotsController(BaseModel):
|
|
138
|
+
"""
|
|
139
|
+
The configuration of a physical Universal Robots controller has to contain IP address of the controller.
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
kind: Literal['UniversalrobotsController'] = 'UniversalrobotsController'
|
|
143
|
+
controller_ip: str
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
class Manufacturer(Enum):
|
|
147
|
+
ABB = 'abb'
|
|
148
|
+
FANUC = 'fanuc'
|
|
149
|
+
KUKA = 'kuka'
|
|
150
|
+
UNIVERSALROBOTS = 'universalrobots'
|
|
151
|
+
YASKAWA = 'yaskawa'
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class VirtualControllerTypes(Enum):
|
|
155
|
+
ABB_IRB1010_037_15 = 'abb-irb1010_037_15'
|
|
156
|
+
ABB_IRB1100_0475_4 = 'abb-irb1100_0475_4'
|
|
157
|
+
ABB_IRB1100_058_4 = 'abb-irb1100_058_4'
|
|
158
|
+
ABB_IRB1200_7 = 'abb-irb1200_7'
|
|
159
|
+
ABB_IRB1300_09_11 = 'abb-irb1300_09_11'
|
|
160
|
+
ABB_IRB1300_115_10 = 'abb-irb1300_115_10'
|
|
161
|
+
ABB_IRB1300_14_12 = 'abb-irb1300_14_12'
|
|
162
|
+
ABB_IRB1300_14_7 = 'abb-irb1300_14_7'
|
|
163
|
+
ABB_IRB1600_12_10 = 'abb-irb1600_12_10'
|
|
164
|
+
ABB_IRB1600_12_6 = 'abb-irb1600_12_6'
|
|
165
|
+
ABB_IRB1600_145_10 = 'abb-irb1600_145_10'
|
|
166
|
+
ABB_IRB1600_145_6 = 'abb-irb1600_145_6'
|
|
167
|
+
ABB_IRB2600_ID_185_15 = 'abb-irb2600ID_185_15'
|
|
168
|
+
ABB_IRB2600_ID_200_8 = 'abb-irb2600ID_200_8'
|
|
169
|
+
ABB_IRB2600_165_12 = 'abb-irb2600_165_12'
|
|
170
|
+
ABB_IRB2600_165_20 = 'abb-irb2600_165_20'
|
|
171
|
+
ABB_IRB2600_185_12 = 'abb-irb2600_185_12'
|
|
172
|
+
ABB_IRB4600_205_45 = 'abb-irb4600_205_45'
|
|
173
|
+
ABB_IRB4600_205_60 = 'abb-irb4600_205_60'
|
|
174
|
+
ABB_IRB4600_250_20 = 'abb-irb4600_250_20'
|
|
175
|
+
ABB_IRB4600_255_40 = 'abb-irb4600_255_40'
|
|
176
|
+
ABB_IRB6730_210_310 = 'abb-irb6730_210_310'
|
|
177
|
+
ABB_IRB6730_240_290 = 'abb-irb6730_240_290'
|
|
178
|
+
FANUC_ARC_MATE_100I_D = 'fanuc-arc_mate_100iD'
|
|
179
|
+
FANUC_ARC_MATE_100I_D16_S = 'fanuc-arc_mate_100iD16S'
|
|
180
|
+
FANUC_ARC_MATE_120I_D = 'fanuc-arc_mate_120iD'
|
|
181
|
+
FANUC_ARC_MATE_120I_D12_L = 'fanuc-arc_mate_120iD12L'
|
|
182
|
+
FANUC_ARC_MATE_120I_D35 = 'fanuc-arc_mate_120iD35'
|
|
183
|
+
FANUC_CR35IB = 'fanuc-cr35ib'
|
|
184
|
+
FANUC_CR7IA = 'fanuc-cr7ia'
|
|
185
|
+
FANUC_CR7IAL = 'fanuc-cr7ial'
|
|
186
|
+
FANUC_CRX10IA = 'fanuc-crx10ia'
|
|
187
|
+
FANUC_CRX10IAL = 'fanuc-crx10ial'
|
|
188
|
+
FANUC_CRX20IAL = 'fanuc-crx20ial'
|
|
189
|
+
FANUC_CRX25IA = 'fanuc-crx25ia'
|
|
190
|
+
FANUC_CRX30IA = 'fanuc-crx30ia'
|
|
191
|
+
FANUC_CRX5IA = 'fanuc-crx5ia'
|
|
192
|
+
FANUC_LR_MATE_200I_D = 'fanuc-lr_mate_200iD'
|
|
193
|
+
FANUC_LR_MATE_200I_D4_S = 'fanuc-lr_mate_200iD4S'
|
|
194
|
+
FANUC_LR_MATE_200I_D7_L = 'fanuc-lr_mate_200iD7L'
|
|
195
|
+
FANUC_M10I_D12 = 'fanuc-m10iD12'
|
|
196
|
+
FANUC_M10I_D16_S = 'fanuc-m10iD16S'
|
|
197
|
+
FANUC_M20I_D25 = 'fanuc-m20iD25'
|
|
198
|
+
FANUC_M20I_D35 = 'fanuc-m20iD35'
|
|
199
|
+
FANUC_M710I_C20_L = 'fanuc-m710iC20L'
|
|
200
|
+
FANUC_M900I_B280_L = 'fanuc-m900iB280L'
|
|
201
|
+
FANUC_M900I_B360_E = 'fanuc-m900iB360E'
|
|
202
|
+
FANUC_R2000IC125L = 'fanuc-r2000ic125l'
|
|
203
|
+
FANUC_R2000IC210F = 'fanuc-r2000ic210f'
|
|
204
|
+
KUKA_KR10_R1100 = 'kuka-kr10_r1100'
|
|
205
|
+
KUKA_KR10_R1100_2 = 'kuka-kr10_r1100_2'
|
|
206
|
+
KUKA_KR10_R900 = 'kuka-kr10_r900'
|
|
207
|
+
KUKA_KR10_R900_2 = 'kuka-kr10_r900_2'
|
|
208
|
+
KUKA_KR120_R2700_2 = 'kuka-kr120_r2700_2'
|
|
209
|
+
KUKA_KR12_R1810_2 = 'kuka-kr12_r1810_2'
|
|
210
|
+
KUKA_KR150_R2 = 'kuka-kr150_r2'
|
|
211
|
+
KUKA_KR16_R1610_2 = 'kuka-kr16_r1610_2'
|
|
212
|
+
KUKA_KR16_R2010_2 = 'kuka-kr16_r2010_2'
|
|
213
|
+
KUKA_KR20_R1810 = 'kuka-kr20_r1810'
|
|
214
|
+
KUKA_KR20_R1810_2 = 'kuka-kr20_r1810_2'
|
|
215
|
+
KUKA_KR120_R3100_2 = 'kuka-kr120_r3100_2'
|
|
216
|
+
KUKA_KR120_R3900_2_K = 'kuka-kr120_r3900_2_k'
|
|
217
|
+
KUKA_KR210_R2700_EXTRA = 'kuka-kr210_r2700_extra'
|
|
218
|
+
KUKA_KR210_R2700_2 = 'kuka-kr210_r2700_2'
|
|
219
|
+
KUKA_KR210_R3100_2 = 'kuka-kr210_r3100_2'
|
|
220
|
+
KUKA_KR210_R3300_2 = 'kuka-kr210_r3300_2'
|
|
221
|
+
KUKA_KR240_R2700 = 'kuka-kr240_r2700'
|
|
222
|
+
KUKA_KR240_R2900 = 'kuka-kr240_r2900'
|
|
223
|
+
KUKA_KR240_R3700_2 = 'kuka-kr240_r3700_2'
|
|
224
|
+
KUKA_KR250_R2700_2 = 'kuka-kr250_r2700_2'
|
|
225
|
+
KUKA_KR270_R2700 = 'kuka-kr270_r2700'
|
|
226
|
+
KUKA_KR30_R2100 = 'kuka-kr30_r2100'
|
|
227
|
+
KUKA_KR30_R3 = 'kuka-kr30_r3'
|
|
228
|
+
KUKA_KR360_L240_3 = 'kuka-kr360_l240_3'
|
|
229
|
+
KUKA_KR3_R540 = 'kuka-kr3_r540'
|
|
230
|
+
KUKA_KR4_R600 = 'kuka-kr4_r600'
|
|
231
|
+
KUKA_KR500_L340_3 = 'kuka-kr500_l340_3'
|
|
232
|
+
KUKA_KR50_R2500 = 'kuka-kr50_r2500'
|
|
233
|
+
KUKA_KR60_R3 = 'kuka-kr60_r3'
|
|
234
|
+
KUKA_KR6_R1820 = 'kuka-kr6_r1820'
|
|
235
|
+
KUKA_KR6_R700_2 = 'kuka-kr6_r700_2'
|
|
236
|
+
KUKA_KR6_R700_SIXX = 'kuka-kr6_r700_sixx'
|
|
237
|
+
KUKA_KR6_R900 = 'kuka-kr6_r900'
|
|
238
|
+
KUKA_KR6_R900_2 = 'kuka-kr6_r900_2'
|
|
239
|
+
KUKA_KR70_R2100 = 'kuka-kr70_r2100'
|
|
240
|
+
KUKA_LBR_IISY_11_R1300 = 'kuka-lbr_iisy_11_r1300'
|
|
241
|
+
UNIVERSALROBOTS_UR10CB = 'universalrobots-ur10cb'
|
|
242
|
+
UNIVERSALROBOTS_UR10E = 'universalrobots-ur10e'
|
|
243
|
+
UNIVERSALROBOTS_UR12E = 'universalrobots-ur12e'
|
|
244
|
+
UNIVERSALROBOTS_UR16E = 'universalrobots-ur16e'
|
|
245
|
+
UNIVERSALROBOTS_UR20E = 'universalrobots-ur20e'
|
|
246
|
+
UNIVERSALROBOTS_UR3E = 'universalrobots-ur3e'
|
|
247
|
+
UNIVERSALROBOTS_UR5CB = 'universalrobots-ur5cb'
|
|
248
|
+
UNIVERSALROBOTS_UR5E = 'universalrobots-ur5e'
|
|
249
|
+
UNIVERSALROBOTS_UR7E = 'universalrobots-ur7e'
|
|
250
|
+
YASKAWA_AR1440 = 'yaskawa-ar1440'
|
|
251
|
+
YASKAWA_AR1730 = 'yaskawa-ar1730'
|
|
252
|
+
YASKAWA_AR2010 = 'yaskawa-ar2010'
|
|
253
|
+
YASKAWA_AR3120 = 'yaskawa-ar3120'
|
|
254
|
+
YASKAWA_AR700 = 'yaskawa-ar700'
|
|
255
|
+
YASKAWA_AR900 = 'yaskawa-ar900'
|
|
256
|
+
YASKAWA_GP110 = 'yaskawa-gp110'
|
|
257
|
+
YASKAWA_GP12 = 'yaskawa-gp12'
|
|
258
|
+
YASKAWA_GP180 = 'yaskawa-gp180'
|
|
259
|
+
YASKAWA_GP180_120 = 'yaskawa-gp180-120'
|
|
260
|
+
YASKAWA_GP20HL = 'yaskawa-gp20hl'
|
|
261
|
+
YASKAWA_GP215 = 'yaskawa-gp215'
|
|
262
|
+
YASKAWA_GP225 = 'yaskawa-gp225'
|
|
263
|
+
YASKAWA_GP25 = 'yaskawa-gp25'
|
|
264
|
+
YASKAWA_GP250 = 'yaskawa-gp250'
|
|
265
|
+
YASKAWA_GP25_12 = 'yaskawa-gp25_12'
|
|
266
|
+
YASKAWA_GP280 = 'yaskawa-gp280'
|
|
267
|
+
YASKAWA_GP35_L = 'yaskawa-gp35L'
|
|
268
|
+
YASKAWA_GP400 = 'yaskawa-gp400'
|
|
269
|
+
YASKAWA_GP50 = 'yaskawa-gp50'
|
|
270
|
+
YASKAWA_GP600 = 'yaskawa-gp600'
|
|
271
|
+
YASKAWA_GP7 = 'yaskawa-gp7'
|
|
272
|
+
YASKAWA_GP8 = 'yaskawa-gp8'
|
|
273
|
+
YASKAWA_GP88 = 'yaskawa-gp88'
|
|
274
|
+
YASKAWA_HC10DTP = 'yaskawa-hc10dtp'
|
|
275
|
+
YASKAWA_HC20DTP = 'yaskawa-hc20dtp'
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
class VirtualController(BaseModel):
|
|
279
|
+
"""
|
|
280
|
+
The configuration of a virtual robot controller has to contain the manufacturer string,
|
|
281
|
+
an optional joint position string array and either a preset `type` **or** the complete JSON configuration.
|
|
282
|
+
|
|
283
|
+
"""
|
|
284
|
+
|
|
285
|
+
kind: Literal['VirtualController'] = 'VirtualController'
|
|
286
|
+
manufacturer: Manufacturer
|
|
287
|
+
type: Optional[VirtualControllerTypes] = None
|
|
288
|
+
json_: Annotated[Optional[str], Field(alias='json')] = None
|
|
289
|
+
"""
|
|
290
|
+
Complete JSON configuration of the virtual robot controller.
|
|
291
|
+
Can be obtained from the physical controller's configuration via [getVirtualControllerConfiguration](getVirtualControllerConfiguration).
|
|
292
|
+
If provided, the `type` field should not be used.
|
|
293
|
+
|
|
294
|
+
"""
|
|
295
|
+
initial_joint_position: Optional[str] = None
|
|
296
|
+
"""
|
|
297
|
+
Initial joint position of the first motion group from the virtual robot controller.
|
|
298
|
+
Provide the joint position as a JSON array containing 7 float values,
|
|
299
|
+
each representing a joint position in radians, e.g., "[0, 0, 0, 0, 0, 0, 0]". If the robot has fewer than 7 joints,
|
|
300
|
+
use "0" for each remaining position to ensure the array has exactly 7 values.
|
|
301
|
+
|
|
302
|
+
"""
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class YaskawaController(BaseModel):
|
|
306
|
+
"""
|
|
307
|
+
The configuration of a physical Yaskawa robot controller has to contain IP address of the controller.
|
|
308
|
+
"""
|
|
309
|
+
|
|
310
|
+
kind: Literal['YaskawaController'] = 'YaskawaController'
|
|
311
|
+
controller_ip: str
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
class RobotController(BaseModel):
|
|
315
|
+
"""
|
|
316
|
+
The configuration of a physical or virtual robot controller.
|
|
317
|
+
"""
|
|
318
|
+
|
|
319
|
+
name: Annotated[str, Field(pattern='^[a-z][a-z0-9-]{0,61}[a-z0-9]$')]
|
|
320
|
+
"""
|
|
321
|
+
Unique name of controller within the cell.
|
|
322
|
+
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).
|
|
323
|
+
|
|
324
|
+
"""
|
|
325
|
+
configuration: Annotated[
|
|
326
|
+
Union[
|
|
327
|
+
AbbController,
|
|
328
|
+
FanucController,
|
|
329
|
+
KukaController,
|
|
330
|
+
UniversalrobotsController,
|
|
331
|
+
VirtualController,
|
|
332
|
+
YaskawaController,
|
|
333
|
+
],
|
|
334
|
+
Field(discriminator='kind'),
|
|
335
|
+
]
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
class ImageCredentials(BaseModel):
|
|
339
|
+
"""
|
|
340
|
+
User provided credentials for creating a secret to pull an image from a registry.
|
|
341
|
+
|
|
342
|
+
"""
|
|
343
|
+
|
|
344
|
+
registry: str
|
|
345
|
+
user: str
|
|
346
|
+
password: str
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
class Secret(BaseModel):
|
|
350
|
+
name: str
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
class ContainerImage(BaseModel):
|
|
354
|
+
"""
|
|
355
|
+
A user provided, custom container image and the required credentials to pull it from a registry.
|
|
356
|
+
|
|
357
|
+
"""
|
|
358
|
+
|
|
359
|
+
image: Annotated[str, Field(min_length=1)]
|
|
360
|
+
"""
|
|
361
|
+
The location of a container image in the form of `<registry>/<image>:<tag>`.
|
|
362
|
+
"""
|
|
363
|
+
credentials: Optional[ImageCredentials] = None
|
|
364
|
+
secrets: Optional[List[Secret]] = None
|
|
365
|
+
"""
|
|
366
|
+
Known secrets for authentication with the container registry.
|
|
367
|
+
"""
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
class ContainerEnvironmentItem(BaseModel):
|
|
371
|
+
name: str
|
|
372
|
+
value: str
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class ContainerEnvironment(RootModel):
|
|
376
|
+
"""
|
|
377
|
+
A list of environment variables with name and their value.
|
|
378
|
+
These can be used to configure the containerized application, and turn features on or off.
|
|
379
|
+
|
|
380
|
+
"""
|
|
381
|
+
|
|
382
|
+
root: List[ContainerEnvironmentItem]
|
|
383
|
+
"""
|
|
384
|
+
A list of environment variables with name and their value.
|
|
385
|
+
These can be used to configure the containerized application, and turn features on or off.
|
|
386
|
+
|
|
387
|
+
"""
|
|
388
|
+
|
|
389
|
+
def __getitem__(self, index: int) -> ContainerEnvironmentItem:
|
|
390
|
+
"""
|
|
391
|
+
Make list RootModel directly indexable.
|
|
392
|
+
"""
|
|
393
|
+
return self.root[index]
|
|
394
|
+
|
|
395
|
+
def __setitem__(self, index: int, value: ContainerEnvironmentItem) -> None:
|
|
396
|
+
"""
|
|
397
|
+
Make list RootModel directly indexable.
|
|
398
|
+
"""
|
|
399
|
+
self.root[index] = value
|
|
400
|
+
|
|
401
|
+
def __len__(self) -> int:
|
|
402
|
+
"""
|
|
403
|
+
Make list RootModel directly usable with len().
|
|
404
|
+
"""
|
|
405
|
+
return len(self.root)
|
|
406
|
+
|
|
407
|
+
def __iter__(self):
|
|
408
|
+
"""
|
|
409
|
+
Make list RootModel directly iterable.
|
|
410
|
+
"""
|
|
411
|
+
return iter(self.root)
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
class Capacity(RootModel):
|
|
415
|
+
root: Annotated[
|
|
416
|
+
str,
|
|
417
|
+
Field(
|
|
418
|
+
examples=['100Mi'], pattern='^[0-9]+(\\\\.[0-9]+)?(Ki|Mi|Gi|Ti|Pi|Ei|B)?$'
|
|
419
|
+
),
|
|
420
|
+
]
|
|
421
|
+
"""
|
|
422
|
+
The amount of requested storage capacity.
|
|
423
|
+
"""
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
class ContainerStorage(BaseModel):
|
|
427
|
+
"""
|
|
428
|
+
The path and capacity of a volume that retains data across application restarts.
|
|
429
|
+
The maximal requestable capacity is 300Mi.
|
|
430
|
+
If you need more capacity consider using [storeObject](storeObject).
|
|
431
|
+
|
|
432
|
+
"""
|
|
433
|
+
|
|
434
|
+
mount_path: Annotated[Path, Field(examples=['/data'])]
|
|
435
|
+
capacity: Capacity
|
|
436
|
+
"""
|
|
437
|
+
The amount of local storage available for the application.
|
|
438
|
+
|
|
439
|
+
**NOTE:** The capacity can NEVER be reduced!
|
|
440
|
+
|
|
441
|
+
"""
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
class ContainerResources(BaseModel):
|
|
445
|
+
"""
|
|
446
|
+
Additional resources that the application requires.
|
|
447
|
+
"""
|
|
448
|
+
|
|
449
|
+
intel_gpu: Annotated[Optional[int], Field(ge=0, le=1)] = None
|
|
450
|
+
"""
|
|
451
|
+
Number of GPUs the application requires.
|
|
452
|
+
"""
|
|
453
|
+
memory_limit: Annotated[Optional[str], Field(examples=['1000Mi'])] = None
|
|
454
|
+
"""
|
|
455
|
+
The maximum memory allocated to this application.
|
|
456
|
+
"""
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
class App(BaseModel):
|
|
460
|
+
"""
|
|
461
|
+
An App is defined by a webserver, packed inside a container, serving a web-application.
|
|
462
|
+
|
|
463
|
+
"""
|
|
464
|
+
|
|
465
|
+
name: Annotated[str, Field(min_length=1, pattern='^[a-z][a-z0-9-]{0,61}[a-z0-9]$')]
|
|
466
|
+
"""
|
|
467
|
+
The name of the provided application.
|
|
468
|
+
The name must be unique within the cell and is used as a identifier for addressing the application in all API calls
|
|
469
|
+
, e.g., when updating the application.
|
|
470
|
+
|
|
471
|
+
It also defines where the application is reachable (/$cell/$name).
|
|
472
|
+
|
|
473
|
+
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).
|
|
474
|
+
|
|
475
|
+
"""
|
|
476
|
+
app_icon: Annotated[str, Field(min_length=1)]
|
|
477
|
+
"""
|
|
478
|
+
The path of the icon for the App (/$cell/$name/$app_icon).
|
|
479
|
+
"""
|
|
480
|
+
container_image: ContainerImage
|
|
481
|
+
port: Optional[int] = 8080
|
|
482
|
+
"""
|
|
483
|
+
The port the containerized webserver is listening on.
|
|
484
|
+
"""
|
|
485
|
+
environment: Optional[ContainerEnvironment] = None
|
|
486
|
+
storage: Optional[ContainerStorage] = None
|
|
487
|
+
resources: Optional[ContainerResources] = None
|
|
488
|
+
health_path: Optional[str] = None
|
|
489
|
+
"""
|
|
490
|
+
Defines the URL path suffix used to check the application's health status. The complete health check URL
|
|
491
|
+
is constructed as `/$cell/$name/$health_path`. When the application is working as expected,
|
|
492
|
+
the endpoint returns an HTTP 200 status code.
|
|
493
|
+
|
|
494
|
+
If not specified, the system will default to using the application icon path suffix
|
|
495
|
+
(the value of `app_icon`) as the health check endpoint, resulting in `/$cell/$name/$app_icon`.
|
|
496
|
+
|
|
497
|
+
If the health check fails (no response or non-200 status code), the system will
|
|
498
|
+
automatically restart the application container to restore service.
|
|
499
|
+
|
|
500
|
+
"""
|
|
501
|
+
diagnosis_path: Optional[str] = None
|
|
502
|
+
"""
|
|
503
|
+
Defines the URL path suffix used to provide an endpoint for diagnosis data collection.
|
|
504
|
+
The complete diagnosis check URL is constructed as `/$cell/$name/$diagnosis_path`.
|
|
505
|
+
|
|
506
|
+
The endpoint is called when a diagnosis package is requested via the diagnosis API.
|
|
507
|
+
The endpoint needs to return the data within a zip file `application/zip` response.
|
|
508
|
+
|
|
509
|
+
"""
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
class Cell(BaseModel):
|
|
513
|
+
"""
|
|
514
|
+
To create a robot cell, only a valid name is required.
|
|
515
|
+
Once created, a robot cell provides access to the Wandelbots NOVA foundation services.
|
|
516
|
+
The configuration can be customized, e.g., robot controllers, also within apps.
|
|
517
|
+
|
|
518
|
+
"""
|
|
519
|
+
|
|
520
|
+
name: CellName
|
|
521
|
+
description: Optional[CellDescription] = None
|
|
522
|
+
controllers: Optional[List[RobotController]] = None
|
|
523
|
+
apps: Optional[List[App]] = None
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
class Error(BaseModel):
|
|
527
|
+
code: Optional[str] = None
|
|
528
|
+
message: str
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
class OperatingState(Enum):
|
|
532
|
+
"""
|
|
533
|
+
The operating state.
|
|
534
|
+
"""
|
|
535
|
+
|
|
536
|
+
ACTIVE = 'ACTIVE'
|
|
537
|
+
INACTIVE = 'INACTIVE'
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
class ServiceGroup(Enum):
|
|
541
|
+
SYSTEM_SERVICE = 'SystemService'
|
|
542
|
+
CELL_SERVICE = 'CellService'
|
|
543
|
+
ROBOT_CONTROLLER = 'RobotController'
|
|
544
|
+
APP = 'App'
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
class ServiceStatusSeverity(Enum):
|
|
548
|
+
INFO = 'INFO'
|
|
549
|
+
WARNING = 'WARNING'
|
|
550
|
+
ERROR = 'ERROR'
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
class ServiceStatusPhase(Enum):
|
|
554
|
+
TERMINATING = 'Terminating'
|
|
555
|
+
INITIALIZED = 'Initialized'
|
|
556
|
+
RUNNING = 'Running'
|
|
557
|
+
NO_READY = 'NoReady'
|
|
558
|
+
COMPLETED = 'Completed'
|
|
559
|
+
CONTAINER_CREATING = 'ContainerCreating'
|
|
560
|
+
POD_INITIALIZING = 'PodInitializing'
|
|
561
|
+
UNKNOWN = 'Unknown'
|
|
562
|
+
CRASH_LOOP_BACK_OFF = 'CrashLoopBackOff'
|
|
563
|
+
ERROR = 'Error'
|
|
564
|
+
IMAGE_PULL_BACK_OFF = 'ImagePullBackOff'
|
|
565
|
+
OOM_KILLED = 'OOMKilled'
|
|
566
|
+
PENDING = 'Pending'
|
|
567
|
+
EVICTED = 'Evicted'
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
class Status(BaseModel):
|
|
571
|
+
severity: ServiceStatusSeverity
|
|
572
|
+
code: ServiceStatusPhase
|
|
573
|
+
reason: Optional[str] = None
|
|
574
|
+
|
|
575
|
+
|
|
576
|
+
class ServiceStatus(BaseModel):
|
|
577
|
+
service: str
|
|
578
|
+
group: ServiceGroup
|
|
579
|
+
status: Status
|
|
580
|
+
|
|
581
|
+
|
|
582
|
+
class ServiceStatusList(RootModel):
|
|
583
|
+
root: List[ServiceStatus]
|
|
584
|
+
|
|
585
|
+
def __getitem__(self, index: int) -> ServiceStatus:
|
|
586
|
+
"""
|
|
587
|
+
Make list RootModel directly indexable.
|
|
588
|
+
"""
|
|
589
|
+
return self.root[index]
|
|
590
|
+
|
|
591
|
+
def __setitem__(self, index: int, value: ServiceStatus) -> None:
|
|
592
|
+
"""
|
|
593
|
+
Make list RootModel directly indexable.
|
|
594
|
+
"""
|
|
595
|
+
self.root[index] = value
|
|
596
|
+
|
|
597
|
+
def __len__(self) -> int:
|
|
598
|
+
"""
|
|
599
|
+
Make list RootModel directly usable with len().
|
|
600
|
+
"""
|
|
601
|
+
return len(self.root)
|
|
602
|
+
|
|
603
|
+
def __iter__(self):
|
|
604
|
+
"""
|
|
605
|
+
Make list RootModel directly iterable.
|
|
606
|
+
"""
|
|
607
|
+
return iter(self.root)
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
class ServiceStatusResponse(BaseModel):
|
|
611
|
+
"""
|
|
612
|
+
Response containing both the overall operating state of the cell and detailed status information for each service within the cell.
|
|
613
|
+
|
|
614
|
+
The operating state indicates whether the cell is active or inactive, while the service statuses provide specific health and operational
|
|
615
|
+
information for individual service running in the cell.
|
|
616
|
+
|
|
617
|
+
"""
|
|
618
|
+
|
|
619
|
+
operating_state: OperatingState
|
|
620
|
+
service_status: ServiceStatusList
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
class BusIOProfinetIpConfig(BaseModel):
|
|
624
|
+
"""
|
|
625
|
+
Network configuration or IPv4 record of the virtual ethernet interface (pnio1) created by the PROFINET driver.
|
|
626
|
+
The IPv4 record is used in combination with the Name of Station (NoS) to identify your device in the PROFINET network.
|
|
627
|
+
|
|
628
|
+
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.
|
|
629
|
+
|
|
630
|
+
"""
|
|
631
|
+
|
|
632
|
+
ip: Annotated[str, Field(examples=['192.168.1.100'])]
|
|
633
|
+
"""
|
|
634
|
+
IP address for the device's virtual ethernet interface (pnio1).
|
|
635
|
+
"""
|
|
636
|
+
netmask: Annotated[str, Field(examples=['255.255.255.0'])]
|
|
637
|
+
"""
|
|
638
|
+
Network mask for the device's virtual ethernet interface (pnio1).
|
|
639
|
+
"""
|
|
640
|
+
gateway: Annotated[str, Field(examples=['192.168.178.1'])]
|
|
641
|
+
"""
|
|
642
|
+
Gateway for connections to other devices outside of the virtual ethernet interface's subnet.
|
|
643
|
+
"""
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
class BusIOProfinetNetwork(BaseModel):
|
|
647
|
+
device_name: Annotated[Optional[str], Field(examples=['pnDevice'])] = None
|
|
648
|
+
"""
|
|
649
|
+
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.
|
|
650
|
+
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.
|
|
651
|
+
|
|
652
|
+
"""
|
|
653
|
+
ip_config: Optional[BusIOProfinetIpConfig] = None
|
|
654
|
+
rema_xml_content: Optional[str] = None
|
|
655
|
+
"""
|
|
656
|
+
Content of the PROFINET REMA XML file.
|
|
657
|
+
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.
|
|
658
|
+
Stores information like IP address, Name of Station (NoS) and hardware configuration.
|
|
659
|
+
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.
|
|
660
|
+
|
|
661
|
+
Refer to the PDF version of the "PN Driver I/O Base programming interface" documentation for more information and an example REMA file.
|
|
662
|
+
|
|
663
|
+
"""
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
class BusIOProfinetDefaultRoute(BaseModel):
|
|
667
|
+
"""
|
|
668
|
+
Current default route configuration of your NOVA instance.
|
|
669
|
+
The default route is a setting that tells data where to go if there isn’t a specific path already known for its destination.
|
|
670
|
+
Usually this will be the path to your router, enabling accessing the internet.
|
|
671
|
+
On Linux, use `ip route show` to view your default routes and match the output
|
|
672
|
+
`default via <gateway> dev <interface> ...` to get your gateway and interface.
|
|
673
|
+
|
|
674
|
+
"""
|
|
675
|
+
|
|
676
|
+
gateway: Annotated[str, Field(examples=['192.168.124.1'])]
|
|
677
|
+
"""
|
|
678
|
+
Gateway for the default route.
|
|
679
|
+
"""
|
|
680
|
+
interface: Annotated[str, Field(examples=['enp3s0'])]
|
|
681
|
+
"""
|
|
682
|
+
Interface for the default route.
|
|
683
|
+
"""
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
class BusIOProfinet(BaseModel):
|
|
687
|
+
"""
|
|
688
|
+
PROFINET BUS inputs/outputs service configuration.
|
|
689
|
+
|
|
690
|
+
"""
|
|
691
|
+
|
|
692
|
+
bus_type: Literal['profinet'] = 'profinet'
|
|
693
|
+
network_config: Optional[BusIOProfinetNetwork] = None
|
|
694
|
+
"""
|
|
695
|
+
Used to enable IP communication through the same physical ethernet interface while PROFINET driver is active.
|
|
696
|
+
|
|
697
|
+
"""
|
|
698
|
+
plc_ip: Annotated[str, Field(examples=['192.168.1.100'])]
|
|
699
|
+
"""
|
|
700
|
+
IP address of the PLC to establish PROFINET communication with.
|
|
701
|
+
|
|
702
|
+
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.
|
|
703
|
+
Without proper firewall configuration, PROFINET device discovery, configuration exchanges,
|
|
704
|
+
and real-time cyclic data communication will fail.
|
|
705
|
+
|
|
706
|
+
"""
|
|
707
|
+
mac: Annotated[str, Field(examples=['00:11:22:33:44:55'])]
|
|
708
|
+
"""
|
|
709
|
+
MAC address of the physical ethernet interface that you want to use for PROFINET communication.
|
|
710
|
+
|
|
711
|
+
"""
|
|
712
|
+
default_route: Optional[BusIOProfinetDefaultRoute] = None
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
class BusIOProfinetVirtual(BaseModel):
|
|
716
|
+
"""
|
|
717
|
+
Virtual PROFINET BUS inputs/outputs service configuration.
|
|
718
|
+
|
|
719
|
+
"""
|
|
720
|
+
|
|
721
|
+
bus_type: Literal['profinet_virtual'] = 'profinet_virtual'
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
class BusIOModbusTCPServer(BaseModel):
|
|
725
|
+
network_type: Optional[Literal['tcp']] = None
|
|
726
|
+
port: Annotated[int, Field(examples=[502], ge=1, le=65534)]
|
|
727
|
+
"""
|
|
728
|
+
Port number of the MODBUS server to establish communication with.
|
|
729
|
+
|
|
730
|
+
"""
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
class BusIOModbusServer(BaseModel):
|
|
734
|
+
"""
|
|
735
|
+
MODBUS server inputs/outputs service configuration.
|
|
736
|
+
|
|
737
|
+
"""
|
|
738
|
+
|
|
739
|
+
bus_type: Literal['modbus_server'] = 'modbus_server'
|
|
740
|
+
network: BusIOModbusTCPServer
|
|
741
|
+
connections: Annotated[int, Field(examples=[2], ge=0, le=255)]
|
|
742
|
+
"""
|
|
743
|
+
Number of connections this MODBUS server can handle.
|
|
744
|
+
|
|
745
|
+
"""
|
|
746
|
+
coils_size: Annotated[int, Field(examples=[10], ge=0, le=65535)]
|
|
747
|
+
"""
|
|
748
|
+
Size of the Coils memory area.
|
|
749
|
+
|
|
750
|
+
"""
|
|
751
|
+
discrete_inputs_size: Annotated[int, Field(examples=[10], ge=0, le=65535)]
|
|
752
|
+
"""
|
|
753
|
+
Size of the Discrete Inputs memory area.
|
|
754
|
+
|
|
755
|
+
"""
|
|
756
|
+
holding_registers_size: Annotated[int, Field(examples=[10], ge=0, le=65535)]
|
|
757
|
+
"""
|
|
758
|
+
Size of the Holding Registers memory area.
|
|
759
|
+
|
|
760
|
+
"""
|
|
761
|
+
input_registers_size: Annotated[int, Field(examples=[10], ge=0, le=65535)]
|
|
762
|
+
"""
|
|
763
|
+
Size of the Input Registers memory area.
|
|
764
|
+
|
|
765
|
+
"""
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
class BusIOModbusTCPClient(BaseModel):
|
|
769
|
+
network_type: Optional[Literal['tcp']] = None
|
|
770
|
+
ip: Annotated[str, Field(examples=['192.168.1.100'])]
|
|
771
|
+
"""
|
|
772
|
+
IP address of the MODBUS server to establish communication with.
|
|
773
|
+
|
|
774
|
+
"""
|
|
775
|
+
port: Annotated[int, Field(examples=[502], ge=1, le=65534)]
|
|
776
|
+
"""
|
|
777
|
+
Port number of the MODBUS server to establish communication with.
|
|
778
|
+
|
|
779
|
+
"""
|
|
780
|
+
|
|
781
|
+
|
|
782
|
+
class BusIOModbusClient(BaseModel):
|
|
783
|
+
"""
|
|
784
|
+
MODBUS client inputs/outputs service configuration.
|
|
785
|
+
|
|
786
|
+
"""
|
|
787
|
+
|
|
788
|
+
bus_type: Literal['modbus_client'] = 'modbus_client'
|
|
789
|
+
network: BusIOModbusTCPClient
|
|
790
|
+
|
|
791
|
+
|
|
792
|
+
class BusIOModbusVirtual(BaseModel):
|
|
793
|
+
"""
|
|
794
|
+
Virtual MODBUS inputs/outputs service configuration.
|
|
795
|
+
|
|
796
|
+
"""
|
|
797
|
+
|
|
798
|
+
bus_type: Literal['modbus_virtual'] = 'modbus_virtual'
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
class BusIOType(RootModel):
|
|
802
|
+
root: Annotated[
|
|
803
|
+
Union[
|
|
804
|
+
BusIOProfinet,
|
|
805
|
+
BusIOProfinetVirtual,
|
|
806
|
+
BusIOModbusServer,
|
|
807
|
+
BusIOModbusClient,
|
|
808
|
+
BusIOModbusVirtual,
|
|
809
|
+
],
|
|
810
|
+
Field(discriminator='bus_type'),
|
|
811
|
+
]
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
class ReleaseChannel(Enum):
|
|
815
|
+
"""
|
|
816
|
+
The channel that defines what a new Wandelbots NOVA version is.
|
|
817
|
+
|
|
818
|
+
* `next` the over all latest version
|
|
819
|
+
* `stable` newes patch of the current version
|
|
820
|
+
|
|
821
|
+
"""
|
|
822
|
+
|
|
823
|
+
STABLE = 'stable'
|
|
824
|
+
NEXT = 'next'
|
|
825
|
+
|
|
826
|
+
|
|
827
|
+
class UpdateNovaVersionRequest(BaseModel):
|
|
828
|
+
"""
|
|
829
|
+
An update is defined by the indicated Wandelbots NOVA release channel.
|
|
830
|
+
|
|
831
|
+
"""
|
|
832
|
+
|
|
833
|
+
channel: ReleaseChannel
|
|
834
|
+
|
|
835
|
+
|
|
836
|
+
class ConfigurationResourceId(RootModel):
|
|
837
|
+
root: str
|
|
838
|
+
"""
|
|
839
|
+
Identifier of a configuration resource.
|
|
840
|
+
"""
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
class Metadata(RootModel):
|
|
844
|
+
"""
|
|
845
|
+
Additional metadata to add to the backup
|
|
846
|
+
"""
|
|
847
|
+
|
|
848
|
+
root: Dict[str, str]
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
class ConfigurationArchive(RootModel):
|
|
852
|
+
root: bytes
|
|
853
|
+
"""
|
|
854
|
+
Binary data representing a configuration archive.
|
|
855
|
+
"""
|
|
856
|
+
|
|
857
|
+
|
|
858
|
+
class ConfigurationArchiveStatusCreating(BaseModel):
|
|
859
|
+
status: Literal['creating'] = 'creating'
|
|
860
|
+
"""
|
|
861
|
+
Backup is in progress.
|
|
862
|
+
"""
|
|
863
|
+
progress: Annotated[float, Field(ge=0.0, le=1.0)]
|
|
864
|
+
"""
|
|
865
|
+
Current completion ratio (0 – 1).
|
|
866
|
+
"""
|
|
867
|
+
|
|
868
|
+
|
|
869
|
+
class ConfigurationArchiveStatusError(BaseModel):
|
|
870
|
+
status: Literal['error'] = 'error'
|
|
871
|
+
message: str
|
|
872
|
+
"""
|
|
873
|
+
Human-readable explanation of the failure.
|
|
874
|
+
"""
|
|
875
|
+
|
|
876
|
+
|
|
877
|
+
class ConfigurationArchiveStatusSuccess(BaseModel):
|
|
878
|
+
status: Literal['success'] = 'success'
|
|
879
|
+
"""
|
|
880
|
+
Backup successfully created.
|
|
881
|
+
"""
|
|
882
|
+
|
|
883
|
+
|
|
884
|
+
class ConfigurationArchiveStatus(RootModel):
|
|
885
|
+
root: Annotated[
|
|
886
|
+
Union[
|
|
887
|
+
ConfigurationArchiveStatusCreating,
|
|
888
|
+
ConfigurationArchiveStatusError,
|
|
889
|
+
ConfigurationArchiveStatusSuccess,
|
|
890
|
+
],
|
|
891
|
+
Field(discriminator='status'),
|
|
892
|
+
]
|
|
893
|
+
"""
|
|
894
|
+
Result of a backup operation.
|
|
895
|
+
"""
|
|
896
|
+
|
|
897
|
+
|
|
898
|
+
class LicenseStatusEnum(Enum):
|
|
899
|
+
OK = 'OK'
|
|
900
|
+
EXPIRED = 'EXPIRED'
|
|
901
|
+
SUSPENDED = 'SUSPENDED'
|
|
902
|
+
GRACE_PERIOD_OVER = 'GRACE_PERIOD_OVER'
|
|
903
|
+
NOT_FOUND = 'NOT_FOUND'
|
|
904
|
+
|
|
905
|
+
|
|
906
|
+
class LicenseStatus(BaseModel):
|
|
907
|
+
"""
|
|
908
|
+
Status of the license.
|
|
909
|
+
"""
|
|
910
|
+
|
|
911
|
+
status: LicenseStatusEnum
|
|
912
|
+
message: str
|
|
913
|
+
|
|
914
|
+
|
|
915
|
+
class License(BaseModel):
|
|
916
|
+
product_name: str
|
|
917
|
+
"""
|
|
918
|
+
Name of the licensed product.
|
|
919
|
+
"""
|
|
920
|
+
owner_email: EmailStr
|
|
921
|
+
"""
|
|
922
|
+
Mail address of the license owner.
|
|
923
|
+
"""
|
|
924
|
+
license_key: str
|
|
925
|
+
"""
|
|
926
|
+
Identification key of the license.
|
|
927
|
+
"""
|
|
928
|
+
license_expiry_date: Optional[date] = None
|
|
929
|
+
"""
|
|
930
|
+
Expiration date of the license.
|
|
931
|
+
"""
|
|
932
|
+
grace_period_expiry_date: AwareDatetime
|
|
933
|
+
"""
|
|
934
|
+
End date of grace period, given if instance is not connected to internet.
|
|
935
|
+
"""
|
|
936
|
+
consumed_activations: int
|
|
937
|
+
"""
|
|
938
|
+
Amount of times the license was activated.
|
|
939
|
+
"""
|
|
940
|
+
allowed_activations: int
|
|
941
|
+
"""
|
|
942
|
+
Amount of times the license can be activated.
|
|
943
|
+
"""
|
|
944
|
+
feature_limitations: Optional[Dict[str, int]] = None
|
|
945
|
+
"""
|
|
946
|
+
Feature limitations of the license.
|
|
947
|
+
"""
|
|
948
|
+
feature_flags: Optional[List[str]] = None
|
|
949
|
+
"""
|
|
950
|
+
Features enabled by a license.
|
|
951
|
+
"""
|
|
952
|
+
status: LicenseStatus
|
|
953
|
+
|
|
954
|
+
|
|
955
|
+
class ActivateLicenseRequest(BaseModel):
|
|
956
|
+
"""
|
|
957
|
+
The authentication token to fetch the license from the license server.
|
|
958
|
+
"""
|
|
959
|
+
|
|
960
|
+
owner_refresh_token: str
|
|
961
|
+
|
|
962
|
+
|
|
963
|
+
class Sphere(BaseModel):
|
|
964
|
+
"""
|
|
965
|
+
Defines a spherical shape centred around the origin.
|
|
966
|
+
"""
|
|
967
|
+
|
|
968
|
+
shape_type: Literal['sphere'] = 'sphere'
|
|
969
|
+
radius: float
|
|
970
|
+
"""
|
|
971
|
+
The radius of the sphere in [mm].
|
|
972
|
+
"""
|
|
973
|
+
|
|
974
|
+
|
|
975
|
+
class BoxType(Enum):
|
|
976
|
+
"""
|
|
977
|
+
The box type defines if the box is hollow or full.
|
|
978
|
+
"""
|
|
979
|
+
|
|
980
|
+
HOLLOW = 'HOLLOW'
|
|
981
|
+
FULL = 'FULL'
|
|
982
|
+
|
|
983
|
+
|
|
984
|
+
class Box(BaseModel):
|
|
985
|
+
"""
|
|
986
|
+
Defines a cuboid shape centred around an origin.
|
|
987
|
+
|
|
988
|
+
If a margin is applied to the box type full, it is added to all size values. The shape will keep its edges.
|
|
989
|
+
The hollow box type consists of thin boxes that make up its walls.
|
|
990
|
+
If a margin is applied to the box type hollow, its size values are reduced by the margin.
|
|
991
|
+
|
|
992
|
+
"""
|
|
993
|
+
|
|
994
|
+
shape_type: Literal['box'] = 'box'
|
|
995
|
+
size_x: float
|
|
996
|
+
"""
|
|
997
|
+
The dimension in x-direction in [mm].
|
|
998
|
+
"""
|
|
999
|
+
size_y: float
|
|
1000
|
+
"""
|
|
1001
|
+
The dimension in y-direction in [mm].
|
|
1002
|
+
"""
|
|
1003
|
+
size_z: float
|
|
1004
|
+
"""
|
|
1005
|
+
The dimension in z-direction in [mm].
|
|
1006
|
+
"""
|
|
1007
|
+
box_type: BoxType
|
|
1008
|
+
"""
|
|
1009
|
+
The box type defines if the box is hollow or full.
|
|
1010
|
+
"""
|
|
1011
|
+
|
|
1012
|
+
|
|
1013
|
+
class Rectangle(BaseModel):
|
|
1014
|
+
"""
|
|
1015
|
+
Defines an x/y-plane with finite size. Centred around the z-axis.
|
|
1016
|
+
"""
|
|
1017
|
+
|
|
1018
|
+
shape_type: Literal['rectangle'] = 'rectangle'
|
|
1019
|
+
size_x: float
|
|
1020
|
+
"""
|
|
1021
|
+
The dimension in x-direction in [mm].
|
|
1022
|
+
"""
|
|
1023
|
+
size_y: float
|
|
1024
|
+
"""
|
|
1025
|
+
The dimension in y-direction in [mm].
|
|
1026
|
+
"""
|
|
1027
|
+
|
|
1028
|
+
|
|
1029
|
+
class Plane(BaseModel):
|
|
1030
|
+
"""
|
|
1031
|
+
Defines an x/y-plane with infinite size.
|
|
1032
|
+
"""
|
|
1033
|
+
|
|
1034
|
+
shape_type: Literal['plane'] = 'plane'
|
|
1035
|
+
|
|
1036
|
+
|
|
1037
|
+
class Cylinder(BaseModel):
|
|
1038
|
+
"""
|
|
1039
|
+
Defines a cylindrical shape.
|
|
1040
|
+
Centred around origin, symmetric around z-axis.
|
|
1041
|
+
|
|
1042
|
+
If a margin is applied, it is added to radius and height. The shape will keep its edges.
|
|
1043
|
+
|
|
1044
|
+
"""
|
|
1045
|
+
|
|
1046
|
+
shape_type: Literal['cylinder'] = 'cylinder'
|
|
1047
|
+
radius: float
|
|
1048
|
+
"""
|
|
1049
|
+
The radius of the cylinder in [mm].
|
|
1050
|
+
"""
|
|
1051
|
+
height: float
|
|
1052
|
+
"""
|
|
1053
|
+
The height of the cylinder in [mm].
|
|
1054
|
+
"""
|
|
1055
|
+
|
|
1056
|
+
|
|
1057
|
+
class Capsule(BaseModel):
|
|
1058
|
+
"""
|
|
1059
|
+
Defines a cylindrical shape with 2 semi-spheres on the top and bottom.
|
|
1060
|
+
Centred around origin, symmetric around z-axis.
|
|
1061
|
+
|
|
1062
|
+
"""
|
|
1063
|
+
|
|
1064
|
+
shape_type: Literal['capsule'] = 'capsule'
|
|
1065
|
+
radius: float
|
|
1066
|
+
"""
|
|
1067
|
+
The radius of the cylinder and semi-spheres in [mm].
|
|
1068
|
+
"""
|
|
1069
|
+
cylinder_height: float
|
|
1070
|
+
"""
|
|
1071
|
+
The height of the inner cylinder in [mm].
|
|
1072
|
+
"""
|
|
1073
|
+
|
|
1074
|
+
|
|
1075
|
+
class RectangularCapsule(BaseModel):
|
|
1076
|
+
"""
|
|
1077
|
+
Convex hull around four spheres. Sphere center points in x/y-plane, offset by either combination "+/- sizeX" or "+/- sizeY".
|
|
1078
|
+
|
|
1079
|
+
Alternative description: Rectangle in x/y-plane with a 3D padding.
|
|
1080
|
+
|
|
1081
|
+
"""
|
|
1082
|
+
|
|
1083
|
+
shape_type: Literal['rectangular_capsule'] = 'rectangular_capsule'
|
|
1084
|
+
radius: float
|
|
1085
|
+
"""
|
|
1086
|
+
The radius of the inner spheres in [mm].
|
|
1087
|
+
"""
|
|
1088
|
+
sphere_center_distance_x: float
|
|
1089
|
+
"""
|
|
1090
|
+
The distance of the sphere center in x-direction in [mm].
|
|
1091
|
+
"""
|
|
1092
|
+
sphere_center_distance_y: float
|
|
1093
|
+
"""
|
|
1094
|
+
The distance of the sphere center in y-direction in [mm].
|
|
1095
|
+
"""
|
|
1096
|
+
|
|
1097
|
+
|
|
1098
|
+
class Vector3d(RootModel):
|
|
1099
|
+
"""
|
|
1100
|
+
A three-dimensional vector [x, y, z] with double precision.
|
|
1101
|
+
|
|
1102
|
+
"""
|
|
1103
|
+
|
|
1104
|
+
root: Annotated[List[float], Field(max_length=3, min_length=3, title='Vector3d')]
|
|
1105
|
+
"""
|
|
1106
|
+
A three-dimensional vector [x, y, z] with double precision.
|
|
1107
|
+
|
|
1108
|
+
"""
|
|
1109
|
+
|
|
1110
|
+
def __getitem__(self, index: int) -> float:
|
|
1111
|
+
"""
|
|
1112
|
+
Make list RootModel directly indexable.
|
|
1113
|
+
"""
|
|
1114
|
+
return self.root[index]
|
|
1115
|
+
|
|
1116
|
+
def __setitem__(self, index: int, value: float) -> None:
|
|
1117
|
+
"""
|
|
1118
|
+
Make list RootModel directly indexable.
|
|
1119
|
+
"""
|
|
1120
|
+
self.root[index] = value
|
|
1121
|
+
|
|
1122
|
+
def __len__(self) -> int:
|
|
1123
|
+
"""
|
|
1124
|
+
Make list RootModel directly usable with len().
|
|
1125
|
+
"""
|
|
1126
|
+
return len(self.root)
|
|
1127
|
+
|
|
1128
|
+
def __iter__(self):
|
|
1129
|
+
"""
|
|
1130
|
+
Make list RootModel directly iterable.
|
|
1131
|
+
"""
|
|
1132
|
+
return iter(self.root)
|
|
1133
|
+
|
|
1134
|
+
|
|
1135
|
+
class ConvexHull(BaseModel):
|
|
1136
|
+
"""
|
|
1137
|
+
Defines a convex hull encapsulating a set of vertices.
|
|
1138
|
+
"""
|
|
1139
|
+
|
|
1140
|
+
shape_type: Literal['convex_hull'] = 'convex_hull'
|
|
1141
|
+
vertices: List[Vector3d]
|
|
1142
|
+
"""
|
|
1143
|
+
The list of encapsulated points.
|
|
1144
|
+
"""
|
|
1145
|
+
|
|
1146
|
+
|
|
1147
|
+
class RotationVector(RootModel):
|
|
1148
|
+
"""
|
|
1149
|
+
Defines a rotation in 3D space.
|
|
1150
|
+
A three-dimensional Vector [rx, ry, rz] with double precision.
|
|
1151
|
+
Rotation is applied around the vector.
|
|
1152
|
+
The angle of rotation equals the length of the vector.
|
|
1153
|
+
|
|
1154
|
+
"""
|
|
1155
|
+
|
|
1156
|
+
root: Annotated[
|
|
1157
|
+
List[float], Field(max_length=3, min_length=3, title='RotationVector')
|
|
1158
|
+
]
|
|
1159
|
+
"""
|
|
1160
|
+
Defines a rotation in 3D space.
|
|
1161
|
+
A three-dimensional Vector [rx, ry, rz] with double precision.
|
|
1162
|
+
Rotation is applied around the vector.
|
|
1163
|
+
The angle of rotation equals the length of the vector.
|
|
1164
|
+
|
|
1165
|
+
"""
|
|
1166
|
+
|
|
1167
|
+
def __getitem__(self, index: int) -> float:
|
|
1168
|
+
"""
|
|
1169
|
+
Make list RootModel directly indexable.
|
|
1170
|
+
"""
|
|
1171
|
+
return self.root[index]
|
|
1172
|
+
|
|
1173
|
+
def __setitem__(self, index: int, value: float) -> None:
|
|
1174
|
+
"""
|
|
1175
|
+
Make list RootModel directly indexable.
|
|
1176
|
+
"""
|
|
1177
|
+
self.root[index] = value
|
|
1178
|
+
|
|
1179
|
+
def __len__(self) -> int:
|
|
1180
|
+
"""
|
|
1181
|
+
Make list RootModel directly usable with len().
|
|
1182
|
+
"""
|
|
1183
|
+
return len(self.root)
|
|
1184
|
+
|
|
1185
|
+
def __iter__(self):
|
|
1186
|
+
"""
|
|
1187
|
+
Make list RootModel directly iterable.
|
|
1188
|
+
"""
|
|
1189
|
+
return iter(self.root)
|
|
1190
|
+
|
|
1191
|
+
|
|
1192
|
+
class Pose(BaseModel):
|
|
1193
|
+
"""
|
|
1194
|
+
Defines a pose in 3D space.
|
|
1195
|
+
A pose is a combination of a position and an orientation.
|
|
1196
|
+
The position is applied before the orientation.
|
|
1197
|
+
|
|
1198
|
+
"""
|
|
1199
|
+
|
|
1200
|
+
position: Optional[Vector3d] = None
|
|
1201
|
+
orientation: Optional[RotationVector] = None
|
|
1202
|
+
|
|
1203
|
+
|
|
1204
|
+
class Collider(BaseModel):
|
|
1205
|
+
"""
|
|
1206
|
+
Defines a collider with a single shape.
|
|
1207
|
+
|
|
1208
|
+
A collider is an object that is used for collision detection.
|
|
1209
|
+
It defines the `shape` that is attached with the offset of `pose` to a reference frame.
|
|
1210
|
+
|
|
1211
|
+
Use colliders to:
|
|
1212
|
+
- Define the shape of a workpiece. The reference frame is the scene origin.
|
|
1213
|
+
- Define the shape of a link in a motion group. The reference frame is the link coordinate system.
|
|
1214
|
+
- Define the shape of a tool. The reference frame is the flange coordinate system.
|
|
1215
|
+
|
|
1216
|
+
"""
|
|
1217
|
+
|
|
1218
|
+
shape: Annotated[
|
|
1219
|
+
Union[
|
|
1220
|
+
Sphere,
|
|
1221
|
+
Box,
|
|
1222
|
+
Rectangle,
|
|
1223
|
+
Plane,
|
|
1224
|
+
Cylinder,
|
|
1225
|
+
Capsule,
|
|
1226
|
+
RectangularCapsule,
|
|
1227
|
+
ConvexHull,
|
|
1228
|
+
],
|
|
1229
|
+
Field(discriminator='shape_type'),
|
|
1230
|
+
]
|
|
1231
|
+
pose: Optional[Pose] = None
|
|
1232
|
+
margin: Optional[float] = 0
|
|
1233
|
+
"""
|
|
1234
|
+
Increases the shape's size in all dimensions. Applied in [mm]. Can be used to keep a safe distance to the shape.
|
|
1235
|
+
"""
|
|
1236
|
+
|
|
1237
|
+
|
|
1238
|
+
class Link(RootModel):
|
|
1239
|
+
root: Dict[str, Collider]
|
|
1240
|
+
|
|
1241
|
+
|
|
1242
|
+
class LinkChain(RootModel):
|
|
1243
|
+
"""
|
|
1244
|
+
A link chain is a kinematic chain of links that is connected via joints.
|
|
1245
|
+
A motion group can be used to control the motion of the joints in a link chain.
|
|
1246
|
+
|
|
1247
|
+
A link is a group of colliders that is attached to the link reference frame.
|
|
1248
|
+
|
|
1249
|
+
The reference frame of a link is obtained after applying all sets of Denavit-Hartenberg-parameters from base to (including) the link index.
|
|
1250
|
+
|
|
1251
|
+
This means that the reference frame of the link is on the rotation axis of the next joint in the kinematic chain.
|
|
1252
|
+
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:
|
|
1253
|
+
- Origin >> Mounting >> Base >> (CRF Base) Joint 0 >> Link 0 >> (CRF Link 0) Joint 1 >> Link 1 >> (CRF Link 1) Flange (CRF Tool) >> TCP
|
|
1254
|
+
|
|
1255
|
+
Adjacent links in the kinematic chain of the motion group are not checked for mutual collision.
|
|
1256
|
+
|
|
1257
|
+
"""
|
|
1258
|
+
|
|
1259
|
+
root: Annotated[
|
|
1260
|
+
List[Link],
|
|
1261
|
+
Field(
|
|
1262
|
+
examples=[
|
|
1263
|
+
[
|
|
1264
|
+
{
|
|
1265
|
+
'link_0_sphere': {
|
|
1266
|
+
'shape': {'shape_type': 'sphere', 'radius': 10},
|
|
1267
|
+
'pose': {'position': [0, 0, -10]},
|
|
1268
|
+
},
|
|
1269
|
+
'link_0_capsule': {
|
|
1270
|
+
'shape': {
|
|
1271
|
+
'shape_type': 'capsule',
|
|
1272
|
+
'radius': 5,
|
|
1273
|
+
'cylinder_height': 20,
|
|
1274
|
+
}
|
|
1275
|
+
},
|
|
1276
|
+
},
|
|
1277
|
+
{},
|
|
1278
|
+
{
|
|
1279
|
+
'link_2_capsule': {
|
|
1280
|
+
'shape': {
|
|
1281
|
+
'shape_type': 'capsule',
|
|
1282
|
+
'radius': 5,
|
|
1283
|
+
'cylinder_height': 20,
|
|
1284
|
+
}
|
|
1285
|
+
}
|
|
1286
|
+
},
|
|
1287
|
+
]
|
|
1288
|
+
],
|
|
1289
|
+
title='Link Chain',
|
|
1290
|
+
),
|
|
1291
|
+
]
|
|
1292
|
+
"""
|
|
1293
|
+
A link chain is a kinematic chain of links that is connected via joints.
|
|
1294
|
+
A motion group can be used to control the motion of the joints in a link chain.
|
|
1295
|
+
|
|
1296
|
+
A link is a group of colliders that is attached to the link reference frame.
|
|
1297
|
+
|
|
1298
|
+
The reference frame of a link is obtained after applying all sets of Denavit-Hartenberg-parameters from base to (including) the link index.
|
|
1299
|
+
|
|
1300
|
+
This means that the reference frame of the link is on the rotation axis of the next joint in the kinematic chain.
|
|
1301
|
+
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:
|
|
1302
|
+
- Origin >> Mounting >> Base >> (CRF Base) Joint 0 >> Link 0 >> (CRF Link 0) Joint 1 >> Link 1 >> (CRF Link 1) Flange (CRF Tool) >> TCP
|
|
1303
|
+
|
|
1304
|
+
Adjacent links in the kinematic chain of the motion group are not checked for mutual collision.
|
|
1305
|
+
|
|
1306
|
+
"""
|
|
1307
|
+
|
|
1308
|
+
def __getitem__(self, index: int) -> Link:
|
|
1309
|
+
"""
|
|
1310
|
+
Make list RootModel directly indexable.
|
|
1311
|
+
"""
|
|
1312
|
+
return self.root[index]
|
|
1313
|
+
|
|
1314
|
+
def __setitem__(self, index: int, value: Link) -> None:
|
|
1315
|
+
"""
|
|
1316
|
+
Make list RootModel directly indexable.
|
|
1317
|
+
"""
|
|
1318
|
+
self.root[index] = value
|
|
1319
|
+
|
|
1320
|
+
def __len__(self) -> int:
|
|
1321
|
+
"""
|
|
1322
|
+
Make list RootModel directly usable with len().
|
|
1323
|
+
"""
|
|
1324
|
+
return len(self.root)
|
|
1325
|
+
|
|
1326
|
+
def __iter__(self):
|
|
1327
|
+
"""
|
|
1328
|
+
Make list RootModel directly iterable.
|
|
1329
|
+
"""
|
|
1330
|
+
return iter(self.root)
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
class ControllerDescription(BaseModel):
|
|
1334
|
+
"""
|
|
1335
|
+
The data type to describe a robot controller.
|
|
1336
|
+
"""
|
|
1337
|
+
|
|
1338
|
+
connected_motion_groups: List[str]
|
|
1339
|
+
supports_freedrive: bool
|
|
1340
|
+
"""
|
|
1341
|
+
Can this controller be moved through freedrive (true), or not (false).
|
|
1342
|
+
"""
|
|
1343
|
+
supports_control: bool
|
|
1344
|
+
"""
|
|
1345
|
+
Can this controller be controlled with NOVA (true) or is it only possible to read data (false).
|
|
1346
|
+
"""
|
|
1347
|
+
supports_safety_zones: bool
|
|
1348
|
+
"""
|
|
1349
|
+
True if NOVA supports reading safety zone-, tool- and link-geometries for this motion group.
|
|
1350
|
+
Safety zones are used to define areas where the robot should slow down or stop.
|
|
1351
|
+
If false, NOVA can't guarantee that the executed motions respect safety zones defined on the controller.
|
|
1352
|
+
|
|
1353
|
+
"""
|
|
1354
|
+
|
|
1355
|
+
|
|
1356
|
+
class RobotSystemMode(Enum):
|
|
1357
|
+
"""
|
|
1358
|
+
Defines the current system mode of the robot system, including NOVA communicating with the robot controller.
|
|
1359
|
+
|
|
1360
|
+
### MODE_CONTROLLER_NOT_CONFIGURED
|
|
1361
|
+
|
|
1362
|
+
No controller with the specified identifier is configured. Call [addRobotController](addRobotController) to register a controller.
|
|
1363
|
+
|
|
1364
|
+
### MODE_INITIALIZING
|
|
1365
|
+
|
|
1366
|
+
Indicates that a connection to the robot controller is established or reestablished in case of a disconnect.
|
|
1367
|
+
On success, the controller is set to MODE_MONITOR.
|
|
1368
|
+
On failure, the initialization process is retried until successful or cancelled by the user.
|
|
1369
|
+
|
|
1370
|
+
### MODE_MONITOR
|
|
1371
|
+
|
|
1372
|
+
Read-only mode with an active controller connection.
|
|
1373
|
+
- Receives robot state and I/O signals
|
|
1374
|
+
- Move requests are rejected
|
|
1375
|
+
- No commands are sent to the controller
|
|
1376
|
+
|
|
1377
|
+
### MODE_CONTROL
|
|
1378
|
+
|
|
1379
|
+
Active control mode.
|
|
1380
|
+
|
|
1381
|
+
**Movement is possible in this mode**
|
|
1382
|
+
|
|
1383
|
+
The robot is cyclically commanded to hold its current position.
|
|
1384
|
+
The robot state is received in sync with the controller cycle.
|
|
1385
|
+
Motion and jogging requests are accepted and executed.
|
|
1386
|
+
Input/Output interaction is enabled.
|
|
1387
|
+
|
|
1388
|
+
### MODE_FREE_DRIVE
|
|
1389
|
+
|
|
1390
|
+
Read-only mode with servo motors enabled for manual movement (Free Drive).
|
|
1391
|
+
|
|
1392
|
+
Move requests are rejected.
|
|
1393
|
+
|
|
1394
|
+
Not supported by all robots: Use [getSupportedModes](getSupportedModes) to check Free Drive availability.
|
|
1395
|
+
|
|
1396
|
+
"""
|
|
1397
|
+
|
|
1398
|
+
MODE_CONTROLLER_NOT_CONFIGURED = 'MODE_CONTROLLER_NOT_CONFIGURED'
|
|
1399
|
+
MODE_INITIALIZING = 'MODE_INITIALIZING'
|
|
1400
|
+
MODE_MONITOR = 'MODE_MONITOR'
|
|
1401
|
+
MODE_CONTROL = 'MODE_CONTROL'
|
|
1402
|
+
MODE_FREE_DRIVE = 'MODE_FREE_DRIVE'
|
|
1403
|
+
|
|
1404
|
+
|
|
1405
|
+
class OperationMode(Enum):
|
|
1406
|
+
"""
|
|
1407
|
+
Current operation mode of the configured robot controller.
|
|
1408
|
+
Operation modes in which the attached motion groups can be moved are:
|
|
1409
|
+
- OPERATION_MODE_MANUAL (if enabling switch is pressed)
|
|
1410
|
+
- OPERATION_MODE_MANUAL_T1 (if enabling switch is pressed)
|
|
1411
|
+
- OPERATION_MODE_MANUAL_T2 (if enabling switch is pressed)
|
|
1412
|
+
- OPERATION_MODE_AUTO (without needing to press enabling switch)
|
|
1413
|
+
All other modes are considered as non-operational.
|
|
1414
|
+
|
|
1415
|
+
"""
|
|
1416
|
+
|
|
1417
|
+
OPERATION_MODE_UNKNOWN = 'OPERATION_MODE_UNKNOWN'
|
|
1418
|
+
OPERATION_MODE_NO_CONTROLLER = 'OPERATION_MODE_NO_CONTROLLER'
|
|
1419
|
+
OPERATION_MODE_DISCONNECTED = 'OPERATION_MODE_DISCONNECTED'
|
|
1420
|
+
OPERATION_MODE_POWER_ON = 'OPERATION_MODE_POWER_ON'
|
|
1421
|
+
OPERATION_MODE_PENDING = 'OPERATION_MODE_PENDING'
|
|
1422
|
+
OPERATION_MODE_MANUAL = 'OPERATION_MODE_MANUAL'
|
|
1423
|
+
OPERATION_MODE_MANUAL_T1 = 'OPERATION_MODE_MANUAL_T1'
|
|
1424
|
+
OPERATION_MODE_MANUAL_T2 = 'OPERATION_MODE_MANUAL_T2'
|
|
1425
|
+
OPERATION_MODE_AUTO = 'OPERATION_MODE_AUTO'
|
|
1426
|
+
OPERATION_MODE_RECOVERY = 'OPERATION_MODE_RECOVERY'
|
|
1427
|
+
|
|
1428
|
+
|
|
1429
|
+
class SafetyStateType(Enum):
|
|
1430
|
+
"""
|
|
1431
|
+
Current safety state of the configured robot controller.
|
|
1432
|
+
Operation modes in which the attached motion groups can be moved are:
|
|
1433
|
+
- SAFETY_STATE_NORMAL
|
|
1434
|
+
- SAFETY_STATE_REDUCED
|
|
1435
|
+
All other modes are considered as non-operational.
|
|
1436
|
+
|
|
1437
|
+
"""
|
|
1438
|
+
|
|
1439
|
+
SAFETY_STATE_UNKNOWN = 'SAFETY_STATE_UNKNOWN'
|
|
1440
|
+
SAFETY_STATE_FAULT = 'SAFETY_STATE_FAULT'
|
|
1441
|
+
SAFETY_STATE_NORMAL = 'SAFETY_STATE_NORMAL'
|
|
1442
|
+
SAFETY_STATE_MASTERING = 'SAFETY_STATE_MASTERING'
|
|
1443
|
+
SAFETY_STATE_CONFIRM_SAFETY = 'SAFETY_STATE_CONFIRM_SAFETY'
|
|
1444
|
+
SAFETY_STATE_OPERATOR_SAFETY = 'SAFETY_STATE_OPERATOR_SAFETY'
|
|
1445
|
+
SAFETY_STATE_PROTECTIVE_STOP = 'SAFETY_STATE_PROTECTIVE_STOP'
|
|
1446
|
+
SAFETY_STATE_REDUCED = 'SAFETY_STATE_REDUCED'
|
|
1447
|
+
SAFETY_STATE_STOP = 'SAFETY_STATE_STOP'
|
|
1448
|
+
SAFETY_STATE_STOP_0 = 'SAFETY_STATE_STOP_0'
|
|
1449
|
+
SAFETY_STATE_STOP_1 = 'SAFETY_STATE_STOP_1'
|
|
1450
|
+
SAFETY_STATE_STOP_2 = 'SAFETY_STATE_STOP_2'
|
|
1451
|
+
SAFETY_STATE_RECOVERY = 'SAFETY_STATE_RECOVERY'
|
|
1452
|
+
SAFETY_STATE_DEVICE_EMERGENCY_STOP = 'SAFETY_STATE_DEVICE_EMERGENCY_STOP'
|
|
1453
|
+
SAFETY_STATE_ROBOT_EMERGENCY_STOP = 'SAFETY_STATE_ROBOT_EMERGENCY_STOP'
|
|
1454
|
+
SAFETY_STATE_VIOLATION = 'SAFETY_STATE_VIOLATION'
|
|
1455
|
+
|
|
1456
|
+
|
|
1457
|
+
class Joints(RootModel):
|
|
1458
|
+
"""
|
|
1459
|
+
This structure describes a set of joint values, e.g., positions, currents, torques, of a motion group.
|
|
1460
|
+
|
|
1461
|
+
Float precision is the default.
|
|
1462
|
+
|
|
1463
|
+
"""
|
|
1464
|
+
|
|
1465
|
+
root: List[float]
|
|
1466
|
+
"""
|
|
1467
|
+
This structure describes a set of joint values, e.g., positions, currents, torques, of a motion group.
|
|
1468
|
+
|
|
1469
|
+
Float precision is the default.
|
|
1470
|
+
|
|
1471
|
+
"""
|
|
1472
|
+
|
|
1473
|
+
def __getitem__(self, index: int) -> float:
|
|
1474
|
+
"""
|
|
1475
|
+
Make list RootModel directly indexable.
|
|
1476
|
+
"""
|
|
1477
|
+
return self.root[index]
|
|
1478
|
+
|
|
1479
|
+
def __setitem__(self, index: int, value: float) -> None:
|
|
1480
|
+
"""
|
|
1481
|
+
Make list RootModel directly indexable.
|
|
1482
|
+
"""
|
|
1483
|
+
self.root[index] = value
|
|
1484
|
+
|
|
1485
|
+
def __len__(self) -> int:
|
|
1486
|
+
"""
|
|
1487
|
+
Make list RootModel directly usable with len().
|
|
1488
|
+
"""
|
|
1489
|
+
return len(self.root)
|
|
1490
|
+
|
|
1491
|
+
def __iter__(self):
|
|
1492
|
+
"""
|
|
1493
|
+
Make list RootModel directly iterable.
|
|
1494
|
+
"""
|
|
1495
|
+
return iter(self.root)
|
|
1496
|
+
|
|
1497
|
+
|
|
1498
|
+
class MotionGroupStateJointLimitReached(BaseModel):
|
|
1499
|
+
"""
|
|
1500
|
+
Indicates which joint of the motion group is in a limit.
|
|
1501
|
+
If a joint is in its limit, only this joint can be moved. Movements that affect any other joints are not executed.
|
|
1502
|
+
|
|
1503
|
+
"""
|
|
1504
|
+
|
|
1505
|
+
limit_reached: List[bool]
|
|
1506
|
+
"""
|
|
1507
|
+
If true, operational (soft) jointLimit is reached for specific joint.
|
|
1508
|
+
"""
|
|
1509
|
+
|
|
1510
|
+
|
|
1511
|
+
class JoggingRunning(BaseModel):
|
|
1512
|
+
"""
|
|
1513
|
+
Jogging is active.
|
|
1514
|
+
|
|
1515
|
+
"""
|
|
1516
|
+
|
|
1517
|
+
kind: Literal['RUNNING'] = 'RUNNING'
|
|
1518
|
+
|
|
1519
|
+
|
|
1520
|
+
class JoggingPausedByUser(BaseModel):
|
|
1521
|
+
"""
|
|
1522
|
+
User has paused jogging.
|
|
1523
|
+
|
|
1524
|
+
"""
|
|
1525
|
+
|
|
1526
|
+
kind: Literal['PAUSED_BY_USER'] = 'PAUSED_BY_USER'
|
|
1527
|
+
|
|
1528
|
+
|
|
1529
|
+
class JoggingPausedOnIO(BaseModel):
|
|
1530
|
+
"""
|
|
1531
|
+
Jogging was paused because of an I/O event.
|
|
1532
|
+
|
|
1533
|
+
"""
|
|
1534
|
+
|
|
1535
|
+
kind: Literal['PAUSED_ON_IO'] = 'PAUSED_ON_IO'
|
|
1536
|
+
|
|
1537
|
+
|
|
1538
|
+
class JointIndice(RootModel):
|
|
1539
|
+
root: Annotated[int, Field(ge=0, le=2147483647)]
|
|
1540
|
+
|
|
1541
|
+
|
|
1542
|
+
class JoggingPausedNearJointLimit(BaseModel):
|
|
1543
|
+
"""
|
|
1544
|
+
Jogging was paused because a joint is near its limit.
|
|
1545
|
+
|
|
1546
|
+
"""
|
|
1547
|
+
|
|
1548
|
+
kind: Literal['PAUSED_NEAR_JOINT_LIMIT'] = 'PAUSED_NEAR_JOINT_LIMIT'
|
|
1549
|
+
joint_indices: List[JointIndice]
|
|
1550
|
+
|
|
1551
|
+
|
|
1552
|
+
class JoggingPausedNearCollision(BaseModel):
|
|
1553
|
+
"""
|
|
1554
|
+
Jogging was paused because the motion group neared a collision.
|
|
1555
|
+
|
|
1556
|
+
"""
|
|
1557
|
+
|
|
1558
|
+
kind: Literal['PAUSED_NEAR_COLLISION'] = 'PAUSED_NEAR_COLLISION'
|
|
1559
|
+
description: str
|
|
1560
|
+
|
|
1561
|
+
|
|
1562
|
+
class JoggingDetails(BaseModel):
|
|
1563
|
+
"""
|
|
1564
|
+
State of jogging execution.
|
|
1565
|
+
This state is sent during jogging movement, response-rate closest to the nearest multiple of controller step-rate but not exceeding the configured rate.
|
|
1566
|
+
The jogging state can be one of the following:
|
|
1567
|
+
- RUNNING: Jogging is active.
|
|
1568
|
+
- PAUSED_BY_USER: User has paused jogging.
|
|
1569
|
+
- PAUSED_NEAR_JOINT_LIMIT: Jogging was paused because a joint is is near its limit.
|
|
1570
|
+
- PAUSED_NEAR_COLLISION: Jogging was paused because the motion group neared a collision.
|
|
1571
|
+
- PAUSED_ON_IO: Jogging was paused because of an I/O event.
|
|
1572
|
+
|
|
1573
|
+
"""
|
|
1574
|
+
|
|
1575
|
+
state: Annotated[
|
|
1576
|
+
Union[
|
|
1577
|
+
JoggingRunning,
|
|
1578
|
+
JoggingPausedByUser,
|
|
1579
|
+
JoggingPausedOnIO,
|
|
1580
|
+
JoggingPausedNearJointLimit,
|
|
1581
|
+
JoggingPausedNearCollision,
|
|
1582
|
+
],
|
|
1583
|
+
Field(discriminator='kind'),
|
|
1584
|
+
]
|
|
1585
|
+
kind: Literal['JOGGING'] = 'JOGGING'
|
|
1586
|
+
|
|
1587
|
+
|
|
1588
|
+
class Location(RootModel):
|
|
1589
|
+
root: float
|
|
1590
|
+
"""
|
|
1591
|
+
Location on trajectory where the execution will start.
|
|
1592
|
+
The default value is the start (forward movement) or end (backward movement) of the trajectory.
|
|
1593
|
+
If you want to start your movement from an arbitrary location, e.g., in combination with [streamMoveToTrajectoryViaJointPTP](streamMoveToTrajectoryViaJointPTP),
|
|
1594
|
+
set the location by respecting the following format:
|
|
1595
|
+
- The location is a scalar value that defines a position along a path, typically ranging from 0 to `n`,
|
|
1596
|
+
where `n` denotes the number of motion commands
|
|
1597
|
+
- Each integer value of the location corresponds to a specific motion command,
|
|
1598
|
+
while non-integer values interpolate positions within the segments.
|
|
1599
|
+
- The location is calculated from the joint path
|
|
1600
|
+
|
|
1601
|
+
"""
|
|
1602
|
+
|
|
1603
|
+
|
|
1604
|
+
class TrajectoryRunning(BaseModel):
|
|
1605
|
+
"""
|
|
1606
|
+
Trajectory is being executed.
|
|
1607
|
+
|
|
1608
|
+
"""
|
|
1609
|
+
|
|
1610
|
+
kind: Literal['RUNNING'] = 'RUNNING'
|
|
1611
|
+
time_to_end: Annotated[int, Field(ge=0, le=4294967295)]
|
|
1612
|
+
"""
|
|
1613
|
+
Remaining time in milliseconds (ms) to reach the end of the motion.
|
|
1614
|
+
"""
|
|
1615
|
+
|
|
1616
|
+
|
|
1617
|
+
class TrajectoryPausedByUser(BaseModel):
|
|
1618
|
+
"""
|
|
1619
|
+
User has paused execution.
|
|
1620
|
+
|
|
1621
|
+
"""
|
|
1622
|
+
|
|
1623
|
+
kind: Literal['PAUSED_BY_USER'] = 'PAUSED_BY_USER'
|
|
1624
|
+
|
|
1625
|
+
|
|
1626
|
+
class TrajectoryEnded(BaseModel):
|
|
1627
|
+
"""
|
|
1628
|
+
First or last sample (depending on direction) of trajectory has been sent.
|
|
1629
|
+
|
|
1630
|
+
"""
|
|
1631
|
+
|
|
1632
|
+
kind: Literal['END_OF_TRAJECTORY'] = 'END_OF_TRAJECTORY'
|
|
1633
|
+
|
|
1634
|
+
|
|
1635
|
+
class TrajectoryWaitForIO(BaseModel):
|
|
1636
|
+
"""
|
|
1637
|
+
Waiting for an I/O event to start execution.
|
|
1638
|
+
|
|
1639
|
+
"""
|
|
1640
|
+
|
|
1641
|
+
kind: Literal['WAIT_FOR_IO'] = 'WAIT_FOR_IO'
|
|
1642
|
+
|
|
1643
|
+
|
|
1644
|
+
class TrajectoryPausedOnIO(BaseModel):
|
|
1645
|
+
"""
|
|
1646
|
+
Execution was paused because of an I/O event.
|
|
1647
|
+
|
|
1648
|
+
"""
|
|
1649
|
+
|
|
1650
|
+
kind: Literal['PAUSED_ON_IO'] = 'PAUSED_ON_IO'
|
|
1651
|
+
|
|
1652
|
+
|
|
1653
|
+
class TrajectoryDetails(BaseModel):
|
|
1654
|
+
"""
|
|
1655
|
+
State of trajectory execution.
|
|
1656
|
+
This state is sent during trajectory movement, response-rate closest to the nearest multiple of controller step-rate but not exceeding the configured rate.
|
|
1657
|
+
The trajectory state can be one of the following:
|
|
1658
|
+
- RUNNING: Trajectory is being executed.
|
|
1659
|
+
- PAUSED_BY_USER: User has paused execution.
|
|
1660
|
+
- END_OF_TRAJECTORY: First or last sample (depending on direction) of trajectory has been sent.
|
|
1661
|
+
- WAIT_FOR_IO: Waiting for an I/O event to start execution.
|
|
1662
|
+
- PAUSED_ON_IO: Execution was paused because of an I/O event.
|
|
1663
|
+
|
|
1664
|
+
"""
|
|
1665
|
+
|
|
1666
|
+
trajectory: str
|
|
1667
|
+
"""
|
|
1668
|
+
Unique identifier of the trajectory being executed.
|
|
1669
|
+
|
|
1670
|
+
"""
|
|
1671
|
+
location: Location
|
|
1672
|
+
state: Annotated[
|
|
1673
|
+
Union[
|
|
1674
|
+
TrajectoryRunning,
|
|
1675
|
+
TrajectoryPausedByUser,
|
|
1676
|
+
TrajectoryEnded,
|
|
1677
|
+
TrajectoryWaitForIO,
|
|
1678
|
+
TrajectoryPausedOnIO,
|
|
1679
|
+
],
|
|
1680
|
+
Field(discriminator='kind'),
|
|
1681
|
+
]
|
|
1682
|
+
kind: Literal['TRAJECTORY'] = 'TRAJECTORY'
|
|
1683
|
+
"""
|
|
1684
|
+
Discriminator for OpenApi generators, which is always "TRAJECTORY" for this schema.
|
|
1685
|
+
|
|
1686
|
+
"""
|
|
1687
|
+
|
|
1688
|
+
|
|
1689
|
+
class Execute(BaseModel):
|
|
1690
|
+
"""
|
|
1691
|
+
Details about the state of the motion execution.
|
|
1692
|
+
The details are either for a jogging or a trajectory.
|
|
1693
|
+
If NOVA is not controlling this motion group at the moment, this field is omitted.
|
|
1694
|
+
|
|
1695
|
+
"""
|
|
1696
|
+
|
|
1697
|
+
joint_position: List[float]
|
|
1698
|
+
"""
|
|
1699
|
+
Commanded joint position of each joint in [rad]. This command was sent in the time step the corresponding state was received.
|
|
1700
|
+
|
|
1701
|
+
"""
|
|
1702
|
+
details: Annotated[
|
|
1703
|
+
Optional[Union[JoggingDetails, TrajectoryDetails]], Field(discriminator='kind')
|
|
1704
|
+
] = None
|
|
1705
|
+
|
|
1706
|
+
|
|
1707
|
+
class MotionGroupState(BaseModel):
|
|
1708
|
+
"""
|
|
1709
|
+
Presents the current state of the motion group.
|
|
1710
|
+
"""
|
|
1711
|
+
|
|
1712
|
+
timestamp: AwareDatetime
|
|
1713
|
+
"""
|
|
1714
|
+
Timestamp for when data was received from the robot controller.
|
|
1715
|
+
"""
|
|
1716
|
+
sequence_number: Annotated[int, Field(ge=0, le=4294967295)]
|
|
1717
|
+
"""
|
|
1718
|
+
Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller.
|
|
1719
|
+
The sequence number is reset when the connection to the physical controller is closed and re-established.
|
|
1720
|
+
|
|
1721
|
+
"""
|
|
1722
|
+
motion_group: str
|
|
1723
|
+
"""
|
|
1724
|
+
Identifier of the motion group.
|
|
1725
|
+
"""
|
|
1726
|
+
controller: str
|
|
1727
|
+
"""
|
|
1728
|
+
Convenience: Identifier of the robot controller the motion group is attached to.
|
|
1729
|
+
"""
|
|
1730
|
+
joint_position: Joints
|
|
1731
|
+
"""
|
|
1732
|
+
Current joint position of each joint in [rad]
|
|
1733
|
+
|
|
1734
|
+
"""
|
|
1735
|
+
joint_limit_reached: MotionGroupStateJointLimitReached
|
|
1736
|
+
"""
|
|
1737
|
+
Indicates whether the joint is in a limit for all joints of the motion group.
|
|
1738
|
+
|
|
1739
|
+
"""
|
|
1740
|
+
joint_torque: Optional[Joints] = None
|
|
1741
|
+
"""
|
|
1742
|
+
Current joint torque of each joint in [Nm].
|
|
1743
|
+
Is only available if the robot controller supports it, e.g., available for UR controllers.
|
|
1744
|
+
|
|
1745
|
+
"""
|
|
1746
|
+
joint_current: Optional[Joints] = None
|
|
1747
|
+
"""
|
|
1748
|
+
Current at TCP in [A].
|
|
1749
|
+
Is only available if the robot controller supports it, e.g., available for UR controllers.
|
|
1750
|
+
|
|
1751
|
+
"""
|
|
1752
|
+
flange_pose: Optional[Pose] = None
|
|
1753
|
+
"""
|
|
1754
|
+
Pose of the flange.
|
|
1755
|
+
Positions are in [mm].
|
|
1756
|
+
Oriantations are in [rad].
|
|
1757
|
+
The pose is relative to the response_coordinate_system specified in the request.
|
|
1758
|
+
For robot arms a flange pose is always returned, for positioners the flange might not be available, depending on the model.
|
|
1759
|
+
|
|
1760
|
+
"""
|
|
1761
|
+
tcp: Optional[str] = None
|
|
1762
|
+
"""
|
|
1763
|
+
Unique identifier addressing the active TCP.
|
|
1764
|
+
Might not be returned for positioners as some do not support TCPs, depending on the model.
|
|
1765
|
+
|
|
1766
|
+
"""
|
|
1767
|
+
tcp_pose: Optional[Pose] = None
|
|
1768
|
+
"""
|
|
1769
|
+
Pose of the TCP selected on the robot control panel.
|
|
1770
|
+
Positions are in [mm].
|
|
1771
|
+
Oriantations are in [rad].
|
|
1772
|
+
The pose is relative to the response_coordinate_system specified in the request.
|
|
1773
|
+
Might not be returned for positioners as some do not support TCPs, depending on the model.
|
|
1774
|
+
|
|
1775
|
+
"""
|
|
1776
|
+
coordinate_system: Optional[str] = None
|
|
1777
|
+
"""
|
|
1778
|
+
Unique identifier addressing the reference coordinate system of the cartesian data.
|
|
1779
|
+
Might not be returned for positioners as some do not support TCPs, depending on the model.
|
|
1780
|
+
Default: world coordinate system of corresponding controller.
|
|
1781
|
+
|
|
1782
|
+
"""
|
|
1783
|
+
payload: Optional[str] = None
|
|
1784
|
+
"""
|
|
1785
|
+
Unique identifier addressing the active payload.
|
|
1786
|
+
Only fetchable via GET endpoint, not available in WebSocket.
|
|
1787
|
+
|
|
1788
|
+
"""
|
|
1789
|
+
standstill: bool
|
|
1790
|
+
"""
|
|
1791
|
+
Indicates whether the motion group is in standstill.
|
|
1792
|
+
Convenience: Signals that NOVA treats measured joint velocities as 0.
|
|
1793
|
+
|
|
1794
|
+
"""
|
|
1795
|
+
execute: Optional[Execute] = None
|
|
1796
|
+
"""
|
|
1797
|
+
Data that was commanded to the motion group. Includes additional data on NOVA's execution components for executing trajectories and jogging.
|
|
1798
|
+
This is a convenience field to indicate the last command sent to the motion group.
|
|
1799
|
+
It is not available in all cases, e.g., if the motion group is not moved by NOVA.
|
|
1800
|
+
|
|
1801
|
+
"""
|
|
1802
|
+
|
|
1803
|
+
|
|
1804
|
+
class RobotControllerState(BaseModel):
|
|
1805
|
+
"""
|
|
1806
|
+
Returns the whole current state of robot controller.
|
|
1807
|
+
"""
|
|
1808
|
+
|
|
1809
|
+
mode: RobotSystemMode
|
|
1810
|
+
"""
|
|
1811
|
+
Mode of communication and control between NOVA and the robot controller.
|
|
1812
|
+
"""
|
|
1813
|
+
last_error: Optional[List[str]] = None
|
|
1814
|
+
"""
|
|
1815
|
+
Last error stack encountered during initialization process or after a controller disconnect.
|
|
1816
|
+
At this stage, it's unclear whether the error is fatal.
|
|
1817
|
+
|
|
1818
|
+
Evaluate `last_error` to decide whether to remove the controller using `deleteController`.
|
|
1819
|
+
Examples:
|
|
1820
|
+
- Delete required: Host resolution fails repeatedly due to an incorrect IP.
|
|
1821
|
+
- Delete not required: Temporary network delay caused a disconnect; the system will auto-reconnect.
|
|
1822
|
+
|
|
1823
|
+
"""
|
|
1824
|
+
timestamp: AwareDatetime
|
|
1825
|
+
"""
|
|
1826
|
+
Timestamp indicating when the represented information was received from the robot controller.
|
|
1827
|
+
"""
|
|
1828
|
+
sequence_number: Annotated[int, Field(ge=0, le=4294967295)]
|
|
1829
|
+
"""
|
|
1830
|
+
Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller.
|
|
1831
|
+
The sequence number is reset when the connection to the physical controller is closed and re-established.
|
|
1832
|
+
|
|
1833
|
+
"""
|
|
1834
|
+
controller: str
|
|
1835
|
+
"""
|
|
1836
|
+
Identifier of the configured robot controller.
|
|
1837
|
+
"""
|
|
1838
|
+
operation_mode: OperationMode
|
|
1839
|
+
safety_state: SafetyStateType
|
|
1840
|
+
velocity_override: Annotated[Optional[int], Field(ge=1, le=100)] = None
|
|
1841
|
+
"""
|
|
1842
|
+
If made available by the robot controller, returns the current velocity override in
|
|
1843
|
+
[percentage] for movements adjusted on robot control panel.
|
|
1844
|
+
Valid value range: 1 - 100.
|
|
1845
|
+
|
|
1846
|
+
"""
|
|
1847
|
+
motion_groups: Annotated[List[MotionGroupState], Field(title='MotionGroupState[]')]
|
|
1848
|
+
"""
|
|
1849
|
+
State of indicated motion groups.
|
|
1850
|
+
In case of state request via controller all configured motion groups are returned.
|
|
1851
|
+
In case of executing a motion only the affected motion groups are returned.
|
|
1852
|
+
|
|
1853
|
+
"""
|
|
1854
|
+
|
|
1855
|
+
|
|
1856
|
+
class IODirection(Enum):
|
|
1857
|
+
"""
|
|
1858
|
+
Identifies the input/output type.
|
|
1859
|
+
"""
|
|
1860
|
+
|
|
1861
|
+
IO_TYPE_INPUT = 'IO_TYPE_INPUT'
|
|
1862
|
+
IO_TYPE_OUTPUT = 'IO_TYPE_OUTPUT'
|
|
1863
|
+
|
|
1864
|
+
|
|
1865
|
+
class IOValueType(Enum):
|
|
1866
|
+
"""
|
|
1867
|
+
Data type of the input/output.
|
|
1868
|
+
"""
|
|
1869
|
+
|
|
1870
|
+
IO_VALUE_BOOLEAN = 'IO_VALUE_BOOLEAN'
|
|
1871
|
+
IO_VALUE_ANALOG_FLOAT = 'IO_VALUE_ANALOG_FLOAT'
|
|
1872
|
+
IO_VALUE_ANALOG_INTEGER = 'IO_VALUE_ANALOG_INTEGER'
|
|
1873
|
+
|
|
1874
|
+
|
|
1875
|
+
class UnitType(Enum):
|
|
1876
|
+
"""
|
|
1877
|
+
The unit of input/output value.
|
|
1878
|
+
"""
|
|
1879
|
+
|
|
1880
|
+
UNIT_NONE = 'UNIT_NONE'
|
|
1881
|
+
UNIT_KILOGRAM = 'UNIT_KILOGRAM'
|
|
1882
|
+
UNIT_AMPERE = 'UNIT_AMPERE'
|
|
1883
|
+
UNIT_KELVIN = 'UNIT_KELVIN'
|
|
1884
|
+
UNIT_HERTZ = 'UNIT_HERTZ'
|
|
1885
|
+
UNIT_NEWTON = 'UNIT_NEWTON'
|
|
1886
|
+
UNIT_VOLT = 'UNIT_VOLT'
|
|
1887
|
+
UNIT_CELSIUS = 'UNIT_CELSIUS'
|
|
1888
|
+
UNIT_NEWTON_METER = 'UNIT_NEWTON_METER'
|
|
1889
|
+
UNIT_METER = 'UNIT_METER'
|
|
1890
|
+
|
|
1891
|
+
|
|
1892
|
+
class BooleanValue(BaseModel):
|
|
1893
|
+
"""
|
|
1894
|
+
Value of a digital input/output.
|
|
1895
|
+
|
|
1896
|
+
"""
|
|
1897
|
+
|
|
1898
|
+
value: bool
|
|
1899
|
+
value_type: Literal['boolean'] = 'boolean'
|
|
1900
|
+
|
|
1901
|
+
|
|
1902
|
+
class IntegerValue(BaseModel):
|
|
1903
|
+
"""
|
|
1904
|
+
Value of an input/output with integer representation.
|
|
1905
|
+
|
|
1906
|
+
> The integral value is transmitted as a string to avoid precision loss during conversion to JSON.
|
|
1907
|
+
> Recommended: Use int64 in your implementation. If you want to interact with int64 in numbers,
|
|
1908
|
+
> JS bigint libraries can help you to parse the string into an integral value.
|
|
1909
|
+
|
|
1910
|
+
"""
|
|
1911
|
+
|
|
1912
|
+
value: str
|
|
1913
|
+
value_type: Literal['integer'] = 'integer'
|
|
1914
|
+
|
|
1915
|
+
|
|
1916
|
+
class FloatValue(BaseModel):
|
|
1917
|
+
value: float
|
|
1918
|
+
"""
|
|
1919
|
+
Value of an analog input/output in floating number representation.
|
|
1920
|
+
|
|
1921
|
+
"""
|
|
1922
|
+
value_type: Literal['float'] = 'float'
|
|
1923
|
+
|
|
1924
|
+
|
|
1925
|
+
class IOBoundary(RootModel):
|
|
1926
|
+
root: Annotated[
|
|
1927
|
+
Union[BooleanValue, IntegerValue, FloatValue],
|
|
1928
|
+
Field(discriminator='value_type', title='IOBoundary'),
|
|
1929
|
+
]
|
|
1930
|
+
|
|
1931
|
+
|
|
1932
|
+
class IODescription(BaseModel):
|
|
1933
|
+
io: str
|
|
1934
|
+
"""
|
|
1935
|
+
Unique identifier of the input/output.
|
|
1936
|
+
|
|
1937
|
+
"""
|
|
1938
|
+
name: str
|
|
1939
|
+
"""
|
|
1940
|
+
Name of the input/output. Customize it on the physical controller or in the virtual robot specification.
|
|
1941
|
+
|
|
1942
|
+
"""
|
|
1943
|
+
group: Optional[str] = None
|
|
1944
|
+
"""
|
|
1945
|
+
Name of the input/output group. Customize it on the physical controller or in the virtual robot specification.
|
|
1946
|
+
|
|
1947
|
+
"""
|
|
1948
|
+
direction: IODirection
|
|
1949
|
+
value_type: IOValueType
|
|
1950
|
+
unit: Optional[UnitType] = None
|
|
1951
|
+
min: Optional[IOBoundary] = None
|
|
1952
|
+
max: Optional[IOBoundary] = None
|
|
1953
|
+
|
|
1954
|
+
|
|
1955
|
+
class ListIODescriptionsResponse(RootModel):
|
|
1956
|
+
root: List[IODescription]
|
|
1957
|
+
|
|
1958
|
+
def __getitem__(self, index: int) -> IODescription:
|
|
1959
|
+
"""
|
|
1960
|
+
Make list RootModel directly indexable.
|
|
1961
|
+
"""
|
|
1962
|
+
return self.root[index]
|
|
1963
|
+
|
|
1964
|
+
def __setitem__(self, index: int, value: IODescription) -> None:
|
|
1965
|
+
"""
|
|
1966
|
+
Make list RootModel directly indexable.
|
|
1967
|
+
"""
|
|
1968
|
+
self.root[index] = value
|
|
1969
|
+
|
|
1970
|
+
def __len__(self) -> int:
|
|
1971
|
+
"""
|
|
1972
|
+
Make list RootModel directly usable with len().
|
|
1973
|
+
"""
|
|
1974
|
+
return len(self.root)
|
|
1975
|
+
|
|
1976
|
+
def __iter__(self):
|
|
1977
|
+
"""
|
|
1978
|
+
Make list RootModel directly iterable.
|
|
1979
|
+
"""
|
|
1980
|
+
return iter(self.root)
|
|
1981
|
+
|
|
1982
|
+
|
|
1983
|
+
class IOBooleanValue(BaseModel):
|
|
1984
|
+
"""
|
|
1985
|
+
Input/Output boolean value representation.
|
|
1986
|
+
"""
|
|
1987
|
+
|
|
1988
|
+
io: str
|
|
1989
|
+
"""
|
|
1990
|
+
Unique identifier of the input/output.
|
|
1991
|
+
"""
|
|
1992
|
+
value: bool
|
|
1993
|
+
"""
|
|
1994
|
+
Value of a digital input/output.
|
|
1995
|
+
|
|
1996
|
+
"""
|
|
1997
|
+
value_type: Literal['boolean'] = 'boolean'
|
|
1998
|
+
|
|
1999
|
+
|
|
2000
|
+
class IOIntegerValue(BaseModel):
|
|
2001
|
+
io: str
|
|
2002
|
+
"""
|
|
2003
|
+
Unique identifier of the input/output.
|
|
2004
|
+
"""
|
|
2005
|
+
value: str
|
|
2006
|
+
"""
|
|
2007
|
+
Value of an input/output with integer representation.
|
|
2008
|
+
|
|
2009
|
+
> The integral value is transmitted as a string to avoid precision loss during conversion to JSON.
|
|
2010
|
+
> Recommended: Use int64 in your implementation. If you want to interact with int64 in numbers,
|
|
2011
|
+
> JS bigint libraries can help you to parse the string into an integral value.
|
|
2012
|
+
|
|
2013
|
+
"""
|
|
2014
|
+
value_type: Literal['integer'] = 'integer'
|
|
2015
|
+
|
|
2016
|
+
|
|
2017
|
+
class IOFloatValue(BaseModel):
|
|
2018
|
+
io: str
|
|
2019
|
+
"""
|
|
2020
|
+
Unique identifier of the input/output.
|
|
2021
|
+
"""
|
|
2022
|
+
value: float
|
|
2023
|
+
"""
|
|
2024
|
+
Value of an analog input/output in floating number representation.
|
|
2025
|
+
|
|
2026
|
+
"""
|
|
2027
|
+
value_type: Literal['float'] = 'float'
|
|
2028
|
+
|
|
2029
|
+
|
|
2030
|
+
class IOValue(RootModel):
|
|
2031
|
+
root: Annotated[
|
|
2032
|
+
Union[IOBooleanValue, IOIntegerValue, IOFloatValue],
|
|
2033
|
+
Field(discriminator='value_type'),
|
|
2034
|
+
]
|
|
2035
|
+
|
|
2036
|
+
|
|
2037
|
+
class StreamIOValuesResponse(BaseModel):
|
|
2038
|
+
"""
|
|
2039
|
+
Array of input/output values.
|
|
2040
|
+
"""
|
|
2041
|
+
|
|
2042
|
+
io_values: List[IOValue]
|
|
2043
|
+
timestamp: AwareDatetime
|
|
2044
|
+
"""
|
|
2045
|
+
Timestamp indicating when the represented information was received from the robot controller.
|
|
2046
|
+
"""
|
|
2047
|
+
sequence_number: Annotated[int, Field(ge=0, le=4294967295)]
|
|
2048
|
+
"""
|
|
2049
|
+
Sequence number of the controller state. It starts with 0 upon establishing the connection with a physical controller.
|
|
2050
|
+
The sequence number is reset when the connection to the physical controller is closed and re-established.
|
|
2051
|
+
|
|
2052
|
+
"""
|
|
2053
|
+
|
|
2054
|
+
|
|
2055
|
+
class ListIOValuesResponse(RootModel):
|
|
2056
|
+
"""
|
|
2057
|
+
Array of input/output values.
|
|
2058
|
+
"""
|
|
2059
|
+
|
|
2060
|
+
root: Annotated[
|
|
2061
|
+
List[IOValue],
|
|
2062
|
+
Field(
|
|
2063
|
+
examples=[
|
|
2064
|
+
{
|
|
2065
|
+
'io_values': [
|
|
2066
|
+
{'io': 'io1', 'value': True, 'value_type': 'boolean'},
|
|
2067
|
+
{'io': 'io2', 'value': '42', 'value_type': 'integer'},
|
|
2068
|
+
{'io': 'io3', 'value': 3.14, 'value_type': 'float'},
|
|
2069
|
+
]
|
|
2070
|
+
}
|
|
2071
|
+
]
|
|
2072
|
+
),
|
|
2073
|
+
]
|
|
2074
|
+
"""
|
|
2075
|
+
Array of input/output values.
|
|
2076
|
+
"""
|
|
2077
|
+
|
|
2078
|
+
def __getitem__(self, index: int) -> IOValue:
|
|
2079
|
+
"""
|
|
2080
|
+
Make list RootModel directly indexable.
|
|
2081
|
+
"""
|
|
2082
|
+
return self.root[index]
|
|
2083
|
+
|
|
2084
|
+
def __setitem__(self, index: int, value: IOValue) -> None:
|
|
2085
|
+
"""
|
|
2086
|
+
Make list RootModel directly indexable.
|
|
2087
|
+
"""
|
|
2088
|
+
self.root[index] = value
|
|
2089
|
+
|
|
2090
|
+
def __len__(self) -> int:
|
|
2091
|
+
"""
|
|
2092
|
+
Make list RootModel directly usable with len().
|
|
2093
|
+
"""
|
|
2094
|
+
return len(self.root)
|
|
2095
|
+
|
|
2096
|
+
def __iter__(self):
|
|
2097
|
+
"""
|
|
2098
|
+
Make list RootModel directly iterable.
|
|
2099
|
+
"""
|
|
2100
|
+
return iter(self.root)
|
|
2101
|
+
|
|
2102
|
+
|
|
2103
|
+
class Comparator(Enum):
|
|
2104
|
+
"""
|
|
2105
|
+
Comparator for the comparison of two values.
|
|
2106
|
+
The comparator is used to compare two values and return a boolean result.
|
|
2107
|
+
The default comparator is unknown.
|
|
2108
|
+
|
|
2109
|
+
"""
|
|
2110
|
+
|
|
2111
|
+
COMPARATOR_EQUALS = 'COMPARATOR_EQUALS'
|
|
2112
|
+
COMPARATOR_NOT_EQUALS = 'COMPARATOR_NOT_EQUALS'
|
|
2113
|
+
COMPARATOR_GREATER = 'COMPARATOR_GREATER'
|
|
2114
|
+
COMPARATOR_GREATER_EQUAL = 'COMPARATOR_GREATER_EQUAL'
|
|
2115
|
+
COMPARATOR_LESS = 'COMPARATOR_LESS'
|
|
2116
|
+
COMPARATOR_LESS_EQUAL = 'COMPARATOR_LESS_EQUAL'
|
|
2117
|
+
|
|
2118
|
+
|
|
2119
|
+
class WaitForIOEventRequest(BaseModel):
|
|
2120
|
+
"""
|
|
2121
|
+
The value to compare with the current value of the input/output.
|
|
2122
|
+
"""
|
|
2123
|
+
|
|
2124
|
+
io: IOValue
|
|
2125
|
+
comparator: Comparator
|
|
2126
|
+
"""
|
|
2127
|
+
Comparator for the comparison of two values.
|
|
2128
|
+
Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b.
|
|
2129
|
+
|
|
2130
|
+
"""
|
|
2131
|
+
|
|
2132
|
+
|
|
2133
|
+
class SettableRobotSystemMode(Enum):
|
|
2134
|
+
ROBOT_SYSTEM_MODE_MONITOR = 'ROBOT_SYSTEM_MODE_MONITOR'
|
|
2135
|
+
ROBOT_SYSTEM_MODE_CONTROL = 'ROBOT_SYSTEM_MODE_CONTROL'
|
|
2136
|
+
|
|
2137
|
+
|
|
2138
|
+
class VirtualRobotConfiguration(BaseModel):
|
|
2139
|
+
name: str
|
|
2140
|
+
"""
|
|
2141
|
+
Name of the configuration file generated by the unique identifier of the controller and a time stamp.
|
|
2142
|
+
|
|
2143
|
+
"""
|
|
2144
|
+
content: str
|
|
2145
|
+
"""
|
|
2146
|
+
Content of the configuration file. Copy & paste to the [addRobotController](addRobotController) configuration.json parameter.
|
|
2147
|
+
|
|
2148
|
+
"""
|
|
2149
|
+
|
|
2150
|
+
|
|
2151
|
+
class OrientationType(Enum):
|
|
2152
|
+
"""
|
|
2153
|
+
The type of rotation description that is used to specify the orientation.
|
|
2154
|
+
|
|
2155
|
+
**Rotation Vector notation**
|
|
2156
|
+
|
|
2157
|
+
* The rotation is represented using an axis-angle representation:
|
|
2158
|
+
> axis = Vector[0:2]
|
|
2159
|
+
> angle = |axis| in [rad]
|
|
2160
|
+
> axis.normalized * angle
|
|
2161
|
+
|
|
2162
|
+
**Quaternion notation**
|
|
2163
|
+
|
|
2164
|
+
* The rotation is represented using a unit quaternion: [x, y, z, w].
|
|
2165
|
+
* The vector part [x, y, z] is the imaginary part of the quaternion, and the scalar part [w] is the real part.
|
|
2166
|
+
|
|
2167
|
+
**Euler notation**
|
|
2168
|
+
|
|
2169
|
+
* *extrinsic* fixed external reference system
|
|
2170
|
+
* *intrinsic* reference system fixed to rotation body
|
|
2171
|
+
> angles = Vector[0:2] in [rad].
|
|
2172
|
+
* ZYX, ZXZ,...
|
|
2173
|
+
- mapping of the given angles values to the (either intrinsic
|
|
2174
|
+
or extrinsic) axes in the stated order.
|
|
2175
|
+
> Example ZYX: Z = Vector[0], Y = Vector[1], X = Vector[2].
|
|
2176
|
+
|
|
2177
|
+
"""
|
|
2178
|
+
|
|
2179
|
+
ROTATION_VECTOR = 'ROTATION_VECTOR'
|
|
2180
|
+
QUATERNION = 'QUATERNION'
|
|
2181
|
+
EULER_ANGLES_INTRINSIC_ZXZ = 'EULER_ANGLES_INTRINSIC_ZXZ'
|
|
2182
|
+
EULER_ANGLES_INTRINSIC_XYX = 'EULER_ANGLES_INTRINSIC_XYX'
|
|
2183
|
+
EULER_ANGLES_INTRINSIC_YZY = 'EULER_ANGLES_INTRINSIC_YZY'
|
|
2184
|
+
EULER_ANGLES_INTRINSIC_ZYZ = 'EULER_ANGLES_INTRINSIC_ZYZ'
|
|
2185
|
+
EULER_ANGLES_INTRINSIC_XZX = 'EULER_ANGLES_INTRINSIC_XZX'
|
|
2186
|
+
EULER_ANGLES_INTRINSIC_YXY = 'EULER_ANGLES_INTRINSIC_YXY'
|
|
2187
|
+
EULER_ANGLES_INTRINSIC_XYZ = 'EULER_ANGLES_INTRINSIC_XYZ'
|
|
2188
|
+
EULER_ANGLES_INTRINSIC_YZX = 'EULER_ANGLES_INTRINSIC_YZX'
|
|
2189
|
+
EULER_ANGLES_INTRINSIC_ZXY = 'EULER_ANGLES_INTRINSIC_ZXY'
|
|
2190
|
+
EULER_ANGLES_INTRINSIC_XZY = 'EULER_ANGLES_INTRINSIC_XZY'
|
|
2191
|
+
EULER_ANGLES_INTRINSIC_ZYX = 'EULER_ANGLES_INTRINSIC_ZYX'
|
|
2192
|
+
EULER_ANGLES_INTRINSIC_YXZ = 'EULER_ANGLES_INTRINSIC_YXZ'
|
|
2193
|
+
EULER_ANGLES_EXTRINSIC_ZXZ = 'EULER_ANGLES_EXTRINSIC_ZXZ'
|
|
2194
|
+
EULER_ANGLES_EXTRINSIC_XYX = 'EULER_ANGLES_EXTRINSIC_XYX'
|
|
2195
|
+
EULER_ANGLES_EXTRINSIC_YZY = 'EULER_ANGLES_EXTRINSIC_YZY'
|
|
2196
|
+
EULER_ANGLES_EXTRINSIC_ZYZ = 'EULER_ANGLES_EXTRINSIC_ZYZ'
|
|
2197
|
+
EULER_ANGLES_EXTRINSIC_XZX = 'EULER_ANGLES_EXTRINSIC_XZX'
|
|
2198
|
+
EULER_ANGLES_EXTRINSIC_YXY = 'EULER_ANGLES_EXTRINSIC_YXY'
|
|
2199
|
+
EULER_ANGLES_EXTRINSIC_ZYX = 'EULER_ANGLES_EXTRINSIC_ZYX'
|
|
2200
|
+
EULER_ANGLES_EXTRINSIC_XZY = 'EULER_ANGLES_EXTRINSIC_XZY'
|
|
2201
|
+
EULER_ANGLES_EXTRINSIC_YXZ = 'EULER_ANGLES_EXTRINSIC_YXZ'
|
|
2202
|
+
EULER_ANGLES_EXTRINSIC_YZX = 'EULER_ANGLES_EXTRINSIC_YZX'
|
|
2203
|
+
EULER_ANGLES_EXTRINSIC_XYZ = 'EULER_ANGLES_EXTRINSIC_XYZ'
|
|
2204
|
+
EULER_ANGLES_EXTRINSIC_ZXY = 'EULER_ANGLES_EXTRINSIC_ZXY'
|
|
2205
|
+
|
|
2206
|
+
|
|
2207
|
+
class Orientation(RootModel):
|
|
2208
|
+
"""
|
|
2209
|
+
Describes an orientation in 3D space.
|
|
2210
|
+
A tree-to-four-dimensional vector [x, y, z, w] with double precision.
|
|
2211
|
+
|
|
2212
|
+
"""
|
|
2213
|
+
|
|
2214
|
+
root: Annotated[List[float], Field(max_length=4, min_length=3, title='Orientation')]
|
|
2215
|
+
"""
|
|
2216
|
+
Describes an orientation in 3D space.
|
|
2217
|
+
A tree-to-four-dimensional vector [x, y, z, w] with double precision.
|
|
2218
|
+
|
|
2219
|
+
"""
|
|
2220
|
+
|
|
2221
|
+
def __getitem__(self, index: int) -> float:
|
|
2222
|
+
"""
|
|
2223
|
+
Make list RootModel directly indexable.
|
|
2224
|
+
"""
|
|
2225
|
+
return self.root[index]
|
|
2226
|
+
|
|
2227
|
+
def __setitem__(self, index: int, value: float) -> None:
|
|
2228
|
+
"""
|
|
2229
|
+
Make list RootModel directly indexable.
|
|
2230
|
+
"""
|
|
2231
|
+
self.root[index] = value
|
|
2232
|
+
|
|
2233
|
+
def __len__(self) -> int:
|
|
2234
|
+
"""
|
|
2235
|
+
Make list RootModel directly usable with len().
|
|
2236
|
+
"""
|
|
2237
|
+
return len(self.root)
|
|
2238
|
+
|
|
2239
|
+
def __iter__(self):
|
|
2240
|
+
"""
|
|
2241
|
+
Make list RootModel directly iterable.
|
|
2242
|
+
"""
|
|
2243
|
+
return iter(self.root)
|
|
2244
|
+
|
|
2245
|
+
|
|
2246
|
+
class CoordinateSystemData(BaseModel):
|
|
2247
|
+
name: Optional[str] = None
|
|
2248
|
+
"""
|
|
2249
|
+
Human readable name of this coordinate system.
|
|
2250
|
+
"""
|
|
2251
|
+
reference_coordinate_system: Optional[str] = None
|
|
2252
|
+
"""
|
|
2253
|
+
The identifier of the reference coordinate system. Empty if world is used.
|
|
2254
|
+
"""
|
|
2255
|
+
position: Optional[Vector3d] = None
|
|
2256
|
+
orientation: Optional[Orientation] = None
|
|
2257
|
+
orientation_type: Optional[OrientationType] = 'ROTATION_VECTOR'
|
|
2258
|
+
|
|
2259
|
+
|
|
2260
|
+
class CoordinateSystem(CoordinateSystemData):
|
|
2261
|
+
coordinate_system: str
|
|
2262
|
+
"""
|
|
2263
|
+
Unique identifier of the coordinate system.
|
|
2264
|
+
"""
|
|
2265
|
+
|
|
2266
|
+
|
|
2267
|
+
class ListCoordinateSystemsResponse(RootModel):
|
|
2268
|
+
root: List[CoordinateSystem]
|
|
2269
|
+
|
|
2270
|
+
def __getitem__(self, index: int) -> CoordinateSystem:
|
|
2271
|
+
"""
|
|
2272
|
+
Make list RootModel directly indexable.
|
|
2273
|
+
"""
|
|
2274
|
+
return self.root[index]
|
|
2275
|
+
|
|
2276
|
+
def __setitem__(self, index: int, value: CoordinateSystem) -> None:
|
|
2277
|
+
"""
|
|
2278
|
+
Make list RootModel directly indexable.
|
|
2279
|
+
"""
|
|
2280
|
+
self.root[index] = value
|
|
2281
|
+
|
|
2282
|
+
def __len__(self) -> int:
|
|
2283
|
+
"""
|
|
2284
|
+
Make list RootModel directly usable with len().
|
|
2285
|
+
"""
|
|
2286
|
+
return len(self.root)
|
|
2287
|
+
|
|
2288
|
+
def __iter__(self):
|
|
2289
|
+
"""
|
|
2290
|
+
Make list RootModel directly iterable.
|
|
2291
|
+
"""
|
|
2292
|
+
return iter(self.root)
|
|
2293
|
+
|
|
2294
|
+
|
|
2295
|
+
class MotionGroupModel(RootModel):
|
|
2296
|
+
root: Annotated[str, Field(title='MotionGroupModel')]
|
|
2297
|
+
"""
|
|
2298
|
+
String identifiying the model of a motion group.
|
|
2299
|
+
"""
|
|
2300
|
+
|
|
2301
|
+
|
|
2302
|
+
class TcpOffset(BaseModel):
|
|
2303
|
+
name: str
|
|
2304
|
+
"""
|
|
2305
|
+
A readable and changeable name for frontend visualization.
|
|
2306
|
+
"""
|
|
2307
|
+
pose: Pose
|
|
2308
|
+
|
|
2309
|
+
|
|
2310
|
+
class ColliderDictionary(RootModel):
|
|
2311
|
+
"""
|
|
2312
|
+
A collection of identifiable colliders.
|
|
2313
|
+
"""
|
|
2314
|
+
|
|
2315
|
+
root: Dict[str, Collider]
|
|
2316
|
+
|
|
2317
|
+
|
|
2318
|
+
class LimitRange(BaseModel):
|
|
2319
|
+
"""
|
|
2320
|
+
The upper_limit must be greater then the lower_limit.
|
|
2321
|
+
"""
|
|
2322
|
+
|
|
2323
|
+
lower_limit: Optional[float] = None
|
|
2324
|
+
upper_limit: Optional[float] = None
|
|
2325
|
+
|
|
2326
|
+
|
|
2327
|
+
class JointLimits(BaseModel):
|
|
2328
|
+
position: Optional[LimitRange] = None
|
|
2329
|
+
velocity: Optional[float] = None
|
|
2330
|
+
acceleration: Optional[float] = None
|
|
2331
|
+
torque: Optional[float] = None
|
|
2332
|
+
|
|
2333
|
+
|
|
2334
|
+
class CartesianLimits(BaseModel):
|
|
2335
|
+
velocity: Optional[float] = None
|
|
2336
|
+
acceleration: Optional[float] = None
|
|
2337
|
+
orientation_velocity: Optional[float] = None
|
|
2338
|
+
orientation_acceleration: Optional[float] = None
|
|
2339
|
+
|
|
2340
|
+
|
|
2341
|
+
class LimitSet(BaseModel):
|
|
2342
|
+
joints: Optional[List[JointLimits]] = None
|
|
2343
|
+
tcp: Optional[CartesianLimits] = None
|
|
2344
|
+
elbow: Optional[CartesianLimits] = None
|
|
2345
|
+
flange: Optional[CartesianLimits] = None
|
|
2346
|
+
coupled_shoulder_elbow_joint: Optional[JointLimits] = None
|
|
2347
|
+
|
|
2348
|
+
|
|
2349
|
+
class OperationLimits(BaseModel):
|
|
2350
|
+
auto_limits: Optional[LimitSet] = None
|
|
2351
|
+
manual_limits: Optional[LimitSet] = None
|
|
2352
|
+
manual_t1_limits: Optional[LimitSet] = None
|
|
2353
|
+
manual_t2_limits: Optional[LimitSet] = None
|
|
2354
|
+
|
|
2355
|
+
|
|
2356
|
+
class Payload(BaseModel):
|
|
2357
|
+
name: str
|
|
2358
|
+
payload: float
|
|
2359
|
+
"""
|
|
2360
|
+
Mass of payload in [kg].
|
|
2361
|
+
"""
|
|
2362
|
+
center_of_mass: Optional[Vector3d] = None
|
|
2363
|
+
moment_of_inertia: Optional[Vector3d] = None
|
|
2364
|
+
|
|
2365
|
+
|
|
2366
|
+
class DHParameter(BaseModel):
|
|
2367
|
+
"""
|
|
2368
|
+
A single set of DH parameters.
|
|
2369
|
+
"""
|
|
2370
|
+
|
|
2371
|
+
alpha: Optional[float] = None
|
|
2372
|
+
"""
|
|
2373
|
+
Angle about x-axis in [rad].
|
|
2374
|
+
"""
|
|
2375
|
+
theta: Optional[float] = None
|
|
2376
|
+
"""
|
|
2377
|
+
Angle about z-axis in [rad].
|
|
2378
|
+
"""
|
|
2379
|
+
a: Optional[float] = None
|
|
2380
|
+
"""
|
|
2381
|
+
Offset along x-axis in [mm].
|
|
2382
|
+
"""
|
|
2383
|
+
d: Optional[float] = None
|
|
2384
|
+
"""
|
|
2385
|
+
Offset along z-axis in [mm].
|
|
2386
|
+
"""
|
|
2387
|
+
reverse_rotation_direction: Optional[bool] = None
|
|
2388
|
+
"""
|
|
2389
|
+
True, if rotation direction of joint is reversed.
|
|
2390
|
+
"""
|
|
2391
|
+
|
|
2392
|
+
|
|
2393
|
+
class MotionGroupDescription(BaseModel):
|
|
2394
|
+
"""
|
|
2395
|
+
The configuration of a motion-group used for motion planning.
|
|
2396
|
+
"""
|
|
2397
|
+
|
|
2398
|
+
motion_group_model: MotionGroupModel
|
|
2399
|
+
mounting: Optional[Pose] = None
|
|
2400
|
+
"""
|
|
2401
|
+
The offset from the world frame to the motion group base.
|
|
2402
|
+
"""
|
|
2403
|
+
tcps: Annotated[
|
|
2404
|
+
Optional[Dict[str, TcpOffset]], Field(title='TcpOffsetDictionary')
|
|
2405
|
+
] = None
|
|
2406
|
+
"""
|
|
2407
|
+
Maps a TCP name to its offset relative to the flange coordinate system. Key must be a TCP identifier.
|
|
2408
|
+
Values are TcpOffsets.
|
|
2409
|
+
|
|
2410
|
+
"""
|
|
2411
|
+
safety_zones: Optional[ColliderDictionary] = None
|
|
2412
|
+
"""
|
|
2413
|
+
SafetyZones are areas which cannot be entered or where certain limits apply.
|
|
2414
|
+
"""
|
|
2415
|
+
safety_link_colliders: Optional[List[ColliderDictionary]] = None
|
|
2416
|
+
"""
|
|
2417
|
+
The shape of the MotionGroups links to validate against safety zones.
|
|
2418
|
+
Indexed along the kinematic chain, starting with a static base shape before first joint.
|
|
2419
|
+
|
|
2420
|
+
"""
|
|
2421
|
+
safety_tool_colliders: Annotated[
|
|
2422
|
+
Optional[Dict[str, ColliderDictionary]], Field(title='SafetyToolColliders')
|
|
2423
|
+
] = None
|
|
2424
|
+
"""
|
|
2425
|
+
Maps a TCP name to its tool collider. Key must be a TCP identifier.
|
|
2426
|
+
Values are ColliderDictionaries that make up the shape of one tool to validate against safety zones.
|
|
2427
|
+
|
|
2428
|
+
"""
|
|
2429
|
+
operation_limits: OperationLimits
|
|
2430
|
+
payloads: Annotated[
|
|
2431
|
+
Optional[Dict[str, Payload]], Field(title='PayloadDictionary')
|
|
2432
|
+
] = None
|
|
2433
|
+
"""
|
|
2434
|
+
Maps a payload name to its configuration. Key must be a payload identifier.
|
|
2435
|
+
Values are payload objects.
|
|
2436
|
+
|
|
2437
|
+
"""
|
|
2438
|
+
cycle_time: Annotated[Optional[int], Field(ge=0, le=2147483647)] = None
|
|
2439
|
+
"""
|
|
2440
|
+
[ms] cycle time of the motion group controller. A trajectory for this motion group should be computed to this resolution.
|
|
2441
|
+
"""
|
|
2442
|
+
dh_parameters: Optional[List[DHParameter]] = None
|
|
2443
|
+
"""
|
|
2444
|
+
The DH parameters describing the motion group geometry, starting from base.
|
|
2445
|
+
"""
|
|
2446
|
+
|
|
2447
|
+
|
|
2448
|
+
class Tool(RootModel):
|
|
2449
|
+
"""
|
|
2450
|
+
Defines the shape of a tool.
|
|
2451
|
+
|
|
2452
|
+
A tool is a dictionary of colliders.
|
|
2453
|
+
|
|
2454
|
+
All colliders that make up a tool are attached to the flange frame of the motion group.
|
|
2455
|
+
|
|
2456
|
+
"""
|
|
2457
|
+
|
|
2458
|
+
root: Dict[str, Collider]
|
|
2459
|
+
|
|
2460
|
+
|
|
2461
|
+
class CollisionSetup(BaseModel):
|
|
2462
|
+
colliders: Optional[ColliderDictionary] = None
|
|
2463
|
+
"""
|
|
2464
|
+
Colliders are checked against links and tool.
|
|
2465
|
+
|
|
2466
|
+
"""
|
|
2467
|
+
link_chain: Optional[LinkChain] = None
|
|
2468
|
+
"""
|
|
2469
|
+
The shape of the motion groups links to validate against colliders.
|
|
2470
|
+
Indexed along the kinematic chain, starting with a static base shape before first joint.
|
|
2471
|
+
The base of the motion group is not checked for collision against the environment.
|
|
2472
|
+
|
|
2473
|
+
"""
|
|
2474
|
+
tool: Optional[Tool] = None
|
|
2475
|
+
"""
|
|
2476
|
+
Shape of the tool to validate against colliders.
|
|
2477
|
+
|
|
2478
|
+
"""
|
|
2479
|
+
self_collision_detection: Optional[bool] = True
|
|
2480
|
+
"""
|
|
2481
|
+
If true, self-collision detection is enabled for the motion group.
|
|
2482
|
+
|
|
2483
|
+
Self-collision detection checks if links in the kinematic chain of the motion group collide with each other.
|
|
2484
|
+
Adjacent links in the kinematic chain of the motion group are not checked for mutual collision.
|
|
2485
|
+
The tool is treated like a link at the end of the kinematic chain. It is checked against all links except the last one.
|
|
2486
|
+
|
|
2487
|
+
Default is true.
|
|
2488
|
+
|
|
2489
|
+
"""
|
|
2490
|
+
|
|
2491
|
+
|
|
2492
|
+
class CollisionSetups(RootModel):
|
|
2493
|
+
"""
|
|
2494
|
+
Collision layers to be respected by the motion planner when planning for a single motion group.
|
|
2495
|
+
Each setup represents one layer, e.g., the safety zones and shapes or a fine grained tool and workpiece model.
|
|
2496
|
+
Layers are checked individually along the trajectory and independently of other layers.
|
|
2497
|
+
|
|
2498
|
+
To respect the safety zones of the controller and check for collision:
|
|
2499
|
+
1. Fetch the safety zones, link and tool shapes from the controller.
|
|
2500
|
+
2. Add the fetched zones, links and tools to a layer.
|
|
2501
|
+
3. Create other layers from your own 3D data as needed.
|
|
2502
|
+
4. Plan trajectory.
|
|
2503
|
+
5. The response highlights the layer in which a collision was detected by key.
|
|
2504
|
+
|
|
2505
|
+
"""
|
|
2506
|
+
|
|
2507
|
+
root: Dict[str, CollisionSetup]
|
|
2508
|
+
|
|
2509
|
+
|
|
2510
|
+
class MotionGroupSetup(BaseModel):
|
|
2511
|
+
motion_group_model: MotionGroupModel
|
|
2512
|
+
cycle_time: Annotated[int, Field(ge=0, le=2147483647)]
|
|
2513
|
+
"""
|
|
2514
|
+
[ms] cycle time of the motion group controller. A trajectory for this motion group should be computed to this resolution.
|
|
2515
|
+
"""
|
|
2516
|
+
mounting: Optional[Pose] = None
|
|
2517
|
+
"""
|
|
2518
|
+
The offset from the world frame to the motion group base.
|
|
2519
|
+
"""
|
|
2520
|
+
tcp_offset: Optional[Pose] = None
|
|
2521
|
+
global_limits: Optional[LimitSet] = None
|
|
2522
|
+
payload: Optional[Payload] = None
|
|
2523
|
+
collision_setups: Optional[CollisionSetups] = None
|
|
2524
|
+
|
|
2525
|
+
|
|
2526
|
+
class DoubleArray(RootModel):
|
|
2527
|
+
root: List[float]
|
|
2528
|
+
|
|
2529
|
+
def __getitem__(self, index: int) -> float:
|
|
2530
|
+
"""
|
|
2531
|
+
Make list RootModel directly indexable.
|
|
2532
|
+
"""
|
|
2533
|
+
return self.root[index]
|
|
2534
|
+
|
|
2535
|
+
def __setitem__(self, index: int, value: float) -> None:
|
|
2536
|
+
"""
|
|
2537
|
+
Make list RootModel directly indexable.
|
|
2538
|
+
"""
|
|
2539
|
+
self.root[index] = value
|
|
2540
|
+
|
|
2541
|
+
def __len__(self) -> int:
|
|
2542
|
+
"""
|
|
2543
|
+
Make list RootModel directly usable with len().
|
|
2544
|
+
"""
|
|
2545
|
+
return len(self.root)
|
|
2546
|
+
|
|
2547
|
+
def __iter__(self):
|
|
2548
|
+
"""
|
|
2549
|
+
Make list RootModel directly iterable.
|
|
2550
|
+
"""
|
|
2551
|
+
return iter(self.root)
|
|
2552
|
+
|
|
2553
|
+
|
|
2554
|
+
class BlendingAuto(BaseModel):
|
|
2555
|
+
min_velocity_in_percent: Annotated[Optional[int], Field(ge=0, le=100)] = None
|
|
2556
|
+
"""
|
|
2557
|
+
Auto-blending is used to keep a constant velocity when blending between two motion commands.
|
|
2558
|
+
It changes the TCP path around the target point of the motion command.
|
|
2559
|
+
The value represents the percentage of the original velocity.
|
|
2560
|
+
|
|
2561
|
+
"""
|
|
2562
|
+
blending_name: Literal['BlendingAuto'] = 'BlendingAuto'
|
|
2563
|
+
|
|
2564
|
+
|
|
2565
|
+
class BlendingPosition(BaseModel):
|
|
2566
|
+
position_zone_radius: Optional[float] = None
|
|
2567
|
+
"""
|
|
2568
|
+
Specifies the maximum radius in [mm] around the motion command's target point
|
|
2569
|
+
where the TCP path can be altered to blend the motion command into the following one.
|
|
2570
|
+
If auto-blending blends too much of the resulting trajectory, use position-blending to restrict the blending zone radius.
|
|
2571
|
+
|
|
2572
|
+
"""
|
|
2573
|
+
blending_name: Literal['BlendingPosition'] = 'BlendingPosition'
|
|
2574
|
+
|
|
2575
|
+
|
|
2576
|
+
class LimitsOverride(BaseModel):
|
|
2577
|
+
"""
|
|
2578
|
+
If a limit is not set, the default value will be used.
|
|
2579
|
+
|
|
2580
|
+
"""
|
|
2581
|
+
|
|
2582
|
+
joint_velocity_limits: Optional[List[float]] = None
|
|
2583
|
+
"""
|
|
2584
|
+
Maximum joint velocity in [rad/s] for each joint.
|
|
2585
|
+
Either leave this field empty or set a value for each joint.
|
|
2586
|
+
|
|
2587
|
+
"""
|
|
2588
|
+
joint_acceleration_limits: Optional[List[float]] = None
|
|
2589
|
+
"""
|
|
2590
|
+
Maximum joint acceleration in [rad/s^2] for each joint.
|
|
2591
|
+
Either leave this field empty or set a value for each joint.
|
|
2592
|
+
|
|
2593
|
+
"""
|
|
2594
|
+
tcp_velocity_limit: Optional[float] = None
|
|
2595
|
+
"""
|
|
2596
|
+
Maximum allowed TCP velocity in [mm/s].
|
|
2597
|
+
|
|
2598
|
+
"""
|
|
2599
|
+
tcp_acceleration_limit: Optional[float] = None
|
|
2600
|
+
"""
|
|
2601
|
+
Maximum allowed TCP acceleration in [mm/s^2].
|
|
2602
|
+
|
|
2603
|
+
"""
|
|
2604
|
+
tcp_orientation_velocity_limit: Optional[float] = None
|
|
2605
|
+
"""
|
|
2606
|
+
Maximum allowed TCP rotation velocity in [rad/s].
|
|
2607
|
+
|
|
2608
|
+
"""
|
|
2609
|
+
tcp_orientation_acceleration_limit: Optional[float] = None
|
|
2610
|
+
"""
|
|
2611
|
+
Maximum allowed TCP rotation acceleration in [rad/s^2].
|
|
2612
|
+
|
|
2613
|
+
"""
|
|
2614
|
+
|
|
2615
|
+
|
|
2616
|
+
class PathCartesianPTP(BaseModel):
|
|
2617
|
+
"""
|
|
2618
|
+
A cartesian point-to-point is representing a joint point-to-point motion from start point to the indicated target pose.
|
|
2619
|
+
The target pose is a joint point-to-point given in cartesian space. The target joint configuration will be calculated
|
|
2620
|
+
to be in the same kinematic configuration as the start point is. If that is not possible, planning will fail.
|
|
2621
|
+
|
|
2622
|
+
"""
|
|
2623
|
+
|
|
2624
|
+
target_pose: Pose
|
|
2625
|
+
path_definition_name: Literal['PathCartesianPTP'] = 'PathCartesianPTP'
|
|
2626
|
+
|
|
2627
|
+
|
|
2628
|
+
class CubicSplineParameter(BaseModel):
|
|
2629
|
+
pose: Pose
|
|
2630
|
+
path_parameter: float
|
|
2631
|
+
|
|
2632
|
+
|
|
2633
|
+
class PathCubicSpline(BaseModel):
|
|
2634
|
+
"""
|
|
2635
|
+
A [cubic spline](https://de.wikipedia.org/wiki/Spline-Interpolation) represents a cartesian cubic spline
|
|
2636
|
+
in translative and orientational space from start point to indicated target pose via control points.
|
|
2637
|
+
|
|
2638
|
+
"""
|
|
2639
|
+
|
|
2640
|
+
parameters: List[CubicSplineParameter]
|
|
2641
|
+
path_definition_name: Literal['PathCubicSpline'] = 'PathCubicSpline'
|
|
2642
|
+
|
|
2643
|
+
|
|
2644
|
+
class PathLine(BaseModel):
|
|
2645
|
+
"""
|
|
2646
|
+
A line represents a straight line from start position to indicated target position.
|
|
2647
|
+
The orientation is calculated via a quaternion [slerp](https://en.wikipedia.org/wiki/Slerp) from start orientation to indicated target orientation.
|
|
2648
|
+
|
|
2649
|
+
"""
|
|
2650
|
+
|
|
2651
|
+
target_pose: Pose
|
|
2652
|
+
path_definition_name: Literal['PathLine'] = 'PathLine'
|
|
2653
|
+
|
|
2654
|
+
|
|
2655
|
+
class PathCircle(BaseModel):
|
|
2656
|
+
"""
|
|
2657
|
+
A circular constructs a circle in translative space from 1) the start position which is provided via position, and 2) the indicated target position.
|
|
2658
|
+
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.
|
|
2659
|
+
The via point defines the control point for the bezier spline.
|
|
2660
|
+
Therefore, the control point will not be hit directly.
|
|
2661
|
+
|
|
2662
|
+
"""
|
|
2663
|
+
|
|
2664
|
+
via_pose: Pose
|
|
2665
|
+
target_pose: Pose
|
|
2666
|
+
path_definition_name: Literal['PathCircle'] = 'PathCircle'
|
|
2667
|
+
|
|
2668
|
+
|
|
2669
|
+
class PathJointPTP(BaseModel):
|
|
2670
|
+
"""
|
|
2671
|
+
A joint point-to-point represents a line in joint space. All joints will be moved synchronously.
|
|
2672
|
+
|
|
2673
|
+
"""
|
|
2674
|
+
|
|
2675
|
+
target_joint_position: DoubleArray
|
|
2676
|
+
path_definition_name: Literal['PathJointPTP'] = 'PathJointPTP'
|
|
2677
|
+
|
|
2678
|
+
|
|
2679
|
+
class MotionCommand(BaseModel):
|
|
2680
|
+
blending: Annotated[
|
|
2681
|
+
Optional[Union[BlendingAuto, BlendingPosition]],
|
|
2682
|
+
Field(discriminator='blending_name'),
|
|
2683
|
+
] = None
|
|
2684
|
+
"""
|
|
2685
|
+
Blending alters the TCP path at the target point of a motion command
|
|
2686
|
+
to ensure that the velocity does not drop to zero between two motion commands.
|
|
2687
|
+
|
|
2688
|
+
"""
|
|
2689
|
+
limits_override: Optional[LimitsOverride] = None
|
|
2690
|
+
"""
|
|
2691
|
+
Limits override is used to override the global limits of the motion group for this segment of the motion.
|
|
2692
|
+
|
|
2693
|
+
"""
|
|
2694
|
+
path: Annotated[
|
|
2695
|
+
Union[PathCartesianPTP, PathCubicSpline, PathLine, PathCircle, PathJointPTP],
|
|
2696
|
+
Field(discriminator='path_definition_name'),
|
|
2697
|
+
]
|
|
2698
|
+
|
|
2699
|
+
|
|
2700
|
+
class PlanTrajectoryRequest(BaseModel):
|
|
2701
|
+
motion_group_setup: MotionGroupSetup
|
|
2702
|
+
"""
|
|
2703
|
+
The data to assemble the robot setup can be retrieved from [getMotionGroupDescription](getMotionGroupDescription) endpoint.
|
|
2704
|
+
"""
|
|
2705
|
+
start_joint_position: DoubleArray
|
|
2706
|
+
"""
|
|
2707
|
+
To define a motion the start joints have to be indicated.
|
|
2708
|
+
Cartesian movements will be in the same kinematic configuration as the start joint position until the first joint point-to-point motion.
|
|
2709
|
+
Motions can only be executed if the start joint position is the current joint position of the motion group.
|
|
2710
|
+
To retrieve the current joint position use the endpoint [getCurrentMotionGroupState](getCurrentMotionGroupState).
|
|
2711
|
+
To move the robot to the start joint position use the endpoint [streamMoveToTrajectoryViaJointP2P](streamMoveToTrajectoryViaJointP2P).
|
|
2712
|
+
|
|
2713
|
+
"""
|
|
2714
|
+
motion_commands: List[MotionCommand]
|
|
2715
|
+
"""
|
|
2716
|
+
List of motion commands. A command consists of a path definition (line, circle, joint_ptp, cartesian_ptp, cubic_spline), blending, and limits override.
|
|
2717
|
+
|
|
2718
|
+
"""
|
|
2719
|
+
|
|
2720
|
+
|
|
2721
|
+
class JointTrajectory(BaseModel):
|
|
2722
|
+
joint_positions: List[Joints]
|
|
2723
|
+
"""
|
|
2724
|
+
List of joint positions [rad] for each sample.
|
|
2725
|
+
The number of samples must match the number of timestamps provided in the times field.
|
|
2726
|
+
|
|
2727
|
+
"""
|
|
2728
|
+
times: List[float]
|
|
2729
|
+
"""
|
|
2730
|
+
Timestamp for each sample [s].
|
|
2731
|
+
"""
|
|
2732
|
+
locations: List[Location]
|
|
2733
|
+
|
|
2734
|
+
|
|
2735
|
+
class FeedbackOutOfWorkspace(BaseModel):
|
|
2736
|
+
"""
|
|
2737
|
+
Requested TCP pose is outside of motion group's workspace.
|
|
2738
|
+
"""
|
|
2739
|
+
|
|
2740
|
+
invalid_tcp_pose: Optional[Pose] = None
|
|
2741
|
+
error_feedback_name: Literal['FeedbackOutOfWorkspace'] = 'FeedbackOutOfWorkspace'
|
|
2742
|
+
|
|
2743
|
+
|
|
2744
|
+
class SingularityTypeEnum(Enum):
|
|
2745
|
+
WRIST = 'WRIST'
|
|
2746
|
+
ELBOW = 'ELBOW'
|
|
2747
|
+
SHOULDER = 'SHOULDER'
|
|
2748
|
+
|
|
2749
|
+
|
|
2750
|
+
class FeedbackSingularity(BaseModel):
|
|
2751
|
+
"""
|
|
2752
|
+
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.
|
|
2753
|
+
This means the robot cannot move or rotate the TCP in a certain direction from this specific point.
|
|
2754
|
+
|
|
2755
|
+
Use PTP motions if possible. They will almost never fail due to singularities (only if the target point is at a singularity).
|
|
2756
|
+
|
|
2757
|
+
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.
|
|
2758
|
+
|
|
2759
|
+
"""
|
|
2760
|
+
|
|
2761
|
+
singularity_type: Optional[SingularityTypeEnum] = None
|
|
2762
|
+
singular_joint_position: Optional[DoubleArray] = None
|
|
2763
|
+
error_feedback_name: Literal['FeedbackSingularity'] = 'FeedbackSingularity'
|
|
2764
|
+
|
|
2765
|
+
|
|
2766
|
+
class FeedbackJointLimitExceeded(BaseModel):
|
|
2767
|
+
"""
|
|
2768
|
+
This error is returned when a joint position limit is exceeded.
|
|
2769
|
+
The joint index denotes which joint is out of its limits, starting with 1 and followed by the full joint position.
|
|
2770
|
+
|
|
2771
|
+
"""
|
|
2772
|
+
|
|
2773
|
+
joint_index: Annotated[Optional[int], Field(ge=0, le=2147483647)] = None
|
|
2774
|
+
joint_position: Optional[DoubleArray] = None
|
|
2775
|
+
error_feedback_name: Literal['FeedbackJointLimitExceeded'] = (
|
|
2776
|
+
'FeedbackJointLimitExceeded'
|
|
2777
|
+
)
|
|
2778
|
+
|
|
2779
|
+
|
|
2780
|
+
class CollisionContact(BaseModel):
|
|
2781
|
+
local: Optional[Vector3d] = None
|
|
2782
|
+
root: Optional[Vector3d] = None
|
|
2783
|
+
|
|
2784
|
+
|
|
2785
|
+
class Collision(BaseModel):
|
|
2786
|
+
id_of_a: Optional[str] = None
|
|
2787
|
+
id_of_b: Optional[str] = None
|
|
2788
|
+
id_of_layer: Optional[str] = None
|
|
2789
|
+
normal_root_on_b: Optional[Vector3d] = None
|
|
2790
|
+
position_on_a: Optional[CollisionContact] = None
|
|
2791
|
+
position_on_b: Optional[CollisionContact] = None
|
|
2792
|
+
|
|
2793
|
+
|
|
2794
|
+
class FeedbackCollision(BaseModel):
|
|
2795
|
+
collisions: Optional[List[Collision]] = None
|
|
2796
|
+
joint_position: Optional[DoubleArray] = None
|
|
2797
|
+
tcp_pose: Optional[Pose] = None
|
|
2798
|
+
error_feedback_name: Literal['FeedbackCollision'] = 'FeedbackCollision'
|
|
2799
|
+
|
|
2800
|
+
|
|
2801
|
+
class PlanTrajectoryFailedResponse(BaseModel):
|
|
2802
|
+
error_feedback: Annotated[
|
|
2803
|
+
Union[
|
|
2804
|
+
FeedbackOutOfWorkspace,
|
|
2805
|
+
FeedbackSingularity,
|
|
2806
|
+
FeedbackJointLimitExceeded,
|
|
2807
|
+
FeedbackCollision,
|
|
2808
|
+
],
|
|
2809
|
+
Field(discriminator='error_feedback_name'),
|
|
2810
|
+
]
|
|
2811
|
+
error_location_on_trajectory: Location
|
|
2812
|
+
joint_trajectory: Optional[JointTrajectory] = None
|
|
2813
|
+
"""
|
|
2814
|
+
The joint trajectory from the start joint position to the error.
|
|
2815
|
+
|
|
2816
|
+
"""
|
|
2817
|
+
|
|
2818
|
+
|
|
2819
|
+
class PlanTrajectoryResponse(BaseModel):
|
|
2820
|
+
response: Union[JointTrajectory, PlanTrajectoryFailedResponse]
|
|
2821
|
+
|
|
2822
|
+
|
|
2823
|
+
class ValidationError(BaseModel):
|
|
2824
|
+
loc: Annotated[List[Union[str, int]], Field(title='Location')]
|
|
2825
|
+
msg: Annotated[str, Field(title='Message')]
|
|
2826
|
+
type: Annotated[str, Field(title='Error Type')]
|
|
2827
|
+
input: Dict[str, Any]
|
|
2828
|
+
|
|
2829
|
+
|
|
2830
|
+
class ErrorInvalidJointCount(BaseModel):
|
|
2831
|
+
"""
|
|
2832
|
+
The provided joint data does not match the expected number of joints
|
|
2833
|
+
for this motion group.
|
|
2834
|
+
|
|
2835
|
+
"""
|
|
2836
|
+
|
|
2837
|
+
expected_joint_count: int
|
|
2838
|
+
"""
|
|
2839
|
+
The expected number of joints for this motion group.
|
|
2840
|
+
|
|
2841
|
+
"""
|
|
2842
|
+
provided_joint_count: int
|
|
2843
|
+
"""
|
|
2844
|
+
The number of provided joints.
|
|
2845
|
+
|
|
2846
|
+
"""
|
|
2847
|
+
error_feedback_name: Literal['ErrorInvalidJointCount'] = 'ErrorInvalidJointCount'
|
|
2848
|
+
|
|
2849
|
+
|
|
2850
|
+
class ErrorJointLimitExceeded(BaseModel):
|
|
2851
|
+
"""
|
|
2852
|
+
A reference joint position (start or target) exceeds the configured joint limits.
|
|
2853
|
+
|
|
2854
|
+
"""
|
|
2855
|
+
|
|
2856
|
+
joint_index: Annotated[Optional[int], Field(ge=0, le=2147483647)] = None
|
|
2857
|
+
"""
|
|
2858
|
+
Index of the joint exceeding its limits (0-based).
|
|
2859
|
+
|
|
2860
|
+
"""
|
|
2861
|
+
joint_position: Optional[DoubleArray] = None
|
|
2862
|
+
"""
|
|
2863
|
+
The joint position violating the limits.
|
|
2864
|
+
|
|
2865
|
+
"""
|
|
2866
|
+
error_feedback_name: Literal['ErrorJointLimitExceeded'] = 'ErrorJointLimitExceeded'
|
|
2867
|
+
|
|
2868
|
+
|
|
2869
|
+
class ErrorJointPositionCollision(BaseModel):
|
|
2870
|
+
"""
|
|
2871
|
+
A reference joint position, e.g., start or target joint position, results in collisions that prevent processing.
|
|
2872
|
+
|
|
2873
|
+
"""
|
|
2874
|
+
|
|
2875
|
+
collisions: Optional[List[Collision]] = None
|
|
2876
|
+
joint_position: Optional[DoubleArray] = None
|
|
2877
|
+
"""
|
|
2878
|
+
The joint position that collides.
|
|
2879
|
+
|
|
2880
|
+
"""
|
|
2881
|
+
error_feedback_name: Literal['ErrorJointPositionCollision'] = (
|
|
2882
|
+
'ErrorJointPositionCollision'
|
|
2883
|
+
)
|
|
2884
|
+
|
|
2885
|
+
|
|
2886
|
+
class PlanValidationError(ValidationError):
|
|
2887
|
+
data: Annotated[
|
|
2888
|
+
Optional[
|
|
2889
|
+
Union[
|
|
2890
|
+
ErrorInvalidJointCount,
|
|
2891
|
+
ErrorJointLimitExceeded,
|
|
2892
|
+
ErrorJointPositionCollision,
|
|
2893
|
+
]
|
|
2894
|
+
],
|
|
2895
|
+
Field(discriminator='error_feedback_name'),
|
|
2896
|
+
] = None
|
|
2897
|
+
"""
|
|
2898
|
+
Optional data further specifying the validation error.
|
|
2899
|
+
|
|
2900
|
+
"""
|
|
2901
|
+
|
|
2902
|
+
|
|
2903
|
+
class Plan422Response(BaseModel):
|
|
2904
|
+
detail: Annotated[Optional[List[PlanValidationError]], Field(title='Detail')] = None
|
|
2905
|
+
|
|
2906
|
+
|
|
2907
|
+
class RRTConnectAlgorithm(BaseModel):
|
|
2908
|
+
algorithm_name: Literal['RRTConnectAlgorithm'] = 'RRTConnectAlgorithm'
|
|
2909
|
+
"""
|
|
2910
|
+
Algorithm discriminator.
|
|
2911
|
+
|
|
2912
|
+
RRT Connect algorithm configuration for collision-free path planning.
|
|
2913
|
+
Rapidly-exploring Random Trees (RRT) builds trees of valid configurations by randomly sampling
|
|
2914
|
+
the joint space and connecting feasible points with JointPTP motions.
|
|
2915
|
+
RRT Connect grows two trees simultaneously from start and target positions until they meet.
|
|
2916
|
+
This is a custom implementation optimized for manipulator kinematics and collision checking in industrial contexts.
|
|
2917
|
+
|
|
2918
|
+
"""
|
|
2919
|
+
max_iterations: Annotated[Optional[int], Field(ge=1)] = 10000
|
|
2920
|
+
"""
|
|
2921
|
+
Maximum number of iterations for the RRT Connect algorithm.
|
|
2922
|
+
Higher values increase likelihood of success, but also computation time.
|
|
2923
|
+
|
|
2924
|
+
"""
|
|
2925
|
+
max_step_size: Optional[float] = 1
|
|
2926
|
+
"""
|
|
2927
|
+
Maximum step size for tree extension in joint space.
|
|
2928
|
+
"""
|
|
2929
|
+
adaptive_step_size: Optional[bool] = True
|
|
2930
|
+
"""
|
|
2931
|
+
Adjust the maximum step size during the search based on the recent success rate of tree expansion.
|
|
2932
|
+
"""
|
|
2933
|
+
apply_smoothing: Optional[bool] = True
|
|
2934
|
+
"""
|
|
2935
|
+
Apply smoothing after the search has succeeded. This will remove as many intermediate points as possible while keeping the path valid.
|
|
2936
|
+
"""
|
|
2937
|
+
apply_blending: Optional[bool] = True
|
|
2938
|
+
"""
|
|
2939
|
+
Apply blending after the search has succeeded and smoothing has been applied. This will apply the largest viable blending at each intermediate point.
|
|
2940
|
+
"""
|
|
2941
|
+
|
|
2942
|
+
|
|
2943
|
+
class MidpointInsertionAlgorithm(BaseModel):
|
|
2944
|
+
algorithm_name: Literal['MidpointInsertionAlgorithm'] = 'MidpointInsertionAlgorithm'
|
|
2945
|
+
"""
|
|
2946
|
+
Algorithm discriminator.
|
|
2947
|
+
|
|
2948
|
+
Midpoint insertion algorithm configuration for collision-free path planning.
|
|
2949
|
+
This algorithm adds a single midpoint between the start and target joint position to find collision-free paths.
|
|
2950
|
+
|
|
2951
|
+
"""
|
|
2952
|
+
max_iterations: Annotated[Optional[int], Field(ge=1)] = 1000
|
|
2953
|
+
"""
|
|
2954
|
+
Maximum number of iterations for the midpoint insertion algorithm.
|
|
2955
|
+
Higher values increase likelyhood of success, but also computation time (linear).
|
|
2956
|
+
|
|
2957
|
+
"""
|
|
2958
|
+
|
|
2959
|
+
|
|
2960
|
+
class CollisionFreeAlgorithm(RootModel):
|
|
2961
|
+
root: Annotated[
|
|
2962
|
+
Union[RRTConnectAlgorithm, MidpointInsertionAlgorithm],
|
|
2963
|
+
Field(discriminator='algorithm_name', title='CollisionFreeAlgorithm'),
|
|
2964
|
+
]
|
|
2965
|
+
"""
|
|
2966
|
+
Configuration for collision-free path planning algorithms.
|
|
2967
|
+
Different algorithms may have different parameters and behavior.
|
|
2968
|
+
|
|
2969
|
+
Recommendation:
|
|
2970
|
+
- For **cells with many obstacles**, use the RRTConnect algorithm. Use it as a starting point.
|
|
2971
|
+
- For **simple cells with very few obstacles** and when a faster solution is needed, try the MidpointInsertion algorithm.
|
|
2972
|
+
|
|
2973
|
+
"""
|
|
2974
|
+
|
|
2975
|
+
|
|
2976
|
+
class PlanCollisionFreeRequest(BaseModel):
|
|
2977
|
+
motion_group_setup: MotionGroupSetup
|
|
2978
|
+
"""
|
|
2979
|
+
The data to assemble the robot setup can be retrieved from [getMotionGroupDescription](getMotionGroupDescription) endpoint.
|
|
2980
|
+
"""
|
|
2981
|
+
start_joint_position: DoubleArray
|
|
2982
|
+
"""
|
|
2983
|
+
Starting joint position for the collision-free motion.
|
|
2984
|
+
Must contain exactly the same number of values as joints in the motion group.
|
|
2985
|
+
To retrieve the current joint position use the endpoint [getCurrentMotionGroupState](getCurrentMotionGroupState).
|
|
2986
|
+
|
|
2987
|
+
"""
|
|
2988
|
+
target: DoubleArray
|
|
2989
|
+
"""
|
|
2990
|
+
The target joint position of the motion.
|
|
2991
|
+
Must contain exactly the same number of values as joints in the motion group.
|
|
2992
|
+
To compute target joint position from a TCP pose use the endpoint [inverseKinematics](inverseKinematics).
|
|
2993
|
+
|
|
2994
|
+
"""
|
|
2995
|
+
algorithm: CollisionFreeAlgorithm
|
|
2996
|
+
|
|
2997
|
+
|
|
2998
|
+
class ErrorMaxIterationsExceeded(BaseModel):
|
|
2999
|
+
"""
|
|
3000
|
+
The collision-free planning algorithm reached its maximum iteration limit
|
|
3001
|
+
without finding a valid path. Increase max_iterations or
|
|
3002
|
+
modify the start/target positions.
|
|
3003
|
+
|
|
3004
|
+
"""
|
|
3005
|
+
|
|
3006
|
+
max_iterations: Optional[int] = None
|
|
3007
|
+
"""
|
|
3008
|
+
The maximum number of iterations that was reached.
|
|
3009
|
+
|
|
3010
|
+
"""
|
|
3011
|
+
error_feedback_name: Literal['ErrorMaxIterationsExceeded'] = (
|
|
3012
|
+
'ErrorMaxIterationsExceeded'
|
|
3013
|
+
)
|
|
3014
|
+
|
|
3015
|
+
|
|
3016
|
+
class PlanCollisionFreeFailedResponse(BaseModel):
|
|
3017
|
+
"""
|
|
3018
|
+
Response when collision-free trajectory planning fails.
|
|
3019
|
+
Contains specific feedback about why the planning failed.
|
|
3020
|
+
|
|
3021
|
+
"""
|
|
3022
|
+
|
|
3023
|
+
error_feedback: ErrorMaxIterationsExceeded
|
|
3024
|
+
|
|
3025
|
+
|
|
3026
|
+
class PlanCollisionFreeResponse(BaseModel):
|
|
3027
|
+
"""
|
|
3028
|
+
Response from collision-free trajectory planning.
|
|
3029
|
+
Contains either a successful joint trajectory or failure information.
|
|
3030
|
+
|
|
3031
|
+
"""
|
|
3032
|
+
|
|
3033
|
+
response: Union[JointTrajectory, PlanCollisionFreeFailedResponse]
|
|
3034
|
+
|
|
3035
|
+
|
|
3036
|
+
class JointPositionLimits(RootModel):
|
|
3037
|
+
"""
|
|
3038
|
+
Joint position limits in [rad], indexed starting from base.
|
|
3039
|
+
|
|
3040
|
+
"""
|
|
3041
|
+
|
|
3042
|
+
root: Annotated[List[LimitRange], Field(title='JointPositionLimits')]
|
|
3043
|
+
"""
|
|
3044
|
+
Joint position limits in [rad], indexed starting from base.
|
|
3045
|
+
|
|
3046
|
+
"""
|
|
3047
|
+
|
|
3048
|
+
def __getitem__(self, index: int) -> LimitRange:
|
|
3049
|
+
"""
|
|
3050
|
+
Make list RootModel directly indexable.
|
|
3051
|
+
"""
|
|
3052
|
+
return self.root[index]
|
|
3053
|
+
|
|
3054
|
+
def __setitem__(self, index: int, value: LimitRange) -> None:
|
|
3055
|
+
"""
|
|
3056
|
+
Make list RootModel directly indexable.
|
|
3057
|
+
"""
|
|
3058
|
+
self.root[index] = value
|
|
3059
|
+
|
|
3060
|
+
def __len__(self) -> int:
|
|
3061
|
+
"""
|
|
3062
|
+
Make list RootModel directly usable with len().
|
|
3063
|
+
"""
|
|
3064
|
+
return len(self.root)
|
|
3065
|
+
|
|
3066
|
+
def __iter__(self):
|
|
3067
|
+
"""
|
|
3068
|
+
Make list RootModel directly iterable.
|
|
3069
|
+
"""
|
|
3070
|
+
return iter(self.root)
|
|
3071
|
+
|
|
3072
|
+
|
|
3073
|
+
class InverseKinematicsRequest(BaseModel):
|
|
3074
|
+
motion_group_model: MotionGroupModel
|
|
3075
|
+
tcp_poses: List[Pose]
|
|
3076
|
+
"""
|
|
3077
|
+
List of TCP poses for which the inverse solutions are computed.
|
|
3078
|
+
|
|
3079
|
+
"""
|
|
3080
|
+
tcp_offset: Optional[Pose] = None
|
|
3081
|
+
mounting: Optional[Pose] = None
|
|
3082
|
+
"""
|
|
3083
|
+
Offset from the world frame to the motion group base.
|
|
3084
|
+
"""
|
|
3085
|
+
joint_position_limits: Optional[JointPositionLimits] = None
|
|
3086
|
+
collision_setups: Optional[CollisionSetups] = None
|
|
3087
|
+
|
|
3088
|
+
|
|
3089
|
+
class InverseKinematicsResponse(BaseModel):
|
|
3090
|
+
joints: List[List[DoubleArray]]
|
|
3091
|
+
|
|
3092
|
+
|
|
3093
|
+
class InverseKinematicsValidationError(ValidationError):
|
|
3094
|
+
data: Annotated[
|
|
3095
|
+
Optional[Union[ErrorInvalidJointCount, ErrorJointLimitExceeded]],
|
|
3096
|
+
Field(discriminator='error_feedback_name'),
|
|
3097
|
+
] = None
|
|
3098
|
+
"""
|
|
3099
|
+
Optional data further specifying the validation error.
|
|
3100
|
+
|
|
3101
|
+
"""
|
|
3102
|
+
|
|
3103
|
+
|
|
3104
|
+
class InverseKinematics422Response(BaseModel):
|
|
3105
|
+
detail: Annotated[
|
|
3106
|
+
Optional[List[InverseKinematicsValidationError]], Field(title='Detail')
|
|
3107
|
+
] = None
|
|
3108
|
+
|
|
3109
|
+
|
|
3110
|
+
class ForwardKinematicsRequest(BaseModel):
|
|
3111
|
+
motion_group_model: MotionGroupModel
|
|
3112
|
+
joint_positions: List[DoubleArray]
|
|
3113
|
+
"""
|
|
3114
|
+
List of joint positions [rad] for which TCP poses are computed.
|
|
3115
|
+
|
|
3116
|
+
"""
|
|
3117
|
+
tcp_offset: Optional[Pose] = None
|
|
3118
|
+
mounting: Optional[Pose] = None
|
|
3119
|
+
"""
|
|
3120
|
+
Offset from the world frame to the motion group base.
|
|
3121
|
+
"""
|
|
3122
|
+
|
|
3123
|
+
|
|
3124
|
+
class ForwardKinematicsResponse(BaseModel):
|
|
3125
|
+
tcp_poses: List[Pose]
|
|
3126
|
+
"""
|
|
3127
|
+
List of computed TCP poses corresponding to the input joint positions.
|
|
3128
|
+
|
|
3129
|
+
"""
|
|
3130
|
+
|
|
3131
|
+
|
|
3132
|
+
class ForwardKinematicsValidationError(ValidationError):
|
|
3133
|
+
data: Optional[ErrorInvalidJointCount] = None
|
|
3134
|
+
|
|
3135
|
+
|
|
3136
|
+
class ForwardKinematics422Response(BaseModel):
|
|
3137
|
+
detail: Annotated[
|
|
3138
|
+
Optional[List[ForwardKinematicsValidationError]], Field(title='Detail')
|
|
3139
|
+
] = None
|
|
3140
|
+
|
|
3141
|
+
|
|
3142
|
+
class ListTrajectoriesResponse(BaseModel):
|
|
3143
|
+
trajectories: Optional[List[str]] = None
|
|
3144
|
+
"""
|
|
3145
|
+
Identifiers of trajectories which are currently cached.
|
|
3146
|
+
Use [addTrajectory](addTrajectory) to add a new trajectory. Adding trajectories is necessary to execute them.
|
|
3147
|
+
Trajectories are removed if the corresponding motion group or controller disconnects.
|
|
3148
|
+
|
|
3149
|
+
"""
|
|
3150
|
+
|
|
3151
|
+
|
|
3152
|
+
class AddTrajectoryRequest(BaseModel):
|
|
3153
|
+
motion_group: str
|
|
3154
|
+
"""
|
|
3155
|
+
Unique identifier of the motion group the trajectory is planned for.
|
|
3156
|
+
"""
|
|
3157
|
+
trajectory: JointTrajectory
|
|
3158
|
+
"""
|
|
3159
|
+
The trajectory consisting of a list of joint positions and
|
|
3160
|
+
an equal number of corresponding timestamps.
|
|
3161
|
+
|
|
3162
|
+
"""
|
|
3163
|
+
tcp: Optional[str] = None
|
|
3164
|
+
"""
|
|
3165
|
+
Unique identifier of the tool the trajectory is planned for.
|
|
3166
|
+
"""
|
|
3167
|
+
|
|
3168
|
+
|
|
3169
|
+
class TcpRequiredError(BaseModel):
|
|
3170
|
+
"""
|
|
3171
|
+
Requested motion group requires TCP to be defined.
|
|
3172
|
+
"""
|
|
3173
|
+
|
|
3174
|
+
tcp_missing: Optional[Dict[str, Any]] = None
|
|
3175
|
+
|
|
3176
|
+
|
|
3177
|
+
class InconsistentTrajectorySize(BaseModel):
|
|
3178
|
+
joint_position_size: Optional[int] = None
|
|
3179
|
+
times_size: Optional[int] = None
|
|
3180
|
+
locations_size: Optional[int] = None
|
|
3181
|
+
|
|
3182
|
+
|
|
3183
|
+
class InconsistentTrajectorySizeError(BaseModel):
|
|
3184
|
+
"""
|
|
3185
|
+
Indicates that the trajectory contains an inconsistent number of joint positions, times, or locations.
|
|
3186
|
+
|
|
3187
|
+
"""
|
|
3188
|
+
|
|
3189
|
+
inconsistent_trajectory_size: Optional[InconsistentTrajectorySize] = None
|
|
3190
|
+
|
|
3191
|
+
|
|
3192
|
+
class JointLimitExceededError(BaseModel):
|
|
3193
|
+
joint_limit_exceeded: Optional[FeedbackJointLimitExceeded] = None
|
|
3194
|
+
|
|
3195
|
+
|
|
3196
|
+
class CollisionError(BaseModel):
|
|
3197
|
+
collision: Optional[FeedbackCollision] = None
|
|
3198
|
+
|
|
3199
|
+
|
|
3200
|
+
class TorqueExceeded(BaseModel):
|
|
3201
|
+
torque_value: Optional[float] = None
|
|
3202
|
+
"""
|
|
3203
|
+
The torque value that was exceeded.
|
|
3204
|
+
|
|
3205
|
+
"""
|
|
3206
|
+
torque_limit: Optional[float] = None
|
|
3207
|
+
"""
|
|
3208
|
+
The value of the torque limit that was exceeded.
|
|
3209
|
+
|
|
3210
|
+
"""
|
|
3211
|
+
|
|
3212
|
+
|
|
3213
|
+
class TorqueExceededError(BaseModel):
|
|
3214
|
+
torque_exceeded: Optional[TorqueExceeded] = None
|
|
3215
|
+
|
|
3216
|
+
|
|
3217
|
+
class InvalidDof(BaseModel):
|
|
3218
|
+
valid_dof: Optional[int] = None
|
|
3219
|
+
"""
|
|
3220
|
+
The valid degrees of freedom for the motion group.
|
|
3221
|
+
|
|
3222
|
+
"""
|
|
3223
|
+
joint_position: Optional[List[float]] = None
|
|
3224
|
+
"""
|
|
3225
|
+
The joint position that is out of its limits.
|
|
3226
|
+
"""
|
|
3227
|
+
|
|
3228
|
+
|
|
3229
|
+
class InvalidDofError(BaseModel):
|
|
3230
|
+
invalid_dof: Optional[InvalidDof] = None
|
|
3231
|
+
|
|
3232
|
+
|
|
3233
|
+
class NanValue(BaseModel):
|
|
3234
|
+
"""
|
|
3235
|
+
Requested joint position contains NaN values.
|
|
3236
|
+
"""
|
|
3237
|
+
|
|
3238
|
+
joint_position: Optional[List[float]] = None
|
|
3239
|
+
"""
|
|
3240
|
+
The joint position that is out of its limits.
|
|
3241
|
+
"""
|
|
3242
|
+
|
|
3243
|
+
|
|
3244
|
+
class NanValueError(BaseModel):
|
|
3245
|
+
nan_value: Optional[NanValue] = None
|
|
3246
|
+
"""
|
|
3247
|
+
Requested joint position contains NaN values.
|
|
3248
|
+
"""
|
|
3249
|
+
|
|
3250
|
+
|
|
3251
|
+
class AddTrajectoryError(BaseModel):
|
|
3252
|
+
message: Optional[str] = None
|
|
3253
|
+
location: Optional[Location] = None
|
|
3254
|
+
data: Optional[
|
|
3255
|
+
Union[
|
|
3256
|
+
TcpRequiredError,
|
|
3257
|
+
InconsistentTrajectorySizeError,
|
|
3258
|
+
JointLimitExceededError,
|
|
3259
|
+
CollisionError,
|
|
3260
|
+
TorqueExceededError,
|
|
3261
|
+
InvalidDofError,
|
|
3262
|
+
NanValueError,
|
|
3263
|
+
]
|
|
3264
|
+
] = None
|
|
3265
|
+
|
|
3266
|
+
|
|
3267
|
+
class AddTrajectoryResponse(BaseModel):
|
|
3268
|
+
"""
|
|
3269
|
+
The response signals if the trajectory is valid or faulty resulting in an executable, partially executable or not executable state.
|
|
3270
|
+
- valid trajectory: response contains only the unique identifier for the trajectory
|
|
3271
|
+
- 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.
|
|
3272
|
+
- trajectory has error at start or invalid data: response contains only information about the failure.
|
|
3273
|
+
|
|
3274
|
+
To execute the trajectory use the unique identifier for calling [executeTrajectory](executeTrajectory).
|
|
3275
|
+
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](executeTrajectory).
|
|
3276
|
+
|
|
3277
|
+
"""
|
|
3278
|
+
|
|
3279
|
+
trajectory: Optional[str] = None
|
|
3280
|
+
"""
|
|
3281
|
+
The unique identifier of the trajectory. Use this identifier to execute the trajectory with the [executeTrajectory](executeTrajectory) endpoint.
|
|
3282
|
+
|
|
3283
|
+
"""
|
|
3284
|
+
error: Optional[AddTrajectoryError] = None
|
|
3285
|
+
"""
|
|
3286
|
+
Always check this field first. If this field is present, the trajectory has an error and is only partially or not executable.
|
|
3287
|
+
|
|
3288
|
+
"""
|
|
3289
|
+
|
|
3290
|
+
|
|
3291
|
+
class GetTrajectoryResponse(BaseModel):
|
|
3292
|
+
motion_group: str
|
|
3293
|
+
"""
|
|
3294
|
+
Unique identifier of the motion group the trajectory is planned for.
|
|
3295
|
+
"""
|
|
3296
|
+
trajectory: JointTrajectory
|
|
3297
|
+
"""
|
|
3298
|
+
The trajectory consisting of a list of joint positions and
|
|
3299
|
+
an equal number of corresponding timestamps.
|
|
3300
|
+
|
|
3301
|
+
"""
|
|
3302
|
+
tcp: str
|
|
3303
|
+
"""
|
|
3304
|
+
Unique identifier of the tool the trajectory is planned for.
|
|
3305
|
+
"""
|
|
3306
|
+
|
|
3307
|
+
|
|
3308
|
+
class TrajectoryId(BaseModel):
|
|
3309
|
+
message_type: Literal['TrajectoryId'] = 'TrajectoryId'
|
|
3310
|
+
"""
|
|
3311
|
+
Type specifier for server, set automatically.
|
|
3312
|
+
|
|
3313
|
+
"""
|
|
3314
|
+
id: str
|
|
3315
|
+
"""
|
|
3316
|
+
The identifier of the trajectory which was returned by the [addTrajectory](addTrajectory) endpoint.
|
|
3317
|
+
|
|
3318
|
+
"""
|
|
3319
|
+
|
|
3320
|
+
|
|
3321
|
+
class TrajectoryData(BaseModel):
|
|
3322
|
+
message_type: Literal['TrajectoryData'] = 'TrajectoryData'
|
|
3323
|
+
"""
|
|
3324
|
+
Type specifier for server, set automatically.
|
|
3325
|
+
|
|
3326
|
+
"""
|
|
3327
|
+
motion_group: Optional[str] = None
|
|
3328
|
+
"""
|
|
3329
|
+
Identifier of the motion-group.
|
|
3330
|
+
"""
|
|
3331
|
+
data: JointTrajectory
|
|
3332
|
+
"""
|
|
3333
|
+
The trajectory consisting of a list of joint positions and
|
|
3334
|
+
an equal number of corresponding timestamps.
|
|
3335
|
+
|
|
3336
|
+
"""
|
|
3337
|
+
tcp: Optional[str] = None
|
|
3338
|
+
"""
|
|
3339
|
+
Unique identifier of the tool the trajectory is planned for.
|
|
3340
|
+
"""
|
|
3341
|
+
|
|
3342
|
+
|
|
3343
|
+
class InitializeMovementRequest(BaseModel):
|
|
3344
|
+
"""
|
|
3345
|
+
Sets up connection by locking a trajectory for execution. The robot controller mode is set to control mode.
|
|
3346
|
+
ATTENTION: This request has to be sent before any StartMovementRequest is sent.
|
|
3347
|
+
If initializing the movement was successful, no further movements can be initialized. To execute another trajectory, another connection has to be established.
|
|
3348
|
+
|
|
3349
|
+
"""
|
|
3350
|
+
|
|
3351
|
+
message_type: Literal['InitializeMovementRequest'] = 'InitializeMovementRequest'
|
|
3352
|
+
"""
|
|
3353
|
+
Type specifier for server, set automatically.
|
|
3354
|
+
|
|
3355
|
+
"""
|
|
3356
|
+
trajectory: Annotated[
|
|
3357
|
+
Union[TrajectoryId, TrajectoryData], Field(discriminator='message_type')
|
|
3358
|
+
]
|
|
3359
|
+
"""
|
|
3360
|
+
The trajectory which should be executed and locked to the connection.
|
|
3361
|
+
|
|
3362
|
+
"""
|
|
3363
|
+
initial_location: Optional[Location] = None
|
|
3364
|
+
response_coordinate_system: Optional[str] = None
|
|
3365
|
+
"""
|
|
3366
|
+
Unique identifier addressing a coordinate system to which the responses are transformed.
|
|
3367
|
+
If not set, world coordinate system is used.
|
|
3368
|
+
|
|
3369
|
+
"""
|
|
3370
|
+
|
|
3371
|
+
|
|
3372
|
+
class Direction(Enum):
|
|
3373
|
+
"""
|
|
3374
|
+
The direction in which the trajectory is executed. Default: Forward.
|
|
3375
|
+
|
|
3376
|
+
"""
|
|
3377
|
+
|
|
3378
|
+
DIRECTION_FORWARD = 'DIRECTION_FORWARD'
|
|
3379
|
+
DIRECTION_BACKWARD = 'DIRECTION_BACKWARD'
|
|
3380
|
+
|
|
3381
|
+
|
|
3382
|
+
class IOOrigin(Enum):
|
|
3383
|
+
"""
|
|
3384
|
+
States the source of the input/output signal.
|
|
3385
|
+
|
|
3386
|
+
"""
|
|
3387
|
+
|
|
3388
|
+
CONTROLLER = 'CONTROLLER'
|
|
3389
|
+
BUS_IO = 'BUS_IO'
|
|
3390
|
+
|
|
3391
|
+
|
|
3392
|
+
class SetIO(BaseModel):
|
|
3393
|
+
"""
|
|
3394
|
+
Defines an input/output that should be set upon reaching a specified location on the trajectory.
|
|
3395
|
+
"""
|
|
3396
|
+
|
|
3397
|
+
io: IOValue
|
|
3398
|
+
location: float
|
|
3399
|
+
"""
|
|
3400
|
+
The location on the trajectory where the input/output should be set.
|
|
3401
|
+
"""
|
|
3402
|
+
io_origin: IOOrigin
|
|
3403
|
+
|
|
3404
|
+
|
|
3405
|
+
class StartOnIO(BaseModel):
|
|
3406
|
+
"""
|
|
3407
|
+
Defines an input/output that the motion should wait for to start the execution.
|
|
3408
|
+
"""
|
|
3409
|
+
|
|
3410
|
+
io: IOValue
|
|
3411
|
+
comparator: Comparator
|
|
3412
|
+
"""
|
|
3413
|
+
Comparator for the comparison of two values.
|
|
3414
|
+
Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b.
|
|
3415
|
+
|
|
3416
|
+
"""
|
|
3417
|
+
io_origin: IOOrigin
|
|
3418
|
+
|
|
3419
|
+
|
|
3420
|
+
class PauseOnIO(BaseModel):
|
|
3421
|
+
"""
|
|
3422
|
+
Defines an input/output that the motion will be paused for. The motion will stop gracefully on path.
|
|
3423
|
+
"""
|
|
3424
|
+
|
|
3425
|
+
io: IOValue
|
|
3426
|
+
comparator: Comparator
|
|
3427
|
+
"""
|
|
3428
|
+
Comparator for the comparison of two values.
|
|
3429
|
+
Use the measured I/O as the base value (a) and the expected input/output value as the comparator (b): e.g., a > b.
|
|
3430
|
+
|
|
3431
|
+
"""
|
|
3432
|
+
io_origin: IOOrigin
|
|
3433
|
+
|
|
3434
|
+
|
|
3435
|
+
class StartMovementRequest(BaseModel):
|
|
3436
|
+
"""
|
|
3437
|
+
Moves the motion group along a trajectory, added via [planTrajectory](planTrajectory) or [planMotion](planMotion).
|
|
3438
|
+
Trajectories can be executed forwards or backwards("in reverse").
|
|
3439
|
+
|
|
3440
|
+
Pause the execution with PauseMovementRequest.
|
|
3441
|
+
Resume execution with StartMovementRequest.
|
|
3442
|
+
|
|
3443
|
+
Precondition: To start execution, the motion group must be located at the trajectory's start location specified in InitializeMovementRequest.
|
|
3444
|
+
|
|
3445
|
+
"""
|
|
3446
|
+
|
|
3447
|
+
message_type: Literal['StartMovementRequest'] = 'StartMovementRequest'
|
|
3448
|
+
"""
|
|
3449
|
+
Type specifier for server, set automatically.
|
|
3450
|
+
|
|
3451
|
+
"""
|
|
3452
|
+
direction: Optional[Direction] = 'DIRECTION_FORWARD'
|
|
3453
|
+
target_location: Optional[Location] = None
|
|
3454
|
+
"""
|
|
3455
|
+
The target location to which the motion group moves along the trajectory to.
|
|
3456
|
+
If `direction` and `target_location` are both specified, target location takes precedence.
|
|
3457
|
+
If neither is specified, the default is `DIRECTION_FORWARD`.
|
|
3458
|
+
|
|
3459
|
+
"""
|
|
3460
|
+
set_outputs: Optional[List[SetIO]] = None
|
|
3461
|
+
"""
|
|
3462
|
+
Attaches a list of output commands to the trajectory. The outputs are set to the specified values right after the specified location was reached.
|
|
3463
|
+
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.
|
|
3464
|
+
|
|
3465
|
+
"""
|
|
3466
|
+
start_on_io: Optional[StartOnIO] = None
|
|
3467
|
+
"""
|
|
3468
|
+
Defines an input/output that is listened to before the movement. Execution starts if the defined comparator evaluates to `true`.
|
|
3469
|
+
|
|
3470
|
+
"""
|
|
3471
|
+
pause_on_io: Optional[PauseOnIO] = None
|
|
3472
|
+
"""
|
|
3473
|
+
Defines an input/output that is listened to during the movement. Execution pauses if the defined comparator evaluates to `true`.
|
|
3474
|
+
|
|
3475
|
+
"""
|
|
3476
|
+
|
|
3477
|
+
|
|
3478
|
+
class PauseMovementRequest(BaseModel):
|
|
3479
|
+
"""
|
|
3480
|
+
Request to pause the movement execution. Movement pauses as soon as a [Standstill](Standstill.yaml) is sent back to the client.
|
|
3481
|
+
Resume movement with StartMovementRequest.
|
|
3482
|
+
|
|
3483
|
+
"""
|
|
3484
|
+
|
|
3485
|
+
message_type: Literal['PauseMovementRequest'] = 'PauseMovementRequest'
|
|
3486
|
+
"""
|
|
3487
|
+
Type specifier for server, set automatically.
|
|
3488
|
+
|
|
3489
|
+
"""
|
|
3490
|
+
|
|
3491
|
+
|
|
3492
|
+
class PlaybackSpeedRequest(BaseModel):
|
|
3493
|
+
"""
|
|
3494
|
+
Sets velocity for executed movements of the motion, in percent. Send after initializing the connection with InitializeMovementRequest.
|
|
3495
|
+
|
|
3496
|
+
"""
|
|
3497
|
+
|
|
3498
|
+
message_type: Literal['PlaybackSpeedRequest'] = 'PlaybackSpeedRequest'
|
|
3499
|
+
"""
|
|
3500
|
+
Type specifier for server, set automatically.
|
|
3501
|
+
|
|
3502
|
+
"""
|
|
3503
|
+
playback_speed_in_percent: Annotated[int, Field(ge=0, le=100)]
|
|
3504
|
+
"""
|
|
3505
|
+
Sets velocity for executed movements of the trajectory, in percent. 100% means that the motion group moves as
|
|
3506
|
+
fast as possible without violating any planning and motion group limits. Setting this value does not affect the overall shape of the velocity profile.
|
|
3507
|
+
The velocity profile of the trajectory is scaled down by the same factor. Therefore, this should only be used for teaching and trajectory
|
|
3508
|
+
evaluation purposes. To maintain a specific velocity, set the respective limits when planning the trajectory.
|
|
3509
|
+
|
|
3510
|
+
"""
|
|
3511
|
+
|
|
3512
|
+
|
|
3513
|
+
class ExecuteTrajectoryRequest(RootModel):
|
|
3514
|
+
root: Annotated[
|
|
3515
|
+
Union[
|
|
3516
|
+
InitializeMovementRequest,
|
|
3517
|
+
StartMovementRequest,
|
|
3518
|
+
PauseMovementRequest,
|
|
3519
|
+
PlaybackSpeedRequest,
|
|
3520
|
+
],
|
|
3521
|
+
Field(discriminator='message_type', title='ExecuteTrajectoryRequest'),
|
|
3522
|
+
]
|
|
3523
|
+
|
|
3524
|
+
|
|
3525
|
+
class InitializeMovementResponse(BaseModel):
|
|
3526
|
+
"""
|
|
3527
|
+
Response for InitializeMovementRequest message.
|
|
3528
|
+
|
|
3529
|
+
"""
|
|
3530
|
+
|
|
3531
|
+
message: Optional[str] = None
|
|
3532
|
+
"""
|
|
3533
|
+
Error message in case of invalid InitializeMovementRequest.
|
|
3534
|
+
"""
|
|
3535
|
+
add_trajectory_error: Optional[AddTrajectoryError] = None
|
|
3536
|
+
"""
|
|
3537
|
+
Error can occur if joint trajectory was added by [InitializeMovementRequest](InitializeMovementRequest) and the trajectory is invalid.
|
|
3538
|
+
|
|
3539
|
+
"""
|
|
3540
|
+
kind: Literal['INITIALIZE_RECEIVED'] = 'INITIALIZE_RECEIVED'
|
|
3541
|
+
|
|
3542
|
+
|
|
3543
|
+
class StartMovementResponse(BaseModel):
|
|
3544
|
+
"""
|
|
3545
|
+
Acknowledgment for StartMovementRequest message.
|
|
3546
|
+
ATTENTION: No confirmation that the movement was started. Confirmation that the StartMovementRequest was received and is processed.
|
|
3547
|
+
Fields `execute` and `standstill` of response of [streamMotionGroupState](streamMotionGroupState) signal start of movement execution.
|
|
3548
|
+
|
|
3549
|
+
"""
|
|
3550
|
+
|
|
3551
|
+
message: Optional[str] = None
|
|
3552
|
+
"""
|
|
3553
|
+
Error message in case of invalid StartMovementResquest.
|
|
3554
|
+
"""
|
|
3555
|
+
kind: Literal['START_RECEIVED'] = 'START_RECEIVED'
|
|
3556
|
+
|
|
3557
|
+
|
|
3558
|
+
class PauseMovementResponse(BaseModel):
|
|
3559
|
+
"""
|
|
3560
|
+
Acknowledgment for PauseMovementRequest message.
|
|
3561
|
+
ATTENTION: No confirmation that the movement was paused. Confirmation that the PauseMovementRequest was received and is processed.
|
|
3562
|
+
End of movement execution is signalled by [StillstandResponse](StillstandResponse).
|
|
3563
|
+
|
|
3564
|
+
"""
|
|
3565
|
+
|
|
3566
|
+
message: Optional[str] = None
|
|
3567
|
+
"""
|
|
3568
|
+
Error message in case of invalid PauseMovementResquest.
|
|
3569
|
+
"""
|
|
3570
|
+
kind: Literal['PAUSE_RECEIVED'] = 'PAUSE_RECEIVED'
|
|
3571
|
+
|
|
3572
|
+
|
|
3573
|
+
class PlaybackSpeedResponse(BaseModel):
|
|
3574
|
+
"""
|
|
3575
|
+
Acknowledgment for PlaybackSpeedRequest message.
|
|
3576
|
+
|
|
3577
|
+
"""
|
|
3578
|
+
|
|
3579
|
+
message: Optional[str] = None
|
|
3580
|
+
"""
|
|
3581
|
+
Error message in case of invalid PlaybackSpeedRequest.
|
|
3582
|
+
"""
|
|
3583
|
+
kind: Literal['PLAYBACK_SPEED_RECEIVED'] = 'PLAYBACK_SPEED_RECEIVED'
|
|
3584
|
+
|
|
3585
|
+
|
|
3586
|
+
class MovementErrorResponse(BaseModel):
|
|
3587
|
+
"""
|
|
3588
|
+
Error message in case an error occurs during movement execution.
|
|
3589
|
+
|
|
3590
|
+
"""
|
|
3591
|
+
|
|
3592
|
+
message: str
|
|
3593
|
+
"""
|
|
3594
|
+
Detailed error message describing the issue encountered during movement execution.
|
|
3595
|
+
"""
|
|
3596
|
+
kind: Literal['MOTION_ERROR'] = 'MOTION_ERROR'
|
|
3597
|
+
|
|
3598
|
+
|
|
3599
|
+
class ExecuteTrajectoryResponse(RootModel):
|
|
3600
|
+
root: Annotated[
|
|
3601
|
+
Union[
|
|
3602
|
+
InitializeMovementResponse,
|
|
3603
|
+
StartMovementResponse,
|
|
3604
|
+
PauseMovementResponse,
|
|
3605
|
+
PlaybackSpeedResponse,
|
|
3606
|
+
MovementErrorResponse,
|
|
3607
|
+
],
|
|
3608
|
+
Field(discriminator='kind', title='ExecuteTrajectoryResponse'),
|
|
3609
|
+
]
|
|
3610
|
+
|
|
3611
|
+
|
|
3612
|
+
class InitializeJoggingRequest(BaseModel):
|
|
3613
|
+
"""
|
|
3614
|
+
Send this message to start jogging a motion group.
|
|
3615
|
+
"""
|
|
3616
|
+
|
|
3617
|
+
message_type: Literal['InitializeJoggingRequest'] = 'InitializeJoggingRequest'
|
|
3618
|
+
"""
|
|
3619
|
+
Type specifier for server, set automatically.
|
|
3620
|
+
|
|
3621
|
+
"""
|
|
3622
|
+
motion_group: str
|
|
3623
|
+
"""
|
|
3624
|
+
Identifier of the motion group.
|
|
3625
|
+
"""
|
|
3626
|
+
tcp: Optional[str] = None
|
|
3627
|
+
"""
|
|
3628
|
+
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.
|
|
3629
|
+
|
|
3630
|
+
"""
|
|
3631
|
+
response_coordinate_system: Optional[str] = None
|
|
3632
|
+
"""
|
|
3633
|
+
Unique identifier addressing a coordinate system to which the responses are transformed.
|
|
3634
|
+
If not set, world coordinate system is used.
|
|
3635
|
+
|
|
3636
|
+
"""
|
|
3637
|
+
|
|
3638
|
+
|
|
3639
|
+
class JointVelocityRequest(BaseModel):
|
|
3640
|
+
"""
|
|
3641
|
+
Sets target joint velocities for jogging a motion group.
|
|
3642
|
+
"""
|
|
3643
|
+
|
|
3644
|
+
message_type: Literal['JointVelocityRequest'] = 'JointVelocityRequest'
|
|
3645
|
+
"""
|
|
3646
|
+
Type specifier for server, set automatically.
|
|
3647
|
+
"""
|
|
3648
|
+
velocity: Joints
|
|
3649
|
+
"""
|
|
3650
|
+
in [rad/s]
|
|
3651
|
+
"""
|
|
3652
|
+
|
|
3653
|
+
|
|
3654
|
+
class TcpVelocityRequest(BaseModel):
|
|
3655
|
+
"""
|
|
3656
|
+
Sets target TCP velocities for jogging a motion group.
|
|
3657
|
+
The motion group needs to have an inverse kinematic solver to be jogged by TCP velocities.
|
|
3658
|
+
Check `supports_inverse_kinematics` field in response of [listController](listController) for the motion group.
|
|
3659
|
+
|
|
3660
|
+
"""
|
|
3661
|
+
|
|
3662
|
+
message_type: Literal['TcpVelocityRequest'] = 'TcpVelocityRequest'
|
|
3663
|
+
"""
|
|
3664
|
+
Type specifier for server, set automatically.
|
|
3665
|
+
|
|
3666
|
+
"""
|
|
3667
|
+
translation: Vector3d
|
|
3668
|
+
rotation: Vector3d
|
|
3669
|
+
use_tool_coordinate_system: Optional[bool] = False
|
|
3670
|
+
"""
|
|
3671
|
+
If true, TCP velocities are interpreted in the tool coordinate system, specified by the TCP.
|
|
3672
|
+
If false, TCP velocities are interpreted in the world coordinate system.
|
|
3673
|
+
|
|
3674
|
+
"""
|
|
3675
|
+
|
|
3676
|
+
|
|
3677
|
+
class PauseJoggingRequest(BaseModel):
|
|
3678
|
+
"""
|
|
3679
|
+
Request to pause jogging. If successful, `execute` jogging state in [MotionGroupState](MotionGroupState.yaml) is set to `PAUSED_BY_USER`.
|
|
3680
|
+
|
|
3681
|
+
"""
|
|
3682
|
+
|
|
3683
|
+
message_type: Literal['PauseJoggingRequest'] = 'PauseJoggingRequest'
|
|
3684
|
+
"""
|
|
3685
|
+
Type specifier for server, set automatically.
|
|
3686
|
+
|
|
3687
|
+
"""
|
|
3688
|
+
|
|
3689
|
+
|
|
3690
|
+
class ExecuteJoggingRequest(RootModel):
|
|
3691
|
+
root: Annotated[
|
|
3692
|
+
Union[
|
|
3693
|
+
InitializeJoggingRequest,
|
|
3694
|
+
JointVelocityRequest,
|
|
3695
|
+
TcpVelocityRequest,
|
|
3696
|
+
PauseJoggingRequest,
|
|
3697
|
+
],
|
|
3698
|
+
Field(discriminator='message_type', title='ExecuteJoggingRequest'),
|
|
3699
|
+
]
|
|
3700
|
+
|
|
3701
|
+
|
|
3702
|
+
class InitializeJoggingResponse(BaseModel):
|
|
3703
|
+
"""
|
|
3704
|
+
Acknowledgment to an InitializeJoggingRequest.
|
|
3705
|
+
|
|
3706
|
+
"""
|
|
3707
|
+
|
|
3708
|
+
message: Optional[str] = None
|
|
3709
|
+
"""
|
|
3710
|
+
Error message in case of invalid InitializeJoggingRequest.
|
|
3711
|
+
"""
|
|
3712
|
+
kind: Literal['INITIALIZE_RECEIVED'] = 'INITIALIZE_RECEIVED'
|
|
3713
|
+
|
|
3714
|
+
|
|
3715
|
+
class PauseJoggingResponse(BaseModel):
|
|
3716
|
+
"""
|
|
3717
|
+
Acknowledgment to a PauseJoggingRequest.
|
|
3718
|
+
|
|
3719
|
+
"""
|
|
3720
|
+
|
|
3721
|
+
message: Optional[str] = None
|
|
3722
|
+
"""
|
|
3723
|
+
Error message in case of invalid PauseJoggingRequest.
|
|
3724
|
+
"""
|
|
3725
|
+
kind: Literal['PAUSE_RECEIVED'] = 'PAUSE_RECEIVED'
|
|
3726
|
+
|
|
3727
|
+
|
|
3728
|
+
class TcpVelocityResponse(BaseModel):
|
|
3729
|
+
"""
|
|
3730
|
+
Acknowledgment to a TcpVelocityRequest.
|
|
3731
|
+
|
|
3732
|
+
"""
|
|
3733
|
+
|
|
3734
|
+
message: Optional[str] = None
|
|
3735
|
+
"""
|
|
3736
|
+
Error message in case of invalid TcpVelocityRequest.
|
|
3737
|
+
"""
|
|
3738
|
+
kind: Literal['TCP_VELOCITY_RECEIVED'] = 'TCP_VELOCITY_RECEIVED'
|
|
3739
|
+
|
|
3740
|
+
|
|
3741
|
+
class JointVelocityResponse(BaseModel):
|
|
3742
|
+
"""
|
|
3743
|
+
Acknowledgment to a JointVelocityRequest.
|
|
3744
|
+
|
|
3745
|
+
"""
|
|
3746
|
+
|
|
3747
|
+
message: Optional[str] = None
|
|
3748
|
+
"""
|
|
3749
|
+
Error message in case of invalid JointVelocityRequest.
|
|
3750
|
+
"""
|
|
3751
|
+
kind: Literal['JOINT_VELOCITY_RECEIVED'] = 'JOINT_VELOCITY_RECEIVED'
|
|
3752
|
+
|
|
3753
|
+
|
|
3754
|
+
class ExecuteJoggingResponse(RootModel):
|
|
3755
|
+
root: Annotated[
|
|
3756
|
+
Union[
|
|
3757
|
+
InitializeJoggingResponse,
|
|
3758
|
+
PauseJoggingResponse,
|
|
3759
|
+
TcpVelocityResponse,
|
|
3760
|
+
JointVelocityResponse,
|
|
3761
|
+
MovementErrorResponse,
|
|
3762
|
+
],
|
|
3763
|
+
Field(discriminator='kind', title='ExecuteJoggingResponse'),
|
|
3764
|
+
]
|
|
3765
|
+
|
|
3766
|
+
|
|
3767
|
+
class Program(BaseModel):
|
|
3768
|
+
"""
|
|
3769
|
+
A program is a collection of instructions that are executed in the robot cell.
|
|
3770
|
+
"""
|
|
3771
|
+
|
|
3772
|
+
program: Annotated[
|
|
3773
|
+
str,
|
|
3774
|
+
Field(
|
|
3775
|
+
examples=['my_program'],
|
|
3776
|
+
max_length=255,
|
|
3777
|
+
min_length=1,
|
|
3778
|
+
pattern='^[a-zA-Z0-9_-]+$',
|
|
3779
|
+
title='Unique program identifier',
|
|
3780
|
+
),
|
|
3781
|
+
]
|
|
3782
|
+
name: Annotated[Optional[str], Field(title='Program name')] = None
|
|
3783
|
+
description: Annotated[Optional[str], Field(title='Program description')] = None
|
|
3784
|
+
app: Annotated[str, Field(title='The app containing the program.')]
|
|
3785
|
+
input_schema: Annotated[
|
|
3786
|
+
Optional[Dict[str, Any]], Field(title='Program input json schema')
|
|
3787
|
+
] = None
|
|
3788
|
+
preconditions: Annotated[
|
|
3789
|
+
Optional[Dict[str, Any]],
|
|
3790
|
+
Field(title='Preconditions before the program can be started'),
|
|
3791
|
+
] = None
|
|
3792
|
+
|
|
3793
|
+
|
|
3794
|
+
class ProgramStartRequest(BaseModel):
|
|
3795
|
+
"""
|
|
3796
|
+
The state of a program run.
|
|
3797
|
+
"""
|
|
3798
|
+
|
|
3799
|
+
arguments: Dict[str, Any]
|
|
3800
|
+
"""
|
|
3801
|
+
The arguments to pass to the program.
|
|
3802
|
+
"""
|
|
3803
|
+
|
|
3804
|
+
|
|
3805
|
+
class ProgramRunState(Enum):
|
|
3806
|
+
"""
|
|
3807
|
+
The state of a program run.
|
|
3808
|
+
"""
|
|
3809
|
+
|
|
3810
|
+
PREPARING = 'PREPARING'
|
|
3811
|
+
RUNNING = 'RUNNING'
|
|
3812
|
+
COMPLETED = 'COMPLETED'
|
|
3813
|
+
FAILED = 'FAILED'
|
|
3814
|
+
STOPPED = 'STOPPED'
|
|
3815
|
+
|
|
3816
|
+
|
|
3817
|
+
class ProgramRun(BaseModel):
|
|
3818
|
+
"""
|
|
3819
|
+
Holds the state of a program run.
|
|
3820
|
+
"""
|
|
3821
|
+
|
|
3822
|
+
run: Annotated[str, Field(title='Run Id')]
|
|
3823
|
+
"""
|
|
3824
|
+
Unique identifier of the program run
|
|
3825
|
+
"""
|
|
3826
|
+
program: Annotated[str, Field(title='Program Id')]
|
|
3827
|
+
"""
|
|
3828
|
+
Unique identifier of the program
|
|
3829
|
+
"""
|
|
3830
|
+
app: Annotated[Optional[str], Field(title='App Id')] = None
|
|
3831
|
+
"""
|
|
3832
|
+
Identifier of the app that produced the program run
|
|
3833
|
+
"""
|
|
3834
|
+
state: Annotated[ProgramRunState, Field(title='State')]
|
|
3835
|
+
"""
|
|
3836
|
+
State of the program run
|
|
3837
|
+
"""
|
|
3838
|
+
logs: Annotated[Optional[str], Field(title='Logs')] = None
|
|
3839
|
+
"""
|
|
3840
|
+
Logs of the program run
|
|
3841
|
+
"""
|
|
3842
|
+
stdout: Annotated[Optional[str], Field(title='Stdout')] = None
|
|
3843
|
+
"""
|
|
3844
|
+
Stdout of the program run
|
|
3845
|
+
"""
|
|
3846
|
+
stderr: Annotated[Optional[str], Field(title='Stderr')] = None
|
|
3847
|
+
"""
|
|
3848
|
+
Stderr of the program run
|
|
3849
|
+
"""
|
|
3850
|
+
error: Annotated[Optional[str], Field(title='Error')] = None
|
|
3851
|
+
"""
|
|
3852
|
+
Error message of the program run, if any
|
|
3853
|
+
"""
|
|
3854
|
+
traceback: Annotated[Optional[str], Field(title='Traceback')] = None
|
|
3855
|
+
"""
|
|
3856
|
+
Traceback of the program run, if any
|
|
3857
|
+
"""
|
|
3858
|
+
start_time: Annotated[Optional[AwareDatetime], Field(title='Start Time')] = None
|
|
3859
|
+
"""
|
|
3860
|
+
Start time of the program run in RFC3339 format
|
|
3861
|
+
"""
|
|
3862
|
+
end_time: Annotated[Optional[AwareDatetime], Field(title='End Time')] = None
|
|
3863
|
+
"""
|
|
3864
|
+
End time of the program run in RFC3339 format
|
|
3865
|
+
"""
|
|
3866
|
+
input_data: Annotated[Optional[Dict[str, Any]], Field(title='Input Data')] = None
|
|
3867
|
+
"""
|
|
3868
|
+
Input data of the program run
|
|
3869
|
+
"""
|
|
3870
|
+
|
|
3871
|
+
|
|
3872
|
+
class ValidationError2(BaseModel):
|
|
3873
|
+
"""
|
|
3874
|
+
A validation error of a program.
|
|
3875
|
+
"""
|
|
3876
|
+
|
|
3877
|
+
loc: Annotated[List[int], Field(title='Location')]
|
|
3878
|
+
msg: Annotated[str, Field(title='Message')]
|
|
3879
|
+
type: Annotated[str, Field(title='Error Type')]
|
|
3880
|
+
|
|
3881
|
+
|
|
3882
|
+
class HTTPValidationError(BaseModel):
|
|
3883
|
+
detail: Annotated[Optional[List[ValidationError2]], Field(title='Detail')] = None
|
|
3884
|
+
|
|
3885
|
+
|
|
3886
|
+
class MotionGroupInfo(BaseModel):
|
|
3887
|
+
motion_group: str
|
|
3888
|
+
"""
|
|
3889
|
+
The unique identifier of the motion group. Use it to refer to the motion group in other calls.
|
|
3890
|
+
|
|
3891
|
+
"""
|
|
3892
|
+
name: str
|
|
3893
|
+
"""
|
|
3894
|
+
The name of the motion group for display purposes.
|
|
3895
|
+
|
|
3896
|
+
"""
|
|
3897
|
+
dof: Annotated[int, Field(ge=0, le=2147483647)]
|
|
3898
|
+
"""
|
|
3899
|
+
The number of joints aka degrees of freedom in the motion group.
|
|
3900
|
+
|
|
3901
|
+
"""
|
|
3902
|
+
|
|
3903
|
+
|
|
3904
|
+
class MotionGroupInfos(RootModel):
|
|
3905
|
+
root: List[MotionGroupInfo]
|
|
3906
|
+
|
|
3907
|
+
def __getitem__(self, index: int) -> MotionGroupInfo:
|
|
3908
|
+
"""
|
|
3909
|
+
Make list RootModel directly indexable.
|
|
3910
|
+
"""
|
|
3911
|
+
return self.root[index]
|
|
3912
|
+
|
|
3913
|
+
def __setitem__(self, index: int, value: MotionGroupInfo) -> None:
|
|
3914
|
+
"""
|
|
3915
|
+
Make list RootModel directly indexable.
|
|
3916
|
+
"""
|
|
3917
|
+
self.root[index] = value
|
|
3918
|
+
|
|
3919
|
+
def __len__(self) -> int:
|
|
3920
|
+
"""
|
|
3921
|
+
Make list RootModel directly usable with len().
|
|
3922
|
+
"""
|
|
3923
|
+
return len(self.root)
|
|
3924
|
+
|
|
3925
|
+
def __iter__(self):
|
|
3926
|
+
"""
|
|
3927
|
+
Make list RootModel directly iterable.
|
|
3928
|
+
"""
|
|
3929
|
+
return iter(self.root)
|
|
3930
|
+
|
|
3931
|
+
|
|
3932
|
+
class MotionGroupJoints(BaseModel):
|
|
3933
|
+
"""
|
|
3934
|
+
Ensure to provide one value for each joint. See [getMotionGroups](getMotionGroups) for the number of joints.
|
|
3935
|
+
Everything but positions is optional.
|
|
3936
|
+
"""
|
|
3937
|
+
|
|
3938
|
+
positions: List[float]
|
|
3939
|
+
"""
|
|
3940
|
+
The joint positions of the motion group.
|
|
3941
|
+
|
|
3942
|
+
"""
|
|
3943
|
+
velocities: Optional[List[float]] = None
|
|
3944
|
+
"""
|
|
3945
|
+
The joint velocities of the motion group.
|
|
3946
|
+
|
|
3947
|
+
"""
|
|
3948
|
+
accelerations: Optional[List[float]] = None
|
|
3949
|
+
"""
|
|
3950
|
+
The joint accelerations of the motion group.
|
|
3951
|
+
|
|
3952
|
+
"""
|
|
3953
|
+
torques: Optional[List[float]] = None
|
|
3954
|
+
"""
|
|
3955
|
+
The joint torques of the motion group.
|
|
3956
|
+
|
|
3957
|
+
"""
|
|
3958
|
+
|
|
3959
|
+
|
|
3960
|
+
class RobotTcpData(BaseModel):
|
|
3961
|
+
name: Optional[str] = None
|
|
3962
|
+
"""
|
|
3963
|
+
A readable and changeable name for frontend visualization.
|
|
3964
|
+
"""
|
|
3965
|
+
position: Vector3d
|
|
3966
|
+
orientation: Optional[Orientation] = None
|
|
3967
|
+
orientation_type: Optional[OrientationType] = 'ROTATION_VECTOR'
|
|
3968
|
+
|
|
3969
|
+
|
|
3970
|
+
class RobotTcp(RobotTcpData):
|
|
3971
|
+
id: str
|
|
3972
|
+
"""
|
|
3973
|
+
Identifier of this tcp.
|
|
3974
|
+
"""
|
|
3975
|
+
|
|
3976
|
+
|
|
3977
|
+
class RobotTcps(RootModel):
|
|
3978
|
+
root: Annotated[
|
|
3979
|
+
List[RobotTcp],
|
|
3980
|
+
Field(
|
|
3981
|
+
examples=[
|
|
3982
|
+
[
|
|
3983
|
+
{
|
|
3984
|
+
'id': 'BASE/schmalz_gripper',
|
|
3985
|
+
'name': 'BASE/schmalz_gripper',
|
|
3986
|
+
'position': [0, 0, 110],
|
|
3987
|
+
'orientation': [0, 0, 0, 1],
|
|
3988
|
+
'orientation_type': 'QUATERNION',
|
|
3989
|
+
},
|
|
3990
|
+
{
|
|
3991
|
+
'id': 'WB_EGM/egm_tool',
|
|
3992
|
+
'name': 'WB_EGM/egm_tool',
|
|
3993
|
+
'position': [400, 250, 0],
|
|
3994
|
+
'orientation': [1.57079632679, 0, 3.14159265359],
|
|
3995
|
+
'orientation_type': 'ROTATION_VECTOR',
|
|
3996
|
+
},
|
|
3997
|
+
]
|
|
3998
|
+
]
|
|
3999
|
+
),
|
|
4000
|
+
]
|
|
4001
|
+
|
|
4002
|
+
def __getitem__(self, index: int) -> RobotTcp:
|
|
4003
|
+
"""
|
|
4004
|
+
Make list RootModel directly indexable.
|
|
4005
|
+
"""
|
|
4006
|
+
return self.root[index]
|
|
4007
|
+
|
|
4008
|
+
def __setitem__(self, index: int, value: RobotTcp) -> None:
|
|
4009
|
+
"""
|
|
4010
|
+
Make list RootModel directly indexable.
|
|
4011
|
+
"""
|
|
4012
|
+
self.root[index] = value
|
|
4013
|
+
|
|
4014
|
+
def __len__(self) -> int:
|
|
4015
|
+
"""
|
|
4016
|
+
Make list RootModel directly usable with len().
|
|
4017
|
+
"""
|
|
4018
|
+
return len(self.root)
|
|
4019
|
+
|
|
4020
|
+
def __iter__(self):
|
|
4021
|
+
"""
|
|
4022
|
+
Make list RootModel directly iterable.
|
|
4023
|
+
"""
|
|
4024
|
+
return iter(self.root)
|
|
4025
|
+
|
|
4026
|
+
|
|
4027
|
+
class Flag(BaseModel):
|
|
4028
|
+
active: bool
|
|
4029
|
+
|
|
4030
|
+
|
|
4031
|
+
class OpMode(BaseModel):
|
|
4032
|
+
"""
|
|
4033
|
+
Controllers have two operating modes: AUTOMATIC and MANUAL.
|
|
4034
|
+
MANUAL mode is mainly used for teaching a robot application.
|
|
4035
|
+
To ensure safe operation the velocity of the robot is limited to 250 mm/s.
|
|
4036
|
+
Running the finished application is done in AUTOMATIC operating mode without the limited velocity of the MANUAL mode.
|
|
4037
|
+
|
|
4038
|
+
"""
|
|
4039
|
+
|
|
4040
|
+
mode: OperationMode
|
|
4041
|
+
|
|
4042
|
+
|
|
4043
|
+
class CycleTime(BaseModel):
|
|
4044
|
+
cycle_time_ms: Annotated[int, Field(ge=0, le=4294967295)]
|
|
4045
|
+
"""
|
|
4046
|
+
Cycle time of controller communication in [ms].
|
|
4047
|
+
"""
|
|
4048
|
+
|
|
4049
|
+
|
|
4050
|
+
class Behavior(Enum):
|
|
4051
|
+
"""
|
|
4052
|
+
## BEHAVIOR_AUTOMATIC
|
|
4053
|
+
This is the default behavior.
|
|
4054
|
+
The motion groups of the controller take commanded joint configuration as actual joint state.
|
|
4055
|
+
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.
|
|
4056
|
+
## BEHAVIOR_AUTOMATIC_NOT_COMPLY_WITH_CYCLETIME
|
|
4057
|
+
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.
|
|
4058
|
+
## BEHAVIOR_EXTERNAL_SOURCE
|
|
4059
|
+
The external client is the only source of actual joint state changes.
|
|
4060
|
+
This mode is used to enable third party software indicating the current joint state via [externalJointsStream](externalJointsStream).
|
|
4061
|
+
|
|
4062
|
+
"""
|
|
4063
|
+
|
|
4064
|
+
BEHAVIOR_AUTOMATIC = 'BEHAVIOR_AUTOMATIC'
|
|
4065
|
+
BEHAVIOR_AUTOMATIC_NOT_COMPLY_WITH_CYCLETIME = (
|
|
4066
|
+
'BEHAVIOR_AUTOMATIC_NOT_COMPLY_WITH_CYCLETIME'
|
|
4067
|
+
)
|
|
4068
|
+
BEHAVIOR_EXTERNAL_SOURCE = 'BEHAVIOR_EXTERNAL_SOURCE'
|
|
4069
|
+
|
|
4070
|
+
|
|
4071
|
+
class ExternalJointStreamDatapoint(BaseModel):
|
|
4072
|
+
"""
|
|
4073
|
+
A datapoint inside external joint stream.
|
|
4074
|
+
"""
|
|
4075
|
+
|
|
4076
|
+
motion_group: str
|
|
4077
|
+
"""
|
|
4078
|
+
The unique identifier of the motion group.
|
|
4079
|
+
|
|
4080
|
+
"""
|
|
4081
|
+
value: MotionGroupJoints
|
|
4082
|
+
|
|
4083
|
+
|
|
4084
|
+
class ExternalJointStreamDatapoints(RootModel):
|
|
4085
|
+
root: List[ExternalJointStreamDatapoint]
|
|
4086
|
+
|
|
4087
|
+
def __getitem__(self, index: int) -> ExternalJointStreamDatapoint:
|
|
4088
|
+
"""
|
|
4089
|
+
Make list RootModel directly indexable.
|
|
4090
|
+
"""
|
|
4091
|
+
return self.root[index]
|
|
4092
|
+
|
|
4093
|
+
def __setitem__(self, index: int, value: ExternalJointStreamDatapoint) -> None:
|
|
4094
|
+
"""
|
|
4095
|
+
Make list RootModel directly indexable.
|
|
4096
|
+
"""
|
|
4097
|
+
self.root[index] = value
|
|
4098
|
+
|
|
4099
|
+
def __len__(self) -> int:
|
|
4100
|
+
"""
|
|
4101
|
+
Make list RootModel directly usable with len().
|
|
4102
|
+
"""
|
|
4103
|
+
return len(self.root)
|
|
4104
|
+
|
|
4105
|
+
def __iter__(self):
|
|
4106
|
+
"""
|
|
4107
|
+
Make list RootModel directly iterable.
|
|
4108
|
+
"""
|
|
4109
|
+
return iter(self.root)
|
|
4110
|
+
|
|
4111
|
+
|
|
4112
|
+
class ExternalJointStreamRequest(BaseModel):
|
|
4113
|
+
states: ExternalJointStreamDatapoints
|
|
4114
|
+
|
|
4115
|
+
|
|
4116
|
+
class Key(RootModel):
|
|
4117
|
+
root: Annotated[str, Field(title='Key')]
|
|
4118
|
+
"""
|
|
4119
|
+
Unique identifier describing to adress an object.
|
|
4120
|
+
|
|
4121
|
+
Special characters, such as `;`, `/`, `?`, `:`, `@`, `=` and `&`, have to be URL encoded.
|
|
4122
|
+
|
|
4123
|
+
"""
|
|
4124
|
+
|
|
4125
|
+
|
|
4126
|
+
class MetadataObject(RootModel):
|
|
4127
|
+
"""
|
|
4128
|
+
A metadata object.
|
|
4129
|
+
"""
|
|
4130
|
+
|
|
4131
|
+
root: Dict[str, str]
|
|
4132
|
+
|
|
4133
|
+
|
|
4134
|
+
class BinaryObject(RootModel):
|
|
4135
|
+
root: Annotated[bytes, Field(title='BinaryObject')]
|
|
4136
|
+
"""
|
|
4137
|
+
Any value encoded as a binary string.
|
|
4138
|
+
"""
|
|
4139
|
+
|
|
4140
|
+
|
|
4141
|
+
class BusIODescription(BaseModel):
|
|
4142
|
+
io: str
|
|
4143
|
+
"""
|
|
4144
|
+
Unique identifier of the input/output.
|
|
4145
|
+
|
|
4146
|
+
"""
|
|
4147
|
+
name: str
|
|
4148
|
+
"""
|
|
4149
|
+
Name of the input/output. Customize it using the respective BUS service, e.g., [addProfinetIO](addProfinetIO) for PROFINET service.
|
|
4150
|
+
|
|
4151
|
+
"""
|
|
4152
|
+
direction: IODirection
|
|
4153
|
+
value_type: IOValueType
|
|
4154
|
+
unit: Optional[UnitType] = None
|
|
4155
|
+
min: Optional[IOBoundary] = None
|
|
4156
|
+
max: Optional[IOBoundary] = None
|
|
4157
|
+
|
|
4158
|
+
|
|
4159
|
+
class ListBusIODescriptionsResponse(RootModel):
|
|
4160
|
+
root: List[BusIODescription]
|
|
4161
|
+
|
|
4162
|
+
def __getitem__(self, index: int) -> BusIODescription:
|
|
4163
|
+
"""
|
|
4164
|
+
Make list RootModel directly indexable.
|
|
4165
|
+
"""
|
|
4166
|
+
return self.root[index]
|
|
4167
|
+
|
|
4168
|
+
def __setitem__(self, index: int, value: BusIODescription) -> None:
|
|
4169
|
+
"""
|
|
4170
|
+
Make list RootModel directly indexable.
|
|
4171
|
+
"""
|
|
4172
|
+
self.root[index] = value
|
|
4173
|
+
|
|
4174
|
+
def __len__(self) -> int:
|
|
4175
|
+
"""
|
|
4176
|
+
Make list RootModel directly usable with len().
|
|
4177
|
+
"""
|
|
4178
|
+
return len(self.root)
|
|
4179
|
+
|
|
4180
|
+
def __iter__(self):
|
|
4181
|
+
"""
|
|
4182
|
+
Make list RootModel directly iterable.
|
|
4183
|
+
"""
|
|
4184
|
+
return iter(self.root)
|
|
4185
|
+
|
|
4186
|
+
|
|
4187
|
+
class BusIOsStateEnum(Enum):
|
|
4188
|
+
"""
|
|
4189
|
+
Current state of the BUS input/output service.
|
|
4190
|
+
|
|
4191
|
+
"""
|
|
4192
|
+
|
|
4193
|
+
BUS_IOS_STATE_UNKNOWN = 'BUS_IOS_STATE_UNKNOWN'
|
|
4194
|
+
BUS_IOS_STATE_INITIALIZING = 'BUS_IOS_STATE_INITIALIZING'
|
|
4195
|
+
BUS_IOS_STATE_CONNECTED = 'BUS_IOS_STATE_CONNECTED'
|
|
4196
|
+
BUS_IOS_STATE_DISCONNECTED = 'BUS_IOS_STATE_DISCONNECTED'
|
|
4197
|
+
|
|
4198
|
+
|
|
4199
|
+
class BusIOsState(BaseModel):
|
|
4200
|
+
state: BusIOsStateEnum
|
|
4201
|
+
message: Optional[str] = None
|
|
4202
|
+
"""
|
|
4203
|
+
A message providing additional information on the input/output service, e.g., BUS service status, encountered errors.
|
|
4204
|
+
May be empty if no additional information is available.
|
|
4205
|
+
|
|
4206
|
+
"""
|
|
4207
|
+
|
|
4208
|
+
|
|
4209
|
+
class ProfinetSubSlotDescription(BaseModel):
|
|
4210
|
+
number: Annotated[int, Field(ge=0, le=2147483647)]
|
|
4211
|
+
"""
|
|
4212
|
+
The number/index of the PROFINET subslot.
|
|
4213
|
+
|
|
4214
|
+
"""
|
|
4215
|
+
input_length: Annotated[int, Field(ge=0, le=2147483647)]
|
|
4216
|
+
"""
|
|
4217
|
+
The amount of bytes allocated for the subslot in the input process image buffer.
|
|
4218
|
+
|
|
4219
|
+
"""
|
|
4220
|
+
output_length: Annotated[int, Field(ge=0, le=2147483647)]
|
|
4221
|
+
"""
|
|
4222
|
+
The amount of bytes allocated for the subslot in the output process image buffer.
|
|
4223
|
+
|
|
4224
|
+
"""
|
|
4225
|
+
|
|
4226
|
+
|
|
4227
|
+
class ProfinetSlotDescription(BaseModel):
|
|
4228
|
+
"""
|
|
4229
|
+
An array of PROFINET slots.
|
|
4230
|
+
|
|
4231
|
+
PROFINET models each device’s input/output hardware as a hierarchy of slots (modules) and subslots (submodules).
|
|
4232
|
+
A slot can represent a physical or virtual input/output card and each subslot one of its individual channels or functions.
|
|
4233
|
+
Every slot and subslot has unique identifiers that the controller uses to map cyclic input/output data and parameter records to its process image.
|
|
4234
|
+
This slot/subslot separation enables e.g., addressing each input/output stream when establishing input/output application relations (I/O-AR).
|
|
4235
|
+
|
|
4236
|
+
"""
|
|
4237
|
+
|
|
4238
|
+
number: Annotated[int, Field(ge=0, le=2147483647)]
|
|
4239
|
+
"""
|
|
4240
|
+
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.
|
|
4241
|
+
|
|
4242
|
+
"""
|
|
4243
|
+
api: Annotated[int, Field(ge=0, le=2147483647)]
|
|
4244
|
+
"""
|
|
4245
|
+
The application process identifier (API) number of the PROFINET input.
|
|
4246
|
+
The API identifies the application relation (AR) that is using the slot.
|
|
4247
|
+
|
|
4248
|
+
"""
|
|
4249
|
+
subslots: List[ProfinetSubSlotDescription]
|
|
4250
|
+
"""
|
|
4251
|
+
An array of PROFINET subslots.
|
|
4252
|
+
|
|
4253
|
+
"""
|
|
4254
|
+
|
|
4255
|
+
|
|
4256
|
+
class ProfinetDescription(BaseModel):
|
|
4257
|
+
vendor_id: str
|
|
4258
|
+
"""
|
|
4259
|
+
The vendor identifier of the PROFINET device, identifying the manufacturer.
|
|
4260
|
+
|
|
4261
|
+
"""
|
|
4262
|
+
device_id: str
|
|
4263
|
+
"""
|
|
4264
|
+
The device identifier of the PROFINET device, identifying the specific device within the vendor's range.
|
|
4265
|
+
|
|
4266
|
+
"""
|
|
4267
|
+
slots: Optional[List[ProfinetSlotDescription]] = None
|
|
4268
|
+
device_name: Annotated[Optional[str], Field(examples=['pnDevice'])] = None
|
|
4269
|
+
"""
|
|
4270
|
+
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.
|
|
4271
|
+
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.
|
|
4272
|
+
|
|
4273
|
+
"""
|
|
4274
|
+
ip_config: Optional[BusIOProfinetIpConfig] = None
|
|
4275
|
+
|
|
4276
|
+
|
|
4277
|
+
class ProfinetIOTypeEnum(Enum):
|
|
4278
|
+
"""
|
|
4279
|
+
Value type of the PROFINET input/output variable. Is used to interpret the corresponding bits correctly.
|
|
4280
|
+
|
|
4281
|
+
"""
|
|
4282
|
+
|
|
4283
|
+
PROFINET_IO_TYPE_UNKNOWN = 'PROFINET_IO_TYPE_UNKNOWN'
|
|
4284
|
+
PROFINET_IO_TYPE_BOOL = 'PROFINET_IO_TYPE_BOOL'
|
|
4285
|
+
PROFINET_IO_TYPE_USINT = 'PROFINET_IO_TYPE_USINT'
|
|
4286
|
+
PROFINET_IO_TYPE_SINT = 'PROFINET_IO_TYPE_SINT'
|
|
4287
|
+
PROFINET_IO_TYPE_UINT = 'PROFINET_IO_TYPE_UINT'
|
|
4288
|
+
PROFINET_IO_TYPE_INT = 'PROFINET_IO_TYPE_INT'
|
|
4289
|
+
PROFINET_IO_TYPE_UDINT = 'PROFINET_IO_TYPE_UDINT'
|
|
4290
|
+
PROFINET_IO_TYPE_DINT = 'PROFINET_IO_TYPE_DINT'
|
|
4291
|
+
PROFINET_IO_TYPE_REAL = 'PROFINET_IO_TYPE_REAL'
|
|
4292
|
+
PROFINET_IO_TYPE_LREAL = 'PROFINET_IO_TYPE_LREAL'
|
|
4293
|
+
|
|
4294
|
+
|
|
4295
|
+
class ProfinetIODirection(Enum):
|
|
4296
|
+
"""
|
|
4297
|
+
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.
|
|
4298
|
+
"""
|
|
4299
|
+
|
|
4300
|
+
PROFINET_IO_DIRECTION_INPUT = 'PROFINET_IO_DIRECTION_INPUT'
|
|
4301
|
+
PROFINET_IO_DIRECTION_OUTPUT = 'PROFINET_IO_DIRECTION_OUTPUT'
|
|
4302
|
+
PROFINET_IO_DIRECTION_INOUT = 'PROFINET_IO_DIRECTION_INOUT'
|
|
4303
|
+
|
|
4304
|
+
|
|
4305
|
+
class ProfinetIOData(BaseModel):
|
|
4306
|
+
description: str
|
|
4307
|
+
"""
|
|
4308
|
+
Descriptive name or note for the input/output variable.
|
|
4309
|
+
|
|
4310
|
+
"""
|
|
4311
|
+
type: ProfinetIOTypeEnum
|
|
4312
|
+
direction: ProfinetIODirection
|
|
4313
|
+
"""
|
|
4314
|
+
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.
|
|
4315
|
+
|
|
4316
|
+
"""
|
|
4317
|
+
byte_address: Annotated[int, Field(ge=0, le=65535)]
|
|
4318
|
+
"""
|
|
4319
|
+
The byte address of the input/output variable in the PROFINET device, e.g., NOVA's PROFINET service.
|
|
4320
|
+
The byte address is used to locate the specific input/output variable within the device's memory or data structure.
|
|
4321
|
+
|
|
4322
|
+
"""
|
|
4323
|
+
bit_address: Annotated[Optional[int], Field(ge=0, le=7)] = None
|
|
4324
|
+
"""
|
|
4325
|
+
The bit address of the input/output variable within the byte or word address.
|
|
4326
|
+
The bit address is used to specify the exact bit within the byte or word that corresponds to the input/output variable.
|
|
4327
|
+
|
|
4328
|
+
"""
|
|
4329
|
+
|
|
4330
|
+
|
|
4331
|
+
class ProfinetIO(ProfinetIOData):
|
|
4332
|
+
io: str
|
|
4333
|
+
"""
|
|
4334
|
+
The unique identifier for the input/output value.
|
|
4335
|
+
This identifier is used to reference the specific input/output variable in the PROFINET device, e.g., NOVA's PROFINET service.
|
|
4336
|
+
|
|
4337
|
+
"""
|
|
4338
|
+
|
|
4339
|
+
|
|
4340
|
+
class ProfinetIOs(RootModel):
|
|
4341
|
+
"""
|
|
4342
|
+
Array of PROFINET input/output variable configurations.
|
|
4343
|
+
"""
|
|
4344
|
+
|
|
4345
|
+
root: List[ProfinetIO]
|
|
4346
|
+
"""
|
|
4347
|
+
Array of PROFINET input/output variable configurations.
|
|
4348
|
+
"""
|
|
4349
|
+
|
|
4350
|
+
def __getitem__(self, index: int) -> ProfinetIO:
|
|
4351
|
+
"""
|
|
4352
|
+
Make list RootModel directly indexable.
|
|
4353
|
+
"""
|
|
4354
|
+
return self.root[index]
|
|
4355
|
+
|
|
4356
|
+
def __setitem__(self, index: int, value: ProfinetIO) -> None:
|
|
4357
|
+
"""
|
|
4358
|
+
Make list RootModel directly indexable.
|
|
4359
|
+
"""
|
|
4360
|
+
self.root[index] = value
|
|
4361
|
+
|
|
4362
|
+
def __len__(self) -> int:
|
|
4363
|
+
"""
|
|
4364
|
+
Make list RootModel directly usable with len().
|
|
4365
|
+
"""
|
|
4366
|
+
return len(self.root)
|
|
4367
|
+
|
|
4368
|
+
def __iter__(self):
|
|
4369
|
+
"""
|
|
4370
|
+
Make list RootModel directly iterable.
|
|
4371
|
+
"""
|
|
4372
|
+
return iter(self.root)
|
|
4373
|
+
|
|
4374
|
+
|
|
4375
|
+
class ProfinetInputOutputConfig(BaseModel):
|
|
4376
|
+
config: Annotated[
|
|
4377
|
+
str,
|
|
4378
|
+
Field(
|
|
4379
|
+
examples=[
|
|
4380
|
+
'<Tagtable name=\'Standard variable table\'>\\n\n <Tag type="Bool" hmiVisible="True" hmiWriteable="True" hmiAccessible="True" retain="False" remark="" addr="%I100.0">bLightRed</Tag>\\n\n <Tag type="Int" hmiVisible="True" hmiWriteable="True" hmiAccessible="True" retain="False" remark="" addr="%QW800">nCounter</Tag>\\n\n</Tagtable>\n'
|
|
4381
|
+
]
|
|
4382
|
+
),
|
|
4383
|
+
]
|
|
4384
|
+
"""
|
|
4385
|
+
Content of the input/output variable configuration XML file.
|
|
4386
|
+
The XML File has to be embedded as a string by escaping quotes, line breaks and so forth.
|
|
4387
|
+
|
|
4388
|
+
"""
|
|
4389
|
+
input_offset: Annotated[int, Field(examples=[100], ge=0, le=2147483647)]
|
|
4390
|
+
"""
|
|
4391
|
+
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.
|
|
4392
|
+
"""
|
|
4393
|
+
output_offset: Annotated[int, Field(examples=[800], ge=0, le=2147483647)]
|
|
4394
|
+
"""
|
|
4395
|
+
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.
|
|
4396
|
+
"""
|
|
4397
|
+
|
|
4398
|
+
|
|
4399
|
+
class ModbusIOTypeEnum(Enum):
|
|
4400
|
+
"""
|
|
4401
|
+
Value type of the MODBUS input/output variable. Used to interpret the corresponding bits correctly.
|
|
4402
|
+
|
|
4403
|
+
"""
|
|
4404
|
+
|
|
4405
|
+
MODBUS_IO_TYPE_UNKNOWN = 'MODBUS_IO_TYPE_UNKNOWN'
|
|
4406
|
+
MODBUS_IO_TYPE_BOOL = 'MODBUS_IO_TYPE_BOOL'
|
|
4407
|
+
MODBUS_IO_TYPE_UINT16 = 'MODBUS_IO_TYPE_UINT16'
|
|
4408
|
+
MODBUS_IO_TYPE_FLOAT32 = 'MODBUS_IO_TYPE_FLOAT32'
|
|
4409
|
+
|
|
4410
|
+
|
|
4411
|
+
class ModbusIOByteOrder(Enum):
|
|
4412
|
+
"""
|
|
4413
|
+
Byte order of the MODBUS input/output variable. Used to interpret the corresponding bits correctly.
|
|
4414
|
+
|
|
4415
|
+
"""
|
|
4416
|
+
|
|
4417
|
+
MODBUS_IO_BYTE_ORDER_UNKNOWN = 'MODBUS_IO_BYTE_ORDER_UNKNOWN'
|
|
4418
|
+
MODBUS_IO_BYTE_ORDER_ABCD = 'MODBUS_IO_BYTE_ORDER_ABCD'
|
|
4419
|
+
MODBUS_IO_BYTE_ORDER_BADC = 'MODBUS_IO_BYTE_ORDER_BADC'
|
|
4420
|
+
MODBUS_IO_BYTE_ORDER_CDAB = 'MODBUS_IO_BYTE_ORDER_CDAB'
|
|
4421
|
+
MODBUS_IO_BYTE_ORDER_DCBA = 'MODBUS_IO_BYTE_ORDER_DCBA'
|
|
4422
|
+
|
|
4423
|
+
|
|
4424
|
+
class ModbusIOArea(Enum):
|
|
4425
|
+
"""
|
|
4426
|
+
Area of the MODBUS input/output variable. Is used to interpret the corresponding bits correctly.
|
|
4427
|
+
|
|
4428
|
+
"""
|
|
4429
|
+
|
|
4430
|
+
MODBUS_IO_AREA_UNKNOWN = 'MODBUS_IO_AREA_UNKNOWN'
|
|
4431
|
+
MODBUS_IO_AREA_COILS = 'MODBUS_IO_AREA_COILS'
|
|
4432
|
+
MODBUS_IO_AREA_DISCRETE_INPUTS = 'MODBUS_IO_AREA_DISCRETE_INPUTS'
|
|
4433
|
+
MODBUS_IO_AREA_HOLDING_REGISTERS = 'MODBUS_IO_AREA_HOLDING_REGISTERS'
|
|
4434
|
+
MODBUS_IO_AREA_INPUT_REGISTERS = 'MODBUS_IO_AREA_INPUT_REGISTERS'
|
|
4435
|
+
|
|
4436
|
+
|
|
4437
|
+
class ModbusIOData(BaseModel):
|
|
4438
|
+
description: str
|
|
4439
|
+
"""
|
|
4440
|
+
Descriptive name or note for the input/output variable.
|
|
4441
|
+
|
|
4442
|
+
"""
|
|
4443
|
+
address: Annotated[int, Field(ge=0, le=65535)]
|
|
4444
|
+
"""
|
|
4445
|
+
The byte address of the input/output variable in the MODBUS device, e.g., NOVA's MODBUS service.
|
|
4446
|
+
Used to locate the input/output variable within the device's memory or data structure.
|
|
4447
|
+
|
|
4448
|
+
"""
|
|
4449
|
+
type: ModbusIOTypeEnum
|
|
4450
|
+
byte_order: ModbusIOByteOrder
|
|
4451
|
+
"""
|
|
4452
|
+
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.
|
|
4453
|
+
|
|
4454
|
+
"""
|
|
4455
|
+
area: ModbusIOArea
|
|
4456
|
+
"""
|
|
4457
|
+
The area of the input/output variable, indicating the memory region it belongs to for the MODBUS device, e.g., NOVA's MODBUS service.
|
|
4458
|
+
|
|
4459
|
+
"""
|
|
4460
|
+
|
|
4461
|
+
|
|
4462
|
+
class ModbusIO(ModbusIOData):
|
|
4463
|
+
io: str
|
|
4464
|
+
"""
|
|
4465
|
+
The unique identifier for the input/output value.
|
|
4466
|
+
Used to reference the input/output variable in the MODBUS device, e.g., NOVA's MODBUS service.
|
|
4467
|
+
|
|
4468
|
+
"""
|
|
4469
|
+
|
|
4470
|
+
|
|
4471
|
+
class ModbusIOs(RootModel):
|
|
4472
|
+
"""
|
|
4473
|
+
Array of MODBUS input/output variable configurations.
|
|
4474
|
+
"""
|
|
4475
|
+
|
|
4476
|
+
root: List[ModbusIO]
|
|
4477
|
+
"""
|
|
4478
|
+
Array of MODBUS input/output variable configurations.
|
|
4479
|
+
"""
|
|
4480
|
+
|
|
4481
|
+
def __getitem__(self, index: int) -> ModbusIO:
|
|
4482
|
+
"""
|
|
4483
|
+
Make list RootModel directly indexable.
|
|
4484
|
+
"""
|
|
4485
|
+
return self.root[index]
|
|
4486
|
+
|
|
4487
|
+
def __setitem__(self, index: int, value: ModbusIO) -> None:
|
|
4488
|
+
"""
|
|
4489
|
+
Make list RootModel directly indexable.
|
|
4490
|
+
"""
|
|
4491
|
+
self.root[index] = value
|
|
4492
|
+
|
|
4493
|
+
def __len__(self) -> int:
|
|
4494
|
+
"""
|
|
4495
|
+
Make list RootModel directly usable with len().
|
|
4496
|
+
"""
|
|
4497
|
+
return len(self.root)
|
|
4498
|
+
|
|
4499
|
+
def __iter__(self):
|
|
4500
|
+
"""
|
|
4501
|
+
Make list RootModel directly iterable.
|
|
4502
|
+
"""
|
|
4503
|
+
return iter(self.root)
|
|
4504
|
+
|
|
4505
|
+
|
|
4506
|
+
class ApiVersion(BaseModel):
|
|
4507
|
+
version: str
|
|
4508
|
+
"""
|
|
4509
|
+
The version of the API.
|
|
4510
|
+
"""
|
|
4511
|
+
|
|
4512
|
+
|
|
4513
|
+
class ConfigurationResourceArray(RootModel):
|
|
4514
|
+
"""
|
|
4515
|
+
Array of configuration resources.
|
|
4516
|
+
"""
|
|
4517
|
+
|
|
4518
|
+
root: List[ConfigurationResource]
|
|
4519
|
+
"""
|
|
4520
|
+
Array of configuration resources.
|
|
4521
|
+
"""
|
|
4522
|
+
|
|
4523
|
+
def __getitem__(self, index: int) -> ConfigurationResource:
|
|
4524
|
+
"""
|
|
4525
|
+
Make list RootModel directly indexable.
|
|
4526
|
+
"""
|
|
4527
|
+
return self.root[index]
|
|
4528
|
+
|
|
4529
|
+
def __setitem__(self, index: int, value: ConfigurationResource) -> None:
|
|
4530
|
+
"""
|
|
4531
|
+
Make list RootModel directly indexable.
|
|
4532
|
+
"""
|
|
4533
|
+
self.root[index] = value
|
|
4534
|
+
|
|
4535
|
+
def __len__(self) -> int:
|
|
4536
|
+
"""
|
|
4537
|
+
Make list RootModel directly usable with len().
|
|
4538
|
+
"""
|
|
4539
|
+
return len(self.root)
|
|
4540
|
+
|
|
4541
|
+
def __iter__(self):
|
|
4542
|
+
"""
|
|
4543
|
+
Make list RootModel directly iterable.
|
|
4544
|
+
"""
|
|
4545
|
+
return iter(self.root)
|
|
4546
|
+
|
|
4547
|
+
|
|
4548
|
+
class ConfigurationResource(BaseModel):
|
|
4549
|
+
"""
|
|
4550
|
+
Configuration resource object.
|
|
4551
|
+
"""
|
|
4552
|
+
|
|
4553
|
+
id: ConfigurationResourceId
|
|
4554
|
+
name: str
|
|
4555
|
+
"""
|
|
4556
|
+
Human-readable name of the configuration resource.
|
|
4557
|
+
"""
|
|
4558
|
+
children: Optional[ConfigurationResourceArray] = None
|
|
4559
|
+
|
|
4560
|
+
|
|
4561
|
+
ConfigurationResourceArray.model_rebuild()
|