roboapi 0.4.2__tar.gz → 0.4.3__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 (214) hide show
  1. {roboapi-0.4.2 → roboapi-0.4.3}/PKG-INFO +3 -9
  2. {roboapi-0.4.2 → roboapi-0.4.3}/README.md +2 -2
  3. {roboapi-0.4.2 → roboapi-0.4.3}/docs/development.md +12 -5
  4. {roboapi-0.4.2 → roboapi-0.4.3}/docs/installation.md +9 -6
  5. roboapi-0.4.3/docs/releases/v0.4.3.md +14 -0
  6. {roboapi-0.4.2 → roboapi-0.4.3}/pyproject.toml +1 -23
  7. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/ik.py +20 -7
  8. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/PKG-INFO +3 -9
  9. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/SOURCES.txt +1 -0
  10. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/requires.txt +0 -8
  11. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_workspace.py +48 -1
  12. {roboapi-0.4.2 → roboapi-0.4.3}/uv.lock +42 -116
  13. {roboapi-0.4.2 → roboapi-0.4.3}/.python-version +0 -0
  14. {roboapi-0.4.2 → roboapi-0.4.3}/DESIGN.md +0 -0
  15. {roboapi-0.4.2 → roboapi-0.4.3}/LICENSE +0 -0
  16. {roboapi-0.4.2 → roboapi-0.4.3}/MANIFEST.in +0 -0
  17. {roboapi-0.4.2 → roboapi-0.4.3}/NOTICE +0 -0
  18. {roboapi-0.4.2 → roboapi-0.4.3}/docs/calibration.md +0 -0
  19. {roboapi-0.4.2 → roboapi-0.4.3}/docs/model-api.md +0 -0
  20. {roboapi-0.4.2 → roboapi-0.4.3}/docs/naming.md +0 -0
  21. {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.2.10.md +0 -0
  22. {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.2.11.md +0 -0
  23. {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.2.8.md +0 -0
  24. {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.2.9.md +0 -0
  25. {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.3.0.md +0 -0
  26. {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.4.0.md +0 -0
  27. {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.4.1.md +0 -0
  28. {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.4.2.md +0 -0
  29. {roboapi-0.4.2 → roboapi-0.4.3}/docs/repository-rename.md +0 -0
  30. {roboapi-0.4.2 → roboapi-0.4.3}/docs/zh-CN/DESIGN.md +0 -0
  31. {roboapi-0.4.2 → roboapi-0.4.3}/docs/zh-CN/README.md +0 -0
  32. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/BRAND.md +0 -0
  33. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/asset-provenance.json +0 -0
  34. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/index.html +0 -0
  35. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/package-lock.json +0 -0
  36. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/package.json +0 -0
  37. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Bundler-LICENSE.txt +0 -0
  38. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Inter-OFL.txt +0 -0
  39. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Lucide-LICENSE.txt +0 -0
  40. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Meshoptimizer-LICENSE.txt +0 -0
  41. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/PokeBrand-NOTICE.txt +0 -0
  42. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/React-LICENSE.txt +0 -0
  43. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Three-LICENSE.txt +0 -0
  44. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/App.test.tsx +0 -0
  45. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/App.tsx +0 -0
  46. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/api.test.ts +0 -0
  47. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/api.ts +0 -0
  48. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/brand/Inter-Variable.ttf +0 -0
  49. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/brand/MiSans-Regular.woff2 +0 -0
  50. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/brand/MiSans-Semibold.woff2 +0 -0
  51. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/brand/logo-1.png +0 -0
  52. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/calibration/README.md +0 -0
  53. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/calibration/home-reference.png +0 -0
  54. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/calibration/robotiq-ace-pro-2.glb +0 -0
  55. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/cameraStream.test.ts +0 -0
  56. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/cameraStream.ts +0 -0
  57. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Brand.tsx +0 -0
  58. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationDialog.test.tsx +0 -0
  59. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationDialog.tsx +0 -0
  60. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationIllustration.test.tsx +0 -0
  61. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationIllustration.tsx +0 -0
  62. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationScene.tsx +0 -0
  63. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CameraView.test.tsx +0 -0
  64. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CameraView.tsx +0 -0
  65. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/DevicesDialog.tsx +0 -0
  66. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Dialog.tsx +0 -0
  67. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/DirectionCheckDialog.test.tsx +0 -0
  68. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/DirectionCheckDialog.tsx +0 -0
  69. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Icon.tsx +0 -0
  70. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/InstructionPanel.tsx +0 -0
  71. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/LogsPanel.tsx +0 -0
  72. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Notification.tsx +0 -0
  73. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Popover.tsx +0 -0
  74. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/PresetChips.test.tsx +0 -0
  75. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/PresetChips.tsx +0 -0
  76. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/PresetsPanel.tsx +0 -0
  77. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/RunInfoDialog.tsx +0 -0
  78. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/SettingsPanel.test.tsx +0 -0
  79. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/SettingsPanel.tsx +0 -0
  80. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/StopButton.tsx +0 -0
  81. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/StorageSettings.test.tsx +0 -0
  82. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/StorageSettings.tsx +0 -0
  83. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/TaskHistory.test.tsx +0 -0
  84. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/TaskHistory.tsx +0 -0
  85. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/WorkspaceSettings.test.tsx +0 -0
  86. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/WorkspaceSettings.tsx +0 -0
  87. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration/camera-lens.ts +0 -0
  88. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration/direction-motion.test.ts +0 -0
  89. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration/direction-motion.ts +0 -0
  90. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration/locking-pins.ts +0 -0
  91. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration.css +0 -0
  92. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/format.ts +0 -0
  93. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/i18n.tsx +0 -0
  94. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/main.tsx +0 -0
  95. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/naming.test.tsx +0 -0
  96. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/naming.ts +0 -0
  97. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/notifications.test.ts +0 -0
  98. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/notifications.ts +0 -0
  99. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/pages/RunPage.tsx +0 -0
  100. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/pages/SettingsPage.test.tsx +0 -0
  101. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/pages/SettingsPage.tsx +0 -0
  102. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/styles.css +0 -0
  103. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/test/fixtures.ts +0 -0
  104. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/test/mockCamera.ts +0 -0
  105. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/test/setup.ts +0 -0
  106. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/useCameraPreview.test.tsx +0 -0
  107. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/useCameraPreview.ts +0 -0
  108. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/usePolling.test.tsx +0 -0
  109. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/usePolling.ts +0 -0
  110. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/tsconfig.json +0 -0
  111. {roboapi-0.4.2 → roboapi-0.4.3}/frontend/vite.config.ts +0 -0
  112. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/__init__.py +0 -0
  113. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/calibration/__init__.py +0 -0
  114. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/calibration/profile.py +0 -0
  115. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/calibration/session.py +0 -0
  116. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/cli.py +0 -0
  117. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/config/__init__.py +0 -0
  118. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/config/loader.py +0 -0
  119. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/config/models.py +0 -0
  120. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/embodiment.py +0 -0
  121. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/errors.py +0 -0
  122. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/geometry.py +0 -0
  123. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/__init__.py +0 -0
  124. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/base.py +0 -0
  125. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/camera.py +0 -0
  126. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/__init__.py +0 -0
  127. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/arm.py +0 -0
  128. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/desk.py +0 -0
  129. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/feedback.py +0 -0
  130. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/guiding.py +0 -0
  131. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/limits.py +0 -0
  132. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/settings.py +0 -0
  133. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/robotiq.py +0 -0
  134. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/__init__.py +0 -0
  135. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/build.py +0 -0
  136. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/compliant.py +0 -0
  137. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/dashboard.py +0 -0
  138. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/feedback.py +0 -0
  139. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/ipc.py +0 -0
  140. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/CMakeLists.txt +0 -0
  141. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/dependencies.lock.json +0 -0
  142. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/cartesian_speedl.hpp +0 -0
  143. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/control_loop.hpp +0 -0
  144. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/geom.hpp +0 -0
  145. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/motion_primitives.hpp +0 -0
  146. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/robot_io.hpp +0 -0
  147. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/streaming_pose.hpp +0 -0
  148. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/src/control_loop.cpp +0 -0
  149. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/src/robot_io_urcl.cpp +0 -0
  150. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/tests/cartesian_speedl_unit.cpp +0 -0
  151. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/tests/control_modes_unit.cpp +0 -0
  152. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/tests/streaming_pose_unit.cpp +0 -0
  153. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/tests/velocity_governor_unit.cpp +0 -0
  154. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/worker.cpp +0 -0
  155. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/position.py +0 -0
  156. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/settings.py +0 -0
  157. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/images.py +0 -0
  158. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/initialize.py +0 -0
  159. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/mcp.py +0 -0
  160. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/motion.py +0 -0
  161. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/naming.py +0 -0
  162. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/operations.py +0 -0
  163. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/policy/__init__.py +0 -0
  164. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/policy/client.py +0 -0
  165. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/policy/protocol.py +0 -0
  166. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/policy/settings.py +0 -0
  167. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/product-names.json +0 -0
  168. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/records.py +0 -0
  169. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/runtime.py +0 -0
  170. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/semantics.py +0 -0
  171. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/tasks.py +0 -0
  172. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/__init__.py +0 -0
  173. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/presets.py +0 -0
  174. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/server.py +0 -0
  175. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Bundler-LICENSE.txt +0 -0
  176. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/CalibrationScene-BO_spRoL.js +0 -0
  177. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Inter-OFL.txt +0 -0
  178. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Inter-Variable-c8O0ljhh.ttf +0 -0
  179. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Lucide-LICENSE.txt +0 -0
  180. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Meshoptimizer-LICENSE.txt +0 -0
  181. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/MiSans-Regular-ES4DrbaF.woff2 +0 -0
  182. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/MiSans-Semibold-B34HIk9C.woff2 +0 -0
  183. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/PokeBrand-NOTICE.txt +0 -0
  184. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/React-LICENSE.txt +0 -0
  185. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Three-LICENSE.txt +0 -0
  186. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/home-reference-CTpf8-oV.png +0 -0
  187. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/index-CGLhpUm0.js +0 -0
  188. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/index-QXqV-fDC.css +0 -0
  189. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/robotiq-ace-pro-2-EJuoOXTy.glb +0 -0
  190. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/index.html +0 -0
  191. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/dependency_links.txt +0 -0
  192. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/entry_points.txt +0 -0
  193. {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/top_level.txt +0 -0
  194. {roboapi-0.4.2 → roboapi-0.4.3}/setup.cfg +0 -0
  195. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_calibration.py +0 -0
  196. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_chunk_boundary.py +0 -0
  197. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_cli.py +0 -0
  198. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_config.py +0 -0
  199. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_direction_check.py +0 -0
  200. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_initialize.py +0 -0
  201. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_instruction_pending.py +0 -0
  202. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_mcp.py +0 -0
  203. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_monitor_error_clear.py +0 -0
  204. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_motion.py +0 -0
  205. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_naming.py +0 -0
  206. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_policy.py +0 -0
  207. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_preview.py +0 -0
  208. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_runtime.py +0 -0
  209. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_sessions.py +0 -0
  210. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_storage.py +0 -0
  211. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_task_runtime.py +0 -0
  212. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_task_web.py +0 -0
  213. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_tasks.py +0 -0
  214. {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_web.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roboapi
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: Run robot policies on UR and Franka through a browser or an MCP agent.
5
5
  Author: PokeBot
6
6
  License-Expression: Apache-2.0 AND MIT AND ISC AND OFL-1.1 AND LicenseRef-MiSans
@@ -34,12 +34,6 @@ Requires-Dist: ur_rtde; extra == "ur-cb3"
34
34
  Provides-Extra: franka
35
35
  Requires-Dist: franky-control<3,>=2.0; extra == "franka"
36
36
  Requires-Dist: websockets>=15; extra == "franka"
37
- Provides-Extra: franka56
38
- Requires-Dist: franky-control==2.0.0+libfranka.0.13.3; extra == "franka56"
39
- Requires-Dist: websockets>=15; extra == "franka56"
40
- Provides-Extra: panda
41
- Requires-Dist: franky-control==2.0.0+libfranka.0.9.2; extra == "panda"
42
- Requires-Dist: websockets>=15; extra == "panda"
43
37
  Provides-Extra: gripper
44
38
  Requires-Dist: minimalmodbus; extra == "gripper"
45
39
  Dynamic: license-file
@@ -90,8 +84,8 @@ requires a realtime host.
90
84
  | UR CB3 | `uv pip install 'roboapi[ur-cb3,gripper]'` |
91
85
  | UR e-Series | `uv pip install 'roboapi[gripper]'` |
92
86
  | Franka FR3, system 5.9+ | `uv pip install 'roboapi[franka,gripper]'` |
93
- | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka56,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` |
94
- | Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[panda,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` |
87
+ | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka,gripper]' 'franky-control==2.0.0+libfranka.0.13.3' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` |
88
+ | Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[franka,gripper]' 'franky-control==2.0.0+libfranka.0.9.2' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` |
95
89
 
96
90
  UR e-Series additionally needs its native runtime built on the host:
97
91
 
@@ -44,8 +44,8 @@ requires a realtime host.
44
44
  | UR CB3 | `uv pip install 'roboapi[ur-cb3,gripper]'` |
45
45
  | UR e-Series | `uv pip install 'roboapi[gripper]'` |
46
46
  | Franka FR3, system 5.9+ | `uv pip install 'roboapi[franka,gripper]'` |
47
- | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka56,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` |
48
- | Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[panda,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` |
47
+ | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka,gripper]' 'franky-control==2.0.0+libfranka.0.13.3' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` |
48
+ | Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[franka,gripper]' 'franky-control==2.0.0+libfranka.0.9.2' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` |
49
49
 
50
50
  UR e-Series additionally needs its native runtime built on the host:
51
51
 
@@ -20,8 +20,9 @@ Device and model substitutes are confined to tests.
20
20
 
21
21
  For hardware development, add the extras from the [installation table](installation.md#install-from-pypi)
22
22
  to `uv sync`, for example `uv sync --locked --extra ur-cb3 --extra gripper`.
23
- The source project configures the Panda wheel index. FR3 and Panda extras are mutually
24
- exclusive, including the `franka56` build. Activate `.venv` before following the native build instructions.
23
+ All Franka models use `--extra franka`; the lockfile selects the current FR3 SDK.
24
+ For FR3 5.6 and Panda, install the controller's SDK build after syncing, as shown below.
25
+ Activate `.venv` before following the native build instructions.
25
26
 
26
27
  ## Frontend
27
28
 
@@ -66,13 +67,19 @@ CI runs on Ubuntu 24.04:
66
67
  The UR build command compiles the native runtime and runs its offline checks. Franka
67
68
  tests cover feedback, load and TCP configuration, native guiding, control handoffs and
68
69
  model-specific motion limits. Run SDK-dependent Desk tests
69
- on Linux with the matching extra:
70
+ on Linux with the matching SDK build:
70
71
 
71
72
  ```sh
72
- uv run --locked --extra panda pytest tests/hardware/test_panda_desk.py
73
- uv run --locked --extra franka56 pytest tests/hardware/test_franka_legacy.py
73
+ uv sync --locked --extra franka --extra gripper
74
+ uv pip install 'franky-control==2.0.0+libfranka.0.13.3' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/
75
+ uv run --no-sync pytest tests/hardware/test_panda_desk.py tests/hardware/test_franka_legacy.py
76
+ uv pip install 'franky-control==2.0.0+libfranka.0.9.2' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/
77
+ uv run --no-sync pytest tests/hardware/test_panda_desk.py
74
78
  ```
75
79
 
80
+ Use `--no-sync` with these SDK overrides; syncing again restores the default SDK
81
+ from the lockfile.
82
+
76
83
  SDK imports, native builds and offline tests do not establish
77
84
  robot tracking, tool-load accuracy, realtime host readiness or a working hardware deployment.
78
85
 
@@ -42,11 +42,12 @@ Run the installation command for one setup, then complete its hardware preparati
42
42
  | UR CB3 (UR5) | `uv pip install 'roboapi[ur-cb3,gripper]'` | [UR](#ur); no native build |
43
43
  | UR e-Series (UR5e, UR7e) | `uv pip install 'roboapi[gripper]'` | [UR and native control runtime](#ur) |
44
44
  | Franka FR3, system 5.9+ | `uv pip install 'roboapi[franka,gripper]'` | [Franka realtime host and Desk](#franka) |
45
- | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka56,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` | [Franka](#franka); import the standard load and TCP once |
46
- | Franka Panda 4.2.1–4.x | `uv pip install 'roboapi[panda,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` | [Franka](#franka); import the standard load and TCP once |
45
+ | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka,gripper]' 'franky-control==2.0.0+libfranka.0.13.3' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` | [Franka](#franka); import the standard load and TCP once |
46
+ | Franka Panda 4.2.1–4.x | `uv pip install 'roboapi[franka,gripper]' 'franky-control==2.0.0+libfranka.0.9.2' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` | [Franka](#franka); import the standard load and TCP once |
47
47
 
48
- The Franka extras install different builds of the same SDK and cannot share an environment.
49
- Check the controller's system version in Desk Settings before selecting the extra.
48
+ All Franka models use the `franka` extra. FR3 5.6 and Panda additionally specify a
49
+ matching SDK build in the same command. Only one SDK build can be installed in an environment;
50
+ check the controller's system version in Desk Settings before installing.
50
51
  Verify that the CLI is available with `roboapi --help`.
51
52
 
52
53
  ### Fresh configuration after the rename
@@ -112,8 +113,8 @@ The physical assembly must match the
112
113
  The Python SDK wheel supplies the motion library. Select the SDK build for the controller
113
114
  using the [compatibility table](https://frankarobotics.github.io/docs/doc/libfranka/docs/compatibility_matrix.html)
114
115
  and [franky wheel guide](https://timschneider42.github.io/franky/getting-started/installation.html).
115
- The locked current FR3 SDK uses libfranka **0.21.2** (system **5.9+**); the `franka56`
116
- extra uses **0.13.3** for system **5.6.0**. Panda uses **0.9.2**, requiring system
116
+ The locked current FR3 SDK uses libfranka **0.21.2** (system **5.9+**); system **5.6.0**
117
+ uses the SDK build with **0.13.3**. Panda uses **0.9.2**, requiring system
117
118
  software **4.2.1 or later in the 4.x series**. Earlier 4.x systems need a robot update.
118
119
  Franka preview and calibration use authenticated Desk web interfaces. Check both SDK
119
120
  compatibility and Desk feedback during installation.
@@ -181,6 +182,8 @@ FR3 velocity bounds also depend on the measured joint position. Newer FR3 SDKs r
181
182
  parameters from the robot's URDF; FR3 5.6 and Panda use their matching official limits.
182
183
  Within these bounds, the IK retains step and Cartesian speed caps, a 0.30 rad directional
183
184
  slowdown zone with a nullspace centering bias, and a 0.10 rad/s cap on nullspace velocity.
185
+ If that cap conflicts with the current joint bounds, IK uses the smallest attainable
186
+ excess until the cap becomes feasible again; joint bounds and acceleration continuity take priority.
184
187
  At the default 50 Hz update rate, the Cartesian caps are 1.125 m/s translation and
185
188
  0.5 rad/s rotation; the joint step budget is 0.06 rad per nominal cycle.
186
189
  The control trace records repeated-state age for diagnostics. Native SDK faults stop the
@@ -0,0 +1,14 @@
1
+ # v0.4.3 — Keep Franka running through nullspace limit transitions
2
+
3
+ - Fix Franka IK stopping when the nullspace speed cap conflicts with the current
4
+ joint velocity bounds. Use the smallest necessary transient excess, preserving
5
+ joint limits and acceleration continuity, then restore the cap when feasible.
6
+ - Handle tangent constraint boundaries directly to avoid numerical solver failures.
7
+ - Cover continuous deceleration and workspace boundary clipping with regression tests.
8
+ - Use one `franka` installation extra for all Franka models. FR3 5.6 and Panda
9
+ select their matching SDK build explicitly in the installation command.
10
+
11
+ The shared motion range and its settings are unchanged. Upgrading from 0.4.2 does
12
+ not require recalibration or rebuilding either robot's native runtime. Restart
13
+ RoboAPI after installing the update. Validation is offline; physical motion has
14
+ not been revalidated for this fix.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "roboapi"
3
- version = "0.4.2"
3
+ version = "0.4.3"
4
4
  description = "Run robot policies on UR and Franka through a browser or an MCP agent."
5
5
  readme = "README.md"
6
6
  authors = [{ name = "PokeBot" }]
@@ -31,8 +31,6 @@ dependencies = [
31
31
  [project.optional-dependencies]
32
32
  ur-cb3 = ["ur_rtde"]
33
33
  franka = ["franky-control>=2.0,<3", "websockets>=15"]
34
- franka56 = ["franky-control==2.0.0+libfranka.0.13.3", "websockets>=15"]
35
- panda = ["franky-control==2.0.0+libfranka.0.9.2", "websockets>=15"]
36
34
  gripper = ["minimalmodbus"] # pulls pyserial
37
35
 
38
36
  [dependency-groups]
@@ -53,26 +51,6 @@ include = ["roboapi*"]
53
51
  [tool.pytest.ini_options]
54
52
  testpaths = ["tests"]
55
53
 
56
- # These SDK builds install the same Python module and cannot share an environment.
57
- [tool.uv]
58
- conflicts = [[{ extra = "franka" }, { extra = "franka56" }, { extra = "panda" }]]
59
-
60
- [tool.uv.sources]
61
- franky-control = [
62
- { index = "franky-fr3-56", extra = "franka56" },
63
- { index = "franky-panda", extra = "panda" },
64
- ]
65
-
66
- [[tool.uv.index]]
67
- name = "franky-fr3-56"
68
- url = "https://timschneider42.github.io/franky/whl/libfranka-0.13.3/"
69
- explicit = true
70
-
71
- [[tool.uv.index]]
72
- name = "franky-panda"
73
- url = "https://timschneider42.github.io/franky/whl/libfranka-0.9.2/"
74
- explicit = true
75
-
76
54
  [tool.setuptools.package-data]
77
55
  "roboapi" = ["product-names.json"]
78
56
  "roboapi.web" = ["static/index.html", "static/assets/*"]
@@ -120,7 +120,7 @@ def _solve_bounded_qp(
120
120
  projection_direction: np.ndarray | None = None,
121
121
  max_projection: float | None = None,
122
122
  ) -> np.ndarray:
123
- """Solve the seven-dimensional IK QP with box and nullspace bounds."""
123
+ """Solve bounded IK, minimizing unavoidable nullspace-cap excess first."""
124
124
  if np.any(lower > upper):
125
125
  raise ValueError("joint velocity constraints are infeasible")
126
126
  constraints = ()
@@ -138,10 +138,21 @@ def _solve_bounded_qp(
138
138
  maximum = float(
139
139
  np.sum(np.where(direction >= 0.0, direction * upper, direction * lower))
140
140
  )
141
- if minimum > max_projection or maximum < -max_projection:
142
- raise np.linalg.LinAlgError(
143
- "nullspace velocity cap is incompatible with the joint velocity box"
144
- )
141
+ if minimum >= max_projection or maximum <= -max_projection:
142
+ # Acceleration continuity or inward-only bounds can make the cap
143
+ # unreachable this tick. Take the closest attainable projection,
144
+ # without relaxing any joint bound. Solve its boundary face directly
145
+ # rather than asking SLSQP to satisfy a constraint tangent to the box.
146
+ take_lower = direction > 0.0 if minimum >= max_projection else direction < 0.0
147
+ solution = np.where(take_lower, lower, upper)
148
+ free = direction == 0.0
149
+ if np.any(free):
150
+ solution[free] = _solve_bounded_qp(
151
+ hessian[np.ix_(free, free)],
152
+ rhs[free] - hessian[np.ix_(free, ~free)] @ solution[~free],
153
+ lower[free], upper[free],
154
+ )
155
+ return solution
145
156
  constraints = (
146
157
  LinearConstraint(direction, -max_projection, max_projection),
147
158
  )
@@ -520,8 +531,10 @@ def solve_feedback_leashed_ik(
520
531
  upper=upper_velocity,
521
532
  max_velocity=config.posture_max_velocity,
522
533
  )
523
- if abs(float(null_direction @ dq)) > config.posture_max_velocity + 1e-7:
524
- raise np.linalg.LinAlgError("final structural-nullspace velocity exceeded its hard cap")
534
+ # Posture correction must not amplify an unavoidable transient excess.
535
+ feasible_cap = max(config.posture_max_velocity, abs(float(null_direction @ primary_dq)))
536
+ if abs(float(null_direction @ dq)) > feasible_cap + 1e-7:
537
+ raise np.linalg.LinAlgError("posture correction increased nullspace velocity beyond its feasible cap")
525
538
  # qd is a bounded local position lead, rebuilt from measured q every tick.
526
539
  # The same constrained dq is also the damping reference, so the position
527
540
  # and velocity terms agree and no target debt accumulates.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: roboapi
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: Run robot policies on UR and Franka through a browser or an MCP agent.
5
5
  Author: PokeBot
6
6
  License-Expression: Apache-2.0 AND MIT AND ISC AND OFL-1.1 AND LicenseRef-MiSans
@@ -34,12 +34,6 @@ Requires-Dist: ur_rtde; extra == "ur-cb3"
34
34
  Provides-Extra: franka
35
35
  Requires-Dist: franky-control<3,>=2.0; extra == "franka"
36
36
  Requires-Dist: websockets>=15; extra == "franka"
37
- Provides-Extra: franka56
38
- Requires-Dist: franky-control==2.0.0+libfranka.0.13.3; extra == "franka56"
39
- Requires-Dist: websockets>=15; extra == "franka56"
40
- Provides-Extra: panda
41
- Requires-Dist: franky-control==2.0.0+libfranka.0.9.2; extra == "panda"
42
- Requires-Dist: websockets>=15; extra == "panda"
43
37
  Provides-Extra: gripper
44
38
  Requires-Dist: minimalmodbus; extra == "gripper"
45
39
  Dynamic: license-file
@@ -90,8 +84,8 @@ requires a realtime host.
90
84
  | UR CB3 | `uv pip install 'roboapi[ur-cb3,gripper]'` |
91
85
  | UR e-Series | `uv pip install 'roboapi[gripper]'` |
92
86
  | Franka FR3, system 5.9+ | `uv pip install 'roboapi[franka,gripper]'` |
93
- | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka56,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` |
94
- | Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[panda,gripper]' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` |
87
+ | Franka FR3, system 5.6.0 | `uv pip install 'roboapi[franka,gripper]' 'franky-control==2.0.0+libfranka.0.13.3' --index https://timschneider42.github.io/franky/whl/libfranka-0.13.3/` |
88
+ | Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[franka,gripper]' 'franky-control==2.0.0+libfranka.0.9.2' --index https://timschneider42.github.io/franky/whl/libfranka-0.9.2/` |
95
89
 
96
90
  UR e-Series additionally needs its native runtime built on the host:
97
91
 
@@ -20,6 +20,7 @@ docs/releases/v0.3.0.md
20
20
  docs/releases/v0.4.0.md
21
21
  docs/releases/v0.4.1.md
22
22
  docs/releases/v0.4.2.md
23
+ docs/releases/v0.4.3.md
23
24
  docs/zh-CN/DESIGN.md
24
25
  docs/zh-CN/README.md
25
26
  frontend/BRAND.md
@@ -12,16 +12,8 @@ tyro<2,>=1.0.16
12
12
  franky-control<3,>=2.0
13
13
  websockets>=15
14
14
 
15
- [franka56]
16
- franky-control==2.0.0+libfranka.0.13.3
17
- websockets>=15
18
-
19
15
  [gripper]
20
16
  minimalmodbus
21
17
 
22
- [panda]
23
- franky-control==2.0.0+libfranka.0.9.2
24
- websockets>=15
25
-
26
18
  [ur-cb3]
27
19
  ur_rtde
@@ -5,7 +5,9 @@ import pytest
5
5
 
6
6
  from roboapi.config import WorkspaceConfig
7
7
  from roboapi.errors import ControlNotReady
8
- from roboapi.geometry import FrameAdapter, xyzrpy_to_pose7
8
+ from roboapi.geometry import FrameAdapter, obs_pose, xyzrpy_to_pose7
9
+ from roboapi.hardware.franka.ik import solve_feedback_leashed_ik
10
+ from roboapi.hardware.franka.settings import IKConfig
9
11
  from roboapi.policy import ActionChunk
10
12
  from roboapi.semantics import ACTION_DT, HOME_POSE7
11
13
 
@@ -106,3 +108,48 @@ def test_limit_does_not_fault_on_actual_tracking_error_during_run(make_runner):
106
108
  assert runner.emb.arm.get_eef_pose()[0] == pytest.approx(0.47)
107
109
  finally:
108
110
  runner._mode = "idle"
111
+
112
+
113
+ @pytest.mark.parametrize("enabled", [False, True])
114
+ def test_franka_decelerates_through_nullspace_change_with_or_without_wall(make_runner, monkeypatch, enabled):
115
+ runner = make_runner()
116
+ runner.cfg.workspace = WorkspaceConfig(enabled=enabled)
117
+ arm = runner.emb.arm.native
118
+ servo = arm.servo_pose
119
+ config = IKConfig(posture_max_velocity=0.1)
120
+ q = np.zeros(7)
121
+ previous = np.array([2.0, 0, 0, 0, 0, 0, 0])
122
+ samples = []
123
+
124
+ def sample_ik(pose, twist, **kwargs):
125
+ nonlocal q, previous
126
+ # A moving arm's redundant direction changes while the requested path stops.
127
+ angle = 0.0 if not samples else 0.2
128
+ jacobian = np.hstack([np.eye(6), np.zeros((6, 1))])
129
+ jacobian[0, [0, 6]] = 0.5 * np.array([np.cos(angle), np.sin(angle)])
130
+ null_direction = np.array([-np.sin(angle), 0, 0, 0, 0, 0, np.cos(angle)])
131
+ solved = solve_feedback_leashed_ik(
132
+ q=q, current_pose7=obs_pose(arm.get_eef_pose()), target_pose7=obs_pose(pose),
133
+ target_twist=twist, jacobian=jacobian,
134
+ lower_limits=np.full(7, -3.0), upper_limits=np.full(7, 3.0),
135
+ dt=config.nominal_dt, config=config, previous_dq=previous,
136
+ )
137
+ assert np.all(np.abs(solved.dq - previous)
138
+ <= np.asarray(config.max_joint_acceleration) * config.nominal_dt + 1e-8)
139
+ samples.append((pose[0], twist[0], abs(float(null_direction @ solved.dq))))
140
+ previous = solved.dq
141
+ q = q + solved.dq * config.nominal_dt
142
+ servo(pose, twist, **kwargs)
143
+
144
+ monkeypatch.setattr(arm, "servo_pose", sample_ik)
145
+ targets = np.tile(HOME_POSE7, (17, 1))
146
+ targets[:, 0] = [0.46, 0.50, 0.54] + [0.58] * 14
147
+ result = runner.apply_action(ActionChunk(targets, np.ones(len(targets)), 0.0, "test"))
148
+ assert result["executed"] == len(targets) and not result["aborted"]
149
+ assert samples[1][2] > config.posture_max_velocity
150
+ assert samples[-1][2] <= config.posture_max_velocity + 1e-8
151
+ if enabled:
152
+ np.testing.assert_allclose([x for x, _, _ in samples[1:]], 0.47)
153
+ assert all(v <= 0 for _, v, _ in samples[1:])
154
+ else:
155
+ assert samples[-1][0] == pytest.approx(0.58)