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.
- {roboapi-0.4.2 → roboapi-0.4.3}/PKG-INFO +3 -9
- {roboapi-0.4.2 → roboapi-0.4.3}/README.md +2 -2
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/development.md +12 -5
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/installation.md +9 -6
- roboapi-0.4.3/docs/releases/v0.4.3.md +14 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/pyproject.toml +1 -23
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/ik.py +20 -7
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/PKG-INFO +3 -9
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/SOURCES.txt +1 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/requires.txt +0 -8
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_workspace.py +48 -1
- {roboapi-0.4.2 → roboapi-0.4.3}/uv.lock +42 -116
- {roboapi-0.4.2 → roboapi-0.4.3}/.python-version +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/DESIGN.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/LICENSE +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/MANIFEST.in +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/NOTICE +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/calibration.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/model-api.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/naming.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.2.10.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.2.11.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.2.8.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.2.9.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.3.0.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.4.0.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.4.1.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/releases/v0.4.2.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/repository-rename.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/zh-CN/DESIGN.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/docs/zh-CN/README.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/BRAND.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/asset-provenance.json +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/index.html +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/package-lock.json +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/package.json +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Bundler-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Inter-OFL.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Lucide-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Meshoptimizer-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/PokeBrand-NOTICE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/React-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/public/assets/Three-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/App.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/App.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/api.test.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/api.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/brand/Inter-Variable.ttf +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/brand/MiSans-Regular.woff2 +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/brand/MiSans-Semibold.woff2 +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/brand/logo-1.png +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/calibration/README.md +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/calibration/home-reference.png +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/assets/calibration/robotiq-ace-pro-2.glb +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/cameraStream.test.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/cameraStream.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Brand.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationDialog.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationDialog.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationIllustration.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationIllustration.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CalibrationScene.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CameraView.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/CameraView.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/DevicesDialog.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Dialog.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/DirectionCheckDialog.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/DirectionCheckDialog.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Icon.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/InstructionPanel.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/LogsPanel.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Notification.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/Popover.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/PresetChips.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/PresetChips.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/PresetsPanel.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/RunInfoDialog.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/SettingsPanel.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/SettingsPanel.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/StopButton.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/StorageSettings.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/StorageSettings.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/TaskHistory.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/TaskHistory.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/WorkspaceSettings.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/WorkspaceSettings.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration/camera-lens.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration/direction-motion.test.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration/direction-motion.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration/locking-pins.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/components/calibration.css +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/format.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/i18n.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/main.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/naming.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/naming.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/notifications.test.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/notifications.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/pages/RunPage.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/pages/SettingsPage.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/pages/SettingsPage.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/styles.css +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/test/fixtures.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/test/mockCamera.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/test/setup.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/useCameraPreview.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/useCameraPreview.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/usePolling.test.tsx +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/src/usePolling.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/tsconfig.json +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/frontend/vite.config.ts +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/__init__.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/calibration/__init__.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/calibration/profile.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/calibration/session.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/cli.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/config/__init__.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/config/loader.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/config/models.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/embodiment.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/errors.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/geometry.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/__init__.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/base.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/camera.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/__init__.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/arm.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/desk.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/feedback.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/guiding.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/limits.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/franka/settings.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/robotiq.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/__init__.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/build.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/compliant.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/dashboard.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/feedback.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/ipc.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/CMakeLists.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/dependencies.lock.json +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/cartesian_speedl.hpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/control_loop.hpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/geom.hpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/motion_primitives.hpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/robot_io.hpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/include/ur_cpp/streaming_pose.hpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/src/control_loop.cpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/src/robot_io_urcl.cpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/tests/cartesian_speedl_unit.cpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/tests/control_modes_unit.cpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/tests/streaming_pose_unit.cpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/tests/velocity_governor_unit.cpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/native/worker.cpp +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/position.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/hardware/ur/settings.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/images.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/initialize.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/mcp.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/motion.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/naming.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/operations.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/policy/__init__.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/policy/client.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/policy/protocol.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/policy/settings.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/product-names.json +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/records.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/runtime.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/semantics.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/tasks.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/__init__.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/presets.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/server.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Bundler-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/CalibrationScene-BO_spRoL.js +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Inter-OFL.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Inter-Variable-c8O0ljhh.ttf +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Lucide-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Meshoptimizer-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/MiSans-Regular-ES4DrbaF.woff2 +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/MiSans-Semibold-B34HIk9C.woff2 +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/PokeBrand-NOTICE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/React-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/Three-LICENSE.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/home-reference-CTpf8-oV.png +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/index-CGLhpUm0.js +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/index-QXqV-fDC.css +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/assets/robotiq-ace-pro-2-EJuoOXTy.glb +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi/web/static/index.html +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/dependency_links.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/entry_points.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/roboapi.egg-info/top_level.txt +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/setup.cfg +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_calibration.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_chunk_boundary.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_cli.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_config.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_direction_check.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_initialize.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_instruction_pending.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_mcp.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_monitor_error_clear.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_motion.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_naming.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_policy.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_preview.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_runtime.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_sessions.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_storage.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_task_runtime.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_task_web.py +0 -0
- {roboapi-0.4.2 → roboapi-0.4.3}/tests/test_tasks.py +0 -0
- {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.
|
|
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[
|
|
94
|
-
| Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[
|
|
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[
|
|
48
|
-
| Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[
|
|
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
|
-
|
|
24
|
-
|
|
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
|
|
70
|
+
on Linux with the matching SDK build:
|
|
70
71
|
|
|
71
72
|
```sh
|
|
72
|
-
uv
|
|
73
|
-
uv
|
|
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[
|
|
46
|
-
| Franka Panda 4.2.1–4.x | `uv pip install 'roboapi[
|
|
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
|
-
|
|
49
|
-
|
|
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+**);
|
|
116
|
-
|
|
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.
|
|
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
|
|
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
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
524
|
-
|
|
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.
|
|
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[
|
|
94
|
-
| Franka Panda, system 4.2.1–4.x | `uv pip install 'roboapi[
|
|
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
|
|
|
@@ -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)
|