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.
Files changed (206) hide show
  1. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/.coverage +0 -0
  2. griip_sdk_dev-0.4.0.dev24238/README.md → griip_sdk_dev-0.6.0.dev25546/PKG-INFO +126 -28
  3. griip_sdk_dev-0.4.0.dev24238/PKG-INFO → griip_sdk_dev-0.6.0.dev25546/README.md +93 -60
  4. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/project.json +3 -2
  5. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/pyproject.toml +6 -5
  6. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/__init__.py +3 -0
  7. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/app.py +26 -4
  8. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/camera_factory.py +3 -3
  9. griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/calibration/external_robot.py +107 -0
  10. {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
  11. {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
  12. griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/calibration/tests/test_external_robot.py +88 -0
  13. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/builders.py +21 -15
  14. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/config.py +1 -0
  15. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/mock_builders.py +3 -1
  16. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/recipes.py +55 -26
  17. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_recipes.py +42 -4
  18. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/camera.py +8 -8
  19. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/fanuc_robot_client.py +54 -52
  20. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/grpc_vision_backend.py +4 -4
  21. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mmai_vision_backend.py +2 -2
  22. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/robot_client.py +141 -34
  23. griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/hardware/robot_interface.py +81 -0
  24. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/sim_gripper.py +6 -89
  25. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/sim_hand_eye.py +22 -16
  26. {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
  27. griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/hardware/tests/test_robot_client_base.py +151 -0
  28. {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
  29. {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
  30. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/ur_robot_client.py +2 -1
  31. griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/hardware/vision_backend.py +7 -0
  32. griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/orchestration/bin_picking_manager.py +586 -0
  33. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/bin_state.py +20 -10
  34. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/cycle_pause_gate.py +2 -2
  35. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/grasp_provider.py +83 -27
  36. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/perception_inputs.py +1 -0
  37. {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
  38. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/placement_planner.py +8 -2
  39. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/planning.py +10 -0
  40. {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
  41. {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
  42. {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
  43. {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
  44. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/test_planning.py +48 -0
  45. griip_sdk_dev-0.6.0.dev25546/src/griip_sdk/orchestration/tests/test_trajectory_store.py +27 -0
  46. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/trajectory_store.py +7 -4
  47. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/types.py +33 -23
  48. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/read_tcp.py +1 -1
  49. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/run_linear_shuttle.py +4 -8
  50. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/foxglove_events.py +2 -0
  51. {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
  52. griip_sdk_dev-0.4.0.dev24238/coverage.xml +0 -23585
  53. griip_sdk_dev-0.4.0.dev24238/src/griip_sdk/hardware/tests/test_robot_client_base.py +0 -48
  54. griip_sdk_dev-0.4.0.dev24238/src/griip_sdk/orchestration/bin_picking_manager.py +0 -580
  55. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/docs/griip-sdk-consumer-improvements.md +0 -0
  56. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/__init__.py +0 -0
  57. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/apriltag_pose.py +0 -0
  58. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/cartesian_pose.py +0 -0
  59. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/config_store.py +0 -0
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. {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
  67. {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
  68. {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
  69. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/mqtt_publisher.py +0 -0
  70. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/mqtt_topics.py +0 -0
  71. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/routines.py +0 -0
  72. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/scanning/__init__.py +0 -0
  73. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/scanning/environment_scanning.py +0 -0
  74. {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
  75. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/__init__.py +0 -0
  76. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/conftest.py +0 -0
  77. {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
  78. {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
  79. {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
  80. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/tests/test_transforms.py +0 -0
  81. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/types.py +0 -0
  82. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/calibration/units.py +0 -0
  83. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/__init__.py +0 -0
  84. {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
  85. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/initialize.py +0 -0
  86. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/loader.py +0 -0
  87. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/parts.py +0 -0
  88. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/__init__.py +0 -0
  89. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/conftest.py +0 -0
  90. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_builders.py +0 -0
  91. {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
  92. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_initialize.py +0 -0
  93. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_loader.py +0 -0
  94. {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
  95. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/cell/tests/test_parts.py +0 -0
  96. {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
  97. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/errors.py +0 -0
  98. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/grpc_adapters/__init__.py +0 -0
  99. {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
  100. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/__init__.py +0 -0
  101. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/bin_shaker.py +0 -0
  102. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/ft_sensor.py +0 -0
  103. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/gripper.py +0 -0
  104. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/io_client.py +0 -0
  105. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mocks/__init__.py +0 -0
  106. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/mocks/camera_mock.py +0 -0
  107. {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
  108. {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
  109. {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
  110. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/onrobot_3fg15_gripper.py +0 -0
  111. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/robotiq_2f140_gripper.py +0 -0
  112. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/sim_robot_client.py +0 -0
  113. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/suction_gripper.py +0 -0
  114. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/__init__.py +0 -0
  115. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tests/conftest.py +0 -0
  116. {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
  117. {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
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/torquing_client.py +0 -0
  131. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/tower_light.py +0 -0
  132. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/hardware/vision_codec.py +0 -0
  133. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/log_utils.py +0 -0
  134. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/__init__.py +0 -0
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/__init__.py +0 -0
  144. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/modeling/tests/conftest.py +0 -0
  145. {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
  146. {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
  147. {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
  148. {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
  149. {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
  150. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/__init__.py +0 -0
  151. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/bin_cuboid_extraction.py +0 -0
  152. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/callbacks.py +0 -0
  153. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/errors.py +0 -0
  154. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/__init__.py +0 -0
  155. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/grasp_executor.py +0 -0
  156. {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
  157. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/suction_executor.py +0 -0
  158. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/execution/tests/__init__.py +0 -0
  159. {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
  160. {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
  161. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/grasp_queue.py +0 -0
  162. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/part_setup.py +0 -0
  163. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/pick_generator.py +0 -0
  164. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/proto_conversions.py +0 -0
  165. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/roi_scheduler.py +0 -0
  166. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/scoop_executor.py +0 -0
  167. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/__init__.py +0 -0
  168. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/orchestration/tests/conftest.py +0 -0
  169. {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
  170. {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
  171. {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
  172. {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
  173. {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
  174. {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
  175. {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
  176. {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
  177. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/__init__.py +0 -0
  178. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/config/__init__.py +0 -0
  179. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/config/registry.py +0 -0
  180. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/in_process_api.py +0 -0
  181. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/prototyping/run_environment_scanning.py +0 -0
  182. {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
  183. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/__init__.py +0 -0
  184. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/foxglove_joint_states.py +0 -0
  185. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/gripper_state_logger.py +0 -0
  186. {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
  187. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/h264_video_logger.py +0 -0
  188. {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
  189. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/kpi_logger.py +0 -0
  190. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/kpi_mcap_recording.py +0 -0
  191. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/kpi_timer.py +0 -0
  192. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/mcap_recording.py +0 -0
  193. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/memory_utils.py +0 -0
  194. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/robot_state_logger.py +0 -0
  195. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/rotating_mcap_writer.py +0 -0
  196. {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
  197. {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
  198. {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
  199. {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
  200. {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
  201. {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
  202. {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
  203. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/recording/tests/test_session.py +0 -0
  204. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/tests/__init__.py +0 -0
  205. {griip_sdk_dev-0.4.0.dev24238 → griip_sdk_dev-0.6.0.dev25546}/src/griip_sdk/tests/test_log_utils.py +0 -0
  206. {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
@@ -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 grasp poses. It never commands motion.
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 pose; None = nothing graspable
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
- pose = target.flange_pose_mm_deg # [x, y, z, rx, ry, rz], mm and degrees, as on the pendant
280
- move_robot_to(approach(pose))
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
- move_robot_to(approach(pose))
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 pose
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
- pose = target.flange_pose_mm_deg
294
- move_robot_to(approach(pose))
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
- move_robot_to(approach(pose))
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 that
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 pose; it returns `None` when the last
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
- - Several come back per picture, ranked by `priority`, at most
323
- `picking.max_detections × picking.max_grasps_per_object`.
324
- - `flange_pose` and `tcp_pose` are the same target in the world / robot base
325
- frame, the frame the robot reports (the camera pose is built from it and the
326
- hand-eye calibration). `flange_pose = tcp_pose · X_tcp_flg⁻¹`, where
327
- `X_tcp_flg` is the translation `tool.tcp_offset`, returned as `tcp_offset`.
328
- - `flange_pose_mm_deg` and `tcp_pose_mm_deg` are the same poses as
329
- `[x, y, z, rx, ry, rz]`: millimetres, and degrees of roll, pitch, yaw about
330
- X, Y then Z, the convention the pendant shows. The `SE3` forms stay in metres
331
- for code that composes transforms.
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. The robot must be registered in VRMCS, where
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 grasp poses. It never commands motion.
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 pose; None = nothing graspable
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
- pose = target.flange_pose_mm_deg # [x, y, z, rx, ry, rz], mm and degrees, as on the pendant
312
- move_robot_to(approach(pose))
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
- move_robot_to(approach(pose))
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 pose
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
- pose = target.flange_pose_mm_deg
326
- move_robot_to(approach(pose))
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
- move_robot_to(approach(pose))
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 that
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 pose; it returns `None` when the last
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
- - Several come back per picture, ranked by `priority`, at most
355
- `picking.max_detections × picking.max_grasps_per_object`.
356
- - `flange_pose` and `tcp_pose` are the same target in the world / robot base
357
- frame, the frame the robot reports (the camera pose is built from it and the
358
- hand-eye calibration). `flange_pose = tcp_pose · X_tcp_flg⁻¹`, where
359
- `X_tcp_flg` is the translation `tool.tcp_offset`, returned as `tcp_offset`.
360
- - `flange_pose_mm_deg` and `tcp_pose_mm_deg` are the same poses as
361
- `[x, y, z, rx, ry, rz]`: millimetres, and degrees of roll, pitch, yaw about
362
- X, Y then Z, the convention the pendant shows. The `SE3` forms stay in metres
363
- for code that composes transforms.
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. The robot must be registered in VRMCS, where
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
- "command": "uv run ruff check src/",
30
- "cwd": "projects/physical-ai/libs/griip-sdk"
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.4.0.dev24238"
6
- description = "Dev build of griip-sdk from commit 920520032 (PR #6192). Not a release."
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.11"
8
+ requires-python = ">=3.10,<3.13"
9
9
  dependencies = [
10
- "griip-core>=0.4.0",
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==0.0.67.dev34389318765",
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",
@@ -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: ImageServiceBackend,
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
- robot_client = build_vrmcs_client(resolved_path, cell)
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
- _configure_remote_planner(planning_stub, cell, resolved_path.parent, cuboids_path_override=effective_cuboids_path)
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: ImageServiceBackend
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: ImageServiceBackend = GrpcVisionServiceBackend(
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)