Skip to content

build(deps): bump the python group across 1 directory with 76 updates - #3244

Closed
dependabot[bot] wants to merge 2 commits into
mainfrom
dependabot/uv/python-591991ea65
Closed

build(deps): bump the python group across 1 directory with 76 updates#3244
dependabot[bot] wants to merge 2 commits into
mainfrom
dependabot/uv/python-591991ea65

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Jul 28, 2026

Copy link
Copy Markdown
Contributor

Bumps the python group with 74 updates in the / directory:

Package From To
pin 3.8.0 4.1.0
reactivex 4.1.0 5.0.0
pydantic 2.12.5 2.13.4
packaging 25.0 26.2
filelock 3.23.0 3.31.2
plum-dispatch 2.5.7 2.9.0
structlog 25.5.0 26.1.0
opencv-contrib-python 4.13.0.92 5.0.0.93
pydantic-settings 2.12.0 2.14.2
textual 3.7.1 8.2.8
terminaltexteffects 0.12.2 0.15.0
typer 0.23.1 0.27.0
numba 0.63.1 0.66.0
rerun-sdk 0.32.0 0.34.1
protobuf 6.33.5 7.35.1
cryptography 46.0.5 49.0.0
python-multipart 0.0.27 0.0.32
ipykernel 7.2.0 7.3.0
timm 1.0.24 1.0.28
open-clip-torch 3.2.0 3.3.0
gdown 6.0.0 6.1.0
tensorboard 2.20.0 2.21.0
xarm-python-sdk 1.17.3 1.18.4
portal 3.7.4 3.8.1
pyarrow 23.0.0 25.0.0
langchain-core 1.3.3 1.5.0
langchain-openai 1.1.6 1.3.5
langchain-huggingface 1.2.0 1.2.2
langchain-ollama 1.0.1 1.1.0
ollama 0.6.1 0.6.2
fastapi 0.129.0 0.139.2
sse-starlette 3.2.0 3.4.6
uvicorn 0.40.0 0.51.0
soundfile 0.13.1 0.14.0
ultralytics 8.4.14 8.4.103
pillow 12.2.0 12.3.0
lap 0.5.12 0.5.13
transformers[torch] 4.53.3 5.14.1
moondream 0.2.0 1.3.0
omegaconf 2.3.0 2.3.1
hydra-core 1.3.2 1.3.4
cyclonedds 0.10.5 11.0.1
mcap 1.3.1 1.4.0
pin-pink 4.2.0 4.3.0
pyrealsense2-extended 2.58.1.10581.post1 2.58.3.10794.post1
matplotlib 3.10.8 3.10.9
roboplan 0.0.100 0.5.1
onnxruntime 1.24.1 1.24.3
cupy-cuda12x 13.6.0 14.1.1
onnxruntime-gpu 1.24.1 1.24.3
mujoco 3.5.0 3.10.0
gtsam-extended 4.3a1.post1 4.3a1.post202607020747
aiortc 1.14.0 1.15.0
aiohttp 3.14.1 3.14.2
reportlab 4.5.0 5.0.0
manifold3d 3.5.1 3.5.2
usd-core 26.5 26.8
ruff 0.14.3 0.15.22
torch 2.10.0 2.13.0
pytest 8.3.5 9.1.1
pytest-asyncio 0.26.0 1.4.0
pytest-mock 3.15.0 3.15.1
pytest-env 1.1.5 1.6.0
coverage 7.13.4 7.15.2
pre-commit 4.2.0 4.6.0
py-spy 0.4.1 0.4.2
maturin 1.13.3 1.14.1
python-lsp-ruff 2.3.0 2.3.1
mypy 1.19.0 2.3.0
ipython 8.38.0 8.39.0
python-socketio 5.16.1 5.16.3
types-pyyaml 6.0.12.20250915 6.0.12.20260518
types-reportlab 4.5.0.20260509 4.5.1.20260712
types-requests 2.32.4.20260107 2.33.0.20260712

Updates pin from 3.8.0 to 4.1.0

Changelog

Sourced from pin's changelog.

[4.1.0] - 2026-07-07

Added

  • URDF v1.2 support (#2909):
    • Capsule geometry parsed directly as CAPSULE collision/visual shape
    • Extended joint limits: acceleration, jerk read from URDF v1.2 <limit> element
      • New ModelTpl fields: lowerAccelerationLimit, upperAccelerationLimit, lowerJerkLimit, upperJerkLimit (tangent-space vectors, default -inf/+inf)
      • Extended ModelTpl::addJoint overload to accept min_acceleration, max_acceleration, min_jerk, max_jerk parameters
  • Add PINOCCHIO_BUILD_BINDING_WITH_PCH CMake option to use PCH to build Python bindings (default OFF) (#2886)
  • Add PINOCCHIO_BUILD_VISUALIZERS option (#2900)

Fixed

  • Use _WIN32 definition instead of WIN32 (#2900)
  • Remove extra } in modernize_target_link_libraries function (#2900)
  • Fix loadFromStringStream unable to parse -inf/+inf values (broke Python pickle of models with acceleration/jerk limits) (#2909)
  • Fix Viser visualizer: apply URDF <mesh scale> to mesh vertices instead of scaling the link translation (#2878)
  • Fix build issue with g++ 12 (#2890)
  • Fix useless memory allocation in Python checkers (#2897 and #2907)
  • Fix Eigen 5 support (#2886)

Changed

  • nix: switch to flakoboros (#2882)
  • CMake: optionalize DOXYGEN_USE_MATHJAX (default to OFF) (#2915)

[4.0.0] - 2026-04-13

Highlights

  • lcaba algorithm:
    • Compute forward dynamics for constrained system with closed kinematics loops
    • Python example here
  • New constraint API:
    • PointContactConstraintModelTpl, PointAnchorConstraintModelTpl, FrameAnchorConstraintModelTpl, JointLimitConstraintModelTpl and JointFrictionConstraintModelTpl constraint models
    • Each constraint model is associated to its own constraint data
    • Variants ConstraintModelTpl/ConstraintDataTpl encapsulate all constraints models and data
    • Delassus operator API: DelassusOperatorDenseTpl, DelassusOperatorSparseTpl, DelassusOperatorCholeskyExpressionTpl, DelassusOperatorRigidBodyTpl
    • These operators are tightly linked to the new constraints API All these operators compute the same mathematical operator $J M^{-1} J^T$ ($J$ is the constraints jacobian, $M^{-1}$ is the inverse of the mass matrix), but with different algorithms and internal optimizations
  • ADMMConstraintSolverTpl and PGSConstraintSolverTpl algorithms:
    • Solve constrained dynamics expressed with the new constraint API
    • Python examples here and here. These examples show how to use each constraint model, how to build a constraint problem, how to compute the associated Delassus operator and how to solve it
  • New header convention
    • Introduce omnibus headers:

... (truncated)

Commits

Updates reactivex from 4.1.0 to 5.0.0

Release notes

Sourced from reactivex's releases.

v5.0.0

See CHANGELOG.md for details.

v5.0.0rc2

See CHANGELOG.md for details.

v5.0.0a2

What's Changed

Full Changelog: ReactiveX/RxPY@v5.0.0a1...v5.0.0a2

v5.0.0a1

What's Changed

New Contributors

Full Changelog: ReactiveX/RxPY@v4.1.0...v5.0.0a1

Changelog

Sourced from reactivex's changelog.

5.0.0 - 2026-07-20

🐞 Bug Fixes

  • (scripts) Keep uv.lock in sync and scope the version sed to [project] (#802) (10ccc0a3)

View changes on Github

5.0.0-rc.2 - 2026-07-20

🐞 Bug Fixes

  • (operators) Reset retry budget per subscription to fix retry+repeat (#765) (c3f19d5e)

View changes on Github

5.0.0-rc.1 - 2026-04-20

View changes on Github

  • Typing: Added Action and StartableFactory to reactivex.typing.__all__, making them part of the explicit public API surface.
  • Docs: Added missing docstring to on_error_resume_next operator.
  • Operators: Fixed scheduler forwarding in pairwise, to_marbles, and delay_with_mapper (subscription-delay path). These operators now pass the scheduler argument through to source.subscribe(...) and, in the case of delay_with_mapper, to the subscription-delay observable, consistent with all other pipeable operators. Closes #480 (partial — the operators listed in the issue that were not yet fixed).
  • CI: Skip tests/test_scheduler/test_mainloop/test_tkinterscheduler.py on PyPy (all platforms). The module creates a Tk root at import time; PyPy's _tkinter finalizer calls threading.notify_all during interpreter shutdown and aborts the xdist worker, failing whichever unrelated test was running. Previously guarded only on macOS+PyPy.
  • Fix: reactivex.timer(duetime, period) now correctly resets the initial delay on each resubscription (e.g. via repeat()). Previously nonlocal duetime in the subscribe closure mutated the shared outer variable so subsequent subscriptions would use the stale absolute time computed by the first subscription, causing the timer to fire immediately instead of waiting for duetime. Fixes #697.
  • Testing: Fixed pyright strict-mode type errors in tests/test_subject/ (added type annotations to closure containers, callback function parameters, and narrowed None checks). Removed tests/test_subject/ from the pyright exclude list.
  • Testing: Fixed ruff lint issues in tests/test_scheduler/ (import ordering, f-string upgrades, object base class removal) and removed it from the ruff exclude list. tests/test_subject/ also removed from the ruff exclude list as it already passed all checks.
  • Testing: Fixed pyright (standard-mode) type errors in tests/test_scheduler/: corrected @classmethod overrides of VirtualTimeScheduler.add, fixed [None]-typed list variables, updated optional-import suppression

... (truncated)

Commits
  • 730face chore: release reactivex@5.0.0 (#801)
  • 10ccc0a fix(scripts): keep uv.lock in sync and scope the version sed to [project] (#802)
  • 8cf7630 ci: release 5.0.0 as stable instead of a release candidate (#800)
  • 2f02f00 chore: release reactivex@5.0.0-rc.2 (#799)
  • 915311e test: add tests for the exclusive() operator (#788)
  • ef4815f ci: upgrade ShipIt to 3.0.1, tag releases, and clear Dependabot alerts (#798)
  • a9d2ad3 docs: fix and improve docstrings in groupbyuntil, publishvalue, and tomarbles...
  • 41fcbb7 ci(deps): bump the github-actions group across 1 directory with 6 updates (#797)
  • bee51e4 docs: fix occured typo in run.py docstrings (#793)
  • e1ead24 ci: upgrade gh-aw to v0.71.5 and disable repo-assist schedule (#792)
  • Additional commits viewable in compare view

Updates pydantic from 2.12.5 to 2.13.4

Release notes

Sourced from pydantic's releases.

v2.13.4 2026-05-06

v2.13.4 (2026-05-06)

What's Changed

Packaging

Fixes

Full Changelog: pydantic/pydantic@v2.13.3...v2.13.4

v2.13.3 2026-04-20

v2.13.3 (2026-04-20)

What's Changed

Fixes

Full Changelog: pydantic/pydantic@v2.13.2...v2.13.3

v2.13.2 2026-04-17

v2.13.2 (2026-04-17)

What's Changed

Fixes

  • Fix ValidationInfo.field_name missing with model_validate_json() by @​Viicos in #13084

Full Changelog: pydantic/pydantic@v2.13.1...v2.13.2

v2.13.1 2026-04-15

v2.13.1 (2026-04-15)

What's Changed

Fixes

Full Changelog: pydantic/pydantic@v2.13.0...v2.13.1

v2.13.0 2026-04-13

... (truncated)

Changelog

Sourced from pydantic's changelog.

v2.13.4 (2026-05-06)

GitHub release

What's Changed

Packaging

Fixes

v2.13.3 (2026-04-20)

GitHub release

What's Changed

Fixes

v2.13.2 (2026-04-17)

GitHub release

What's Changed

Fixes

  • Fix ValidationInfo.field_name missing with model_validate_json() by @​Viicos in #13084

v2.13.1 (2026-04-15)

GitHub release

What's Changed

Fixes

v2.13.0 (2026-04-13)

GitHub release

The highlights of the v2.13 release are available in the blog post.

... (truncated)

Commits
  • cf67d4b Fix linting
  • f0d8a21 Prepare release v2.13.4
  • 5e3fe1d Check for pydantic tag pattern in CI
  • 7f9edcc Document tagging conventions
  • b46a0c9 Adapt pydantic-core linker flags on macOS
  • 50629c8 Update to PyPy 7.3.22
  • 8522ebb Preserve RootModel core metadata
  • a37f3af Adapt MISSING sentinel test to work with unreleased typing_extensions ver...
  • 909259a Remove Logfire example in documentation
  • 2c4174c Bump libc from 0.2.155 to 0.2.185
  • Additional commits viewable in compare view

Updates packaging from 25.0 to 26.2

Release notes

Sourced from packaging's releases.

26.2

What's Changed

Fixes:

Documentation:

Internal:

New Contributors

Full Changelog: pypa/packaging@26.1...26.2

26.1

Features:

Behavior adaptations:

... (truncated)

Changelog

Sourced from packaging's changelog.

26.2 - 2026-04-24


Fixes:
  • Fix incorrect sysconfig var name for pyemscripten in (:pull:1160)
  • Make Version, Specifier, SpecifierSet, Tag, Marker, and Requirement pickle-safe
    and backward-compatible with pickles created in 25.0-26.1 (including references to the removed
    packaging._structures module) (:pull:1163, :pull:1168, :pull:1170, :pull:1171)
  • Re-export ExceptionGroup in metadata for now in (:pull:1164)

Documentation:

  • Add errors section and fix missing details in (:pull:1159)
  • Document our property-based test suite in (:pull:1167)
  • Fix a DirectUrl typo in (:pull:1169)
  • Add example of is_unsatisfiable in (:pull:1166)

Internal:

  • Enable the auditor persona on zizmor in (:pull:1158)
  • Test new pickle guarantees in (:pull:1174)
  • Use new native ReadTheDocs uv integration in (:pull:1175)

26.1 - 2026-04-14

Features:

  • PEP 783: add handling for Emscripten wheel tags in (:pull:804) (old name used in implementation, fixed in next release)
  • PEP 803: add handling for the abi3.abi3t free-threading tag in (:pull:1099)
  • PEP 735: add packaging.dependency_groups module, based on the dependency-groups package in (:pull:1065)
  • Add the packaging.direct_url module in (:pull:944)
  • Add the packaging.errors module in (:pull:1071)
  • Add SpecifierSet.is_unsatisfiable using ranges (new internals that will be expanded in future versions) in (:pull:1119)
  • Add create_compatible_tags_selector to select compatible tags in (:pull:1110)
  • Add a key argument to SpecifierSet.filter() in (:pull:1068)
  • Support & and | for Marker's in (:pull:1146)
  • Normalize Version.__replace__ and add Version.from_parts in (:pull:1078)
  • Add an option to validate compressed tag set sort order in parse_wheel_filename in (:pull:1150)

Behavior adaptations:

  • Narrow exclusion of pre-releases for <V.postN to match spec in (:pull:1140)
  • Narrow exclusion of post-releases for >V to match spec in (:pull:1141)
  • Rename format_full_version to _format_full_version to make it visibly private in (:pull:1125)
  • Restrict local version to ASCII in (:pull:1102)

Pylock (PEP 751) updates:

... (truncated)

Commits

Updates filelock from 3.23.0 to 3.31.2

Release notes

Sourced from filelock's releases.

3.31.2

What's Changed

Full Changelog: tox-dev/filelock@3.31.1...3.31.2

3.31.1

What's Changed

Full Changelog: tox-dev/filelock@3.31.0...3.31.1

3.31.0

What's Changed

Full Changelog: tox-dev/filelock@3.30.3...3.31.0

3.30.3

What's Changed

New Contributors

Full Changelog: tox-dev/filelock@3.30.2...3.30.3

3.30.2

What's Changed

Full Changelog: tox-dev/filelock@3.30.1...3.30.2

... (truncated)

Changelog

Sourced from filelock's changelog.

########### Changelog ###########

.. towncrier-draft-entries:: Unreleased

.. towncrier release notes start


3.32.1 (2026-07-26)


  • Canceling an AsyncSoftReadWriteLock acquire now releases the claim instead of leaking a marker whose heartbeat wedges every contender. :pr:686

3.32.0 (2026-07-21)


  • SoftReadWriteLock closes the directory handle it opens to scan for readers as soon as a scan stops early, rather than holding it until the generator is collected. :pr:685
  • Declare support for Python 3.15 and run the test suite against it and its free-threaded build, both currently in beta. :pr:683
  • The source distribution ships the capability probes the tests import, and reading one no longer needs coverage installed, so the suite runs from an unpacked sdist instead of failing on a missing coverage_pragmas. :pr:685

3.31.2 (2026-07-21)


  • filelock imports again on runtimes whose errno omits ENOTSUP, such as GraalPy, where importing the package raised ImportError. It probes the code instead, preferring ENOTSUP, falling back to EOPNOTSUPP where that name is absent, and dropping to ENOSYS/EXDEV where neither exists. Platforms defining ENOTSUP keep their behavior. :pr:681

3.31.1 (2026-07-20)


  • A SoftFileLease acquired on one thread keeps its claim when another thread fails to acquire the same lease object, so its heartbeat carries on refreshing the marker instead of being torn down and letting a peer take the live claim. :pr:680

3.31.0 (2026-07-18)


  • Support Termux/Android, whose CPython ships without os.link and reports sys.platform == "android". import filelock and both FileLock and SoftFileLock now work there, StrictSoftFileLock reports its missing hard-link support only when acquired, and process liveness reads /proc on Android instead of PID-only checks. :pr:678
  • StrictSoftFileLock no longer lets two processes hold the lock at once under heavy contention. A holder now keeps its intent claim for the whole hold, so a contender whose directory scan races the holder's freshly linked claim can no

... (truncated)

Commits
  • caeb1c9 Release 3.31.2
  • 60eda0f 🐛 fix(strict): tolerate an errno without ENOTSUP (#681)
  • c1b2e6f Release 3.31.1
  • 9fd7de5 scope a lease's claim to the context that acquired it (#680)
  • 2b3ad2c ♻️ refactor(coverage): key exclusions on probed capability (#679)
  • 3b66fdc Release 3.31.0
  • 166b2b5 ✨ feat(platform): support Termux/Android (#678)
  • 51bca89 Release 3.30.3
  • fc27700 asyncio: scope the reentrant-deadlock registry to the owning task (#676)
  • 8699861 📝 docs(mermaid): follow the light and dark theme toggle (#674)
  • Additional commits viewable in compare view

Updates plum-dispatch from 2.5.7 to 2.9.0

Release notes

Sourced from plum-dispatch's releases.

v2.9.0

  • Support union aliases in Python 3.14 and later (@​nstarman).

v2.8.0

Starting this release, Plum will be available on PyPI as both plum-dispatch and plum.

v2.7.1

  • Add faithful keyword to ModuleType.

v2.7.0

Note: All imports should now go through plum directly! That is, not plum.signature.Signature, but plum.Signature. Please do open an issue if this release breaks something that shouldn't break.

Changes:

v2.6.1

This release features numerous very helpful contributions and improvements by @​nstarman!

  • Use dependency groups (#195).
  • Treat typing_extensions as standard library and make more use of it (#226 and #232).
  • Complete deprecation cycles (#230 and #236).
  • Turn various arguments into positional-only (#229).
  • Remove unnecessary path manipulation (#233).
  • Rework tests with a dispatch fixture (#234).
  • Avoid using a deprecated NumPy module (#231).
  • Drops support for Python 3.9 (#228).
  • Import exports from methods.py (#237).
  • Fixes an incorrect overload (#238).
  • Use nox for testing (#235 and #240).

#228 also fixes an important bug to do with the handling of unions (CC @​davidwyld).

v2.6.0

  • Add keyword argument condition to ModuleType.

v2.5.8

  • Fix precedence keyword argument (thanks @​nstarman!).
  • Fix complex method override.
  • Drop support for Python 8 and use e.g. list instead of typing.List (thanks @​nstarman!).
Commits
  • 485380d Minor style and linter changes
  • 28f5a4a Minor style changes
  • b85f8e7 Remove duplicate sections
  • 863138d Enable py3.14 and deprecate some alias functionality (#225)
  • ad54d37 build(deps-dev): bump uv from 0.9.16 to 0.11.6 (#265)
  • 562f3e2 build(deps-dev): bump pytest from 9.0.2 to 9.0.3 (#267)
  • 6b239db build(deps): bump cryptography from 46.0.6 to 46.0.7 (#264)
  • 0ddc2db Potential fix for code scanning alert no. 3: Workflow does not contain permis...
  • d4581ce Potential fix for code scanning alert no. 2: Workflow does not contain permis...
  • 3dd2386 Potential fix for code scanning alert no. 8: Workflow does not contain permis...
  • Additional commits viewable in compare view

Updates structlog from 25.5.0 to 26.1.0

Release notes

Sourced from structlog's releases.

26.1.0

Highlights

Given how long this release took, it's pretty thicc with nice things all over the board! Apologies for the long release cycle; it's been a victim of the slopocalypse and me trying to navigate my way thru the new normal. Extra big thanks to my sponsors for not abandoning me in these unironically trying times. ❤️

Full changelog below!

Special Thanks

This release would not be possible without my generous sponsors! Thank you to all of you making sustainable maintenance possible! If you would like to join them, go to https://github.com/sponsors/hynek and check out the sweet perks!

Above and Beyond

Variomedia AG (@variomedia), Tidelift (@tidelift), Kraken Tech (@kraken-tech), Klaviyo (@klaviyo), Privacy Solutions GmbH (@privacy-solutions), FilePreviews (@filepreviews), Ecosystems (@ecosyste-ms), TestMu AI Open Source Office (Formerly LambdaTest) (@LambdaTest-Inc), GitHub (@github), Doist (@Doist), Daniel Fortunov (@asqui), and Kevin P. Fleming (@kpfleming).

Maintenance Sustainers

Buttondown (@buttondown), Christopher Dignam (@chdsbd), Magnus Watn (@magnuswatn), David Cramer (@dcramer), Rivo Laks (@rivol), Polar (@polarsource), Mike Fiedler (@miketheman), Duncan Hill (@cricalix), Colin Marquardt (@cmarqu), Pieter Swinkels (@swinkels), Nick Libertini (@libertininick), Brian M. Dennis (@crossjam), Al Sweigart (@asweigart), Celebrity News AG (@celebritynewsag), The Westervelt Company (@westerveltco), Sławomir Ehlert (@slafs), Mostafa Khalil (@khadrawy), Filip Mularczyk (@mukiblejlok), Thomas Klinger (@thmsklngr), Andreas Poehlmann (@ap--), August Trapper Bigelow (@atbigelow), Carlton Gibson (@carltongibson), and Roboflow (@roboflow).

Full Changelog

Removed

  • Python 3.8 and 3.9 support.

Deprecated

  • Support for better-exceptions is deprecated and will be removed within a year. Use our Rich integration or copy-paste the one line of code you need. #802

Added

  • Python 3.15 support. #813

  • structlog.dev.rich_monochrome_traceback for Rich-based monochrome exception rendering and add support for it throughout structlog.dev.ConsoleRenderer when the user asks for no colors. #794

  • structlog.BytesLogger now has a name attribute which allows you to use it with the structlog.stdlib.add_logger_name() processor without using the standard library integration. #786

  • structlog.processors.CallsiteParameterAdder now supports CallsiteParameter.QUAL_MODULE that adds the qualified import name of the module of the callsite, or __main__ if the module is the entry point. This is only available for structlog-originated events since the standard library has no equivalent (except for the convention of setting the logger's name to __name__). #812

  • structlog.stdlib.BoundLogger now has is_enabled_for() and get_effective_level() methods that are snake_case aliases for its isEnabledFor() and getEffectiveLevel() methods. This makes it more compatible with the native structlog.typing.FilteringBoundLogger, so you can swap configurations without changing your call sites. #818

Changed

  • structlog.dev.ConsoleRenderer does not warn anymore when the exception key has a rendered value despite having a fancy formatter configured. #790

... (truncated)

Changelog

Sourced from structlog's changelog.

26.1.0 - 2026-06-06

Removed

  • Python 3.8 and 3.9 support.

Deprecated

  • Support for better-exceptions is deprecated and will be removed within a year. Use our Rich integration or copy-paste the one line of code you need. #802

Added

  • Python 3.15 support. #813

  • structlog.dev.rich_monochrome_traceback for Rich-based monochrome exception rendering and add support for it throughout Description has been truncated

---
updated-dependencies:
- dependency-name: pin
  dependency-version: 4.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: reactivex
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: pydantic
  dependency-version: 2.13.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: packaging
  dependency-version: '26.2'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: filelock
  dependency-version: 3.31.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: plum-dispatch
  dependency-version: 2.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: structlog
  dependency-version: 26.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: opencv-contrib-python
  dependency-version: 5.0.0.93
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: pydantic-settings
  dependency-version: 2.14.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: textual
  dependency-version: 8.2.8
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: terminaltexteffects
  dependency-version: 0.15.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: typer
  dependency-version: 0.27.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: numba
  dependency-version: 0.66.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: llvmlite
  dependency-version: 0.48.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: rerun-sdk
  dependency-version: 0.34.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: protobuf
  dependency-version: 7.35.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: cryptography
  dependency-version: 49.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: python-multipart
  dependency-version: 0.0.32
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: ipykernel
  dependency-version: 7.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: timm
  dependency-version: 1.0.28
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: open-clip-torch
  dependency-version: 3.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: gdown
  dependency-version: 6.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: tensorboard
  dependency-version: 2.21.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: xarm-python-sdk
  dependency-version: 1.18.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: portal
  dependency-version: 3.8.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: pyarrow
  dependency-version: 25.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: langchain-core
  dependency-version: 1.5.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: langchain-openai
  dependency-version: 1.3.5
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: langchain-huggingface
  dependency-version: 1.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: langchain-ollama
  dependency-version: 1.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: ollama
  dependency-version: 0.6.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: openai
  dependency-version: 2.46.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: fastapi
  dependency-version: 0.139.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: sse-starlette
  dependency-version: 3.4.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: uvicorn
  dependency-version: 0.51.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: soundfile
  dependency-version: 0.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: ultralytics
  dependency-version: 8.4.103
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: pillow
  dependency-version: 12.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: lap
  dependency-version: 0.5.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: transformers[torch]
  dependency-version: 5.14.1
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: moondream
  dependency-version: 1.3.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: omegaconf
  dependency-version: 2.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: hydra-core
  dependency-version: 1.3.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: cyclonedds
  dependency-version: 11.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: mcap
  dependency-version: 1.4.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: pin-pink
  dependency-version: 4.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: pyrealsense2-extended
  dependency-version: 2.58.3.10794.post1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: matplotlib
  dependency-version: 3.10.9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: roboplan
  dependency-version: 0.5.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: onnxruntime
  dependency-version: 1.24.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: cupy-cuda12x
  dependency-version: 14.1.1
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: onnxruntime-gpu
  dependency-version: 1.24.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: mujoco
  dependency-version: 3.10.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: gtsam-extended
  dependency-version: 4.3a1.post202607020747
  dependency-type: direct:production
  dependency-group: python
- dependency-name: aiortc
  dependency-version: 1.15.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: aiohttp
  dependency-version: 3.14.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: reportlab
  dependency-version: 5.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: manifold3d
  dependency-version: 3.5.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: usd-core
  dependency-version: '26.8'
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: ruff
  dependency-version: 0.15.22
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: torch
  dependency-version: 2.13.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: pytest
  dependency-version: 9.1.1
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: pytest-asyncio
  dependency-version: 1.4.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: pytest-mock
  dependency-version: 3.15.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: pytest-env
  dependency-version: 1.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: coverage
  dependency-version: 7.15.2
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: pre-commit
  dependency-version: 4.6.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: py-spy
  dependency-version: 0.4.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: maturin
  dependency-version: 1.14.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: python-lsp-ruff
  dependency-version: 2.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: mypy
  dependency-version: 2.3.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: python
- dependency-name: ipython
  dependency-version: 8.39.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
- dependency-name: python-socketio
  dependency-version: 5.16.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: types-pyyaml
  dependency-version: 6.0.12.20260518
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: types-reportlab
  dependency-version: 4.5.1.20260712
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: python
- dependency-name: types-requests
  dependency-version: 2.33.0.20260712
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: python
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code labels Jul 28, 2026
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code labels Jul 28, 2026
@github-actions github-actions Bot added the backport:skip Skip creating a backport to any release branches label Jul 28, 2026
@codecov

codecov Bot commented Jul 28, 2026

Copy link
Copy Markdown

❌ 14 Tests Failed:

Tests completed Failed Passed Skipped
3122 14 3108 176
View the top 3 failed test(s) by shortest run time
::dimos.control.tasks.eef_twist_task.test_eef_twist_task
Stack Traces | 0s run time
ImportError while importing test module '.../tasks/eef_twist_task/test_eef_twist_task.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
.../tasks/eef_twist_task/test_eef_twist_task.py:24: in <module>
    from dimos.control.tasks.eef_twist_task.eef_twist_task import EEFTwistTask, EEFTwistTaskConfig
.../tasks/eef_twist_task/eef_twist_task.py:24: in <module>
    import pinocchio
.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12.../site-packages/pinocchio/__init__.py:19: in <module>
    from .pinocchio_pywrap_default import *
E   ImportError: libtinyxml2.so.11: cannot open shared object file: No such file or directory
dimos.utils.cli.cameracalibrate.test_cameracalibrate::test_calibrate_from_frames_fisheye_recovers_K_near_truth_and_emits_four_coeffs
Stack Traces | 0.01s run time
def test_calibrate_from_frames_fisheye_recovers_K_near_truth_and_emits_four_coeffs() -> None:
        """Synthetic fisheye projections recover ``K`` close to truth and yield 4 dist coeffs."""
        cols, rows = 9, 6
        width, height = 1280, 720
        square_size_m = 0.025
        frames, image_points, K_true, _D_true = _synthetic_fisheye_image_points(
            cols=cols,
            rows=rows,
            width=width,
            height=height,
            square_size_m=square_size_m,
            count=15,
        )
    
>       out = calibrate_from_frames(
            frames,
            cols,
            rows,
            square_size_m,
            pattern_hint=(cols, rows, "requested inner corners"),
            image_points_hint=image_points,
            distortion_model=DistortionModel.fisheye,
        )

K_true     = array([[        400,           0,         640],
       [          0,         400,         360],
       [          0,           0,           1]])
_D_true    = array([      -0.05,        0.01,           0,           0])
cols       = 9
frames     = [array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0..., ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8), ...]
height     = 720
image_points = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
rows       = 6
square_size_m = 0.025
width      = 1280

.../cli/cameracalibrate/test_cameracalibrate.py:728: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../cli/cameracalibrate/cameracalibrate.py:785: in calibrate_from_frames
    rms, K, D = _calibrate_fisheye(objpoints, imgpoints, (w0, h0))
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        actual_cols = 9
        actual_rows = 6
        cols       = 9
        corners_found = array([[[     657.38,      344.51]],

       [[     674.04,      346.19]],

       [[     690.73,      347.89]],

    ...     747.28,       437.8]],

       [[     763.18,      439.14]],

       [[     778.77,      440.36]]], dtype=float32)
        distortion_model = <DistortionModel.fisheye: 'fisheye'>
        f          = array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8)
        first      = array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8)
        frame      = array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8)
        frames     = [array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0..., ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8), ...]
        h0         = 720
        i          = 14
        image_points_hint = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
        imgpoints  = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
        model      = <DistortionModel.fisheye: 'fisheye'>
        objp_flat  = array([[          0,           0,           0],
       [      0.025,           0,           0],
       [       0.05,  ...    0],
       [      0.175,       0.125,           0],
       [        0.2,       0.125,           0]], dtype=float32)
        objp_view  = array([[[          0,           0,           0]],

       [[      0.025,           0,           0]],

       [[       ...,

       [[      0.175,       0.125,           0]],

       [[        0.2,       0.125,           0]]], dtype=float32)
        objpoints  = [array([[[          0,           0,           0]],

       [[      0.025,           0,           0]],

       [[      ...    [[      0.175,       0.125,           0]],

       [[        0.2,       0.125,           0]]], dtype=float32), ...]
        pattern_hint = (9, 6, 'requested inner corners')
        pattern_label = 'requested inner corners'
        rows       = 6
        square_size_m = 0.025
        w0         = 1280
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

objpoints = [array([[[          0,           0,           0]],

       [[      0.025,           0,           0]],

       [[      ...    [[      0.175,       0.125,           0]],

       [[        0.2,       0.125,           0]]], dtype=float32), ...]
imgpoints = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
image_size = (1280, 720)

    def _calibrate_fisheye(
        objpoints: list[np.ndarray],
        imgpoints: list[np.ndarray],
        image_size: tuple[int, int],
    ) -> tuple[float, np.ndarray, np.ndarray]:
        """Run ``cv2.fisheye.calibrate`` (4-coeff Kannala-Brandt).
    
        ``objpoints`` must be a list of ``(N, 1, 3)`` arrays and ``imgpoints`` a list of
        ``(N, 1, 2)`` arrays (the fisheye solver is strict about the extra middle axis).
        """
        K = np.zeros((3, 3), dtype=np.float64)
        D = np.zeros((4, 1), dtype=np.float64)
        n_views = len(objpoints)
        rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for _ in range(n_views)]
        tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for _ in range(n_views)]
>       flags = cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC | cv2.fisheye.CALIB_FIX_SKEW
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E       AttributeError: module 'cv2.fisheye' has no attribute 'CALIB_RECOMPUTE_EXTRINSIC'

D          = array([[          0],
       [          0],
       [          0],
       [          0]])
K          = array([[          0,           0,           0],
       [          0,           0,           0],
       [          0,           0,           0]])
image_size = (1280, 720)
imgpoints  = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
n_views    = 15
objpoints  = [array([[[          0,           0,           0]],

       [[      0.025,           0,           0]],

       [[      ...    [[      0.175,       0.125,           0]],

       [[        0.2,       0.125,           0]]], dtype=float32), ...]
rvecs      = [array([[[          0,           0,           0]]]), array([[[          0,           0,           0]]]), array([[[    ...    0]]]), array([[[          0,           0,           0]]]), array([[[          0,           0,           0]]]), ...]
tvecs      = [array([[[          0,           0,           0]]]), array([[[          0,           0,           0]]]), array([[[    ...    0]]]), array([[[          0,           0,           0]]]), array([[[          0,           0,           0]]]), ...]

.../cli/cameracalibrate/cameracalibrate.py:686: AttributeError
dimos.control.tasks.test_registry::test_declared_handlers_exist_on_task_classes
Stack Traces | 0.013s run time
def test_declared_handlers_exist_on_task_classes() -> None:
        checked = 0
        for task_type in control_task_registry.available():
            bindings = control_task_registry.bindings_for(task_type)
            if not bindings.consumes:
                continue
>           task_classes = _scannable_task_classes(task_type)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

bindings   = TaskBindings(consumes=(StreamBinding(stream='coordinator_cartesian_command', handler='on_cartesian_command', routing=<Routing.BY_TASK_NAME: 'by_task_name'>),), exposes=frozenset())
checked    = 0
task_type  = 'cartesian_ik'

.../control/tasks/test_registry.py:204: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../control/tasks/test_registry.py:182: in _scannable_task_classes
    module = importlib.import_module(module_name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        _          = 'create_task'
        factory_path = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task:create_task'
        module_name = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        task_type  = 'cartesian_ik'
........./usr/lib/python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        level      = 0
        name       = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        package    = None
<frozen importlib._bootstrap>:1387: in _gcd_import
    ???
        level      = 0
        name       = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        package    = None
<frozen importlib._bootstrap>:1360: in _find_and_load
    ???
        import_    = <function _gcd_import at 0xff8c51bac0e0>
        module     = <object object at 0xff8c51b80060>
        name       = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
<frozen importlib._bootstrap>:1331: in _find_and_load_unlocked
    ???
        child      = 'cartesian_ik_task'
        import_    = <function _gcd_import at 0xff8c51bac0e0>
        name       = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        parent     = 'dimos.control.tasks.cartesian_ik_task'
        parent_module = <module 'dimos.control.tasks.cartesian_ik_task' (namespace) from ['.../control/tasks/cartesian_ik_task']>
        parent_spec = ModuleSpec(name='dimos.control.tasks.cartesian_ik_task', loader=<_frozen_importlib_external.NamespaceLoader object at ...0>, submodule_search_locations=_NamespacePath(['.../control/tasks/cartesian_ik_task']))
        path       = _NamespacePath(['.../control/tasks/cartesian_ik_task'])
        spec       = ModuleSpec(name='dimos.control.tasks.cartesian_ik_task.cartesian_ik_task', loader=<_frozen_importlib_external.SourceFi... at 0xff8aad617590>, origin='.../control/tasks/cartesian_ik_task/cartesian_ik_task.py')
<frozen importlib._bootstrap>:935: in _load_unlocked
    ???
        module     = <module 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task' from '.../control/tasks/cartesian_ik_task/cartesian_ik_task.py'>
        spec       = ModuleSpec(name='dimos.control.tasks.cartesian_ik_task.cartesian_ik_task', loader=<_frozen_importlib_external.SourceFi... at 0xff8aad617590>, origin='.../control/tasks/cartesian_ik_task/cartesian_ik_task.py')
<frozen importlib._bootstrap_external>:995: in exec_module
    ???
        code       = <code object <module> at 0xff8aaddf2500, file ".../control/tasks/cartesian_ik_task/cartesian_ik_task.py", line 1>
        module     = <module 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task' from '.../control/tasks/cartesian_ik_task/cartesian_ik_task.py'>
        self       = <_frozen_importlib_external.SourceFileLoader object at 0xff8aad617590>
<frozen importlib._bootstrap>:488: in _call_with_frames_removed
    ???
        args       = (<code object <module> at 0xff8aaddf2500, file ".../control/tasks/cartesian_ik_task/ca...l.tasks.cartesian_ik_task', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0xff8aad617590>, ...})
        f          = <built-in function exec>
        kwds       = {}
.../tasks/cartesian_ik_task/cartesian_ik_task.py:38: in <module>
    from dimos.manipulation.planning.kinematics.pinocchio_ik import (
        Any        = typing.Any
        BaseControlTask = <class 'dimos.control.task.BaseControlTask'>
        ControlMode = <enum 'ControlMode'>
        CoordinatorState = <class 'dimos.control.task.CoordinatorState'>
        JointCommandOutput = <class 'dimos.control.task.JointCommandOutput'>
        Path       = <class 'pathlib.Path'>
        ResourceClaim = <class 'dimos.control.task.ResourceClaim'>
        TYPE_CHECKING = False
        __builtins__ = <builtins>
        __cached__ = '.../control/tasks/cartesian_ik_task/__pycache__/cartesian_ik_task.cpython-312.pyc'
        __doc__    = 'Cartesian control task with internal Pinocchio IK solver.\n\nAccepts streaming cartesian poses (e.g., from teleoperat...ing)\nand computes inverse kinematics internally to output joint commands.\nParticipates in joint-level arbitration.\n'
        __file__   = '.../control/tasks/cartesian_ik_task/cartesian_ik_task.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff8aad617590>
        __name__   = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        __package__ = 'dimos.control.tasks.cartesian_ik_task'
        __spec__   = ModuleSpec(name='dimos.control.tasks.cartesian_ik_task.cartesian_ik_task', loader=<_frozen_importlib_external.SourceFi... at 0xff8aad617590>, origin='.../control/tasks/cartesian_ik_task/cartesian_ik_task.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        dataclass  = <function dataclass at 0xff8c50f0ff60>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12........./site-packages/numpy/__init__.py'>
        threading  = <module 'threading' from '........./usr/lib/python3.12/threading.py'>
.../planning/kinematics/pinocchio_ik.py:40: in <module>
    import pinocchio
        Any        = typing.Any
        Path       = <class 'pathlib.Path'>
        TYPE_CHECKING = False
        __builtins__ = <builtins>
        __cached__ = '.../kinematics/__pycache__/pinocchio_ik.cpython-312.pyc'
        __doc__    = 'Pinocchio-based inverse kinematics solver.\n\nStandalone IK solver using Pinocchio for forward kinematics and Jacobia...>>> q_solution, converged, error = ik.solve(target_se3, q_init)\n    >>> ee_pose = ik.forward_kinematics(q_solution)\n'
        __file__   = '/home/runner/work/dimos/dimos/.../planning/kinematics/pinocchio_ik.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff8aad615190>
        __name__   = 'dimos.manipulation.planning.kinematics.pinocchio_ik'
        __package__ = 'dimos.manipulation.planning.kinematics'
        __spec__   = ModuleSpec(name='dimos.manipulation.planning.kinematics.pinocchio_ik', loader=<_frozen_importlib_external.SourceFileLo...ject at 0xff8aad615190>, origin='/home/runner/work/dimos/dimos/.../planning/kinematics/pinocchio_ik.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        dataclass  = <function dataclass at 0xff8c50f0ff60>
        norm       = <function norm at 0xff8c3a85e6b0>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12........./site-packages/numpy/__init__.py'>
        solve      = <function solve at 0xff8c3a85caf0>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    #
    # Copyright (c) 2015-2021 CNRS INRIA
    #
    # ruff: noqa: E402, F401, F403, F405
    
    import numpy
    
    # On Windows, if pinocchio.dll is not in the same directory than
    # the .pyd, it will not be loaded.
    # We first try to load pinocchio, then, if it fail and we are on Windows:
    #  1. We add all paths inside PINOCCHIO_WINDOWS_DLL_PATH to DllDirectory
    #  2. If PINOCCHIO_WINDOWS_DLL_PATH we add the relative path from the
    #     package directory to the bin directory to DllDirectory
    # This solution is inspired from:
    #  - https://github..../pull/1511/files
    #  - https://stackoverflow..../questions/65334494/python-c-extension-packaging-dll-along-with-pyd
    # More resources on https://github..../pyobjcryst/issues/33
    try:
>       from .pinocchio_pywrap_default import *
E       ImportError: libtinyxml2.so.11: cannot open shared object file: No such file or directory

__builtins__ = <builtins>
__cached__ = '.../dimos/dimos/.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12.../pinocchio/__pycache__/__init__.cpython-312.pyc'
__doc__    = None
__file__   = '.../dimos/dimos/.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12....../site-packages/pinocchio/__init__.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff8aad6179b0>
__name__   = 'pinocchio'
__package__ = 'pinocchio'
__path__   = ['.../dimos/dimos/.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12/site-packages/pinocchio']
__spec__   = ModuleSpec(name='pinocchio', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff8aad6179b0>, origin='/h....../dimos/dimos/.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12/site-packages/pinocchio'])
numpy      = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12........./site-packages/numpy/__init__.py'>
platform   = <module 'platform' from '........./usr/lib/python3.12/platform.py'>

.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12....../site-packages/pinocchio/__init__.py:19: ImportError
dimos.perception.fiducial.test_marker_transformer::test_detect_markers_rebuilds_intrinsics_without_resetting_smoothing_track
Stack Traces | 0.014s run time
def test_detect_markers_rebuilds_intrinsics_without_resetting_smoothing_track() -> None:
        marker_id = 7
        marker_length_m = 0.18
        image_a = synthetic_marker_image(marker_id=marker_id, ts=15.0)
        image_b = synthetic_marker_image(marker_id=marker_id, ts=15.2)
        info_a = camera_info(image_a.ts)
        info_b = camera_info(image_b.ts)
        info_b.K = info_b.K.copy()
        info_b.P = info_b.P.copy()
        info_b.K[0] = info_b.K[4] = 900.0
        info_b.P[0] = info_b.P[5] = 900.0
        latest_info: CameraInfo | None = info_a
    
        obs_a = Observation[Image](
            id=45,
            ts=image_a.ts,
            data_type=Image,
            pose=(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0),
            _data=image_a,
        )
        obs_b = Observation[Image](
            id=46,
            ts=image_b.ts,
            data_type=Image,
            pose=(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0),
            _data=image_b,
        )
        transformer = DetectMarkers(
            camera_info=lambda: latest_info,
            marker_length_m=marker_length_m,
            aruco_dictionary="DICT_APRILTAG_36h11",
            smoothing_window=1.0,
        )
    
>       first = next(transformer(iter([obs_a])))
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

image_a    = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=15.0)
image_b    = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=15.2)
info_a     = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=15.0)
info_b     = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=15.2)
latest_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=15.0)
marker_id  = 7
marker_length_m = 0.18
obs_a      = Observation(id=45, ts=15.0, data_type=<class 'dimos.msgs.sensor_msgs.Image.Image'>, pose_tuple=(0.0, 0.0, 0.0, 0.0, 0....=uint8, frame_id='camera_optical', ts=15.0), _loader=None, _data_lock=<unlocked _thread.lock object at 0xff8aae212040>)
obs_b      = Observation(id=46, ts=15.2, data_type=<class 'dimos.msgs.sensor_msgs.Image.Image'>, pose_tuple=(0.0, 0.0, 0.0, 0.0, 0....=uint8, frame_id='camera_optical', ts=15.2), _loader=None, _data_lock=<unlocked _thread.lock object at 0xff8aae211dc0>)
transformer = #x1B[36mDetectMarkers#x1B[0m(camera_info=<lambda>, marker_length_m=0.18, aruco_dictionary='DICT_APRILTAG_36h11', world_frame='world', smoothing_window=1.0, emit_empty_frames=False, detect_inverted=False)

.../perception/fiducial/test_marker_transformer.py:225: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../perception/fiducial/marker_transformer.py:228: in __call__
    detections = _detect_markers_in_image(
        image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=15.0)
        image_size_mismatch = False
        info       = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=15.0)
        obs        = Observation(id=45, ts=15.0, data_type=<class 'dimos.msgs.sensor_msgs.Image.Image'>, pose_tuple=(0.0, 0.0, 0.0, 0.0, 0....=uint8, frame_id='camera_optical', ts=15.0), _loader=None, _data_lock=<unlocked _thread.lock object at 0xff8aae212040>)
        optical_frame = 'camera_optical'
        pose_tuple = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...)
        self       = #x1B[36mDetectMarkers#x1B[0m(camera_info=<lambda>, marker_length_m=0.18, aruco_dictionary='DICT_APRILTAG_36h11', world_frame='world', smoothing_window=1.0, emit_empty_frames=False, detect_inverted=False)
        t_world_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
        upstream   = <list_iterator object at 0xff8aad5da470>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

image = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=15.0)
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=15.0)
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
marker_length_m = 0.18, aruco_dictionary = 'DICT_APRILTAG_36h11'
world_frame = 'world', detect_inverted = False
detector = < cv2.aruco.ArucoDetector 0xff8aae297d90>
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])

    def detect_markers_in_image(
        image: Image,
        *,
        camera_info: CameraInfo,
        world_T_optical: Transform,
        marker_length_m: float,
        aruco_dictionary: str,
        world_frame: str = "world",
        detect_inverted: bool = False,
        detector: Any | None = None,
        camera_matrix: np.ndarray | None = None,
        dist_coeffs: np.ndarray | None = None,
    ) -> list[Detection3DMarker]:
        """Detect markers in one image and return rich world-frame 3D detections."""
        if marker_length_m <= 0:
            raise ValueError(f"marker_length_m must be > 0, got {marker_length_m}")
        if (
            camera_info.width
            and camera_info.height
            and (image.width != camera_info.width or image.height != camera_info.height)
        ):
            return []
    
        if detector is None:
            detector = create_aruco_detector(aruco_dictionary, detect_inverted=detect_inverted)
        if (camera_matrix is None) != (dist_coeffs is None):
            raise ValueError("camera_matrix and dist_coeffs must be provided together")
        if camera_matrix is None or dist_coeffs is None:
            camera_matrix, dist_coeffs = camera_info_to_cv_matrices(camera_info)
    
        gray = image.to_grayscale().as_numpy()
        corners, ids, _ = detector.detectMarkers(gray)
        if ids is None or len(ids) == 0:
            return []
    
        optical_frame = camera_optical_frame_id(image, camera_info)
        t_world_optical = Transform(
            translation=world_T_optical.translation,
            rotation=world_T_optical.rotation,
            frame_id=world_frame,
            child_frame_id=optical_frame,
            ts=image.ts,
        )
        marker_size = Vector3(marker_length_m, marker_length_m, 0.0)
        detections: list[Detection3DMarker] = []
    
        for corner_set, mid_arr in zip(corners, ids, strict=True):
>           mid = int(mid_arr[0])
                      ^^^^^^^^^^
E           IndexError: invalid index to scalar variable.

_          = (array([[[        341,         149],
        [        383,         151],
        [        381,         193],
        [...  [        402,         212],
        [        403,         239],
        [        375,         240]]], dtype=float32))
aruco_dictionary = 'DICT_APRILTAG_36h11'
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=15.0)
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
corner_set = array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32)
corners    = (array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32),)
detect_inverted = False
detections = []
detector   = < cv2.aruco.ArucoDetector 0xff8aae297d90>
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(480, 640), dtype=uint8)
ids        = array([7], dtype=int32)
image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=15.0)
marker_length_m = 0.18
marker_size = Vector([       0.18        0.18           0])
mid_arr    = np.int32(7)
optical_frame = 'camera_optical'
t_world_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_frame = 'world'

.../perception/fiducial/marker_detect.py:86: IndexError
dimos.perception.fiducial.test_marker_transformer::test_detect_markers_transformer_preserves_observation_context_and_tags
Stack Traces | 0.014s run time
def test_detect_markers_transformer_preserves_observation_context_and_tags() -> None:
        marker_id = 7
        image = synthetic_marker_image(marker_id, ts=12.0)
        obs = Observation[Image](
            id=42,
            ts=image.ts,
            data_type=Image,
            pose=(1.0, 2.0, 3.0, 0.0, 0.0, 0.0, 1.0),
            _data=image,
        )
        transformer = DetectMarkers(
            camera_info=camera_info(image.ts),
            marker_length_m=0.18,
            aruco_dictionary="DICT_APRILTAG_36h11",
        )
    
>       results = list(transformer(iter([obs])))
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=12.0)
marker_id  = 7
obs        = Observation(id=42, ts=12.0, data_type=<class 'dimos.msgs.sensor_msgs.Image.Image'>, pose_tuple=(1.0, 2.0, 3.0, 0.0, 0....=uint8, frame_id='camera_optical', ts=12.0), _loader=None, _data_lock=<unlocked _thread.lock object at 0xff8aaffe6980>)
transformer = #x1B[36mDetectMarkers#x1B[0m(camera_info=CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_op...onary='DICT_APRILTAG_36h11', world_frame='world', smoothing_window=0.0, emit_empty_frames=False, detect_inverted=False)

.../perception/fiducial/test_marker_transformer.py:118: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../perception/fiducial/marker_transformer.py:228: in __call__
    detections = _detect_markers_in_image(
        image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=12.0)
        image_size_mismatch = False
        info       = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=12.0)
        obs        = Observation(id=42, ts=12.0, data_type=<class 'dimos.msgs.sensor_msgs.Image.Image'>, pose_tuple=(1.0, 2.0, 3.0, 0.0, 0....=uint8, frame_id='camera_optical', ts=12.0), _loader=None, _data_lock=<unlocked _thread.lock object at 0xff8aaffe6980>)
        optical_frame = 'camera_optical'
        pose_tuple = (1.0, 2.0, 3.0, 0.0, 0.0, 0.0, ...)
        self       = #x1B[36mDetectMarkers#x1B[0m(camera_info=CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_op...onary='DICT_APRILTAG_36h11', world_frame='world', smoothing_window=0.0, emit_empty_frames=False, detect_inverted=False)
        t_world_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
        upstream   = <list_iterator object at 0xff8aad46de40>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

image = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=12.0)
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=12.0)
world_T_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
marker_length_m = 0.18, aruco_dictionary = 'DICT_APRILTAG_36h11'
world_frame = 'world', detect_inverted = False
detector = < cv2.aruco.ArucoDetector 0xff8aae2b9f50>
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])

    def detect_markers_in_image(
        image: Image,
        *,
        camera_info: CameraInfo,
        world_T_optical: Transform,
        marker_length_m: float,
        aruco_dictionary: str,
        world_frame: str = "world",
        detect_inverted: bool = False,
        detector: Any | None = None,
        camera_matrix: np.ndarray | None = None,
        dist_coeffs: np.ndarray | None = None,
    ) -> list[Detection3DMarker]:
        """Detect markers in one image and return rich world-frame 3D detections."""
        if marker_length_m <= 0:
            raise ValueError(f"marker_length_m must be > 0, got {marker_length_m}")
        if (
            camera_info.width
            and camera_info.height
            and (image.width != camera_info.width or image.height != camera_info.height)
        ):
            return []
    
        if detector is None:
            detector = create_aruco_detector(aruco_dictionary, detect_inverted=detect_inverted)
        if (camera_matrix is None) != (dist_coeffs is None):
            raise ValueError("camera_matrix and dist_coeffs must be provided together")
        if camera_matrix is None or dist_coeffs is None:
            camera_matrix, dist_coeffs = camera_info_to_cv_matrices(camera_info)
    
        gray = image.to_grayscale().as_numpy()
        corners, ids, _ = detector.detectMarkers(gray)
        if ids is None or len(ids) == 0:
            return []
    
        optical_frame = camera_optical_frame_id(image, camera_info)
        t_world_optical = Transform(
            translation=world_T_optical.translation,
            rotation=world_T_optical.rotation,
            frame_id=world_frame,
            child_frame_id=optical_frame,
            ts=image.ts,
        )
        marker_size = Vector3(marker_length_m, marker_length_m, 0.0)
        detections: list[Detection3DMarker] = []
    
        for corner_set, mid_arr in zip(corners, ids, strict=True):
>           mid = int(mid_arr[0])
                      ^^^^^^^^^^
E           IndexError: invalid index to scalar variable.

_          = (array([[[        341,         149],
        [        383,         151],
        [        381,         193],
        [...  [        402,         212],
        [        403,         239],
        [        375,         240]]], dtype=float32))
aruco_dictionary = 'DICT_APRILTAG_36h11'
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=12.0)
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
corner_set = array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32)
corners    = (array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32),)
detect_inverted = False
detections = []
detector   = < cv2.aruco.ArucoDetector 0xff8aae2b9f50>
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(480, 640), dtype=uint8)
ids        = array([7], dtype=int32)
image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=12.0)
marker_length_m = 0.18
marker_size = Vector([       0.18        0.18           0])
mid_arr    = np.int32(7)
optical_frame = 'camera_optical'
t_world_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_T_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_frame = 'world'

.../perception/fiducial/marker_detect.py:86: IndexError
dimos.perception.fiducial.test_marker_transformer::test_detect_markers_transformer_uses_callablecamera_info_source
Stack Traces | 0.014s run time
def test_detect_markers_transformer_uses_callablecamera_info_source() -> None:
        image = synthetic_marker_image(marker_id=7, ts=14.0)
        obs = Observation[Image](
            id=44,
            ts=image.ts,
            data_type=Image,
            pose=(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0),
            _data=image,
        )
        latest_info: CameraInfo | None = None
        transformer = DetectMarkers(
            camera_info=lambda: latest_info,
            marker_length_m=0.18,
            aruco_dictionary="DICT_APRILTAG_36h11",
            emit_empty_frames=True,
        )
    
        assert list(transformer(iter([obs]))) == []
    
        latest_info = camera_info(image.ts)
>       results = list(transformer(iter([obs])))
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=14.0)
latest_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=14.0)
obs        = Observation(id=44, ts=14.0, data_type=<class 'dimos.msgs.sensor_msgs.Image.Image'>, pose_tuple=(0.0, 0.0, 0.0, 0.0, 0....=uint8, frame_id='camera_optical', ts=14.0), _loader=None, _data_lock=<unlocked _thread.lock object at 0xff8ab118e700>)
transformer = #x1B[36mDetectMarkers#x1B[0m(camera_info=<lambda>, marker_length_m=0.18, aruco_dictionary='DICT_APRILTAG_36h11', world_frame='world', smoothing_window=0.0, emit_empty_frames=True, detect_inverted=False)

.../perception/fiducial/test_marker_transformer.py:184: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../perception/fiducial/marker_transformer.py:228: in __call__
    detections = _detect_markers_in_image(
        image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=14.0)
        image_size_mismatch = False
        info       = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=14.0)
        obs        = Observation(id=44, ts=14.0, data_type=<class 'dimos.msgs.sensor_msgs.Image.Image'>, pose_tuple=(0.0, 0.0, 0.0, 0.0, 0....=uint8, frame_id='camera_optical', ts=14.0), _loader=None, _data_lock=<unlocked _thread.lock object at 0xff8ab118e700>)
        optical_frame = 'camera_optical'
        pose_tuple = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...)
        self       = #x1B[36mDetectMarkers#x1B[0m(camera_info=<lambda>, marker_length_m=0.18, aruco_dictionary='DICT_APRILTAG_36h11', world_frame='world', smoothing_window=0.0, emit_empty_frames=True, detect_inverted=False)
        t_world_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
        upstream   = <list_iterator object at 0xff8aadfb6500>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

image = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=14.0)
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=14.0)
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
marker_length_m = 0.18, aruco_dictionary = 'DICT_APRILTAG_36h11'
world_frame = 'world', detect_inverted = False
detector = < cv2.aruco.ArucoDetector 0xff8aae2b2a90>
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])

    def detect_markers_in_image(
        image: Image,
        *,
        camera_info: CameraInfo,
        world_T_optical: Transform,
        marker_length_m: float,
        aruco_dictionary: str,
        world_frame: str = "world",
        detect_inverted: bool = False,
        detector: Any | None = None,
        camera_matrix: np.ndarray | None = None,
        dist_coeffs: np.ndarray | None = None,
    ) -> list[Detection3DMarker]:
        """Detect markers in one image and return rich world-frame 3D detections."""
        if marker_length_m <= 0:
            raise ValueError(f"marker_length_m must be > 0, got {marker_length_m}")
        if (
            camera_info.width
            and camera_info.height
            and (image.width != camera_info.width or image.height != camera_info.height)
        ):
            return []
    
        if detector is None:
            detector = create_aruco_detector(aruco_dictionary, detect_inverted=detect_inverted)
        if (camera_matrix is None) != (dist_coeffs is None):
            raise ValueError("camera_matrix and dist_coeffs must be provided together")
        if camera_matrix is None or dist_coeffs is None:
            camera_matrix, dist_coeffs = camera_info_to_cv_matrices(camera_info)
    
        gray = image.to_grayscale().as_numpy()
        corners, ids, _ = detector.detectMarkers(gray)
        if ids is None or len(ids) == 0:
            return []
    
        optical_frame = camera_optical_frame_id(image, camera_info)
        t_world_optical = Transform(
            translation=world_T_optical.translation,
            rotation=world_T_optical.rotation,
            frame_id=world_frame,
            child_frame_id=optical_frame,
            ts=image.ts,
        )
        marker_size = Vector3(marker_length_m, marker_length_m, 0.0)
        detections: list[Detection3DMarker] = []
    
        for corner_set, mid_arr in zip(corners, ids, strict=True):
>           mid = int(mid_arr[0])
                      ^^^^^^^^^^
E           IndexError: invalid index to scalar variable.

_          = (array([[[        341,         149],
        [        383,         151],
        [        381,         193],
        [...  [        402,         212],
        [        403,         239],
        [        375,         240]]], dtype=float32))
aruco_dictionary = 'DICT_APRILTAG_36h11'
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=14.0)
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
corner_set = array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32)
corners    = (array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32),)
detect_inverted = False
detections = []
detector   = < cv2.aruco.ArucoDetector 0xff8aae2b2a90>
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(480, 640), dtype=uint8)
ids        = array([7], dtype=int32)
image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=14.0)
marker_length_m = 0.18
marker_size = Vector([       0.18        0.18           0])
mid_arr    = np.int32(7)
optical_frame = 'camera_optical'
t_world_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_frame = 'world'

.../perception/fiducial/marker_detect.py:86: IndexError
dimos.perception.fiducial.test_marker_transformer::test_detect_markers_in_image_builds_rich_marker_detection
Stack Traces | 0.015s run time
def test_detect_markers_in_image_builds_rich_marker_detection() -> None:
        marker_id = 7
        marker_length_m = 0.18
        image = synthetic_marker_image(marker_id)
        info = camera_info(image.ts)
    
>       detections = detect_markers_in_image(
            image,
            camera_info=info,
            world_T_optical=world_T_optical(image.ts),
            marker_length_m=marker_length_m,
            aruco_dictionary="DICT_APRILTAG_36h11",
        )

image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
info       = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0)
marker_id  = 7
marker_length_m = 0.18

.../perception/fiducial/test_marker_transformer.py:36: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

image = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0)
world_T_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
marker_length_m = 0.18, aruco_dictionary = 'DICT_APRILTAG_36h11'
world_frame = 'world', detect_inverted = False
detector = < cv2.aruco.ArucoDetector 0xff8aae2c1510>
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])

    def detect_markers_in_image(
        image: Image,
        *,
        camera_info: CameraInfo,
        world_T_optical: Transform,
        marker_length_m: float,
        aruco_dictionary: str,
        world_frame: str = "world",
        detect_inverted: bool = False,
        detector: Any | None = None,
        camera_matrix: np.ndarray | None = None,
        dist_coeffs: np.ndarray | None = None,
    ) -> list[Detection3DMarker]:
        """Detect markers in one image and return rich world-frame 3D detections."""
        if marker_length_m <= 0:
            raise ValueError(f"marker_length_m must be > 0, got {marker_length_m}")
        if (
            camera_info.width
            and camera_info.height
            and (image.width != camera_info.width or image.height != camera_info.height)
        ):
            return []
    
        if detector is None:
            detector = create_aruco_detector(aruco_dictionary, detect_inverted=detect_inverted)
        if (camera_matrix is None) != (dist_coeffs is None):
            raise ValueError("camera_matrix and dist_coeffs must be provided together")
        if camera_matrix is None or dist_coeffs is None:
            camera_matrix, dist_coeffs = camera_info_to_cv_matrices(camera_info)
    
        gray = image.to_grayscale().as_numpy()
        corners, ids, _ = detector.detectMarkers(gray)
        if ids is None or len(ids) == 0:
            return []
    
        optical_frame = camera_optical_frame_id(image, camera_info)
        t_world_optical = Transform(
            translation=world_T_optical.translation,
            rotation=world_T_optical.rotation,
            frame_id=world_frame,
            child_frame_id=optical_frame,
            ts=image.ts,
        )
        marker_size = Vector3(marker_length_m, marker_length_m, 0.0)
        detections: list[Detection3DMarker] = []
    
        for corner_set, mid_arr in zip(corners, ids, strict=True):
>           mid = int(mid_arr[0])
                      ^^^^^^^^^^
E           IndexError: invalid index to scalar variable.

_          = (array([[[        341,         149],
        [        383,         151],
        [        381,         193],
        [...  [        402,         212],
        [        403,         239],
        [        375,         240]]], dtype=float32))
aruco_dictionary = 'DICT_APRILTAG_36h11'
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0)
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
corner_set = array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32)
corners    = (array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32),)
detect_inverted = False
detections = []
detector   = < cv2.aruco.ArucoDetector 0xff8aae2c1510>
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(480, 640), dtype=uint8)
ids        = array([7], dtype=int32)
image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
marker_length_m = 0.18
marker_size = Vector([       0.18        0.18           0])
mid_arr    = np.int32(7)
optical_frame = 'camera_optical'
t_world_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_T_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_frame = 'world'

.../perception/fiducial/marker_detect.py:86: IndexError
dimos.control.tasks.test_registry::test_declared_task_factory_paths_resolve
Stack Traces | 0.016s run time
def test_declared_task_factory_paths_resolve() -> None:
        for name, factory_path in sorted(control_task_registry._factory_paths.items()):
            module_name, attr = factory_path.split(":", maxsplit=1)
            try:
>               module = importlib.import_module(module_name)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

attr       = 'create_task'
factory_path = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task:create_task'
module_name = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
name       = 'cartesian_ik'

.../control/tasks/test_registry.py:94: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
........./usr/lib/python3.12/importlib/__init__.py:90: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        level      = 0
        name       = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        package    = None
<frozen importlib._bootstrap>:1387: in _gcd_import
    ???
        level      = 0
        name       = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        package    = None
<frozen importlib._bootstrap>:1360: in _find_and_load
    ???
        import_    = <function _gcd_import at 0xff8c51bac0e0>
        module     = <object object at 0xff8c51b80060>
        name       = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
<frozen importlib._bootstrap>:1331: in _find_and_load_unlocked
    ???
        child      = 'cartesian_ik_task'
        import_    = <function _gcd_import at 0xff8c51bac0e0>
        name       = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        parent     = 'dimos.control.tasks.cartesian_ik_task'
        parent_module = <module 'dimos.control.tasks.cartesian_ik_task' (namespace) from ['.../control/tasks/cartesian_ik_task']>
        parent_spec = ModuleSpec(name='dimos.control.tasks.cartesian_ik_task', loader=<_frozen_importlib_external.NamespaceLoader object at ...0>, submodule_search_locations=_NamespacePath(['.../control/tasks/cartesian_ik_task']))
        path       = _NamespacePath(['.../control/tasks/cartesian_ik_task'])
        spec       = ModuleSpec(name='dimos.control.tasks.cartesian_ik_task.cartesian_ik_task', loader=<_frozen_importlib_external.SourceFi... at 0xff8ab02a0080>, origin='.../control/tasks/cartesian_ik_task/cartesian_ik_task.py')
<frozen importlib._bootstrap>:935: in _load_unlocked
    ???
        module     = <module 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task' from '.../control/tasks/cartesian_ik_task/cartesian_ik_task.py'>
        spec       = ModuleSpec(name='dimos.control.tasks.cartesian_ik_task.cartesian_ik_task', loader=<_frozen_importlib_external.SourceFi... at 0xff8ab02a0080>, origin='.../control/tasks/cartesian_ik_task/cartesian_ik_task.py')
<frozen importlib._bootstrap_external>:995: in exec_module
    ???
        code       = <code object <module> at 0xff8aaddf2120, file ".../control/tasks/cartesian_ik_task/cartesian_ik_task.py", line 1>
        module     = <module 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task' from '.../control/tasks/cartesian_ik_task/cartesian_ik_task.py'>
        self       = <_frozen_importlib_external.SourceFileLoader object at 0xff8ab02a0080>
<frozen importlib._bootstrap>:488: in _call_with_frames_removed
    ???
        args       = (<code object <module> at 0xff8aaddf2120, file ".../control/tasks/cartesian_ik_task/ca...l.tasks.cartesian_ik_task', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0xff8ab02a0080>, ...})
        f          = <built-in function exec>
        kwds       = {}
.../tasks/cartesian_ik_task/cartesian_ik_task.py:38: in <module>
    from dimos.manipulation.planning.kinematics.pinocchio_ik import (
        Any        = typing.Any
        BaseControlTask = <class 'dimos.control.task.BaseControlTask'>
        ControlMode = <enum 'ControlMode'>
        CoordinatorState = <class 'dimos.control.task.CoordinatorState'>
        JointCommandOutput = <class 'dimos.control.task.JointCommandOutput'>
        Path       = <class 'pathlib.Path'>
        ResourceClaim = <class 'dimos.control.task.ResourceClaim'>
        TYPE_CHECKING = False
        __builtins__ = <builtins>
        __cached__ = '.../control/tasks/cartesian_ik_task/__pycache__/cartesian_ik_task.cpython-312.pyc'
        __doc__    = 'Cartesian control task with internal Pinocchio IK solver.\n\nAccepts streaming cartesian poses (e.g., from teleoperat...ing)\nand computes inverse kinematics internally to output joint commands.\nParticipates in joint-level arbitration.\n'
        __file__   = '.../control/tasks/cartesian_ik_task/cartesian_ik_task.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff8ab02a0080>
        __name__   = 'dimos.control.tasks.cartesian_ik_task.cartesian_ik_task'
        __package__ = 'dimos.control.tasks.cartesian_ik_task'
        __spec__   = ModuleSpec(name='dimos.control.tasks.cartesian_ik_task.cartesian_ik_task', loader=<_frozen_importlib_external.SourceFi... at 0xff8ab02a0080>, origin='.../control/tasks/cartesian_ik_task/cartesian_ik_task.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        dataclass  = <function dataclass at 0xff8c50f0ff60>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12........./site-packages/numpy/__init__.py'>
        threading  = <module 'threading' from '........./usr/lib/python3.12/threading.py'>
.../planning/kinematics/pinocchio_ik.py:40: in <module>
    import pinocchio
        Any        = typing.Any
        Path       = <class 'pathlib.Path'>
        TYPE_CHECKING = False
        __builtins__ = <builtins>
        __cached__ = '.../kinematics/__pycache__/pinocchio_ik.cpython-312.pyc'
        __doc__    = 'Pinocchio-based inverse kinematics solver.\n\nStandalone IK solver using Pinocchio for forward kinematics and Jacobia...>>> q_solution, converged, error = ik.solve(target_se3, q_init)\n    >>> ee_pose = ik.forward_kinematics(q_solution)\n'
        __file__   = '/home/runner/work/dimos/dimos/.../planning/kinematics/pinocchio_ik.py'
        __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff8ab02a33b0>
        __name__   = 'dimos.manipulation.planning.kinematics.pinocchio_ik'
        __package__ = 'dimos.manipulation.planning.kinematics'
        __spec__   = ModuleSpec(name='dimos.manipulation.planning.kinematics.pinocchio_ik', loader=<_frozen_importlib_external.SourceFileLo...ject at 0xff8ab02a33b0>, origin='/home/runner/work/dimos/dimos/.../planning/kinematics/pinocchio_ik.py')
        annotations = _Feature((3, 7, 0, 'beta', 1), None, 16777216)
        dataclass  = <function dataclass at 0xff8c50f0ff60>
        norm       = <function norm at 0xff8c3a85e6b0>
        np         = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12........./site-packages/numpy/__init__.py'>
        solve      = <function solve at 0xff8c3a85caf0>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

    #
    # Copyright (c) 2015-2021 CNRS INRIA
    #
    # ruff: noqa: E402, F401, F403, F405
    
    import numpy
    
    # On Windows, if pinocchio.dll is not in the same directory than
    # the .pyd, it will not be loaded.
    # We first try to load pinocchio, then, if it fail and we are on Windows:
    #  1. We add all paths inside PINOCCHIO_WINDOWS_DLL_PATH to DllDirectory
    #  2. If PINOCCHIO_WINDOWS_DLL_PATH we add the relative path from the
    #     package directory to the bin directory to DllDirectory
    # This solution is inspired from:
    #  - https://github..../pull/1511/files
    #  - https://stackoverflow..../questions/65334494/python-c-extension-packaging-dll-along-with-pyd
    # More resources on https://github..../pyobjcryst/issues/33
    try:
>       from .pinocchio_pywrap_default import *
E       ImportError: libtinyxml2.so.11: cannot open shared object file: No such file or directory

__builtins__ = <builtins>
__cached__ = '.../dimos/dimos/.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12.../pinocchio/__pycache__/__init__.cpython-312.pyc'
__doc__    = None
__file__   = '.../dimos/dimos/.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12....../site-packages/pinocchio/__init__.py'
__loader__ = <_frozen_importlib_external.SourceFileLoader object at 0xff8ae91b1970>
__name__   = 'pinocchio'
__package__ = 'pinocchio'
__path__   = ['.../dimos/dimos/.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12/site-packages/pinocchio']
__spec__   = ModuleSpec(name='pinocchio', loader=<_frozen_importlib_external.SourceFileLoader object at 0xff8ae91b1970>, origin='/h....../dimos/dimos/.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12/site-packages/pinocchio'])
numpy      = <module 'numpy' from '.../dimos/dimos/.venv/lib/python3.12........./site-packages/numpy/__init__.py'>
platform   = <module 'platform' from '........./usr/lib/python3.12/platform.py'>

.venv/lib/python3.12/site-packages/cmeel.prefix/lib/python3.12....../site-packages/pinocchio/__init__.py:19: ImportError
dimos.utils.cli.cameracalibrate.test_cameracalibrate::test_cli_distortion_model_fisheye_writes_equidistant_yaml_and_four_coeffs
Stack Traces | 0.034s run time
tmp_path = PosixPath('.../pytest-0/popen-gw0/test_cli_distortion_model_fish0')

    def test_cli_distortion_model_fisheye_writes_equidistant_yaml_and_four_coeffs(
        tmp_path: Path,
    ) -> None:
        """``--distortion-model fisheye`` produces a YAML with the ROS-canonical name."""
        cols, rows = 9, 6
        frames, image_points, _K_true, _D_true = _synthetic_fisheye_image_points(
            cols=cols, rows=rows, count=15
        )
        images_dir = tmp_path / "fisheye_frames"
        images_dir.mkdir()
        for i, frame in enumerate(frames):
            assert cv2.imwrite(str(images_dir / f"{i:02d}.png"), frame)
    
        # The folder source has no chessboard corners in the synthetic dummies, so route
        # through calibrate_from_frames directly to exercise the YAML emit path.
        out_path = tmp_path / "fisheye.yaml"
>       cal = calibrate_from_frames(
            frames,
            cols,
            rows,
            0.025,
            pattern_hint=(cols, rows, "requested inner corners"),
            image_points_hint=image_points,
            distortion_model=DistortionModel.fisheye,
        )

_D_true    = array([      -0.05,        0.01,           0,           0])
_K_true    = array([[        400,           0,         640],
       [          0,         400,         360],
       [          0,           0,           1]])
cols       = 9
frame      = array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8)
frames     = [array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0..., ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8), ...]
i          = 14
image_points = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
images_dir = PosixPath('.../pytest-0/popen-gw0/test_cli_distortion_model_fish0/fisheye_frames')
out_path   = PosixPath('.../pytest-0/popen-gw0/test_cli_distortion_model_fish0/fisheye.yaml')
rows       = 6
tmp_path   = PosixPath('.../pytest-0/popen-gw0/test_cli_distortion_model_fish0')

.../cli/cameracalibrate/test_cameracalibrate.py:772: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
.../cli/cameracalibrate/cameracalibrate.py:785: in calibrate_from_frames
    rms, K, D = _calibrate_fisheye(objpoints, imgpoints, (w0, h0))
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        actual_cols = 9
        actual_rows = 6
        cols       = 9
        corners_found = array([[[     657.38,      344.51]],

       [[     674.04,      346.19]],

       [[     690.73,      347.89]],

    ...     747.28,       437.8]],

       [[     763.18,      439.14]],

       [[     778.77,      440.36]]], dtype=float32)
        distortion_model = <DistortionModel.fisheye: 'fisheye'>
        f          = array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8)
        first      = array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8)
        frame      = array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8)
        frames     = [array([[0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0..., ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0]], shape=(720, 1280), dtype=uint8), ...]
        h0         = 720
        i          = 14
        image_points_hint = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
        imgpoints  = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
        model      = <DistortionModel.fisheye: 'fisheye'>
        objp_flat  = array([[          0,           0,           0],
       [      0.025,           0,           0],
       [       0.05,  ...    0],
       [      0.175,       0.125,           0],
       [        0.2,       0.125,           0]], dtype=float32)
        objp_view  = array([[[          0,           0,           0]],

       [[      0.025,           0,           0]],

       [[       ...,

       [[      0.175,       0.125,           0]],

       [[        0.2,       0.125,           0]]], dtype=float32)
        objpoints  = [array([[[          0,           0,           0]],

       [[      0.025,           0,           0]],

       [[      ...    [[      0.175,       0.125,           0]],

       [[        0.2,       0.125,           0]]], dtype=float32), ...]
        pattern_hint = (9, 6, 'requested inner corners')
        pattern_label = 'requested inner corners'
        rows       = 6
        square_size_m = 0.025
        w0         = 1280
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

objpoints = [array([[[          0,           0,           0]],

       [[      0.025,           0,           0]],

       [[      ...    [[      0.175,       0.125,           0]],

       [[        0.2,       0.125,           0]]], dtype=float32), ...]
imgpoints = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
image_size = (1280, 720)

    def _calibrate_fisheye(
        objpoints: list[np.ndarray],
        imgpoints: list[np.ndarray],
        image_size: tuple[int, int],
    ) -> tuple[float, np.ndarray, np.ndarray]:
        """Run ``cv2.fisheye.calibrate`` (4-coeff Kannala-Brandt).
    
        ``objpoints`` must be a list of ``(N, 1, 3)`` arrays and ``imgpoints`` a list of
        ``(N, 1, 2)`` arrays (the fisheye solver is strict about the extra middle axis).
        """
        K = np.zeros((3, 3), dtype=np.float64)
        D = np.zeros((4, 1), dtype=np.float64)
        n_views = len(objpoints)
        rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for _ in range(n_views)]
        tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for _ in range(n_views)]
>       flags = cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC | cv2.fisheye.CALIB_FIX_SKEW
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E       AttributeError: module 'cv2.fisheye' has no attribute 'CALIB_RECOMPUTE_EXTRINSIC'

D          = array([[          0],
       [          0],
       [          0],
       [          0]])
K          = array([[          0,           0,           0],
       [          0,           0,           0],
       [          0,           0,           0]])
image_size = (1280, 720)
imgpoints  = [array([[[     621.68,      371.87]],

       [[     636.96,       368.2]],

       [[     652.13,      364.55]],

   ...70.42,      428.71]],

       [[     786.14,      424.64]],

       [[      801.3,       420.6]]], dtype=float32), ...]
n_views    = 15
objpoints  = [array([[[          0,           0,           0]],

       [[      0.025,           0,           0]],

       [[      ...    [[      0.175,       0.125,           0]],

       [[        0.2,       0.125,           0]]], dtype=float32), ...]
rvecs      = [array([[[          0,           0,           0]]]), array([[[          0,           0,           0]]]), array([[[    ...    0]]]), array([[[          0,           0,           0]]]), array([[[          0,           0,           0]]]), ...]
tvecs      = [array([[[          0,           0,           0]]]), array([[[          0,           0,           0]]]), array([[[    ...    0]]]), array([[[          0,           0,           0]]]), array([[[          0,           0,           0]]]), ...]

.../cli/cameracalibrate/cameracalibrate.py:686: AttributeError
dimos.perception.fiducial.test_marker_transformer::test_detect_markers_in_image_needs_detect_inverted_for_negative_tags
Stack Traces | 0.038s run time
def test_detect_markers_in_image_needs_detect_inverted_for_negative_tags() -> None:
        image = synthetic_marker_image(7, inverted=True)
        kwargs = {
            "camera_info": camera_info(image.ts),
            "world_T_optical": world_T_optical(image.ts),
            "marker_length_m": 0.18,
            "aruco_dictionary": "DICT_APRILTAG_36h11",
        }
    
        assert detect_markers_in_image(image, **kwargs) == []
    
>       detections = detect_markers_in_image(image, detect_inverted=True, **kwargs)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
kwargs     = {'camera_info': CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0), '...uaternion(0.000000, 0.000000, 0.000000, 1.000000)), 'marker_length_m': 0.18, 'aruco_dictionary': 'DICT_APRILTAG_36h11'}

.../perception/fiducial/test_marker_transformer.py:97: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

image = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0)
world_T_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
marker_length_m = 0.18, aruco_dictionary = 'DICT_APRILTAG_36h11'
world_frame = 'world', detect_inverted = True
detector = < cv2.aruco.ArucoDetector 0xff8aae2a0e50>
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])

    def detect_markers_in_image(
        image: Image,
        *,
        camera_info: CameraInfo,
        world_T_optical: Transform,
        marker_length_m: float,
        aruco_dictionary: str,
        world_frame: str = "world",
        detect_inverted: bool = False,
        detector: Any | None = None,
        camera_matrix: np.ndarray | None = None,
        dist_coeffs: np.ndarray | None = None,
    ) -> list[Detection3DMarker]:
        """Detect markers in one image and return rich world-frame 3D detections."""
        if marker_length_m <= 0:
            raise ValueError(f"marker_length_m must be > 0, got {marker_length_m}")
        if (
            camera_info.width
            and camera_info.height
            and (image.width != camera_info.width or image.height != camera_info.height)
        ):
            return []
    
        if detector is None:
            detector = create_aruco_detector(aruco_dictionary, detect_inverted=detect_inverted)
        if (camera_matrix is None) != (dist_coeffs is None):
            raise ValueError("camera_matrix and dist_coeffs must be provided together")
        if camera_matrix is None or dist_coeffs is None:
            camera_matrix, dist_coeffs = camera_info_to_cv_matrices(camera_info)
    
        gray = image.to_grayscale().as_numpy()
        corners, ids, _ = detector.detectMarkers(gray)
        if ids is None or len(ids) == 0:
            return []
    
        optical_frame = camera_optical_frame_id(image, camera_info)
        t_world_optical = Transform(
            translation=world_T_optical.translation,
            rotation=world_T_optical.rotation,
            frame_id=world_frame,
            child_frame_id=optical_frame,
            ts=image.ts,
        )
        marker_size = Vector3(marker_length_m, marker_length_m, 0.0)
        detections: list[Detection3DMarker] = []
    
        for corner_set, mid_arr in zip(corners, ids, strict=True):
>           mid = int(mid_arr[0])
                      ^^^^^^^^^^
E           IndexError: invalid index to scalar variable.

_          = (array([[[        353,         246],
        [        368,         245],
        [        369,         261],
        [...  [        368,         163],
        [        369,         178],
        [        354,         179]]], dtype=float32))
aruco_dictionary = 'DICT_APRILTAG_36h11'
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0)
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
corner_set = array([[[        209,         130],
        [        429,         129],
        [        430,         349],
        [        210,         350]]], dtype=float32)
corners    = (array([[[        209,         130],
        [        429,         129],
        [        430,         349],
        [        210,         350]]], dtype=float32),)
detect_inverted = True
detections = []
detector   = < cv2.aruco.ArucoDetector 0xff8aae2a0e50>
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(480, 640), dtype=uint8)
ids        = array([7], dtype=int32)
image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
marker_length_m = 0.18
marker_size = Vector([       0.18        0.18           0])
mid_arr    = np.int32(7)
optical_frame = 'camera_optical'
t_world_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_T_optical = Transform(translation=Vector([          1           2           3]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_frame = 'world'

.../perception/fiducial/marker_detect.py:86: IndexError
dimos.perception.fiducial.test_marker_detection_stream_module::test_marker_detection_stream_pipeline_outputs_arrays_for_marker_and_empty_frame
Stack Traces | 0.113s run time
def test_marker_detection_stream_pipeline_outputs_arrays_for_marker_and_empty_frame() -> None:
        marker_id = 7
        marker_length_m = 0.18
        marker_image = synthetic_marker_image(marker_id, ts=10.0)
        empty_image = blank_image(ts=11.0)
    
        module = MarkerDetectionStreamModule(
            marker_length_m=marker_length_m,
            camera_info=camera_info(marker_image.ts),
            quality_window_s=0.01,
        )
        try:
            with MemoryStore() as store:
                stream = store.stream("color_image", Image)
                stream.append(
                    marker_image,
                    ts=marker_image.ts,
                    pose=(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0),
                )
                stream.append(
                    empty_image,
                    ts=empty_image.ts,
                    pose=(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0),
                )
    
>               outputs = [obs.data for obs in module.pipeline(stream).to_list()]
                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

empty_image = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=11.0)
marker_id  = 7
marker_image = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
marker_length_m = 0.18
module     = <dimos.perception.fiducial.marker_detection_stream_module.MarkerDetectionStreamModule object at 0xff45ea9d04a0>
store      = <dimos.memory2.store.memory.MemoryStore object at 0xff45ea9d3680>
stream     = <dimos.memory2.stream.Stream object at 0xff47767bcbf0>

.../perception/fiducial/test_marker_detection_stream_module.py:160: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/memory2/stream.py:476: in to_list
    return list(self)
           ^^^^^^^^^^
        self       = <dimos.memory2.stream.Stream object at 0xff47767bcef0>
.../perception/fiducial/marker_transformer.py:341: in __call__
    for obs in upstream:
        flush      = <function MarkersPerFrame.__call__.<locals>.flush at 0xff47766b1580>
        pending    = []
        pending_obs = None
        pending_ts = None
        self       = #x1B[36mMarkersPerFrame#x1B[0m(frame_id='world')
        upstream   = <generator object DetectMarkers.__call__ at 0xff4776648c10>
.../perception/fiducial/marker_transformer.py:228: in __call__
    detections = _detect_markers_in_image(
        image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
        image_size_mismatch = False
        info       = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0)
        obs        = Observation(id=0, ts=10.0, data_type=<class 'dimos.msgs.sensor_msgs.Image.Image'>, pose_tuple=(0.0, 0.0, 0.0, 0.0, 0.0...=uint8, frame_id='camera_optical', ts=10.0), _loader=None, _data_lock=<unlocked _thread.lock object at 0xff4776645080>)
        optical_frame = 'camera_optical'
        pose_tuple = (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...)
        self       = #x1B[36mDetectMarkers#x1B[0m(camera_info=CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_op...ionary='DICT_APRILTAG_36h11', world_frame='world', smoothing_window=0.0, emit_empty_frames=True, detect_inverted=False)
        t_world_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
        upstream   = <generator object QualityWindow.__call__ at 0xff47766edbe0>
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

image = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0)
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
marker_length_m = 0.18, aruco_dictionary = 'DICT_APRILTAG_36h11'
world_frame = 'world', detect_inverted = False
detector = < cv2.aruco.ArucoDetector 0xff47766a31b0>
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])

    def detect_markers_in_image(
        image: Image,
        *,
        camera_info: CameraInfo,
        world_T_optical: Transform,
        marker_length_m: float,
        aruco_dictionary: str,
        world_frame: str = "world",
        detect_inverted: bool = False,
        detector: Any | None = None,
        camera_matrix: np.ndarray | None = None,
        dist_coeffs: np.ndarray | None = None,
    ) -> list[Detection3DMarker]:
        """Detect markers in one image and return rich world-frame 3D detections."""
        if marker_length_m <= 0:
            raise ValueError(f"marker_length_m must be > 0, got {marker_length_m}")
        if (
            camera_info.width
            and camera_info.height
            and (image.width != camera_info.width or image.height != camera_info.height)
        ):
            return []
    
        if detector is None:
            detector = create_aruco_detector(aruco_dictionary, detect_inverted=detect_inverted)
        if (camera_matrix is None) != (dist_coeffs is None):
            raise ValueError("camera_matrix and dist_coeffs must be provided together")
        if camera_matrix is None or dist_coeffs is None:
            camera_matrix, dist_coeffs = camera_info_to_cv_matrices(camera_info)
    
        gray = image.to_grayscale().as_numpy()
        corners, ids, _ = detector.detectMarkers(gray)
        if ids is None or len(ids) == 0:
            return []
    
        optical_frame = camera_optical_frame_id(image, camera_info)
        t_world_optical = Transform(
            translation=world_T_optical.translation,
            rotation=world_T_optical.rotation,
            frame_id=world_frame,
            child_frame_id=optical_frame,
            ts=image.ts,
        )
        marker_size = Vector3(marker_length_m, marker_length_m, 0.0)
        detections: list[Detection3DMarker] = []
    
        for corner_set, mid_arr in zip(corners, ids, strict=True):
>           mid = int(mid_arr[0])
                      ^^^^^^^^^^
E           IndexError: invalid index to scalar variable.

_          = (array([[[        341,         149],
        [        383,         151],
        [        381,         193],
        [...  [        402,         212],
        [        403,         239],
        [        375,         240]]], dtype=float32))
aruco_dictionary = 'DICT_APRILTAG_36h11'
camera_info = CameraInfo(height=480, width=640, distortion_model='plumb_bob', frame_id='camera_optical', ts=10.0)
camera_matrix = array([[        600,           0,         320],
       [          0,         600,         240],
       [          0,           0,           1]])
corner_set = array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32)
corners    = (array([[[        210,         130],
        [        429,         130],
        [        429,         349],
        [        210,         349]]], dtype=float32),)
detect_inverted = False
detections = []
detector   = < cv2.aruco.ArucoDetector 0xff47766a31b0>
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(480, 640), dtype=uint8)
ids        = array([7], dtype=int32)
image      = Image(shape=(480, 640, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10.0)
marker_length_m = 0.18
marker_size = Vector([       0.18        0.18           0])
mid_arr    = np.int32(7)
optical_frame = 'camera_optical'
t_world_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_frame = 'world'

.../perception/fiducial/marker_detect.py:86: IndexError
dimos.perception.fiducial.test_fixture_verification::test_marker_tf_replay_synthetic_packed_board_publishes_twelve_markers
Stack Traces | 0.173s run time
layout = BoardLayout(cols=3, rows=4, marker_length_m=0.05, tags={0: TagLayout(tag_id=0, col=0, row=0, bottom_left_m=array([    ...0912,           0],
       [       0.19,      0.0412,           0],
       [       0.14,      0.0412,           0]]))})

    def test_marker_tf_replay_synthetic_packed_board_publishes_twelve_markers(
        layout: BoardLayout,
    ) -> None:
        width, height = 1920, 1080
        bgr = _synthetic_packed_apriltag_board_bgr(layout, width=width, height=height)
        ts = 10_000.0
        cam_info = CameraInfo.from_intrinsics(
            1400.0,
            1400.0,
            width / 2.0,
            height / 2.0,
            width,
            height,
            frame_id="camera_optical",
        )
        cam_info.ts = ts
    
        image = Image.from_opencv(bgr, frame_id="camera_optical", ts=ts)
        world_T_optical = Transform(
            translation=Vector3(0.0, 0.0, 0.0),
            rotation=Quaternion(0.0, 0.0, 0.0, 1.0),
            frame_id="world",
            child_frame_id="camera_optical",
            ts=ts,
        )
>       detections = detect_markers_in_image(
            image,
            camera_info=cam_info,
            world_T_optical=world_T_optical,
            marker_length_m=0.05,
            aruco_dictionary="DICT_APRILTAG_36h11",
            world_frame="world",
        )

bgr        = array([[[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
     ...  ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]], shape=(1080, 1920, 3), dtype=uint8)
cam_info   = CameraInfo(height=1080, width=1920, distortion_model='plumb_bob', frame_id='camera_optical', ts=10000.0)
height     = 1080
image      = Image(shape=(1080, 1920, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10000.0)
layout     = BoardLayout(cols=3, rows=4, marker_length_m=0.05, tags={0: TagLayout(tag_id=0, col=0, row=0, bottom_left_m=array([    ...0912,           0],
       [       0.19,      0.0412,           0],
       [       0.14,      0.0412,           0]]))})
ts         = 10000.0
width      = 1920
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))

.../perception/fiducial/test_fixture_verification.py:180: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

image = Image(shape=(1080, 1920, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10000.0)
camera_info = CameraInfo(height=1080, width=1920, distortion_model='plumb_bob', frame_id='camera_optical', ts=10000.0)
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
marker_length_m = 0.05, aruco_dictionary = 'DICT_APRILTAG_36h11'
world_frame = 'world', detect_inverted = False
detector = < cv2.aruco.ArucoDetector 0xff8aadd28370>
camera_matrix = array([[       1400,           0,         960],
       [          0,        1400,         540],
       [          0,           0,           1]])
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])

    def detect_markers_in_image(
        image: Image,
        *,
        camera_info: CameraInfo,
        world_T_optical: Transform,
        marker_length_m: float,
        aruco_dictionary: str,
        world_frame: str = "world",
        detect_inverted: bool = False,
        detector: Any | None = None,
        camera_matrix: np.ndarray | None = None,
        dist_coeffs: np.ndarray | None = None,
    ) -> list[Detection3DMarker]:
        """Detect markers in one image and return rich world-frame 3D detections."""
        if marker_length_m <= 0:
            raise ValueError(f"marker_length_m must be > 0, got {marker_length_m}")
        if (
            camera_info.width
            and camera_info.height
            and (image.width != camera_info.width or image.height != camera_info.height)
        ):
            return []
    
        if detector is None:
            detector = create_aruco_detector(aruco_dictionary, detect_inverted=detect_inverted)
        if (camera_matrix is None) != (dist_coeffs is None):
            raise ValueError("camera_matrix and dist_coeffs must be provided together")
        if camera_matrix is None or dist_coeffs is None:
            camera_matrix, dist_coeffs = camera_info_to_cv_matrices(camera_info)
    
        gray = image.to_grayscale().as_numpy()
        corners, ids, _ = detector.detectMarkers(gray)
        if ids is None or len(ids) == 0:
            return []
    
        optical_frame = camera_optical_frame_id(image, camera_info)
        t_world_optical = Transform(
            translation=world_T_optical.translation,
            rotation=world_T_optical.rotation,
            frame_id=world_frame,
            child_frame_id=optical_frame,
            ts=image.ts,
        )
        marker_size = Vector3(marker_length_m, marker_length_m, 0.0)
        detections: list[Detection3DMarker] = []
    
        for corner_set, mid_arr in zip(corners, ids, strict=True):
>           mid = int(mid_arr[0])
                      ^^^^^^^^^^
E           IndexError: invalid index to scalar variable.

_          = (array([[[        465,         330],
        [        507,         331],
        [        506,         399],
        [...      756,         682],
        [        757,         724],
        [        717,         725]]], dtype=float32), ...)
aruco_dictionary = 'DICT_APRILTAG_36h11'
camera_info = CameraInfo(height=1080, width=1920, distortion_model='plumb_bob', frame_id='camera_optical', ts=10000.0)
camera_matrix = array([[       1400,           0,         960],
       [          0,        1400,         540],
       [          0,           0,           1]])
corner_set = array([[[        566,         806],
        [        775,         806],
        [        775,        1015],
        [        566,        1015]]], dtype=float32)
corners    = (array([[[        566,         806],
        [        775,         806],
        [        775,        1015],
        [...      274,         559],
        [        274,         768],
        [         65,         768]]], dtype=float32), ...)
detect_inverted = False
detections = []
detector   = < cv2.aruco.ArucoDetector 0xff8aadd28370>
dist_coeffs = array([[          0],
       [          0],
       [          0],
       [          0],
       [          0]])
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...     [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(1080, 1920), dtype=uint8)
ids        = array([11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0], dtype=int32)
image      = Image(shape=(1080, 1920, 3), format=BGR, dtype=uint8, frame_id='camera_optical', ts=10000.0)
marker_length_m = 0.05
marker_size = Vector([       0.05        0.05           0])
mid_arr    = np.int32(11)
optical_frame = 'camera_optical'
t_world_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_T_optical = Transform(translation=Vector([          0           0           0]), rotation=Quaternion(0.000000, 0.000000, 0.000000, 1.000000))
world_frame = 'world'

.../perception/fiducial/marker_detect.py:86: IndexError
dimos.utils.cli.cameracalibrate.test_cameracalibrate::test_find_chessboard_corners_synthetic_board_returns_expected_count
Stack Traces | 0.199s run time
def test_find_chessboard_corners_synthetic_board_returns_expected_count() -> None:
        cols, rows = 9, 6
        gray = _synthetic_chessboard_gray(640, 480, cols, rows, square_px=40)
        corners = find_chessboard_corners(gray, cols, rows)
        assert corners is not None
>       assert corners.shape == (cols * rows, 1, 2)
E       assert (54, 2) == (54, 1, 2)
E         
E         At index 1 diff: #x1B[0m#x1B[94m2#x1B[39;49;00m#x1B[90m#x1B[39;49;00m != #x1B[0m#x1B[94m1#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
E         Right contains one more item: #x1B[0m#x1B[94m2#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
E         
E         Full diff:
E         #x1B[0m#x1B[90m #x1B[39;49;00m (#x1B[90m#x1B[39;49;00m
E         #x1B[90m #x1B[39;49;00m     54,#x1B[90m#x1B[39;49;00m
E         #x1B[91m-     1,#x1B[39;49;00m#x1B[90m#x1B[39;49;00m
E         #x1B[90m #x1B[39;49;00m     2,#x1B[90m#x1B[39;49;00m
E         #x1B[90m #x1B[39;49;00m )#x1B[90m#x1B[39;49;00m

cols       = 9
corners    = array([[      159.5,       139.5],
       [      199.5,       139.5],
       [      239.5,       139.5],
       [     ...      [      399.5,       339.5],
       [      439.5,       339.5],
       [      479.5,       339.5]], dtype=float32)
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(480, 640), dtype=uint8)
rows       = 6

.../cli/cameracalibrate/test_cameracalibrate.py:616: AssertionError
dimos.perception.fiducial.test_fixture_verification::test_synthetic_packed_board_detects_all_twelve_ids_and_layout_homography
Stack Traces | 0.229s run time
layout = BoardLayout(cols=3, rows=4, marker_length_m=0.05, tags={0: TagLayout(tag_id=0, col=0, row=0, bottom_left_m=array([    ...0912,           0],
       [       0.19,      0.0412,           0],
       [       0.14,      0.0412,           0]]))})

    def test_synthetic_packed_board_detects_all_twelve_ids_and_layout_homography(
        layout: BoardLayout,
    ) -> None:
        width, height = 1920, 1080
        bgr = _synthetic_packed_apriltag_board_bgr(layout, width=width, height=height)
        gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
        det = cv2.aruco.ArucoDetector(
            cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_APRILTAG_36h11),
            cv2.aruco.DetectorParameters(),
        )
        corners, ids, _ = det.detectMarkers(gray)
        assert ids is not None and len(ids) == 12
        detected = sorted(int(np.asarray(i).reshape(-1)[0]) for i in ids)
        assert detected == list(range(12))
    
        corners_by_id: dict[int, np.ndarray] = {}
        for corner_set, id_arr in zip(corners, ids, strict=True):
>           corners_by_id[int(id_arr[0])] = np.asarray(corner_set, dtype=np.float32).reshape(4, 2)
                              ^^^^^^^^^
E           IndexError: invalid index to scalar variable.

_          = (array([[[        465,         330],
        [        507,         331],
        [        506,         399],
        [...      756,         682],
        [        757,         724],
        [        717,         725]]], dtype=float32), ...)
bgr        = array([[[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
     ...  ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]], shape=(1080, 1920, 3), dtype=uint8)
corner_set = array([[[        566,         806],
        [        775,         806],
        [        775,        1015],
        [        566,        1015]]], dtype=float32)
corners    = (array([[[        566,         806],
        [        775,         806],
        [        775,        1015],
        [...      274,         559],
        [        274,         768],
        [         65,         768]]], dtype=float32), ...)
corners_by_id = {}
det        = < cv2.aruco.ArucoDetector 0xff8aadd2b350>
detected   = [0, 1, 2, 3, 4, 5, ...]
gray       = array([[255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 25...     [255, 255, 255, ..., 255, 255, 255],
       [255, 255, 255, ..., 255, 255, 255]], shape=(1080, 1920), dtype=uint8)
height     = 1080
id_arr     = np.int32(11)
ids        = array([11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1,  0], dtype=int32)
layout     = BoardLayout(cols=3, rows=4, marker_length_m=0.05, tags={0: TagLayout(tag_id=0, col=0, row=0, bottom_left_m=array([    ...0912,           0],
       [       0.19,      0.0412,           0],
       [       0.14,      0.0412,           0]]))})
width      = 1920

.../perception/fiducial/test_fixture_verification.py:148: IndexError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@dependabot @github

dependabot Bot commented on behalf of github Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

Looks like these dependencies are updatable in another way, so this is no longer needed.

@dependabot dependabot Bot closed this Jul 30, 2026
@dependabot
dependabot Bot deleted the dependabot/uv/python-591991ea65 branch July 30, 2026 06:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport:skip Skip creating a backport to any release branches dependencies Pull requests that update a dependency file python:uv Pull requests that update python:uv code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants