griip-sdk-dev 0.4.0.dev24238__tar.gz → 0.6.0.dev25546__tar.gz
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.
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/.coverage +0 -0
- griip_sdk_dev-0.4.0.dev24238/README.md → griip_sdk_dev-0.6.0.dev25546/PKG-INFO +126 -28
- griip_sdk_dev-0.4.0.dev24238/PKG-INFO → griip_sdk_dev-0.6.0.dev25546/README.md +93 -60
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/project.json +3 -2
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/pyproject.toml +6 -5
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/__init__.py +3 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/app.py +26 -4
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/camera_factory.py +3 -3
- griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/calibration/external_robot.py +107 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/test_calibration_app.py +31 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/test_environment_scanning.py +0 -1
- griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/calibration/tests/test_external_robot.py +88 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/builders.py +21 -15
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/config.py +1 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/mock_builders.py +3 -1
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/recipes.py +55 -26
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_recipes.py +42 -4
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/camera.py +8 -8
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/fanuc_robot_client.py +54 -52
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/grpc_vision_backend.py +4 -4
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mmai_vision_backend.py +2 -2
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/robot_client.py +141 -34
- griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/hardware/robot_interface.py +81 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/sim_gripper.py +6 -89
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/sim_hand_eye.py +22 -16
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_grpc_vision_backend.py +4 -4
- griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/hardware/tests/test_robot_client_base.py +151 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_sim_hand_eye.py +44 -20
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_sim_robot_client.py +4 -6
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/ur_robot_client.py +2 -1
- griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/hardware/vision_backend.py +7 -0
- griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/orchestration/bin_picking_manager.py +586 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/bin_state.py +20 -10
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/cycle_pause_gate.py +2 -2
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/grasp_provider.py +83 -27
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/perception_inputs.py +1 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/pick_and_place_manager.py +9 -6
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/placement_planner.py +8 -2
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/planning.py +10 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_bin_picking_manager.py +66 -17
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_bin_state.py +11 -11
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_grasp_provider.py +126 -16
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_placement_planner.py +29 -2
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_planning.py +48 -0
- griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/orchestration/tests/test_trajectory_store.py +27 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/trajectory_store.py +7 -4
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/types.py +33 -23
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/read_tcp.py +1 -1
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/run_linear_shuttle.py +4 -8
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/foxglove_events.py +2 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_mcap_robot_state_logger.py +1 -3
- griip_sdk_dev-0.4.0.dev24238/coverage.xml +0 -23585
- griip_sdk_dev-0.4.0.dev24238/src/griip_sdk/hardware/tests/test_robot_client_base.py +0 -48
- griip_sdk_dev-0.4.0.dev24238/src/griip_sdk/orchestration/bin_picking_manager.py +0 -580
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/docs/griip-sdk-consumer-improvements.md +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/apriltag_pose.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/cartesian_pose.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/config_store.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/README.md +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/config/routine.yaml +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/core.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/main.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/planning.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/routines.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/run_hand_eye_calibration.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/hand_eye_calib/transforms.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/mqtt_publisher.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/mqtt_topics.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/routines.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/scanning/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/scanning/environment_scanning.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/scanning/run_environment_scanning.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/conftest.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/test_camera_factory.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/test_hand_eye_calibration_service.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/test_hand_eye_helpers.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/test_transforms.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/types.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/units.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/end_effector_collision_model.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/initialize.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/loader.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/parts.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/conftest.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_builders.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_end_effector_collision_model.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_initialize.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_loader.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_mock_cell_smoke.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_parts.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_recording_config.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/errors.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/grpc_adapters/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/grpc_adapters/servicer_as_stub.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/bin_shaker.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/ft_sensor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/gripper.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/io_client.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mocks/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mocks/camera_mock.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mocks/gripper_client_mock.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mocks/io_client_mock.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mocks/robot_client_mock.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/onrobot_3fg15_gripper.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/robotiq_2f140_gripper.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/sim_robot_client.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/suction_gripper.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/conftest.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_call_with_timeout.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_command_state_fanout.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_gripper_command_listeners.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_mmai_vision_backend.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_reset_to_normal.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_robot_client_lifecycle.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_robot_feedback_fanout.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_robotiq_2f140_gripper.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_robotiq_gripper_bus_lock.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_sim_gripper.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_suction_gripper.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_tower_light.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_vision_codec.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/test_vrmcs_tcp_guard.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/torquing_client.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tower_light.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/vision_codec.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/log_utils.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/sphere_generation_tool/README.md +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/sphere_generation_tool/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/sphere_generation_tool/__main__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/sphere_generation_tool/_actors.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/sphere_generation_tool/_geometry.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/sphere_generation_tool/editor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/sphere_generation_tool/object_io.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/sphere_generation_tool/urdf_io.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/conftest.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/test_editor_math.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/test_editor_smoke.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/test_mesh_loading.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/test_object_io.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/test_urdf_io.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/bin_cuboid_extraction.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/callbacks.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/errors.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/grasp_executor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/parallel_jaw_executor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/suction_executor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/tests/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/tests/test_parallel_jaw_executor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/three_finger_executor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/grasp_queue.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/part_setup.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/pick_generator.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/proto_conversions.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/roi_scheduler.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/scoop_executor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/conftest.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_cycle_pause_gate.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_part_setup.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_perception_inputs.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_phase_collision_spheres.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_pick_and_place_manager.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_pick_generator.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_proto_conversions.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_scoop_executor.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/config/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/config/registry.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/in_process_api.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/run_environment_scanning.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/run_hand_eye_calibration.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/foxglove_joint_states.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/gripper_state_logger.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/gripper_state_mcap_recording.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/h264_video_logger.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/h264_video_mcap_recording.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/kpi_logger.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/kpi_mcap_recording.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/kpi_timer.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/mcap_recording.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/memory_utils.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/robot_state_logger.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/rotating_mcap_writer.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_foxglove_event_publisher.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_foxglove_joint_states.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_kpi_timer.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_mcap_foxglove_event_publisher.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_mcap_gripper_state_logger.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_mcap_h264_video_logger.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_mcap_kpi_logger.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_session.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/tests/__init__.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/tests/test_log_utils.py +0 -0
- {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/tests/test_servicer_as_stub.py +0 -0
|
Binary file
|
|
@@ -1,3 +1,36 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: griip-sdk-dev
|
|
3
|
+
Version: 0.6.0.dev25546
|
|
4
|
+
Summary: Dev build of griip-sdk from commit 0af7ee671 (PR #6192). Not a release.
|
|
5
|
+
Author: VentionCo
|
|
6
|
+
License: Proprietary
|
|
7
|
+
Requires-Python: <3.13,>=3.10
|
|
8
|
+
Requires-Dist: defusedxml<0.8.0,>=0.7.1
|
|
9
|
+
Requires-Dist: fastapi[standard]>=0.121.1
|
|
10
|
+
Requires-Dist: foxglove-schemas-protobuf
|
|
11
|
+
Requires-Dist: griip-core-dev==0.5.6.dev25546
|
|
12
|
+
Requires-Dist: grpcio>=1.78.0
|
|
13
|
+
Requires-Dist: httpx[http2]<0.29.0,>=0.28.1
|
|
14
|
+
Requires-Dist: mcap-protobuf-support<1.0,>=0.4.0
|
|
15
|
+
Requires-Dist: mcap<2.0,>=1.3.0
|
|
16
|
+
Requires-Dist: numpy>=1.24
|
|
17
|
+
Requires-Dist: omegaconf<3.0.0,>=2.3.0
|
|
18
|
+
Requires-Dist: opencv-python-headless<5.0.0,>=4.9.0
|
|
19
|
+
Requires-Dist: paho-mqtt<2.0,>=1.5
|
|
20
|
+
Requires-Dist: protobuf>=4.0
|
|
21
|
+
Requires-Dist: pydantic==2.11.1
|
|
22
|
+
Requires-Dist: pymodbus==3.11
|
|
23
|
+
Requires-Dist: pyserial<4.0,>=3.5
|
|
24
|
+
Requires-Dist: pyyaml<7.0,>=6.0
|
|
25
|
+
Requires-Dist: scipy<2.0,>=1.11.0
|
|
26
|
+
Requires-Dist: spatialmath-python<2.0.0,>=1.1.15
|
|
27
|
+
Requires-Dist: toppra<=0.6.3,>=0.6.0
|
|
28
|
+
Requires-Dist: trimesh<5.0,>=4.11
|
|
29
|
+
Requires-Dist: urchin<0.0.31,>=0.0.30
|
|
30
|
+
Requires-Dist: vention-grpc-py-sdk>=0.0.72
|
|
31
|
+
Requires-Dist: vention-sim-grpc-py-sdk==0.1.3
|
|
32
|
+
Description-Content-Type: text/markdown
|
|
33
|
+
|
|
1
34
|
# griip-sdk
|
|
2
35
|
|
|
3
36
|
Hardware control and orchestration for bin picking, by [Vention](https://vention.io).
|
|
@@ -257,12 +290,12 @@ hardware connections.
|
|
|
257
290
|
|
|
258
291
|
For a cell where the application moves the robot itself. The SDK takes and
|
|
259
292
|
stores pictures, runs perception on a stored picture when asked, and keeps
|
|
260
|
-
one queue of ranked
|
|
293
|
+
one queue of ranked grasps. It never commands motion.
|
|
261
294
|
|
|
262
295
|
```python
|
|
263
296
|
from griip_sdk import build_grasp_provider
|
|
264
297
|
|
|
265
|
-
with build_grasp_provider("pick.yaml", part_id="smallest_splice") as sdk:
|
|
298
|
+
with build_grasp_provider("pick.yaml", part_id="smallest_splice", robot=MyRmiRobot(rmi)) as sdk:
|
|
266
299
|
# First round: one picture of each pallet, then start on the left.
|
|
267
300
|
move_robot_to(LEFT_CAPTURE_POSE) # your motion
|
|
268
301
|
sdk.capture("left") # take a picture now, store it as "left"
|
|
@@ -272,29 +305,27 @@ with build_grasp_provider("pick.yaml", part_id="smallest_splice") as sdk:
|
|
|
272
305
|
|
|
273
306
|
while True:
|
|
274
307
|
# Left pallet
|
|
275
|
-
target = sdk.next_target() # wait for the "left" run, pop its best
|
|
308
|
+
target = sdk.next_target() # wait for the "left" run, pop its best reachable grasp; None = nothing graspable
|
|
276
309
|
sdk.process("right") # start perception on the "right" picture; it runs during the steps below
|
|
277
310
|
picked_left = target is not None
|
|
278
311
|
if picked_left:
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
move_robot_to(pose)
|
|
312
|
+
move_robot_to(target.approach_pose_mm_deg) # [x, y, z, w, p, r], mm and degrees, as on the pendant
|
|
313
|
+
move_linear(target.grasp_pose_mm_deg) # straight in along the tool Z
|
|
282
314
|
close_gripper()
|
|
283
|
-
|
|
315
|
+
move_linear(target.approach_pose_mm_deg) # straight back out
|
|
284
316
|
sdk.capture("left") # new picture of the left pallet for the next round, taken now
|
|
285
317
|
move_robot_to(PLACE_POSE)
|
|
286
318
|
open_gripper()
|
|
287
319
|
|
|
288
320
|
# Right pallet
|
|
289
|
-
target = sdk.next_target() # wait for the "right" run, pop its best
|
|
321
|
+
target = sdk.next_target() # wait for the "right" run, pop its best reachable grasp
|
|
290
322
|
sdk.process("left") # start perception on the new "left" picture; runs while we pick right
|
|
291
323
|
picked_right = target is not None
|
|
292
324
|
if picked_right:
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
move_robot_to(pose)
|
|
325
|
+
move_robot_to(target.approach_pose_mm_deg)
|
|
326
|
+
move_linear(target.grasp_pose_mm_deg)
|
|
296
327
|
close_gripper()
|
|
297
|
-
|
|
328
|
+
move_linear(target.approach_pose_mm_deg)
|
|
298
329
|
sdk.capture("right") # new picture of the right pallet for the next round
|
|
299
330
|
move_robot_to(PLACE_POSE)
|
|
300
331
|
open_gripper()
|
|
@@ -303,12 +334,12 @@ with build_grasp_provider("pick.yaml", part_id="smallest_splice") as sdk:
|
|
|
303
334
|
break # both pallets came back empty
|
|
304
335
|
```
|
|
305
336
|
|
|
306
|
-
Five verbs. `capture(tag)` stores a picture with the robot pose at
|
|
307
|
-
moment, so park the robot first; the tag is any string you choose, one
|
|
337
|
+
Five verbs. `capture(tag)` stores a picture with the robot pose and joints at
|
|
338
|
+
that moment, so park the robot first; the tag is any string you choose, one
|
|
308
339
|
stored picture per tag. `captures()` lists the stored pictures, `delete(tag)`
|
|
309
340
|
removes one. `process(tag)` runs perception on a stored picture in the
|
|
310
341
|
background, one image at a time. `next_target(timeout=None)` waits for
|
|
311
|
-
in-flight runs and pops the best
|
|
342
|
+
in-flight runs and pops the best grasp; it returns `None` when the last
|
|
312
343
|
picture had nothing graspable, when the run failed (`captures()` carries the
|
|
313
344
|
state and the reason), or on timeout.
|
|
314
345
|
|
|
@@ -318,22 +349,24 @@ picture is dropped.
|
|
|
318
349
|
|
|
319
350
|
Each `GraspTarget` answers what a motion-owning app needs to know:
|
|
320
351
|
|
|
321
|
-
- `capture_tag` says which picture, and therefore which pallet, it came from
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
352
|
+
- `capture_tag` says which picture, and therefore which pallet, it came from;
|
|
353
|
+
`object_index` which part in it. Several grasps can come back per part.
|
|
354
|
+
- `approach_pose` is where to go first; `grasp_pose` is where the gripper
|
|
355
|
+
closes, `approach_offset` (from the grasp definition) further along the tool
|
|
356
|
+
Z. Both are TCP poses in the robot base frame. `approach_pose_mm_deg` /
|
|
357
|
+
`grasp_pose_mm_deg` give them as `[x, y, z, w, p, r]`: millimetres, and
|
|
358
|
+
degrees about X, Y then Z, the pendant convention. The `SE3` forms stay in
|
|
359
|
+
metres for code that composes transforms.
|
|
360
|
+
- `at_flange(pose)` converts either one for a controller whose TCP is the
|
|
361
|
+
flange (`tool.tcp_offset` is returned as `tcp_offset`).
|
|
362
|
+
- `plunge_pose` / `scoop_pose` are the SDK's own guarded-scoop phases. The
|
|
363
|
+
scoop can end past the grasp point, so never move to it without a force stop.
|
|
364
|
+
- `approach_joint_angles` / `grasp_joint_angles` are your robot's IK solutions
|
|
365
|
+
when it checked the grasp (see below).
|
|
332
366
|
|
|
333
367
|
Same `pick.yaml` as a self-driving cell: part, grasps, `tool.tcp_offset`,
|
|
334
368
|
camera, hand-eye. No `home_bin*` poses are needed; the capture pose is
|
|
335
|
-
whatever the robot reports.
|
|
336
|
-
reachability is checked. No gripper is built or actuated.
|
|
369
|
+
whatever the robot reports. No gripper is built or actuated.
|
|
337
370
|
|
|
338
371
|
Only if the pictures show a container with walls: `capture(tag, bin_number=N)`
|
|
339
372
|
attaches the `bin_N_*` cuboids from `cuboids.json` to the request so grasps
|
|
@@ -341,6 +374,60 @@ through a wall or below the floor are rejected. `N` must be listed in
|
|
|
341
374
|
`runtime.bins.available`. It is not a taught pose. Open pallets need none of
|
|
342
375
|
this.
|
|
343
376
|
|
|
377
|
+
### Your own robot (no VRMCS)
|
|
378
|
+
|
|
379
|
+
When the app owns the robot, say a Fanuc over RMI, set `robot.driver: external`
|
|
380
|
+
in `pick.yaml` (`robot.model` names the arm) and pass any object with these
|
|
381
|
+
three methods, in pendant units. The SDK opens no connection of its own.
|
|
382
|
+
|
|
383
|
+
```python
|
|
384
|
+
class MyRmiRobot:
|
|
385
|
+
def __init__(self, rmi):
|
|
386
|
+
self._rmi = rmi # your RMI session; the SDK never opens one
|
|
387
|
+
|
|
388
|
+
def get_tcp_pose(self) -> list[float]:
|
|
389
|
+
# Current TCP in UFrame 0, active UTool, [x, y, z, w, p, r] in mm and degrees.
|
|
390
|
+
return self._rmi.read_cartesian_position()
|
|
391
|
+
|
|
392
|
+
def get_joint_angles(self) -> list[float]:
|
|
393
|
+
# Any units: the SDK only hands them back to inverse_kinematics as the seed.
|
|
394
|
+
return self._rmi.read_joint_angles()
|
|
395
|
+
|
|
396
|
+
def inverse_kinematics(self, tcp_pose: list[float], seed_joint_angles: list[float]) -> list[float] | None:
|
|
397
|
+
# None only when tcp_pose is unreachable; raise for anything else (not ready, comms).
|
|
398
|
+
return self._rmi.inverse_kinematics(tcp_pose, seed_joint_angles)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
with build_grasp_provider("pick.yaml", part_id="smallest_splice", robot=MyRmiRobot(rmi)) as sdk:
|
|
402
|
+
assert rmi.active_utool_offset_mm() == sdk.tcp_offset_mm # optional: check the controller tool once
|
|
403
|
+
...
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
- **Threads.** The SDK calls these methods only on the thread that called
|
|
407
|
+
`capture` (`get_tcp_pose`, `get_joint_angles`) or `next_target`, never
|
|
408
|
+
from a background thread, so they serialize with the app's motion if the app
|
|
409
|
+
calls them between moves. Call them while the arm moves and they need the
|
|
410
|
+
app's robot lock.
|
|
411
|
+
- **Calls per `next_target`.** One `get_joint_angles`, then two
|
|
412
|
+
`inverse_kinematics` for the grasp it returns (approach, then grasp). Each
|
|
413
|
+
skipped candidate adds one or two.
|
|
414
|
+
- **Seeds.** The approach is seeded with the current joints read at the start
|
|
415
|
+
of that `next_target`; the grasp with the approach solution, the
|
|
416
|
+
configuration the arm is in when it starts the straight move. Both come from
|
|
417
|
+
your robot, in your units.
|
|
418
|
+
- **Errors.** `None` drops that candidate as unreachable. An exception from
|
|
419
|
+
your robot propagates out of `next_target` and the candidate stays at the
|
|
420
|
+
front of the queue for the next call.
|
|
421
|
+
- **Frames.** Poses are TCP poses in the robot base frame (UFrame 0) at
|
|
422
|
+
`tool.tcp_offset`, which `sdk.tcp_offset_mm` returns; the active UTool must
|
|
423
|
+
match it, or use UTool 0 with `target.at_flange(...)`.
|
|
424
|
+
|
|
425
|
+
With an external robot nothing talks to VRMCS. The server skips its IK,
|
|
426
|
+
collision and path-planning stages and sends every grasp that clears the bin
|
|
427
|
+
walls; `next_target` drops what your IK can't reach and attaches both
|
|
428
|
+
solutions (`approach_joint_angles`, `grasp_joint_angles`). Arm-link collisions
|
|
429
|
+
are not checked: approach and retreat safety are the app's.
|
|
430
|
+
|
|
344
431
|
## Calibration
|
|
345
432
|
|
|
346
433
|
The SDK exposes the two calibration primitives — hand-eye and
|
|
@@ -362,6 +449,17 @@ The SDK plans to `cell.positions.calibration_joints`, runs the bundled sphere
|
|
|
362
449
|
routine, returns the robot to that start pose, and persists the result. The
|
|
363
450
|
fuller form below adds progress reporting and the operator-driven scan session:
|
|
364
451
|
|
|
452
|
+
On a cell with `robot.driver: external`, pass the app's `CalibrationRobot`: a
|
|
453
|
+
`GraspRobot` plus `execute_joint_path(waypoints)`. VAMP still plans every
|
|
454
|
+
move for `robot.model`, in-process, and your robot executes the path; joints
|
|
455
|
+
are radians in the robot model's convention here. Environment scanning needs
|
|
456
|
+
freedrive and is not available on an external robot.
|
|
457
|
+
|
|
458
|
+
```python
|
|
459
|
+
with build_calibration_app("cell.yaml", robot=MyRmiCalibrationRobot(rmi)) as cal:
|
|
460
|
+
x_cam_flg = cal.run_hand_eye_calibration()
|
|
461
|
+
```
|
|
462
|
+
|
|
365
463
|
```python
|
|
366
464
|
from pathlib import Path
|
|
367
465
|
|
|
@@ -1,35 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.5
|
|
2
|
-
Name: griip-sdk-dev
|
|
3
|
-
Version: 0.4.0.dev24238
|
|
4
|
-
Summary: Dev build of griip-sdk from commit 920520032 (PR #6192). Not a release.
|
|
5
|
-
Author: VentionCo
|
|
6
|
-
License: Proprietary
|
|
7
|
-
Requires-Python: <3.11,>=3.10
|
|
8
|
-
Requires-Dist: defusedxml<0.8.0,>=0.7.1
|
|
9
|
-
Requires-Dist: fastapi[standard]>=0.121.1
|
|
10
|
-
Requires-Dist: foxglove-schemas-protobuf
|
|
11
|
-
Requires-Dist: griip-core>=0.4.0
|
|
12
|
-
Requires-Dist: grpcio>=1.78.0
|
|
13
|
-
Requires-Dist: httpx[http2]<0.29.0,>=0.28.1
|
|
14
|
-
Requires-Dist: mcap-protobuf-support<1.0,>=0.4.0
|
|
15
|
-
Requires-Dist: mcap<2.0,>=1.3.0
|
|
16
|
-
Requires-Dist: numpy>=1.24
|
|
17
|
-
Requires-Dist: omegaconf<3.0.0,>=2.3.0
|
|
18
|
-
Requires-Dist: opencv-python-headless<5.0.0,>=4.9.0
|
|
19
|
-
Requires-Dist: paho-mqtt<2.0,>=1.5
|
|
20
|
-
Requires-Dist: protobuf>=4.0
|
|
21
|
-
Requires-Dist: pydantic==2.11.1
|
|
22
|
-
Requires-Dist: pymodbus==3.11
|
|
23
|
-
Requires-Dist: pyserial<4.0,>=3.5
|
|
24
|
-
Requires-Dist: pyyaml<7.0,>=6.0
|
|
25
|
-
Requires-Dist: scipy<2.0,>=1.11.0
|
|
26
|
-
Requires-Dist: spatialmath-python<2.0.0,>=1.1.15
|
|
27
|
-
Requires-Dist: toppra<=0.6.3,>=0.6.0
|
|
28
|
-
Requires-Dist: trimesh<5.0,>=4.11
|
|
29
|
-
Requires-Dist: urchin<0.0.31,>=0.0.30
|
|
30
|
-
Requires-Dist: vention-grpc-py-sdk==0.0.67.dev34389318765
|
|
31
|
-
Description-Content-Type: text/markdown
|
|
32
|
-
|
|
33
1
|
# griip-sdk
|
|
34
2
|
|
|
35
3
|
Hardware control and orchestration for bin picking, by [Vention](https://vention.io).
|
|
@@ -289,12 +257,12 @@ hardware connections.
|
|
|
289
257
|
|
|
290
258
|
For a cell where the application moves the robot itself. The SDK takes and
|
|
291
259
|
stores pictures, runs perception on a stored picture when asked, and keeps
|
|
292
|
-
one queue of ranked
|
|
260
|
+
one queue of ranked grasps. It never commands motion.
|
|
293
261
|
|
|
294
262
|
```python
|
|
295
263
|
from griip_sdk import build_grasp_provider
|
|
296
264
|
|
|
297
|
-
with build_grasp_provider("pick.yaml", part_id="smallest_splice") as sdk:
|
|
265
|
+
with build_grasp_provider("pick.yaml", part_id="smallest_splice", robot=MyRmiRobot(rmi)) as sdk:
|
|
298
266
|
# First round: one picture of each pallet, then start on the left.
|
|
299
267
|
move_robot_to(LEFT_CAPTURE_POSE) # your motion
|
|
300
268
|
sdk.capture("left") # take a picture now, store it as "left"
|
|
@@ -304,29 +272,27 @@ with build_grasp_provider("pick.yaml", part_id="smallest_splice") as sdk:
|
|
|
304
272
|
|
|
305
273
|
while True:
|
|
306
274
|
# Left pallet
|
|
307
|
-
target = sdk.next_target() # wait for the "left" run, pop its best
|
|
275
|
+
target = sdk.next_target() # wait for the "left" run, pop its best reachable grasp; None = nothing graspable
|
|
308
276
|
sdk.process("right") # start perception on the "right" picture; it runs during the steps below
|
|
309
277
|
picked_left = target is not None
|
|
310
278
|
if picked_left:
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
move_robot_to(pose)
|
|
279
|
+
move_robot_to(target.approach_pose_mm_deg) # [x, y, z, w, p, r], mm and degrees, as on the pendant
|
|
280
|
+
move_linear(target.grasp_pose_mm_deg) # straight in along the tool Z
|
|
314
281
|
close_gripper()
|
|
315
|
-
|
|
282
|
+
move_linear(target.approach_pose_mm_deg) # straight back out
|
|
316
283
|
sdk.capture("left") # new picture of the left pallet for the next round, taken now
|
|
317
284
|
move_robot_to(PLACE_POSE)
|
|
318
285
|
open_gripper()
|
|
319
286
|
|
|
320
287
|
# Right pallet
|
|
321
|
-
target = sdk.next_target() # wait for the "right" run, pop its best
|
|
288
|
+
target = sdk.next_target() # wait for the "right" run, pop its best reachable grasp
|
|
322
289
|
sdk.process("left") # start perception on the new "left" picture; runs while we pick right
|
|
323
290
|
picked_right = target is not None
|
|
324
291
|
if picked_right:
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
move_robot_to(pose)
|
|
292
|
+
move_robot_to(target.approach_pose_mm_deg)
|
|
293
|
+
move_linear(target.grasp_pose_mm_deg)
|
|
328
294
|
close_gripper()
|
|
329
|
-
|
|
295
|
+
move_linear(target.approach_pose_mm_deg)
|
|
330
296
|
sdk.capture("right") # new picture of the right pallet for the next round
|
|
331
297
|
move_robot_to(PLACE_POSE)
|
|
332
298
|
open_gripper()
|
|
@@ -335,12 +301,12 @@ with build_grasp_provider("pick.yaml", part_id="smallest_splice") as sdk:
|
|
|
335
301
|
break # both pallets came back empty
|
|
336
302
|
```
|
|
337
303
|
|
|
338
|
-
Five verbs. `capture(tag)` stores a picture with the robot pose at
|
|
339
|
-
moment, so park the robot first; the tag is any string you choose, one
|
|
304
|
+
Five verbs. `capture(tag)` stores a picture with the robot pose and joints at
|
|
305
|
+
that moment, so park the robot first; the tag is any string you choose, one
|
|
340
306
|
stored picture per tag. `captures()` lists the stored pictures, `delete(tag)`
|
|
341
307
|
removes one. `process(tag)` runs perception on a stored picture in the
|
|
342
308
|
background, one image at a time. `next_target(timeout=None)` waits for
|
|
343
|
-
in-flight runs and pops the best
|
|
309
|
+
in-flight runs and pops the best grasp; it returns `None` when the last
|
|
344
310
|
picture had nothing graspable, when the run failed (`captures()` carries the
|
|
345
311
|
state and the reason), or on timeout.
|
|
346
312
|
|
|
@@ -350,22 +316,24 @@ picture is dropped.
|
|
|
350
316
|
|
|
351
317
|
Each `GraspTarget` answers what a motion-owning app needs to know:
|
|
352
318
|
|
|
353
|
-
- `capture_tag` says which picture, and therefore which pallet, it came from
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
319
|
+
- `capture_tag` says which picture, and therefore which pallet, it came from;
|
|
320
|
+
`object_index` which part in it. Several grasps can come back per part.
|
|
321
|
+
- `approach_pose` is where to go first; `grasp_pose` is where the gripper
|
|
322
|
+
closes, `approach_offset` (from the grasp definition) further along the tool
|
|
323
|
+
Z. Both are TCP poses in the robot base frame. `approach_pose_mm_deg` /
|
|
324
|
+
`grasp_pose_mm_deg` give them as `[x, y, z, w, p, r]`: millimetres, and
|
|
325
|
+
degrees about X, Y then Z, the pendant convention. The `SE3` forms stay in
|
|
326
|
+
metres for code that composes transforms.
|
|
327
|
+
- `at_flange(pose)` converts either one for a controller whose TCP is the
|
|
328
|
+
flange (`tool.tcp_offset` is returned as `tcp_offset`).
|
|
329
|
+
- `plunge_pose` / `scoop_pose` are the SDK's own guarded-scoop phases. The
|
|
330
|
+
scoop can end past the grasp point, so never move to it without a force stop.
|
|
331
|
+
- `approach_joint_angles` / `grasp_joint_angles` are your robot's IK solutions
|
|
332
|
+
when it checked the grasp (see below).
|
|
364
333
|
|
|
365
334
|
Same `pick.yaml` as a self-driving cell: part, grasps, `tool.tcp_offset`,
|
|
366
335
|
camera, hand-eye. No `home_bin*` poses are needed; the capture pose is
|
|
367
|
-
whatever the robot reports.
|
|
368
|
-
reachability is checked. No gripper is built or actuated.
|
|
336
|
+
whatever the robot reports. No gripper is built or actuated.
|
|
369
337
|
|
|
370
338
|
Only if the pictures show a container with walls: `capture(tag, bin_number=N)`
|
|
371
339
|
attaches the `bin_N_*` cuboids from `cuboids.json` to the request so grasps
|
|
@@ -373,6 +341,60 @@ through a wall or below the floor are rejected. `N` must be listed in
|
|
|
373
341
|
`runtime.bins.available`. It is not a taught pose. Open pallets need none of
|
|
374
342
|
this.
|
|
375
343
|
|
|
344
|
+
### Your own robot (no VRMCS)
|
|
345
|
+
|
|
346
|
+
When the app owns the robot, say a Fanuc over RMI, set `robot.driver: external`
|
|
347
|
+
in `pick.yaml` (`robot.model` names the arm) and pass any object with these
|
|
348
|
+
three methods, in pendant units. The SDK opens no connection of its own.
|
|
349
|
+
|
|
350
|
+
```python
|
|
351
|
+
class MyRmiRobot:
|
|
352
|
+
def __init__(self, rmi):
|
|
353
|
+
self._rmi = rmi # your RMI session; the SDK never opens one
|
|
354
|
+
|
|
355
|
+
def get_tcp_pose(self) -> list[float]:
|
|
356
|
+
# Current TCP in UFrame 0, active UTool, [x, y, z, w, p, r] in mm and degrees.
|
|
357
|
+
return self._rmi.read_cartesian_position()
|
|
358
|
+
|
|
359
|
+
def get_joint_angles(self) -> list[float]:
|
|
360
|
+
# Any units: the SDK only hands them back to inverse_kinematics as the seed.
|
|
361
|
+
return self._rmi.read_joint_angles()
|
|
362
|
+
|
|
363
|
+
def inverse_kinematics(self, tcp_pose: list[float], seed_joint_angles: list[float]) -> list[float] | None:
|
|
364
|
+
# None only when tcp_pose is unreachable; raise for anything else (not ready, comms).
|
|
365
|
+
return self._rmi.inverse_kinematics(tcp_pose, seed_joint_angles)
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
with build_grasp_provider("pick.yaml", part_id="smallest_splice", robot=MyRmiRobot(rmi)) as sdk:
|
|
369
|
+
assert rmi.active_utool_offset_mm() == sdk.tcp_offset_mm # optional: check the controller tool once
|
|
370
|
+
...
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
- **Threads.** The SDK calls these methods only on the thread that called
|
|
374
|
+
`capture` (`get_tcp_pose`, `get_joint_angles`) or `next_target`, never
|
|
375
|
+
from a background thread, so they serialize with the app's motion if the app
|
|
376
|
+
calls them between moves. Call them while the arm moves and they need the
|
|
377
|
+
app's robot lock.
|
|
378
|
+
- **Calls per `next_target`.** One `get_joint_angles`, then two
|
|
379
|
+
`inverse_kinematics` for the grasp it returns (approach, then grasp). Each
|
|
380
|
+
skipped candidate adds one or two.
|
|
381
|
+
- **Seeds.** The approach is seeded with the current joints read at the start
|
|
382
|
+
of that `next_target`; the grasp with the approach solution, the
|
|
383
|
+
configuration the arm is in when it starts the straight move. Both come from
|
|
384
|
+
your robot, in your units.
|
|
385
|
+
- **Errors.** `None` drops that candidate as unreachable. An exception from
|
|
386
|
+
your robot propagates out of `next_target` and the candidate stays at the
|
|
387
|
+
front of the queue for the next call.
|
|
388
|
+
- **Frames.** Poses are TCP poses in the robot base frame (UFrame 0) at
|
|
389
|
+
`tool.tcp_offset`, which `sdk.tcp_offset_mm` returns; the active UTool must
|
|
390
|
+
match it, or use UTool 0 with `target.at_flange(...)`.
|
|
391
|
+
|
|
392
|
+
With an external robot nothing talks to VRMCS. The server skips its IK,
|
|
393
|
+
collision and path-planning stages and sends every grasp that clears the bin
|
|
394
|
+
walls; `next_target` drops what your IK can't reach and attaches both
|
|
395
|
+
solutions (`approach_joint_angles`, `grasp_joint_angles`). Arm-link collisions
|
|
396
|
+
are not checked: approach and retreat safety are the app's.
|
|
397
|
+
|
|
376
398
|
## Calibration
|
|
377
399
|
|
|
378
400
|
The SDK exposes the two calibration primitives — hand-eye and
|
|
@@ -394,6 +416,17 @@ The SDK plans to `cell.positions.calibration_joints`, runs the bundled sphere
|
|
|
394
416
|
routine, returns the robot to that start pose, and persists the result. The
|
|
395
417
|
fuller form below adds progress reporting and the operator-driven scan session:
|
|
396
418
|
|
|
419
|
+
On a cell with `robot.driver: external`, pass the app's `CalibrationRobot`: a
|
|
420
|
+
`GraspRobot` plus `execute_joint_path(waypoints)`. VAMP still plans every
|
|
421
|
+
move for `robot.model`, in-process, and your robot executes the path; joints
|
|
422
|
+
are radians in the robot model's convention here. Environment scanning needs
|
|
423
|
+
freedrive and is not available on an external robot.
|
|
424
|
+
|
|
425
|
+
```python
|
|
426
|
+
with build_calibration_app("cell.yaml", robot=MyRmiCalibrationRobot(rmi)) as cal:
|
|
427
|
+
x_cam_flg = cal.run_hand_eye_calibration()
|
|
428
|
+
```
|
|
429
|
+
|
|
397
430
|
```python
|
|
398
431
|
from pathlib import Path
|
|
399
432
|
|
|
@@ -26,8 +26,9 @@
|
|
|
26
26
|
"lint": {
|
|
27
27
|
"executor": "@nxlv/python:run-commands",
|
|
28
28
|
"options": {
|
|
29
|
-
"
|
|
30
|
-
"
|
|
29
|
+
"cwd": "projects/physical-ai/libs/griip-sdk",
|
|
30
|
+
"commands": ["uv run ruff check src/", "uv run ruff format --check src/"],
|
|
31
|
+
"parallel": false
|
|
31
32
|
}
|
|
32
33
|
},
|
|
33
34
|
"typecheck": {
|
|
@@ -2,12 +2,12 @@ dependency-groups = { }
|
|
|
2
2
|
|
|
3
3
|
[project]
|
|
4
4
|
name = "griip-sdk-dev"
|
|
5
|
-
version = "0.
|
|
6
|
-
description = "Dev build of griip-sdk from commit
|
|
5
|
+
version = "0.6.0.dev25546"
|
|
6
|
+
description = "Dev build of griip-sdk from commit 0af7ee671 (PR #6192). Not a release."
|
|
7
7
|
readme = "README.md"
|
|
8
|
-
requires-python = ">=3.10,<3.
|
|
8
|
+
requires-python = ">=3.10,<3.13"
|
|
9
9
|
dependencies = [
|
|
10
|
-
"griip-core
|
|
10
|
+
"griip-core-dev==0.5.6.dev25546",
|
|
11
11
|
"grpcio>=1.78.0",
|
|
12
12
|
"numpy>=1.24",
|
|
13
13
|
"protobuf>=4.0",
|
|
@@ -28,7 +28,8 @@ dependencies = [
|
|
|
28
28
|
"foxglove-schemas-protobuf",
|
|
29
29
|
"mcap>=1.3.0,<2.0",
|
|
30
30
|
"mcap-protobuf-support>=0.4.0,<1.0",
|
|
31
|
-
"vention-grpc-py-sdk
|
|
31
|
+
"vention-grpc-py-sdk>=0.0.72",
|
|
32
|
+
"vention-sim-grpc-py-sdk==0.1.3",
|
|
32
33
|
"fastapi[standard]>=0.121.1"
|
|
33
34
|
]
|
|
34
35
|
|
|
@@ -20,6 +20,7 @@ from griip_sdk.hardware.gripper import (
|
|
|
20
20
|
SuctionGripper,
|
|
21
21
|
ThreeFingerGripper,
|
|
22
22
|
)
|
|
23
|
+
from griip_sdk.hardware.robot_interface import CalibrationRobot, GraspRobot
|
|
23
24
|
from griip_sdk.orchestration.bin_picking_manager import BinPickingManager
|
|
24
25
|
from griip_sdk.orchestration.grasp_provider import GraspProvider
|
|
25
26
|
from griip_sdk.orchestration.pick_and_place_manager import SingleCyclePickAndPlaceManager
|
|
@@ -49,10 +50,12 @@ __all__ = [
|
|
|
49
50
|
"build_grasp_provider",
|
|
50
51
|
"build_pick_only_manager",
|
|
51
52
|
"CalibrationApp",
|
|
53
|
+
"CalibrationRobot",
|
|
52
54
|
"CaptureInfo",
|
|
53
55
|
"ConfigError",
|
|
54
56
|
"Cuboid",
|
|
55
57
|
"GraspProvider",
|
|
58
|
+
"GraspRobot",
|
|
56
59
|
"GraspTarget",
|
|
57
60
|
"GripperMoveResult",
|
|
58
61
|
"list_available_parts",
|
{griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/app.py
RENAMED
|
@@ -22,9 +22,9 @@ import grpc
|
|
|
22
22
|
import numpy as np
|
|
23
23
|
import numpy.typing as npt
|
|
24
24
|
from spatialmath import SE3, SO3
|
|
25
|
-
from vention.vision.v1.vision_service_abc import ImageServiceBackend
|
|
26
25
|
|
|
27
26
|
from griip_sdk.calibration.camera_factory import build_calibration_camera
|
|
27
|
+
from griip_sdk.calibration.external_robot import ExternalCalibrationRobotClient
|
|
28
28
|
from griip_sdk.calibration.config_store import (
|
|
29
29
|
DEFAULT_CALIBRATION_DATA_PATH,
|
|
30
30
|
CalibrationConfigStore,
|
|
@@ -53,9 +53,12 @@ from griip_sdk.cell.config import PrototypeCellConfig
|
|
|
53
53
|
from griip_sdk.cell.initialize import build_robot_initialize_request, send_initialize
|
|
54
54
|
from griip_sdk.errors import ConfigError
|
|
55
55
|
from griip_core.generated import griip_pb2 as pb
|
|
56
|
+
from griip_core.robot_drivers import EXTERNAL_ROBOT_DRIVER
|
|
56
57
|
from griip_core.generated import griip_pb2_grpc
|
|
57
58
|
from griip_sdk.grpc_adapters.servicer_as_stub import ServicerAsStub
|
|
58
59
|
from griip_sdk.hardware.robot_client import VrmcsRobotClient, build_vrmcs_client
|
|
60
|
+
from griip_sdk.hardware.robot_interface import CalibrationRobot
|
|
61
|
+
from griip_sdk.hardware.vision_backend import VisionServiceBackend
|
|
59
62
|
|
|
60
63
|
logger = logging.getLogger(__name__)
|
|
61
64
|
|
|
@@ -74,7 +77,7 @@ class CalibrationApp:
|
|
|
74
77
|
cell: PrototypeCellConfig,
|
|
75
78
|
config_path: Path,
|
|
76
79
|
robot_client: VrmcsRobotClient,
|
|
77
|
-
vision_backend:
|
|
80
|
+
vision_backend: VisionServiceBackend,
|
|
78
81
|
cam_name: str,
|
|
79
82
|
camera_mxid: str,
|
|
80
83
|
sensor: str,
|
|
@@ -545,6 +548,7 @@ def build_calibration_app(
|
|
|
545
548
|
mqtt_host: str | None = "localhost",
|
|
546
549
|
mqtt_port: int = 1883,
|
|
547
550
|
strict_intrinsics: bool = True,
|
|
551
|
+
robot: CalibrationRobot | None = None,
|
|
548
552
|
) -> Iterator[CalibrationApp]:
|
|
549
553
|
"""Yield a wired :class:`CalibrationApp` for the cell at ``cell_yaml``.
|
|
550
554
|
|
|
@@ -571,6 +575,11 @@ def build_calibration_app(
|
|
|
571
575
|
strict_intrinsics: when ``True`` (default), missing calibio intrinsics
|
|
572
576
|
raise :class:`FileNotFoundError`; ``False`` falls back to live
|
|
573
577
|
``camera_info`` (camera-swap escape hatch).
|
|
578
|
+
robot: the app's own robot, required when ``robot.driver`` is
|
|
579
|
+
``external``. Nothing talks to VRMCS: reads, IK and path execution
|
|
580
|
+
go through it, and VAMP plans in-process for ``robot.model`` in
|
|
581
|
+
either API mode, since the server has no planner for such a robot.
|
|
582
|
+
Joints are radians in the robot model's convention.
|
|
574
583
|
"""
|
|
575
584
|
resolved_path = Path(cell_yaml).expanduser().resolve()
|
|
576
585
|
cell = load_cell_config(resolved_path)
|
|
@@ -583,7 +592,15 @@ def build_calibration_app(
|
|
|
583
592
|
logger.info("=== build_calibration_app ===")
|
|
584
593
|
logger.info("Config: %s griip_api.mode: %s", resolved_path, cell.griip_api.mode)
|
|
585
594
|
|
|
586
|
-
|
|
595
|
+
robot_is_external = cell.robot.driver == EXTERNAL_ROBOT_DRIVER
|
|
596
|
+
if robot_is_external and robot is None:
|
|
597
|
+
raise ValueError(f"robot.driver is '{EXTERNAL_ROBOT_DRIVER}' in {resolved_path}: pass the app's robot to build_calibration_app")
|
|
598
|
+
if robot is not None:
|
|
599
|
+
app_tcp_offset = cell.tool.tcp_offset if cell.tool is not None else [0.0, 0.0, 0.0]
|
|
600
|
+
# Duck-typed stand-in for the slice of VrmcsRobotClient calibration uses.
|
|
601
|
+
robot_client = cast(VrmcsRobotClient, ExternalCalibrationRobotClient(robot, app_tcp_offset))
|
|
602
|
+
else:
|
|
603
|
+
robot_client = build_vrmcs_client(resolved_path, cell)
|
|
587
604
|
grpc_channel: grpc.Channel | None = None
|
|
588
605
|
mqtt_publisher: MqttProgressPublisher | None = None
|
|
589
606
|
if mqtt_host is not None:
|
|
@@ -604,7 +621,12 @@ def build_calibration_app(
|
|
|
604
621
|
grpc_channel, planning_stub, perception_stub = _build_grpc_calibration_stubs(cell.griip_api.url)
|
|
605
622
|
logger.info("Connected to mmai-griip-api over gRPC at %s", cell.griip_api.url)
|
|
606
623
|
_initialize_remote_api(grpc_channel, cell)
|
|
607
|
-
|
|
624
|
+
if robot_is_external:
|
|
625
|
+
planning_stub = _build_in_process_planning_stub(
|
|
626
|
+
robot_client, cell, resolved_path.parent, cuboids_path_override=effective_cuboids_path
|
|
627
|
+
)
|
|
628
|
+
else:
|
|
629
|
+
_configure_remote_planner(planning_stub, cell, resolved_path.parent, cuboids_path_override=effective_cuboids_path)
|
|
608
630
|
else:
|
|
609
631
|
planning_stub = _build_in_process_planning_stub(
|
|
610
632
|
robot_client, cell, resolved_path.parent, cuboids_path_override=effective_cuboids_path
|
|
@@ -12,12 +12,12 @@ from __future__ import annotations
|
|
|
12
12
|
import logging
|
|
13
13
|
from dataclasses import dataclass
|
|
14
14
|
|
|
15
|
-
from vention.vision.v1.vision_service_abc import ImageServiceBackend
|
|
16
15
|
|
|
17
16
|
from griip_sdk.calibration.config_store import CalibrationConfigStore
|
|
18
17
|
from griip_sdk.cell.config import CameraConfig
|
|
19
18
|
from griip_sdk.hardware.grpc_vision_backend import GrpcVisionServiceBackend, camera_identity_from_backend
|
|
20
19
|
from griip_sdk.hardware.mmai_vision_backend import MmaiVisionServiceBackend
|
|
20
|
+
from griip_sdk.hardware.vision_backend import VisionServiceBackend
|
|
21
21
|
|
|
22
22
|
logger = logging.getLogger(__name__)
|
|
23
23
|
|
|
@@ -31,7 +31,7 @@ class CalibrationCamera:
|
|
|
31
31
|
so calibration-time saves and pick-time loads provably agree.
|
|
32
32
|
"""
|
|
33
33
|
|
|
34
|
-
vision_backend:
|
|
34
|
+
vision_backend: VisionServiceBackend
|
|
35
35
|
camera_vendor: str
|
|
36
36
|
camera_mx_id: str
|
|
37
37
|
|
|
@@ -65,7 +65,7 @@ def build_calibration_camera(
|
|
|
65
65
|
"Using vention.vision gRPC camera at %s; intrinsics/calibration are owned by the vision service.",
|
|
66
66
|
camera_config.target,
|
|
67
67
|
)
|
|
68
|
-
vision_backend:
|
|
68
|
+
vision_backend: VisionServiceBackend = GrpcVisionServiceBackend(
|
|
69
69
|
camera_config.target, source_metadata_defaults=camera_config.source_metadata
|
|
70
70
|
)
|
|
71
71
|
camera_vendor, camera_mx_id = camera_identity_from_backend(vision_backend, camera_config.sensor)
|