diff --git a/.gitignore b/.gitignore index bdadc991f7..1c63f8febb 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,6 @@ fabric.properties ### ROS template build/ bin/ -lib/ msg_gen/ srv_gen/ msg/*Action.msg diff --git a/pixi.lock b/pixi.lock index de0961dd72..59021ab2af 100644 --- a/pixi.lock +++ b/pixi.lock @@ -2,7 +2,6 @@ version: 6 environments: default: channels: - - url: https://data.bit-bots.de/conda/ - url: https://data.bit-bots.de/conda-misc/output/ - url: https://conda.anaconda.org/robostack-jazzy/ - url: https://conda.anaconda.org/conda-forge/ @@ -15,7 +14,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.3-py312h5d8c7f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda @@ -27,16 +26,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py312h868fb18_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beartype-0.22.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/benchmark-1.9.5-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2022_10_07_flo_torso21_yoeox-1.0.1-h4616a5c_3.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2023_04_04_philipp_yoeox_with_team_colors-1.0.1-h4616a5c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda @@ -56,7 +55,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-21-21.1.8-default_h99862b1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-21.1.8-default_h99862b1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cli11-2.6.2-h54a6638_0.conda @@ -72,12 +71,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-devtools-0.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-library-path-0.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-metadata-0.2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/colcon-notification-0.3.0-py312he626ec8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/colcon-notification-0.3.1-py312he626ec8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-output-0.2.13-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-selection-0.2.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-parallel-executor-0.4.0-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-powershell-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-python-setup-py-0.2.9-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-recursive-crawl-0.2.3-pyhd8ed1ab_0.conda @@ -89,15 +88,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/console_bridge-1.0.2-h924138e_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/construct-2.10.70-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cppcheck-2.18.3-py312h014360a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cppzmq-4.11.0-hbe92c44_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py312ha4b625e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-python-1.3.2-py312h7347394_6.conda @@ -106,7 +106,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h54a6638_2.conda @@ -116,10 +115,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.5-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fcl-0.7.0-h543440a_8.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_h43fde53_912.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hac7f63c_111.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_h3b011a4_112.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-builtins-3.1.0-pyhd8ed1ab_0.conda @@ -127,7 +127,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.2-hc299af7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.2-he1b7b50_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flask-3.1.3-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -142,24 +142,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freeimage-3.18.0-h49ef1fa_24.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gdbm-1.18-h0a1914f_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-h31f076a_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h36e74d4_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glew-2.3.0-h71661d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.86.4-h5192d8d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda @@ -171,12 +171,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.26.10-h0363672_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.26.10-h17cb667_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-orc-0.4.42-h82d0256_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtest-1.17.0-h84d6215_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.51-ha5ea40c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-cmake3-3.5.5-h05f81b2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-math7-7.5.2-h5bbc156_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-math7-python-7.5.2-py312h89d136e_2.conda @@ -184,29 +185,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-tools2-2.0.3-h89235b8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-utils2-2.2.1-hdaf9e28_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.1.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_108.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imath-3.2.2-hde8ca8f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.9.0-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-25.3.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-hf4617a5_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaxtyping-0.3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda @@ -215,11 +216,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.2-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda @@ -229,8 +230,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.4-h96ad9f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.0-hcfa2d63_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h316e467_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.88.0-hd24cca6_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.88.0-hfcd1e18_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.88.0-ha770c72_7.conda @@ -239,13 +241,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-h3ff7636_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libccd-double-2.1-h59595ed_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.0-default_h99862b1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -253,11 +256,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda @@ -285,21 +288,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-5_h6ae95b6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_h6ae95b6_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.1-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.2-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libltdl-2.4.3a-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnuma-2.0.18-hb03c661_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libode-0.16.6-he3147e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.12.0-qt6_py312h52d6ec5_612.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-devel-1.7.0-ha4b6fd6_2.conda @@ -318,31 +321,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2025.4.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.2-hb80d175_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libraw-0.21.5-h074291d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.0-h4c96295_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsdformat14-14.8.0-py312h1f51ce1_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.10-hd0affe5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtool-2.5.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburcu-0.14.0-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.14-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.23.0-he1eb515_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda @@ -356,8 +360,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzenohc-1.7.2-hfad6b34_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lttng-ust-2.13.9-hf5eda4c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.0.2-py312h63ddcf0_2.conda @@ -377,7 +382,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.19.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.20.0-py312h4c3975b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nanoflann-1.6.1-hff21bea_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda @@ -391,20 +396,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/octomap-1.10.0-h84d6215_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ompl-1.7.0-py312hd4042a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.12.0-qt6_py312h7bb6282_612.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.4.6-h40f6f1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.4.8-h40f6f1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.26.3-h8d634f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orocos-kdl-1.5.3-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/osrf_pycommon-0.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -431,12 +434,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.15-h3f63f65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-17.0-haebf07f_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-17.0-h33dcb6b_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.12.0-qt6_py312h598be00_612.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.2-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.3-pyhfe8187e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.2-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.3-pyh648e204_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pybullet-3.25-py312hf49885f_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pycairo-1.29.0-py312h2596900_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda @@ -444,34 +449,36 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydot-4.0.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pymongo-4.16.0-py312h1289d80_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h587e1b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py312h82c0db2_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.18.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.17.0-py312h1289d80_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py312h9da60e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py312h50ac2ff_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysoundcard-0.4.5-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-hab00c5b_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.8.1-py312h5253ce2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-orocos-kdl-1.5.3-py312h1289d80_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hc240232_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-hb82b983_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h0c412b5_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-pl5321h16c4a6b_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidjson-1.1.0.post20240409-h3f2d84a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/readline-8.2.9999-h4616a5c_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.4.4-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda @@ -531,11 +538,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-angles-1.16.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-backward-ros-1.0.8-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-better-launch-1.0.4-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-biped-interfaces-0.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bitbots-tf-buffer-1.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-builtin-interfaces-2.0.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-camera-calibration-parsers-5.1.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-camera-info-manager-5.1.7-np2py312h2ed9cc7_14.conda @@ -565,10 +567,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dummy-map-server-0.33.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dummy-robot-bringup-0.33.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dummy-sensors-0.33.9-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamic-stack-decider-0.5.3-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamic-stack-decider-visualization-0.2.1-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dynamixel-sdk-3.8.4-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamixel-workbench-toolbox-0.1.8-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-eigen-stl-containers-1.1.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-eigen3-cmake-module-0.3.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-example-interfaces-0.12.0-np2py312h2ed9cc7_14.conda @@ -594,7 +592,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-filters-2.2.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-foonathan-memory-vendor-1.3.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-foxglove-bridge-3.2.2-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-gazebo-msgs-3.8.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-generate-parameter-library-0.6.0-np2py312h2c89a96_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-generate-parameter-library-py-0.6.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-geometric-shapes-2.3.2-np2py312h2ed9cc7_14.conda @@ -608,7 +605,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-gz-tools-vendor-0.0.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-gz-utils-vendor-0.0.5-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-hardware-interface-4.42.1-np2py312h2c89a96_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-humanoid-base-footprint-0.1.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-iceoryx-binding-c-2.0.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-iceoryx-hoofs-2.0.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-iceoryx-posh-2.0.6-np2py312h2ed9cc7_14.conda @@ -617,12 +613,8 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-image-publisher-5.0.11-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-image-tools-0.33.9-np2py312hedab9cf_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-image-transport-5.1.7-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-imu-complementary-filter-2.1.5-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-interactive-markers-2.5.5-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-intra-process-demo-0.33.9-np2py312hedab9cf_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-image-node-0.0.0-np2py312hedab9cf_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-interfaces-0.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-library-0.0.0-np2py312hedab9cf_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-joint-limits-4.42.1-np2py312h2c89a96_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-joint-state-publisher-2.4.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-joint-state-publisher-gui-2.4.0-np2py312h2ed9cc7_14.conda @@ -631,7 +623,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-keyboard-handler-0.3.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-laser-geometry-2.7.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-3.4.9-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-param-builder-0.1.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-ros-0.26.10-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-testing-3.4.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-testing-ament-cmake-3.4.9-np2py312h2ed9cc7_14.conda @@ -649,38 +640,17 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-mcap-vendor-0.26.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-message-filters-4.11.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-common-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-configs-utils-2.12.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-core-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-kinematics-2.12.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-msgs-2.6.0-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-planners-ompl-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-benchmarks-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-move-group-2.12.4-np2py312h2c89a96_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-occupancy-map-monitor-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-planning-2.12.4-np2py312h2c89a96_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-planning-interface-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-robot-interaction-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-visualization-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-warehouse-2.12.4-np2py312h2c89a96_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-app-plugins-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-assistant-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-controllers-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-core-plugins-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-framework-2.12.4-np2py312h2c89a96_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-srdf-plugins-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-simple-controller-manager-2.12.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-nav-msgs-5.3.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-object-recognition-msgs-2.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-octomap-msgs-2.0.1-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ompl-1.7.0-py312hbd645f5_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-orocos-kdl-vendor-0.5.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-osqp-vendor-0.2.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-osrf-pycommon-2.1.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pal-statistics-2.7.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pal-statistics-msgs-2.7.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-parameter-traits-0.6.0-np2py312h2c89a96_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-particle-filter-0.0.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pcl-conversions-2.6.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pcl-msgs-1.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pendulum-control-0.33.9-np2py312h2ed9cc7_14.conda @@ -725,13 +695,12 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-implementation-2.15.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-implementation-cmake-7.3.2-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-zenoh-cpp-0.2.9-np2py312ha80d210_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-robot-state-publisher-3.3.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros-base-0.11.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros-core-0.11.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros-environment-4.2.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros-workspace-1.0.3-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ros2-numpy-2.0.9-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ros2-python-extension-1.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros2action-0.32.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros2bag-0.26.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros2cli-0.32.7-np2py312h2ed9cc7_14.conda @@ -793,7 +762,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rosx-introspection-1.0.2-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-rot-conv-1.1.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rpyutils-0.4.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rqt-action-2.2.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rqt-bag-1.5.5-np2py312h2ed9cc7_14.conda @@ -832,12 +800,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-sensor-msgs-py-5.3.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-service-msgs-2.0.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-shape-msgs-5.3.6-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-field-map-generator-0.0.0-np2py312hedab9cf_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-ipm-0.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-2d-msgs-1.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-3d-msgs-1.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-3d-rviz-markers-1.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-attribute-msgs-1.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-spdlog-vendor-1.6.1-np2py312h918b84f_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-sqlite3-vendor-0.26.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-srdfdom-2.0.7-np2py312h2ed9cc7_14.conda @@ -878,7 +840,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-transmission-interface-4.42.1-np2py312h2c89a96_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-turtlesim-1.8.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-type-description-interfaces-2.0.3-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-udp-bridge-0.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-uncrustify-vendor-3.0.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-unique-identifier-msgs-2.5.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-urdf-2.10.0-np2py312h2ed9cc7_14.conda @@ -889,10 +850,10 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-vision-msgs-4.1.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-vision-opencv-4.1.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-visualization-msgs-5.3.6-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-warehouse-ros-2.0.5-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-web-video-server-2.1.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-xacro-2.1.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-yaml-cpp-vendor-9.0.1-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-zenoh-cpp-vendor-0.2.9-np2py312ha80d210_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-zstd-vendor-0.26.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros2-distro-mutex-0.13.0-jazzy_14.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rosdistro-1.0.1-pyhd8ed1ab_0.conda @@ -903,17 +864,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/sdformat14-14.8.0-h5bb51b8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdformat14-python-14.8.0-py312h22a3d64_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.2-hdeec2a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/setproctitle-1.3.7-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.4-hdeec2a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2025.5-h718be3e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.10.0-py312h1289d80_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/soxr-0.1.3-h0b41bf4_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.17.0-hab81395_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-rtd-theme-3.1.0-hd8ed1ab_0.conda @@ -928,17 +889,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2026.1-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.32.3-hcee41ef_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2022.3.0-h51de99f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tinyxml2-11.0.0-h3f2d84a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transforms3d-0.4.2-pyhd8ed1ab_1.conda + - conda: https://data.bit-bots.de/conda-misc/output/noarch/tts-supertonic-1.0.0-h4616a5c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -957,11 +919,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.5.2-py312h6fba518_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.5.2-py312hcdbd8b1_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wadler-lindig-0.1.7-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://data.bit-bots.de/conda-misc/output/linux-64/webots-2022b-hb0f4dca_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py312h4c3975b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 @@ -1002,64 +963,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.23.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zenoh-rust-abi-1.7.2.1.85.0-h8619998_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zziplib-0.13.69-he45264a_2.conda - conda: src/bitbots_navigation/bitbots_rust_nav build: hb0f4dca_0 - - pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz - - pypi: https://files.pythonhosted.org/packages/a9/c7/57423942b2f847cdbbb46494568d00cd8a45500904ea026f0aad6ca01bc7/editdistance-0.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e0/13/e430bc0af434d8775614283ceaa6181b4083e3e50ab1a6939328ca6aec3f/epitran-1.17-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/73/2d4ac4076c3a9773528d7e16129367ef9885e9dc36dcf64b516ea013a2f0/espeak_phonemizer-1.3.1.tar.gz - pypi: https://files.pythonhosted.org/packages/ea/78/9a8a174011682d71cb4922f4014ebbeb9d3067922678e7059351fd9207cf/exhale-0.3.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/e1/6b5a01ef36b5341d5d0899401e4413594dfaa21f86cfc05be8efb25baf81/gruut-2.4.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/51/9f/7eff478e38913cc9930527ff40c9ebcb04744dfcd0ddd43bd5a1eb9565b7/gruut-ipa-0.13.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/a4/e3/22748996c573c6a7d5326ef0292956afac089c73f14e3dfee0a94661e631/gruut_lang_en-2.0.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/93/35/850277d1b17b206bd10874c8a9a3f52e059452fb49bb0d22cbb908f6038b/hypercorn-0.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4f/9a/ab96291470e305504aa4b7a2e0ec132e930da89eb3ca7a82fbe03167c131/jsonlines-1.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/c2/3842d8e39006b5b03384418b55108a3f3931ac6fe9b998814be81267acec/marisa_trie-1.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/11/8f92f01da9cc41247008856438aa052cc93f74e4ac12ff250eb96a44249a/mycroft_mimic3_tts-0.2.4.tar.gz - - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d6/5b/545e9267a1cc080c8a1be2746113a063e34bcdd0f5173fd665a5c13cb234/num2words-0.5.14-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/28/7c/fd253da53594ab8efbefdc85b3638620ab1a6aab6eb7028a513c853559ce/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b2/f1/d5318874aed3b57bd00bf76e8f9698b73b578137d9d403314a4e649fbb63/onnxruntime_webgpu-1.25.0.dev20260212001-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3d/fe/89d77e424365280b79d99b3e1e7d606f5165af2f2ecfaf0c6d24c799d607/pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/72/2a/05a47a6c291414f5a66901f8d1f6ba68e8ec9fccb341d56fa0b31479d41d/panphon-0.22.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/6f/0cf0746d02a356103b7c3a065dbc188d8b5092e58bb363d74aa668ee1ad1/phonemes2ids-1.2.2.tar.gz - - pypi: https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/63/3f/da9732ccb24b71a7539470dcdfcd16c923692788f39553f37238f208ca55/python_crfsuite-0.9.12-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/84/14/9fb5842581f0419b5eb85f8c26c1c0c0f4cf6b4d5be638ae3157316a2650/pyttsx3-2.99-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ea/31/da390a5a10674481dea2909178973de81fa3a246c0eedcc0e1e4114f52f8/quart_cors-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/56/feb011ed1e8724c4c57083d71877eefe61f535f6dc94aa598033a03b54b7/swagger_ui_py-21.12.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/70/cf880c3b95a6034ef673e74b369941b42315c01f1554a5637a4f8b911009/syrupy-5.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/7e/1d55a5749fbf7d1ac6411f3028128b974a3e6bb770d365a2518ecee8ce7e/xdgenvpy-2.4.0-py3-none-any.whl linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.13.3-py312he7e3343_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.13.5-py312he7e3343_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -1071,16 +992,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/at-spi2-atk-2.38.0-h1f2db35_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/at-spi2-core-2.40.3-h1f2db35_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/atk-1.0-2.38.0-hedc4a1f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.2-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.3.0-py312h3d8e7d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bcrypt-5.0.0-py312h5eb8f6c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beartype-0.22.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/benchmark-1.9.5-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_102.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2022_10_07_flo_torso21_yoeox-1.0.1-h4616a5c_3.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2023_04_04_philipp_yoeox_with_team_colors-1.0.1-h4616a5c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda @@ -1100,7 +1021,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py312h1b372e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/clang-format-21-21.1.8-default_he95a3c9_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/clang-format-21.1.8-default_he95a3c9_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cli11-2.6.2-h7ac5ae9_0.conda @@ -1116,12 +1037,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-devtools-0.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-library-path-0.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-metadata-0.2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/colcon-notification-0.3.0-py312h72dafdd_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/colcon-notification-0.3.1-py312h72dafdd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-output-0.2.13-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-selection-0.2.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-parallel-executor-0.4.0-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-powershell-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-python-setup-py-0.2.9-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-recursive-crawl-0.2.3-pyhd8ed1ab_0.conda @@ -1133,15 +1054,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/console_bridge-1.0.2-hdd96247_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/construct-2.10.70-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.13.4-py312hd077ced_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.13.5-py312hd077ced_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cppcheck-2.18.3-py312h5677ec4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cppzmq-4.11.0-h7be3492_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.5-py312hf80642e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.18.0-h7bfdcfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.19.0-hc57f145_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.28-h6c5dea3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.28-h6598af7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-python-1.3.2-py312hf371ade_6.conda @@ -1150,7 +1072,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/double-conversion-3.4.0-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/eigen-3.4.0-h7ac5ae9_2.conda @@ -1160,10 +1081,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/epoxy-1.5.10-he30d5cf_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.5-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fcl-0.7.0-h841ecf2_8.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_hd1a4c92_912.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h1359815_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fftw-3.3.10-nompi_h66d8d02_112.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-builtins-3.1.0-pyhd8ed1ab_0.conda @@ -1171,7 +1093,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flann-1.9.2-h8b5e525_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flann-1.9.2-headf6c6_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flask-3.1.3-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h20c602a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -1186,23 +1108,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freeglut-3.2.2-h5eeb66e_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freeimage-3.18.0-hfe23055_24.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.2-h8af1aa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.7.0-py312hb10c72c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-h533bfc8_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_21.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.5-h90308e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.6-h90308e0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gettext-0.25.1-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gettext-tools-0.25.1-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h70575c0_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hedfd65a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hd9db0c5_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glew-2.3.0-hf9dcc85_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-2.86.4-hc66a092_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-tools-2.86.4-hc87f4d4_1.conda @@ -1214,12 +1136,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-14.1.2-h45e821f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-base-1.26.10-hae777ca_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gstreamer-1.26.10-hc24f651_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gstreamer-orc-0.4.42-h70b131a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtest-1.17.0-h17cf362_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk3-3.24.51-h75d4e7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk3-3.24.52-h75d4e7a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gts-0.7.6-he293c15_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h32e4f2e_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h007e36a_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-cmake3-3.5.5-h740f95d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-math7-7.5.2-h1ad700d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-math7-python-7.5.2-py312h9452373_2.conda @@ -1227,27 +1150,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-tools2-2.0.3-hd91f489_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-utils2-2.2.1-h2ce864c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.1.1-h1134a53_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf4-4.2.15-hb6ba311_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_106.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_108.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hicolor-icon-theme-0.17-h8af1aa0_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/imath-3.2.2-h92288e7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jack-1.9.22-h9d01bbc_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.9-h27a9ab5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.9-h850eeee_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaxtyping-0.3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda @@ -1257,11 +1180,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.0-py312h1683e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20250512.1-cxx17_h201e9ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libacl-2.3.2-h883460d_0.conda @@ -1270,8 +1193,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.25.1-h5e0f5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-devel-0.25.1-h5e0f5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libass-0.17.4-hcfe818d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libavif16-1.4.0-ha599f14_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libattr-2.5.2-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libavif16-1.4.1-ha599f14_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libboost-1.88.0-h5651608_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libboost-devel-1.88.0-h37bb5a9_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libboost-headers-1.88.0-h8af1aa0_7.conda @@ -1280,13 +1204,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-h68e9139_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-hf9559e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libccd-double-2.1-h2f0025b_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp22.1-22.1.0-default_he95a3c9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-22.1.0-default_h94a09a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h5cdc715_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.18.0-h7bfdcfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.19.0-hc57f145_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.125-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda @@ -1294,11 +1219,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-devel-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.2-h8af1aa0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.2-hdae7a39_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda @@ -1326,21 +1251,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libidn2-2.3.8-h99ff5a0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjxl-0.11.2-h71be66a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.11.0-5_hb558247_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.11.0-6_hb558247_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm22-22.1.1-hfd2ba90_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm22-22.1.2-hfd2ba90_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libltdl-2.4.3a-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmicrohttpd-1.0.2-h3543b8c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnetcdf-4.9.3-nompi_h06de00c_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libntlm-1.4-hf897c2e_1002.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnuma-2.0.18-he30d5cf_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libode-0.16.6-py312h4eed292_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libogg-1.3.5-h86ecc28_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.12.0-qt6_py312h051a780_612.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopengl-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopengl-devel-1.7.0-hd24410f_2.conda @@ -1357,31 +1282,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2025.4.1-hfae3067_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.6.1-h80f16a2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.18-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-18.2-hf8816c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.56-h1abf092_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-18.3-h7d4fc67_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-6.31.1-h2cf3c76_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraw-0.21.5-h6c2e892_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.62.0-hf685517_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.62.1-hf685517_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsdformat14-14.8.0-py312h39f64fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.10-hf9559e3_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hf9559e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtasn1-4.21.0-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtheora-1.1.1-h68df207_1006.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.10-hf9559e3_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtool-2.5.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hf9559e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunistring-0.9.10-hf897c2e_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunwind-1.8.3-h6470e1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburcu-0.14.0-h0a1ffab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburing-2.14-hfefdfc9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libusb-1.0.29-h06eaf92_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvorbis-1.3.7-h7ac5ae9_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvpx-1.15.2-hfae3067_0.conda @@ -1393,8 +1319,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.2-h79dcc73_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.2-h825857f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.43-h6700d25_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzenohc-1.7.2-hd661084_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzip-1.11.2-h3e8f909_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lttng-ust-2.13.9-h8d236e2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lxml-6.0.2-py312hfe2c7ef_2.conda @@ -1414,7 +1341,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/msgpack-python-1.1.2-py312h4f740d2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.7.1-py312ha4530ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.19.1-py312h996f985_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.20.0-py312h996f985_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nanoflann-1.6.1-h17cf362_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda @@ -1427,19 +1354,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/octomap-1.10.0-h17cf362_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ompl-1.7.0-py312hae32f5c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.12.0-qt6_py312h750a492_612.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.4.6-hd0c962a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.4.8-hd0c962a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openh264-2.6.0-h0564a2a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjph-0.26.3-h55827e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.10-h30c48ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.10-h2fb54aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orocos-kdl-1.5.3-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/osrf_pycommon-0.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/p11-kit-0.26.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.56.4-he55ef5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.56.4-h8547ced_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -1466,12 +1391,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pugixml-1.15-h6ef32b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-17.0-h3dd60a8_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-client-17.0-hcf98165_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-daemon-17.0-hb9404ba_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.12.0-qt6_py312h1743b20_612.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.2-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.3-pyhfe8187e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.2-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.3-pyh648e204_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pybullet-3.25-py312h88173f1_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pycairo-1.29.0-py312h1f35134_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda @@ -1479,34 +1406,36 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydot-4.0.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pymongo-4.16.0-py312hfcd9f9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pynacl-1.6.2-py312hcd1a082_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pynacl-1.6.2-py312h9d3b8a6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyqt-5.15.11-py312hc13527c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.18.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyqt5-sip-12.17.0-py312h1ab2c47_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.10.2-py312h4810df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.10.2-py312hfc1e6cc_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysoundcard-0.4.5-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.0-h43d1f9e_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-librt-0.8.1-py312hd41f8a7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-orocos-kdl-1.5.3-py312h1ab2c47_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt-main-5.15.15-h912a755_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.10.2-h5343e53_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt-main-5.15.15-ha9b3be2_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.10.2-pl5321h598db47_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rapidjson-1.1.0.post20240409-h5ad3122_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rav1e-0.8.1-h9d4cc37_0.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/readline-8.2.9999-h4616a5c_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.4.4-py312hcd1a082_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.6-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda @@ -1566,11 +1495,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-angles-1.16.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-backward-ros-1.0.8-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-better-launch-1.0.4-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-biped-interfaces-0.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bitbots-tf-buffer-1.0.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-builtin-interfaces-2.0.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-camera-calibration-parsers-5.1.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-camera-info-manager-5.1.7-np2py312h61f2ce4_14.conda @@ -1600,10 +1524,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dummy-map-server-0.33.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dummy-robot-bringup-0.33.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dummy-sensors-0.33.9-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamic-stack-decider-0.5.3-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamic-stack-decider-visualization-0.2.1-np2py312h3575a3a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dynamixel-sdk-3.8.4-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamixel-workbench-toolbox-0.1.8-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-eigen-stl-containers-1.1.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-eigen3-cmake-module-0.3.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-example-interfaces-0.12.0-np2py312h61f2ce4_14.conda @@ -1629,7 +1549,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-filters-2.2.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-foonathan-memory-vendor-1.3.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-foxglove-bridge-3.2.2-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-gazebo-msgs-3.8.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-generate-parameter-library-0.6.0-np2py312h8b5252a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-generate-parameter-library-py-0.6.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-geometric-shapes-2.3.2-np2py312h61f2ce4_14.conda @@ -1643,7 +1562,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-gz-tools-vendor-0.0.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-gz-utils-vendor-0.0.5-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-hardware-interface-4.42.1-np2py312h8b5252a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-humanoid-base-footprint-0.1.2-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-binding-c-2.0.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-hoofs-2.0.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-posh-2.0.6-np2py312h61f2ce4_14.conda @@ -1652,12 +1570,8 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-image-publisher-5.0.11-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-image-tools-0.33.9-np2py312h6b1b059_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-image-transport-5.1.7-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-imu-complementary-filter-2.1.5-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-interactive-markers-2.5.5-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-intra-process-demo-0.33.9-np2py312h6b1b059_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-image-node-0.0.0-np2py312h784231a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-interfaces-0.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-library-0.0.0-np2py312h784231a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-joint-limits-4.42.1-np2py312h8b5252a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-joint-state-publisher-2.4.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-joint-state-publisher-gui-2.4.0-np2py312h61f2ce4_14.conda @@ -1666,7 +1580,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-keyboard-handler-0.3.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-laser-geometry-2.7.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-3.4.9-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-param-builder-0.1.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-ros-0.26.10-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-testing-3.4.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-testing-ament-cmake-3.4.9-np2py312h61f2ce4_14.conda @@ -1684,38 +1597,17 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-mcap-vendor-0.26.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-message-filters-4.11.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-common-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-configs-utils-2.12.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-core-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-kinematics-2.12.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-msgs-2.6.0-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-planners-ompl-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-benchmarks-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-move-group-2.12.4-np2py312h8b5252a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-occupancy-map-monitor-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-planning-2.12.4-np2py312h8b5252a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-planning-interface-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-robot-interaction-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-visualization-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-warehouse-2.12.4-np2py312h8b5252a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-app-plugins-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-assistant-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-controllers-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-core-plugins-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-framework-2.12.4-np2py312h8b5252a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-srdf-plugins-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-simple-controller-manager-2.12.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-nav-msgs-5.3.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-object-recognition-msgs-2.0.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-octomap-msgs-2.0.1-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ompl-1.7.0-py312h8f0e40e_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-orocos-kdl-vendor-0.5.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-osqp-vendor-0.2.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-osrf-pycommon-2.1.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pal-statistics-2.7.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pal-statistics-msgs-2.7.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-parameter-traits-0.6.0-np2py312h8b5252a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-particle-filter-0.0.1-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pcl-conversions-2.6.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pcl-msgs-1.0.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pendulum-control-0.33.9-np2py312h61f2ce4_14.conda @@ -1760,13 +1652,12 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-implementation-2.15.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-implementation-cmake-7.3.2-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-zenoh-cpp-0.2.9-np2py312h1cd77a6_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-robot-state-publisher-3.3.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros-base-0.11.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros-core-0.11.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros-environment-4.2.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros-workspace-1.0.3-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ros2-numpy-2.0.9-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ros2-python-extension-1.0.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros2action-0.32.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros2bag-0.26.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros2cli-0.32.7-np2py312h61f2ce4_14.conda @@ -1828,7 +1719,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rosx-introspection-1.0.2-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-rot-conv-1.1.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rpyutils-0.4.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rqt-action-2.2.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rqt-bag-1.5.5-np2py312h61f2ce4_14.conda @@ -1867,12 +1757,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-sensor-msgs-py-5.3.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-service-msgs-2.0.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-shape-msgs-5.3.6-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-field-map-generator-0.0.0-np2py312h784231a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-ipm-0.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-2d-msgs-1.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-3d-msgs-1.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-3d-rviz-markers-1.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-attribute-msgs-1.0.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-spdlog-vendor-1.6.1-np2py312ha677571_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-sqlite3-vendor-0.26.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-srdfdom-2.0.7-np2py312h61f2ce4_14.conda @@ -1913,7 +1797,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-transmission-interface-4.42.1-np2py312h8b5252a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-turtlesim-1.8.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-type-description-interfaces-2.0.3-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-udp-bridge-0.0.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-uncrustify-vendor-3.0.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-unique-identifier-msgs-2.5.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-urdf-2.10.0-np2py312h61f2ce4_14.conda @@ -1924,10 +1807,10 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-vision-msgs-4.1.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-vision-opencv-4.1.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-visualization-msgs-5.3.6-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-warehouse-ros-2.0.5-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-web-video-server-2.1.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-xacro-2.1.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-yaml-cpp-vendor-9.0.1-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-zenoh-cpp-vendor-0.2.9-np2py312h1cd77a6_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-zstd-vendor-0.26.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros2-distro-mutex-0.13.0-jazzy_14.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rosdistro-1.0.1-pyhd8ed1ab_0.conda @@ -1938,17 +1821,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdformat14-14.8.0-hb4dca6f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdformat14-python-14.8.0-py312he22bb7a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2-2.32.56-h7ac5ae9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.4.2-had2c13b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/setproctitle-1.3.7-py312hd41f8a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.4.4-had2c13b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shaderc-2025.5-hfeb5c2c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sip-6.15.2-py312hfcd9f9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sip-6.15.3-py312hfcd9f9b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/soxr-0.1.3-hb4cce97_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/spdlog-1.17.0-h9f97df7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-rtd-theme-3.1.0-hd8ed1ab_0.conda @@ -1971,10 +1854,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tinyxml2-11.0.0-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py312hefbd42c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py312hefbd42c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transforms3d-0.4.2-pyhd8ed1ab_1.conda + - conda: https://data.bit-bots.de/conda-misc/output/noarch/tts-supertonic-1.0.0-h4616a5c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -1993,9 +1877,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/vtk-base-9.5.2-py312h90a26f6_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/vtk-io-ffmpeg-9.5.2-py312haba1314_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wadler-lindig-0.1.7-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.24.0-h4f8a99f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.25.0-h4f8a99f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-2.1.2-py312hcd1a082_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/x264-1!164.3095-h4e544f5_2.tar.bz2 @@ -2036,61 +1920,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-cpp-0.8.0-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.23.0-py312ha4530ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zenoh-rust-abi-1.7.2.1.85.0-h4d6d557_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zfp-1.0.1-h05c1e92_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zziplib-0.13.69-h650d8d0_2.conda - conda: src/bitbots_navigation/bitbots_rust_nav build: he8cfe8b_0 - - pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz - - pypi: https://files.pythonhosted.org/packages/e1/31/bfb8e590f922089dc3471ed7828a6da2fc9453eba38c332efa9ee8749fd7/editdistance-0.8.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/e0/13/e430bc0af434d8775614283ceaa6181b4083e3e50ab1a6939328ca6aec3f/epitran-1.17-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/73/2d4ac4076c3a9773528d7e16129367ef9885e9dc36dcf64b516ea013a2f0/espeak_phonemizer-1.3.1.tar.gz - pypi: https://files.pythonhosted.org/packages/ea/78/9a8a174011682d71cb4922f4014ebbeb9d3067922678e7059351fd9207cf/exhale-0.3.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/e1/6b5a01ef36b5341d5d0899401e4413594dfaa21f86cfc05be8efb25baf81/gruut-2.4.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/51/9f/7eff478e38913cc9930527ff40c9ebcb04744dfcd0ddd43bd5a1eb9565b7/gruut-ipa-0.13.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/a4/e3/22748996c573c6a7d5326ef0292956afac089c73f14e3dfee0a94661e631/gruut_lang_en-2.0.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/93/35/850277d1b17b206bd10874c8a9a3f52e059452fb49bb0d22cbb908f6038b/hypercorn-0.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4f/9a/ab96291470e305504aa4b7a2e0ec132e930da89eb3ca7a82fbe03167c131/jsonlines-1.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a8/a2/1e0f0665a98968b0af7067cf2dad569e1bd8c1f13a97670b74b5ac5153d9/marisa_trie-1.4.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/11/8f92f01da9cc41247008856438aa052cc93f74e4ac12ff250eb96a44249a/mycroft_mimic3_tts-0.2.4.tar.gz - - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d6/5b/545e9267a1cc080c8a1be2746113a063e34bcdd0f5173fd665a5c13cb234/num2words-0.5.14-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/dc/1f5489f7b21817d4ad352bf7a92a252bd5b438bcbaa7ad20ea50814edc79/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d7/39/327802e0b6d693182403c144edacbc27eb82907b57062f23ef5a4c4a5ea7/pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/72/2a/05a47a6c291414f5a66901f8d1f6ba68e8ec9fccb341d56fa0b31479d41d/panphon-0.22.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/6f/0cf0746d02a356103b7c3a065dbc188d8b5092e58bb363d74aa668ee1ad1/phonemes2ids-1.2.2.tar.gz - - pypi: https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/0c/9725b097738f4a6aac9ac4e5a5fc6494eca69f17663d3d6ba8d0ea3858d2/python_crfsuite-0.9.12-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/84/14/9fb5842581f0419b5eb85f8c26c1c0c0f4cf6b4d5be638ae3157316a2650/pyttsx3-2.99-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ea/31/da390a5a10674481dea2909178973de81fa3a246c0eedcc0e1e4114f52f8/quart_cors-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/c9/8cc8d850b35ab5650ff6756a1cb85286e2000b66c97520b29c1587455344/regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/56/feb011ed1e8724c4c57083d71877eefe61f535f6dc94aa598033a03b54b7/swagger_ui_py-21.12.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/70/cf880c3b95a6034ef673e74b369941b42315c01f1554a5637a4f8b911009/syrupy-5.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/7e/1d55a5749fbf7d1ac6411f3028128b974a3e6bb770d365a2518ecee8ce7e/xdgenvpy-2.4.0-py3-none-any.whl format: channels: - - url: https://data.bit-bots.de/conda/ - url: https://data.bit-bots.de/conda-misc/output/ - url: https://conda.anaconda.org/robostack-jazzy/ - url: https://conda.anaconda.org/conda-forge/ @@ -2111,17 +1955,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda @@ -2130,17 +1974,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.2-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda @@ -2150,9 +1994,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-hab00c5b_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/readline-8.2.9999-h4616a5c_4.conda @@ -2183,17 +2027,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.19.0-hc57f145_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda @@ -2202,17 +2046,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.8.2-he30d5cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.2-h79dcc73_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.2-h825857f_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda @@ -2222,9 +2066,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.5.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.0-h43d1f9e_0_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/readline-8.2.9999-h4616a5c_4.conda @@ -2243,7 +2087,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda robot: channels: - - url: https://data.bit-bots.de/conda/ - url: https://data.bit-bots.de/conda-misc/output/ - url: https://conda.anaconda.org/robostack-jazzy/ - url: https://conda.anaconda.org/conda-forge/ @@ -2256,7 +2099,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.3-py312h5d8c7f2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda @@ -2268,16 +2111,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-atk-2.38.0-h0630a04_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/at-spi2-core-2.40.3-h0630a04_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/backports.zstd-1.3.0-py312h90b7ffd_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py312h868fb18_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beartype-0.22.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/benchmark-1.9.5-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2022_10_07_flo_torso21_yoeox-1.0.1-h4616a5c_3.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2023_04_04_philipp_yoeox_with_team_colors-1.0.1-h4616a5c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda @@ -2297,7 +2140,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py312h460c074_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-21-21.1.8-default_h99862b1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-21.1.8-default_h99862b1_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cli11-2.6.2-h54a6638_0.conda @@ -2313,12 +2156,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-devtools-0.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-library-path-0.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-metadata-0.2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/colcon-notification-0.3.0-py312he626ec8_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/colcon-notification-0.3.1-py312he626ec8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-output-0.2.13-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-selection-0.2.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-parallel-executor-0.4.0-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-powershell-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-python-setup-py-0.2.9-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-recursive-crawl-0.2.3-pyhd8ed1ab_0.conda @@ -2330,15 +2173,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/compilers-1.11.0-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/conda-gcc-specs-14.3.0-he8ccf15_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/console_bridge-1.0.2-h924138e_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/construct-2.10.70-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cppcheck-2.18.3-py312h014360a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cppzmq-4.11.0-hbe92c44_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.5-py312ha4b625e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-python-1.3.2-py312h7347394_6.conda @@ -2347,7 +2191,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.4.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h54a6638_2.conda @@ -2357,10 +2200,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.5-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fcl-0.7.0-h543440a_8.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_h43fde53_912.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hac7f63c_111.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_h3b011a4_112.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-builtins-3.1.0-pyhd8ed1ab_0.conda @@ -2368,7 +2212,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.2-hc299af7_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.2-he1b7b50_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flask-3.1.3-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -2383,24 +2227,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.11.0-h9bea470_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freeimage-3.18.0-h49ef1fa_24.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.7.0-py312h447239a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc-14.3.0-h0dff253_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-14.3.0-hbdf3cc3_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gdbm-1.18-h0a1914f_2.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/geographiclib-cpp-2.7-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_impl_linux-64-14.3.0-h1a219da_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-h31f076a_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h36e74d4_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glew-2.3.0-h71661d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-2.86.4-h5192d8d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.86.4-hf516916_1.conda @@ -2412,12 +2257,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/graphviz-14.1.2-h8b86629_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.26.10-h0363672_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.26.10-h17cb667_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-orc-0.4.42-h82d0256_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gtest-1.17.0-h84d6215_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.51-ha5ea40c_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx-14.3.0-h76987e4_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-14.3.0-h2185e75_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-cmake3-3.5.5-h05f81b2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-math7-7.5.2-h5bbc156_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-math7-python-7.5.2-py312h89d136e_2.conda @@ -2425,29 +2271,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-tools2-2.0.3-h89235b8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-utils2-2.2.1-hdaf9e28_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.1.1-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_108.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imath-3.2.2-hde8ca8f_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.9.0-hb700be7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-25.3.4-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-hf4617a5_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaxtyping-0.3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda @@ -2456,11 +2302,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.5.0-py312h0a2e395_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.18-h0c24ade_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/level-zero-1.28.2-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda @@ -2470,8 +2316,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.25.1-h3f43e3d_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.4-h96ad9f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.0-hcfa2d63_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h316e467_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.88.0-hd24cca6_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-devel-1.88.0-hfcd1e18_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.88.0-ha770c72_7.conda @@ -2480,13 +2327,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-h3ff7636_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libccd-double-2.1-h59595ed_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.0-default_h99862b1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda @@ -2494,11 +2342,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-14.3.0-hf649bbc_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_18.conda @@ -2526,21 +2374,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.8-hfac485b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.2-ha09017c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-5_h6ae95b6_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_h6ae95b6_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.1-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.2-hf7376ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libltdl-2.4.3a-h5888daf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-devel-5.8.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.2-hc2fc477_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_hbf2fc22_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnuma-2.0.18-hb03c661_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libode-0.16.6-he3147e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.12.0-qt6_py312h52d6ec5_612.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-devel-1.7.0-ha4b6fd6_2.conda @@ -2559,31 +2407,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2025.4.1-hecca717_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.6.1-h280c20c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.2-hb80d175_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libraw-0.21.5-h074291d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.0-h4c96295_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsdformat14-14.8.0-py312h1f51ce1_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-14.3.0-h9f08a49_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.10-hd0affe5_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libtool-2.5.4-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libunwind-1.8.3-h65a8314_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburcu-0.14.0-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liburing-2.14-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libusb-1.0.29-h73b1eb8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libva-2.23.0-he1eb515_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h54a6638_2.conda @@ -2597,8 +2446,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.2-hca6bf5a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.2-he237659_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzenohc-1.7.2-hfad6b34_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lttng-ust-2.13.9-hf5eda4c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lxml-6.0.2-py312h63ddcf0_2.conda @@ -2618,7 +2468,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/multidict-6.7.1-py312h8a5da7c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.19.1-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.20.0-py312h4c3975b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nanoflann-1.6.1-hff21bea_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda @@ -2632,20 +2482,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/octomap-1.10.0-h84d6215_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ompl-1.7.0-py312hd4042a8_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-h5888daf_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.12.0-qt6_py312h7bb6282_612.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.4.6-h40f6f1d_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.4.8-h40f6f1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.26.3-h8d634f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/orocos-kdl-1.5.3-hecca717_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/osrf_pycommon-0.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -2672,12 +2520,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.15-h3f63f65_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-17.0-haebf07f_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-17.0-h33dcb6b_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/py-opencv-4.12.0-qt6_py312h598be00_612.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.2-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.3-pyhfe8187e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.2-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.3-pyh648e204_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pybullet-3.25-py312hf49885f_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pycairo-1.29.0-py312h2596900_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda @@ -2685,34 +2535,36 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydot-4.0.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pymongo-4.16.0-py312h1289d80_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h587e1b2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py312h82c0db2_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.18.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.17.0-py312h1289d80_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py312h9da60e5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py312h50ac2ff_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysoundcard-0.4.5-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-hab00c5b_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.8.1-py312h5253ce2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-orocos-kdl-1.5.3-py312h1289d80_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hc240232_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-hb82b983_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h0c412b5_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-pl5321h16c4a6b_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidjson-1.1.0.post20240409-h3f2d84a_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/readline-8.2.9999-h4616a5c_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.4.4-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda @@ -2772,11 +2624,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-angles-1.16.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-backward-ros-1.0.8-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-better-launch-1.0.4-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-biped-interfaces-0.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bitbots-tf-buffer-1.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-builtin-interfaces-2.0.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-camera-calibration-parsers-5.1.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-camera-info-manager-5.1.7-np2py312h2ed9cc7_14.conda @@ -2806,10 +2653,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dummy-map-server-0.33.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dummy-robot-bringup-0.33.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dummy-sensors-0.33.9-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamic-stack-decider-0.5.3-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamic-stack-decider-visualization-0.2.1-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dynamixel-sdk-3.8.4-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamixel-workbench-toolbox-0.1.8-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-eigen-stl-containers-1.1.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-eigen3-cmake-module-0.3.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-example-interfaces-0.12.0-np2py312h2ed9cc7_14.conda @@ -2835,9 +2678,9 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-filters-2.2.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-foonathan-memory-vendor-1.3.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-foxglove-bridge-3.2.2-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-gazebo-msgs-3.8.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-generate-parameter-library-0.6.0-np2py312h2c89a96_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-generate-parameter-library-py-0.6.0-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-geographic-msgs-1.0.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-geometric-shapes-2.3.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-geometry-msgs-5.3.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-geometry2-0.36.18-np2py312h2ed9cc7_14.conda @@ -2849,7 +2692,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-gz-tools-vendor-0.0.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-gz-utils-vendor-0.0.5-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-hardware-interface-4.42.1-np2py312h2c89a96_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-humanoid-base-footprint-0.1.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-iceoryx-binding-c-2.0.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-iceoryx-hoofs-2.0.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-iceoryx-posh-2.0.6-np2py312h2ed9cc7_14.conda @@ -2858,12 +2700,8 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-image-publisher-5.0.11-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-image-tools-0.33.9-np2py312hedab9cf_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-image-transport-5.1.7-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-imu-complementary-filter-2.1.5-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-interactive-markers-2.5.5-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-intra-process-demo-0.33.9-np2py312hedab9cf_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-image-node-0.0.0-np2py312hedab9cf_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-interfaces-0.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-library-0.0.0-np2py312hedab9cf_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-joint-limits-4.42.1-np2py312h2c89a96_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-joint-state-publisher-2.4.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-joint-state-publisher-gui-2.4.0-np2py312h2ed9cc7_14.conda @@ -2872,7 +2710,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-keyboard-handler-0.3.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-laser-geometry-2.7.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-3.4.9-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-param-builder-0.1.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-ros-0.26.10-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-testing-3.4.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-testing-ament-cmake-3.4.9-np2py312h2ed9cc7_14.conda @@ -2890,38 +2727,18 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-mcap-vendor-0.26.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-message-filters-4.11.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-common-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-configs-utils-2.12.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-core-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-kinematics-2.12.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-msgs-2.6.0-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-planners-ompl-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-benchmarks-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-move-group-2.12.4-np2py312h2c89a96_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-occupancy-map-monitor-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-planning-2.12.4-np2py312h2c89a96_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-planning-interface-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-robot-interaction-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-visualization-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-warehouse-2.12.4-np2py312h2c89a96_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-app-plugins-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-assistant-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-controllers-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-core-plugins-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-framework-2.12.4-np2py312h2c89a96_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-srdf-plugins-2.12.4-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-simple-controller-manager-2.12.4-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-nav-msgs-5.3.6-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-nmea-msgs-2.1.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-object-recognition-msgs-2.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-octomap-msgs-2.0.1-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ompl-1.7.0-py312hbd645f5_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-orocos-kdl-vendor-0.5.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-osqp-vendor-0.2.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-osrf-pycommon-2.1.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pal-statistics-2.7.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pal-statistics-msgs-2.7.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-parameter-traits-0.6.0-np2py312h2c89a96_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-particle-filter-0.0.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pcl-conversions-2.6.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pcl-msgs-1.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pendulum-control-0.33.9-np2py312h2ed9cc7_14.conda @@ -2966,13 +2783,13 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-implementation-2.15.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-implementation-cmake-7.3.2-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-zenoh-cpp-0.2.9-np2py312ha80d210_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-robot-localization-3.8.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-robot-state-publisher-3.3.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros-base-0.11.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros-core-0.11.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros-environment-4.2.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros-workspace-1.0.3-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ros2-numpy-2.0.9-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ros2-python-extension-1.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros2action-0.32.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros2bag-0.26.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros2cli-0.32.7-np2py312h2ed9cc7_14.conda @@ -3034,7 +2851,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.7-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rosx-introspection-1.0.2-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-rot-conv-1.1.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rpyutils-0.4.2-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rqt-action-2.2.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rqt-bag-1.5.5-np2py312h2ed9cc7_14.conda @@ -3073,12 +2889,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-sensor-msgs-py-5.3.6-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-service-msgs-2.0.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-shape-msgs-5.3.6-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-field-map-generator-0.0.0-np2py312hedab9cf_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-ipm-0.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-2d-msgs-1.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-3d-msgs-1.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-3d-rviz-markers-1.0.0-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-attribute-msgs-1.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-spdlog-vendor-1.6.1-np2py312h918b84f_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-sqlite3-vendor-0.26.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-srdfdom-2.0.7-np2py312h2ed9cc7_14.conda @@ -3119,7 +2929,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-transmission-interface-4.42.1-np2py312h2c89a96_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-turtlesim-1.8.3-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-type-description-interfaces-2.0.3-np2py312h2ed9cc7_14.conda - - conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-udp-bridge-0.0.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-uncrustify-vendor-3.0.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-unique-identifier-msgs-2.5.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-urdf-2.10.0-np2py312h2ed9cc7_14.conda @@ -3130,10 +2939,10 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-vision-msgs-4.1.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-vision-opencv-4.1.0-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-visualization-msgs-5.3.6-np2py312h2ed9cc7_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-warehouse-ros-2.0.5-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-web-video-server-2.1.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-xacro-2.1.1-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-yaml-cpp-vendor-9.0.1-np2py312h2ed9cc7_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-zenoh-cpp-vendor-0.2.9-np2py312ha80d210_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-zstd-vendor-0.26.9-np2py312h2ed9cc7_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros2-distro-mutex-0.13.0-jazzy_14.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rosdistro-1.0.1-pyhd8ed1ab_0.conda @@ -3144,17 +2953,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/sdformat14-14.8.0-h5bb51b8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdformat14-python-14.8.0-py312h22a3d64_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.32.56-h54a6638_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.2-hdeec2a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/setproctitle-1.3.7-py312h5253ce2_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.4-hdeec2a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/shaderc-2025.5-h718be3e_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.10.0-py312h1289d80_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.2-h03e3b7b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/soxr-0.1.3-h0b41bf4_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.17.0-hab81395_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-rtd-theme-3.1.0-hd8ed1ab_0.conda @@ -3169,17 +2978,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/spirv-tools-2026.1-hb700be7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.32.3-hcee41ef_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.0-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-2022.3.0-hb700be7_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2022.3.0-h51de99f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tinyxml2-11.0.0-h3f2d84a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py312h4c3975b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transforms3d-0.4.2-pyhd8ed1ab_1.conda + - conda: https://data.bit-bots.de/conda-misc/output/noarch/tts-supertonic-1.0.0-h4616a5c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -3198,11 +3008,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.5.2-py312h6fba518_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.5.2-py312hcdbd8b1_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wadler-lindig-0.1.7-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://data.bit-bots.de/conda-misc/output/linux-64/webots-2022b-hb0f4dca_5.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py312h4c3975b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 @@ -3243,65 +3052,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yarl-1.23.0-py312h8a5da7c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zenoh-rust-abi-1.7.2.1.85.0-h8619998_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zziplib-0.13.69-he45264a_2.conda - conda: src/bitbots_navigation/bitbots_rust_nav build: hb0f4dca_0 - - pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz - - pypi: https://files.pythonhosted.org/packages/a9/c7/57423942b2f847cdbbb46494568d00cd8a45500904ea026f0aad6ca01bc7/editdistance-0.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/e0/13/e430bc0af434d8775614283ceaa6181b4083e3e50ab1a6939328ca6aec3f/epitran-1.17-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/73/2d4ac4076c3a9773528d7e16129367ef9885e9dc36dcf64b516ea013a2f0/espeak_phonemizer-1.3.1.tar.gz - pypi: https://files.pythonhosted.org/packages/ea/78/9a8a174011682d71cb4922f4014ebbeb9d3067922678e7059351fd9207cf/exhale-0.3.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/e1/6b5a01ef36b5341d5d0899401e4413594dfaa21f86cfc05be8efb25baf81/gruut-2.4.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/51/9f/7eff478e38913cc9930527ff40c9ebcb04744dfcd0ddd43bd5a1eb9565b7/gruut-ipa-0.13.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/a4/e3/22748996c573c6a7d5326ef0292956afac089c73f14e3dfee0a94661e631/gruut_lang_en-2.0.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/93/35/850277d1b17b206bd10874c8a9a3f52e059452fb49bb0d22cbb908f6038b/hypercorn-0.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4f/9a/ab96291470e305504aa4b7a2e0ec132e930da89eb3ca7a82fbe03167c131/jsonlines-1.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/15/c2/3842d8e39006b5b03384418b55108a3f3931ac6fe9b998814be81267acec/marisa_trie-1.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/11/8f92f01da9cc41247008856438aa052cc93f74e4ac12ff250eb96a44249a/mycroft_mimic3_tts-0.2.4.tar.gz - - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d6/5b/545e9267a1cc080c8a1be2746113a063e34bcdd0f5173fd665a5c13cb234/num2words-0.5.14-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/28/7c/fd253da53594ab8efbefdc85b3638620ab1a6aab6eb7028a513c853559ce/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/b2/f1/d5318874aed3b57bd00bf76e8f9698b73b578137d9d403314a4e649fbb63/onnxruntime_webgpu-1.25.0.dev20260212001-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/3d/fe/89d77e424365280b79d99b3e1e7d606f5165af2f2ecfaf0c6d24c799d607/pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/72/2a/05a47a6c291414f5a66901f8d1f6ba68e8ec9fccb341d56fa0b31479d41d/panphon-0.22.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/6f/0cf0746d02a356103b7c3a065dbc188d8b5092e58bb363d74aa668ee1ad1/phonemes2ids-1.2.2.tar.gz - - pypi: https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/b7/ba5551480e397c6e86805cc381dd6dc36b15411a806c00c35b661d8dd77e/pyamdgpuinfo-2.1.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/63/3f/da9732ccb24b71a7539470dcdfcd16c923692788f39553f37238f208ca55/python_crfsuite-0.9.12-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/84/14/9fb5842581f0419b5eb85f8c26c1c0c0f4cf6b4d5be638ae3157316a2650/pyttsx3-2.99-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ea/31/da390a5a10674481dea2909178973de81fa3a246c0eedcc0e1e4114f52f8/quart_cors-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/56/feb011ed1e8724c4c57083d71877eefe61f535f6dc94aa598033a03b54b7/swagger_ui_py-21.12.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/70/cf880c3b95a6034ef673e74b369941b42315c01f1554a5637a4f8b911009/syrupy-5.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/7e/1d55a5749fbf7d1ac6411f3028128b974a3e6bb770d365a2518ecee8ce7e/xdgenvpy-2.4.0-py3-none-any.whl linux-aarch64: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/adwaita-icon-theme-49.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.13.3-py312he7e3343_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.13.5-py312he7e3343_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/alsa-lib-1.2.15.3-he30d5cf_0.conda @@ -3313,16 +3081,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/at-spi2-atk-2.38.0-h1f2db35_3.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/at-spi2-core-2.40.3-h1f2db35_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/atk-1.0-2.38.0-hedc4a1f_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.2-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/backports.zstd-1.3.0-py312h3d8e7d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bcrypt-5.0.0-py312h5eb8f6c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beartype-0.22.9-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/benchmark-1.9.5-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_102.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_102.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2022_10_07_flo_torso21_yoeox-1.0.1-h4616a5c_3.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2023_04_04_philipp_yoeox_with_team_colors-1.0.1-h4616a5c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/blinker-1.9.0-pyhff2d567_0.conda @@ -3342,7 +3110,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.2.25-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cffi-2.0.0-py312h1b372e3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.5.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/clang-format-21-21.1.8-default_he95a3c9_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/clang-format-21.1.8-default_he95a3c9_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cli11-2.6.2-h7ac5ae9_0.conda @@ -3358,12 +3126,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-devtools-0.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-library-path-0.2.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-metadata-0.2.5-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/colcon-notification-0.3.0-py312h72dafdd_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/colcon-notification-0.3.1-py312h72dafdd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-output-0.2.13-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-selection-0.2.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-parallel-executor-0.4.0-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-py_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-powershell-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-python-setup-py-0.2.9-pyhff2d567_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-recursive-crawl-0.2.3-pyhd8ed1ab_0.conda @@ -3375,15 +3143,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/compilers-1.11.0-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/conda-gcc-specs-14.3.0-hadff5d6_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/console_bridge-1.0.2-hdd96247_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/construct-2.10.70-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.13.4-py312hd077ced_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.13.5-py312hd077ced_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cppcheck-2.18.3-py312h5677ec4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cppzmq-4.11.0-h7be3492_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.5-py312hf80642e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.18.0-h7bfdcfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.19.0-hc57f145_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cxx-compiler-1.11.0-h7b35c40_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.28-h6c5dea3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.28-h6598af7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dav1d-1.2.1-h31becfc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-1.16.2-h70963c4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/dbus-python-1.3.2-py312hf371ade_6.conda @@ -3392,7 +3161,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/distro-1.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.8.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/double-conversion-3.4.0-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/eigen-3.4.0-h7ac5ae9_2.conda @@ -3402,10 +3170,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/epoxy-1.5.10-he30d5cf_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.2-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.5-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fcl-0.7.0-h841ecf2_8.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_hd1a4c92_912.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h1359815_112.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fftw-3.3.10-nompi_h66d8d02_112.conda - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-7.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-builtins-3.1.0-pyhd8ed1ab_0.conda @@ -3413,7 +3182,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-docstrings-1.7.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-import-order-0.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flake8-quotes-3.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flann-1.9.2-h8b5e525_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flann-1.9.2-headf6c6_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/flask-3.1.3-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fmt-12.1.0-h20c602a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -3428,23 +3197,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fortran-compiler-1.11.0-h151373c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freeglut-3.2.2-h5eeb66e_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freeimage-3.18.0-hfe23055_24.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.2-h8af1aa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fribidi-1.0.16-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/frozenlist-1.7.0-py312hb10c72c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc-14.3.0-h2e72a27_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_impl_linux-aarch64-14.3.0-h533bfc8_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_21.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.5-h90308e0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_22.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.6-h90308e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/geographiclib-cpp-2.7-hfefdfc9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gettext-0.25.1-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gettext-tools-0.25.1-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran-14.3.0-ha384071_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_impl_linux-aarch64-14.3.0-h6b0ea1e_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h70575c0_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/git-2.53.0-pl5321h5dcfaa0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/git-subrepo-0.4.9-hc364b38_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.46-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hedfd65a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hd9db0c5_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glew-2.3.0-hf9dcc85_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-2.86.4-hc66a092_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/glib-tools-2.86.4-hc87f4d4_1.conda @@ -3456,12 +3226,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/graphviz-14.1.2-h45e821f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gst-plugins-base-1.26.10-hae777ca_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gstreamer-1.26.10-hc24f651_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gstreamer-orc-0.4.42-h70b131a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtest-1.17.0-h17cf362_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk3-3.24.51-h75d4e7a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk3-3.24.52-h75d4e7a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gts-0.7.6-he293c15_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx-14.3.0-ha384071_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_impl_linux-aarch64-14.3.0-h0d4f5d4_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h32e4f2e_21.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h007e36a_22.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-cmake3-3.5.5-h740f95d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-math7-7.5.2-h1ad700d_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-math7-python-7.5.2-py312h9452373_2.conda @@ -3469,27 +3240,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-tools2-2.0.3-hd91f489_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gz-utils2-2.2.1-h2ce864c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.1.1-h1134a53_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf4-4.2.15-hb6ba311_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_106.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_108.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hicolor-icon-theme-0.17-h8af1aa0_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyh707e725_8.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/imath-3.2.2-h92288e7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jack-1.9.22-h9d01bbc_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.9-h27a9ab5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.9-h850eeee_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jaxtyping-0.3.7-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda @@ -3499,11 +3270,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-4.18.0-h05a177a_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/keyutils-1.6.3-h86ecc28_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.0-py312h1683e8e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lame-3.100-h4e544f5_1003.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/lark-parser-0.12.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lcms2-2.18-h9d5b58d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lerc-4.1.0-h52b7260_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libabseil-20250512.1-cxx17_h201e9ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libacl-2.3.2-h883460d_0.conda @@ -3512,8 +3283,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-0.25.1-h5e0f5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libasprintf-devel-0.25.1-h5e0f5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libass-0.17.4-hcfe818d_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libavif16-1.4.0-ha599f14_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libattr-2.5.2-he30d5cf_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libavif16-1.4.1-ha599f14_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libboost-1.88.0-h5651608_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libboost-devel-1.88.0-h37bb5a9_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libboost-headers-1.88.0-h8af1aa0_7.conda @@ -3522,13 +3294,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlicommon-1.2.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlidec-1.2.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libbrotlienc-1.2.0-he30d5cf_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-h68e9139_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-hf9559e3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libccd-double-2.1-h2f0025b_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp21.1-21.1.8-default_he95a3c9_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp22.1-22.1.0-default_he95a3c9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang13-22.1.0-default_h94a09a5_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h5cdc715_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.18.0-h7bfdcfb_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.19.0-hc57f145_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdeflate-1.25-h1af38f5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libdrm-2.4.125-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libedit-3.1.20250104-pl5321h976ea20_0.conda @@ -3536,11 +3309,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libegl-devel-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libev-4.33-h31becfc_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libevent-2.1.12-h4ba1bb4_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.5.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libflac-1.4.3-h2f0025b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.2-h8af1aa0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.2-hdae7a39_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-15.2.0-h8acb6b2_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-14.3.0-h25ba3ff_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-15.2.0-he9431aa_18.conda @@ -3568,21 +3341,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libidn2-2.3.8-h99ff5a0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjpeg-turbo-3.1.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libjxl-0.11.2-h71be66a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.11.0-5_hb558247_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.11.0-6_hb558247_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm21-21.1.8-hfd2ba90_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm22-22.1.1-hfd2ba90_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm22-22.1.2-hfd2ba90_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libltdl-2.4.3a-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-devel-5.8.2-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libmicrohttpd-1.0.2-h3543b8c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnetcdf-4.9.3-nompi_h06de00c_104.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libntlm-1.4-hf897c2e_1002.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnuma-2.0.18-he30d5cf_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libode-0.16.6-py312h4eed292_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libogg-1.3.5-h86ecc28_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopencv-4.12.0-qt6_py312h051a780_612.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopengl-1.7.0-hd24410f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopengl-devel-1.7.0-hd24410f_2.conda @@ -3599,31 +3372,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenvino-tensorflow-lite-frontend-2025.4.1-hfae3067_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopus-1.6.1-h80f16a2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpciaccess-0.18-h86ecc28_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-18.2-hf8816c8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.56-h1abf092_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-18.3-h7d4fc67_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libprotobuf-6.31.1-h2cf3c76_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libraw-0.21.5-h6c2e892_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.62.0-hf685517_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.62.1-hf685517_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsanitizer-14.3.0-hedb4206_18.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsdformat14-14.8.0-py312h39f64fe_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsndfile-1.2.2-h79657aa_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.52.0-h10b116e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libssh2-1.11.1-h18c354c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-15.2.0-hef695bb_18.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-aarch64-14.3.0-h57c8d61_118.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-15.2.0-hdbbeba8_18.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.10-hf9559e3_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hf9559e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtasn1-4.21.0-he30d5cf_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtheora-1.1.1-h68df207_1006.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtiff-4.7.1-hdb009f0_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.10-hf9559e3_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtool-2.5.4-h5ad3122_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hf9559e3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunistring-0.9.10-hf897c2e_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libunwind-1.8.3-h6470e1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburcu-0.14.0-h0a1ffab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liburing-2.14-hfefdfc9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libusb-1.0.29-h06eaf92_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuv-1.51.0-he30d5cf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvorbis-1.3.7-h7ac5ae9_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libvpx-1.15.2-hfae3067_0.conda @@ -3635,8 +3409,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.2-h79dcc73_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.2-h825857f_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxslt-1.1.43-h6700d25_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzenohc-1.7.2-hd661084_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzip-1.11.2-h3e8f909_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lttng-ust-2.13.9-h8d236e2_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/lxml-6.0.2-py312hfe2c7ef_2.conda @@ -3656,7 +3431,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/msgpack-python-1.1.2-py312h4f740d2_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/multidict-6.7.1-py312ha4530ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.19.1-py312h996f985_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.20.0-py312h996f985_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nanoflann-1.6.1-h17cf362_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-ha32ae93_3.conda @@ -3669,19 +3444,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/nss-3.118-h544fa81_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/numpy-1.26.4-py312h470d778_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/octomap-1.10.0-h17cf362_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ompl-1.7.0-py312hae32f5c_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/opencv-4.12.0-qt6_py312h750a492_612.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.4.6-hd0c962a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.4.8-hd0c962a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openh264-2.6.0-h0564a2a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjpeg-2.5.4-h5da879a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openjph-0.26.3-h55827e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.10-h30c48ee_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.10-h2fb54aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.6.1-h546c87b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orocos-kdl-1.5.3-hfae3067_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/osrf_pycommon-0.2.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/p11-kit-0.26.2-h376a255_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.56.4-he55ef5b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.56.4-h8547ced_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -3708,12 +3481,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pthread-stubs-0.4-h86ecc28_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pugixml-1.15-h6ef32b0_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-17.0-h3dd60a8_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-client-17.0-hcf98165_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-daemon-17.0-hb9404ba_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/py-opencv-4.12.0-qt6_py312h1743b20_612.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.2-pyh7a1b43c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.3-pyhfe8187e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.2-pyhc7ab6ef_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.3-pyh648e204_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pybullet-3.25-py312h88173f1_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pycairo-1.29.0-py312h1f35134_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.14.0-pyhd8ed1ab_0.conda @@ -3721,34 +3496,36 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pydot-4.0.1-pyhcf101f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyflakes-3.4.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pymongo-4.16.0-py312hfcd9f9b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pynacl-1.6.2-py312hcd1a082_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pynacl-1.6.2-py312h9d3b8a6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyqt-5.15.11-py312hc13527c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyqt-builder-1.18.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyqt5-sip-12.17.0-py312h1ab2c47_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.10.2-py312h4810df5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.10.2-py312hfc1e6cc_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pysoundcard-0.4.5-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-repeat-0.9.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-rerunfailures-16.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.0-h43d1f9e_0_cpython.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-librt-0.8.1-py312hd41f8a7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-orocos-kdl-1.5.3-py312h1ab2c47_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.12-8_cp312.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qhull-2020.2-h70be974_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt-main-5.15.15-h912a755_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.10.2-h5343e53_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt-main-5.15.15-ha9b3be2_8.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.10.2-pl5321h598db47_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rapidjson-1.1.0.post20240409-h5ad3122_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rav1e-0.8.1-h9d4cc37_0.conda - conda: https://data.bit-bots.de/conda-misc/output/noarch/readline-8.2.9999-h4616a5c_4.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.4.4-py312hcd1a082_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rhash-1.4.6-h86ecc28_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.3.3-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda @@ -3808,11 +3585,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-angles-1.16.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-async-web-server-cpp-2.0.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-backward-ros-1.0.8-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-better-launch-1.0.4-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-biped-interfaces-0.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bitbots-tf-buffer-1.0.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-builtin-interfaces-2.0.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-camera-calibration-parsers-5.1.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-camera-info-manager-5.1.7-np2py312h61f2ce4_14.conda @@ -3842,10 +3614,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dummy-map-server-0.33.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dummy-robot-bringup-0.33.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dummy-sensors-0.33.9-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamic-stack-decider-0.5.3-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamic-stack-decider-visualization-0.2.1-np2py312h3575a3a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dynamixel-sdk-3.8.4-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamixel-workbench-toolbox-0.1.8-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-eigen-stl-containers-1.1.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-eigen3-cmake-module-0.3.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-example-interfaces-0.12.0-np2py312h61f2ce4_14.conda @@ -3871,9 +3639,9 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-filters-2.2.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-foonathan-memory-vendor-1.3.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-foxglove-bridge-3.2.2-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-gazebo-msgs-3.8.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-generate-parameter-library-0.6.0-np2py312h8b5252a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-generate-parameter-library-py-0.6.0-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-geographic-msgs-1.0.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-geometric-shapes-2.3.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-geometry-msgs-5.3.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-geometry2-0.36.18-np2py312h61f2ce4_14.conda @@ -3885,7 +3653,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-gz-tools-vendor-0.0.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-gz-utils-vendor-0.0.5-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-hardware-interface-4.42.1-np2py312h8b5252a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-humanoid-base-footprint-0.1.2-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-binding-c-2.0.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-hoofs-2.0.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-iceoryx-posh-2.0.6-np2py312h61f2ce4_14.conda @@ -3894,12 +3661,8 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-image-publisher-5.0.11-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-image-tools-0.33.9-np2py312h6b1b059_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-image-transport-5.1.7-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-imu-complementary-filter-2.1.5-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-interactive-markers-2.5.5-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-intra-process-demo-0.33.9-np2py312h6b1b059_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-image-node-0.0.0-np2py312h784231a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-interfaces-0.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-library-0.0.0-np2py312h784231a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-joint-limits-4.42.1-np2py312h8b5252a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-joint-state-publisher-2.4.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-joint-state-publisher-gui-2.4.0-np2py312h61f2ce4_14.conda @@ -3908,7 +3671,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-keyboard-handler-0.3.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-laser-geometry-2.7.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-3.4.9-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-param-builder-0.1.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-ros-0.26.10-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-testing-3.4.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-testing-ament-cmake-3.4.9-np2py312h61f2ce4_14.conda @@ -3926,38 +3688,18 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-mcap-vendor-0.26.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-message-filters-4.11.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-common-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-configs-utils-2.12.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-core-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-kinematics-2.12.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-msgs-2.6.0-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-planners-ompl-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-benchmarks-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-move-group-2.12.4-np2py312h8b5252a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-occupancy-map-monitor-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-planning-2.12.4-np2py312h8b5252a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-planning-interface-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-robot-interaction-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-visualization-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-warehouse-2.12.4-np2py312h8b5252a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-app-plugins-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-assistant-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-controllers-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-core-plugins-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-framework-2.12.4-np2py312h8b5252a_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-srdf-plugins-2.12.4-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-simple-controller-manager-2.12.4-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-nav-msgs-5.3.6-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-nmea-msgs-2.1.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-object-recognition-msgs-2.0.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-octomap-msgs-2.0.1-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ompl-1.7.0-py312h8f0e40e_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-orocos-kdl-vendor-0.5.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-osqp-vendor-0.2.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-osrf-pycommon-2.1.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pal-statistics-2.7.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pal-statistics-msgs-2.7.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-parameter-traits-0.6.0-np2py312h8b5252a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-particle-filter-0.0.1-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pcl-conversions-2.6.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pcl-msgs-1.0.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-pendulum-control-0.33.9-np2py312h61f2ce4_14.conda @@ -4002,13 +3744,13 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-fastrtps-shared-cpp-8.4.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-implementation-2.15.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-implementation-cmake-7.3.2-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-zenoh-cpp-0.2.9-np2py312h1cd77a6_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-robot-localization-3.8.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-robot-state-publisher-3.3.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros-base-0.11.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros-core-0.11.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros-environment-4.2.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros-workspace-1.0.3-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ros2-numpy-2.0.9-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ros2-python-extension-1.0.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros2action-0.32.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros2bag-0.26.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ros2cli-0.32.7-np2py312h61f2ce4_14.conda @@ -4070,7 +3812,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-introspection-c-4.6.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rosidl-typesupport-introspection-cpp-4.6.7-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rosx-introspection-1.0.2-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-rot-conv-1.1.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rpyutils-0.4.2-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rqt-action-2.2.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rqt-bag-1.5.5-np2py312h61f2ce4_14.conda @@ -4109,12 +3850,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-sensor-msgs-py-5.3.6-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-service-msgs-2.0.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-shape-msgs-5.3.6-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-field-map-generator-0.0.0-np2py312h784231a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-ipm-0.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-2d-msgs-1.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-3d-msgs-1.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-3d-rviz-markers-1.0.0-np2py312h3575a3a_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-attribute-msgs-1.0.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-spdlog-vendor-1.6.1-np2py312ha677571_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-sqlite3-vendor-0.26.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-srdfdom-2.0.7-np2py312h61f2ce4_14.conda @@ -4155,7 +3890,6 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-transmission-interface-4.42.1-np2py312h8b5252a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-turtlesim-1.8.3-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-type-description-interfaces-2.0.3-np2py312h61f2ce4_14.conda - - conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-udp-bridge-0.0.0-np2py312h3575a3a_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-uncrustify-vendor-3.0.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-unique-identifier-msgs-2.5.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-urdf-2.10.0-np2py312h61f2ce4_14.conda @@ -4166,10 +3900,10 @@ environments: - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-vision-msgs-4.1.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-vision-opencv-4.1.0-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-visualization-msgs-5.3.6-np2py312h61f2ce4_14.conda - - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-warehouse-ros-2.0.5-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-web-video-server-2.1.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-xacro-2.1.1-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-yaml-cpp-vendor-9.0.1-np2py312h61f2ce4_14.conda + - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-zenoh-cpp-vendor-0.2.9-np2py312h1cd77a6_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-zstd-vendor-0.26.9-np2py312h61f2ce4_14.conda - conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros2-distro-mutex-0.13.0-jazzy_14.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rosdistro-1.0.1-pyhd8ed1ab_0.conda @@ -4180,17 +3914,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdformat14-14.8.0-hb4dca6f_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdformat14-python-14.8.0-py312he22bb7a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl2-2.32.56-h7ac5ae9_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.4.2-had2c13b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/setproctitle-1.3.7-py312hd41f8a7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.4.4-had2c13b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/shaderc-2025.5-hfeb5c2c_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sip-6.15.2-py312hfcd9f9b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sip-6.15.3-py312hfcd9f9b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/snappy-1.2.2-he774c54_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/soxr-0.1.3-hb4cce97_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/spdlog-1.17.0-h9f97df7_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-rtd-theme-3.1.0-hd8ed1ab_0.conda @@ -4213,10 +3947,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tinyxml2-11.0.0-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-noxft_h0dc03b3_103.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py312hefbd42c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py312hefbd42c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/transforms3d-0.4.2-pyhd8ed1ab_1.conda + - conda: https://data.bit-bots.de/conda-misc/output/noarch/tts-supertonic-1.0.0-h4616a5c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -4235,9 +3970,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/vtk-base-9.5.2-py312h90a26f6_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/vtk-io-ffmpeg-9.5.2-py312haba1314_7.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wadler-lindig-0.1.7-pyhe01879c_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.24.0-h4f8a99f_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.25.0-h4f8a99f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.6-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wrapt-2.1.2-py312hcd1a082_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wslink-2.5.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/x264-1!164.3095-h4e544f5_2.tar.bz2 @@ -4278,59 +4013,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-0.2.5-h80f16a2_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yaml-cpp-0.8.0-h5ad3122_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.23.0-py312ha4530ae_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zenoh-rust-abi-1.7.2.1.85.0-h4d6d557_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zfp-1.0.1-h05c1e92_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h85ac4a6_6.conda - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zziplib-0.13.69-h650d8d0_2.conda - conda: src/bitbots_navigation/bitbots_rust_nav build: he8cfe8b_0 - - pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz - - pypi: https://files.pythonhosted.org/packages/e1/31/bfb8e590f922089dc3471ed7828a6da2fc9453eba38c332efa9ee8749fd7/editdistance-0.8.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/e0/13/e430bc0af434d8775614283ceaa6181b4083e3e50ab1a6939328ca6aec3f/epitran-1.17-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ff/73/2d4ac4076c3a9773528d7e16129367ef9885e9dc36dcf64b516ea013a2f0/espeak_phonemizer-1.3.1.tar.gz - pypi: https://files.pythonhosted.org/packages/ea/78/9a8a174011682d71cb4922f4014ebbeb9d3067922678e7059351fd9207cf/exhale-0.3.7-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/fc/e1/6b5a01ef36b5341d5d0899401e4413594dfaa21f86cfc05be8efb25baf81/gruut-2.4.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/51/9f/7eff478e38913cc9930527ff40c9ebcb04744dfcd0ddd43bd5a1eb9565b7/gruut-ipa-0.13.0.tar.gz - - pypi: https://files.pythonhosted.org/packages/a4/e3/22748996c573c6a7d5326ef0292956afac089c73f14e3dfee0a94661e631/gruut_lang_en-2.0.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/93/35/850277d1b17b206bd10874c8a9a3f52e059452fb49bb0d22cbb908f6038b/hypercorn-0.18.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/4f/9a/ab96291470e305504aa4b7a2e0ec132e930da89eb3ca7a82fbe03167c131/jsonlines-1.2.0-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a8/a2/1e0f0665a98968b0af7067cf2dad569e1bd8c1f13a97670b74b5ac5153d9/marisa_trie-1.4.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/46/11/8f92f01da9cc41247008856438aa052cc93f74e4ac12ff250eb96a44249a/mycroft_mimic3_tts-0.2.4.tar.gz - - pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/d6/5b/545e9267a1cc080c8a1be2746113a063e34bcdd0f5173fd665a5c13cb234/num2words-0.5.14-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/1c/dc/1f5489f7b21817d4ad352bf7a92a252bd5b438bcbaa7ad20ea50814edc79/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/d7/39/327802e0b6d693182403c144edacbc27eb82907b57062f23ef5a4c4a5ea7/pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/72/2a/05a47a6c291414f5a66901f8d1f6ba68e8ec9fccb341d56fa0b31479d41d/panphon-0.22.2-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/27/6f/0cf0746d02a356103b7c3a065dbc188d8b5092e58bb363d74aa668ee1ad1/phonemes2ids-1.2.2.tar.gz - - pypi: https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/80/15/2ff925c0776c7a2aaab3d03b0e477d1a24b0637600b7e2e928cbcc25034f/pyamdgpuinfo-2.1.7.tar.gz - - pypi: https://files.pythonhosted.org/packages/7a/0c/9725b097738f4a6aac9ac4e5a5fc6494eca69f17663d3d6ba8d0ea3858d2/python_crfsuite-0.9.12-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - - pypi: https://files.pythonhosted.org/packages/84/14/9fb5842581f0419b5eb85f8c26c1c0c0f4cf6b4d5be638ae3157316a2650/pyttsx3-2.99-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/ea/31/da390a5a10674481dea2909178973de81fa3a246c0eedcc0e1e4114f52f8/quart_cors-0.8.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/dd/c9/8cc8d850b35ab5650ff6756a1cb85286e2000b66c97520b29c1587455344/regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - pypi: https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a9/56/feb011ed1e8724c4c57083d71877eefe61f535f6dc94aa598033a03b54b7/swagger_ui_py-21.12.8-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/de/70/cf880c3b95a6034ef673e74b369941b42315c01f1554a5637a4f8b911009/syrupy-5.1.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz - - pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - - pypi: https://files.pythonhosted.org/packages/f1/7e/1d55a5749fbf7d1ac6411f3028128b974a3e6bb770d365a2518ecee8ce7e/xdgenvpy-2.4.0-py3-none-any.whl packages: - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda build_number: 20 @@ -4371,11 +4066,6 @@ packages: purls: [] size: 631452 timestamp: 1758743294412 -- pypi: https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl - name: aiofiles - version: 25.1.0 - sha256: abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695 - requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/noarch/aiohappyeyeballs-2.6.1-pyhd8ed1ab_0.conda sha256: 7842ddc678e77868ba7b92a726b437575b23aaec293bca0d40826f1026d90e27 md5: 18fd895e0e775622906cdabfc3cf0fb4 @@ -4387,9 +4077,9 @@ packages: - pkg:pypi/aiohappyeyeballs?source=hash-mapping size: 19750 timestamp: 1741775303303 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.3-py312h5d8c7f2_0.conda - sha256: ee6a1ac887fac367899278baab066c08b48a98ecdc3138bc497064c7d6ec5a17 - md5: 7ee12bbdb2e989618c080c7c611048db +- conda: https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.13.5-py312h5d8c7f2_0.conda + sha256: 52f4d07b10fe4a1ded570b0708594d2d9075223e1dd94d0c5988eb71f724a5f2 + md5: 68edaee7692efb8bbef5e95375090189 depends: - __glibc >=2.17,<3.0.a0 - aiohappyeyeballs >=2.5.0 @@ -4406,11 +4096,11 @@ packages: license_family: Apache purls: - pkg:pypi/aiohttp?source=hash-mapping - size: 1022914 - timestamp: 1767525761337 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.13.3-py312he7e3343_0.conda - sha256: 2aed494b057d93f61db977fb8f5e82b8ab0bcff14b4b6a5adac25544389b1cfa - md5: 36da95b3dbfad9517f24b9adbc18a2db + size: 1034187 + timestamp: 1775000054521 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/aiohttp-3.13.5-py312he7e3343_0.conda + sha256: 79f642056509f7e7f627cce204ec6696e0d1388b86a675938613cd4c0069da30 + md5: 6b7123551168b73a78442df402037343 depends: - aiohappyeyeballs >=2.5.0 - aiosignal >=1.4.0 @@ -4427,8 +4117,8 @@ packages: license_family: Apache purls: - pkg:pypi/aiohttp?source=hash-mapping - size: 1010947 - timestamp: 1767524734593 + size: 1024372 + timestamp: 1774999721300 - conda: https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.4.0-pyhd8ed1ab_0.conda sha256: 8dc149a6828d19bf104ea96382a9d04dae185d4a03cc6beb1bc7b84c428e3ca2 md5: 421a865222cd0c9d83ff08bc78bf3a61 @@ -4664,39 +4354,41 @@ packages: purls: [] size: 358327 timestamp: 1713898303194 -- conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda - sha256: a9c114cbfeda42a226e2db1809a538929d2f118ef855372293bd188f71711c48 - md5: 791365c5f65975051e4e017b5da3abf5 +- conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-hb03c661_1.conda + sha256: 78c516af87437f52d883193cf167378f592ad445294c69f7c69f56059087c40d + md5: 9bb149f49de3f322fca007283eaa2725 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libattr 2.5.2 hb03c661_1 + - libgcc >=14 license: GPL-2.0-or-later license_family: GPL purls: [] - size: 68072 - timestamp: 1756738968573 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.1-h4e544f5_1.tar.bz2 - sha256: 2c793b48e835a8fac93f1664c706442972a0206963bf8ca202e83f7f4d29a7d7 - md5: 1ef6c06fec1b6f5ee99ffe2152e53568 + size: 31386 + timestamp: 1773595914754 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/attr-2.5.2-he30d5cf_1.conda + sha256: 35a0229a82e1131add6816316081667ad83aa2ede31041e156c4572d010deb9d + md5: 3cadbca708894f28398e5cce1ce7cf7e depends: - - libgcc-ng >=12 + - libattr 2.5.2 he30d5cf_1 + - libgcc >=14 license: GPL-2.0-or-later license_family: GPL purls: [] - size: 74992 - timestamp: 1660065534958 -- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - sha256: c13d5e42d187b1d0255f591b7ce91201d4ed8a5370f0d986707a802c20c9d32f - md5: 537296d57ea995666c68c821b00e360b + size: 33708 + timestamp: 1773595939135 +- conda: https://conda.anaconda.org/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda + sha256: 1b6124230bb4e571b1b9401537ecff575b7b109cc3a21ee019f65e083b8399ab + md5: c6b0543676ecb1fb2d7643941fe375f2 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - - pkg:pypi/attrs?source=compressed-mapping - size: 64759 - timestamp: 1764875182184 + - pkg:pypi/attrs?source=hash-mapping + size: 64927 + timestamp: 1773935801332 - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.18.0-pyhcf101f3_1.conda sha256: a14a9ad02101aab25570543a59c5193043b73dc311a25650134ed9e6cb691770 md5: f1976ce927373500cc19d3c0b2c85177 @@ -4818,70 +4510,70 @@ packages: purls: [] size: 279762 timestamp: 1769117024546 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_101.conda - sha256: 2851d34944b056d028543f0440fb631aeeff204151ea09589d8d9c13882395de - md5: 9902aeb08445c03fb31e01beeb173988 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils-2.45.1-default_h4852527_102.conda + sha256: 3c7c5580c1720206f28b7fa3d60d17986b3f32465e63009c14c9ae1ea64f926c + md5: 212fe5f1067445544c99dc1c847d032c depends: - binutils_impl_linux-64 >=2.45.1,<2.45.2.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 35128 - timestamp: 1770267175160 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_101.conda - sha256: 7113440420c6f31742c2b29d7590900362007a0bb0d31f9bc5c9a1379d9ab702 - md5: 77f58300ab7d95ce79f9c2c13ad72d5c + size: 35436 + timestamp: 1774197482571 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.45.1-default_hf1166c9_102.conda + sha256: 63a1bec2fc966476bf7a387a20e8987edd5640d37a40ffb2f6e2217ef82b816b + md5: 3a238b9dcf59d03a379712f270867d80 depends: - binutils_impl_linux-aarch64 >=2.45.1,<2.45.2.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 35322 - timestamp: 1770267247190 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_101.conda - sha256: 74341b26a2b9475dc14ba3cf12432fcd10a23af285101883e720216d81d44676 - md5: 83aa53cb3f5fc849851a84d777a60551 + size: 35511 + timestamp: 1774197558632 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45.1-default_hfdba357_102.conda + sha256: 0a7d405064f53b9d91d92515f1460f7906ee5e8523f3cd8973430e81219f4917 + md5: 8165352fdce2d2025bf884dc0ee85700 depends: - - ld_impl_linux-64 2.45.1 default_hbd61a6d_101 + - ld_impl_linux-64 2.45.1 default_hbd61a6d_102 - sysroot_linux-64 - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 3744895 - timestamp: 1770267152681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_101.conda - sha256: e90ab42a5225dc1eaa6e4e7201cd7b8ed52dad6ec46814be7e5a4039433ae85c - md5: df6e1dc38cbe5642350fa09d4a1d546b + size: 3661455 + timestamp: 1774197460085 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.45.1-default_h5f4c503_102.conda + sha256: 7fd4ddde2f0150d015dfa9f2db5f428bd1570078f270e4bd4f116487a52de169 + md5: 56a04d796d7e3cdc9f8d2e1278e91bff depends: - - ld_impl_linux-aarch64 2.45.1 default_h1979696_101 + - ld_impl_linux-aarch64 2.45.1 default_h1979696_102 - sysroot_linux-aarch64 - zstd >=1.5.7,<1.6.0a0 license: GPL-3.0-only license_family: GPL purls: [] - size: 4741684 - timestamp: 1770267224406 -- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_101.conda - sha256: 4826f97d33cbe54459970a1e84500dbe0cccf8326aaf370e707372ae20ec5a47 - md5: dec96579f9a7035a59492bf6ee613b53 + size: 4683754 + timestamp: 1774197535605 +- conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.45.1-default_h4852527_102.conda + sha256: 78a58d523d072b7f8e591b8f8572822e044b31764ed7e8d170392e7bc6d58339 + md5: 2a307a17309d358c9b42afdd3199ddcc depends: - - binutils_impl_linux-64 2.45.1 default_hfdba357_101 + - binutils_impl_linux-64 2.45.1 default_hfdba357_102 license: GPL-3.0-only license_family: GPL purls: [] - size: 36060 - timestamp: 1770267177798 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_101.conda - sha256: 4ed3cf8af327b1c8b7e71433c98eb0154027e07b726136e81235276e9025489a - md5: 99924e610d9960dc3d8b865614787cec + size: 36304 + timestamp: 1774197485247 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_linux-aarch64-2.45.1-default_hf1166c9_102.conda + sha256: ad076ff5f3d7734c48ea241a99c16336c278081a5f7a523329d0d5956723c481 + md5: 68d0661516aed9cab68d2ad6e287941f depends: - - binutils_impl_linux-aarch64 2.45.1 default_h5f4c503_101 + - binutils_impl_linux-aarch64 2.45.1 default_h5f4c503_102 license: GPL-3.0-only license_family: GPL purls: [] - size: 36223 - timestamp: 1770267249899 + size: 36267 + timestamp: 1774197561368 - conda: https://data.bit-bots.de/conda-misc/output/noarch/bitbots_model_2022_10_07_flo_torso21_yoeox-1.0.1-h4616a5c_3.conda sha256: c7e06d8d5d681cc5b81f9a4d509bb412f2d245dc4bdd2fd302bd0d219654e58a md5: a0f49046115d86bbfe733d8db08f1f33 @@ -5044,7 +4736,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/brotli?source=compressed-mapping + - pkg:pypi/brotli?source=hash-mapping size: 368300 timestamp: 1764017300621 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/brotli-python-1.2.0-py312hac7b6a9_1.conda @@ -5316,17 +5008,17 @@ packages: - pkg:pypi/cfgv?source=hash-mapping size: 13589 timestamp: 1763607964133 -- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.5-pyhd8ed1ab_0.conda - sha256: 05ea76a016c77839b64f9f8ec581775f6c8a259044bd5b45a177e46ab4e7feac - md5: beb628209b2b354b98203066f90b3287 +- conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.7-pyhd8ed1ab_0.conda + sha256: 3f9483d62ce24ecd063f8a5a714448445dc8d9e201147c46699fc0033e824457 + md5: a9167b9571f3baa9d448faa2139d1089 depends: - python >=3.10 license: MIT license_family: MIT purls: - pkg:pypi/charset-normalizer?source=compressed-mapping - size: 53210 - timestamp: 1772816516728 + size: 58872 + timestamp: 1775127203018 - conda: https://conda.anaconda.org/conda-forge/linux-64/clang-format-21.1.8-default_h99862b1_3.conda sha256: 1b3deb505af39c18e6ed74c2f80a81e93ccfe856dba53cb1dc6abc4a43928186 md5: 60c5a8962694a08e5a6c053a34ecf133 @@ -5646,9 +5338,9 @@ packages: - pkg:pypi/colcon-metadata?source=hash-mapping size: 20031 timestamp: 1757624342935 -- conda: https://conda.anaconda.org/conda-forge/linux-64/colcon-notification-0.3.0-py312he626ec8_3.conda - sha256: 50ab97075f6c35a111e4404596740090b22afe043f61f8db3a6628032837b861 - md5: c51180fc86dc78c23274c0b023febb3d +- conda: https://conda.anaconda.org/conda-forge/linux-64/colcon-notification-0.3.1-py312he626ec8_0.conda + sha256: 0ca8e79cda4ae209eb9c4099ac8439acbafc72909a3e925b8dabf33b8c56bc51 + md5: 6a911d6ee5447c7240ae47fbe14f2d9e depends: - colcon-core >=0.3.7 - notify2 @@ -5658,11 +5350,11 @@ packages: license_family: APACHE purls: - pkg:pypi/colcon-notification?source=hash-mapping - size: 81452 - timestamp: 1759750208628 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/colcon-notification-0.3.0-py312h72dafdd_3.conda - sha256: 9403cdd70704ee60b880d9872ce224d26410566da3ab6c9ed48659272aa896b0 - md5: 6d32f2d89f9831fbfa1dc7529a974f3e + size: 82327 + timestamp: 1774664643705 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/colcon-notification-0.3.1-py312h72dafdd_0.conda + sha256: 17fb15d6236ae5fdbc152452ed8b332965e92a11f5ce2a0f7f48a83dda59aecf + md5: 960f253942649843b9f172fd914b3bd6 depends: - colcon-core >=0.3.7 - notify2 @@ -5673,8 +5365,8 @@ packages: license_family: APACHE purls: - pkg:pypi/colcon-notification?source=hash-mapping - size: 85400 - timestamp: 1759750226369 + size: 86300 + timestamp: 1774664660377 - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-output-0.2.13-pyhd8ed1ab_0.conda sha256: ce2802f9c76f4502d17ff47f76f634449a1ae10fded0bed6a65c05d35ccafb33 md5: d0294b947e6256444f31979612468bba @@ -5687,18 +5379,18 @@ packages: - pkg:pypi/colcon-output?source=hash-mapping size: 16174 timestamp: 1676526311561 -- conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.0-pyhd8ed1ab_1.conda - sha256: 6654254ab628a9ca1648a18b7a1c078ae11bf9eca898a4ee20f601b622acd783 - md5: 6f4c11d25a53f2a7daac0232c3306556 +- conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-information-0.4.1-pyhd8ed1ab_0.conda + sha256: 4b7518952798eefcabfac2a7bb7247c04c204ee3678b83500ed31ced95c907c9 + md5: efa0bd9a29645cf88d7cd3297b518ba8 depends: - colcon-core - python >=3.10 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/colcon-package-information?source=hash-mapping - size: 18705 - timestamp: 1764592318817 + - pkg:pypi/colcon-package-information?source=compressed-mapping + size: 19302 + timestamp: 1775237925157 - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-package-selection-0.2.10-pyhd8ed1ab_1.conda sha256: 1cc39947aace656988696bc63c520e031c27a974e18b3fce0db58e18bb6228a5 md5: 1ef460db4fbafbb3279e950378d317b5 @@ -5724,18 +5416,18 @@ packages: - pkg:pypi/colcon-parallel-executor?source=hash-mapping size: 20688 timestamp: 1755156877864 -- conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-py_0.tar.bz2 - sha256: c8c6baf7ba174c908d501c6df577c140de73f46aadea09a6b3aaf405406e3b5a - md5: 434ecb5d163df485879081aedebd59bf +- conda: https://conda.anaconda.org/conda-forge/noarch/colcon-pkg-config-0.1.0-pyhd8ed1ab_1.conda + sha256: ce976faf162ad9ff2b82f37185902d0d958c25f6c7bb22484fe209542d033e1d + md5: d7fc4f85dd9abf56eff602eb29936871 depends: - colcon-core - - python >=3.5 + - python >=3.9 license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/colcon-pkg-config?source=hash-mapping - size: 10397 - timestamp: 1571038968482 + - pkg:pypi/colcon-pkg-config?source=compressed-mapping + size: 13616 + timestamp: 1775238006255 - conda: https://conda.anaconda.org/conda-forge/noarch/colcon-powershell-0.5.0-pyhd8ed1ab_0.conda sha256: 9afc4546ba72326e6a7e0e9874879709e3c14260e49ae11663164bd0f3911106 md5: 3f5f803ff3703d28c8ec4cc9b3564257 @@ -5903,18 +5595,17 @@ packages: purls: [] size: 18484 timestamp: 1648912662150 -- pypi: https://files.pythonhosted.org/packages/b2/fb/08b3f4bf05da99aba8ffea52a558758def16e8516bc75ca94ff73587e7d3/construct-2.10.70-py3-none-any.whl - name: construct - version: 2.10.70 - sha256: c80be81ef595a1a821ec69dc16099550ed22197615f4320b57cc9ce2a672cb30 - requires_dist: - - arrow ; extra == 'extras' - - cloudpickle ; extra == 'extras' - - cryptography ; extra == 'extras' - - lz4 ; extra == 'extras' - - numpy ; extra == 'extras' - - ruamel-yaml ; extra == 'extras' - requires_python: '>=3.6' +- conda: https://conda.anaconda.org/conda-forge/noarch/construct-2.10.70-pyhd8ed1ab_0.conda + sha256: 096940199e2145bd8bd9834ad8ab0f56f721da6fc749e8b13d04d8a69adad208 + md5: 58e88566bfbbf9d3ffbeda3290e7f4f0 + depends: + - python >=3.6 + license: MIT + license_family: MIT + purls: + - pkg:pypi/construct?source=hash-mapping + size: 58104 + timestamp: 1701541902326 - conda: https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.3.3-py312h0a2e395_4.conda sha256: 62447faf7e8eb691e407688c0b4b7c230de40d5ecf95bf301111b4d05c5be473 md5: 43c2bc96af3ae5ed9e8a10ded942aa50 @@ -5928,7 +5619,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/contourpy?source=compressed-mapping + - pkg:pypi/contourpy?source=hash-mapping size: 320386 timestamp: 1769155979897 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/contourpy-1.3.3-py312hf18b547_4.conda @@ -5947,9 +5638,9 @@ packages: - pkg:pypi/contourpy?source=hash-mapping size: 339097 timestamp: 1769155976173 -- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.4-py312h8a5da7c_0.conda - sha256: 2c785feaf79c31981ef4a87e41ea1161e1ce6b740ce3f1fb9cf44245cae5cf29 - md5: a8df7f0812ac4fa6bbc7135556d3e2c4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.13.5-py312h8a5da7c_0.conda + sha256: 9e88f91f85f0049686796fd25b20001bfbe9e4367714bb5d258849abcf54a705 + md5: c4d858e15305e70b255e756a4dc96e58 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -5960,11 +5651,11 @@ packages: license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping - size: 388190 - timestamp: 1770720373428 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.13.4-py312hd077ced_0.conda - sha256: 3dee4316b0c94eba5f2e08cbd6ec70c60f642e41866325f1252dfdad846854bf - md5: 83423794226d44d47f0378847257a4b2 + size: 387585 + timestamp: 1773761191371 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/coverage-7.13.5-py312hd077ced_0.conda + sha256: c4c2a23c12042cb6946a051b8e93be20b9448b8e4ea1b539ef16310fae119587 + md5: 274e257309a628fe0a2f9c3d0534340c depends: - libgcc >=14 - python >=3.12,<3.13.0a0 @@ -5974,8 +5665,8 @@ packages: license_family: APACHE purls: - pkg:pypi/coverage?source=hash-mapping - size: 388204 - timestamp: 1770721490067 + size: 388836 + timestamp: 1773762166448 - conda: https://conda.anaconda.org/conda-forge/linux-64/cppcheck-2.18.3-py312h014360a_1.conda sha256: f4321bdeddc9178f006a8cc3dedeaf32ab7e4c3be843845fbf594bc07999d2d6 md5: ab786ccd5cc6a08c0ebd5f6154c9dfcd @@ -6053,7 +5744,7 @@ packages: license: Apache-2.0 AND BSD-3-Clause AND PSF-2.0 AND MIT license_family: BSD purls: - - pkg:pypi/cryptography?source=compressed-mapping + - pkg:pypi/cryptography?source=hash-mapping size: 1712251 timestamp: 1770772759286 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cryptography-46.0.5-py312hf80642e_0.conda @@ -6074,39 +5765,39 @@ packages: - pkg:pypi/cryptography?source=hash-mapping size: 1704221 timestamp: 1770772496997 -- conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.18.0-h4e3cde8_0.conda - sha256: f6f74fcb3a5a5239d8b876e9193df04dfcb1c5866e172797da657fdee9282b84 - md5: 261410cab40c7142adce3a09e24cae41 +- conda: https://conda.anaconda.org/conda-forge/linux-64/curl-8.19.0-hcf29cc6_0.conda + sha256: 783b7525ef535b67236c2773f5553b111ee5258ad9357df2ae1755cc62a0a014 + md5: a6993977a14feee4268e7be3ad0977ab depends: - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 - - libcurl 8.18.0 h4e3cde8_0 + - krb5 >=1.22.2,<1.23.0a0 + - libcurl 8.19.0 hcf29cc6_0 - libgcc >=14 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] - size: 190096 - timestamp: 1767821756587 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.18.0-h7bfdcfb_0.conda - sha256: 69902ab9fd6b3e3f93c295bfc66c619a402a87788a95a3c9aca22d9ac98f6d7e - md5: aa7fb193d56058fefb901a263a48c88d + size: 191335 + timestamp: 1773218536473 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/curl-8.19.0-hc57f145_0.conda + sha256: 637fa4aa228966c1d13082db62a3ad1e3411ac5851a83adc6e76c2b881bef835 + md5: 9c0a6188ab0143dc09506193f420d4c5 depends: - - krb5 >=1.21.3,<1.22.0a0 - - libcurl 8.18.0 h7bfdcfb_0 + - krb5 >=1.22.2,<1.23.0a0 + - libcurl 8.19.0 hc57f145_0 - libgcc >=14 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] - size: 195461 - timestamp: 1767821684720 + size: 196905 + timestamp: 1773218494485 - conda: https://conda.anaconda.org/conda-forge/linux-64/cxx-compiler-1.11.0-hfcd1e18_0.conda sha256: 3fcc97ae3e89c150401a50a4de58794ffc67b1ed0e1851468fcc376980201e25 md5: 5da8c935dca9186673987f79cef0b2a5 @@ -6143,59 +5834,37 @@ packages: - pkg:pypi/cycler?source=hash-mapping size: 14778 timestamp: 1764466758386 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda - sha256: ee09ad7610c12c7008262d713416d0b58bf365bc38584dce48950025850bdf3f - md5: cae723309a49399d2949362f4ab5c9e4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + sha256: 7684da83306bb69686c0506fb09aa7074e1a55ade50c3a879e4e5df6eebb1009 + md5: af491aae930edc096b58466c51c4126c depends: - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libgcc >=13 - libntlm >=1.8,<2.0a0 - libstdcxx >=13 - libxcrypt >=4.4.36 - - openssl >=3.5.0,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: BSD-3-Clause-Attribution license_family: BSD purls: [] - size: 209774 - timestamp: 1750239039316 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.28-h6c5dea3_0.conda - sha256: 87b603b76b05e9be749a2616582bfb907e06e7851285bdd78f9ddaaa732d7bc7 - md5: b6d06b46e791add99cc39fbbc34530d5 + size: 210103 + timestamp: 1771943128249 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/cyrus-sasl-2.1.28-h6598af7_1.conda + sha256: 0606296a3b0cc757229dd97db8c6dc0f77e54f975f89ae63c36fb01e2a2abe61 + md5: f4fbf4001970e3e58984281a12c99969 depends: - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libgcc >=13 - libntlm - libstdcxx >=13 - libxcrypt >=4.4.36 - - openssl >=3.5.0,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: BSD-3-Clause-Attribution license_family: BSD purls: [] - size: 227295 - timestamp: 1750239141751 -- pypi: https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl - name: dataclasses-json - version: 0.6.7 - sha256: 0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a - requires_dist: - - marshmallow>=3.18.0,<4.0.0 - - typing-inspect>=0.4.0,<1 - requires_python: '>=3.7,<4.0' -- pypi: https://files.pythonhosted.org/packages/7a/bf/457ed5be028fb235f8f5ad40b5ddbf67023e0017090ea324d0fe6239a73c/dateparser-1.1.8-py2.py3-none-any.whl - name: dateparser - version: 1.1.8 - sha256: 070b29b5bbf4b1ec2cd51c96ea040dc68a614de703910a91ad1abba18f9f379f - requires_dist: - - python-dateutil - - pytz - - regex!=2019.2.19,!=2021.8.27 - - tzlocal - - hijri-converter ; extra == 'calendars' - - convertdate ; extra == 'calendars' - - fasttext ; extra == 'fasttext' - - langdetect ; extra == 'langdetect' - requires_python: '>=3.7' + size: 224450 + timestamp: 1771943147365 - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020 md5: 418c6ca5929a611cbd69204907a83995 @@ -6295,7 +5964,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/deprecated?source=compressed-mapping + - pkg:pypi/deprecated?source=hash-mapping size: 15896 timestamp: 1768934186726 - conda: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda @@ -6341,21 +6010,6 @@ packages: - pkg:pypi/dnspython?source=hash-mapping size: 196500 timestamp: 1757292856922 -- pypi: https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz - name: docopt - version: 0.6.2 - sha256: 49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491 -- conda: https://conda.anaconda.org/conda-forge/noarch/docstring_parser-0.17.0-pyhd8ed1ab_0.conda - sha256: 3069a555097f084d3b7bc8f9efbb42f9907ecbfa24d310c63df9814a8df491af - md5: ce49d3e5a7d20be2ba57a2c670bdd82e - depends: - - python >=3.9 - license: MIT - license_family: MIT - purls: - - pkg:pypi/docstring-parser?source=hash-mapping - size: 31742 - timestamp: 1753195731224 - conda: https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_1.conda sha256: fa5966bb1718bbf6967a85075e30e4547901410cc7cb7b16daf68942e9a94823 md5: 24c1ca34138ee57de72a943237cde4cc @@ -6389,16 +6043,6 @@ packages: purls: [] size: 71905 timestamp: 1765194538141 -- pypi: https://files.pythonhosted.org/packages/a9/c7/57423942b2f847cdbbb46494568d00cd8a45500904ea026f0aad6ca01bc7/editdistance-0.8.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: editdistance - version: 0.8.1 - sha256: c59248eabfad603f0fba47b0c263d5dc728fb01c2b6b50fb6ca187cec547fdb3 - requires_python: '>=3.8' -- pypi: https://files.pythonhosted.org/packages/e1/31/bfb8e590f922089dc3471ed7828a6da2fc9453eba38c332efa9ee8749fd7/editdistance-0.8.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl - name: editdistance - version: 0.8.1 - sha256: 24b5f9c9673c823d91b5973d0af8b39f883f414a55ade2b9d097138acd10f31e - requires_python: '>=3.8' - conda: https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h54a6638_2.conda sha256: a627704a4dc57459dbcdec8296c3f7f1801e53d441b7cadb56a2caa57920a5b3 md5: 00f77958419a22c6a41568c6decd4719 @@ -6492,18 +6136,6 @@ packages: - pkg:pypi/empy?source=hash-mapping size: 40210 timestamp: 1586444722817 -- pypi: https://files.pythonhosted.org/packages/e0/13/e430bc0af434d8775614283ceaa6181b4083e3e50ab1a6939328ca6aec3f/epitran-1.17-py2.py3-none-any.whl - name: epitran - version: '1.17' - sha256: 3222fd1038da5315abd187b4382bc8386e3fb045ba6094759877ba3fbe9c9a8d - requires_dist: - - setuptools - - unicodecsv - - regex - - panphon>=0.19 - - marisa-trie - - requests - - subprocess32 ; python_full_version < '3' - conda: https://conda.anaconda.org/conda-forge/linux-64/epoxy-1.5.10-hb03c661_2.conda sha256: a5b51e491fec22bcc1765f5b2c8fff8a97428e9a5a7ee6730095fb9d091b0747 md5: 057083b06ccf1c2778344b6dabace38b @@ -6549,10 +6181,6 @@ packages: purls: [] size: 422103 timestamp: 1758743388115 -- pypi: https://files.pythonhosted.org/packages/ff/73/2d4ac4076c3a9773528d7e16129367ef9885e9dc36dcf64b516ea013a2f0/espeak_phonemizer-1.3.1.tar.gz - name: espeak-phonemizer - version: 1.3.1 - sha256: a591335318e253fc01599370cebc63bcc7f46155a7a7af4496fbf6ca749d0ec9 - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda sha256: ee6cf346d017d954255bbcbdb424cddea4d14e4ed7e9813e429db1d795d01144 md5: 8e662bd460bda79b1ea39194e3c4c9ab @@ -6586,44 +6214,44 @@ packages: - lxml - six requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.4-hecca717_0.conda - sha256: 0cc345e4dead417996ce9a1f088b28d858f03d113d43c1963d29194366dcce27 - md5: a0535741a4934b3e386051065c58761a +- conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.7.5-hecca717_0.conda + sha256: 210155553489739765f31001f84eba91e58d9c692b032eed33f1a20340c78acb + md5: 7de50d165039df32d38be74c1b34a910 depends: - __glibc >=2.17,<3.0.a0 - - libexpat 2.7.4 hecca717_0 + - libexpat 2.7.5 hecca717_0 - libgcc >=14 license: MIT license_family: MIT purls: [] - size: 145274 - timestamp: 1771259434699 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.4-hfae3067_0.conda - sha256: 5f087bef054c681edcaae84a8c2230585b938691e371ff92957a30707b7fcdf7 - md5: b304307db639831ad7caabd2eac6fca6 + size: 146195 + timestamp: 1774719191740 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/expat-2.7.5-hfae3067_0.conda + sha256: c9d855523a1919889d620b82bb2304159081c5c1745c6eaf6f64102bc148c073 + md5: d2bb0c889d94f2fdc5856392c3002976 depends: - - libexpat 2.7.4 hfae3067_0 + - libexpat 2.7.5 hfae3067_0 - libgcc >=14 license: MIT license_family: MIT purls: [] - size: 137701 - timestamp: 1771259543650 -- conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.2-pyhd8ed1ab_1.conda - sha256: 2ffc9220613f6e3ea59318d0249bdd59fe666e8781a213173ef5189934aa0601 - md5: 572e7a86f6323334b4b25375003149a1 + size: 138486 + timestamp: 1774719140894 +- conda: https://conda.anaconda.org/conda-forge/noarch/fabric-3.2.3-pyhd8ed1ab_0.conda + sha256: 2b40cedb829d5edef303b2cc182847b5f1a1a24454bc0cfd59a56552c6e058d9 + md5: 4117dc2692ae84eb9da51d7d7820c45c depends: - decorator >=5 - deprecated >=1.2 - - invoke >=2.0 + - invoke >=2.0,<3.0 - paramiko >=2.4 - - python >=3.9 + - python >=3.10 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/fabric?source=hash-mapping - size: 54770 - timestamp: 1734957505291 + size: 55825 + timestamp: 1775457354890 - conda: https://conda.anaconda.org/conda-forge/linux-64/fcl-0.7.0-h543440a_8.conda sha256: b082e91c7309ffed0aa01d97aa7c7acc8deddad152211153dce381817a4ef4f6 md5: eb7214feba07f44bff77a3ad510231a9 @@ -6653,9 +6281,9 @@ packages: purls: [] size: 1454889 timestamp: 1736132812554 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_h43fde53_912.conda - sha256: ace426e0372a8cea862ada112336fe04b5445f21e761c7042a33ec5900258af6 - md5: c1a58b1a35bc7e775f7fa61f4a2e8e75 +- conda: https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-8.0.1-gpl_hac7f63c_111.conda + sha256: 30c540370084b96cb03a575a171f0092e70d168c0d6b83badd97a900aad8e186 + md5: 2dcd696d4e3a2a01cb86a87a54035c66 depends: - __glibc >=2.17,<3.0.a0 - alsa-lib >=1.2.15.3,<1.3.0a0 @@ -6702,24 +6330,22 @@ packages: - libxml2-16 >=2.14.6 - libzlib >=1.3.1,<2.0a0 - openh264 >=2.6.0,<2.6.1.0a0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.4,<4.0a0 - pulseaudio-client >=17.0,<17.1.0a0 - sdl2 >=2.32.56,<3.0a0 - shaderc >=2025.5,<2025.6.0a0 - - svt-av1 >=4.0.1,<4.0.2.0a0 + - svt-av1 >=4.0.0,<4.0.1.0a0 - x264 >=1!164.3095,<1!165 - x265 >=3.5,<3.6.0a0 - xorg-libx11 >=1.8.12,<2.0a0 - constrains: - - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL purls: [] - size: 12479894 - timestamp: 1769713683312 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_hd1a4c92_912.conda - sha256: 7d47ff6c53a705ec12cd02e22020857224862702614c299d938632adc2e157bf - md5: 046fbf5d7e36bbebca3915bb88fd8bc8 + size: 12240383 + timestamp: 1769486426545 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ffmpeg-8.0.1-gpl_h1359815_112.conda + sha256: fde1baaca485c7e95f9bc2ff4a169d538336acfbf6b1cc4f02e4ef7eaa073cfb + md5: 8b33be720e39d3f849665b31d2b42d08 depends: - alsa-lib >=1.2.15.3,<1.3.0a0 - aom >=3.9.1,<3.10.0a0 @@ -6769,13 +6395,38 @@ packages: - x264 >=1!164.3095,<1!165 - x265 >=3.5,<3.6.0a0 - xorg-libx11 >=1.8.12,<2.0a0 - constrains: - - __cuda >=12.8 license: GPL-2.0-or-later license_family: GPL purls: [] - size: 12036520 - timestamp: 1769713781879 + size: 12032320 + timestamp: 1769713870705 +- conda: https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_h3b011a4_112.conda + sha256: a564b8af44a113173c7d42ffe37a8d600e6ea21f6db87d252135ba07914a3d10 + md5: af1311c2d5e4bfc5cce2b86804c77972 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - libstdcxx >=14 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 1925113 + timestamp: 1771754008607 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fftw-3.3.10-nompi_h66d8d02_112.conda + sha256: 9b90971f3d41a9df6d9d5c5e0b3bd17d6a78d9b083005e144d5e702622925451 + md5: 3e5c061d8d32165b15d223170268ab2b + depends: + - libgcc >=14 + - libgfortran + - libgfortran5 >=14.3.0 + - libstdcxx >=14 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 1446023 + timestamp: 1771753652128 - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.25.2-pyhd8ed1ab_0.conda sha256: dddea9ec53d5e179de82c24569d41198f98db93314f0adae6b15195085d5567f md5: f58064cec97b12a7136ebb8a6f8a129b @@ -6863,35 +6514,35 @@ packages: - pkg:pypi/flake8-quotes?source=hash-mapping size: 14776 timestamp: 1735335323771 -- conda: https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.2-hc299af7_5.conda - sha256: e988c8abade5ff1fb072010fc5db59e2607ad8c823248a8acad6fc4ded544a86 - md5: ea6779ccd6859d8ab651c2078b07bcaf +- conda: https://conda.anaconda.org/conda-forge/linux-64/flann-1.9.2-he1b7b50_6.conda + sha256: 690c6e8204678d40fff369c96110735a1a6f0b47256359676aa26176a151a4a6 + md5: e5d172b12683fccd78ab3446c9a29707 depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 - hdf5 >=1.14.6,<1.14.7.0a0 - - libgcc >=13 - - libstdcxx >=13 + - libgcc >=14 + - libstdcxx >=14 - lz4-c >=1.10.0,<1.11.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 1569631 - timestamp: 1747942598014 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flann-1.9.2-h8b5e525_5.conda - sha256: 288ac83d3f1cc396e3d33561713a7e23397c3f58dddb637dab7af9ae73a0111e - md5: 3e8ec370f10373b7621b071b971aad65 + size: 1990499 + timestamp: 1774331944832 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/flann-1.9.2-headf6c6_6.conda + sha256: c2b7095f2393dcbd28f818087d85bf536478ee4be22ca1ae21fc6d45c159ad6c + md5: 0c9405191a41b68a378eaeffffc26738 depends: - _openmp_mutex >=4.5 - hdf5 >=1.14.6,<1.14.7.0a0 - - libgcc >=13 - - libstdcxx >=13 + - libgcc >=14 + - libstdcxx >=14 - lz4-c >=1.10.0,<1.11.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 1790072 - timestamp: 1747942473411 + size: 1420069 + timestamp: 1774331959849 - conda: https://conda.anaconda.org/conda-forge/noarch/flask-3.1.3-pyhcf101f3_1.conda sha256: 3980dfba1e3900106cc3e6210294e73f50d02a67fdfe7b3bb36b2721ba9379cb md5: 156398929bf849da6df8f89a2c390185 @@ -6907,13 +6558,9 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/flask?source=compressed-mapping + - pkg:pypi/flask?source=hash-mapping size: 87428 timestamp: 1771489274528 -- pypi: https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl - name: flatbuffers - version: 25.12.19 - sha256: 7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4 - conda: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.1.0-hff5e90c_0.conda sha256: d4e92ba7a7b4965341dc0fca57ec72d01d111b53c12d11396473115585a9ead6 md5: f7d7a4104082b39e3b3473fbd4a38229 @@ -7037,7 +6684,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/fonttools?source=compressed-mapping + - pkg:pypi/fonttools?source=hash-mapping size: 2935817 timestamp: 1773137546716 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/fonttools-4.62.0-py312ha4530ae_0.conda @@ -7054,7 +6701,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/fonttools?source=compressed-mapping + - pkg:pypi/fonttools?source=hash-mapping size: 2936215 timestamp: 1773137278297 - conda: https://conda.anaconda.org/conda-forge/linux-64/foonathan-memory-0.7.3-h5888daf_1.conda @@ -7179,26 +6826,26 @@ packages: purls: [] size: 485755 timestamp: 1763479143663 -- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.2-ha770c72_0.conda - sha256: 36857701b46828b6760c3c1652414ee504e7fc12740261ac6fcff3959b72bd7a - md5: eeec961fec28e747e1e1dc0446277452 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + sha256: c934c385889c7836f034039b43b05ccfa98f53c900db03d8411189892ced090b + md5: 8462b5322567212beeb025f3519fb3e2 depends: - - libfreetype 2.14.2 ha770c72_0 - - libfreetype6 2.14.2 h73754d4_0 + - libfreetype 2.14.3 ha770c72_0 + - libfreetype6 2.14.3 h73754d4_0 license: GPL-2.0-only OR FTL purls: [] - size: 174292 - timestamp: 1772757205296 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.2-h8af1aa0_0.conda - sha256: ecbe6e811574fba5194b29ac3a2badea5eaa060bd9fe7f5bd48a70d16ef38e5a - md5: 9cb47d7bbb36646c44d7cf1cb8047887 + size: 173839 + timestamp: 1774298173462 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/freetype-2.14.3-h8af1aa0_0.conda + sha256: 5594df70ef3df016b99de44e61b4024b7f3ec3472db83c7ac7723eafa8b26d95 + md5: f11edf8adf0d119148b97f745548390d depends: - - libfreetype 2.14.2 h8af1aa0_0 - - libfreetype6 2.14.2 hdae7a39_0 + - libfreetype 2.14.3 h8af1aa0_0 + - libfreetype6 2.14.3 hdae7a39_0 license: GPL-2.0-only OR FTL purls: [] - size: 173437 - timestamp: 1772756019067 + size: 173735 + timestamp: 1774301100144 - conda: https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.16-hb03c661_0.conda sha256: 858283ff33d4c033f4971bf440cebff217d5552a5222ba994c49be990dacd40d md5: f9f81ea472684d75b9dd8d0b328cf655 @@ -7304,9 +6951,9 @@ packages: purls: [] size: 69149627 timestamp: 1771377858762 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_21.conda - sha256: 27ad0cd10dccffca74e20fb38c9f8643ff8fce56eee260bf89fa257d5ab0c90a - md5: 1403ed5fe091bd7442e4e8a229d14030 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_linux-64-14.3.0-h298d278_22.conda + sha256: 676444fd28bde495e27d32999c6f2e4cb7f96cf05c2ce5e8bf4b37ef0b428dfb + md5: 0b6cd616dab5e509c5c368d58a01982d depends: - gcc_impl_linux-64 14.3.0.* - binutils_linux-64 @@ -7314,11 +6961,11 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 28946 - timestamp: 1770908213807 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_21.conda - sha256: 2b4c579549e63f8f7e29aa332a95b85a5a33976d6caf42d7c3dc147d2939d7a0 - md5: dfe811f86ef2d8f511263ef38b773a39 + size: 28918 + timestamp: 1774728910114 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gcc_linux-aarch64-14.3.0-h118592a_22.conda + sha256: 259f6d4ccbd79b9e861a956d07af2c123dfddb300c416fffc0b299e4933f6c26 + md5: e99c326642607a865dcb16e478c43644 depends: - gcc_impl_linux-aarch64 14.3.0.* - binutils_linux-aarch64 @@ -7326,8 +6973,8 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 28666 - timestamp: 1770908257439 + size: 28657 + timestamp: 1774728901341 - conda: https://conda.anaconda.org/conda-forge/linux-64/gdbm-1.18-h0a1914f_2.tar.bz2 sha256: 8b9606dc896bd9262d09ab2ef1cb55c4ee43f352473209b58b37a9289dd7b00c md5: b77bc399b07a19c00fe12fdc95ee0297 @@ -7339,37 +6986,60 @@ packages: purls: [] size: 194790 timestamp: 1597622040785 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.5-h2b0a6b4_1.conda - sha256: b2a6fb56b8f2d576a3ae5e6c57b2dbab91d52d1f1658bf1b258747ae25bb9fde - md5: 7eb4977dd6f60b3aaab0715a0ea76f11 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.44.6-h2b0a6b4_0.conda + sha256: c5594497f0646e9079705b3199dbb2d5b13c48173cf110000fa1c8818e2b3e0c + md5: 7892f39a39ed39591a89a28eba03e987 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - liblzma >=5.8.2,<6.0a0 - - libpng >=1.6.55,<1.7.0a0 + - libpng >=1.6.56,<1.7.0a0 - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 575109 - timestamp: 1771530561157 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.5-h90308e0_1.conda - sha256: aa95b37da0750fb93c5eeef79073b9b0d50976fa0dc02ed0301ff7bbbfc7ff36 - md5: c75ae103325db056719dd51d6525e1cd + size: 577414 + timestamp: 1774985848058 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gdk-pixbuf-2.44.6-h90308e0_0.conda + sha256: 53ac38045a8c0b6aa9cfaf784443a3744dc86ab4737c1479b44ae85c96926fe1 + md5: bdd860e72c5e10eb4ffa3d61f9b02ee0 depends: - libgcc >=14 - libglib >=2.86.4,<3.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - liblzma >=5.8.2,<6.0a0 - - libpng >=1.6.55,<1.7.0a0 + - libpng >=1.6.56,<1.7.0a0 - libtiff >=4.7.1,<4.8.0a0 license: LGPL-2.1-or-later license_family: LGPL purls: [] - size: 584221 - timestamp: 1771532437279 + size: 583708 + timestamp: 1774987740322 +- conda: https://conda.anaconda.org/conda-forge/linux-64/geographiclib-cpp-2.7-hb700be7_0.conda + sha256: 8d05d60178581a7a5f6cd3266cd5172f9cf18c89c8751ca9c76704f7b1b45916 + md5: 4c9ffd9d8888d6e17ea4f2ebfb02ec73 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 766298 + timestamp: 1762551378982 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/geographiclib-cpp-2.7-hfefdfc9_0.conda + sha256: 6fe8f80c7fa545c24e3830982bc41a0b02bf101c7bc91955b6db6a22dcfcf30b + md5: ddbe1705c348ff1c7946c1416b5d3c84 + depends: + - libgcc >=14 + - libstdcxx >=14 + license: MIT + license_family: MIT + purls: [] + size: 713193 + timestamp: 1762553044644 - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.25.1-h3f43e3d_1.conda sha256: cbfa8c80771d1842c2687f6016c5e200b52d4ca8f2cc119f6377f64f899ba4ff md5: c42356557d7f2e37676e121515417e3b @@ -7476,32 +7146,32 @@ packages: purls: [] size: 14636716 timestamp: 1771378028447 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-hfa02b96_21.conda - sha256: 406e1b10478b29795377cc2ad561618363aaf37b208e5cb3de7858256f73276a - md5: 234863e90d09d229043af1075fcf8204 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-14.3.0-h31f076a_22.conda + sha256: a7545c830f6b3767c8302217cbd05a57da7c0716749194e9cbcc5e3688ffd53e + md5: 5e6d687088defd7740e973f604e0a8e2 depends: - gfortran_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_21 + - gcc_linux-64 ==14.3.0 h298d278_22 - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD purls: [] - size: 27130 - timestamp: 1770908213808 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h4f85a2c_21.conda - sha256: 005ef6a3b9025faa43ffd14db9876c6978259205dea3a520af0e1b6ba5a3bc34 - md5: a171bf2d076aa473e90ef1b3d1b1206d + size: 27198 + timestamp: 1774728910114 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gfortran_linux-aarch64-14.3.0-h70575c0_22.conda + sha256: ae100dfcc90d8af47cb8e92736285b3fa0d643f0996b63da2e93b6ec8c47bd98 + md5: ddef5fb2b55325d66e4577faab6f9dd6 depends: - gfortran_impl_linux-aarch64 14.3.0.* - - gcc_linux-aarch64 ==14.3.0 h118592a_21 + - gcc_linux-aarch64 ==14.3.0 h118592a_22 - binutils_linux-aarch64 - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD purls: [] - size: 26877 - timestamp: 1770908257439 + size: 26933 + timestamp: 1774728901341 - conda: https://conda.anaconda.org/conda-forge/linux-64/git-2.53.0-pl5321h6d3cee1_0.conda sha256: 33b20cf09ff1c6ca960e6c5f7fad1f08ffd3112a87d79e42ed56f4e1b4cdefe3 md5: ad8d4260a6dae5f55960b26b237d576b @@ -7571,30 +7241,35 @@ packages: - pkg:pypi/gitpython?source=hash-mapping size: 158433 timestamp: 1767358832407 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda - sha256: 68f071ea25e79ee427c0d6c35ccc137d66f093a37660a4e41bafe0c49d64f2d6 - md5: 00e642ec191a19bf806a3915800e9524 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h36e74d4_2.conda + sha256: e28a214c71590a09f75f1aaccf5795bbcfb99b00c2d6ef55d34320b4f47485bd + md5: 787c780ff43f9f79d78d01e476b81a7c depends: - - libgcc-ng >=12 - - libpng >=1.6.43,<1.7.0a0 + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libpng >=1.6.55,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 license: LGPL-2.0-or-later license_family: LGPL purls: [] - size: 74102 - timestamp: 1718542981099 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hedfd65a_1.conda - sha256: e6500b15fd2dbd776df204556702bb2c90d037523c18cd0a111c7c0f0d314aa2 - md5: 6a087dc84254035cbde984f2c010c9ef + size: 75835 + timestamp: 1773985381918 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gl2ps-1.4.2-hd9db0c5_2.conda + sha256: 1a26fda032b7826fe5b039156c1701f38f865e48e64f3ebf91bc11ad76124263 + md5: 3c78b479a86b9f0d20224bec9362a136 depends: - - libgcc-ng >=12 - - libpng >=1.6.43,<1.7.0a0 + - libgcc >=14 + - libgl >=1.7.0,<2.0a0 + - libpng >=1.6.55,<1.7.0a0 - libzlib >=1.3.1,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 license: LGPL-2.0-or-later license_family: LGPL purls: [] - size: 72023 - timestamp: 1718542978037 + size: 73898 + timestamp: 1773986749310 - conda: https://conda.anaconda.org/conda-forge/linux-64/glew-2.3.0-h71661d4_0.conda sha256: 535d152ee06e3d3015a5ab410dfea9574e1678e226fa166f859a0b9e1153e597 md5: 7eefecda1c71c380bfc406d16e78bbee @@ -7841,79 +7516,6 @@ packages: purls: [] size: 2578234 timestamp: 1769427141106 -- pypi: https://files.pythonhosted.org/packages/fc/e1/6b5a01ef36b5341d5d0899401e4413594dfaa21f86cfc05be8efb25baf81/gruut-2.4.0.tar.gz - name: gruut - version: 2.4.0 - sha256: a49f693266a3a1ab5a6bde77a8f560ef27712b4169b5a6b02e6a1a873342e19e - requires_dist: - - babel>=2.8.0,<3.0.0 - - dateparser~=1.1.1 - - gruut-ipa>=0.12.0,<1.0 - - gruut-lang-en~=2.0.0 - - jsonlines~=1.2.0 - - networkx>=2.5.0 - - num2words>=0.5.10,<1.0.0 - - numpy>=1.19.0 - - python-crfsuite~=0.9.7 - - dataclasses ; python_full_version < '3.7' - - types-dataclasses ; python_full_version < '3.7' - - importlib-resources ; python_full_version < '3.9' - - aeneas~=1.7.3.0 ; extra == 'align' - - pydub~=0.24.1 ; extra == 'align' - - hazm~=0.7.0 ; extra == 'all' - - conllu>=4.4 ; extra == 'all' - - rapidfuzz>=2.11.1 ; extra == 'all' - - aeneas~=1.7.3.0 ; extra == 'all' - - pydub~=0.24.1 ; extra == 'all' - - mishkal~=0.4.0 ; extra == 'all' - - codernitydb3~=0.6.0 ; extra == 'all' - - phonetisaurus~=0.3.0 ; extra == 'all' - - gruut-lang-ar~=2.0.0 ; extra == 'all' - - gruut-lang-ca~=2.0.0 ; extra == 'all' - - gruut-lang-cs~=2.0.0 ; extra == 'all' - - gruut-lang-de~=2.0.0 ; extra == 'all' - - gruut-lang-es~=2.0.0 ; extra == 'all' - - gruut-lang-fa~=2.0.0 ; extra == 'all' - - gruut-lang-fr~=2.0.0 ; extra == 'all' - - gruut-lang-it~=2.0.0 ; extra == 'all' - - gruut-lang-lb~=2.0.0 ; extra == 'all' - - gruut-lang-nl~=2.0.0 ; extra == 'all' - - gruut-lang-pt~=2.0.0 ; extra == 'all' - - gruut-lang-ru~=2.0.0 ; extra == 'all' - - gruut-lang-sv~=2.0.0 ; extra == 'all' - - gruut-lang-sw~=2.0.0 ; extra == 'all' - - mishkal~=0.4.0 ; extra == 'ar' - - codernitydb3~=0.6.0 ; extra == 'ar' - - gruut-lang-ar~=2.0.0 ; extra == 'ar' - - gruut-lang-ca~=2.0.0 ; extra == 'ca' - - gruut-lang-cs~=2.0.0 ; extra == 'cs' - - gruut-lang-de~=2.0.0 ; extra == 'de' - - gruut-lang-es~=2.0.0 ; extra == 'es' - - hazm~=0.7.0 ; extra == 'fa' - - gruut-lang-fa~=2.0.0 ; extra == 'fa' - - gruut-lang-fr~=2.0.0 ; extra == 'fr' - - phonetisaurus~=0.3.0 ; extra == 'g2p' - - gruut-lang-it~=2.0.0 ; extra == 'it' - - gruut-lang-lb~=2.0.0 ; extra == 'lb' - - gruut-lang-nl~=2.0.0 ; extra == 'nl' - - gruut-lang-pt~=2.0.0 ; extra == 'pt' - - gruut-lang-ru~=2.0.0 ; extra == 'ru' - - gruut-lang-sv~=2.0.0 ; extra == 'sv' - - gruut-lang-sw~=2.0.0 ; extra == 'sw' - - conllu>=4.4 ; extra == 'train' - - rapidfuzz>=2.11.1 ; extra == 'train' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/51/9f/7eff478e38913cc9930527ff40c9ebcb04744dfcd0ddd43bd5a1eb9565b7/gruut-ipa-0.13.0.tar.gz - name: gruut-ipa - version: 0.13.0 - sha256: 71776eb99f46e119ab14d3d4e536f54317133607cc2f6bad9711ab51f1bec66e - requires_dist: - - dataclasses ; python_full_version < '3.7' - requires_python: '>=3.6' -- pypi: https://files.pythonhosted.org/packages/a4/e3/22748996c573c6a7d5326ef0292956afac089c73f14e3dfee0a94661e631/gruut_lang_en-2.0.1.tar.gz - name: gruut-lang-en - version: 2.0.1 - sha256: a3d748bca5b31bf89d26b00ba76809532187696ce3ddf76b35889fe25f94ea30 - conda: https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.26.10-h0363672_0.conda sha256: f43bc8fd2c8b0c4317cf771f2cf8a9e7eee47105c233bfed00158f6579e41340 md5: fd9738c3189541787bd967e19587de26 @@ -8012,6 +7614,25 @@ packages: purls: [] size: 2080140 timestamp: 1766703002402 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gstreamer-orc-0.4.42-h82d0256_0.conda + sha256: 708985c3c5969b40ca9bf9565939df1cef0bbe087a283ccb84d888f10e662f13 + md5: 2a751586c2ec522f1f75665a90da698b + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: BSD-2-Clause AND BSD-3-Clause + purls: [] + size: 383443 + timestamp: 1768408501404 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gstreamer-orc-0.4.42-h70b131a_0.conda + sha256: cb2f8b084b725246b34764830d3b554666f4e9bcbcf40b9b76bcbb743fd3d27f + md5: f7396ee8405e4f3e54c6c357e384560c + depends: + - libgcc >=14 + license: BSD-2-Clause AND BSD-3-Clause + purls: [] + size: 377338 + timestamp: 1768408531779 - conda: https://conda.anaconda.org/conda-forge/linux-64/gtest-1.17.0-h84d6215_1.conda sha256: 1f738280f245863c5ac78bcc04bb57266357acda45661c4aa25823030c6fb5db md5: 55e29b72a71339bc651f9975492db71f @@ -8039,9 +7660,9 @@ packages: purls: [] size: 409213 timestamp: 1748320114722 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.51-ha5ea40c_0.conda - sha256: 70f25f28bd696477e57caf015f1449b7311bb5c718051ba6a6bd74d11d16ceba - md5: 4f646b4ee5bcceb30cfedf5021e2fa89 +- conda: https://conda.anaconda.org/conda-forge/linux-64/gtk3-3.24.52-ha5ea40c_0.conda + sha256: c6bb4f06331bcb0a566d84e0f0fad7af4b9035a03b13e2d5ecfaf13be57e6e10 + md5: bcaea22d85999a4f17918acfab877e61 depends: - __glibc >=2.17,<3.0.a0 - at-spi2-atk >=2.38.0,<3.0a0 @@ -8053,20 +7674,20 @@ packages: - fribidi >=1.0.16,<2.0a0 - gdk-pixbuf >=2.44.5,<3.0a0 - glib-tools - - harfbuzz >=12.3.2 + - harfbuzz >=13.2.1 - hicolor-icon-theme - libcups >=2.3.3,<2.4.0a0 - libcups >=2.3.3,<3.0a0 - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - liblzma >=5.8.2,<6.0a0 - libxkbcommon >=1.13.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - pango >=1.56.4,<2.0a0 - - wayland >=1.24.0,<2.0a0 + - wayland >=1.25.0,<2.0a0 - xorg-libx11 >=1.8.13,<2.0a0 - xorg-libxcomposite >=0.4.7,<1.0a0 - xorg-libxcursor >=1.2.3,<2.0a0 @@ -8080,11 +7701,11 @@ packages: license: LGPL-2.0-or-later license_family: LGPL purls: [] - size: 5913603 - timestamp: 1772669326412 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk3-3.24.51-h75d4e7a_0.conda - sha256: 031787ffb325b8ad43f15ca6d744aa466815fe16e5c673227d42a042f9235a2a - md5: 0c499e96c3a0fcee46c354e0cb927e47 + size: 5939083 + timestamp: 1774288645605 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gtk3-3.24.52-h75d4e7a_0.conda + sha256: 5db1347513253a2d200b111717eb452d4b95e9380db48b6dd2c8bb7bb256d754 + md5: f6a9ed300bcf3217da7f1955f57facec depends: - at-spi2-atk >=2.38.0,<3.0a0 - atk-1.0 >=2.38.0 @@ -8095,20 +7716,20 @@ packages: - fribidi >=1.0.16,<2.0a0 - gdk-pixbuf >=2.44.5,<3.0a0 - glib-tools - - harfbuzz >=12.3.2 + - harfbuzz >=13.2.1 - hicolor-icon-theme - libcups >=2.3.3,<2.4.0a0 - libcups >=2.3.3,<3.0a0 - libexpat >=2.7.4,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - liblzma >=5.8.2,<6.0a0 - libxkbcommon >=1.13.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - pango >=1.56.4,<2.0a0 - - wayland >=1.24.0,<2.0a0 + - wayland >=1.25.0,<2.0a0 - xorg-libx11 >=1.8.13,<2.0a0 - xorg-libxcomposite >=0.4.7,<1.0a0 - xorg-libxcursor >=1.2.3,<2.0a0 @@ -8122,8 +7743,8 @@ packages: license: LGPL-2.0-or-later license_family: LGPL purls: [] - size: 5980180 - timestamp: 1772676984873 + size: 6023698 + timestamp: 1774296668544 - conda: https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda sha256: b5cd16262fefb836f69dc26d879b6508d29f8a5c5948a966c47fe99e2e19c99b md5: 4d8df0b0db060d33c9a702ada998a8fe @@ -8196,32 +7817,32 @@ packages: purls: [] size: 13513218 timestamp: 1771378064341 -- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-he467f4b_21.conda - sha256: 1e07c197e0779fa9105e59cd55a835ded96bfde59eb169439736a89b27b48e5d - md5: 7b51f4ff82eeb1f386bfee20a7bed3ed +- conda: https://conda.anaconda.org/conda-forge/linux-64/gxx_linux-64-14.3.0-h7ab9642_22.conda + sha256: 0331f697ddd97f4d0ddbf66badf6f94bb397b39c534bcf604967d362dea428b1 + md5: ac8519fa5fe0e5d779b5f6d658c10ed5 depends: - gxx_impl_linux-64 14.3.0.* - - gcc_linux-64 ==14.3.0 h298d278_21 + - gcc_linux-64 ==14.3.0 h298d278_22 - binutils_linux-64 - sysroot_linux-64 license: BSD-3-Clause license_family: BSD purls: [] - size: 27503 - timestamp: 1770908213813 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h32e4f2e_21.conda - sha256: 10059135f9960de93f991ce7fb6ef9d833dc2ac675459a1a08def052e5a29667 - md5: 3114b029596eff0aeb9fc0c81f598211 + size: 27468 + timestamp: 1774728910114 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/gxx_linux-aarch64-14.3.0-h007e36a_22.conda + sha256: 11ea002fe82128da8f704c1fbe035dbe73685d1fe84ba20b82d6ffdfad71dbdc + md5: 65323e96571e9fd4055538bf668ab75a depends: - gxx_impl_linux-aarch64 14.3.0.* - - gcc_linux-aarch64 ==14.3.0 h118592a_21 + - gcc_linux-aarch64 ==14.3.0 h118592a_22 - binutils_linux-aarch64 - sysroot_linux-aarch64 license: BSD-3-Clause license_family: BSD purls: [] - size: 27275 - timestamp: 1770908257444 + size: 27228 + timestamp: 1774728901341 - conda: https://conda.anaconda.org/conda-forge/linux-64/gz-cmake3-3.5.5-h05f81b2_0.conda sha256: b654d0102a8b8242836a5863c0157945b5c549d505383f4f8b724926a55f68aa md5: fda2ad837ffe2ed7f73ddfab260d82e3 @@ -8359,11 +7980,6 @@ packages: purls: [] size: 8050 timestamp: 1767701505722 -- pypi: https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl - name: h11 - version: 0.16.0 - sha256: 63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 - requires_python: '>=3.8' - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda sha256: 84c64443368f84b600bfecc529a1194a3b14c3656ee2e832d15a20e0329b6da3 md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 @@ -8378,43 +7994,45 @@ packages: - pkg:pypi/h2?source=hash-mapping size: 95967 timestamp: 1756364871835 -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.1.1-h6083320_0.conda - sha256: cc536468a807a77bbfbbf392a21f205d4e1de1198be03f9359e52e01926d8597 - md5: 56d73078fe51aee26b7934cb1378d464 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-13.2.1-h6083320_0.conda + sha256: 477f2c553f72165020d3c56740ba354be916c2f0b76fd9f535e83d698277d5ec + md5: 14470902326beee192e33719a2e8bb7f depends: - __glibc >=2.17,<3.0.a0 - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libexpat >=2.7.4,<3.0a0 - libfreetype >=2.14.2 - libfreetype6 >=2.14.2 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: MIT + license_family: MIT purls: [] - size: 3069804 - timestamp: 1773391781117 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.1.1-h1134a53_0.conda - sha256: 519585a32a9374d2ff0ca93139665e65061117b70156f6c94ce8bc5b5b47c687 - md5: 46a7a399537501c4501be18a9f871976 + size: 2384060 + timestamp: 1774276284520 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/harfbuzz-13.2.1-h1134a53_0.conda + sha256: e22f485fddaaea3ff4b6cae98e0197b9dccd2ed2770337ad6ff38a92afe04e59 + md5: 05d65a2cf410adc331c9ea61f59f1013 depends: - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - - icu >=78.2,<79.0a0 + - icu >=78.3,<79.0a0 - libexpat >=2.7.4,<3.0a0 - libfreetype >=2.14.2 - libfreetype6 >=2.14.2 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: MIT + license_family: MIT purls: [] - size: 2669078 - timestamp: 1773396553668 + size: 2345732 + timestamp: 1774281448329 - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda sha256: 0d09b6dc1ce5c4005ae1c6a19dc10767932ef9a5e9c755cfdbb5189ac8fb0684 md5: bd77f8da987968ec3927990495dc22e4 @@ -8441,41 +8059,41 @@ packages: purls: [] size: 773862 timestamp: 1695661552544 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_106.conda - sha256: 1fc50ce3b86710fba3ec9c5714f1612b5ffa4230d70bfe43e2a1436eacba1621 - md5: c223ee1429ba538f3e48cfb4a0b97357 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h19486de_108.conda + sha256: 795c3a34643aa766450b8363b8c5dd6e65ad40e5cc64d138c3678d05068a380a + md5: cbb2d15a6e9aeb85f18f1a8f01c29b81 depends: - __glibc >=2.17,<3.0.a0 - libaec >=1.1.5,<2.0a0 - - libcurl >=8.18.0,<9.0a0 + - libcurl >=8.19.0,<9.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - openssl >=3.5.5,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 3708864 - timestamp: 1770390337946 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_106.conda - sha256: d906752d30d5d2c15667e38fd68cadb5010cc2fadaad42655a346452ecc2c722 - md5: 438cd796f1a3f98637c0bdd1691564b7 + size: 3719931 + timestamp: 1774406907641 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/hdf5-1.14.6-nompi_hf95b8e7_108.conda + sha256: 2680c9c3c5da8692df5cc49014b11732aa472d505492602e8fe68b277704670c + md5: 0ddaf66a4ae76b9331d948393d84d9c7 depends: - libaec >=1.1.5,<2.0a0 - - libcurl >=8.18.0,<9.0a0 + - libcurl >=8.19.0,<9.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - openssl >=3.5.5,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 3913046 - timestamp: 1770397827092 + size: 3924367 + timestamp: 1774414695892 - conda: https://conda.anaconda.org/conda-forge/linux-64/hicolor-icon-theme-0.17-ha770c72_3.conda sha256: 6d7e6e1286cb521059fe69696705100a03b006efb914ffe82a2ae97ecbae66b7 md5: 129e404c5b001f3ef5581316971e3ea0 @@ -8515,25 +8133,6 @@ packages: - pkg:pypi/humanfriendly?source=hash-mapping size: 73563 timestamp: 1733928021866 -- pypi: https://files.pythonhosted.org/packages/93/35/850277d1b17b206bd10874c8a9a3f52e059452fb49bb0d22cbb908f6038b/hypercorn-0.18.0-py3-none-any.whl - name: hypercorn - version: 0.18.0 - sha256: 225e268f2c1c2f28f6d8f6db8f40cb8c992963610c5725e13ccfcddccb24b1cd - requires_dist: - - exceptiongroup>=1.1.0 ; python_full_version < '3.11' - - h11 - - h2>=4.3.0 - - priority - - taskgroup ; python_full_version < '3.11' - - tomli ; python_full_version < '3.11' - - typing-extensions ; python_full_version < '3.11' - - wsproto>=0.14.0 - - pydata-sphinx-theme ; extra == 'docs' - - sphinxcontrib-mermaid ; extra == 'docs' - - aioquic>=0.9.0 ; extra == 'h3' - - trio ; extra == 'trio' - - uvloop ; extra == 'uvloop' - requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda sha256: 77af6f5fe8b62ca07d09ac60127a30d9069fdc3c68d6b256754d0ffb1f7779f8 md5: 8e6923fc12f1fe8f8c4e5c9f343256ac @@ -8545,9 +8144,9 @@ packages: - pkg:pypi/hyperframe?source=hash-mapping size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 - md5: 186a18e3ba246eccfc7cff00cd19a870 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a + md5: c80d8a3b84358cb967fa81e7075fbc8a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -8555,22 +8154,22 @@ packages: license: MIT license_family: MIT purls: [] - size: 12728445 - timestamp: 1767969922681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.2-hcab7f73_0.conda - sha256: dcbaa3042084ac58685e3ef4547e4c4be9d37dc52b92ea18581288af95e48b52 - md5: 998ee7d53e32f7ab57fc35707285527e + size: 12723451 + timestamp: 1773822285671 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/icu-78.3-hcab7f73_0.conda + sha256: 49ba6aed2c6b482bb0ba41078057555d29764299bc947b990708617712ef6406 + md5: 546da38c2fa9efacf203e2ad3f987c59 depends: - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 12851689 - timestamp: 1772208964788 -- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.17-pyhd8ed1ab_0.conda - sha256: 7cd5eccdb171a0adbf83a1ad8fc4e17822f4fc3f5518da9040de64e88bc07343 - md5: 5b7ae2ec4e0750e094f804a6cf1b2a37 + size: 12837286 + timestamp: 1773822650615 +- conda: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.18-pyhd8ed1ab_0.conda + sha256: 3bae1b612ccc71e49c5795a369a82c4707ae6fd4e63360e8ecc129f9539f779b + md5: 635d1a924e1c55416fce044ed96144a2 depends: - python >=3.10 - ukkonen @@ -8578,8 +8177,8 @@ packages: license_family: MIT purls: - pkg:pypi/identify?source=hash-mapping - size: 79520 - timestamp: 1772402363021 + size: 79749 + timestamp: 1774239544252 - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 md5: 53abe63df7e10a6ba605dc5f9f961d36 @@ -8591,17 +8190,17 @@ packages: - pkg:pypi/idna?source=hash-mapping size: 50721 timestamp: 1760286526795 -- conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - sha256: c2bfd7043e0c4c12d8b5593de666c1e81d67b83c474a0a79282cc5c4ef845460 - md5: 7de5386c8fea29e76b303f37dde4c352 +- conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-2.0.0-pyhd8ed1ab_0.conda + sha256: 5a047f9eac290e679b4e6f6f4cbfcc5acdfbf031a4f06824d4ddb590cdbb850b + md5: 92617c2ba2847cca7a6ed813b6f4ab79 depends: - - python >=3.4 + - python >=3.10 license: MIT license_family: MIT purls: - pkg:pypi/imagesize?source=hash-mapping - size: 10164 - timestamp: 1656939625410 + size: 15729 + timestamp: 1773752188889 - conda: https://conda.anaconda.org/conda-forge/linux-64/imath-3.2.2-hde8ca8f_0.conda sha256: 43f30e6fd8cbe1fef59da760d1847c9ceff3fb69ceee7fd4a34538b0927959dd md5: c427448c6f3972c76e8a4474e0fe367b @@ -8627,19 +8226,19 @@ packages: purls: [] size: 155215 timestamp: 1759984576946 -- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda - sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 - md5: 63ccfdc3a3ce25b027b8767eb722fca8 +- conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.8.0-pyhcf101f3_0.conda + sha256: 82ab2a0d91ca1e7e63ab6a4939356667ef683905dea631bc2121aa534d347b16 + md5: 080594bf4493e6bae2607e65390c520a depends: - - python >=3.9 + - python >=3.10 - zipp >=3.20 - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/importlib-metadata?source=hash-mapping - size: 34641 - timestamp: 1747934053147 + - pkg:pypi/importlib-metadata?source=compressed-mapping + size: 34387 + timestamp: 1773931568510 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda sha256: acc1d991837c0afb67c75b77fdc72b4bf022aac71fedd8b9ea45918ac9b08a80 md5: c85c76dc67d75619a92f51dfbce06992 @@ -8665,9 +8264,9 @@ packages: - pkg:pypi/iniconfig?source=compressed-mapping size: 13387 timestamp: 1760831448842 -- conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.9.0-hb700be7_0.conda - sha256: edad668db79c6c4899d46e1cd4a331f5d008f9ed8f7d2e39e1dfe1a2d81acec0 - md5: 26311c5112b5c713f472bdfbb5ec5aa3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/intel-gmmlib-22.10.0-hb700be7_0.conda + sha256: bc231d69eb6663db0e09738fb916c5e5507147cf1ac60f364f964004e0b29bab + md5: 10909406c1b0e4b57f9f4f0eb0999af8 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -8675,8 +8274,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 1009795 - timestamp: 1765886047465 + size: 1013714 + timestamp: 1774422680665 - conda: https://conda.anaconda.org/conda-forge/linux-64/intel-media-driver-25.3.4-hecca717_0.conda sha256: 286679d4c175e8db2d047be766d1629f1ea5828bff9fe7e6aac2e6f0fad2b427 md5: 7ae2034a0e2e24eb07468f1a50cdf0bb @@ -8702,9 +8301,9 @@ packages: - pkg:pypi/invoke?source=hash-mapping size: 132825 timestamp: 1760146119847 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.11.0-pyhecfbec7_0.conda - sha256: 1f90e346baab7926bc52d7b60c0625087e96b4fab1bdb9a7fe83ac842312c930 - md5: 326c46b8ec2a1b4964927c7ea55ebf49 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + sha256: 932044bd893f7adce6c9b384b96a72fd3804cc381e76789398c2fae900f21df7 + md5: b293210beb192c3024683bf6a998a0b8 depends: - __unix - decorator >=5.1.0 @@ -8722,8 +8321,8 @@ packages: license_family: BSD purls: - pkg:pypi/ipython?source=compressed-mapping - size: 648197 - timestamp: 1772790149194 + size: 649967 + timestamp: 1774609994657 - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 md5: bd80ba060603cc228d9d81c257093119 @@ -8774,33 +8373,37 @@ packages: purls: [] size: 488216 timestamp: 1747576147517 -- conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-he3c4edf_0.conda - sha256: cea4c90ca4971cbc29d5930301cabcc581a781fd26d0cc7ca0aa459cb33ff573 - md5: 5455c1a77c2aa337f04d94ff0ef413c3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.9-h1588d4d_1.conda + sha256: a6a9858eadb4c794b56a1c954c1d4f4b57d96c9fb87092dd46f5bff9b0697b35 + md5: 115ecf05370670f93bc81a8c4f7fd57f depends: - __glibc >=2.17,<3.0.a0 - freeglut >=3.2.2,<4.0a0 + - libexpat >=2.7.4,<3.0a0 - libgcc >=14 + - libgl >=1.7.0,<2.0a0 - libglu >=9.0.3,<10.0a0 - libglu >=9.0.3,<9.1.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 license: JasPer-2.0 purls: [] - size: 683370 - timestamp: 1772794291374 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.9-h27a9ab5_0.conda - sha256: 0bcf499e170a35df96a6dbcf98fcce28fdb369d652e915392cdc7448ea28643a - md5: 1591a2cca2a575ecd07f6058da35d722 + size: 684185 + timestamp: 1773677703432 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/jasper-4.2.9-h850eeee_1.conda + sha256: 8302f891a44816125e8b7e92e7525ee00886269266a18de4be976f5f02af9d6f + md5: dbf3430a4a60787bf4e05da49937df98 depends: - freeglut >=3.2.2,<4.0a0 + - libexpat >=2.7.4,<3.0a0 - libgcc >=14 + - libgl >=1.7.0,<2.0a0 - libglu >=9.0.3,<10.0a0 - libglu >=9.0.3,<9.1.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 license: JasPer-2.0 purls: [] - size: 718883 - timestamp: 1772794311177 + size: 718811 + timestamp: 1773677720825 - conda: https://conda.anaconda.org/conda-forge/noarch/jaxtyping-0.3.7-pyhd8ed1ab_0.conda sha256: f6d39c7a9acf6289e75444c032a7154bba5abb45b16feb4013e12250cd485cc2 md5: 96387643c6c475b099766f98c41242f0 @@ -8858,12 +8461,6 @@ packages: purls: [] size: 162312 timestamp: 1733779925983 -- pypi: https://files.pythonhosted.org/packages/4f/9a/ab96291470e305504aa4b7a2e0ec132e930da89eb3ca7a82fbe03167c131/jsonlines-1.2.0-py2.py3-none-any.whl - name: jsonlines - version: 1.2.0 - sha256: 0ebd5b0c3efe0d4b5018b320fb0ee1a7b680ab39f6eb853715859f818d386cc8 - requires_dist: - - six - conda: https://conda.anaconda.org/conda-forge/linux-64/jxrlib-1.1-hd590300_3.conda sha256: 2057ca87b313bde5b74b93b0e696f8faab69acd4cb0edebb78469f3f388040c0 md5: 5aeabe88534ea4169d4c49998f293d6c @@ -8935,7 +8532,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/kiwisolver?source=compressed-mapping + - pkg:pypi/kiwisolver?source=hash-mapping size: 77120 timestamp: 1773067050308 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/kiwisolver-1.5.0-py312h1683e8e_0.conda @@ -8952,21 +8549,6 @@ packages: - pkg:pypi/kiwisolver?source=hash-mapping size: 82439 timestamp: 1773067307369 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 - md5: 3f43953b7d3fb3aaa1d0d0723d91e368 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 1370023 - timestamp: 1719463201255 - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 md5: fb53fb07ce46a575c5d004bbc96032c2 @@ -8980,23 +8562,9 @@ packages: - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT + purls: [] size: 1386730 timestamp: 1769769569681 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.21.3-h50a48e9_0.conda - sha256: 0ec272afcf7ea7fbf007e07a3b4678384b7da4047348107b2ae02630a570a815 - md5: 29c10432a2ca1472b53f299ffb2ffa37 - depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 - license: MIT - license_family: MIT - purls: [] - size: 1474620 - timestamp: 1719463205834 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/krb5-1.22.2-hfd895c2_0.conda sha256: b53999d888dda53c506b264e8c02b5f5c8e022c781eda0718f007339e6bc90ba md5: d9ca108bd680ea86a963104b6b3e95ca @@ -9009,6 +8577,7 @@ packages: - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT + purls: [] size: 1517436 timestamp: 1769773395215 - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 @@ -9067,9 +8636,9 @@ packages: purls: [] size: 293039 timestamp: 1768184778398 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_101.conda - sha256: 565941ac1f8b0d2f2e8f02827cbca648f4d18cd461afc31f15604cd291b5c5f3 - md5: 12bd9a3f089ee6c9266a37dab82afabd +- conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + sha256: 3d584956604909ff5df353767f3a2a2f60e07d070b328d109f30ac40cd62df6c + md5: 18335a698559cdbcd86150a48bf54ba6 depends: - __glibc >=2.17,<3.0.a0 - zstd >=1.5.7,<1.6.0a0 @@ -9078,11 +8647,11 @@ packages: license: GPL-3.0-only license_family: GPL purls: [] - size: 725507 - timestamp: 1770267139900 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_101.conda - sha256: 44527364aa333be631913451c32eb0cae1e09343827e9ce3ccabd8d962584226 - md5: 35b2ae7fadf364b8e5fb8185aaeb80e5 + size: 728002 + timestamp: 1774197446916 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.45.1-default_h1979696_102.conda + sha256: 7abd913d81a9bf00abb699e8987966baa2065f5132e37e815f92d90fc6bba530 + md5: a21644fc4a83da26452a718dc9468d5f depends: - zstd >=1.5.7,<1.6.0a0 constrains: @@ -9090,8 +8659,8 @@ packages: license: GPL-3.0-only license_family: GPL purls: [] - size: 875924 - timestamp: 1770267209884 + size: 875596 + timestamp: 1774197520746 - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.1.0-hdb68285_0.conda sha256: f84cb54782f7e9cea95e810ea8fef186e0652d0fa73d3009914fa2c1262594e1 md5: a752488c68f2e7c456bcbd8f16eec275 @@ -9317,24 +8886,45 @@ packages: purls: [] size: 171287 timestamp: 1749328949722 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.4.0-hcfa2d63_0.conda - sha256: 918fd09af66968361c8fa40a76f864b7febb8286dd5dcb1419517b9db950c84c - md5: e226d3dbe1e2482fd8e15cb924fd1e7c +- conda: https://conda.anaconda.org/conda-forge/linux-64/libattr-2.5.2-hb03c661_1.conda + sha256: 0cef37eb013dc7091f17161c357afbdef9a9bc79ef6462508face6db3f37db77 + md5: 7e7f0a692eb62b95d3010563e7f963b6 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 53316 + timestamp: 1773595896163 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libattr-2.5.2-he30d5cf_1.conda + sha256: 50fec389e6eaa8a1baff79a48b242850e638f2ca92689a7c8e7c1e724ee42114 + md5: cdfbc8a5f16a7ed3d4f02779d5f7fbcf + depends: + - libgcc >=14 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 54504 + timestamp: 1773595923052 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h316e467_3.conda + sha256: f5ab201b8b4e1f776ced0340c59f87e441fd6763d3face527b5cf3f2280502c9 + md5: 22d5cc5fb45aab8ed3c00cde2938b825 depends: - __glibc >=2.17,<3.0.a0 - aom >=3.9.1,<3.10.0a0 - dav1d >=1.2.1,<1.2.2.0a0 - libgcc >=14 - - rav1e >=0.8.1,<0.9.0a0 - - svt-av1 >=4.0.1,<4.0.2.0a0 + - rav1e >=0.7.1,<0.8.0a0 + - svt-av1 >=4.0.0,<4.0.1.0a0 license: BSD-2-Clause license_family: BSD purls: [] - size: 148589 - timestamp: 1772682433596 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libavif16-1.4.0-ha599f14_0.conda - sha256: 34d3475747c25669826877e3269768ffb0716978b0f4a71a0cee8de7d7d051b9 - md5: f7467592a32f9096d3ec542c3517e6eb + size: 140323 + timestamp: 1769476997956 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libavif16-1.4.1-ha599f14_0.conda + sha256: ef94450974f46f247bb230e5127ac8deeed4d8652c8420aeb5b3abff5d8c7bef + md5: f62ded0248f8fae85ada62014d5a1e54 depends: - aom >=3.9.1,<3.10.0a0 - dav1d >=1.2.1,<1.2.2.0a0 @@ -9344,44 +8934,44 @@ packages: license: BSD-2-Clause license_family: BSD purls: [] - size: 147933 - timestamp: 1772682456131 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - build_number: 5 - sha256: 18c72545080b86739352482ba14ba2c4815e19e26a7417ca21a95b76ec8da24c - md5: c160954f7418d7b6e87eaf05a8913fa9 + size: 147953 + timestamp: 1774042696884 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-6_h4a7cf45_openblas.conda + build_number: 6 + sha256: 7bfe936dbb5db04820cf300a9cc1f5ee8d5302fc896c2d66e30f1ee2f20fbfd6 + md5: 6d6d225559bfa6e2f3c90ee9c03d4e2e depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 + - libopenblas >=0.3.32,<0.3.33.0a0 + - libopenblas >=0.3.32,<1.0a0 constrains: + - blas 2.306 openblas + - liblapack 3.11.0 6*_openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas - mkl <2026 - - liblapack 3.11.0 5*_openblas - - libcblas 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18213 - timestamp: 1765818813880 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-5_haddc8a3_openblas.conda - build_number: 5 - sha256: 700f3c03d0fba8e687a345404a45fbabe781c1cf92242382f62cef2948745ec4 - md5: 5afcea37a46f76ec1322943b3c4dfdc0 + size: 18621 + timestamp: 1774503034895 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libblas-3.11.0-6_haddc8a3_openblas.conda + build_number: 6 + sha256: 7374c744c37786bfa4cfd30bbbad13469882e5d9f32ed792922b447b7e369554 + md5: 652bb20bb4618cacd11e17ae070f47ce depends: - - libopenblas >=0.3.30,<0.3.31.0a0 - - libopenblas >=0.3.30,<1.0a0 + - libopenblas >=0.3.32,<0.3.33.0a0 + - libopenblas >=0.3.32,<1.0a0 constrains: + - blas 2.306 openblas - mkl <2026 - - libcblas 3.11.0 5*_openblas - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas + - liblapack 3.11.0 6*_openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18369 - timestamp: 1765818610617 + size: 18682 + timestamp: 1774503047392 - conda: https://conda.anaconda.org/conda-forge/linux-64/libboost-1.88.0-hd24cca6_7.conda sha256: dd489228e1916c7720c925248d0ba12803d1dc8b9898be0c51f4ab37bab6ffa5 md5: d70e4dc6a847d437387d45462fe60cf9 @@ -9594,59 +9184,57 @@ packages: purls: [] size: 309304 timestamp: 1764017292044 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-h3ff7636_0.conda - sha256: 9517cce5193144af0fcbf19b7bd67db0a329c2cc2618f28ffecaa921a1cbe9d3 - md5: 09c264d40c67b82b49a3f3b89037bd2e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.77-hd0affe5_1.conda + sha256: 37c41b1024d0c75da76822e3c079aabaf121618a32fe05e53a897b35a88008fc + md5: 499cd8e2d4358986dbe3b30e8fe1bf6a depends: - __glibc >=2.17,<3.0.a0 - - attr >=2.5.2,<2.6.0a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 121429 - timestamp: 1762349484074 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-h68e9139_0.conda - sha256: 154eefd8f94010d89ba76a057949b9b1f75c7379bd0d19d4657c952bedcf5904 - md5: 10fe36ec0a9f7b1caae0331c9ba50f61 + size: 124432 + timestamp: 1774333989027 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcap-2.77-hf9559e3_1.conda + sha256: e04f0c4287362ea2033421c1b516d7d83c308084bcc9483b2e6038ec7c711e0a + md5: bdda58ab0358b0e9ff45fd2503b38410 depends: - - attr >=2.5.1,<2.6.0a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 108542 - timestamp: 1762350753349 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - build_number: 5 - sha256: 0cbdcc67901e02dc17f1d19e1f9170610bd828100dc207de4d5b6b8ad1ae7ad8 - md5: 6636a2b6f1a87572df2970d3ebc87cc0 + size: 109458 + timestamp: 1774335293336 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-6_h0358290_openblas.conda + build_number: 6 + sha256: 57edafa7796f6fa3ebbd5367692dd4c7f552be42109c2dd1a7c89b55089bf374 + md5: 36ae340a916635b97ac8a0655ace2a35 depends: - - libblas 3.11.0 5_h4a7cf45_openblas + - libblas 3.11.0 6_h4a7cf45_openblas constrains: - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - liblapack 3.11.0 5*_openblas + - blas 2.306 openblas + - liblapack 3.11.0 6*_openblas + - liblapacke 3.11.0 6*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18194 - timestamp: 1765818837135 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-5_hd72aa62_openblas.conda - build_number: 5 - sha256: 3fad5c9de161dccb4e42c8b1ae8eccb33f4ed56bccbcced9cbb0956ae7869e61 - md5: 0b2f1143ae2d0aa4c991959d0daaf256 + size: 18622 + timestamp: 1774503050205 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcblas-3.11.0-6_hd72aa62_openblas.conda + build_number: 6 + sha256: 5dd9e872cf8ebd632f31cd3a5ca6d3cb331f4d3a90bfafbe572093afeb77632b + md5: 939e300b110db241a96a1bed438c315b depends: - - libblas 3.11.0 5_haddc8a3_openblas + - libblas 3.11.0 6_haddc8a3_openblas constrains: - - liblapack 3.11.0 5*_openblas - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas + - blas 2.306 openblas + - liblapack 3.11.0 6*_openblas + - liblapacke 3.11.0 6*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18371 - timestamp: 1765818618899 + size: 18689 + timestamp: 1774503058069 - conda: https://conda.anaconda.org/conda-forge/linux-64/libccd-double-2.1-h59595ed_3.conda sha256: 4695ce68eda595b4f53146bea1096a9f2e0d33290618ba83a246b5ed8871ebc9 md5: 6a3d962d34385e0a511b859d679f6ea2 @@ -9698,6 +9286,31 @@ packages: purls: [] size: 20670213 timestamp: 1770191273636 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.0-default_h99862b1_0.conda + sha256: 914da94dbf829192b2bb360a7684b32e46f047a57de96a2f5ab39a011aeae6ea + md5: d966a23335e090a5410cc4f0dec8d00a + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libllvm22 >=22.1.0,<22.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 21661249 + timestamp: 1772101075353 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp22.1-22.1.0-default_he95a3c9_0.conda + sha256: 48f27a5ad4ea95de961131a282ba884305e309314b51abb61814856732b28461 + md5: 1519a50e2f4caca01098a33d39f45f5c + depends: + - libgcc >=14 + - libllvm22 >=22.1.0,<22.2.0a0 + - libstdcxx >=14 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + purls: [] + size: 21293353 + timestamp: 1772101944548 - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-22.1.0-default_h746c552_0.conda sha256: 4a9dd814492a129f2ff40cd4ab0b942232c9e3c6dbc0d0aaf861f1f65e99cc7d md5: 140459a7413d8f6884eb68205ce39a0d @@ -9723,50 +9336,33 @@ packages: purls: [] size: 12619911 timestamp: 1772102257387 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - sha256: cb83980c57e311783ee831832eb2c20ecb41e7dee6e86e8b70b8cef0e43eab55 - md5: d4a250da4737ee127fb1fa6452a9002e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c + md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 depends: - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libstdcxx >=13 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 4523621 - timestamp: 1749905341688 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h5cdc715_5.conda - sha256: f3282d27be35e5d29b5b798e5136427ec798916ee6374499be7b7682c8582b72 - md5: ac0333d338076ef19170938bbaf97582 + size: 4518030 + timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcups-2.3.3-h4f2b762_6.conda + sha256: 41b04f995c9f63af8c4065a35931e46cbc2fdd6b9bf7e4c19f90d53cbb2bc8e5 + md5: 67828c963b17db7dc989fe5d509ef04a depends: - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libstdcxx >=13 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 4550533 - timestamp: 1749906839681 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda - sha256: 5454709d9fb6e9c3dd6423bc284fa7835a7823bfa8323f6e8786cdd555101fab - md5: 0a5563efed19ca4461cf927419b6eb73 - depends: - - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=14 - - libnghttp2 >=1.67.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT - purls: [] - size: 462942 - timestamp: 1767821743793 + size: 4553739 + timestamp: 1770903929794 - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4 md5: d50608c443a30c341c24277d28290f76 @@ -9781,24 +9377,9 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT + purls: [] size: 466704 timestamp: 1773218522665 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.18.0-h7bfdcfb_0.conda - sha256: bf9d50e78df63b807c5cc98f44dc06a6555ab499edcd2949e9a07a5a785a11ee - md5: dc4f2007c6a30a45dfcf1c3a97b6aba6 - depends: - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=14 - - libnghttp2 >=1.67.0,<2.0a0 - - libssh2 >=1.11.1,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 - - zstd >=1.5.7,<1.6.0a0 - license: curl - license_family: MIT - purls: [] - size: 482649 - timestamp: 1767821674919 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libcurl-8.19.0-hc57f145_0.conda sha256: 75c1b2f9cff7598c593dda96c55963298bebb5bcb5a77af0b4c41cb03d26100b md5: d5306c7ec07faf48cfb0e552c67339e0 @@ -9812,6 +9393,7 @@ packages: - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT + purls: [] size: 485694 timestamp: 1773218484057 - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda @@ -9967,31 +9549,31 @@ packages: purls: [] size: 438992 timestamp: 1685726046519 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.4-hecca717_0.conda - sha256: d78f1d3bea8c031d2f032b760f36676d87929b18146351c4464c66b0869df3f5 - md5: e7f7ce06ec24cfcfb9e36d28cf82ba57 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda + sha256: e8c2b57f6aacabdf2f1b0924bd4831ce5071ba080baa4a9e8c0d720588b6794c + md5: 49f570f3bc4c874a06ea69b7225753af depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.7.4.* + - expat 2.7.5.* license: MIT license_family: MIT purls: [] - size: 76798 - timestamp: 1771259418166 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.4-hfae3067_0.conda - sha256: 995ce3ad96d0f4b5ed6296b051a0d7b6377718f325bc0e792fbb96b0e369dad7 - md5: 57f3b3da02a50a1be2a6fe847515417d + size: 76624 + timestamp: 1774719175983 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.7.5-hfae3067_0.conda + sha256: 6d438fc0bfdb263c24654fe49c09b31f06ec78eb709eb386392d2499af105f85 + md5: 05d1e0b30acd816a192c03dc6e164f4d depends: - libgcc >=14 constrains: - - expat 2.7.4.* + - expat 2.7.5.* license: MIT license_family: MIT purls: [] - size: 76564 - timestamp: 1771259530958 + size: 76523 + timestamp: 1774719129371 - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda sha256: 31f19b6a88ce40ebc0d5a992c131f57d919f73c0b92cd1617a5bec83f6e961e6 md5: a360c33a5abe61c07959e449fa1453eb @@ -10041,51 +9623,51 @@ packages: purls: [] size: 371550 timestamp: 1687765491794 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.2-ha770c72_0.conda - sha256: 2e1bfe1e856eb707d258f669ef6851af583ceaffab5e64821b503b0f7cd09e9e - md5: 26c746d14402a3b6c684d045b23b9437 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 + md5: e289f3d17880e44b633ba911d57a321b depends: - - libfreetype6 >=2.14.2 + - libfreetype6 >=2.14.3 license: GPL-2.0-only OR FTL purls: [] - size: 8035 - timestamp: 1772757210108 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.2-h8af1aa0_0.conda - sha256: 23cdb94528bb4328b6f7550906dee5080952354445d8bd96241fa7d059c4af95 - md5: 93bce8dee6a0a4906331db294ec250fe + size: 8049 + timestamp: 1774298163029 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype-2.14.3-h8af1aa0_0.conda + sha256: 752e4f66283d7deb4c6fd47d88df644d8daa2aaa825a54f3bf350a625190192a + md5: a229e22d4d8814a07702b0919d8e6701 depends: - - libfreetype6 >=2.14.2 + - libfreetype6 >=2.14.3 license: GPL-2.0-only OR FTL purls: [] - size: 8108 - timestamp: 1772756012710 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.2-h73754d4_0.conda - sha256: aba65b94bdbed52de17ec3d0c6f2ebac2ef77071ad22d6900d1614d0dd702a0c - md5: 8eaba3d1a4d7525c6814e861614457fd + size: 8125 + timestamp: 1774301094057 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d + md5: fb16b4b69e3f1dcfe79d80db8fd0c55d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libpng >=1.6.55,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - freetype >=2.14.2 + - freetype >=2.14.3 license: GPL-2.0-only OR FTL purls: [] - size: 386316 - timestamp: 1772757193822 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.2-hdae7a39_0.conda - sha256: a2e9efb033f7519bbc0a54558d7c9bb96252adc22c6e09df2daee7615265fbb1 - md5: 69d1cdfdabb66464cbde17890e8be3b9 + size: 384575 + timestamp: 1774298162622 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libfreetype6-2.14.3-hdae7a39_0.conda + sha256: 8e6b27fe4eec4c2fa7b7769a21973734c8dba1de80086fb0213e58375ac09f4c + md5: b99ed99e42dafb27889483b3098cace7 depends: - libgcc >=14 - libpng >=1.6.55,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - freetype >=2.14.2 + - freetype >=2.14.3 license: GPL-2.0-only OR FTL purls: [] - size: 423372 - timestamp: 1772756012086 + size: 422941 + timestamp: 1774301093473 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_18.conda sha256: faf7d2017b4d718951e3a59d081eb09759152f93038479b768e3d612688f83f5 md5: 0aa00f03f9e39fb9876085dee11a85d4 @@ -10741,66 +10323,66 @@ packages: purls: [] size: 1489440 timestamp: 1770801995062 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - build_number: 5 - sha256: c723b6599fcd4c6c75dee728359ef418307280fa3e2ee376e14e85e5bbdda053 - md5: b38076eb5c8e40d0106beda6f95d7609 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-6_h47877c9_openblas.conda + build_number: 6 + sha256: 371f517eb7010b21c6cc882c7606daccebb943307cb9a3bf2c70456a5c024f7d + md5: 881d801569b201c2e753f03c84b85e15 depends: - - libblas 3.11.0 5_h4a7cf45_openblas + - libblas 3.11.0 6_h4a7cf45_openblas constrains: - - blas 2.305 openblas - - liblapacke 3.11.0 5*_openblas - - libcblas 3.11.0 5*_openblas + - blas 2.306 openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18200 - timestamp: 1765818857876 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-5_h88aeb00_openblas.conda - build_number: 5 - sha256: 692222d186d3ffbc99eaf04b5b20181fd26aee1edec1106435a0a755c57cce86 - md5: 88d1e4133d1182522b403e9ba7435f04 + size: 18624 + timestamp: 1774503065378 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapack-3.11.0-6_h88aeb00_openblas.conda + build_number: 6 + sha256: 67472a3cb761ff95527387ea0367883a22f9fbda1283b9880e5ad644fafd0735 + md5: e23a27b52fb320687239e2c5ae4d7540 depends: - - libblas 3.11.0 5_haddc8a3_openblas + - libblas 3.11.0 6_haddc8a3_openblas constrains: - - liblapacke 3.11.0 5*_openblas - - blas 2.305 openblas - - libcblas 3.11.0 5*_openblas + - blas 2.306 openblas + - liblapacke 3.11.0 6*_openblas + - libcblas 3.11.0 6*_openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18392 - timestamp: 1765818627104 -- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-5_h6ae95b6_openblas.conda - build_number: 5 - sha256: 3ed01602bf863a44d32fef697dd79ae53436644cf8b54d67cba0957757323bfe - md5: e487a0e38d89da76410cb92a5db39ec5 + size: 18702 + timestamp: 1774503068721 +- conda: https://conda.anaconda.org/conda-forge/linux-64/liblapacke-3.11.0-6_h6ae95b6_openblas.conda + build_number: 6 + sha256: 42acc0583f672a84f4df52d121e772e9b5b1ee15480e5770f3bd1c151b8120f5 + md5: af6df8ece92110c951032683af64f1fa depends: - - libblas 3.11.0 5_h4a7cf45_openblas - - libcblas 3.11.0 5_h0358290_openblas - - liblapack 3.11.0 5_h47877c9_openblas + - libblas 3.11.0 6_h4a7cf45_openblas + - libcblas 3.11.0 6_h0358290_openblas + - liblapack 3.11.0 6_h47877c9_openblas constrains: - - blas 2.305 openblas + - blas 2.306 openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18225 - timestamp: 1765818880545 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.11.0-5_hb558247_openblas.conda - build_number: 5 - sha256: a7c4e125dc19c5ab28ebaebf8170a9e2b34928a4a310d9f20d2ba8eedb737db4 - md5: 8046d5ae90150f00c8b40455d9b2e180 + size: 18632 + timestamp: 1774503080559 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/liblapacke-3.11.0-6_hb558247_openblas.conda + build_number: 6 + sha256: f7f4ab09eebdd837562d390ee2ff187897338c9230fdf80db848a04d411354ee + md5: 12da32239ec4cc63d4f94d83b8425947 depends: - - libblas 3.11.0 5_haddc8a3_openblas - - libcblas 3.11.0 5_hd72aa62_openblas - - liblapack 3.11.0 5_h88aeb00_openblas + - libblas 3.11.0 6_haddc8a3_openblas + - libcblas 3.11.0 6_hd72aa62_openblas + - liblapack 3.11.0 6_h88aeb00_openblas constrains: - - blas 2.305 openblas + - blas 2.306 openblas license: BSD-3-Clause license_family: BSD purls: [] - size: 18397 - timestamp: 1765818635115 + size: 18708 + timestamp: 1774503079317 - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda sha256: 91bb4f5be1601b40b4995911d785e29387970f0b3c80f33f7f9028f95335399f md5: 1a2708a460884d6861425b7f9a7bef99 @@ -10832,37 +10414,58 @@ packages: purls: [] size: 43148553 timestamp: 1765930975162 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.1-hf7376ad_0.conda - sha256: 1145f9e85f0fbbdba88f1da5c8c48672bee7702e2f40c563b2dd48350ab4d413 - md5: 97cc6dad22677304846a798c8a65064d +- conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.2-hf7376ad_0.conda + sha256: eda0013a9979d142f520747e3621749c493f5fbc8f9d13a52ac7a2b699338e7c + md5: 7147b0792a803cd5b9929ce5d48f7818 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - libxml2 - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 44256563 - timestamp: 1773371774629 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm22-22.1.1-hfd2ba90_0.conda - sha256: 9b1634ce91d4d56d8a92996e65a2ef20fe0dd8afa88761bb361314748e439aab - md5: 9684eec87b0eb9c81c6b95dfcbe574a0 + size: 44217146 + timestamp: 1774480335347 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm22-22.1.2-hfd2ba90_0.conda + sha256: 604ec4336ed29963561db85ece1a8471aa3eb295011b2c4a2dbb55b9a06dc514 + md5: c1911bb134ed245ce090fdf23079a6f8 depends: - libgcc >=14 - libstdcxx >=14 - libxml2 - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 WITH LLVM-exception license_family: Apache purls: [] - size: 43166469 - timestamp: 1773368435640 + size: 43142768 + timestamp: 1774477938818 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libltdl-2.4.3a-h5888daf_0.conda + sha256: 7620c6425d4491e17083106ca49624448fc16186c30a93cf2b58f862bba416d1 + md5: 8e5de39cab514fa908fcaa7ba37a8738 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 38472 + timestamp: 1740593829307 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libltdl-2.4.3a-h5ad3122_0.conda + sha256: 079c7786458d2bda55c1c38a429c9bed50678f842284ca7645edcbe0dc13b456 + md5: 6e13257812a29efb7cc84aa396c72902 + depends: + - libgcc >=13 + license: LGPL-2.0-or-later + license_family: LGPL + purls: [] + size: 41874 + timestamp: 1740593981564 - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.2-hb03c661_0.conda sha256: 755c55ebab181d678c12e49cced893598f2bab22d582fbbf4d8b83c18be207eb md5: c7c83eecbb72d88b940c249af56c8b17 @@ -10979,39 +10582,39 @@ packages: purls: [] size: 893278 timestamp: 1770719134169 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 - md5: b499ce4b026493a13774bcf0f4c33849 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.68.1-h877daf1_0.conda + sha256: 663444d77a42f2265f54fb8b48c5450bfff4388d9c0f8253dd7855f0d993153f + md5: 2a45e7f8af083626f009645a6481f12d depends: - __glibc >=2.17,<3.0.a0 - - c-ares >=1.34.5,<2.0a0 + - c-ares >=1.34.6,<2.0a0 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 666600 - timestamp: 1756834976695 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.67.0-ha888d0e_0.conda - sha256: b03f406fd5c3f865a5e08c89b625245a9c4e026438fd1a445e45e6a0d69c2749 - md5: 981082c1cc262f514a5a2cf37cab9b81 + size: 663344 + timestamp: 1773854035739 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnghttp2-1.68.1-hd3077d7_0.conda + sha256: 13782715b9eeebc4ad16d36e84ca569d1495e3516aea3fe546a32caa0a597d82 + md5: be5f0f007a4500a226ef001115535a3d depends: - - c-ares >=1.34.5,<2.0a0 + - c-ares >=1.34.6,<2.0a0 - libev >=4.33,<4.34.0a0 - libev >=4.33,<5.0a0 - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 728661 - timestamp: 1756835019535 + size: 726928 + timestamp: 1773854039807 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda sha256: 927fe72b054277cde6cb82597d0fcf6baf127dcbce2e0a9d8925a68f1265eef5 md5: d864d34357c3b65a4b731f78c0801dc4 @@ -11071,34 +10674,6 @@ packages: purls: [] size: 47706 timestamp: 1772781596087 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libode-0.16.6-he3147e3_0.conda - sha256: 9a81f24cbbf3d2e4ce3a6364be6a30b51d35e21af8162b84420b83c501017d8b - md5: 15ffb39dd5700bd3272e056356e2864f - depends: - - __glibc >=2.17,<3.0.a0 - - libccd-double >=2.1,<2.2.0a0 - - libgcc >=14 - - libstdcxx >=14 - - pthread-stubs - - python_abi 3.12.* *_cp312 - license: LGPL-2.1-or-later OR BSD-4-Clause - purls: [] - size: 509036 - timestamp: 1760969221801 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libode-0.16.6-py312h4eed292_0.conda - sha256: c20e44a0d2ea1211830d0c3e07ec22a759c4b0a4cbaeb9ae3d6276f8fa4c970a - md5: aaf86835e0bf2f2bfab4b6fd0e882751 - depends: - - libccd-double >=2.1,<2.2.0a0 - - libgcc >=14 - - libstdcxx >=14 - - pthread-stubs - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: LGPL-2.1-or-later OR BSD-4-Clause - purls: [] - size: 480536 - timestamp: 1760969260005 - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-hd0c01bc_1.conda sha256: ffb066ddf2e76953f92e06677021c73c85536098f1c21fcd15360dbc859e22e4 md5: 68e52064ed3897463c0e958ab5c8f91b @@ -11120,35 +10695,35 @@ packages: purls: [] size: 220653 timestamp: 1745826021156 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - sha256: 199d79c237afb0d4780ccd2fbf829cea80743df60df4705202558675e07dd2c5 - md5: be43915efc66345cccb3c310b6ed0374 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.32-pthreads_h94d23a6_0.conda + sha256: 6dc30b28f32737a1c52dada10c8f3a41bc9e021854215efca04a7f00487d09d9 + md5: 89d61bc91d3f39fda0ca10fcd3c68594 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: - - openblas >=0.3.30,<0.3.31.0a0 + - openblas >=0.3.32,<0.3.33.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 5927939 - timestamp: 1763114673331 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.30-pthreads_h9d3fd7e_4.conda - sha256: 794a7270ea049ec931537874cd8d2de0ef4b3cef71c055cfd8b4be6d2f4228b0 - md5: 11d7d57b7bdd01da745bbf2b67020b2e + size: 5928890 + timestamp: 1774471724897 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libopenblas-0.3.32-pthreads_h9d3fd7e_0.conda + sha256: 51fcf5eb1fc43bfeca5bf3aa3f51546e92e5a92047ba47146dcea555142e30f8 + md5: 5d2ce5cf40443d055ec6d33840192265 depends: - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 constrains: - - openblas >=0.3.30,<0.3.31.0a0 + - openblas >=0.3.32,<0.3.33.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 4959359 - timestamp: 1763114173544 + size: 5122134 + timestamp: 1774471612323 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopencv-4.12.0-qt6_py312h52d6ec5_612.conda sha256: 73b3c2f1bc8417d297bc71e895236c7a23ac6c3a6bffe617eada876b66fd3280 md5: 872b744a711e7948710f70a79926e207 @@ -11625,54 +11200,54 @@ packages: purls: [] size: 29512 timestamp: 1749901899881 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.55-h421ea60_0.conda - sha256: 36ade759122cdf0f16e2a2562a19746d96cf9c863ffaa812f2f5071ebbe9c03c - md5: 5f13ffc7d30ffec87864e678df9957b4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.56-h421ea60_0.conda + sha256: 4f9fca3bc21e485ec0b3eb88db108b6cf9ab9a481cdf7d2ac6f9d30350b45ead + md5: 97169784f0775c85683c3d8badcea2c3 depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement purls: [] - size: 317669 - timestamp: 1770691470744 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.55-h1abf092_0.conda - sha256: c7378c6b79de4d571d00ad1caf0a4c19d43c9c94077a761abb6ead44d891f907 - md5: be4088903b94ea297975689b3c3aeb27 + size: 317540 + timestamp: 1774513272700 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpng-1.6.56-h1abf092_0.conda + sha256: 478c923cce506ff366cc765ab98feda4ce33a83329a8271b76289da9f0ae19f3 + md5: d5aff85583507906d19696d4961f4738 depends: - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement purls: [] - size: 340156 - timestamp: 1770691477245 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.2-hb80d175_0.conda - sha256: 5f857281d53334f1a400afae7ae915161eb8f796ddadb11c082839a4c47de6da - md5: fa63c385ddb50957d93bdb394e355be8 + size: 340342 + timestamp: 1774513287212 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + sha256: c7e61b86c273ec1ce92c0e087d1a0f3ed3b9485507c6cd35e03bc63de1b6b03f + md5: 405ec206d230d9d37ad7c2636114cbf4 depends: - __glibc >=2.17,<3.0.a0 - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - openldap >=2.6.10,<2.7.0a0 - openssl >=3.5.5,<4.0a0 license: PostgreSQL purls: [] - size: 2809023 - timestamp: 1770915404394 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-18.2-hf8816c8_0.conda - sha256: 529ac66cdfce1dc5ead63071f2e2dd69a3fa88b4a8dcf4595079997a3df5dd97 - md5: c54b5b1eb1b2c0f41781293fd4b530b3 + size: 2865686 + timestamp: 1772136328077 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libpq-18.3-h7d4fc67_0.conda + sha256: 878b5d316087a226eb235f0dd46e7de39941afe13c5d3c7f6a289e8853d45333 + md5: 7eb18b198b1d35da9352062c69c4ee64 depends: - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - openldap >=2.6.10,<2.7.0a0 - openssl >=3.5.5,<4.0a0 license: PostgreSQL purls: [] - size: 2785155 - timestamp: 1770915428682 + size: 2854221 + timestamp: 1772136342536 - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda sha256: 0ef142ac31e6fd59b4af89ac800acb6deb3fbd9cc4ccf070c03cc2c784dc7296 md5: 07479fc04ba3ddd5d9f760ef1635cfa7 @@ -11733,16 +11308,16 @@ packages: purls: [] size: 752140 timestamp: 1768379160784 -- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.0-h4c96295_0.conda - sha256: d68b57e17b0edcf52735f6f0093329d2dae53b958e55405970d4c872bd513431 - md5: b9c8f19b844f87d55c09965c0645a8f7 +- conda: https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.62.1-h4c96295_0.conda + sha256: dc4698b32b2ca3fc0715d7d307476a71622bee0f2f708f9dadec8af21e1047c8 + md5: a4b87f1fbcdbb8ad32e99c2611120f2e depends: - __glibc >=2.17,<3.0.a0 - cairo >=1.18.4,<2.0a0 - fontconfig >=2.17.1,<3.0a0 - fonts-conda-ecosystem - gdk-pixbuf >=2.44.5,<3.0a0 - - harfbuzz >=13.1.0 + - harfbuzz >=13.1.1 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - libxml2-16 >=2.14.6 @@ -11751,17 +11326,17 @@ packages: - __glibc >=2.17 license: LGPL-2.1-or-later purls: [] - size: 4027021 - timestamp: 1773392244201 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.62.0-hf685517_0.conda - sha256: ab5a529f254b56028f5b8cf4d9e26a982c20ed323cce43a0b2f356779c818274 - md5: c4fa0b7c6e8de9d5fadd60d6cec56e40 + size: 3474421 + timestamp: 1773814909137 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/librsvg-2.62.1-hf685517_0.conda + sha256: 47c4fbdb548584d7797490a308a86d71dd665ff12c633dedaba03c4c4342b934 + md5: 4488643185701d0d8cba2233c1cdece8 depends: - cairo >=1.18.4,<2.0a0 - fontconfig >=2.17.1,<3.0a0 - fonts-conda-ecosystem - gdk-pixbuf >=2.44.5,<3.0a0 - - harfbuzz >=13.1.0 + - harfbuzz >=13.1.1 - libgcc >=14 - libglib >=2.86.4,<3.0a0 - libxml2-16 >=2.14.6 @@ -11770,8 +11345,8 @@ packages: - __glibc >=2.17 license: LGPL-2.1-or-later purls: [] - size: 3008494 - timestamp: 1773398284947 + size: 3010317 + timestamp: 1773821086415 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-14.3.0-h8f1669f_18.conda sha256: e03ed186eefb46d7800224ad34bad1268c9d19ecb8f621380a50601c6221a4a7 md5: ad3a0e2dc4cce549b2860e2ef0e6d75b @@ -11866,24 +11441,25 @@ packages: purls: [] size: 396501 timestamp: 1695747749825 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 - md5: a587892d3c13b6621a6091be690dbca2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 + md5: 7af961ef4aa2c1136e11dd43ded245ab depends: - - libgcc-ng >=12 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 license: ISC purls: [] - size: 205978 - timestamp: 1716828628198 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.20-h68df207_0.conda - sha256: 448df5ea3c5cf1af785aad46858d7a5be0522f4234a4dc9bb764f4d11ff3b981 - md5: 2e4a8f23bebdcb85ca8e5a0fbe75666a + size: 277661 + timestamp: 1772479381288 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsodium-1.0.21-h80f16a2_3.conda + sha256: d6112f3a7e7ffcd726ce653724f979b528cb8a19675fc06016a5d360ef94e9a4 + md5: 9e1fe4202543fa5b6ab58dbf12d34ced depends: - - libgcc-ng >=12 + - libgcc >=14 license: ISC purls: [] - size: 177394 - timestamp: 1716828514515 + size: 272649 + timestamp: 1772479384085 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.52.0-hf4e2dac_0.conda sha256: d716847b7deca293d2e49ed1c8ab9e4b9e04b9d780aea49a97c26925b28a7993 md5: fd893f6a3002a635b5e50ceb9dd2c0f4 @@ -11997,27 +11573,27 @@ packages: purls: [] size: 27645 timestamp: 1771378204663 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.10-hd0affe5_4.conda - sha256: f0356bb344a684e7616fc84675cfca6401140320594e8686be30e8ac7547aed2 - md5: 1d4c18d75c51ed9d00092a891a547a7d +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-257.13-hd0affe5_0.conda + sha256: c5008b602cb5c819f7b52d418b3ed17e1818cbbf6705b189e7ab36bb70cce3d8 + md5: 8ee3cb7f64be0e8c4787f3a4dbe024e6 depends: - __glibc >=2.17,<3.0.a0 - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later purls: [] - size: 491953 - timestamp: 1770738638119 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.10-hf9559e3_4.conda - sha256: 95bb4c430e8ca666a4c67b7951f03fbee5a5258b1d29c2a26bf56c86fe32c010 - md5: 96e731e9cf876fb2d8882093c0f24630 + size: 492799 + timestamp: 1773797095649 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsystemd0-257.13-hf9559e3_0.conda + sha256: b38e9777b3231dfda62f2d127aac8091d990b5c45814a2b9d2e382f42f73a895 + md5: ffd5411606e65767354fe153371cc63a depends: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later purls: [] - size: 517911 - timestamp: 1770738680829 + size: 516600 + timestamp: 1773797150163 - conda: https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.21.0-hb03c661_0.conda sha256: a3f0c33ef567eb2e3a22d7fea0717a294a5fea4964478aa06b467ce1c93bec38 md5: 0ffe6217a3d09398155d32a2ddb41251 @@ -12100,27 +11676,50 @@ packages: purls: [] size: 488407 timestamp: 1762022048105 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.10-hd0affe5_4.conda - sha256: ed4d2c01fbeb1330f112f7e399408634db277d3dfb2dec1d0395f56feaa24351 - md5: 6c74fba677b61a0842cbf0f63eee683b +- conda: https://conda.anaconda.org/conda-forge/linux-64/libtool-2.5.4-h5888daf_0.conda + sha256: c8245c70ba5b075e0cd61f430afbda00b60931603ed4ea31ce89e7fe930e4e3d + md5: 90697d80c181414aa3472199e136a04e + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=13 + - libltdl 2.4.3a h5888daf_0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 415044 + timestamp: 1740593851157 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libtool-2.5.4-h5ad3122_0.conda + sha256: 3ad0e71e0997ef6a245ed1906ec2e86af7549a108c35d25110e66a3a4dece20e + md5: 0651f29a5ea482c71f8a74932f01e02f + depends: + - libgcc >=13 + - libltdl 2.4.3a h5ad3122_0 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 416270 + timestamp: 1740594010519 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libudev1-257.13-hd0affe5_0.conda + sha256: 1a1e367c04d66030aa93b4d33905f7f6fbb59cfc292e816fe3e9c1e8b3f4d1e2 + md5: 2c2270f93d6f9073cbf72d821dfc7d72 depends: - __glibc >=2.17,<3.0.a0 - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later purls: [] - size: 144654 - timestamp: 1770738650966 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.10-hf9559e3_4.conda - sha256: 18098716de78ab49566c862a5bf1f89e0e064a4fc0f31ad08b60b7774cfdb60e - md5: a9bcd3f70036640538e8187e4c594cbf + size: 145087 + timestamp: 1773797108513 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libudev1-257.13-hf9559e3_0.conda + sha256: 4946526f7723cb0f5a4dc830381ea48f455f9aebd456655cac99df70cd0d9567 + md5: b3a73b94483260f38dcbb489ee20c6d9 depends: - libcap >=2.77,<2.78.0a0 - libgcc >=14 license: LGPL-2.1-or-later purls: [] - size: 157130 - timestamp: 1770738690431 + size: 156357 + timestamp: 1773797159424 - conda: https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2 sha256: e88c45505921db29c08df3439ddb7f771bbff35f95e7d3103bf365d5d6ce2a6d md5: 7245a044b4a1980ed83196176b78b73a @@ -12226,27 +11825,27 @@ packages: purls: [] size: 93129 timestamp: 1748856228398 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee - md5: db409b7c1720428638e7c0d509d3e1b5 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.42-h5347b49_0.conda + sha256: bc1b08c92626c91500fd9f26f2c797f3eb153b627d53e9c13cd167f1e12b2829 + md5: 38ffe67b78c9d4de527be8315e5ada2c depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 40311 - timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.41.3-h1022ec0_0.conda - sha256: c37a8e89b700646f3252608f8368e7eb8e2a44886b92776e57ad7601fc402a11 - md5: cf2861212053d05f27ec49c3784ff8bb + size: 40297 + timestamp: 1775052476770 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.42-h1022ec0_0.conda + sha256: 7d427edf58c702c337bf62bc90f355b7fc374a65fd9f70ea7a490f13bb76b1b9 + md5: a0b5de740d01c390bdbb46d7503c9fab depends: - libgcc >=14 license: BSD-3-Clause license_family: BSD purls: [] - size: 43453 - timestamp: 1766271546875 + size: 43567 + timestamp: 1775052485727 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuv-1.51.0-hb03c661_1.conda sha256: c180f4124a889ac343fc59d15558e93667d894a966ec6fdb61da1604481be26b md5: 0f03292cc56bf91a077a134ea8747118 @@ -12578,6 +12177,33 @@ packages: purls: [] size: 253367 timestamp: 1757964660396 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzenohc-1.7.2-hfad6b34_0.conda + sha256: a7a2e7aca1dce0c8afdae4cbf21562f0f1975f767adc5faeaf193a2e793d21d3 + md5: 762928a20d537bebb30f2063f6c1e598 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - zenoh-rust-abi >=1.7.2.1.85.0,<1.7.2.1.85.1.0a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 OR EPL-2.0 + purls: [] + size: 4462657 + timestamp: 1767984586418 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzenohc-1.7.2-hd661084_0.conda + sha256: 207cc0a8453ec350696410f3a383df361ee03e1dc5dd635e3e742adc90a309cc + md5: 096f71ab8586fc9e03d077179bd3aecc + depends: + - libgcc >=14 + - libstdcxx >=14 + - zenoh-rust-abi >=1.7.2.1.85.0,<1.7.2.1.85.1.0a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 OR EPL-2.0 + purls: [] + size: 4342299 + timestamp: 1767984665690 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda sha256: 991e7348b0f650d495fb6d8aa9f8c727bdf52dabf5853c0cc671439b160dce48 md5: a7b27c075c9b7f459f1c022090697cba @@ -12605,31 +12231,28 @@ packages: purls: [] size: 117603 timestamp: 1730442215935 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: d87ff7921124eccd67248aa483c23fec depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 60963 - timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h86ecc28_2.conda - sha256: 5a2c1eeef69342e88a98d1d95bff1603727ab1ff4ee0e421522acd8813439b84 - md5: 08aad7cbe9f5a6b460d0976076b6ae64 - depends: - - libgcc >=13 + size: 63629 + timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_2.conda + sha256: eb111e32e5a7313a5bf799c7fb2419051fa2fe7eff74769fac8d5a448b309f7f + md5: 502006882cf5461adced436e410046d1 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 66657 - timestamp: 1727963199518 + size: 69833 + timestamp: 1774072605429 - conda: https://conda.anaconda.org/conda-forge/noarch/loguru-0.7.3-pyh707e725_0.conda sha256: e4a07f357a4cf195a2345dabd98deab80f4d53574abe712a9cc7f22d3f2cc2c3 md5: 49647ac1de4d1e4b49124aedf3934e02 @@ -12796,28 +12419,6 @@ packages: purls: [] size: 528318 timestamp: 1727801707353 -- pypi: https://files.pythonhosted.org/packages/15/c2/3842d8e39006b5b03384418b55108a3f3931ac6fe9b998814be81267acec/marisa_trie-1.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: marisa-trie - version: 1.4.0 - sha256: 20bc1a6936ba13b6b69684df2e41592f39f700f478e62453bb07fcfbefe1aa30 - requires_dist: - - hypothesis ; extra == 'test' - - pytest ; extra == 'test' - - readme-renderer ; extra == 'test' - - pytest-run-parallel ; python_full_version >= '3.13' and extra == 'test' - - hypothesis>=6.136.9 ; python_full_version >= '3.13' and extra == 'test' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/a8/a2/1e0f0665a98968b0af7067cf2dad569e1bd8c1f13a97670b74b5ac5153d9/marisa_trie-1.4.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - name: marisa-trie - version: 1.4.0 - sha256: fc11658ff7eb5888e7a2bd5c9a98f73a2e03dbf252f844032d7181627e59017b - requires_dist: - - hypothesis ; extra == 'test' - - pytest ; extra == 'test' - - readme-renderer ; extra == 'test' - - pytest-run-parallel ; python_full_version >= '3.13' and extra == 'test' - - hypothesis>=6.136.9 ; python_full_version >= '3.13' and extra == 'test' - requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e md5: 5b5203189eb668f042ac2b0826244964 @@ -12861,24 +12462,6 @@ packages: - pkg:pypi/markupsafe?source=hash-mapping size: 26305 timestamp: 1772446326927 -- pypi: https://files.pythonhosted.org/packages/be/2f/5108cb3ee4ba6501748c4908b908e55f42a5b66245b4cfe0c99326e1ef6e/marshmallow-3.26.2-py3-none-any.whl - name: marshmallow - version: 3.26.2 - sha256: 013fa8a3c4c276c24d26d84ce934dc964e2aa794345a0f8c7e5a7191482c8a73 - requires_dist: - - packaging>=17.0 - - marshmallow[tests] ; extra == 'dev' - - tox ; extra == 'dev' - - pre-commit>=3.5,<5.0 ; extra == 'dev' - - autodocsumm==0.2.14 ; extra == 'docs' - - furo==2024.8.6 ; extra == 'docs' - - sphinx-copybutton==0.5.2 ; extra == 'docs' - - sphinx-issues==5.0.0 ; extra == 'docs' - - sphinx==8.1.3 ; extra == 'docs' - - sphinxext-opengraph==0.9.1 ; extra == 'docs' - - pytest ; extra == 'tests' - - simplejson ; extra == 'tests' - requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py312h7900ff3_0.conda sha256: 6d66175e1a4ffb91ed954e2c11066d2e03a05bce951a808275069836ddfc993e md5: 2a7663896e5aab10b60833a768c4c272 @@ -13067,19 +12650,6 @@ packages: purls: [] size: 558708 timestamp: 1730581372400 -- pypi: https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl - name: mpmath - version: 1.3.0 - sha256: a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c - requires_dist: - - pytest>=4.6 ; extra == 'develop' - - pycodestyle ; extra == 'develop' - - pytest-cov ; extra == 'develop' - - codecov ; extra == 'develop' - - wheel ; extra == 'develop' - - sphinx ; extra == 'docs' - - gmpy2>=2.1.0a4 ; platform_python_implementation != 'PyPy' and extra == 'gmpy' - - pytest>=4.6 ; extra == 'tests' - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py312hd9148b4_1.conda sha256: 94068fd39d1a672f8799e3146a18ba4ef553f0fcccefddb3c07fbdabfd73667a md5: 2e489969e38f0b428c39492619b5e6e5 @@ -13149,79 +12719,44 @@ packages: - pkg:pypi/munkres?source=hash-mapping size: 15851 timestamp: 1749895533014 -- pypi: https://files.pythonhosted.org/packages/46/11/8f92f01da9cc41247008856438aa052cc93f74e4ac12ff250eb96a44249a/mycroft_mimic3_tts-0.2.4.tar.gz - name: mycroft-mimic3-tts - version: 0.2.4 - sha256: 60cd282274c94967e11845b9127ff2eb7ba936341de0e231107297c0c70d2a27 - requires_dist: - - dataclasses-json<1.0 - - epitran==1.17 - - espeak-phonemizer>=1.0,<2.0 - - gruut>=2.3.0,<3.0 - - numpy<2.0 - - onnxruntime>=1.6,<2.0 - - phonemes2ids<2.0 - - quart>=0.16,<1.0 - - quart-cors - - requests>=2,<3 - - swagger-ui-py>=21,<22 - - tqdm>=4,<5 - - xdgenvpy>2.0,<3 - - importlib-resources ; python_full_version < '3.9' - - gruut[de] ; extra == 'all' - - gruut[es] ; extra == 'all' - - gruut[fa] ; extra == 'all' - - gruut[fr] ; extra == 'all' - - gruut[it] ; extra == 'all' - - gruut[nl] ; extra == 'all' - - gruut[ru] ; extra == 'all' - - gruut[sw] ; extra == 'all' - - gruut[de] ; extra == 'de' - - gruut[es] ; extra == 'es' - - gruut[fa] ; extra == 'fa' - - gruut[fr] ; extra == 'fr' - - gruut[it] ; extra == 'it' - - gruut[nl] ; extra == 'nl' - - gruut[ru] ; extra == 'ru' - - gruut[sw] ; extra == 'sw' -- conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.19.1-py312h4c3975b_0.conda - sha256: d0e0765e5ec08141b10da9e03ef620d2e3e571d81cc2bc14025c52a48bb01856 - md5: c3ad8cc29400fe5ca1b6a6e5ae46538e +- conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.20.0-py312h4c3975b_0.conda + sha256: bb9ab670f94099843167170b81b597921890ffb0f56cb2222c1e611213b09f7e + md5: a1f58c8babb356d64f70c380dde5df2b depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - mypy_extensions >=1.0.0 - - pathspec >=0.9.0 + - pathspec >=1.0.0 - psutil >=4.0 - python >=3.12,<3.13.0a0 - - python-librt >=0.6.2 + - python-librt >=0.8.0 - python_abi 3.12.* *_cp312 - typing_extensions >=4.6.0 license: MIT license_family: MIT purls: - pkg:pypi/mypy?source=hash-mapping - size: 20301935 - timestamp: 1765795520217 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.19.1-py312h996f985_0.conda - sha256: 090e71c8c15e44427fafedee771ddd41458ac4693dd7b92199c400d9500050ce - md5: ffb1dec0b34372b6f0a9be000498b3ef + size: 22053001 + timestamp: 1775234215387 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.20.0-py312h996f985_0.conda + sha256: fd8b7009e40897643f14b19ff07488f256c1f6aa5fc029e773eec99acebc82fb + md5: 4d37fbe78253751ed5c7fa17eb55653c depends: - libgcc >=14 - mypy_extensions >=1.0.0 - - pathspec >=0.9.0 + - pathspec >=1.0.0 - psutil >=4.0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - - python-librt >=0.6.2 + - python-librt >=0.8.0 - python_abi 3.12.* *_cp312 - typing_extensions >=4.6.0 license: MIT license_family: MIT purls: - pkg:pypi/mypy?source=hash-mapping - size: 18170658 - timestamp: 1765796391426 + size: 19720265 + timestamp: 1775234398805 - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda sha256: 6ed158e4e5dd8f6a10ad9e525631e35cee8557718f83de7a4e3966b1f772c4b1 md5: e9c622e0d00fa24a6292279af3ab6d06 @@ -13287,49 +12822,6 @@ packages: purls: [] size: 1151473 timestamp: 1748012425058 -- pypi: https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl - name: networkx - version: 3.6.1 - sha256: d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762 - requires_dist: - - asv ; extra == 'benchmarking' - - virtualenv ; extra == 'benchmarking' - - numpy>=1.25 ; extra == 'default' - - scipy>=1.11.2 ; extra == 'default' - - matplotlib>=3.8 ; extra == 'default' - - pandas>=2.0 ; extra == 'default' - - pre-commit>=4.1 ; extra == 'developer' - - mypy>=1.15 ; extra == 'developer' - - sphinx>=8.0 ; extra == 'doc' - - pydata-sphinx-theme>=0.16 ; extra == 'doc' - - sphinx-gallery>=0.18 ; extra == 'doc' - - numpydoc>=1.8.0 ; extra == 'doc' - - pillow>=10 ; extra == 'doc' - - texext>=0.6.7 ; extra == 'doc' - - myst-nb>=1.1 ; extra == 'doc' - - intersphinx-registry ; extra == 'doc' - - osmnx>=2.0.0 ; extra == 'example' - - momepy>=0.7.2 ; extra == 'example' - - contextily>=1.6 ; extra == 'example' - - seaborn>=0.13 ; extra == 'example' - - cairocffi>=1.7 ; extra == 'example' - - igraph>=0.11 ; extra == 'example' - - scikit-learn>=1.5 ; extra == 'example' - - iplotx>=0.9.0 ; extra == 'example' - - lxml>=4.6 ; extra == 'extra' - - pygraphviz>=1.14 ; extra == 'extra' - - pydot>=3.0.1 ; extra == 'extra' - - sympy>=1.10 ; extra == 'extra' - - build>=0.10 ; extra == 'release' - - twine>=4.0 ; extra == 'release' - - wheel>=0.40 ; extra == 'release' - - changelist==0.5 ; extra == 'release' - - pytest>=7.2 ; extra == 'test' - - pytest-cov>=4.0 ; extra == 'test' - - pytest-xdist>=3.0 ; extra == 'test' - - pytest-mpl ; extra == 'test-extras' - - pytest-randomly ; extra == 'test-extras' - requires_python: '>=3.11,!=3.14.1' - conda: https://conda.anaconda.org/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda sha256: 6f7d59dbec0a7b00bf5d103a4306e8886678b796ff2151b62452d4582b2a53fb md5: b518e9e92493721281a60fa975bddc65 @@ -13449,12 +12941,6 @@ packages: purls: [] size: 2061869 timestamp: 1763490303490 -- pypi: https://files.pythonhosted.org/packages/d6/5b/545e9267a1cc080c8a1be2746113a063e34bcdd0f5173fd665a5c13cb234/num2words-0.5.14-py3-none-any.whl - name: num2words - version: 0.5.14 - sha256: 1c8e5b00142fc2966fd8d685001e36c4a9911e070d1b120e1beb721fa1edb33d - requires_dist: - - docopt>=0.6.2 - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda sha256: fe3459c75cf84dcef6ef14efcc4adb0ade66038ddd27cadb894f34f4797687d8 md5: d8285bea2a350f63fab23bf460221f3f @@ -13529,87 +13015,18 @@ packages: purls: [] size: 239860 timestamp: 1728635298509 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ompl-1.7.0-py312hd4042a8_2.conda - sha256: c0efa17e620567d8d3b8484a79c22eb97d64ddd127c167fe5a4e7b8935fcaa9f - md5: 4044ac0ba5a042b0a7ffe45effcf0177 +- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-hecca717_0.conda + sha256: 8de2f0cd8a659b01abf86e7fbb8cea4f28ada62fd288429a2bbc040db1b98dd0 + md5: c930c8052d780caa41216af7de472226 depends: - __glibc >=2.17,<3.0.a0 - - flann >=1.9.2,<1.9.3.0a0 - - libboost >=1.88.0,<1.89.0a0 - libgcc >=14 - - libode >=0.16.6,<0.16.7.0a0 - libstdcxx >=14 - - numpy >=1.23,<3 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 3139083 - timestamp: 1761048412589 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ompl-1.7.0-py312hae32f5c_2.conda - sha256: cab0f69bd456acf35283391652048be21ad1d71fa64859e28e68c1f81bd602a9 - md5: 55354af98214a9fb8fd77e7bbf71538f - depends: - - flann >=1.9.2,<1.9.3.0a0 - - libboost >=1.88.0,<1.89.0a0 - - libgcc >=14 - - libode >=0.16.6,<0.16.7.0a0 - - libstdcxx >=14 - - numpy >=1.23,<3 - - python >=3.12,<3.13.0a0 - - python >=3.12,<3.13.0a0 *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: [] - size: 3051975 - timestamp: 1761048310669 -- pypi: https://files.pythonhosted.org/packages/1c/dc/1f5489f7b21817d4ad352bf7a92a252bd5b438bcbaa7ad20ea50814edc79/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl - name: onnxruntime - version: 1.24.3 - sha256: 0a9847b870b6cb462652b547bc98c49e0efb67553410a082fde1918a38707452 - requires_dist: - - flatbuffers - - numpy>=1.21.6 - - packaging - - protobuf - - sympy - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/28/7c/fd253da53594ab8efbefdc85b3638620ab1a6aab6eb7028a513c853559ce/onnxruntime-1.24.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: onnxruntime - version: 1.24.3 - sha256: b354afce3333f2859c7e8706d84b6c552beac39233bcd3141ce7ab77b4cabb5d - requires_dist: - - flatbuffers - - numpy>=1.21.6 - - packaging - - protobuf - - sympy - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/b2/f1/d5318874aed3b57bd00bf76e8f9698b73b578137d9d403314a4e649fbb63/onnxruntime_webgpu-1.25.0.dev20260212001-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl - name: onnxruntime-webgpu - version: 1.25.0.dev20260212001 - sha256: 81b6669fcc9ec4435576eabb7ce14c262ce9b18a0b35e391a334e7a7f54243f8 - requires_dist: - - flatbuffers - - numpy>=1.21.6 - - packaging - - protobuf - - sympy - requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/opencl-headers-2025.06.13-h5888daf_0.conda - sha256: 2b6ce54174ec19110e1b3c37455f7cd138d0e228a75727a9bba443427da30a36 - md5: 45c3d2c224002d6d0d7769142b29f986 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 license: Apache-2.0 license_family: APACHE purls: [] - size: 55357 - timestamp: 1749853464518 + size: 55754 + timestamp: 1773844383536 - conda: https://conda.anaconda.org/conda-forge/linux-64/opencv-4.12.0-qt6_py312h7bb6282_612.conda sha256: c4532ba519a1b072398de54669c5c783991eb332aaa2a076cc27dd4a6379ccc3 md5: 3c22d365c8d69933d2ad9fb4bad1bc24 @@ -13636,37 +13053,37 @@ packages: purls: [] size: 27887 timestamp: 1766496259667 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.4.6-h40f6f1d_0.conda - sha256: c733f18e2896920eddbd26aba28fd16dae5b25f272ede436672ad0ceb60e8603 - md5: 0a5f140bdbc5f7ab45568a0bc3431362 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openexr-3.4.8-h40f6f1d_0.conda + sha256: 67cbe0dfa060e03a0abd32daacfcb4c7b861d39fbc5378a394021072e742b4c9 + md5: 494f0051343d095d4bf99f6fb31fb7cf depends: + - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - openjph >=0.26.3,<0.27.0a0 - - libzlib >=1.3.1,<2.0a0 - libdeflate >=1.25,<1.26.0a0 + - libzlib >=1.3.2,<2.0a0 - imath >=3.2.2,<3.2.3.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 1217961 - timestamp: 1772443688420 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.4.6-hd0c962a_0.conda - sha256: 049c3884af3f770d60e348abf253cf5d41d174d9068ee583b590122aa9ff0d84 - md5: 4e67c6e32982faacff191606815bb836 + size: 1217976 + timestamp: 1774561006856 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openexr-3.4.8-hd0c962a_0.conda + sha256: 1dee799deb2556034e03ff3c92aeb0c42bef8a3ad52271519223d95e903ede6e + md5: f0baed2dcdd2ec7648c11570cbdaf227 depends: - libstdcxx >=14 - libgcc >=14 - - imath >=3.2.2,<3.2.3.0a0 - openjph >=0.26.3,<0.27.0a0 - libdeflate >=1.25,<1.26.0a0 - - libzlib >=1.3.1,<2.0a0 + - imath >=3.2.2,<3.2.3.0a0 + - libzlib >=1.3.2,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 1176095 - timestamp: 1772443692126 + size: 1176418 + timestamp: 1774561011034 - conda: https://conda.anaconda.org/conda-forge/linux-64/openh264-2.6.0-hc22cd8d_0.conda sha256: 3f231f2747a37a58471c82a9a8a80d92b7fece9f3fce10901a5ac888ce00b747 md5: b28cf020fd2dead0ca6d113608683842 @@ -13744,35 +13161,35 @@ packages: purls: [] size: 228534 timestamp: 1771349510383 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda - sha256: cb0b07db15e303e6f0a19646807715d28f1264c6350309a559702f4f34f37892 - md5: 2e5bf4f1da39c0b32778561c3c4e5878 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-hbde042b_1.conda + sha256: 2e185a3dc2bdc4525dd68559efa3f24fa9159a76c40473e320732b35115163b2 + md5: 3c40a106eadf7c14c6236ceddb267893 depends: - __glibc >=2.17,<3.0.a0 - - cyrus-sasl >=2.1.27,<3.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.5.0,<4.0a0 + - cyrus-sasl >=2.1.28,<3.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 license: OLDAP-2.8 license_family: BSD purls: [] - size: 780253 - timestamp: 1748010165522 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.10-h30c48ee_0.conda - sha256: 13c7ba058b6e151468111235218158083b9e867738e66a5afb96096c5c123348 - md5: 48f31a61be512ec1929f4b4a9cedf4bd + size: 785570 + timestamp: 1771970256722 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openldap-2.6.10-h2fb54aa_1.conda + sha256: 32c9bd01e108a6983778c13b54ff6a99cb2eca188ce217db907819ec6d1d5db7 + md5: b761e5f1358577a16ca187c6116d9fcc depends: - - cyrus-sasl >=2.1.27,<3.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.5.0,<4.0a0 + - cyrus-sasl >=2.1.28,<3.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 license: OLDAP-2.8 license_family: BSD purls: [] - size: 902902 - timestamp: 1748010210718 + size: 907905 + timestamp: 1771970279050 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.1-h35e630c_1.conda sha256: 44c877f8af015332a5d12f5ff0fb20ca32f896526a7d0cdb30c769df1144fb5c md5: f61eb8cd60ff9057122a3d338b99c00f @@ -13821,17 +13238,6 @@ packages: purls: [] size: 375893 timestamp: 1760695582335 -- conda: https://conda.anaconda.org/conda-forge/noarch/osrf_pycommon-0.2.1-pyhd8ed1ab_0.tar.bz2 - sha256: 4c0421605528a29342f10f81c2739cf1a395ce1aee820c69db576c02f1925943 - md5: 990a69a331bfd88f9c8b95a725afc40a - depends: - - python >=3.6 - license: Apache-2.0 - license_family: Apache - purls: - - pkg:pypi/osrf-pycommon?source=hash-mapping - size: 32902 - timestamp: 1626759108531 - conda: https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.26.2-h3435931_0.conda sha256: f63962d24d81d4fafa15112c03cd5db1fddadd520fdb2ad7ec71a1689e8e694f md5: 312989f1b7318c3763fffdc78df8474e @@ -13866,243 +13272,50 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging?source=compressed-mapping + - pkg:pypi/packaging?source=hash-mapping size: 72010 timestamp: 1769093650580 -- pypi: https://files.pythonhosted.org/packages/3d/fe/89d77e424365280b79d99b3e1e7d606f5165af2f2ecfaf0c6d24c799d607/pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: pandas - version: 3.0.1 - sha256: 532527a701281b9dd371e2f582ed9094f4c12dd9ffb82c0c54ee28d8ac9520c4 - requires_dist: - - numpy>=1.26.0 ; python_full_version < '3.14' - - numpy>=2.3.3 ; python_full_version >= '3.14' - - python-dateutil>=2.8.2 - - tzdata ; sys_platform == 'win32' - - tzdata ; sys_platform == 'emscripten' - - hypothesis>=6.116.0 ; extra == 'test' - - pytest>=8.3.4 ; extra == 'test' - - pytest-xdist>=3.6.1 ; extra == 'test' - - pyarrow>=13.0.0 ; extra == 'pyarrow' - - bottleneck>=1.4.2 ; extra == 'performance' - - numba>=0.60.0 ; extra == 'performance' - - numexpr>=2.10.2 ; extra == 'performance' - - scipy>=1.14.1 ; extra == 'computation' - - xarray>=2024.10.0 ; extra == 'computation' - - fsspec>=2024.10.0 ; extra == 'fss' - - s3fs>=2024.10.0 ; extra == 'aws' - - gcsfs>=2024.10.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.5 ; extra == 'excel' - - python-calamine>=0.3.0 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.2.0 ; extra == 'excel' - - pyarrow>=13.0.0 ; extra == 'parquet' - - pyarrow>=13.0.0 ; extra == 'feather' - - pyiceberg>=0.8.1 ; extra == 'iceberg' - - tables>=3.10.1 ; extra == 'hdf5' - - pyreadstat>=1.2.8 ; extra == 'spss' - - sqlalchemy>=2.0.36 ; extra == 'postgresql' - - psycopg2>=2.9.10 ; extra == 'postgresql' - - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.36 ; extra == 'mysql' - - pymysql>=1.1.1 ; extra == 'mysql' - - sqlalchemy>=2.0.36 ; extra == 'sql-other' - - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' - - beautifulsoup4>=4.12.3 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=5.3.0 ; extra == 'html' - - lxml>=5.3.0 ; extra == 'xml' - - matplotlib>=3.9.3 ; extra == 'plot' - - jinja2>=3.1.5 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.4.2 ; extra == 'clipboard' - - zstandard>=0.23.0 ; extra == 'compression' - - pytz>=2024.2 ; extra == 'timezone' - - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - - beautifulsoup4>=4.12.3 ; extra == 'all' - - bottleneck>=1.4.2 ; extra == 'all' - - fastparquet>=2024.11.0 ; extra == 'all' - - fsspec>=2024.10.0 ; extra == 'all' - - gcsfs>=2024.10.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.116.0 ; extra == 'all' - - jinja2>=3.1.5 ; extra == 'all' - - lxml>=5.3.0 ; extra == 'all' - - matplotlib>=3.9.3 ; extra == 'all' - - numba>=0.60.0 ; extra == 'all' - - numexpr>=2.10.2 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.5 ; extra == 'all' - - psycopg2>=2.9.10 ; extra == 'all' - - pyarrow>=13.0.0 ; extra == 'all' - - pyiceberg>=0.8.1 ; extra == 'all' - - pymysql>=1.1.1 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.8 ; extra == 'all' - - pytest>=8.3.4 ; extra == 'all' - - pytest-xdist>=3.6.1 ; extra == 'all' - - python-calamine>=0.3.0 ; extra == 'all' - - pytz>=2024.2 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.4.2 ; extra == 'all' - - scipy>=1.14.1 ; extra == 'all' - - s3fs>=2024.10.0 ; extra == 'all' - - sqlalchemy>=2.0.36 ; extra == 'all' - - tables>=3.10.1 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2024.10.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.2.0 ; extra == 'all' - - zstandard>=0.23.0 ; extra == 'all' - requires_python: '>=3.11' -- pypi: https://files.pythonhosted.org/packages/d7/39/327802e0b6d693182403c144edacbc27eb82907b57062f23ef5a4c4a5ea7/pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - name: pandas - version: 3.0.1 - sha256: b8e36891080b87823aff3640c78649b91b8ff6eea3c0d70aeabd72ea43ab069b - requires_dist: - - numpy>=1.26.0 ; python_full_version < '3.14' - - numpy>=2.3.3 ; python_full_version >= '3.14' - - python-dateutil>=2.8.2 - - tzdata ; sys_platform == 'win32' - - tzdata ; sys_platform == 'emscripten' - - hypothesis>=6.116.0 ; extra == 'test' - - pytest>=8.3.4 ; extra == 'test' - - pytest-xdist>=3.6.1 ; extra == 'test' - - pyarrow>=13.0.0 ; extra == 'pyarrow' - - bottleneck>=1.4.2 ; extra == 'performance' - - numba>=0.60.0 ; extra == 'performance' - - numexpr>=2.10.2 ; extra == 'performance' - - scipy>=1.14.1 ; extra == 'computation' - - xarray>=2024.10.0 ; extra == 'computation' - - fsspec>=2024.10.0 ; extra == 'fss' - - s3fs>=2024.10.0 ; extra == 'aws' - - gcsfs>=2024.10.0 ; extra == 'gcp' - - odfpy>=1.4.1 ; extra == 'excel' - - openpyxl>=3.1.5 ; extra == 'excel' - - python-calamine>=0.3.0 ; extra == 'excel' - - pyxlsb>=1.0.10 ; extra == 'excel' - - xlrd>=2.0.1 ; extra == 'excel' - - xlsxwriter>=3.2.0 ; extra == 'excel' - - pyarrow>=13.0.0 ; extra == 'parquet' - - pyarrow>=13.0.0 ; extra == 'feather' - - pyiceberg>=0.8.1 ; extra == 'iceberg' - - tables>=3.10.1 ; extra == 'hdf5' - - pyreadstat>=1.2.8 ; extra == 'spss' - - sqlalchemy>=2.0.36 ; extra == 'postgresql' - - psycopg2>=2.9.10 ; extra == 'postgresql' - - adbc-driver-postgresql>=1.2.0 ; extra == 'postgresql' - - sqlalchemy>=2.0.36 ; extra == 'mysql' - - pymysql>=1.1.1 ; extra == 'mysql' - - sqlalchemy>=2.0.36 ; extra == 'sql-other' - - adbc-driver-postgresql>=1.2.0 ; extra == 'sql-other' - - adbc-driver-sqlite>=1.2.0 ; extra == 'sql-other' - - beautifulsoup4>=4.12.3 ; extra == 'html' - - html5lib>=1.1 ; extra == 'html' - - lxml>=5.3.0 ; extra == 'html' - - lxml>=5.3.0 ; extra == 'xml' - - matplotlib>=3.9.3 ; extra == 'plot' - - jinja2>=3.1.5 ; extra == 'output-formatting' - - tabulate>=0.9.0 ; extra == 'output-formatting' - - pyqt5>=5.15.9 ; extra == 'clipboard' - - qtpy>=2.4.2 ; extra == 'clipboard' - - zstandard>=0.23.0 ; extra == 'compression' - - pytz>=2024.2 ; extra == 'timezone' - - adbc-driver-postgresql>=1.2.0 ; extra == 'all' - - adbc-driver-sqlite>=1.2.0 ; extra == 'all' - - beautifulsoup4>=4.12.3 ; extra == 'all' - - bottleneck>=1.4.2 ; extra == 'all' - - fastparquet>=2024.11.0 ; extra == 'all' - - fsspec>=2024.10.0 ; extra == 'all' - - gcsfs>=2024.10.0 ; extra == 'all' - - html5lib>=1.1 ; extra == 'all' - - hypothesis>=6.116.0 ; extra == 'all' - - jinja2>=3.1.5 ; extra == 'all' - - lxml>=5.3.0 ; extra == 'all' - - matplotlib>=3.9.3 ; extra == 'all' - - numba>=0.60.0 ; extra == 'all' - - numexpr>=2.10.2 ; extra == 'all' - - odfpy>=1.4.1 ; extra == 'all' - - openpyxl>=3.1.5 ; extra == 'all' - - psycopg2>=2.9.10 ; extra == 'all' - - pyarrow>=13.0.0 ; extra == 'all' - - pyiceberg>=0.8.1 ; extra == 'all' - - pymysql>=1.1.1 ; extra == 'all' - - pyqt5>=5.15.9 ; extra == 'all' - - pyreadstat>=1.2.8 ; extra == 'all' - - pytest>=8.3.4 ; extra == 'all' - - pytest-xdist>=3.6.1 ; extra == 'all' - - python-calamine>=0.3.0 ; extra == 'all' - - pytz>=2024.2 ; extra == 'all' - - pyxlsb>=1.0.10 ; extra == 'all' - - qtpy>=2.4.2 ; extra == 'all' - - scipy>=1.14.1 ; extra == 'all' - - s3fs>=2024.10.0 ; extra == 'all' - - sqlalchemy>=2.0.36 ; extra == 'all' - - tables>=3.10.1 ; extra == 'all' - - tabulate>=0.9.0 ; extra == 'all' - - xarray>=2024.10.0 ; extra == 'all' - - xlrd>=2.0.1 ; extra == 'all' - - xlsxwriter>=3.2.0 ; extra == 'all' - - zstandard>=0.23.0 ; extra == 'all' - requires_python: '>=3.11' -- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hadf4263_0.conda - sha256: 3613774ad27e48503a3a6a9d72017087ea70f1426f6e5541dbdb59a3b626eaaf - md5: 79f71230c069a287efe3a8614069ddf1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pango-1.56.4-hda50119_1.conda + sha256: 315b52bfa6d1a820f4806f6490d472581438a28e21df175290477caec18972b0 + md5: d53ffc0edc8eabf4253508008493c5bc depends: - __glibc >=2.17,<3.0.a0 - cairo >=1.18.4,<2.0a0 - - fontconfig >=2.15.0,<3.0a0 + - fontconfig >=2.17.1,<3.0a0 - fonts-conda-ecosystem - - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=11.0.1 - - libexpat >=2.7.0,<3.0a0 - - libfreetype >=2.13.3 - - libfreetype6 >=2.13.3 - - libgcc >=13 - - libglib >=2.84.2,<3.0a0 - - libpng >=1.6.49,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 + - fribidi >=1.0.16,<2.0a0 + - harfbuzz >=13.2.1 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 license: LGPL-2.1-or-later purls: [] - size: 455420 - timestamp: 1751292466873 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.56.4-he55ef5b_0.conda - sha256: dd36cd5b6bc1c2988291a6db9fa4eb8acade9b487f6f1da4eaa65a1eebb0a12d - md5: a22cc88bf6059c9bcc158c94c9aab5b8 + size: 458036 + timestamp: 1774281947855 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pango-1.56.4-h8547ced_1.conda + sha256: d209c8b0d53c441ee0bc0d8fce0fcae8e7e05755e51b13b6b9da02c7aa032f98 + md5: 3fc7cc25bba3381e77b753578058e3b0 depends: - cairo >=1.18.4,<2.0a0 - - fontconfig >=2.15.0,<3.0a0 + - fontconfig >=2.17.1,<3.0a0 - fonts-conda-ecosystem - - fribidi >=1.0.10,<2.0a0 - - harfbuzz >=11.0.1 - - libexpat >=2.7.0,<3.0a0 - - libfreetype >=2.13.3 - - libfreetype6 >=2.13.3 - - libgcc >=13 - - libglib >=2.84.2,<3.0a0 - - libpng >=1.6.49,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 + - fribidi >=1.0.16,<2.0a0 + - harfbuzz >=13.2.0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libgcc >=14 + - libglib >=2.86.4,<3.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 license: LGPL-2.1-or-later purls: [] - size: 468811 - timestamp: 1751293869070 -- pypi: https://files.pythonhosted.org/packages/72/2a/05a47a6c291414f5a66901f8d1f6ba68e8ec9fccb341d56fa0b31479d41d/panphon-0.22.2-py2.py3-none-any.whl - name: panphon - version: 0.22.2 - sha256: a4c65113430d0699054cb00df978c02712d3c80913a1ef67697f888d96f3a00a - requires_dist: - - setuptools - - unicodecsv - - pyyaml - - regex - - numpy>=1.20.2 - - editdistance - - munkres - - pandas + size: 470441 + timestamp: 1774284032397 - conda: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda sha256: ce76d5a1fc6c7ef636cbdbf14ce2d601a1bfa0dd8d286507c1fd02546fccb94b md5: 1a884d2b1ea21abfb73911dcdb8342e4 @@ -14127,7 +13340,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/parso?source=compressed-mapping + - pkg:pypi/parso?source=hash-mapping size: 82287 timestamp: 1770676243987 - conda: https://conda.anaconda.org/conda-forge/noarch/pathspec-1.0.4-pyhd8ed1ab_0.conda @@ -14284,10 +13497,6 @@ packages: - pkg:pypi/pexpect?source=hash-mapping size: 53561 timestamp: 1733302019362 -- pypi: https://files.pythonhosted.org/packages/27/6f/0cf0746d02a356103b7c3a065dbc188d8b5092e58bb363d74aa668ee1ad1/phonemes2ids-1.2.2.tar.gz - name: phonemes2ids - version: 1.2.2 - sha256: 8e3e9e0723215c7187b56276bb053688a43851d8deb9948432e793262551c2ac - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-11.3.0-py312h7b42cdd_3.conda sha256: ad4a22899819a2bb86550d1fc3833a44e073aac80ea61529676b5e73220fcc2b md5: 1d7f05c3f8bb4e98d02fca45f0920b23 @@ -14412,7 +13621,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pluggy?source=compressed-mapping + - pkg:pypi/pluggy?source=hash-mapping size: 25877 timestamp: 1764896838868 - conda: https://conda.anaconda.org/conda-forge/noarch/ply-3.11-pyhd8ed1ab_3.conda @@ -14467,11 +13676,6 @@ packages: - pkg:pypi/pre-commit?source=hash-mapping size: 200827 timestamp: 1765937577534 -- pypi: https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl - name: priority - version: 2.0.0 - sha256: 6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa - requires_python: '>=3.6.1' - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-he0df7b0_3.conda sha256: c94d3d8ef40d1ea018860d66c416003bc03adede7d212efc9218bb64041fe2f7 md5: 031e33ae075b336c0ce92b14efa886c5 @@ -14675,6 +13879,31 @@ packages: purls: [] size: 113424 timestamp: 1737355438448 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-17.0-haebf07f_3.conda + sha256: 9c292793d5cd96b09c1591b217c6ce9ad4fb4f2265ee6182279b642b470009f0 + md5: 43f74f43f810b7ed57d72b66f5f2e254 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - pulseaudio-client 17.0 h9a6aba3_3 + - pulseaudio-daemon 17.0 h33dcb6b_3 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 18408 + timestamp: 1763148313744 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-17.0-h3dd60a8_3.conda + sha256: 52bc09672a79407728acb199b1fb5477572327824163a8d72ea4fa409393d334 + md5: 067e30769229ea8889a2be53cd55f960 + depends: + - libgcc >=14 + - pulseaudio-client 17.0 hcf98165_3 + - pulseaudio-daemon 17.0 hb9404ba_3 + license: LGPL-2.1-or-later + license_family: LGPL + purls: [] + size: 18473 + timestamp: 1763148328578 - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-h9a6aba3_3.conda sha256: 0a0858c59805d627d02bdceee965dd84fde0aceab03a2f984325eec08d822096 md5: b8ea447fdf62e3597cb8d2fae4eb1a90 @@ -14712,6 +13941,69 @@ packages: purls: [] size: 760306 timestamp: 1763148231117 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-17.0-h33dcb6b_3.conda + sha256: 3fd53058cea7d7b84779ea5644239e5b1d23621b2fef4a07d195db5d93f3849c + md5: f7bc8d752fd698cbb3bddf8df96a8f35 + depends: + - __glibc >=2.17,<3.0.a0 + - alsa-lib >=1.2.14,<1.3.0a0 + - dbus >=1.16.2,<2.0a0 + - fftw >=3.3.10,<4.0a0 + - gstreamer-orc >=0.4.41,<0.5.0a0 + - jack >=1.9.22,<1.10.0a0 + - libcap >=2.77,<2.78.0a0 + - libgcc >=14 + - libltdl >=2.4.3a,<2.5.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=257.10 + - libtool >=2.5.4,<3.0a0 + - libudev1 >=257.10 + - libxcb >=1.17.0,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - pulseaudio-client 17.0 h9a6aba3_3 + - soxr >=0.1.3,<0.1.4.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + constrains: + - pulseaudio 17.0 *_3 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 876199 + timestamp: 1763148300906 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pulseaudio-daemon-17.0-hb9404ba_3.conda + sha256: 5b39858cbdb46c40de1fc9cf454f1f0d715feec882502f47daa8f7a4c0bf35bd + md5: ea5e4cc0f2060cfec6a851c1bb545ff4 + depends: + - alsa-lib >=1.2.14,<1.3.0a0 + - dbus >=1.16.2,<2.0a0 + - fftw >=3.3.10,<4.0a0 + - gstreamer-orc >=0.4.41,<0.5.0a0 + - jack >=1.9.22,<1.10.0a0 + - libcap >=2.77,<2.78.0a0 + - libgcc >=14 + - libltdl >=2.4.3a,<2.5.0a0 + - libsndfile >=1.2.2,<1.3.0a0 + - libsystemd0 >=257.10 + - libtool >=2.5.4,<3.0a0 + - libudev1 >=257.10 + - libxcb >=1.17.0,<2.0a0 + - openssl >=3.5.4,<4.0a0 + - pulseaudio-client 17.0 hcf98165_3 + - soxr >=0.1.3,<0.1.4.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + constrains: + - pulseaudio 17.0 *_3 + license: GPL-2.0-or-later + license_family: GPL + purls: [] + size: 897388 + timestamp: 1763148315136 - conda: https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.3-pyhd8ed1ab_1.conda sha256: 71bd24600d14bb171a6321d523486f6a06f855e75e547fa0cb2a0953b02047f0 md5: 3bfdfb8dbcdc4af1ae3f9a8eb3948f04 @@ -14751,22 +14043,12 @@ packages: purls: [] size: 1154560 timestamp: 1766496246197 -- pypi: https://files.pythonhosted.org/packages/80/15/2ff925c0776c7a2aaab3d03b0e477d1a24b0637600b7e2e928cbcc25034f/pyamdgpuinfo-2.1.7.tar.gz - name: pyamdgpuinfo - version: 2.1.7 - sha256: 95b4f5618c3271f95edef8e10ddaf89a13a0d1edbb03bdd05d8f4a930aa125b0 - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/fc/b7/ba5551480e397c6e86805cc381dd6dc36b15411a806c00c35b661d8dd77e/pyamdgpuinfo-2.1.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl - name: pyamdgpuinfo - version: 2.1.7 - sha256: 74e7db2f58f74d0c9a66709fe7a16410ccc442bcbb204a1e593bfd575a6184f5 - requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.2-pyh7a1b43c_0.conda - sha256: c2d16e61270efeea13102836e0f1d3f758fb093207fbda561290fa1951c6051f - md5: 44dff15b5d850481807888197b254b46 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-3.0.3-pyhfe8187e_0.conda + sha256: 71a9524f44d6ac6304feae71e2bbe8d8ce0816f0be7a0271c15681ad1040965d + md5: e0f4549ccb507d4af8ed5c5345210673 depends: - python >=3.8 - - pybind11-global ==3.0.2 *_0 + - pybind11-global ==3.0.3 *_0 - python constrains: - pybind11-abi ==11 @@ -14774,8 +14056,8 @@ packages: license_family: BSD purls: - pkg:pypi/pybind11?source=compressed-mapping - size: 245509 - timestamp: 1771365898778 + size: 247963 + timestamp: 1775004608640 - conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-abi-11-hc364b38_1.conda sha256: 9e7fe12f727acd2787fb5816b2049cef4604b7a00ad3e408c5e709c298ce8bf1 md5: f0599959a2447c1e544e216bddf393fa @@ -14784,9 +14066,9 @@ packages: purls: [] size: 14671 timestamp: 1752769938071 -- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.2-pyhc7ab6ef_0.conda - sha256: b97f25f7856b96ae187c17801d2536ff86a968da12f579bbc318f2367e365a02 - md5: 0c2d37c332453bd66b254bc71311fa30 +- conda: https://conda.anaconda.org/conda-forge/noarch/pybind11-global-3.0.3-pyh648e204_0.conda + sha256: 97a0fbd2a81d95e90d714e5c628fe860b29a3caad53abcfb90add1965ad85bef + md5: 7fdc3e18c14b862ae5f064c1ea8e2636 depends: - python >=3.8 - __unix @@ -14796,9 +14078,9 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/pybind11-global?source=hash-mapping - size: 241244 - timestamp: 1771365839659 + - pkg:pypi/pybind11-global?source=compressed-mapping + size: 243898 + timestamp: 1775004520432 - conda: https://conda.anaconda.org/conda-forge/linux-64/pybullet-3.25-py312hf49885f_5.conda sha256: 849bbe715c3d3e3c89f19a096d0158ce712022f387829ba222c327c533b747d4 md5: 82f56eb2ea7b24643993dea9f715b101 @@ -14925,17 +14207,17 @@ packages: - pkg:pypi/pyflakes?source=hash-mapping size: 59592 timestamp: 1750492011671 -- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - sha256: 5577623b9f6685ece2697c6eb7511b4c9ac5fb607c9babc2646c811b428fd46a - md5: 6b6ece66ebcae2d5f326c77ef2c5a066 +- conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda + sha256: cf70b2f5ad9ae472b71235e5c8a736c9316df3705746de419b59d442e8348e86 + md5: 16c18772b340887160c79a6acc022db0 depends: - - python >=3.9 + - python >=3.10 license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/pygments?source=hash-mapping - size: 889287 - timestamp: 1750615908735 + - pkg:pypi/pygments?source=compressed-mapping + size: 893031 + timestamp: 1774796815820 - conda: https://conda.anaconda.org/conda-forge/linux-64/pymongo-4.16.0-py312h1289d80_0.conda sha256: c4e8f34bff400c94181e81d04ef54951cc862e97b6d10f7e7f4c3ea65da9a632 md5: 1b10774052fd891e846adf20bc02f839 @@ -14967,14 +14249,14 @@ packages: - pkg:pypi/pymongo?source=hash-mapping size: 2350189 timestamp: 1768122291012 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h4c3975b_0.conda - sha256: 68b2796fa9210ffbb169976bed2fe26b0481463cdca3e08cc8440a4c8ed8fd89 - md5: c6ceb8fd432a834aab008cb63749b02c +- conda: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.2-py312h587e1b2_1.conda + sha256: cc84dd07811861c800fb3f0df3fb64ea579adcb518a5daac6e1089baabd697d1 + md5: 6e4d8ed581cc576435d366372054ac71 depends: - __glibc >=2.17,<3.0.a0 - cffi >=1.4.1 - libgcc >=14 - - libsodium >=1.0.20,<1.0.21.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 - python >=3.12,<3.13.0a0 - python_abi 3.12.* *_cp312 - six @@ -14982,15 +14264,15 @@ packages: license_family: Apache purls: - pkg:pypi/pynacl?source=hash-mapping - size: 1195655 - timestamp: 1767324013382 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pynacl-1.6.2-py312hcd1a082_0.conda - sha256: 68fbb56891b82c027feec73935026b47575f66a6229ff0e46810d345f5c0e0e2 - md5: 109b9b2f532e820a7ae1f04222888f18 + size: 1159724 + timestamp: 1772171238138 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pynacl-1.6.2-py312h9d3b8a6_1.conda + sha256: 466cca2a22ea9070fca8ec598c5432b41e7fe4ef0098b413adab7ef6459dafee + md5: 7a8e4676034a167dde2c4204d0d5d6fc depends: - cffi >=1.4.1 - libgcc >=14 - - libsodium >=1.0.20,<1.0.21.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 - python >=3.12,<3.13.0a0 - python >=3.12,<3.13.0a0 *_cpython - python_abi 3.12.* *_cp312 @@ -14999,8 +14281,8 @@ packages: license_family: Apache purls: - pkg:pypi/pynacl?source=hash-mapping - size: 1159017 - timestamp: 1767324059167 + size: 1164360 + timestamp: 1772171286531 - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.2-pyhcf101f3_0.conda sha256: 417fba4783e528ee732afa82999300859b065dc59927344b4859c64aae7182de md5: 3687cc0b82a8b4c17e1f0eb7e47163d5 @@ -15010,7 +14292,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyparsing?source=compressed-mapping + - pkg:pypi/pyparsing?source=hash-mapping size: 110893 timestamp: 1769003998136 - conda: https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.11-py312h82c0db2_2.conda @@ -15128,57 +14410,57 @@ packages: - pkg:pypi/pyqt5-sip?source=hash-mapping size: 89968 timestamp: 1759495630955 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py312h9da60e5_0.conda - sha256: 5e00f3e0a273e18b4ec0ae7f4fff507333a354dd5ecc31dd9f3b02ab1ee77163 - md5: 52412f1ae11e89b721784f2118188902 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.2-py312h50ac2ff_2.conda + sha256: 17516c493c9586475d3b926e5ecab2eb43ad5f8d4ebf44c47c33959a1a9808ac + md5: c60956303baf22e65b2c4d2b6ef6a2c4 depends: + - python + - qt6-main 6.10.2.* - __glibc >=2.17,<3.0.a0 - - libclang13 >=21.1.8 - - libegl >=1.7.0,<2.0a0 - libgcc >=14 + - libstdcxx >=14 - libgl >=1.7.0,<2.0a0 + - libclang13 >=21.1.8 + - qt6-main >=6.10.2,<6.11.0a0 - libopengl >=1.7.0,<2.0a0 - - libstdcxx >=14 - - libvulkan-loader >=1.4.341.0,<2.0a0 - libxml2 - libxml2-16 >=2.14.6 - libxslt >=1.1.43,<2.0a0 - - python >=3.12,<3.13.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libegl >=1.7.0,<2.0a0 - python_abi 3.12.* *_cp312 - - qt6-main 6.10.2.* - - qt6-main >=6.10.2,<6.11.0a0 license: LGPL-3.0-only license_family: LGPL purls: - pkg:pypi/pyside6?source=hash-mapping - pkg:pypi/shiboken6?source=hash-mapping - size: 11679474 - timestamp: 1770081343622 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.10.2-py312h4810df5_0.conda - sha256: 35c1a5e03c69929e0f456691afbcbe560463833cf0daed4276b7c97357b88e70 - md5: cdd1b930b3106c0fcc76b5535e080655 + size: 13096720 + timestamp: 1775062814132 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyside6-6.10.2-py312hfc1e6cc_2.conda + sha256: 500677cf9974269db307e31f387bb533ed478735cec555bb5e8d53cda31e6e76 + md5: 091c90965788187a73911c4b1fdca9d5 depends: + - python + - qt6-main 6.10.2.* + - libgcc >=14 + - libstdcxx >=14 - libclang13 >=21.1.8 - libegl >=1.7.0,<2.0a0 - - libgcc >=14 + - libxslt >=1.1.43,<2.0a0 + - python_abi 3.12.* *_cp312 + - qt6-main >=6.10.2,<6.11.0a0 - libgl >=1.7.0,<2.0a0 - - libopengl >=1.7.0,<2.0a0 - - libstdcxx >=14 - libvulkan-loader >=1.4.341.0,<2.0a0 + - libopengl >=1.7.0,<2.0a0 - libxml2 - libxml2-16 >=2.14.6 - - libxslt >=1.1.43,<2.0a0 - - python >=3.12,<3.13.0a0 - - python_abi 3.12.* *_cp312 - - qt6-main 6.10.2.* - - qt6-main >=6.10.2,<6.11.0a0 license: LGPL-3.0-only license_family: LGPL purls: - pkg:pypi/pyside6?source=hash-mapping - pkg:pypi/shiboken6?source=hash-mapping - size: 7305120 - timestamp: 1770081471194 + size: 8726495 + timestamp: 1775062825280 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 md5: 461219d1a5bd61342293efa2c0c90eac @@ -15191,6 +14473,21 @@ packages: - pkg:pypi/pysocks?source=hash-mapping size: 21085 timestamp: 1733217331982 +- conda: https://conda.anaconda.org/conda-forge/noarch/pysoundcard-0.4.5-pyha804496_0.conda + sha256: b047c8d5f9f23d899bb1bc30c359d46ca91bfd6b8df3f4f0ba95b3ed3a087b92 + md5: 28cf7e04b3cf02945f863284825ce63d + depends: + - __linux + - cffi >=0.6 + - numpy + - pulseaudio + - python >=3.10 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/soundcard?source=hash-mapping + size: 41900 + timestamp: 1758025716584 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.2-pyhcf101f3_0.conda sha256: 9e749fb465a8bedf0184d8b8996992a38de351f7c64e967031944978de03a520 md5: 2b694bad8a50dc2f712f5368de866480 @@ -15212,9 +14509,9 @@ packages: - pkg:pypi/pytest?source=hash-mapping size: 299581 timestamp: 1765062031645 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda - sha256: d0f45586aad48ef604590188c33c83d76e4fc6370ac569ba0900906b24fd6a26 - md5: 6891acad5e136cb62a8c2ed2679d6528 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + sha256: 44e42919397bd00bfaa47358a6ca93d4c21493a8c18600176212ec21a8d25ca5 + md5: 67d1790eefa81ed305b89d8e314c7923 depends: - coverage >=7.10.6 - pluggy >=1.2 @@ -15225,8 +14522,8 @@ packages: license_family: MIT purls: - pkg:pypi/pytest-cov?source=hash-mapping - size: 29016 - timestamp: 1757612051022 + size: 29559 + timestamp: 1774139250481 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda sha256: 2936717381a2740c7bef3d96827c042a3bba3ba1496c59892989296591e3dabb md5: 0511afbe860b1a653125d77c719ece53 @@ -15314,26 +14611,6 @@ packages: purls: [] size: 13856145 timestamp: 1696323158781 -- pypi: https://files.pythonhosted.org/packages/63/3f/da9732ccb24b71a7539470dcdfcd16c923692788f39553f37238f208ca55/python_crfsuite-0.9.12-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl - name: python-crfsuite - version: 0.9.12 - sha256: 891bf2a5f410f17c5f9d76ab7330178a10142d48ed12f5c15b84f4c23fee80c7 - requires_dist: - - tox ; extra == 'dev' - - black ; extra == 'dev' - - isort ; extra == 'dev' - - flake8 ; extra == 'dev' - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/7a/0c/9725b097738f4a6aac9ac4e5a5fc6494eca69f17663d3d6ba8d0ea3858d2/python_crfsuite-0.9.12-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl - name: python-crfsuite - version: 0.9.12 - sha256: 7118a3b267c437a9701362f5eacd6d1ff2360305a9c872cc20a716cd005c13eb - requires_dist: - - tox ; extra == 'dev' - - black ; extra == 'dev' - - isort ; extra == 'dev' - - flake8 ; extra == 'dev' - requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 md5: 5b8d21249ff20967101ffa321cab24e8 @@ -15347,9 +14624,9 @@ packages: - pkg:pypi/python-dateutil?source=hash-mapping size: 233310 timestamp: 1751104122689 -- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.1.3-pyhcf101f3_0.conda - sha256: 36429765f626c345710fbae14aeeda676c1745427667eb480bb855b7089affba - md5: 69fc0a99fc21b26b81026c72e00f83df +- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.1-pyhcf101f3_0.conda + sha256: 5a70a9cbcf48be522c2b82df8c7a57988eed776f159142b0d30099b61f31a35e + md5: f2e88fc463b249bc1f40d9ca969d9b5e depends: - python >=3.10 - filelock >=3.15.4 @@ -15359,8 +14636,8 @@ packages: license_family: MIT purls: - pkg:pypi/python-discovery?source=compressed-mapping - size: 33996 - timestamp: 1773161039118 + size: 34137 + timestamp: 1774605818480 - conda: https://conda.anaconda.org/conda-forge/linux-64/python-librt-0.8.1-py312h5253ce2_0.conda sha256: 41a3f2541952ee521c867ada76da02a43a919beeb46da8fee99284d161273a50 md5: e2cc29a3786c42455a70263a8bf6813e @@ -15434,19 +14711,6 @@ packages: purls: [] size: 6958 timestamp: 1752805918820 -- pypi: https://files.pythonhosted.org/packages/84/14/9fb5842581f0419b5eb85f8c26c1c0c0f4cf6b4d5be638ae3157316a2650/pyttsx3-2.99-py3-none-any.whl - name: pyttsx3 - version: '2.99' - sha256: ff3e4ff756c24d72b9f3f2f304e0edaafd0f58adb0e6f4b90d930440cda8b207 - requires_dist: - - comtypes ; sys_platform == 'win32' - - pyobjc>=2.4 ; sys_platform == 'darwin' - - pypiwin32 ; sys_platform == 'win32' - - pywin32 ; sys_platform == 'win32' -- pypi: https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl - name: pytz - version: 2026.1.post1 - sha256: f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a - conda: https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.3-py312h8a5da7c_1.conda sha256: cb142bfd92f6e55749365ddc244294fa7b64db6d08c45b018ff1c658907bfcbf md5: 15878599a87992e44c059731771591cb @@ -15459,7 +14723,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pyyaml?source=compressed-mapping + - pkg:pypi/pyyaml?source=hash-mapping size: 198293 timestamp: 1770223620706 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pyyaml-6.0.3-py312ha4530ae_1.conda @@ -15498,37 +14762,37 @@ packages: purls: [] size: 554571 timestamp: 1720813941183 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-hc240232_7.conda - sha256: 401cc7f9ff78ee12097fcda8c09dcf269847a8a55b17b7c0a973f322c7bd5fbc - md5: fa3bbe293d907990f3ca5b8b9d4b10f0 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.15-h0c412b5_8.conda + sha256: c0008c97dbfaef709eff044ea2fdcf7cca55b2e061ff992872d71b9b35f7f91b + md5: 80e27e7982af989ebc2e0f0d57c75ea7 depends: - __glibc >=2.17,<3.0.a0 - alsa-lib >=1.2.15.3,<1.3.0a0 - dbus >=1.16.2,<2.0a0 - - fontconfig >=2.15.0,<3.0a0 + - fontconfig >=2.17.1,<3.0a0 - fonts-conda-ecosystem - gst-plugins-base >=1.26.10,<1.27.0a0 - gstreamer >=1.26.10,<1.27.0a0 - - harfbuzz >=12.3.2 - - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp21.1 >=21.1.8,<21.2.0a0 - - libclang13 >=21.1.8 + - harfbuzz >=13.2.0 + - icu >=78.3,<79.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libclang-cpp22.1 >=22.1.0,<22.2.0a0 + - libclang13 >=22.1.0 - libcups >=2.3.3,<2.4.0a0 - libdrm >=2.4.125,<2.5.0a0 - libegl >=1.7.0,<2.0a0 - libevent >=2.1.12,<2.1.13.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 - libgcc >=13 - libgl >=1.7.0,<2.0a0 - - libglib >=2.86.3,<3.0a0 + - libglib >=2.86.4,<3.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - - libllvm21 >=21.1.8,<21.2.0a0 + - libllvm22 >=22.1.0,<22.2.0a0 - libpng >=1.6.55,<1.7.0a0 - - libpq >=18.1,<19.0a0 - - libsqlite >=3.51.2,<4.0a0 + - libpq >=18.3,<19.0a0 + - libsqlite >=3.52.0,<4.0a0 - libstdcxx >=13 - libxcb >=1.17.0,<2.0a0 - libxkbcommon >=1.13.1,<2.0a0 @@ -15546,7 +14810,7 @@ packages: - xcb-util-wm >=0.4.2,<0.5.0a0 - xorg-libice >=1.1.2,<2.0a0 - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 - xorg-libxdamage >=1.1.6,<2.0a0 - xorg-libxext >=1.3.7,<2.0a0 - xorg-libxxf86vm >=1.1.7,<2.0a0 @@ -15556,37 +14820,37 @@ packages: license: LGPL-3.0-only license_family: LGPL purls: [] - size: 52414725 - timestamp: 1770722572283 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt-main-5.15.15-h912a755_7.conda - sha256: 279ed48d551966178cfde61d84c1b6ea9f2c0ad68620eb61f8ab8dff62a813d4 - md5: 9a6791966bf4abb19bb1153758c97154 + size: 52674357 + timestamp: 1773957808615 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt-main-5.15.15-ha9b3be2_8.conda + sha256: 84174ea3321b5f2ab67614ebed7f51899e7a53a24fb9c6102074664daff42b1d + md5: ab0902360c6cbf5272fbeb87a7a5e0b2 depends: - alsa-lib >=1.2.15.3,<1.3.0a0 - dbus >=1.16.2,<2.0a0 - - fontconfig >=2.15.0,<3.0a0 + - fontconfig >=2.17.1,<3.0a0 - fonts-conda-ecosystem - gst-plugins-base >=1.26.10,<1.27.0a0 - gstreamer >=1.26.10,<1.27.0a0 - harfbuzz >=12.3.2 - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp21.1 >=21.1.8,<21.2.0a0 - - libclang13 >=21.1.8 + - krb5 >=1.22.2,<1.23.0a0 + - libclang-cpp22.1 >=22.1.0,<22.2.0a0 + - libclang13 >=22.1.0 - libcups >=2.3.3,<2.4.0a0 - libdrm >=2.4.125,<2.5.0a0 - libegl >=1.7.0,<2.0a0 - libevent >=2.1.12,<2.1.13.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 - libgcc >=13 - libgl >=1.7.0,<2.0a0 - - libglib >=2.86.3,<3.0a0 + - libglib >=2.86.4,<3.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - - libllvm21 >=21.1.8,<21.2.0a0 - - libpng >=1.6.54,<1.7.0a0 - - libpq >=18.1,<19.0a0 + - libllvm22 >=22.1.0,<22.2.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libpq >=18.3,<19.0a0 - libsqlite >=3.51.2,<4.0a0 - libstdcxx >=13 - libxcb >=1.17.0,<2.0a0 @@ -15605,7 +14869,7 @@ packages: - xcb-util-wm >=0.4.2,<0.5.0a0 - xorg-libice >=1.1.2,<2.0a0 - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 - xorg-libxdamage >=1.1.6,<2.0a0 - xorg-libxext >=1.3.7,<2.0a0 - xorg-libxxf86vm >=1.1.7,<2.0a0 @@ -15615,161 +14879,155 @@ packages: license: LGPL-3.0-only license_family: LGPL purls: [] - size: 51877158 - timestamp: 1769998016372 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-hb82b983_4.conda - sha256: 82393e8fc34c07cbd7fbba5ef7ce672165ff657492ad1790bb5fad63d607cccd - md5: 9861c7820fdb45bc50a2ea60f4ff7952 + size: 51951079 + timestamp: 1772794115656 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.2-pl5321h16c4a6b_6.conda + sha256: dd2fdde2cfecd29d4acd2bacbb341f00500d8b3b1c0583a8d92e07fc1e4b1106 + md5: 3a00bff44c15ee37bfd5eb435e1b2a51 depends: + - libxcb + - xcb-util + - xcb-util-wm + - xcb-util-keysyms + - xcb-util-image + - xcb-util-renderutil + - xcb-util-cursor - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.15.3,<1.3.0a0 - - dbus >=1.16.2,<2.0a0 - - double-conversion >=3.4.0,<3.5.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - harfbuzz >=12.3.2 - - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp21.1 >=21.1.8,<21.2.0a0 - - libclang13 >=21.1.8 - - libcups >=2.3.3,<2.4.0a0 - - libdrm >=2.4.125,<2.5.0a0 - - libegl >=1.7.0,<2.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.86.3,<3.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 - - libllvm21 >=21.1.8,<21.2.0a0 - - libpng >=1.6.54,<1.7.0a0 - - libpq >=18.1,<19.0a0 - - libsqlite >=3.51.2,<4.0a0 - libstdcxx >=14 - - libtiff >=4.7.1,<4.8.0a0 - - libvulkan-loader >=1.4.328.1,<2.0a0 - - libwebp-base >=1.6.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libxkbcommon >=1.13.1,<2.0a0 + - xorg-libice >=1.1.2,<2.0a0 + - icu >=78.3,<79.0a0 + - libllvm22 >=22.1.0,<22.2.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 - libxml2 - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 - - pcre2 >=10.47,<10.48.0a0 - - wayland >=1.24.0,<2.0a0 + - libtiff >=4.7.1,<4.8.0a0 + - libegl >=1.7.0,<2.0a0 + - xorg-libxxf86vm >=1.1.7,<2.0a0 + - libdrm >=2.4.125,<2.5.0a0 - xcb-util >=0.4.1,<0.5.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libclang-cpp22.1 >=22.1.0,<22.2.0a0 + - double-conversion >=3.4.0,<3.5.0a0 + - dbus >=1.16.2,<2.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - alsa-lib >=1.2.15.3,<1.3.0a0 + - wayland >=1.24.0,<2.0a0 - xcb-util-cursor >=0.1.6,<0.2.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libclang13 >=22.1.0 + - libwebp-base >=1.6.0,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - pcre2 >=10.47,<10.48.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + - libcups >=2.3.3,<2.4.0a0 + - libpq >=18.3,<19.0a0 + - libjpeg-turbo >=3.1.2,<4.0a0 + - xorg-libxcomposite >=0.4.7,<1.0a0 - xcb-util-keysyms >=0.4.1,<0.5.0a0 - - xcb-util-renderutil >=0.3.10,<0.4.0a0 - - xcb-util-wm >=0.4.2,<0.5.0a0 - - xorg-libice >=1.1.2,<2.0a0 - - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxcomposite >=0.4.6,<1.0a0 - xorg-libxcursor >=1.2.3,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 + - harfbuzz >=13.1.1 + - openssl >=3.5.5,<4.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - libxcb >=1.17.0,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - libsqlite >=3.52.0,<4.0a0 + - xorg-libsm >=1.2.6,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - libglib >=2.86.4,<3.0a0 - xorg-libxext >=1.3.7,<2.0a0 - - xorg-libxrandr >=1.5.5,<2.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 - - xorg-libxxf86vm >=1.1.7,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 constrains: - - qt 6.10.2 + - qt ==6.10.2 license: LGPL-3.0-only license_family: LGPL purls: [] - size: 57423827 - timestamp: 1769655891299 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.10.2-h5343e53_4.conda - sha256: bdbe77528cc62c84414b954a377663322a467934df0348cc00647af9b6ddcc4c - md5: d21d5b2950f78f8f187aec04869bc9b3 + size: 58118322 + timestamp: 1773865930316 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/qt6-main-6.10.2-pl5321h598db47_6.conda + sha256: cb0175afcab951eb966382b8d02f5f6ad8a74a6f26ed97bd3def3b3515b9bc56 + md5: a2be7073b12891aab9fa91ca005c5a6b depends: - - alsa-lib >=1.2.15.3,<1.3.0a0 - - dbus >=1.16.2,<2.0a0 - - double-conversion >=3.4.0,<3.5.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - harfbuzz >=12.3.2 - - icu >=78.2,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp21.1 >=21.1.8,<21.2.0a0 - - libclang13 >=21.1.8 - - libcups >=2.3.3,<2.4.0a0 - - libdrm >=2.4.125,<2.5.0a0 - - libegl >=1.7.0,<2.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - libxcb + - xcb-util + - xcb-util-wm + - xcb-util-keysyms + - xcb-util-image + - xcb-util-renderutil + - xcb-util-cursor - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.86.3,<3.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 - - libllvm21 >=21.1.8,<21.2.0a0 - - libpng >=1.6.54,<1.7.0a0 - - libpq >=18.1,<19.0a0 - - libsqlite >=3.51.2,<4.0a0 - libstdcxx >=14 + - xorg-libx11 >=1.8.13,<2.0a0 - libtiff >=4.7.1,<4.8.0a0 - - libvulkan-loader >=1.4.328.1,<2.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - xcb-util-cursor >=0.1.6,<0.2.0a0 + - libegl >=1.7.0,<2.0a0 + - xcb-util >=0.4.1,<0.5.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - alsa-lib >=1.2.15.3,<1.3.0a0 + - icu >=78.3,<79.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - dbus >=1.16.2,<2.0a0 + - libzlib >=1.3.1,<2.0a0 + - harfbuzz >=13.1.1 + - double-conversion >=3.4.0,<3.5.0a0 - libwebp-base >=1.6.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 - - libxkbcommon >=1.13.1,<2.0a0 - libxml2 - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.5,<4.0a0 + - libgl >=1.7.0,<2.0a0 + - libclang13 >=22.1.0 - pcre2 >=10.47,<10.48.0a0 + - libpq >=18.3,<19.0a0 + - libsqlite >=3.52.0,<4.0a0 + - libllvm22 >=22.1.0,<22.2.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 + - libclang-cpp22.1 >=22.1.0,<22.2.0a0 + - xorg-libxxf86vm >=1.1.7,<2.0a0 + - xorg-libxcomposite >=0.4.7,<1.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 - wayland >=1.24.0,<2.0a0 - - xcb-util >=0.4.1,<0.5.0a0 - - xcb-util-cursor >=0.1.6,<0.2.0a0 - - xcb-util-image >=0.4.0,<0.5.0a0 - - xcb-util-keysyms >=0.4.1,<0.5.0a0 - - xcb-util-renderutil >=0.3.10,<0.4.0a0 - - xcb-util-wm >=0.4.2,<0.5.0a0 - - xorg-libice >=1.1.2,<2.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxcomposite >=0.4.6,<1.0a0 - - xorg-libxcursor >=1.2.3,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - xorg-libxext >=1.3.7,<2.0a0 - - xorg-libxrandr >=1.5.5,<2.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - libfreetype >=2.14.2 + - libfreetype6 >=2.14.2 + - libjpeg-turbo >=3.1.2,<4.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - libcups >=2.3.3,<2.4.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xcb-util-image >=0.4.0,<0.5.0a0 + - libpng >=1.6.55,<1.7.0a0 + - xorg-libice >=1.1.2,<2.0a0 - xorg-libxtst >=1.2.5,<2.0a0 - - xorg-libxxf86vm >=1.1.7,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - libxcb >=1.17.0,<2.0a0 + - libglib >=2.86.4,<3.0a0 + - xcb-util-keysyms >=0.4.1,<0.5.0a0 + - openssl >=3.5.5,<4.0a0 + - xcb-util-wm >=0.4.2,<0.5.0a0 constrains: - - qt 6.10.2 + - qt ==6.10.2 license: LGPL-3.0-only license_family: LGPL purls: [] - size: 59431720 - timestamp: 1769683812439 -- pypi: https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl - name: quart - version: 0.20.0 - sha256: 003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1 - requires_dist: - - aiofiles - - blinker>=1.6 - - click>=8.0 - - flask>=3.0 - - hypercorn>=0.11.2 - - importlib-metadata ; python_full_version < '3.10' - - itsdangerous - - jinja2 - - markupsafe - - typing-extensions ; python_full_version < '3.10' - - werkzeug>=3.0 - - python-dotenv ; extra == 'dotenv' - requires_python: '>=3.9' -- pypi: https://files.pythonhosted.org/packages/ea/31/da390a5a10674481dea2909178973de81fa3a246c0eedcc0e1e4114f52f8/quart_cors-0.8.0-py3-none-any.whl - name: quart-cors - version: 0.8.0 - sha256: 62dc811768e2e1704d2b99d5880e3eb26fc776832305a19ea53db66f63837767 - requires_dist: - - quart>=0.15 - - typing-extensions ; python_full_version < '3.11' - requires_python: '>=3.9' + size: 60839855 + timestamp: 1773865968913 - conda: https://conda.anaconda.org/conda-forge/linux-64/rapidjson-1.1.0.post20240409-h3f2d84a_2.conda sha256: f87f265263a1ddbc50b98e2c2bcaa2bac63da3acc09267815dd0f4bd614cd902 md5: 65e2f30d532b4ae2063a424c185cc678 @@ -15795,19 +15053,19 @@ packages: purls: [] size: 157209 timestamp: 1742820749175 -- conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.8.1-h1fbca29_0.conda - sha256: cf550bbc8e5ebedb6dba9ccaead3e07bd1cb86b183644a4c853e06e4b3ad5ac7 - md5: d83958768626b3c8471ce032e28afcd3 +- conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda + sha256: 6e5e704c1c21f820d760e56082b276deaf2b53cf9b751772761c3088a365f6f4 + md5: 2c42649888aac645608191ffdc80d13a depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=14 + - libgcc >=13 constrains: - __glibc >=2.17 license: BSD-2-Clause license_family: BSD purls: [] - size: 5595970 - timestamp: 1772540833621 + size: 5176669 + timestamp: 1746622023242 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/rav1e-0.8.1-h9d4cc37_0.conda sha256: b54b0e66d264ce5904862012f08eda155ecfc6520f66a321f9363682fef94c59 md5: a3c060f1a410865150bb1d59cddf6d7c @@ -15825,25 +15083,43 @@ packages: md5: 1b712720f0094de41b1d0482f117f66d size: 1075 timestamp: 1771970041027 -- pypi: https://files.pythonhosted.org/packages/9e/40/bb226f203caa22c1043c1ca79b36340156eca0f6a6742b46c3bb222a3a57/regex-2026.2.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - name: regex - version: 2026.2.28 - sha256: d6b08a06976ff4fb0d83077022fde3eca06c55432bb997d8c0495b9a4e9872f4 - requires_python: '>=3.10' -- pypi: https://files.pythonhosted.org/packages/dd/c9/8cc8d850b35ab5650ff6756a1cb85286e2000b66c97520b29c1587455344/regex-2026.2.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl - name: regex - version: 2026.2.28 - sha256: e71dcecaa113eebcc96622c17692672c2d104b1d71ddf7adeda90da7ddeb26fc - requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - sha256: 7813c38b79ae549504b2c57b3f33394cea4f2ad083f0994d2045c2e24cb538c5 - md5: c65df89a0b2e321045a9e01d1337b182 +- conda: https://conda.anaconda.org/conda-forge/linux-64/regex-2026.4.4-py312h4c3975b_0.conda + sha256: f2af90e06f2821c9bc9cc90e7346451586ddd08de7ad6bfd85b867f92e1e188e + md5: 83b5e0585164a81913418a4512f29175 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 AND CNRI-Python + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 411140 + timestamp: 1775259323073 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/regex-2026.4.4-py312hcd1a082_0.conda + sha256: c4974a073f6d12ee2e583e2700fdb4e7af47b16bb3a2260509bc0f7bd4f85f32 + md5: 6bd7c5a9f95bd4ab738627331a8f9cdd + depends: + - libgcc >=14 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 AND CNRI-Python + license_family: PSF + purls: + - pkg:pypi/regex?source=hash-mapping + size: 407471 + timestamp: 1775259359390 +- conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.33.1-pyhcf101f3_0.conda + sha256: c0249bc4bf4c0e8e06d0e7b4d117a5d593cc4ab2144d5006d6d47c83cb0af18e + md5: 10afbb4dbf06ff959ad25a92ccee6e59 depends: - python >=3.10 - - certifi >=2017.4.17 + - certifi >=2023.5.7 - charset-normalizer >=2,<4 - idna >=2.5,<4 - - urllib3 >=1.21.1,<3 + - urllib3 >=1.26,<3 - python constrains: - chardet >=3.0.2,<6 @@ -15851,8 +15127,8 @@ packages: license_family: APACHE purls: - pkg:pypi/requests?source=compressed-mapping - size: 63602 - timestamp: 1766926974520 + size: 63712 + timestamp: 1774894783063 - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.6-hb9d3cd8_1.conda sha256: d5c73079c1dd2c2a313c3bfd81c73dbd066b7eb08d213778c8bff520091ae894 md5: c1c9b02933fdb2cfb791d936c20e887e @@ -17935,224 +17211,6 @@ packages: license: MIT size: 323488 timestamp: 1768942896418 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-better-launch-1.0.4-np2py312h2ed9cc7_14.conda - sha256: cf1893542f96aff1e1fa5e75794e92900ff0ad22eb407a83656579fd15e4b804 - md5: 9adf2017f2c57023298e8d6bd6277621 - depends: - - click - - docstring_parser - - osrf_pycommon - - psutil - - python - - pyyaml - - ros-jazzy-ament-index-python - - ros-jazzy-composition-interfaces - - ros-jazzy-lifecycle-msgs - - ros-jazzy-rcl-interfaces - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - setproctitle - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: MIT - size: 266647 - timestamp: 1769777111865 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-better-launch-1.0.4-np2py312h3575a3a_14.conda - sha256: 4f994ce53f807b4389fc1b5c3dd7e383fb38c4a6ed6aa7be612e431338581a88 - md5: b6b04bdb5b8430e675d254fb4100ba6f - depends: - - click - - docstring_parser - - osrf_pycommon - - psutil - - python - - pyyaml - - ros-jazzy-ament-index-python - - ros-jazzy-composition-interfaces - - ros-jazzy-lifecycle-msgs - - ros-jazzy-rcl-interfaces - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - setproctitle - - python 3.12.* *_cpython - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: MIT - size: 272425 - timestamp: 1769782730367 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h2ed9cc7_14.conda - sha256: e00965c8fd6f32f09d5917ec48f749c90a6b2ba1a032e1b0c461839cf42763f4 - md5: 47c76e9de0decb9cad64b18b6761c5d5 - depends: - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-moveit-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - size: 410749 - timestamp: 1769777111823 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bio-ik-msgs-0.0.0-np2py312h3575a3a_14.conda - sha256: 5c4edc38e69882264697896f31bdd7f00137d74c7818f8d92655ed58c6b950ce - md5: 79a6882e878d36952e1e0454da7e63ae - depends: - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-moveit-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - python 3.12.* *_cpython - - libgcc >=14 - - libstdcxx >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - size: 421731 - timestamp: 1769782730686 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-biped-interfaces-0.0.0-np2py312h2ed9cc7_14.conda - sha256: a79c9464d26df270281bcaa2296a2d27e3c7bfc9785be334552cae5acd459b34 - md5: 02bdc376733caa9fda4073aa2ead7410 - depends: - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: Apache-2.0 - size: 89278 - timestamp: 1769777112052 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-biped-interfaces-0.0.0-np2py312h3575a3a_14.conda - sha256: e59a483a5f244412e040865801298eae36165b8d40a90bbede388cd0a8c0ae16 - md5: 9a112beacaaed166c793a65cccd95f5e - depends: - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - python 3.12.* *_cpython - - libgcc >=14 - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - size: 100566 - timestamp: 1769782730638 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h2ed9cc7_14.conda - sha256: 8b82c4668b4c4f876420df6547c26d959247d35a49eac124d0731d312d034723 - md5: fd17a328db56b4600f93bb8076c62a12 - depends: - - python - - ros-jazzy-rclcpp - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 117689 - timestamp: 1769777111793 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bitbots-dynamixel-sdk-3.7.21-np2py312h3575a3a_14.conda - sha256: c2bf4587cc3551fd020d3167fbc7538939b6584241384b8e1728f240ccaba845 - md5: c4317bf4413e22ab2f9efe8fa6d5f413 - depends: - - python - - ros-jazzy-rclcpp - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - python 3.12.* *_cpython - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 124703 - timestamp: 1769782730410 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-bitbots-tf-buffer-1.0.0-np2py312h2ed9cc7_14.conda - sha256: f7bbb289922c043048e6aea24a2f26cc99dd5fd8bf0091511abd7be9a1913fb3 - md5: c1a9504839abaa36d9901225ac0f9638 - depends: - - python - - ros-jazzy-backward-ros - - ros-jazzy-builtin-interfaces - - ros-jazzy-geometry-msgs - - ros-jazzy-pybind11-vendor - - ros-jazzy-rcl - - ros-jazzy-rclcpp - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-ros2-python-extension - - ros-jazzy-tf2 - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - size: 243092 - timestamp: 1769777111886 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-bitbots-tf-buffer-1.0.0-np2py312h3575a3a_14.conda - sha256: 9c56107f698bb52e2ddcab1a6a5344aa014d8fc0f9364dc6fdab5e1560aee69c - md5: 42f061d70b7d9f26ffb4c5f8e78f1191 - depends: - - python - - ros-jazzy-backward-ros - - ros-jazzy-builtin-interfaces - - ros-jazzy-geometry-msgs - - ros-jazzy-pybind11-vendor - - ros-jazzy-rcl - - ros-jazzy-rclcpp - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-ros2-python-extension - - ros-jazzy-tf2 - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: MIT - size: 234316 - timestamp: 1769782730662 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-builtin-interfaces-2.0.3-np2py312h2ed9cc7_14.conda sha256: a59309c935653a53b41aa55a47be10e87eeb06e69a17e804e72a79aec001e2dd md5: 381e6b2ad2c4e6d0ff23fe35b9ee3916 @@ -19509,160 +18567,6 @@ packages: license: Apache-2.0 size: 120538 timestamp: 1768947025977 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamic-stack-decider-0.5.3-np2py312h2ed9cc7_14.conda - sha256: e1132ece6e6470f3e3e3b4352644ab16b02129af4c0957b4c57fc98431c62bff - md5: 59924b9f61c23994da1ec8bde500ca49 - depends: - - python - - pyyaml - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: MIT - size: 65916 - timestamp: 1769777111970 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamic-stack-decider-0.5.3-np2py312h3575a3a_14.conda - sha256: 161f8820a745529b4cb8cb4fde5d9da94e0f8a4f985216ddca2a0255cddaaafc - md5: c3a4a4a9dfbb6994f5851cf9baf4dbba - depends: - - python - - pyyaml - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - python 3.12.* *_cpython - - libstdcxx >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: MIT - size: 72866 - timestamp: 1769782730667 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamic-stack-decider-visualization-0.2.1-np2py312h2ed9cc7_14.conda - sha256: 99113f5230b71ff46ba6a26a459b64838e4a993d085fc59f9e6ca87f23537830 - md5: 3f768a627ac5a65fb1c221188d94d988 - depends: - - pydot - - python - - ros-jazzy-dynamic-stack-decider - - ros-jazzy-qt-dotgraph - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-rosgraph-msgs - - ros-jazzy-rqt-gui - - ros-jazzy-rqt-gui-py - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: MIT - size: 52054 - timestamp: 1769777111907 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamic-stack-decider-visualization-0.2.1-np2py312h3575a3a_14.conda - sha256: 62d5f5917dc5f495c97178390a9ca99166d4521bc18085f0430033f3af17b562 - md5: ce90dfd6ff421f97f8b1e375087a24f2 - depends: - - pydot - - python - - ros-jazzy-dynamic-stack-decider - - ros-jazzy-qt-dotgraph - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-rosgraph-msgs - - ros-jazzy-rqt-gui - - ros-jazzy-rqt-gui-py - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - python 3.12.* *_cpython - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: MIT - size: 53867 - timestamp: 1769782730681 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-dynamixel-sdk-3.8.4-np2py312h2ed9cc7_14.conda - sha256: 4f418cbe27e79cd6006bec0434ae6b5ad59c6e22402b1f09d2958ca39d84fa64 - md5: a44b0a16f8ce23d5253dc2a223927b4e - depends: - - python - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: Apache-2.0 - size: 123821 - timestamp: 1768974441411 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-dynamixel-sdk-3.8.4-np2py312h61f2ce4_14.conda - sha256: 5397b87907e9fa8a93c931e0e9116264a36d5b7665b15c3ffb9d20ec778a8a20 - md5: 6382bab3a4cd8476e2018d5c6f09b3e9 - depends: - - python - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 125347 - timestamp: 1768943384266 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-dynamixel-workbench-toolbox-0.1.8-np2py312h2ed9cc7_14.conda - sha256: c7b1d76fbcd35631f38f8aeec11db6a56bb3b049d3212b0c70d8a405d17fe37e - md5: 603b7c16e8303738a2e8805e99972964 - depends: - - python - - ros-jazzy-dynamixel-sdk - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: Apache-2.0 - size: 67207 - timestamp: 1769782373270 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-dynamixel-workbench-toolbox-0.1.8-np2py312h3575a3a_14.conda - sha256: 71b370ff4618e6ebab333fbee89f60a4c25a041795b5afb41a2f4bfda226831b - md5: 8148e66f70fb8ead925fcb4c297970ac - depends: - - python - - ros-jazzy-dynamixel-sdk - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: Apache-2.0 - size: 75430 - timestamp: 1769782730571 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-eigen-stl-containers-1.1.0-np2py312h2ed9cc7_14.conda sha256: 7b37606d2560ccf0d21bdaff5b4a9eaccc074254ae23a6a9f72533388b771edd md5: 28518c33e38fe5d419f36b270335dccd @@ -20589,48 +19493,6 @@ packages: license: MIT size: 6792930 timestamp: 1768949404429 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-gazebo-msgs-3.8.0-np2py312h2ed9cc7_14.conda - sha256: de463cc18d9553fc8a2517fb4af151ce0de47c927a6db7739b71caf8c5ef1926 - md5: 2351e74144506df4682c13be3c7c926d - depends: - - python - - ros-jazzy-builtin-interfaces - - ros-jazzy-geometry-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros-jazzy-trajectory-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 1309644 - timestamp: 1769777111813 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-gazebo-msgs-3.8.0-np2py312h3575a3a_14.conda - sha256: fa0a7c9226412ff1036c80b87fdf702457c97761ecfea1d560b574be236ce8e2 - md5: 60fef4a769b02743564e9f1cc9bb9885 - depends: - - python - - ros-jazzy-builtin-interfaces - - ros-jazzy-geometry-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-std-msgs - - ros-jazzy-trajectory-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - python 3.12.* *_cpython - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 1312977 - timestamp: 1769782730672 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-generate-parameter-library-0.6.0-np2py312h2c89a96_14.conda sha256: 91b4bdafd465406661df766011a9aa05ce3e47d0777e53bdb20e0b132d77d6bd md5: e8575d2b74bf64fa845cc4aaa84c76f2 @@ -20721,6 +19583,46 @@ packages: license: BSD-3-Clause size: 71218 timestamp: 1768943262465 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-geographic-msgs-1.0.6-np2py312h2ed9cc7_14.conda + sha256: abcb79b75ba974b118d062040ac0d9c1d0815b3e8901df7effb4e9681ef9f356 + md5: 86f3a1103447e4f53531154ce5a03de0 + depends: + - python + - ros-jazzy-geometry-msgs + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-std-msgs + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.13.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - numpy >=1.23,<3 + license: BSD-3-Clause + size: 453578 + timestamp: 1768976775850 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-geographic-msgs-1.0.6-np2py312h61f2ce4_14.conda + sha256: 121d5aaf73c832678349c376533fbe79a863ee71672c324074d6f97efc1f35b7 + md5: fb28574589dff064c6478a38ec3ea811 + depends: + - python + - ros-jazzy-geometry-msgs + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-std-msgs + - ros-jazzy-unique-identifier-msgs + - ros2-distro-mutex 0.13.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + license: BSD-3-Clause + size: 462558 + timestamp: 1768945758301 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-geometric-shapes-2.3.2-np2py312h2ed9cc7_14.conda sha256: 13ee00f2822b9b4906b465292895bb59e7136757dc777a31dac052124ed8a0a0 md5: 14f9a8ebcef65e3bfabe391ea5372dfa @@ -21202,52 +20104,6 @@ packages: license: Apache-2.0 size: 447542 timestamp: 1768948173088 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-humanoid-base-footprint-0.1.2-np2py312h2ed9cc7_14.conda - sha256: ca09519fd60dfb60dbcd7d732c1a9c2aa001889b3011199f4986af165608160b - md5: 7d9b08c2f5314986174fd52b60f69bb4 - depends: - - eigen - - python - - ros-jazzy-biped-interfaces - - ros-jazzy-rclcpp-components - - ros-jazzy-ros-workspace - - ros-jazzy-rot-conv - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 248130 - timestamp: 1769777111897 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-humanoid-base-footprint-0.1.2-np2py312h3575a3a_14.conda - sha256: 1dec115a84056eb1ff2bed95cec9ada0881489efc08e3ad8ae3500fc65673bfe - md5: 9b042b5ff4150eeaa84350dc6fbbe06f - depends: - - eigen - - python - - ros-jazzy-biped-interfaces - - ros-jazzy-rclcpp-components - - ros-jazzy-ros-workspace - - ros-jazzy-rot-conv - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - python 3.12.* *_cpython - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 254857 - timestamp: 1769782730458 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-iceoryx-binding-c-2.0.6-np2py312h2ed9cc7_14.conda sha256: 8f010888b7ea6b9875445af532fab0859673107a70fb7f5c3a4767d95c312015 md5: aa351521475dbea357447318c72eecfe @@ -21618,38 +20474,6 @@ packages: license: BSD-3-Clause size: 584007 timestamp: 1768947612609 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-imu-complementary-filter-2.1.5-np2py312h2ed9cc7_14.conda - sha256: a42c7837ae87b136a24fc5659855bf2275e13dfd5da44efbc449d474b934d6e9 - md5: c2eb057f0a79eaf2751f4663f6e6ab59 - depends: - - python - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 301197 - timestamp: 1769777111917 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-imu-complementary-filter-2.1.5-np2py312h3575a3a_14.conda - sha256: 1fda7c8027c650d8aa1680ef7ac406d37a697cf8ff6e05b70b097f45517e502c - md5: 629acdb4fb3764d1479f3c60ea17cebe - depends: - - python - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 306087 - timestamp: 1769782730653 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-interactive-markers-2.5.5-np2py312h2ed9cc7_14.conda sha256: c7241cabc60b41053ca2c05e2e313e13410f4905f2d54c51f9f801a103ba3a94 md5: 31acd36893365f55707a8cd92a6ab901 @@ -21754,164 +20578,6 @@ packages: license: Apache-2.0 size: 520166 timestamp: 1768947017173 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-image-node-0.0.0-np2py312hedab9cf_14.conda - sha256: 3acbccc6cd05592ead3049901bde67326a382f89403006b360816394fb32314c - md5: 7184f54ee57696ec5226f77a131060fc - depends: - - libopencv - - numpy - - py-opencv - - python - - ros-jazzy-cv-bridge - - ros-jazzy-ipm-library - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-sensor-msgs - - ros-jazzy-sensor-msgs-py - - ros-jazzy-tf2 - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - py-opencv >=4.12.0,<5.0a0 - - python_abi 3.12.* *_cp312 - - libopencv >=4.12.0,<4.12.1.0a0 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 62150 - timestamp: 1769782373370 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-image-node-0.0.0-np2py312h784231a_14.conda - sha256: 7d7d14eab9810beb820b9e4bdb64526fced6bdee4d341ab1c7bc2ed028e111af - md5: 3f065033372bf3ba5cdbbc0cb27fff8c - depends: - - libopencv - - numpy - - py-opencv - - python - - ros-jazzy-cv-bridge - - ros-jazzy-ipm-library - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-sensor-msgs - - ros-jazzy-sensor-msgs-py - - ros-jazzy-tf2 - - ros2-distro-mutex 0.13.* jazzy_* - - python 3.12.* *_cpython - - libgcc >=14 - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - py-opencv >=4.12.0,<5.0a0 - - numpy >=1.23,<3 - - libopencv >=4.12.0,<4.12.1.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - size: 66682 - timestamp: 1769782730619 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-interfaces-0.0.0-np2py312h2ed9cc7_14.conda - sha256: f7f3e1600d02f7d6db54a4093e268b0cec8bd8c899a698b4101d5b8c14401d65 - md5: 94f7d2a725070c4bf8ff23499dc06aa6 - depends: - - python - - ros-jazzy-builtin-interfaces - - ros-jazzy-geometry-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-sensor-msgs - - ros-jazzy-shape-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: Apache-2.0 - size: 172983 - timestamp: 1769777111959 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-interfaces-0.0.0-np2py312h3575a3a_14.conda - sha256: b7da848ae8a1760ac243ef319faba1771c54769a7287f02f10c8fc56e905c61d - md5: 3da2c2f88cdd771970e02cbe97da3f0a - depends: - - python - - ros-jazzy-builtin-interfaces - - ros-jazzy-geometry-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-sensor-msgs - - ros-jazzy-shape-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: Apache-2.0 - size: 184522 - timestamp: 1769782730604 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ipm-library-0.0.0-np2py312hedab9cf_14.conda - sha256: 34f0a609381fcbcee0627a0581812204ccb12f7d59dc19b26b0e9734bde3beea - md5: 49dba3bc4150160a91223088267d96b3 - depends: - - libopencv - - numpy - - py-opencv - - python - - ros-jazzy-builtin-interfaces - - ros-jazzy-geometry-msgs - - ros-jazzy-ipm-interfaces - - ros-jazzy-ros-workspace - - ros-jazzy-sensor-msgs - - ros-jazzy-shape-msgs - - ros-jazzy-std-msgs - - ros-jazzy-tf2 - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - py-opencv >=4.12.0,<5.0a0 - - libopencv >=4.12.0,<4.12.1.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - size: 65764 - timestamp: 1769777111844 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ipm-library-0.0.0-np2py312h784231a_14.conda - sha256: 3d63388ae653f7e64bbdf9417ee640dbc3aea515a4f58f6ec921d07cb46a8bf5 - md5: 42815a04bbd822378b54b2c33bb6e135 - depends: - - libopencv - - numpy - - py-opencv - - python - - ros-jazzy-builtin-interfaces - - ros-jazzy-geometry-msgs - - ros-jazzy-ipm-interfaces - - ros-jazzy-ros-workspace - - ros-jazzy-sensor-msgs - - ros-jazzy-shape-msgs - - ros-jazzy-std-msgs - - ros-jazzy-tf2 - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - python 3.12.* *_cpython - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libopencv >=4.12.0,<4.12.1.0a0 - - python_abi 3.12.* *_cp312 - - py-opencv >=4.12.0,<5.0a0 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 69426 - timestamp: 1769782730609 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-joint-limits-4.42.1-np2py312h2c89a96_14.conda sha256: 8929b7e40d95b22065dae305d86d6512783075a8a857ca4140fc0db3ca8c8227 md5: 92457abb473f1acd7ad16d8ffc272d61 @@ -22240,46 +20906,6 @@ packages: license: Apache-2.0 size: 235364 timestamp: 1768943350591 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-param-builder-0.1.1-np2py312h2ed9cc7_14.conda - sha256: a787f1599a87e555b5c0497499a169a3c2de39f5de995efa4dbdcad19a984c43 - md5: 4e9ccb0132660c3390c755dea13df3df - depends: - - python - - pyyaml - - ros-jazzy-ament-index-python - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-xacro - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 26739 - timestamp: 1768978484640 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-launch-param-builder-0.1.1-np2py312h61f2ce4_14.conda - sha256: a865fc1130dda1d3153f7bda7726b0d192bd715c5bec4f886fcc1b04853cd6b9 - md5: ee39e0a5124171a7a503071a2e9c05c2 - depends: - - python - - pyyaml - - ros-jazzy-ament-index-python - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-xacro - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 26704 - timestamp: 1768947028396 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-launch-ros-0.26.10-np2py312h2ed9cc7_14.conda sha256: c160af2015648c7d6b4811e71503fd3464138fe322f4f917f625f34d0dcd62d8 md5: 194c6e171fa85836d6f461afae155c46 @@ -22945,49 +21571,6 @@ packages: license: BSD-3-Clause size: 26054 timestamp: 1768943356396 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-configs-utils-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 909858a9f2eb59f60e9a1ec2c708541fe5011129e125e192c6c4962674ea5af8 - md5: 3fe1c0b533c4d4cba6a5094ed0cc4e8c - depends: - - python - - ros-jazzy-ament-index-python - - ros-jazzy-launch - - ros-jazzy-launch-param-builder - - ros-jazzy-launch-ros - - ros-jazzy-ros-workspace - - ros-jazzy-srdfdom - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 40761 - timestamp: 1768979301861 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-configs-utils-2.12.4-np2py312h61f2ce4_14.conda - sha256: 4f78d3deadf15aeed63f4abc214f0645aab93dd0bed8eeb63b7b6612cd3b4a09 - md5: df075b12c0b01ebab743aec38b43cd32 - depends: - - python - - ros-jazzy-ament-index-python - - ros-jazzy-launch - - ros-jazzy-launch-param-builder - - ros-jazzy-launch-ros - - ros-jazzy-ros-workspace - - ros-jazzy-srdfdom - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 40769 - timestamp: 1768947730690 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-core-2.12.4-np2py312h2ed9cc7_14.conda sha256: 42c9c0165edeab040385189b208ad7905deeac1e69cf2f5b72ce5031f80a58a4 md5: c8a4b6d9e2779892be68d0e2be9c810a @@ -23103,66 +21686,6 @@ packages: license: BSD-3-Clause size: 1865199 timestamp: 1768950420866 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-kinematics-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 491cf4c96f38006aec477e78cea433ee1a2ceb02e7781af77c93eb36d77982f9 - md5: 7b94ccde00db65b0c66957c154ddf4ae - depends: - - eigen - - lxml - - python - - ros-jazzy-class-loader - - ros-jazzy-generate-parameter-library - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-moveit-ros-planning - - ros-jazzy-orocos-kdl-vendor - - ros-jazzy-pluginlib - - ros-jazzy-ros-workspace - - ros-jazzy-rsl - - ros-jazzy-tf2 - - ros-jazzy-tf2-kdl - - ros-jazzy-urdfdom - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 373163 - timestamp: 1768983349489 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-kinematics-2.12.4-np2py312h61f2ce4_14.conda - sha256: ca9187f4337482633c8527045a8d942fc0373c23a96ba1f9ccee890500e2f647 - md5: 612094c1396832475c7669e73ec8a5b4 - depends: - - eigen - - lxml - - python - - ros-jazzy-class-loader - - ros-jazzy-generate-parameter-library - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-moveit-ros-planning - - ros-jazzy-orocos-kdl-vendor - - ros-jazzy-pluginlib - - ros-jazzy-ros-workspace - - ros-jazzy-rsl - - ros-jazzy-tf2 - - ros-jazzy-tf2-kdl - - ros-jazzy-urdfdom - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 370326 - timestamp: 1768951211058 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-msgs-2.6.0-np2py312h2ed9cc7_14.conda sha256: 817cf2157b2456729a97b0c59fcfd633dd73bce9d2b337330419ef3f48e4dcb4 md5: d82f12c2f3f908998ef3bcab2f40f1d2 @@ -23213,924 +21736,6 @@ packages: license: BSD-3-Clause size: 2867561 timestamp: 1768946393385 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-planners-ompl-2.12.4-np2py312h2ed9cc7_14.conda - sha256: a8ffc6d5eb42ed47340d0ed7d7b1490e8ee830f01576a3182883ebd6ab1a438a - md5: 0f847bfc497368ccd8822bceaf0c4970 - depends: - - libgomp - - python - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-moveit-ros-planning - - ros-jazzy-ompl - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - _openmp_mutex >=4.5 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 535060 - timestamp: 1768983535962 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-planners-ompl-2.12.4-np2py312h61f2ce4_14.conda - sha256: e2de82b08a32435facc33eed3da5ee816f58e0bd0c072b3e35612fa7a2b9da54 - md5: 6be58e91676b83fd8cd9473105dae914 - depends: - - libgomp - - python - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-moveit-ros-planning - - ros-jazzy-ompl - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - _openmp_mutex >=4.5 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 520172 - timestamp: 1768951404933 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 156650410045592d66b2f86400de2cabaad8591adafef9a00eb8a3ae60c5aca9 - md5: 8945f8edeb7ce31a9b43afe64aef585c - depends: - - python - - ros-jazzy-moveit-ros-benchmarks - - ros-jazzy-moveit-ros-move-group - - ros-jazzy-moveit-ros-planning - - ros-jazzy-moveit-ros-planning-interface - - ros-jazzy-moveit-ros-robot-interaction - - ros-jazzy-moveit-ros-visualization - - ros-jazzy-moveit-ros-warehouse - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 22713 - timestamp: 1768984833408 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-2.12.4-np2py312h61f2ce4_14.conda - sha256: 6fc15cd3e753a130e44a6c15587e2b071eb961a2173afafad607e35ad8627bf1 - md5: 2881120bab636a0ea2719759993f41ff - depends: - - python - - ros-jazzy-moveit-ros-benchmarks - - ros-jazzy-moveit-ros-move-group - - ros-jazzy-moveit-ros-planning - - ros-jazzy-moveit-ros-planning-interface - - ros-jazzy-moveit-ros-robot-interaction - - ros-jazzy-moveit-ros-visualization - - ros-jazzy-moveit-ros-warehouse - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 22689 - timestamp: 1768952615316 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-benchmarks-2.12.4-np2py312h2ed9cc7_14.conda - sha256: c9d089fb4e30a93228e35a87381bfb04423689168a114476156328425151c08a - md5: 666456013991246bced51de9abd8c34d - depends: - - libboost - - python - - ros-jazzy-launch-param-builder - - ros-jazzy-moveit-common - - ros-jazzy-moveit-configs-utils - - ros-jazzy-moveit-ros-planning - - ros-jazzy-moveit-ros-warehouse - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2-eigen - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - libboost >=1.88.0,<1.89.0a0 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 369597 - timestamp: 1768983819960 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-benchmarks-2.12.4-np2py312h61f2ce4_14.conda - sha256: af3ae5207d3a539aef0dbd3a2c192d93ad4a8a7107c228bcfea4d95d9b2e87f1 - md5: 89d894349b23ec52cf5d5049cbba89eb - depends: - - libboost - - python - - ros-jazzy-launch-param-builder - - ros-jazzy-moveit-common - - ros-jazzy-moveit-configs-utils - - ros-jazzy-moveit-ros-planning - - ros-jazzy-moveit-ros-warehouse - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2-eigen - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libboost >=1.88.0,<1.89.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 360973 - timestamp: 1768951660760 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-move-group-2.12.4-np2py312h2c89a96_14.conda - sha256: e8233688b156fad6119892f3faf214d100d5a94d41fd884fc54f6721e867eba0 - md5: df17ff5b1c0921eaa38d451ac3d55520 - depends: - - fmt - - python - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-kinematics - - ros-jazzy-moveit-ros-occupancy-map-monitor - - ros-jazzy-moveit-ros-planning - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-action - - ros-jazzy-ros-workspace - - ros-jazzy-std-srvs - - ros-jazzy-tf2 - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - fmt >=12.1.0,<12.2.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 627139 - timestamp: 1768983659015 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-move-group-2.12.4-np2py312h8b5252a_14.conda - sha256: 5254c7481830e7c6a9ca3c666765052d0a411c87e60aa9febd7c4f9b92e84489 - md5: c5790b78d1fa20ac06e532ef9ce1dc6e - depends: - - fmt - - python - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-kinematics - - ros-jazzy-moveit-ros-occupancy-map-monitor - - ros-jazzy-moveit-ros-planning - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-action - - ros-jazzy-ros-workspace - - ros-jazzy-std-srvs - - ros-jazzy-tf2 - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - fmt >=12.1.0,<12.2.0a0 - license: BSD-3-Clause - size: 627332 - timestamp: 1768951536892 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-occupancy-map-monitor-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 91cd0ac4db68310cfc370dc7b224a7ebb619c542a609a60bf6ea1e262aee782f - md5: 30defdf25d463ea547883d882f4de59b - depends: - - eigen - - python - - ros-jazzy-eigen3-cmake-module - - ros-jazzy-geometric-shapes - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 393333 - timestamp: 1768982832028 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-occupancy-map-monitor-2.12.4-np2py312h61f2ce4_14.conda - sha256: 0b9508c67200d6f8bdbd5dce48f8917a2a04e9e4df57c8c95c3aedd4cf42a0c3 - md5: 4fae87672c6641cc5742df82007faee8 - depends: - - eigen - - python - - ros-jazzy-eigen3-cmake-module - - ros-jazzy-geometric-shapes - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 391827 - timestamp: 1768950726482 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-planning-2.12.4-np2py312h2c89a96_14.conda - sha256: 6322bd0a8a67d853d6d58db0d1b5156440348f606a2dcdf31a88d0e89f236544 - md5: 8682508864b5dce21d5ced37f8e1d198 - depends: - - eigen - - fmt - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-eigen3-cmake-module - - ros-jazzy-generate-parameter-library - - ros-jazzy-message-filters - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-moveit-ros-occupancy-map-monitor - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-action - - ros-jazzy-rclcpp-components - - ros-jazzy-ros-workspace - - ros-jazzy-srdfdom - - ros-jazzy-std-msgs - - ros-jazzy-tf2 - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-msgs - - ros-jazzy-tf2-ros - - ros-jazzy-urdf - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - fmt >=12.1.0,<12.2.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 1700223 - timestamp: 1768983028959 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-planning-2.12.4-np2py312h8b5252a_14.conda - sha256: 7c61b0ec3646213a416514f4b7c4bcba9fd8716b51feed6ed01e440856ea9354 - md5: 5c4e96126167d40a2e2925a0b195389b - depends: - - eigen - - fmt - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-eigen3-cmake-module - - ros-jazzy-generate-parameter-library - - ros-jazzy-message-filters - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-moveit-ros-occupancy-map-monitor - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-action - - ros-jazzy-rclcpp-components - - ros-jazzy-ros-workspace - - ros-jazzy-srdfdom - - ros-jazzy-std-msgs - - ros-jazzy-tf2 - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-msgs - - ros-jazzy-tf2-ros - - ros-jazzy-urdf - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - fmt >=12.1.0,<12.2.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 1700209 - timestamp: 1768950944370 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-planning-interface-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 78970df5f7450bc569499873a0b1b6437ff0194e55676ad854c2dd35076e3af5 - md5: 183930d31d5d0e9cfc3823f6c9d89995 - depends: - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-moveit-ros-move-group - - ros-jazzy-moveit-ros-planning - - ros-jazzy-moveit-ros-warehouse - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-action - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-tf2 - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 422897 - timestamp: 1768983943927 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-planning-interface-2.12.4-np2py312h61f2ce4_14.conda - sha256: d1bc7892df080846fb0c2721cf14d691fdf44a25f5d5c10a033c1b324b19f5a4 - md5: 1e86af55373d4c92647fbaadeb81af3e - depends: - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-msgs - - ros-jazzy-moveit-ros-move-group - - ros-jazzy-moveit-ros-planning - - ros-jazzy-moveit-ros-warehouse - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-action - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-tf2 - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 421984 - timestamp: 1768951810652 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-robot-interaction-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 1690cfdded6c1c8e0416ac49782982b381862ad166055b6f8a0ca42b6d7befe4 - md5: 96ebfca7a366deccb8dc611a89c0282e - depends: - - python - - ros-jazzy-interactive-markers - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-ros-planning - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2 - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 276165 - timestamp: 1768983501268 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-robot-interaction-2.12.4-np2py312h61f2ce4_14.conda - sha256: 29c2a95dc049b006d0086e02b3ecde5929857a3921216e15cd990d0e55b1750a - md5: 54c644203c4615d5304e7415b5f83a65 - depends: - - python - - ros-jazzy-interactive-markers - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-ros-planning - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2 - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 269263 - timestamp: 1768951371288 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-visualization-2.12.4-np2py312h2ed9cc7_14.conda - sha256: db2cd50e84b8256629cf158f8baa2f4fccee2e4ad5296ac89cccf02da5156b22 - md5: 50a32b04de1f844c79c9fadfacec865a - depends: - - python - - ros-jazzy-geometric-shapes - - ros-jazzy-interactive-markers - - ros-jazzy-moveit-common - - ros-jazzy-moveit-ros-planning-interface - - ros-jazzy-moveit-ros-robot-interaction - - ros-jazzy-moveit-ros-warehouse - - ros-jazzy-object-recognition-msgs - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-rviz2 - - ros-jazzy-tf2-eigen - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libgl >=1.7.0,<2.0a0 - - qt-main >=5.15.15,<5.16.0a0 - - libopengl >=1.7.0,<2.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 1008458 - timestamp: 1768984091941 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-visualization-2.12.4-np2py312h61f2ce4_14.conda - sha256: 8365c738608b88fd1c86fad3303b1e9226dae83937005d5973cf650b51eb4ea3 - md5: e2681318d12cbfe8bce8bb9f9e7462e2 - depends: - - python - - ros-jazzy-geometric-shapes - - ros-jazzy-interactive-markers - - ros-jazzy-moveit-common - - ros-jazzy-moveit-ros-planning-interface - - ros-jazzy-moveit-ros-robot-interaction - - ros-jazzy-moveit-ros-warehouse - - ros-jazzy-object-recognition-msgs - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-rviz2 - - ros-jazzy-tf2-eigen - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - libgl >=1.7.0,<2.0a0 - - qt-main >=5.15.15,<5.16.0a0 - - libopengl >=1.7.0,<2.0a0 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 989533 - timestamp: 1768951993417 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-ros-warehouse-2.12.4-np2py312h2c89a96_14.conda - sha256: 1df8a66427276edfdcfd7c3bd9e98060a7180d4d526b73ce0e805b3242b90a77 - md5: b54f4a681e149bad5f96dd64134810db - depends: - - fmt - - python - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-ros-planning - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-ros - - ros-jazzy-warehouse-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - fmt >=12.1.0,<12.2.0a0 - license: BSD-3-Clause - size: 721282 - timestamp: 1768983428486 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-ros-warehouse-2.12.4-np2py312h8b5252a_14.conda - sha256: a4f9f225987da70f1c8892dbb645a9ffe8802fb24337a30771ed7d3d51003759 - md5: 295fd7712dd272ec901b6e3a5fa6b1f5 - depends: - - fmt - - python - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-ros-planning - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-tf2-eigen - - ros-jazzy-tf2-ros - - ros-jazzy-warehouse-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - fmt >=12.1.0,<12.2.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 725687 - timestamp: 1768951299073 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-app-plugins-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 7e787c1596fc4c1bfa6d90834a97c0afeed3e993df27ce5b56152c452e5278fa - md5: 21ffaf459841f13b9b5265818142949e - depends: - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-configs-utils - - ros-jazzy-moveit-ros-visualization - - ros-jazzy-moveit-setup-framework - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libgl >=1.7.0,<2.0a0 - - python_abi 3.12.* *_cp312 - - libopengl >=1.7.0,<2.0a0 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 178513 - timestamp: 1768985130281 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-app-plugins-2.12.4-np2py312h61f2ce4_14.conda - sha256: 95befbebca404c719b0165a9e113d1e4c03918ec6b3f98a01b94f0deebd0a257 - md5: 1294306cdd554af04b9ee57f5e55ce1d - depends: - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-configs-utils - - ros-jazzy-moveit-ros-visualization - - ros-jazzy-moveit-setup-framework - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libopengl >=1.7.0,<2.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 175977 - timestamp: 1768952953846 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-assistant-2.12.4-np2py312h2ed9cc7_14.conda - sha256: f27efd6b5746246a248ec6550a70b29b5f5e8c7b2b5dfedfc7b7741362ceb384 - md5: 67592e99d960ca25315746dc3c9507cd - depends: - - libgl-devel - - libopengl-devel - - python - - qt-main - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-configs-utils - - ros-jazzy-moveit-setup-app-plugins - - ros-jazzy-moveit-setup-controllers - - ros-jazzy-moveit-setup-core-plugins - - ros-jazzy-moveit-setup-framework - - ros-jazzy-moveit-setup-srdf-plugins - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - libgl >=1.7.0,<2.0a0 - - qt-main >=5.15.15,<5.16.0a0 - - libopengl >=1.7.0,<2.0a0 - license: BSD-3-Clause - size: 418262 - timestamp: 1768985205074 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-assistant-2.12.4-np2py312h61f2ce4_14.conda - sha256: 39e7e34d54811ebbe408d3c69902d968b35b6f4074e841f58d7e70f7018fa700 - md5: c2b8b638861bfdd49df416477e4e543f - depends: - - libgl-devel - - libopengl-devel - - python - - qt-main - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-configs-utils - - ros-jazzy-moveit-setup-app-plugins - - ros-jazzy-moveit-setup-controllers - - ros-jazzy-moveit-setup-core-plugins - - ros-jazzy-moveit-setup-framework - - ros-jazzy-moveit-setup-srdf-plugins - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libgl >=1.7.0,<2.0a0 - - libopengl >=1.7.0,<2.0a0 - - python_abi 3.12.* *_cp312 - - qt-main >=5.15.15,<5.16.0a0 - license: BSD-3-Clause - size: 431222 - timestamp: 1768953070862 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-controllers-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 2295e86b95a0a2bb0242ab5eca5dd7417a3c99849335afc1028d8c5ee87ce136 - md5: f562b6a5c45377f54bb8c73adc2ed813 - depends: - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-setup-framework - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - numpy >=1.23,<3 - - libopengl >=1.7.0,<2.0a0 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libgl >=1.7.0,<2.0a0 - license: BSD-3-Clause - size: 324248 - timestamp: 1768985060387 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-controllers-2.12.4-np2py312h61f2ce4_14.conda - sha256: a5404e3c1cd82cbb0693984fce1a6340cfc2e4b870e15dbdb754833e1f9a14d4 - md5: c9fe1ddef6e99cb6d1daddc1ee11b435 - depends: - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-setup-framework - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - libgl >=1.7.0,<2.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - libopengl >=1.7.0,<2.0a0 - license: BSD-3-Clause - size: 321590 - timestamp: 1768952864641 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-core-plugins-2.12.4-np2py312h2ed9cc7_14.conda - sha256: ad3f5d9bf74fe22a9c6cad26c201a206b337ebd3e7b89e2e3ad4f87daea76df1 - md5: 73a0c53f5dbc5fd55e36714362d42ebf - depends: - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-ros-visualization - - ros-jazzy-moveit-setup-framework - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-srdfdom - - ros-jazzy-urdf - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libopengl >=1.7.0,<2.0a0 - - libgl >=1.7.0,<2.0a0 - license: BSD-3-Clause - size: 149057 - timestamp: 1768985015493 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-core-plugins-2.12.4-np2py312h61f2ce4_14.conda - sha256: b76cda2710f7f2e71020b736c34f1611a7f520478fdb822214762acfeaabdcf8 - md5: 5e6e4cab071b89c8724236ce57e89731 - depends: - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-ros-visualization - - ros-jazzy-moveit-setup-framework - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-srdfdom - - ros-jazzy-urdf - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - libgl >=1.7.0,<2.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - libopengl >=1.7.0,<2.0a0 - license: BSD-3-Clause - size: 148105 - timestamp: 1768952810710 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-framework-2.12.4-np2py312h2c89a96_14.conda - sha256: 7cf83f78d4140693c833be219acf65bda394a955c52d0db3656bd80b97578c28 - md5: 0c1e93143a5409de380306da72d18bc8 - depends: - - fmt - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-ros-planning - - ros-jazzy-moveit-ros-visualization - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-rviz-common - - ros-jazzy-rviz-rendering - - ros-jazzy-srdfdom - - ros-jazzy-urdf - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - fmt >=12.1.0,<12.2.0a0 - - python_abi 3.12.* *_cp312 - - libopengl >=1.7.0,<2.0a0 - - libgl >=1.7.0,<2.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 343571 - timestamp: 1768984690496 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-framework-2.12.4-np2py312h8b5252a_14.conda - sha256: 7bfb423751de602a446b1a5262bf8c8638d2c5f25ec36247d62459941c209c8e - md5: 5a90613782a97d3d499f113ea1e34826 - depends: - - fmt - - python - - ros-jazzy-ament-index-cpp - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-moveit-ros-planning - - ros-jazzy-moveit-ros-visualization - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-rviz-common - - ros-jazzy-rviz-rendering - - ros-jazzy-srdfdom - - ros-jazzy-urdf - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libopengl >=1.7.0,<2.0a0 - - fmt >=12.1.0,<12.2.0a0 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 344377 - timestamp: 1768952486934 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-setup-srdf-plugins-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 8aa8e01d3b10508894a8e7d8a3d37ee7b60be8b0e1aa8cf5822365a6dc503fad - md5: 7a3e2770f12d82b873945d9caa554579 - depends: - - python - - ros-jazzy-moveit-setup-framework - - ros-jazzy-pluginlib - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libopengl >=1.7.0,<2.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - libgl >=1.7.0,<2.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 507620 - timestamp: 1768984873056 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-setup-srdf-plugins-2.12.4-np2py312h61f2ce4_14.conda - sha256: 29867e74fb753a1ad480f3ee0cd69f3748c7a9f3d0052af2758cc9efb75d4c1f - md5: 937549905a1f675c7bb4723ea196a5ed - depends: - - python - - ros-jazzy-moveit-setup-framework - - ros-jazzy-pluginlib - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libopengl >=1.7.0,<2.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 496744 - timestamp: 1768952667188 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-moveit-simple-controller-manager-2.12.4-np2py312h2ed9cc7_14.conda - sha256: 4d71f3d7177331e7a45afa3a3a08461f7193cf7ae50c784f312b12b081712bf7 - md5: b6c064b35aaa6ecf3d9550f5efb3b20a - depends: - - python - - ros-jazzy-control-msgs - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-action - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: BSD-3-Clause - size: 205029 - timestamp: 1768982922195 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-moveit-simple-controller-manager-2.12.4-np2py312h61f2ce4_14.conda - sha256: ecda46d6cfeebe740f952f3d16f3bb5646df613f44e41575a0849d83e6420ea7 - md5: 62beff234c62e81210c800dc86a546af - depends: - - python - - ros-jazzy-control-msgs - - ros-jazzy-moveit-common - - ros-jazzy-moveit-core - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-rclcpp-action - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 203293 - timestamp: 1768950823534 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-nav-msgs-5.3.6-np2py312h2ed9cc7_14.conda sha256: 22dfe512aae9adb3d125f324a0fa5c31a74d8518a728c714778fbc1c9e0faa1a md5: f7f9f73ec85a7d89b47d6eb13415c486 @@ -24172,6 +21777,43 @@ packages: license: Apache-2.0 size: 323835 timestamp: 1768945723141 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-nmea-msgs-2.1.0-np2py312h2ed9cc7_14.conda + sha256: 5ccee29d8355b07d0dba25d7be5c6c4b4376d6ef6089a805b6f3b528730870aa + md5: bf4a306dea9c9dec228b906087e22e67 + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-std-msgs + - ros2-distro-mutex 0.13.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + license: BSD-3-Clause + size: 201570 + timestamp: 1768976588368 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-nmea-msgs-2.1.0-np2py312h61f2ce4_14.conda + sha256: cf349e99085dc0f7c7a593f9412441fea83b9c291dc9136f88c26edc04906e01 + md5: 644fae0c7f59d7453f467986a8610d4e + depends: + - python + - ros-jazzy-builtin-interfaces + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-std-msgs + - ros2-distro-mutex 0.13.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + license: BSD-3-Clause + size: 205822 + timestamp: 1768945592600 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-object-recognition-msgs-2.0.0-np2py312h2ed9cc7_14.conda sha256: 43711e33bc939744ebf660582ea1e2a06c1a28f3a9203f52677168c205ce956c md5: 15f4cd83bd30d922d800015387fd517a @@ -24255,48 +21897,6 @@ packages: license: BSD-3-Clause size: 188876 timestamp: 1768945781235 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ompl-1.7.0-py312hbd645f5_14.conda - sha256: f535e8df6d2f5d0e1643e5f1b2ade225d3e64dd9e8d99883f98af1bfea201ea7 - md5: e26075e1195fafbdfc4fb2db80091b9a - depends: - - eigen - - flann - - libboost-devel - - libboost-python-devel - - ompl >=1.7.0,<1.8.0a0 - - python - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - ompl >=1.7.0,<1.8.0a0 - - libboost >=1.88.0,<1.89.0a0 - - flann >=1.9.2,<1.9.3.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - libboost-python >=1.88.0,<1.89.0a0 - license: BSD-3-Clause - size: 10978 - timestamp: 1768973874053 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-ompl-1.7.0-py312h8f0e40e_14.conda - sha256: 875d79647b408ce64706aaccf6bd0b1397d67dff7239c6daf254d9ccda41cfa7 - md5: b61d24af8df7ef9cd4cb343d25b4b617 - depends: - - eigen - - flann - - libboost-devel - - libboost-python-devel - - ompl >=1.7.0,<1.8.0a0 - - python - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libboost-python >=1.88.0,<1.89.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - ompl >=1.7.0,<1.8.0a0 - - python_abi 3.12.* *_cp312 - - flann >=1.9.2,<1.9.3.0a0 - - libboost >=1.88.0,<1.89.0a0 - license: BSD-3-Clause - size: 11236 - timestamp: 1768942716501 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-orocos-kdl-vendor-0.5.1-np2py312h2ed9cc7_14.conda sha256: 6f5f48757332fd68c511fbe26e0e135de9fc3386a376f689f1426a0cc72ba7c5 md5: c4f6a3580fb31dce3c1dfff78ef3b268 @@ -24529,52 +22129,6 @@ packages: license: BSD-3-Clause size: 50686 timestamp: 1768947172626 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-particle-filter-0.0.1-np2py312h2ed9cc7_14.conda - sha256: e81b2fc61abc7d8a0676c63bb4c99f3e3594b96615272e2a29f6bd6d91184f0d - md5: a61ff07c2d81ff0ae2191cd96647352c - depends: - - python - - ros-jazzy-backward-ros - - ros-jazzy-eigen3-cmake-module - - ros-jazzy-geometry-msgs - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-std-msgs - - ros-jazzy-tf2-eigen - - ros-jazzy-visualization-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: MIT - size: 230964 - timestamp: 1769777111854 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-particle-filter-0.0.1-np2py312h3575a3a_14.conda - sha256: 8dda80ccbd9d9f96f7226c7445af4d46030e1c07ec1498e5f80f7e7732853dee - md5: 0b377ad827912b5479300be63c66d166 - depends: - - python - - ros-jazzy-backward-ros - - ros-jazzy-eigen3-cmake-module - - ros-jazzy-geometry-msgs - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-std-msgs - - ros-jazzy-tf2-eigen - - ros-jazzy-visualization-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - python 3.12.* *_cpython - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: MIT - size: 230389 - timestamp: 1769782730561 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-pcl-conversions-2.6.2-np2py312h2ed9cc7_14.conda sha256: a8a201c128aeee257e11fd4f8188922a613b5fdbec7f75c5aa758f2e86718086 md5: ad7b5b7e95c4f0ec4ab2c6553ba5d2fb @@ -26601,6 +24155,136 @@ packages: license: Apache-2.0 size: 29509 timestamp: 1768944175094 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rmw-zenoh-cpp-0.2.9-np2py312ha80d210_14.conda + sha256: 48910016bdb11237d32d46f86739ddb6269a0d00a7f9a91bee03743926e91f01 + md5: 1bc72bcad6d03bf9747579c2e25b4354 + depends: + - python + - ros-jazzy-ament-index-cpp + - ros-jazzy-fastcdr + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-tracetools + - ros-jazzy-zenoh-cpp-vendor + - ros2-distro-mutex 0.13.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.12.* *_cp312 + - numpy >=1.23,<3 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - libzenohc >=1.7.2,<1.7.3.0a0 + license: Apache-2.0 OR BSD-3-Clause + size: 279369 + timestamp: 1768976138681 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-rmw-zenoh-cpp-0.2.9-np2py312h1cd77a6_14.conda + sha256: 76e1b11846e468ab1be348d2239a579dfc99b1273122519db3241b8fca9e1dee + md5: 371eb63d40d3df4e423e209080318cb5 + depends: + - python + - ros-jazzy-ament-index-cpp + - ros-jazzy-fastcdr + - ros-jazzy-rcpputils + - ros-jazzy-rcutils + - ros-jazzy-rmw + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-typesupport-fastrtps-c + - ros-jazzy-rosidl-typesupport-fastrtps-cpp + - ros-jazzy-tracetools + - ros-jazzy-zenoh-cpp-vendor + - ros2-distro-mutex 0.13.* jazzy_* + - libstdcxx >=14 + - libgcc >=14 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - libzenohc >=1.7.2,<1.7.3.0a0 + - numpy >=1.23,<3 + license: Apache-2.0 OR BSD-3-Clause + size: 275311 + timestamp: 1768945112587 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-robot-localization-3.8.3-np2py312h2ed9cc7_14.conda + sha256: 4b1827a629fb2f6646fa8b9f5e59e3bf53bc4762258cb0eae344830ec1541a63 + md5: 26b4c0f2ac71999f395f105daa17d57f + depends: + - eigen + - geographiclib-cpp + - libboost-devel + - python + - ros-jazzy-angles + - ros-jazzy-diagnostic-msgs + - ros-jazzy-diagnostic-updater + - ros-jazzy-geographic-msgs + - ros-jazzy-geometry-msgs + - ros-jazzy-message-filters + - ros-jazzy-nav-msgs + - ros-jazzy-rclcpp + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-sensor-msgs + - ros-jazzy-std-msgs + - ros-jazzy-std-srvs + - ros-jazzy-tf2 + - ros-jazzy-tf2-eigen + - ros-jazzy-tf2-geometry-msgs + - ros-jazzy-tf2-ros + - ros-jazzy-yaml-cpp-vendor + - ros2-distro-mutex 0.13.* jazzy_* + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - geographiclib-cpp >=2.7,<2.8.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - numpy >=1.23,<3 + - libboost >=1.88.0,<1.89.0a0 + license: Apache-2.0 + size: 1228771 + timestamp: 1768979852756 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-robot-localization-3.8.3-np2py312h61f2ce4_14.conda + sha256: 17ff786a83aa0dedb6854cf50e4c86da1fe38cec490f14db4c89757a38da8649 + md5: 3f58ed1ba6f3272db4ff066e6df59ad1 + depends: + - eigen + - geographiclib-cpp + - libboost-devel + - python + - ros-jazzy-angles + - ros-jazzy-diagnostic-msgs + - ros-jazzy-diagnostic-updater + - ros-jazzy-geographic-msgs + - ros-jazzy-geometry-msgs + - ros-jazzy-message-filters + - ros-jazzy-nav-msgs + - ros-jazzy-rclcpp + - ros-jazzy-rmw-implementation + - ros-jazzy-ros-workspace + - ros-jazzy-rosidl-default-runtime + - ros-jazzy-sensor-msgs + - ros-jazzy-std-msgs + - ros-jazzy-std-srvs + - ros-jazzy-tf2 + - ros-jazzy-tf2-eigen + - ros-jazzy-tf2-geometry-msgs + - ros-jazzy-tf2-ros + - ros-jazzy-yaml-cpp-vendor + - ros2-distro-mutex 0.13.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + - libboost >=1.88.0,<1.89.0a0 + - geographiclib-cpp >=2.7,<2.8.0a0 + license: Apache-2.0 + size: 1214773 + timestamp: 1768948228873 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-robot-state-publisher-3.3.3-np2py312h2ed9cc7_14.conda sha256: eb91744342b96655dfa06322e6d4b1aa944aa1b0fb0f1db0c3d7c59870a415e5 md5: f51ae7fe899d397419a15746d7c2eb27 @@ -26855,84 +24539,6 @@ packages: license: Apache-2.0 size: 35475 timestamp: 1768942678031 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ros2-numpy-2.0.9-np2py312h2ed9cc7_14.conda - sha256: 3d4fb3fac5120382712388d2d1445e2e71dd7005d94a0673a5dd4f519b949412 - md5: eca108e63b05846ae395bec0dd04b631 - depends: - - numpy - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-nav-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-sensor-msgs - - ros-jazzy-tf-transformations - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: MIT - size: 56227 - timestamp: 1769782373190 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ros2-numpy-2.0.9-np2py312h3575a3a_14.conda - sha256: 98292fcc8608c06a40380b8312e4e77007f76ae82e5a0644b0d0e5c803b71b45 - md5: 3b8fa318101f2e9832287a23ff3a5278 - depends: - - numpy - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-nav-msgs - - ros-jazzy-ros-workspace - - ros-jazzy-sensor-msgs - - ros-jazzy-tf-transformations - - ros2-distro-mutex 0.13.* jazzy_* - - python 3.12.* *_cpython - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: MIT - size: 61909 - timestamp: 1769782730623 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-ros2-python-extension-1.0.0-np2py312h2ed9cc7_14.conda - sha256: 589de45dbd2dffb981e079f3ea1b8ac7fee4ac36c13483addaf9a57d422f0f24 - md5: 5ef778e92a128b6eebe4aeafa7ccf44d - depends: - - python - - ros-jazzy-pybind11-vendor - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: MIT - size: 37318 - timestamp: 1769777111739 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-ros2-python-extension-1.0.0-np2py312h3575a3a_14.conda - sha256: 8e178640dfb67c152ddad1c224c26a96187f6ec3e8fcc153a66f6644c9e444e7 - md5: 02d3a4996a27a887d27877c5a007c9e6 - depends: - - python - - ros-jazzy-pybind11-vendor - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: MIT - size: 44552 - timestamp: 1769782730512 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-ros2action-0.32.7-np2py312h2ed9cc7_14.conda sha256: 74f3bfac8edbe66cdcef9c250915358acf92166015f514dccfacd171f79a613e md5: 726695d6b6deddec938ac5c214d3fab5 @@ -29622,42 +27228,6 @@ packages: license: MIT size: 223161 timestamp: 1768948716872 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-rot-conv-1.1.0-np2py312h2ed9cc7_14.conda - sha256: d22c425c868c0940d8ab6757aa7cdce7d25854bb51800ac4fdbbccce183f9478 - md5: aef23be5a1fa7ad476e965eac0bfbd4f - depends: - - eigen - - python - - ros-jazzy-eigen3-cmake-module - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - size: 62061 - timestamp: 1769777112021 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-rot-conv-1.1.0-np2py312h3575a3a_14.conda - sha256: 8849cff157003ce5c0e6941d74dfeef442382ff754acf8ed0605957bf7e5ec83 - md5: 4f7eade01967c2f9dec8b2ed8c4d1082 - depends: - - eigen - - python - - ros-jazzy-eigen3-cmake-module - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 66052 - timestamp: 1769782730566 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-rpyutils-0.4.2-np2py312h2ed9cc7_14.conda sha256: ec46df788261a480ea44c61f5664b50f9d9e7ccd8a085b289e5728d77ecefd89 md5: e28ef177572cf8ea1dbe59399a041a1d @@ -31435,262 +29005,6 @@ packages: license: Apache-2.0 size: 133271 timestamp: 1768945770026 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-field-map-generator-0.0.0-np2py312hedab9cf_14.conda - sha256: 7467bf76b2b480f2adffe0f209f83a6b4b91a7561499d8f15704b1b3aafd6b19 - md5: 9bb0cc0653cc40bde376d3014f033e58 - depends: - - libopencv - - numpy - - pillow - - py-opencv - - python - - pyyaml - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - scipy - - tk - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - libopencv >=4.12.0,<4.12.1.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - tk >=8.6.13,<8.7.0a0 - - py-opencv >=4.12.0,<5.0a0 - license: Apache-2.0 - size: 61447 - timestamp: 1769782373422 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-field-map-generator-0.0.0-np2py312h784231a_14.conda - sha256: 2c4ace8ad9b37e24a7e9cf675c2c7ac6ee3ffdcd0748f93e754cb3ccfbcf22cd - md5: a1316f6668fbfb3d3392fc04b0419f09 - depends: - - libopencv - - numpy - - pillow - - py-opencv - - python - - pyyaml - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - scipy - - tk - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - libopencv >=4.12.0,<4.12.1.0a0 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - py-opencv >=4.12.0,<5.0a0 - - tk >=8.6.13,<8.7.0a0 - license: Apache-2.0 - size: 64669 - timestamp: 1769782730468 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-ipm-0.0.0-np2py312h2ed9cc7_14.conda - sha256: d8f766f2e699cc6e01b545ef49797056a9263e41f7d0d4bb51f683c2d3e19314 - md5: 8e032522c02d89f19ccc2fa56a05b7d5 - depends: - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-ipm-library - - ros-jazzy-ros-workspace - - ros-jazzy-sensor-msgs - - ros-jazzy-shape-msgs - - ros-jazzy-soccer-vision-2d-msgs - - ros-jazzy-soccer-vision-3d-msgs - - ros-jazzy-std-msgs - - ros-jazzy-tf2 - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-sensor-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 35936 - timestamp: 1769777111773 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-ipm-0.0.0-np2py312h3575a3a_14.conda - sha256: 8f773fd8bfff74d0407391a70650edcc3b19ebb443d3edcbb1f59c55ae1089dd - md5: 86a7d16d5820c13d9d88bbe3b9ced7a1 - depends: - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-ipm-library - - ros-jazzy-ros-workspace - - ros-jazzy-sensor-msgs - - ros-jazzy-shape-msgs - - ros-jazzy-soccer-vision-2d-msgs - - ros-jazzy-soccer-vision-3d-msgs - - ros-jazzy-std-msgs - - ros-jazzy-tf2 - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-sensor-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - python 3.12.* *_cpython - - libgcc >=14 - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 40257 - timestamp: 1769782730463 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-2d-msgs-1.0.0-np2py312h2ed9cc7_14.conda - sha256: c0d92ee8dd3e4efed8036ba8b118a65a13ad2a1193da32191b240eee4acaa71e - md5: 0870269413fd5e4aed7035e2e0667deb - depends: - - python - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-soccer-vision-attribute-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libstdcxx >=14 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 234201 - timestamp: 1769777112031 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-2d-msgs-1.0.0-np2py312h3575a3a_14.conda - sha256: 61c8f4081af1a227a04f7fef0d4bb4f930241ab34a2b16aedf670252ea1423a9 - md5: c02a452ef4a74ff95d2076f6f93454bd - depends: - - python - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-soccer-vision-attribute-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - python 3.12.* *_cpython - - libstdcxx >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - size: 245657 - timestamp: 1769782730657 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-3d-msgs-1.0.0-np2py312h2ed9cc7_14.conda - sha256: 4fcb9bde263fc4439bb2ccf459835b749a49e947bb7cc37a8eb41589e31578b2 - md5: 9193845e9d619b1c8d6ab56bee046869 - depends: - - python - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-soccer-vision-attribute-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - license: Apache-2.0 - size: 233809 - timestamp: 1769777112073 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-3d-msgs-1.0.0-np2py312h3575a3a_14.conda - sha256: 24506979384161f906d290b210d279aed929d3aeb83df9ce44fceb6d26512d3f - md5: a5acf6f6adbd99aeec02d27d673398ea - depends: - - python - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros-jazzy-soccer-vision-attribute-msgs - - ros-jazzy-vision-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - python 3.12.* *_cpython - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - size: 245460 - timestamp: 1769782730643 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-3d-rviz-markers-1.0.0-np2py312h2ed9cc7_14.conda - sha256: 22e3bb083005d06bdefca1010e990ae8a0b8474079e1c859460e987cbaf37ce1 - md5: 9278c1e657bf814f14546ad11e9e7592 - depends: - - python - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-soccer-vision-3d-msgs - - ros-jazzy-soccer-vision-attribute-msgs - - ros-jazzy-visualization-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - size: 215477 - timestamp: 1769782373427 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-3d-rviz-markers-1.0.0-np2py312h3575a3a_14.conda - sha256: e0db8ce8e31523b6eb6b2bd48764fea0d5bba2b878609c942a9e746144543168 - md5: 20df36cd56ff90b48394c537d2bfa117 - depends: - - python - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros-jazzy-soccer-vision-3d-msgs - - ros-jazzy-soccer-vision-attribute-msgs - - ros-jazzy-visualization-msgs - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 219806 - timestamp: 1769782730648 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-soccer-vision-attribute-msgs-1.0.0-np2py312h2ed9cc7_14.conda - sha256: 98de3d8c3b8d39fa1ef4fb8731455c4c6ca34044213d8f1ded72da339cf844be - md5: 8f0a927f3147889d8a3c0a70e5ea93c0 - depends: - - python - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: Apache-2.0 - size: 97474 - timestamp: 1769777111875 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-soccer-vision-attribute-msgs-1.0.0-np2py312h3575a3a_14.conda - sha256: d292567daa7a17bdd43a2b5735394f5dc65b59a9c77b0409192c3073f68504d4 - md5: fb5c6c088cc87940241e78827bfd2bde - depends: - - python - - ros-jazzy-ros-workspace - - ros-jazzy-rosidl-default-runtime - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - python 3.12.* *_cpython - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: Apache-2.0 - size: 108695 - timestamp: 1769782730613 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-spdlog-vendor-1.6.1-np2py312h918b84f_14.conda sha256: 4725102e66c4a2d0089dafa54f767c89a0cc2da0812dd58e306d072a4f3d2caa md5: 3826650a48bb219f4f56804524ab8a9c @@ -33289,42 +30603,6 @@ packages: license: Apache-2.0 size: 237515 timestamp: 1768945275430 -- conda: https://data.bit-bots.de/conda/linux-64/ros-jazzy-udp-bridge-0.0.0-np2py312h2ed9cc7_14.conda - sha256: 4e1ee0765a501adc90af8abc4fe204da4c1a426a211dd765a877cb452bd88ede - md5: b585d1276779009d6c8e0af43c70823e - depends: - - cryptography - - python - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - __glibc >=2.17,<3.0.a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: MIT - size: 46091 - timestamp: 1769777111803 -- conda: https://data.bit-bots.de/conda/linux-aarch64/ros-jazzy-udp-bridge-0.0.0-np2py312h3575a3a_14.conda - sha256: 62935bde6c8725964f24e89958a8d22cb3280faaa05563516f89884cbc49a714 - md5: f4ced389275a95605181fb157dd01c99 - depends: - - cryptography - - python - - ros-jazzy-rclpy - - ros-jazzy-ros-workspace - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - libstdcxx >=14 - - python 3.12.* *_cpython - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - - python_abi 3.12.* *_cp312 - license: MIT - size: 52965 - timestamp: 1769782730434 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-uncrustify-vendor-3.0.1-np2py312h2ed9cc7_14.conda sha256: cbcc02dd96f1fe9a98a1c533824862445c8f2f350eb97fbaa21a5323972b9e77 md5: 82188bc12f938a9d494c18d4c54e0bb9 @@ -33686,64 +30964,6 @@ packages: license: Apache-2.0 size: 377931 timestamp: 1768946078131 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-warehouse-ros-2.0.5-np2py312h2ed9cc7_14.conda - sha256: 696344f61bf569b827013529153c69f6359e916b838c2b68fa5eecc55e1bf2b7 - md5: 03f69a5a5aeca90885904c4fb47b891d - depends: - - libboost-devel - - libboost-python-devel - - openssl - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-std-msgs - - ros-jazzy-tf2 - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - - libgcc >=14 - - openssl >=3.6.0,<4.0a0 - - libboost-python >=1.88.0,<1.89.0a0 - - python_abi 3.12.* *_cp312 - - libboost >=1.88.0,<1.89.0a0 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - numpy >=1.23,<3 - license: BSD-3-Clause - size: 238665 - timestamp: 1768979831274 -- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-warehouse-ros-2.0.5-np2py312h61f2ce4_14.conda - sha256: 37901a731615d4ae2e3e392695e5bc914a5451b2a9afa4a06b9c82943b98a21e - md5: 310d74edbcc9df7615298533fb4eea54 - depends: - - libboost-devel - - libboost-python-devel - - openssl - - python - - ros-jazzy-geometry-msgs - - ros-jazzy-pluginlib - - ros-jazzy-rclcpp - - ros-jazzy-ros-workspace - - ros-jazzy-std-msgs - - ros-jazzy-tf2 - - ros-jazzy-tf2-geometry-msgs - - ros-jazzy-tf2-ros - - ros2-distro-mutex 0.13.* jazzy_* - - libstdcxx >=14 - - libgcc >=14 - - numpy >=1.23,<3 - - ros2-distro-mutex >=0.13.0,<0.14.0a0 - - python_abi 3.12.* *_cp312 - - openssl >=3.6.0,<4.0a0 - - libboost-python >=1.88.0,<1.89.0a0 - - libboost >=1.88.0,<1.89.0a0 - license: BSD-3-Clause - size: 239600 - timestamp: 1768948205887 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-web-video-server-2.1.1-np2py312h2ed9cc7_14.conda sha256: 3898a8c4081f16857ec16084957c14ebdcc3a9d933da70f06e188d28c1382006 md5: e901470d14aecc01e30b5c6abb313dd0 @@ -33872,6 +31092,45 @@ packages: license: Apache-2.0 OR MIT size: 23161 timestamp: 1768943355446 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-zenoh-cpp-vendor-0.2.9-np2py312ha80d210_14.conda + sha256: c1c416d12b6aa40ab1ffb432af96f890541041aaeb3f4ea5c87dc36bc1819313 + md5: cd398087694f62e7f576b12fda1ad04b + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.13.* jazzy_* + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - libgcc >=14 + - numpy >=1.23,<3 + - python_abi 3.12.* *_cp312 + - libzenohc >=1.7.2,<1.7.3.0a0 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + size: 25643 + timestamp: 1768974413106 +- conda: https://conda.anaconda.org/robostack-jazzy/linux-aarch64/ros-jazzy-zenoh-cpp-vendor-0.2.9-np2py312h1cd77a6_14.conda + sha256: 4febac2507ffe49c9f5e84a737aea9d6923260a20cc19bba5b88d2e3be6f7829 + md5: 71760ca30a7c2f248bcc4f66f0418f4a + depends: + - python + - ros-jazzy-ros-workspace + - ros2-distro-mutex 0.13.* jazzy_* + - libgcc >=14 + - libstdcxx >=14 + - libgcc >=14 + - libzenohc >=1.7.2,<1.7.3.0a0 + - python_abi 3.12.* *_cp312 + - ros2-distro-mutex >=0.13.0,<0.14.0a0 + - numpy >=1.23,<3 + constrains: + - __glibc >=2.17 + license: Apache-2.0 + size: 25683 + timestamp: 1768943363385 - conda: https://conda.anaconda.org/robostack-jazzy/linux-64/ros-jazzy-zstd-vendor-0.26.9-np2py312h2ed9cc7_14.conda sha256: b43773d3c7e9f376cdea7e6a4a390b058b1fa0197949f98b961b53259d6b68b9 md5: 9bb07ab4028160b88c768ea2c67a150c @@ -34023,7 +31282,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/ruff?source=compressed-mapping + - pkg:pypi/ruff?source=hash-mapping size: 9131490 timestamp: 1769520999080 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ruff-0.14.14-he9a2e21_1.conda @@ -34061,7 +31320,7 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/scipy?source=compressed-mapping + - pkg:pypi/scipy?source=hash-mapping size: 17109648 timestamp: 1771880675810 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/scipy-1.17.1-py312he5b0e10_0.conda @@ -34175,93 +31434,65 @@ packages: purls: [] size: 597756 timestamp: 1757842928996 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.2-hdeec2a5_0.conda - sha256: 64b982664550e01c25f8f09333c0ee54d4764a80fe8636b8aaf881fe6e8a0dbe - md5: 88a69db027a8ff59dab972a09d69a1ab +- conda: https://conda.anaconda.org/conda-forge/linux-64/sdl3-3.4.4-hdeec2a5_0.conda + sha256: 4acc06278e14ea9394d50debd0d47006b6daf135749471e2d0f1f30cc602bdd8 + md5: 78f56b31513ee775c3e72a744bd26a7e depends: - - __glibc >=2.17,<3.0.a0 - - libstdcxx >=14 - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - wayland >=1.25.0,<2.0a0 + - xorg-libxi >=1.8.2,<2.0a0 - xorg-libxscrnsaver >=1.2.4,<2.0a0 + - libudev1 >=257.13 + - xorg-libxtst >=1.2.5,<2.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - pulseaudio-client >=17.0,<17.1.0a0 - libdrm >=2.4.125,<2.5.0a0 + - libgl >=1.7.0,<2.0a0 - xorg-libxfixes >=6.0.2,<7.0a0 - - libudev1 >=257.10 - - pulseaudio-client >=17.0,<17.1.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 - - libegl >=1.7.0,<2.0a0 - - libvulkan-loader >=1.4.341.0,<2.0a0 - - xorg-libxcursor >=1.2.3,<2.0a0 - - xorg-libx11 >=1.8.13,<2.0a0 - liburing >=2.14,<2.15.0a0 - - libxkbcommon >=1.13.1,<2.0a0 - - libunwind >=1.8.3,<1.9.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 - libusb >=1.0.29,<2.0a0 + - libunwind >=1.8.3,<1.9.0a0 - dbus >=1.16.2,<2.0a0 - xorg-libxext >=1.3.7,<2.0a0 - - libgl >=1.7.0,<2.0a0 - - xorg-libxi >=1.8.2,<2.0a0 - - wayland >=1.24.0,<2.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - libegl >=1.7.0,<2.0a0 license: Zlib purls: [] - size: 2138749 - timestamp: 1771668185803 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.4.2-had2c13b_0.conda - sha256: 17aad2e3439d6d778bf995134f37e442a8420adc740457f43d647d4dbf0b10fe - md5: c667298eebd2296ace8cb07dbbba95c0 + size: 2143141 + timestamp: 1775266679380 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sdl3-3.4.4-had2c13b_0.conda + sha256: c2733df4e7101fd6464de501e1cd34ac487cada83fb8c00b32c85735e87880cf + md5: d8fe437e143535700539a8cc0d085d5f depends: - - libgcc >=14 - libstdcxx >=14 + - libgcc >=14 + - pulseaudio-client >=17.0,<17.1.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 - xorg-libxi >=1.8.2,<2.0a0 - - libvulkan-loader >=1.4.341.0,<2.0a0 - - libxkbcommon >=1.13.1,<2.0a0 - - wayland >=1.24.0,<2.0a0 + - libdrm >=2.4.125,<2.5.0a0 - libegl >=1.7.0,<2.0a0 - - xorg-libxext >=1.3.7,<2.0a0 + - libusb >=1.0.29,<2.0a0 - libgl >=1.7.0,<2.0a0 - xorg-libxtst >=1.2.5,<2.0a0 - - libudev1 >=257.10 - - pulseaudio-client >=17.0,<17.1.0a0 - - libusb >=1.0.29,<2.0a0 + - liburing >=2.14,<2.15.0a0 + - libudev1 >=257.13 + - libunwind >=1.8.3,<1.9.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 - xorg-libxcursor >=1.2.3,<2.0a0 - - libdrm >=2.4.125,<2.5.0a0 - - xorg-libxscrnsaver >=1.2.4,<2.0a0 - xorg-libxfixes >=6.0.2,<7.0a0 - - libunwind >=1.8.3,<1.9.0a0 - - liburing >=2.14,<2.15.0a0 + - wayland >=1.25.0,<2.0a0 + - libxkbcommon >=1.13.1,<2.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - xorg-libxscrnsaver >=1.2.4,<2.0a0 - dbus >=1.16.2,<2.0a0 - - xorg-libx11 >=1.8.13,<2.0a0 license: Zlib purls: [] - size: 2136476 - timestamp: 1771668207211 -- conda: https://conda.anaconda.org/conda-forge/linux-64/setproctitle-1.3.7-py312h5253ce2_0.conda - sha256: fc59372c21248cae366452d0901d946c55aac00b1d3a5b260001d48593fc2c9f - md5: bed00a090df33c7ba0db3d09f2e4293c - depends: - - python - - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/setproctitle?source=hash-mapping - size: 23575 - timestamp: 1766684430348 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/setproctitle-1.3.7-py312hd41f8a7_0.conda - sha256: cc3c36aa71a8f3da2f4229a8f6b749efb4fe0022840eb1be06a22eed33e7e6f2 - md5: b94f594b2854ce3f5b487a4b5846e04d - depends: - - python - - libgcc >=14 - - python 3.12.* *_cpython - - python_abi 3.12.* *_cp312 - license: BSD-3-Clause - license_family: BSD - purls: - - pkg:pypi/setproctitle?source=hash-mapping - size: 27696 - timestamp: 1766684495597 + size: 2141080 + timestamp: 1775266692792 - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-68.1.2-pyhd8ed1ab_0.conda sha256: dc5a777597e05ceddefc87d2f96389b7ae0afb097e558307af83a453db3e3887 md5: 4fe12573bf499ff85a0a364e00cc5c53 @@ -34309,17 +31540,17 @@ packages: purls: [] size: 115498 timestamp: 1770208786806 -- conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.3-pyhd8ed1ab_0.conda - sha256: 19d1dab079746de0c38581d926e02306368b74d0683cd3e6b18ccabea54c7e07 - md5: 00cdd2e3ec6d3be6bc2b7d46470a10a1 +- conda: https://conda.anaconda.org/conda-forge/noarch/simpleeval-1.0.7-pyhd8ed1ab_0.conda + sha256: d856c322601d16710793f29abc0e35c1910e19310577d15dddffbff8bda97328 + md5: b7ccd2113dda4c8ac1f4821a6d8690a4 depends: - - python >=3.9 + - python >=3.10 license: MIT license_family: MIT purls: - pkg:pypi/simpleeval?source=hash-mapping - size: 21558 - timestamp: 1751650049429 + size: 24617 + timestamp: 1773753246067 - conda: https://conda.anaconda.org/conda-forge/linux-64/sip-6.10.0-py312h1289d80_1.conda sha256: 65224ec231bb938a720897d75fb76f20a2376bded01a438f5220f6fa43195e4f md5: f96baa9ba899d5d30578675fe28b3473 @@ -34339,9 +31570,9 @@ packages: - pkg:pypi/sip?source=hash-mapping size: 680892 timestamp: 1759437964748 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sip-6.15.2-py312hfcd9f9b_0.conda - sha256: c08306703fd62ed68c21f1d8a7e1e7026ddd3ba6d904aee1c6b2a416d667a038 - md5: 56a35789823c7073cced902103f856c6 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/sip-6.15.3-py312hfcd9f9b_0.conda + sha256: 1124b77f91d6d269c873ee9be5c242117220c93ca35fb11e196c048b28de94ff + md5: 71afa1d22144f07b5e3205d67c67adf5 depends: - libgcc >=14 - libstdcxx >=14 @@ -34355,8 +31586,8 @@ packages: license_family: BSD purls: - pkg:pypi/sip?source=hash-mapping - size: 735337 - timestamp: 1773072698070 + size: 737077 + timestamp: 1774375435468 - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d md5: 3339e3b65d58accf4ca4fb8748ab16b3 @@ -34413,7 +31644,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/sniffio?source=compressed-mapping + - pkg:pypi/sniffio?source=hash-mapping size: 15698 timestamp: 1762941572482 - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda @@ -34432,6 +31663,26 @@ packages: version: 2.8.3 sha256: ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95 requires_python: '>=3.9' +- conda: https://conda.anaconda.org/conda-forge/linux-64/soxr-0.1.3-h0b41bf4_3.conda + sha256: 141e3364d26f162bfeae8491787c0d8796ada6c29a8cd567c1cd17c3c6b418f9 + md5: e8d261785be19b1575d23ccbbeae4ddd + depends: + - _openmp_mutex >=4.5 + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 131370 + timestamp: 1674059502792 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/soxr-0.1.3-hb4cce97_3.conda + sha256: 58b006195863f200efdb5785a4a954f8d0284b5984703d4d74ec4c09343e58e2 + md5: 13e1d5bd316dec4077351f4246b9b2a8 + depends: + - _openmp_mutex >=4.5 + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 111209 + timestamp: 1674059588618 - conda: https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.17.0-hab81395_1.conda sha256: c650f3df027afde77a5fbf58600ec4ed81a9edddf81f323cfb3e260f6dc19f56 md5: a3b0e874fa56f72bc54e5c595712a333 @@ -34655,9 +31906,9 @@ packages: - pkg:pypi/stack-data?source=hash-mapping size: 26988 timestamp: 1733569565672 -- conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.1-hecca717_0.conda - sha256: 4a1d2005153b9454fc21c9bad1b539df189905be49e851ec62a6212c2e045381 - md5: 2a2170a3e5c9a354d09e4be718c43235 +- conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-4.0.0-hecca717_0.conda + sha256: e5e036728ef71606569232cc94a0480722e14ed69da3dd1e363f3d5191d83c01 + md5: 9a6117aee038999ffefe6082ff1e9a81 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -34665,8 +31916,8 @@ packages: license: BSD-2-Clause license_family: BSD purls: [] - size: 2619743 - timestamp: 1769664536467 + size: 2620937 + timestamp: 1769280649780 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/svt-av1-4.0.1-hfae3067_0.conda sha256: 6518e4575e83e38b07460f504b6467124f9a16e4d368af42ca54a69603002078 md5: 943fcd76194904358b2587d627ee6388 @@ -34678,22 +31929,6 @@ packages: purls: [] size: 2042800 timestamp: 1769668627820 -- pypi: https://files.pythonhosted.org/packages/a9/56/feb011ed1e8724c4c57083d71877eefe61f535f6dc94aa598033a03b54b7/swagger_ui_py-21.12.8-py3-none-any.whl - name: swagger-ui-py - version: 21.12.8 - sha256: 268901c814135d2562b44e3dee299ed31d2874bd3a38b6931ea65d0c8fdc1cef - requires_dist: - - jinja2>=2.0 - - pyyaml>=5.0 -- pypi: https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl - name: sympy - version: 1.14.0 - sha256: e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 - requires_dist: - - mpmath>=1.1.0,<1.4 - - pytest>=7.1.0 ; extra == 'dev' - - hypothesis>=6.70.0 ; extra == 'dev' - requires_python: '>=3.9' - pypi: https://files.pythonhosted.org/packages/de/70/cf880c3b95a6034ef673e74b369941b42315c01f1554a5637a4f8b911009/syrupy-5.1.0-py3-none-any.whl name: syrupy version: 5.1.0 @@ -34832,21 +32067,21 @@ packages: - pkg:pypi/toml?source=hash-mapping size: 24017 timestamp: 1764486833072 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.0-pyhcf101f3_0.conda - sha256: 62940c563de45790ba0f076b9f2085a842a65662268b02dd136a8e9b1eaf47a8 - md5: 72e780e9aa2d0a3295f59b1874e3768b +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - - pkg:pypi/tomli?source=compressed-mapping - size: 21453 - timestamp: 1768146676791 -- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py312h4c3975b_0.conda - sha256: bed440cad040f0fe76266f9a527feecbaf00385b68a96532aa69614fe5153f8e - md5: e03a4bf52d2170d64c816b2a52972097 + - pkg:pypi/tomli?source=hash-mapping + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.5-py312h4c3975b_0.conda + sha256: 4629b1c9139858fb08bb357df917ffc12e4d284c57ff389806bb3ae476ef4e0a + md5: 2b37798adbc54fd9e591d24679d2133a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -34856,11 +32091,11 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=compressed-mapping - size: 850918 - timestamp: 1765458857375 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.3-py312hefbd42c_0.conda - sha256: 876235b9c8e6ff91990ac9a1ca2041257e0854d47897394190a376473371e7fc - md5: b1ec9447183674b86aee6466fc98a840 + size: 859665 + timestamp: 1774358032165 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tornado-6.5.5-py312hefbd42c_0.conda + sha256: 36c363ba31390875a7b024899077268b7fd55fe35e8f9190b5154c4f5032a99b + md5: 9bd0a2e992f86149013b0a5c50a912c9 depends: - libgcc >=14 - python >=3.12,<3.13.0a0 @@ -34869,25 +32104,8 @@ packages: license_family: Apache purls: - pkg:pypi/tornado?source=hash-mapping - size: 853090 - timestamp: 1765460044183 -- pypi: https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl - name: tqdm - version: 4.67.3 - sha256: ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf - requires_dist: - - colorama ; sys_platform == 'win32' - - importlib-metadata ; python_full_version < '3.8' - - pytest>=6 ; extra == 'dev' - - pytest-cov ; extra == 'dev' - - pytest-timeout ; extra == 'dev' - - pytest-asyncio>=0.24 ; extra == 'dev' - - nbval ; extra == 'dev' - - requests ; extra == 'discord' - - slack-sdk ; extra == 'slack' - - requests ; extra == 'telegram' - - ipywidgets>=6 ; extra == 'notebook' - requires_python: '>=3.7' + size: 859168 + timestamp: 1774359394755 - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda sha256: f39a5620c6e8e9e98357507262a7869de2ae8cc07da8b7f84e517c9fd6c2b959 md5: 019a7385be9af33791c989871317e1ed @@ -34911,6 +32129,12 @@ packages: - pkg:pypi/transforms3d?source=hash-mapping size: 2690384 timestamp: 1734511238605 +- conda: https://data.bit-bots.de/conda-misc/output/noarch/tts-supertonic-1.0.0-h4616a5c_1.conda + sha256: 8fdf69f5dc803b4044dffd50aa1056b653410b92ba2aaae447aa62e178e47110 + md5: cae5d6a4eb902dfc71842a3e7ae4d4c4 + license: LicenseRef-openrail + size: 244991335 + timestamp: 1771976595791 - conda: https://conda.anaconda.org/conda-forge/noarch/typeguard-4.5.1-pyhd8ed1ab_0.conda sha256: 39d8ae33c43cdb8f771373e149b0b4fae5a08960ac58dcca95b2f1642bb17448 md5: 260af1b0a94f719de76b4e14094e9a3b @@ -34937,14 +32161,6 @@ packages: purls: [] size: 91383 timestamp: 1756220668932 -- pypi: https://files.pythonhosted.org/packages/65/f3/107a22063bf27bdccf2024833d3445f4eea42b2e598abfbd46f6a63b6cb0/typing_inspect-0.9.0-py3-none-any.whl - name: typing-inspect - version: 0.9.0 - sha256: 9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f - requires_dist: - - mypy-extensions>=0.3.0 - - typing-extensions>=3.7.4 - - typing>=3.7.4 ; python_full_version < '3.5' - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda sha256: 032271135bca55aeb156cee361c81350c6f3fb203f57d024d7e5a1fc9ef18731 md5: 0caa1af407ecff61170c9437a808404d @@ -34964,18 +32180,6 @@ packages: purls: [] size: 119135 timestamp: 1767016325805 -- pypi: https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl - name: tzlocal - version: 5.3.1 - sha256: eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d - requires_dist: - - tzdata ; sys_platform == 'win32' - - pytest>=4.3 ; extra == 'devenv' - - pytest-mock>=3.3 ; extra == 'devenv' - - pytest-cov ; extra == 'devenv' - - check-manifest ; extra == 'devenv' - - zest-releaser ; extra == 'devenv' - requires_python: '>=3.9' - conda: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.1.0-py312hd9148b4_0.conda sha256: c975070ac28fe23a5bbb2b8aeca5976b06630eb2de2dc149782f74018bf07ae8 md5: 55fd03988b1b1bc6faabbfb5b481ecd7 @@ -35031,10 +32235,6 @@ packages: purls: [] size: 636572 timestamp: 1747514438016 -- pypi: https://files.pythonhosted.org/packages/6f/a4/691ab63b17505a26096608cc309960b5a6bdf39e4ba1a793d5f9b1a53270/unicodecsv-0.14.1.tar.gz - name: unicodecsv - version: 0.14.1 - sha256: 018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.1-py312h4c3975b_0.conda sha256: 895bbfe9ee25c98c922799de901387d842d7c01cae45c346879865c6a907f229 md5: 0b6c506ec1f272b685240e70a29261b8 @@ -35187,7 +32387,7 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/virtualenv?source=compressed-mapping + - pkg:pypi/virtualenv?source=hash-mapping size: 4647775 timestamp: 1773133660203 - conda: https://conda.anaconda.org/conda-forge/linux-64/viskores-1.1.0-cpu_hc82bd48_.conda @@ -35415,33 +32615,33 @@ packages: - pkg:pypi/wadler-lindig?source=hash-mapping size: 28051 timestamp: 1752728420929 -- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda - sha256: 3aa04ae8e9521d9b56b562376d944c3e52b69f9d2a0667f77b8953464822e125 - md5: 035da2e4f5770f036ff704fa17aace24 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + sha256: ea374d57a8fcda281a0a89af0ee49a2c2e99cc4ac97cf2e2db7064e74e764bdb + md5: 996583ea9c796e5b915f7d7580b51ea6 depends: - __glibc >=2.17,<3.0.a0 - - libexpat >=2.7.1,<3.0a0 + - libexpat >=2.7.4,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 329779 - timestamp: 1761174273487 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.24.0-h4f8a99f_1.conda - sha256: d94af8f287db764327ac7b48f6c0cd5c40da6ea2606afd34ac30671b7c85d8ee - md5: f6966cb1f000c230359ae98c29e37d87 + size: 334139 + timestamp: 1773959575393 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/wayland-1.25.0-h4f8a99f_0.conda + sha256: 3cc479df517b0ce110835a1256f91ca568581cb6dfe1c53a0786f0a226039a45 + md5: 0a7a9548726f98d5869fd4c43e110f0f depends: - - libexpat >=2.7.1,<3.0a0 + - libexpat >=2.7.4,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 331480 - timestamp: 1761174368396 + size: 335260 + timestamp: 1773959583826 - conda: https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.47-hd8ed1ab_0.conda sha256: 9ab2c12053ea8984228dd573114ffc6d63df42c501d59fda3bf3aeb1eaa1d23e md5: 7da1571f560d4ba3343f7f4c48a79c76 @@ -35458,18 +32658,12 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/wcwidth?source=compressed-mapping + - pkg:pypi/wcwidth?source=hash-mapping size: 71550 timestamp: 1770634638503 -- conda: https://data.bit-bots.de/conda-misc/output/linux-64/webots-2022b-hb0f4dca_5.conda - sha256: 01477c71eefde6b189de66adf44e35dbacb0797ecb9067a842d93cab48c6201e - md5: a9eb03a24f3059cac51904a018e1c880 - license: Apache-2.0 - size: 172089451 - timestamp: 1771970041026 -- conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.6-pyhcf101f3_0.conda - sha256: 06e3d5bec9d2730a23ecf023b7cba329c0772c51f2704714c17b3080b0385113 - md5: 2d9bfc6055e55ff58b2c359323a753d2 +- conda: https://conda.anaconda.org/conda-forge/noarch/werkzeug-3.1.8-pyhcf101f3_0.conda + sha256: 5108c1bf2f0512e5c9dc8191e31b144c23b7cf0e73423a246173006002368d79 + md5: 3eeca039e7316268627f4116da9df64c depends: - markupsafe >=2.1.1 - python >=3.10 @@ -35478,8 +32672,8 @@ packages: license_family: BSD purls: - pkg:pypi/werkzeug?source=compressed-mapping - size: 257130 - timestamp: 1771530143814 + size: 258232 + timestamp: 1775160081069 - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-2.1.2-py312h4c3975b_0.conda sha256: 5bf21e14a364018a36869a16d9f706fb662c6cb6da3066100ba6822a70f93d2d md5: 7f2ef073d94036f8b16b6ee7d3562a88 @@ -35518,16 +32712,9 @@ packages: license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/wslink?source=compressed-mapping + - pkg:pypi/wslink?source=hash-mapping size: 36729 timestamp: 1773305846931 -- pypi: https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl - name: wsproto - version: 1.3.2 - sha256: 61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584 - requires_dist: - - h11>=0.16.0,<1 - requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2 sha256: 175315eb3d6ea1f64a6ce470be00fa2ee59980108f246d3072ab8b977cb048a5 md5: 6c99772d483f566d59e25037fea2c4b1 @@ -35712,10 +32899,6 @@ packages: purls: [] size: 50772 timestamp: 1718845072660 -- pypi: https://files.pythonhosted.org/packages/f1/7e/1d55a5749fbf7d1ac6411f3028128b974a3e6bb770d365a2518ecee8ce7e/xdgenvpy-2.4.0-py3-none-any.whl - name: xdgenvpy - version: 2.4.0 - sha256: 4c4e427a753e8ecb0e336a7cd7eacd55f91a5fc8fd1fa42a957706fccf2b9949 - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.47-hb03c661_0.conda sha256: 19c2bb14bec84b0e995b56b752369775c75f1589314b43733948bb5f471a6915 md5: b56e0c8432b56decafae7e78c5f29ba5 @@ -36452,7 +33635,7 @@ packages: license: Apache-2.0 license_family: Apache purls: - - pkg:pypi/yarl?source=compressed-mapping + - pkg:pypi/yarl?source=hash-mapping size: 147028 timestamp: 1772409590700 - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/yarl-1.23.0-py312ha4530ae_0.conda @@ -36472,34 +33655,53 @@ packages: - pkg:pypi/yarl?source=hash-mapping size: 146602 timestamp: 1772409452021 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda - sha256: 47cfe31255b91b4a6fa0e9dbaf26baa60ac97e033402dbc8b90ba5fee5ffe184 - md5: 8035e5b54c08429354d5d64027041cad +- conda: https://conda.anaconda.org/conda-forge/linux-64/zenoh-rust-abi-1.7.2.1.85.0-h8619998_0.conda + sha256: 4c85a07bb991621eb3380f0de679b73de796ebe2bc95f5b65f9f3141949fca13 + md5: ca737b1dc0de56e88605c47022e555bf depends: - - libstdcxx >=14 - - libgcc >=14 - __glibc >=2.17,<3.0.a0 + constrains: + - __glibc >=2.17 + license: Apache-2.0 OR EPL-2.0 + purls: [] + size: 49012 + timestamp: 1767949916856 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zenoh-rust-abi-1.7.2.1.85.0-h4d6d557_0.conda + sha256: edcc21e3cc02685cb1dab2625780c2ff02b398fca5d95611287a524fe615f609 + md5: 2062257602e9c7ab9c5f92f891f2d0ed + constrains: + - __glibc >=2.17 + license: Apache-2.0 OR EPL-2.0 + purls: [] + size: 48766 + timestamp: 1767949969738 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + sha256: 325d370b28e2b9cc1f765c5b4cdb394c91a5d958fbd15da1a14607a28fee09f6 + md5: 755b096086851e1193f3b10347415d7c + depends: - libgcc >=14 - - libsodium >=1.0.20,<1.0.21.0a0 - - krb5 >=1.21.3,<1.22.0a0 + - __glibc >=2.17,<3.0.a0 + - libstdcxx >=14 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 310648 - timestamp: 1757370847287 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hefbcea8_9.conda - sha256: 8a1efaf97a00d62d68939abe40f7a35ace8910eec777d5535b8c32d0079750bd - md5: 5676806bba055c901a62f969cb3fbe02 + size: 311150 + timestamp: 1772476812121 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zeromq-4.3.5-hc0523f8_10.conda + sha256: 32f77d565687a8241ebfb66fe630dcb197efc84f6a8b59df8260b1191b7deb2c + md5: ac79d51c73c8fbe6ef6e9067191b7f1a depends: - - libstdcxx >=14 - libgcc >=14 - - krb5 >=1.21.3,<1.22.0a0 - - libsodium >=1.0.20,<1.0.21.0a0 + - libstdcxx >=14 + - libsodium >=1.0.21,<1.0.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 350254 - timestamp: 1757370867477 + size: 350773 + timestamp: 1772476818466 - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda sha256: 5fabe6cccbafc1193038862b0b0d784df3dae84bc48f12cac268479935f9c8b7 md5: 6a0eb48e58684cca4d7acc8b7a0fd3c7 @@ -36537,29 +33739,27 @@ packages: - pkg:pypi/zipp?source=hash-mapping size: 24194 timestamp: 1764460141901 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab - md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + sha256: 245c9ee8d688e23661b95e3c6dd7272ca936fabc03d423cdb3cdee1bbcf9f2f2 + md5: c2a01a08fc991620a74b32420e97868a depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib 1.3.1 hb9d3cd8_2 + - libzlib 1.3.2 h25fd6f3_2 license: Zlib license_family: Other purls: [] - size: 92286 - timestamp: 1727963153079 -- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.1-h86ecc28_2.conda - sha256: b4f649aa3ecdae384d5dad7074e198bff120edd3dfb816588e31738fc6d627b1 - md5: bc230abb5d21b63ff4799b0e75204783 + size: 95931 + timestamp: 1774072620848 +- conda: https://conda.anaconda.org/conda-forge/linux-aarch64/zlib-1.3.2-hdc9db2a_2.conda + sha256: d651731b45f2d84591881da3ce3e4107a9ba6709fe790dbd5f7b8d9c89a02ed7 + md5: 493587274c81b34d198b085b46a86eaa depends: - - libgcc >=13 - - libzlib 1.3.1 h86ecc28_2 + - libzlib 1.3.2 hdc9db2a_2 license: Zlib license_family: Other purls: [] - size: 95582 - timestamp: 1727963203597 + size: 100515 + timestamp: 1774072641977 - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda sha256: 68f0206ca6e98fea941e5717cec780ed2873ffabc0e1ed34428c061e2c6268c7 md5: 4a13eeac0b5c8e5b8ab496e6c4ddd829 diff --git a/pixi.toml b/pixi.toml index 6d2f5b2d28..98e11aca65 100644 --- a/pixi.toml +++ b/pixi.toml @@ -1,7 +1,6 @@ [workspace] authors = ["Florian Vahl <7vahl@informatik.uni-hamburg.de>"] channels = [ - "https://data.bit-bots.de/conda/", # For self hosted ROS / robostack packages "https://data.bit-bots.de/conda-misc/output/", # For self hosted misc (non-ROS, neural network weights, ...) packages "robostack-jazzy", # Robostack jazzy channel for ROS packages "conda-forge" # General conda-forge channel @@ -16,6 +15,11 @@ deploy = {cmd = "scripts/deploy_robots.py", description = "Deploys the current e format = {cmd = "pre-commit run --all-files", description = "Runs code formatting and linting."} [tasks.build] +# Skipping ZED-camera related packages as they require a local installation of the ZED SDK. +cmd = "colcon build --symlink-install --cmake-args -G 'Unix Makefiles' --packages-skip zed_wrapper zed_components zed_msgs zed_ros2 " +description = "Builds all ROS 2 packages. Add --packages-select to build specific packages." + +[feature.robot.tasks.build] cmd = "colcon build --symlink-install --cmake-args -G 'Unix Makefiles' " description = "Builds all ROS 2 packages. Add --packages-select to build specific packages." @@ -33,7 +37,7 @@ description = "Runs tests for all ROS 2 packages. Add --packages-select /dev/null; then - echo "No internet connection. Please check your internet connection to install the basler drivers." - exit 1 - fi -} - -# Check if the correct pylon driver PYLON_VERSION is installed (apt) -if apt list pylon --installed | grep -q $PYLON_VERSION; then - echo "Pylon driver $PYLON_VERSION is already installed." -else - echo "Pylon driver $PYLON_VERSION is not installed. Installing..." - # Check if we have an internet connection - check_internet_connection "$1" - # Check if the url exist - if ! curl --output /dev/null --silent --head --fail "$PYLON_DOWNLOAD_URL"; then - echo "Pylon download url does not exist. Please check the url and update the 'PYLON_DOWNLOAD_URL' variable in the 'make_basler.sh' script. The website might have changed." - exit 1 - fi - # Download the pylon driver to temp folder - wget --no-verbose $SHOW_PROGRESS $PYLON_DOWNLOAD_URL -O /tmp/pylon_${PYLON_VERSION}.tar.gz.gpg - # Extract the pylon driver - mkdir /tmp/pylon - # Decrypt the pylon driver - gpg --batch --yes --passphrase "12987318371043223" -o /tmp/pylon_${PYLON_VERSION}.tar.gz -d /tmp/pylon_${PYLON_VERSION}.tar.gz.gpg - # Extract the pylon driver - tar -xzf /tmp/pylon_${PYLON_VERSION}.tar.gz -C /tmp/pylon/ - # Install the pylon driver - sudo apt-get install /tmp/pylon/pylon_${PYLON_VERSION}*.deb -y -fi diff --git a/scripts/setup.sh b/scripts/setup.sh index 90fed54d75..a88ce28aca 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -42,17 +42,11 @@ setup_repo() { $HOME/.pixi/bin/pixi install } -setup_host() { - echo "Setting up system dependencies not covered by pixi. This may require sudo rights. For non-Ubuntu systems, please install the required packages manually." - if (( has_sudo )); then - $meta_dir/scripts/make_basler.sh - fi -} - build_repository() { echo "Running full colcon build..." set +u - $HOME/.pixi/bin/pixi run build + + pixi run build } has_sudo=0 diff --git a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/animation_capsule.py b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/animation_capsule.py index 33f236f360..8d35b1e50f 100644 --- a/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/animation_capsule.py +++ b/src/bitbots_behavior/bitbots_blackboard/bitbots_blackboard/capsules/animation_capsule.py @@ -27,7 +27,6 @@ def __init__(self, node, blackboard): self._node, PlayAnimation, "animation", callback_group=ReentrantCallbackGroup() ) - self.dynup_action_client = ActionClient(self._node, Dynup, "dynup", callback_group=ReentrantCallbackGroup()) self.lookat_action_client = ActionClient(self._node, LookAt, "look_at_goal") diff --git a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/dynup.py b/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/dynup.py deleted file mode 100644 index a910093dd7..0000000000 --- a/src/bitbots_behavior/bitbots_body_behavior/bitbots_body_behavior/behavior_dsd/actions/dynup.py +++ /dev/null @@ -1,100 +0,0 @@ -import rclpy -from bitbots_blackboard.body_blackboard import BodyBlackboard -from dynamic_stack_decider.abstract_action_element import AbstractActionElement - -from bitbots_msgs.action import Dynup - - -class PlayAnimationDynup(AbstractActionElement): - blackboard: BodyBlackboard - - def __init__(self, blackboard, dsd, parameters): - super().__init__(blackboard, dsd, parameters) - self.direction = parameters.get("direction") - assert self.direction in [ - Dynup.Goal.DIRECTION_FRONT, - Dynup.Goal.DIRECTION_FRONT_ONLY, - Dynup.Goal.DIRECTION_BACK, - Dynup.Goal.DIRECTION_BACK_ONLY, - Dynup.Goal.DIRECTION_RISE, - Dynup.Goal.DIRECTION_DESCEND, - Dynup.Goal.DIRECTION_WALKREADY, - Dynup.Goal.DIRECTION_RISE_NO_ARMS, - Dynup.Goal.DIRECTION_DESCEND_NO_ARMS, - ], f"Direction '{self.direction}' not supported" - self.first_perform = True - self.active = False - - def perform(self, reevaluate=False): - # deactivate falling since it will be wrongly detected - self.do_not_reevaluate() - if self.first_perform: - # get the animation that should be played - # defined by implementations of this abstract class - - # try to start animation - success = self.start_animation() - # if we fail, we need to abort this action - if not success: - self.blackboard.node.get_logger().error("Could not start animation. Will abort play animation action!") - return self.pop() - - self.first_perform = False - return - - if self.animation_finished(): - # we are finished playing this animation - return self.pop() - - def start_animation(self) -> bool: - """ - This will NOT wait by itself. You have to check - animation_finished() by yourself. - - :return: True if the animation was started, False if not - """ - server_running = self.blackboard.animation.dynup_action_client.wait_for_server(timeout_sec=1.0) - if not server_running: - while not server_running and rclpy.ok(): - self.blackboard.node.get_logger().warn( - "Dynup Action Server not running! Dynup cannot work without dynup server! " - "Will now wait until server is accessible!", - throttle_duration_sec=10.0, - ) - server_running = self.blackboard.animation.dynup_action_client.wait_for_server(timeout_sec=1) - if server_running: - self.blackboard.node.get_logger().warn("Dynup server now running, 'get_walkready' action will go on.") - else: - self.blackboard.node.get_logger().warn("Dynup server did not start.") - return False - - # Dynup action server is running, we can start the walkready action - goal = Dynup.Goal() - goal.direction = self.direction - self.active = True - self.dynup_action_current_goal = self.blackboard.animation.dynup_action_client.send_goal_async(goal) - self.dynup_action_current_goal.add_done_callback( - lambda future: future.result() - .get_result_async() - .add_done_callback(lambda result_future: self.__done_cb(result_future)) - ) - return True - - def __done_cb(self, result_future): - self.active = False - - def animation_finished(self) -> bool: - """ - Checks if the animation is finished. - - :return: True if the animation is finished, False if not - """ - return not self.active - - -class GetWalkready(PlayAnimationDynup): - blackboard: BodyBlackboard - - def __init__(self, blackboard, dsd, parameters): - parameters["direction"] = Dynup.Goal.DIRECTION_WALKREADY - super().__init__(blackboard, dsd, parameters) diff --git a/src/bitbots_lowlevel/bitbots_buttons/CMakeLists.txt b/src/bitbots_lowlevel/bitbots_buttons/CMakeLists.txt deleted file mode 100644 index 27ef961c7f..0000000000 --- a/src/bitbots_lowlevel/bitbots_buttons/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(bitbots_buttons) - -# Add support for C++17 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() - -# Build with release optimizations and debug symbols by default -if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebug) -endif() - -find_package(ament_cmake REQUIRED) -find_package(backward_ros REQUIRED) -find_package(bitbots_docs REQUIRED) -find_package(bitbots_msgs REQUIRED) -find_package(game_controller_hsl_interfaces REQUIRED) -find_package(rclcpp REQUIRED) -find_package(std_msgs REQUIRED) -find_package(std_srvs REQUIRED) -find_package(test_msgs REQUIRED) - -add_executable(button_node src/button_node.cpp) -ament_target_dependencies( - button_node - ament_cmake - backward_ros - bitbots_msgs - game_controller_hsl_interfaces - rclcpp - std_msgs - std_srvs - test_msgs) - -# enable_bitbots_docs() - -install(TARGETS button_node DESTINATION lib/${PROJECT_NAME}) -install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) -install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) - -ament_export_dependencies(std_msgs) -ament_export_dependencies(ament_cmake) -ament_export_dependencies(bitbots_docs) -ament_export_dependencies(bitbots_msgs) -ament_export_dependencies(std_msgs) -ament_export_include_directories(${INCLUDE_DIRS}) - -ament_package() diff --git a/src/bitbots_lowlevel/bitbots_buttons/config/buttons.yaml b/src/bitbots_lowlevel/bitbots_buttons/config/buttons.yaml deleted file mode 100644 index a511544cc7..0000000000 --- a/src/bitbots_lowlevel/bitbots_buttons/config/buttons.yaml +++ /dev/null @@ -1,7 +0,0 @@ -bitbots_buttons: - ros__parameters: - manual_penalty: True - speak_active: True - short_time: 2.0 #[s] - debounce_time: 0.1 #[s] - speak: true diff --git a/src/bitbots_lowlevel/bitbots_buttons/docs/conf.py b/src/bitbots_lowlevel/bitbots_buttons/docs/conf.py deleted file mode 100644 index 0bf6043d8c..0000000000 --- a/src/bitbots_lowlevel/bitbots_buttons/docs/conf.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Full list of options at http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import catkin_pkg.package -from exhale import utils - -package_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -catkin_package = catkin_pkg.package.parse_package( - os.path.join(package_dir, catkin_pkg.package.PACKAGE_MANIFEST_FILENAME) -) -sys.path.insert(0, os.path.abspath(os.path.join(package_dir, "src"))) - - -# -- Helper functions -------------------------------------------------------- - - -def count_files(): - """:returns tuple of (num_py, num_cpp)""" - num_py = 0 - num_cpp = 0 - - for _root, _dirs, files in os.walk(os.path.join(package_dir, "src")): - for f in files: - if f.endswith(".py"): - num_py += 1 - for _root, _dirs, files in os.walk(os.path.join(package_dir, "include")): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - num_cpp += 1 - - return num_py, num_cpp - - -# -- Project information ----------------------------------------------------- - -project = catkin_package.name -copyright = "2019, Bit-Bots" -author = ", ".join([a.name for a in catkin_package.authors]) - -# The short X.Y version -version = str(catkin_package.version) -# The full version, including alpha/beta/rc tags -release = str(catkin_package.version) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.doctest", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.coverage", - "sphinx.ext.imgmath", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# -- Exhale and Breath setup ------------------------------------------------- - -# Tell sphinx what the primary language being documented is. -num_files_py, num_files_cpp = count_files() -primary_domain = "py" if num_files_py >= num_files_cpp else "cpp" - -# Tell sphinx what the pygments highlight language should be. -highlight_language = primary_domain - -if num_files_cpp > 0: - extensions += [ - "breathe", - "exhale", - ] - - breathe_projects = {project: os.path.join("_build", "doxyoutput", "xml")} - breathe_default_project = project - - def specifications_for_kind(kind): - # Show all members for classes and structs - if kind == "class" or kind == "struct": - return [":members:", ":protected-members:", ":private-members:", ":undoc-members:"] - # An empty list signals to Exhale to use the defaults - else: - return [] - - exhale_args = { - # These arguments are required - "containmentFolder": "cppapi", - "rootFileName": "library_root.rst", - "rootFileTitle": "C++ Library API", - "doxygenStripFromPath": "..", - "customSpecificationsMapping": utils.makeCustomSpecificationsMapping(specifications_for_kind), - # Suggested optional arguments - "createTreeView": True, - "exhaleExecutesDoxygen": True, - "exhaleDoxygenStdin": "INPUT = {}".format(os.path.join(package_dir, "include")), - } - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = os.path.join("_static", "logo.png") -html_favicon = os.path.join("_static", "logo.png") - - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# -- RST Standard variables --------------------------------------------------- -rst_prolog = f".. |project| replace:: {project}\n" -rst_prolog += ".. |description| replace:: {}\n".format(catkin_package.description.replace("\n\n", "\n")) -rst_prolog += ".. |modindex| replace:: {}\n".format( - ":ref:`modindex`" if num_files_py > 0 else "Python module index is not available" -) diff --git a/src/bitbots_lowlevel/bitbots_buttons/docs/index.rst b/src/bitbots_lowlevel/bitbots_buttons/docs/index.rst deleted file mode 100644 index 141874e286..0000000000 --- a/src/bitbots_lowlevel/bitbots_buttons/docs/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -Welcome to |project|'s documentation! -================================================ - -Description ------------ - -|description| - -.. toctree:: - :maxdepth: 2 - - pyapi/modules - - -Indices and tables -================== - -* :ref:`genindex` -* |modindex| -* :ref:`search` diff --git a/src/bitbots_lowlevel/bitbots_buttons/launch/buttons.launch b/src/bitbots_lowlevel/bitbots_buttons/launch/buttons.launch deleted file mode 100644 index 0e054fdf79..0000000000 --- a/src/bitbots_lowlevel/bitbots_buttons/launch/buttons.launch +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_buttons/package.xml b/src/bitbots_lowlevel/bitbots_buttons/package.xml deleted file mode 100644 index ce87ddfb10..0000000000 --- a/src/bitbots_lowlevel/bitbots_buttons/package.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - bitbots_buttons - 1.3.0 - The bitbots_buttons package handles actions after pressing buttons on a robot. - - Jasper Güldenstein - Hamburg Bit-Bots - - MIT - - Marc Bestmann - Hamburg Bit-Bots - - ament_cmake - rosidl_default_generators - rosidl_default_runtime - - backward_ros - bitbots_docs - bitbots_msgs - game_controller_hsl_interfaces - rclcpp - std_msgs - std_srvs - test_msgs - - - - python3 - tested_robot - - ament_cmake - - diff --git a/src/bitbots_lowlevel/bitbots_buttons/src/button_node.cpp b/src/bitbots_lowlevel/bitbots_buttons/src/button_node.cpp deleted file mode 100644 index 28f83ca0aa..0000000000 --- a/src/bitbots_lowlevel/bitbots_buttons/src/button_node.cpp +++ /dev/null @@ -1,213 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using std::placeholders::_1; -using namespace std::chrono_literals; -namespace bitbots_buttons { - -class ButtonNode : public rclcpp::Node { - public: - explicit ButtonNode() : Node("buttons", rclcpp::NodeOptions()) { - this->declare_parameter("speak_active", true); - this->declare_parameter("short_time", 2.0); - this->declare_parameter("manual_penalty", true); - this->declare_parameter("debounce_time", 0.1); - this->declare_parameter("speak", true); - - this->get_parameter("speak_active", speaking_active_); - this->get_parameter("short_time", short_time_); - this->get_parameter("manual_penalty", manual_penalty_mode_); - this->get_parameter("debounce_time", debounce_time_); - this->get_parameter("speak", speak_); - - // --- Initialize Topics --- - speak_pub_ = this->create_publisher("/speak", 1); - - if (manual_penalty_mode_) { - manual_penalize_client_ = this->create_client("manual_penalize"); - } - - foot_zero_client_ = this->create_client("set_foot_zero"); - foot_zero_available_ = foot_zero_client_->wait_for_service(3s); - - power_client_ = this->create_client("/core/switch_power"); - while (!power_client_->wait_for_service(3s)) { - if (!rclcpp::ok()) { - RCLCPP_ERROR(this->get_logger(), "Interrupted while waiting for the power switch service. Exiting."); - exit(0); - } - RCLCPP_INFO(this->get_logger(), "service switch_power not available, waiting again..."); - } - - teaching_mode_client_ = this->create_client("teaching_mode"); - buttons_sub_ = this->create_subscription( - "/buttons", 1, std::bind(&bitbots_buttons::ButtonNode::buttonCb, this, _1)); - gamestate_sub_ = this->create_subscription( - "gamestate", 1, std::bind(&bitbots_buttons::ButtonNode::gamestateCb, this, _1)); - } - - // Sets the in_game_ variable to true, if a Gamestate message from the Gamecontroller arrives. - void gamestateCb(const game_controller_hsl_interfaces::msg::GameState::SharedPtr msg) { in_game_ = true; } - - void buttonCb(const bitbots_msgs::msg::Buttons::SharedPtr msg) { - // button1 - red - // button2 - green - // button3 - blue - - if (msg->button1 && !button1_) { - button1_ = true; - button1_time_ = this->get_clock()->now().seconds(); - } else if (msg->button2 && !button2_) { - button2_ = true; - button2_time_ = this->get_clock()->now().seconds(); - } else if (msg->button3 && !button3_) { - button3_ = true; - button3_time_ = this->get_clock()->now().seconds(); - } else if (!msg->button1 && button1_) { - // button 1 not pressed anymore - button1_ = false; - double current_time = this->get_clock()->now().seconds(); - if (current_time - button1_time_ > debounce_time_) { - if (current_time - button1_time_ < short_time_ || in_game_) { - // button 1 short - speak("Red button pressed short. Turning motor power off."); - setPower(false); // this can not be reversed because the button cuts the power of himself - } else { - // button 1 long - speak("Red button pressed long. No action implemented."); - } - } - button1_time_ = 0; - } else if (!msg->button2 && button2_) { - // button2 not pressed anymore - button2_ = false; - double current_time = this->get_clock()->now().seconds(); - if (current_time - button2_time_ > debounce_time_) { - if (current_time - button2_time_ < short_time_ || in_game_) { - speak("Green button pressed short. Try deactivating Penalty mode"); - setPenalty(false); - } else { - speak("Green button pressed long. Try deactivating teaching mode"); - // Turn teaching mode off - setTeachingMode(false); - } - } - button2_time_ = 0; - } else if (!msg->button3 && button3_) { - // button2 not pressed anymore - button3_ = false; - double current_time = this->get_clock()->now().seconds(); - if (current_time - button3_time_ > debounce_time_) { - if (current_time - button3_time_ < short_time_ || in_game_) { - speak("Blue button pressed short. Try activating Penalty mode"); - setPenalty(true); - } else { - speak("Blue button pressed long. Try switching teaching mode state"); - // Turn teaching mode on or switch between HOLD and TEACH - setTeachingMode(true); - } - } - button3_time_ = 0; - } - } - - void setTeachingMode(bool state) { - auto request = std::make_shared(); - if (state) { - // switch teaching mode state to SWITCH - request->state = bitbots_msgs::srv::SetTeachingMode::Request::SWITCH; - } else { - // switch teaching mode state to OFF - request->state = bitbots_msgs::srv::SetTeachingMode::Request::OFF; - } - teaching_mode_client_->async_send_request(request); - } - - void setPenalty(bool penalize) { - // Penalizes the robot, if it is not penalized and manual penalty mode is true. - if (manual_penalty_mode_) { - // switch penalty state by calling service on HCM - auto request = std::make_shared(); - request->penalize = penalize; - manual_penalize_client_->async_send_request(request); - } - } - - void zeroFootSensors() { - // Zeroes foot sensors, if foot zero mode is true - if (foot_zero_available_) { - if (!in_game_) { - auto request = std::make_shared(); - foot_zero_client_->async_send_request(request); - } - } else { - RCLCPP_WARN(this->get_logger(), "service not available"); - } - } - - void setPower(bool power) { - // Set power to the servos - auto request = std::make_shared(); - request->data = power; - power_client_->async_send_request(request); - } - - private: - void speak(const std::string& text) { - /** - * Helper method to send a message for text-to-speech output - */ - if (speak_) { - bitbots_msgs::msg::Audio msg = bitbots_msgs::msg::Audio(); - msg.text = text; - msg.priority = 100; - speak_pub_->publish(msg); - } - } - - bool speaking_active_; - double short_time_; - bool manual_penalty_mode_; - bool in_game_ = false; - double debounce_time_; - bool speak_; - - bool button1_ = false; - bool button2_ = false; - bool button3_ = false; - bool foot_zero_available_; - double button1_time_ = 0.0; - double button2_time_ = 0.0; - double button3_time_ = 0.0; - - rclcpp::Publisher::SharedPtr speak_pub_; - rclcpp::Client::SharedPtr manual_penalize_client_; - rclcpp::Client::SharedPtr teaching_mode_client_; - rclcpp::Client::SharedPtr foot_zero_client_; - rclcpp::Client::SharedPtr power_client_; - rclcpp::Subscription::SharedPtr buttons_sub_; - rclcpp::Subscription::SharedPtr gamestate_sub_; -}; -} // namespace bitbots_buttons - -int main(int argc, char* argv[]) { - // initialize ros - rclcpp::init(argc, argv); - auto buttons_node = std::make_shared(); - - rclcpp::experimental::executors::EventsExecutor exec; - exec.add_node(buttons_node); - exec.spin(); - rclcpp::shutdown(); -} diff --git a/src/bitbots_lowlevel/bitbots_ros_control/.gitignore b/src/bitbots_lowlevel/bitbots_ros_control/.gitignore deleted file mode 100644 index e66e902bed..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -CMakeLists.txt.user -.kate-swp \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_ros_control/CMakeLists.txt b/src/bitbots_lowlevel/bitbots_ros_control/CMakeLists.txt deleted file mode 100644 index b418f2b3a8..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/CMakeLists.txt +++ /dev/null @@ -1,123 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(bitbots_ros_control) - -# Add support for C++17 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() - -# Build with release optimizations and debug symbols by default -if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebug) -endif() - -find_package(ament_cmake REQUIRED) -find_package(backward_ros REQUIRED) -find_package(bitbots_buttons REQUIRED) -find_package(bitbots_docs REQUIRED) -find_package(bitbots_msgs REQUIRED) -find_package(controller_interface REQUIRED) -find_package(controller_manager REQUIRED) -find_package(diagnostic_msgs REQUIRED) -find_package(dynamixel_workbench_toolbox REQUIRED) -find_package(hardware_interface REQUIRED) -find_package(moveit_core REQUIRED) -find_package(moveit_ros_planning REQUIRED) -find_package(pluginlib REQUIRED) -find_package(rclcpp REQUIRED) -find_package(rosidl_typesupport_cpp REQUIRED) -find_package(std_msgs REQUIRED) -find_package(std_srvs REQUIRED) -find_package(tf2_ros REQUIRED) -find_package(transmission_interface REQUIRED) -find_package(yaml-cpp REQUIRED) - -set(INCLUDE_DIRS include) -include_directories(${INCLUDE_DIRS}) - -set(CMAKE_CXX_STANDARD 17) -add_compile_options(-Wall -Werror -Wno-unused -pedantic -Wextra) - -set(SOURCES - src/bitfoot_hardware_interface.cpp - src/button_hardware_interface.cpp - src/core_hardware_interface.cpp - src/dynamixel_servo_hardware_interface.cpp - src/imu_hardware_interface.cpp - src/leds_hardware_interface.cpp - src/node.cpp - src/servo_bus_interface.cpp - src/utils.cpp - src/wolfgang_hardware_interface.cpp - include/bitbots_ros_control/hardware_interface.hpp) - -enable_bitbots_docs() - -add_executable(ros_control ${SOURCES}) -ament_target_dependencies( - ros_control - ament_cmake - backward_ros - bitbots_buttons - bitbots_docs - bitbots_msgs - controller_interface - controller_manager - diagnostic_msgs - dynamixel_workbench_toolbox - hardware_interface - moveit_core - moveit_ros_planning - pluginlib - rclcpp - rosidl_typesupport_cpp - std_msgs - std_srvs - tf2_ros - transmission_interface - yaml-cpp) - -add_executable(pressure_converter src/pressure_converter.cpp) -ament_target_dependencies( - pressure_converter - ament_cmake - backward_ros - bitbots_buttons - bitbots_docs - bitbots_msgs - controller_interface - controller_manager - diagnostic_msgs - dynamixel_workbench_toolbox - hardware_interface - pluginlib - rclcpp - rosidl_typesupport_cpp - std_msgs - std_srvs - tf2_ros - transmission_interface - yaml-cpp) -target_link_libraries(pressure_converter yaml-cpp) - -ament_export_dependencies(ament_cmake) -ament_export_dependencies(bitbots_buttons) -ament_export_dependencies(bitbots_docs) -ament_export_dependencies(bitbots_msgs) -ament_export_dependencies(controller_interface) -ament_export_dependencies(controller_manager) -ament_export_dependencies(dynamixel_workbench_toolbox) -ament_export_dependencies(hardware_interface) -ament_export_dependencies(pluginlib) -ament_export_dependencies(std_msgs) -ament_export_dependencies(tf2_ros) -ament_export_dependencies(transmission_interface) - -install(TARGETS ros_control DESTINATION lib/${PROJECT_NAME}) -install(TARGETS pressure_converter DESTINATION lib/${PROJECT_NAME}) -install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) -install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) -install(DIRECTORY scripts/ USE_SOURCE_PERMISSIONS - DESTINATION lib/${PROJECT_NAME}) - -ament_package() diff --git a/src/bitbots_lowlevel/bitbots_ros_control/README.md b/src/bitbots_lowlevel/bitbots_ros_control/README.md deleted file mode 100644 index d8201c5cb8..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/README.md +++ /dev/null @@ -1,16 +0,0 @@ -This package provides an hardware interface for the Dynamixel servos in ros control. - -For more information have a look in the documentation on doku.bit-bots.de or in the doc folder. - -# Important -You will have to use our forked versions of dynamxiel_workbench and DynamixelSDK which provide functions for reading multiple register values in a single syncRead. They can be found here: - -https://github.com/bit-bots/DynamixelSDK - -https://github.com/bit-bots/dynamixel-workbench - - -Set your linux usb bus latency timer to 1 or 0 !!!! -see comment here - -https://github.com/bit-bots/DynamixelSDK/blob/master/c%2B%2B/src/dynamixel_sdk/port_handler_linux.cpp diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_amy.yaml b/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_amy.yaml deleted file mode 100644 index bc7d27ad38..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_amy.yaml +++ /dev/null @@ -1,22 +0,0 @@ -pressure_converter: - ros__parameters: - zero_r: - - -27455372.92 - - 14459386.46 - - 17952654.76 - - -10605254.74 - zero_l: - - -14063383.6 - - 30331751.92 - - -2034247.26 - - 48130515.2 - scale_r: - - 2.879445523352348e-06 - - -2.252145560713656e-05 - - -2.754225471994077e-06 - - 2.763926644524643e-06 - scale_l: - - 2.879445523352348e-06 - - -2.252145560713656e-05 - - -2.754225471994077e-06 - - 2.763926644524643e-06 \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_converter.yaml b/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_converter.yaml deleted file mode 100644 index 750a7bb605..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_converter.yaml +++ /dev/null @@ -1,7 +0,0 @@ -pressure_converter: - ros__parameters: - left_topic: "/foot_pressure_left" - right_topic: "/foot_pressure_right" - average: 5 - scale_and_zero_average: 50 - cop_threshold: 5.0 diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_melody.yaml b/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_melody.yaml deleted file mode 100644 index 473d246778..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_melody.yaml +++ /dev/null @@ -1,22 +0,0 @@ -pressure_converter: - ros__parameters: - zero_r: - - -27455372.92 - - 14459386.46 - - 17952654.76 - - -10605254.74 - zero_l: - - -14063383.6 - - 30331751.92 - - -2034247.26 - - 48130515.2 - scale_r: - - 2.879445523352348e-06 - - -2.252145560713656e-05 - - -2.754225471994077e-06 - - 2.763926644524643e-06 - scale_l: - - 2.879445523352348e-06 - - -2.252145560713656e-05 - - -2.754225471994077e-06 - - 2.763926644524643e-06 \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_nobot.yaml b/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_nobot.yaml deleted file mode 100644 index b70902cfc8..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_nobot.yaml +++ /dev/null @@ -1,22 +0,0 @@ -pressure_converter: - ros__parameters: - zero_r: - - 48308998.54257341 - - -55854838.35192279 - - 98076369.19309235 - - -39246077.40848633 - zero_l: - - -67084141.6669952 - - 56469139.33715566 - - -85340727.53204206 - - -6584181.771324467 - scale_r: - - -5.719128286267938e-08 - - -3.441808570613519e-08 - - 3.580081515665939e-08 - - 3.67922464123119e-08 - scale_l: - - -5.719128286267938e-08 - - -3.441808570613519e-08 - - 3.580081515665939e-08 - - 3.67922464123119e-08 \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_rory.yaml b/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_rory.yaml deleted file mode 100644 index b70902cfc8..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/pressure_rory.yaml +++ /dev/null @@ -1,22 +0,0 @@ -pressure_converter: - ros__parameters: - zero_r: - - 48308998.54257341 - - -55854838.35192279 - - 98076369.19309235 - - -39246077.40848633 - zero_l: - - -67084141.6669952 - - 56469139.33715566 - - -85340727.53204206 - - -6584181.771324467 - scale_r: - - -5.719128286267938e-08 - - -3.441808570613519e-08 - - 3.580081515665939e-08 - - 3.67922464123119e-08 - scale_l: - - -5.719128286267938e-08 - - -3.441808570613519e-08 - - 3.580081515665939e-08 - - 3.67922464123119e-08 \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_imu.rviz b/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_imu.rviz deleted file mode 100644 index 6a414a2b07..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_imu.rviz +++ /dev/null @@ -1,173 +0,0 @@ -Panels: - - Class: rviz_common/Displays - Help Height: 70 - Name: Displays - Property Tree Widget: - Expanded: - - /Global Options1 - - /Status1 - - /Imu1 - - /Imu1/Box properties1 - - /Imu1/Axes properties1 - - /Imu1/Acceleration properties1 - - /Axes1 - Splitter Ratio: 0.5 - Tree Height: 847 - - Class: rviz_common/Selection - Name: Selection - - Class: rviz_common/Tool Properties - Expanded: - - /2D Goal Pose1 - - /Publish Point1 - Name: Tool Properties - Splitter Ratio: 0.5886790156364441 - - Class: rviz_common/Views - Expanded: - - /Current View1 - Name: Views - Splitter Ratio: 0.5 - - Class: rviz_common/Time - Experimental: false - Name: Time - SyncMode: 0 - SyncSource: "" -Visualization Manager: - Class: "" - Displays: - - Alpha: 0.5 - Cell Size: 1 - Class: rviz_default_plugins/Grid - Color: 160; 160; 164 - Enabled: true - Line Style: - Line Width: 0.029999999329447746 - Value: Lines - Name: Grid - Normal Cell Count: 0 - Offset: - X: 0 - Y: 0 - Z: 0 - Plane: XY - Plane Cell Count: 10 - Reference Frame: - Value: true - - Acceleration properties: - Acc. vector alpha: 1 - Acc. vector color: 255; 0; 0 - Acc. vector scale: 0.10000000149011612 - Derotate acceleration: true - Enable acceleration: true - Axes properties: - Axes scale: 0.5 - Enable axes: true - Box properties: - Box alpha: 1 - Box color: 255; 0; 0 - Enable box: false - x_scale: 1 - y_scale: 1 - z_scale: 1 - Class: rviz_imu_plugin/Imu - Enabled: true - Name: Imu - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /imu/data - Value: true - fixed_frame_orientation: true - - Class: rviz_default_plugins/Axes - Enabled: true - Length: 0.5 - Name: Axes - Radius: 0.05000000074505806 - Reference Frame: - Value: true - Enabled: true - Global Options: - Background Color: 48; 48; 48 - Fixed Frame: base_link - Frame Rate: 30 - Name: root - Tools: - - Class: rviz_default_plugins/Interact - Hide Inactive Objects: true - - Class: rviz_default_plugins/MoveCamera - - Class: rviz_default_plugins/Select - - Class: rviz_default_plugins/FocusCamera - - Class: rviz_default_plugins/Measure - Line color: 128; 128; 0 - - Class: rviz_default_plugins/SetInitialPose - Covariance x: 0.25 - Covariance y: 0.25 - Covariance yaw: 0.06853891909122467 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /initialpose - - Class: rviz_default_plugins/SetGoal - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /goal_pose - - Class: rviz_default_plugins/PublishPoint - Single click: true - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /clicked_point - Transformation: - Current: - Class: rviz_default_plugins/TF - Value: true - Views: - Current: - Class: rviz_default_plugins/Orbit - Distance: 2.855546474456787 - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Focal Point: - X: 0.07632534205913544 - Y: 0.06007763743400574 - Z: 0.12721984088420868 - Focal Shape Fixed Size: true - Focal Shape Size: 0.05000000074505806 - Invert Z Axis: false - Name: Current View - Near Clip Distance: 0.009999999776482582 - Pitch: 0.4053983688354492 - Target Frame: - Value: Orbit (rviz) - Yaw: 4.903592586517334 - Saved: ~ -Window Geometry: - Displays: - collapsed: false - Height: 1136 - Hide Left Dock: false - Hide Right Dock: false - QMainWindow State: 000000ff00000000fd000000040000000000000285000003d2fc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d000003d2000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d0061006700650000000128000002e70000000000000000000000010000010f000003d2fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d000003d2000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007360000003efc0100000002fb0000000800540069006d0065010000000000000736000002fb00fffffffb0000000800540069006d0065010000000000000450000000000000000000000396000003d200000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Selection: - collapsed: false - Time: - collapsed: false - Tool Properties: - collapsed: false - Views: - collapsed: false - Width: 1846 - X: 74 - Y: 27 diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_interactive_imu.rviz b/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_interactive_imu.rviz deleted file mode 100644 index f3ec17e222..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_interactive_imu.rviz +++ /dev/null @@ -1,175 +0,0 @@ -Panels: - - Class: rviz/Displays - Help Height: 78 - Name: Displays - Property Tree Widget: - Expanded: - - /Global Options1 - - /InteractiveMarkers1 - - /Axes1 - Splitter Ratio: 0.5 - Tree Height: 828 - - Class: rviz/Selection - Name: Selection - - Class: rviz/Tool Properties - Expanded: - - /2D Pose Estimate1 - - /2D Nav Goal1 - - /Publish Point1 - Name: Tool Properties - Splitter Ratio: 0.5886790156364441 - - Class: rviz/Views - Expanded: - - /Current View1 - Name: Views - Splitter Ratio: 0.5 - - Class: rviz/Time - Experimental: false - Name: Time - SyncMode: 0 - SyncSource: "" -Preferences: - PromptSaveOnExit: true -Toolbars: - toolButtonStyle: 2 -Visualization Manager: - Class: "" - Displays: - - Alpha: 0.5 - Cell Size: 1 - Class: rviz/Grid - Color: 160; 160; 164 - Enabled: false - Line Style: - Line Width: 0.029999999329447746 - Value: Lines - Name: Grid - Normal Cell Count: 0 - Offset: - X: 0 - Y: 0 - Z: 0 - Plane: XY - Plane Cell Count: 100 - Reference Frame: - Value: false - - Alpha: 1 - Class: rviz/RobotModel - Collision Enabled: false - Enabled: false - Links: - All Links Enabled: true - Expand Joint Details: false - Expand Link Details: false - Expand Tree: false - Link Tree Style: Links in Alphabetic Order - Name: RobotModel - Robot Description: robot_description - TF Prefix: "" - Update Interval: 0 - Value: false - Visual Enabled: true - - Class: rviz/TF - Enabled: false - Frame Timeout: 15 - Frames: - All Enabled: true - Marker Scale: 0.20000000298023224 - Name: TF - Show Arrows: true - Show Axes: true - Show Names: false - Tree: - {} - Update Interval: 0 - Value: false - - Class: rviz/Marker - Enabled: false - Marker Topic: visualization_marker - Name: Marker - Namespaces: - {} - Queue Size: 100 - Value: false - - Class: rviz/InteractiveMarkers - Enable Transparency: true - Enabled: true - Name: InteractiveMarkers - Show Axes: true - Show Descriptions: true - Show Visual Aids: false - Update Topic: /interactive_imu/update - Value: true - - Class: rviz/Axes - Enabled: true - Length: 1 - Name: Axes - Radius: 0.10000000149011612 - Reference Frame: - Value: true - Enabled: true - Global Options: - Background Color: 48; 48; 48 - Default Light: true - Fixed Frame: imu_frame - Frame Rate: 30 - Name: root - Tools: - - Class: rviz/Interact - Hide Inactive Objects: true - - Class: rviz/MoveCamera - - Class: rviz/Select - - Class: rviz/FocusCamera - - Class: rviz/Measure - - Class: rviz/SetInitialPose - Theta std deviation: 0.2617993950843811 - Topic: /initialpose - X std deviation: 0.5 - Y std deviation: 0.5 - - Class: rviz/SetGoal - Topic: /move_base_simple/goal - - Class: rviz/PublishPoint - Single click: true - Topic: /clicked_point - Value: true - Views: - Current: - Class: rviz/ThirdPersonFollower - Distance: 5.466794013977051 - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Focal Point: - X: -0.25074559450149536 - Y: 0.15042972564697266 - Z: -0.4000089764595032 - Focal Shape Fixed Size: false - Focal Shape Size: 0.05000000074505806 - Invert Z Axis: false - Name: Current View - Near Clip Distance: 0.009999999776482582 - Pitch: 0.2552035450935364 - Target Frame: base_link - Value: ThirdPersonFollower (rviz) - Yaw: 1.6063202619552612 - Saved: ~ -Window Geometry: - Displays: - collapsed: false - Height: 1136 - Hide Left Dock: false - Hide Right Dock: false - QMainWindow State: 000000ff00000000fd000000040000000000000268000003ccfc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005e00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c0061007900730100000040000003cc000000ce00fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000003ccfc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a005600690065007700730100000040000003cc000000ac00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007800000003efc0100000002fb0000000800540069006d00650100000000000007800000025700fffffffb0000000800540069006d00650100000000000004500000000000000000000003fd000003cc00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Selection: - collapsed: false - Time: - collapsed: false - Tool Properties: - collapsed: false - Views: - collapsed: false - Width: 1920 - X: 1680 - Y: 27 diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_pressure.rviz b/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_pressure.rviz deleted file mode 100644 index 1d34f01d53..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_pressure.rviz +++ /dev/null @@ -1,618 +0,0 @@ -Panels: - - Class: rviz_common/Displays - Help Height: 78 - Name: Displays - Property Tree Widget: - Expanded: - - /Global Options1 - - /Status1 - - /RobotModel1 - - /left1 - - /left1/PointStamped1 - - /left1/Wrench1 - - /left1/Wrench2 - - /left1/Wrench3 - - /left1/Wrench4 - - /left1/Wrench5 - - /right1/PointStamped1 - - /right1/Wrench1 - - /right1/Wrench2 - - /right1/Wrench3 - - /right1/Wrench4 - - /right1/Wrench5 - Splitter Ratio: 0.5 - Tree Height: 719 - - Class: rviz_common/Selection - Name: Selection - - Class: rviz_common/Tool Properties - Expanded: - - /2D Goal Pose1 - - /Publish Point1 - Name: Tool Properties - Splitter Ratio: 0.5886790156364441 - - Class: rviz_common/Views - Expanded: - - /Current View1 - Name: Views - Splitter Ratio: 0.5 - - Class: rviz_common/Time - Experimental: false - Name: Time - SyncMode: 0 - SyncSource: "" -Visualization Manager: - Class: "" - Displays: - - Alpha: 0.5 - Cell Size: 1 - Class: rviz_default_plugins/Grid - Color: 160; 160; 164 - Enabled: true - Line Style: - Line Width: 0.029999999329447746 - Value: Lines - Name: Grid - Normal Cell Count: 0 - Offset: - X: 0 - Y: 0 - Z: 0 - Plane: XY - Plane Cell Count: 10 - Reference Frame: - Value: true - - Alpha: 1 - Class: rviz_default_plugins/RobotModel - Collision Enabled: false - Description File: "" - Description Source: Topic - Description Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /robot_description - Enabled: true - Links: - All Links Enabled: true - Expand Joint Details: false - Expand Link Details: false - Expand Tree: false - Link Tree Style: Links in Alphabetic Order - base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera: - Alpha: 1 - Show Axes: false - Show Trail: false - head: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - imu_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - imu_frame_2: - Alpha: 1 - Show Axes: false - Show Trail: false - l_ankle: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_cleat_l_back: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_l_front: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_r_back: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_r_front: - Alpha: 1 - Show Axes: false - Show Trail: false - l_foot: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_hip_1: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_hip_2: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_lower_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_lower_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_shoulder: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_sole: - Alpha: 1 - Show Axes: false - Show Trail: false - l_toe: - Alpha: 1 - Show Axes: false - Show Trail: false - l_upper_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_upper_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_wrist: - Alpha: 1 - Show Axes: false - Show Trail: false - llb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - llf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - lrb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - lrf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - neck: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_ankle: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_cleat_l_back: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_l_front: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_r_back: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_r_front: - Alpha: 1 - Show Axes: false - Show Trail: false - r_foot: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_hip_1: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_hip_2: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_lower_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_lower_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_shoulder: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_sole: - Alpha: 1 - Show Axes: false - Show Trail: false - r_toe: - Alpha: 1 - Show Axes: false - Show Trail: false - r_upper_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_upper_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_wrist: - Alpha: 1 - Show Axes: false - Show Trail: false - rlb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rlf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rrb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rrf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - torso: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - Mass Properties: - Inertia: false - Mass: false - Name: RobotModel - TF Prefix: "" - Update Interval: 0 - Value: true - Visual Enabled: true - - Class: rviz_common/Group - Displays: - - Alpha: 1 - Class: rviz_default_plugins/PointStamped - Color: 204; 41; 204 - Enabled: true - History Length: 1 - Name: PointStamped - Radius: 0.10000000149011612 - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /cop_l - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.5 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_left/wrench/cop - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_left/wrench/l_back - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_left/wrench/l_front - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_left/wrench/r_back - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_left/wrench/r_front - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - Enabled: true - Name: left - - Class: rviz_common/Group - Displays: - - Alpha: 1 - Class: rviz_default_plugins/PointStamped - Color: 204; 41; 204 - Enabled: true - History Length: 1 - Name: PointStamped - Radius: 0.03999999910593033 - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /cop_r - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_right/wrench/cop - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_right/wrench/l_back - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_right/wrench/l_front - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_right/wrench/r_back - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - - Accept NaN Values: false - Alpha: 1 - Arrow Width: 0.10000000149011612 - Class: rviz_default_plugins/Wrench - Enabled: true - Force Arrow Scale: 0.10000000149011612 - Force Color: 204; 51; 51 - History Length: 1 - Name: Wrench - Topic: - Depth: 5 - Durability Policy: Volatile - Filter size: 10 - History Policy: Keep Last - Reliability Policy: Reliable - Value: /foot_pressure_right/wrench/r_front - Torque Arrow Scale: 2 - Torque Color: 204; 204; 51 - Value: true - Enabled: true - Name: right - Enabled: true - Global Options: - Background Color: 48; 48; 48 - Fixed Frame: l_sole - Frame Rate: 30 - Name: root - Tools: - - Class: rviz_default_plugins/Interact - Hide Inactive Objects: true - - Class: rviz_default_plugins/MoveCamera - - Class: rviz_default_plugins/Select - - Class: rviz_default_plugins/FocusCamera - - Class: rviz_default_plugins/Measure - Line color: 128; 128; 0 - - Class: rviz_default_plugins/SetInitialPose - Covariance x: 0.25 - Covariance y: 0.25 - Covariance yaw: 0.06853891909122467 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /initialpose - - Class: rviz_default_plugins/SetGoal - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /goal_pose - - Class: rviz_default_plugins/PublishPoint - Single click: true - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /clicked_point - Transformation: - Current: - Class: rviz_default_plugins/TF - Value: true - Views: - Current: - Class: rviz_default_plugins/Orbit - Distance: 1.4682596921920776 - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Focal Point: - X: 0.09434399753808975 - Y: -0.01062153559178114 - Z: 0.27810409665107727 - Focal Shape Fixed Size: true - Focal Shape Size: 0.05000000074505806 - Invert Z Axis: false - Name: Current View - Near Clip Distance: 0.009999999776482582 - Pitch: 0.2447969615459442 - Target Frame: - Value: Orbit (rviz) - Yaw: 6.208591461181641 - Saved: ~ -Window Geometry: - Displays: - collapsed: false - Height: 1016 - Hide Left Dock: false - Hide Right Dock: false - QMainWindow State: 000000ff00000000fd0000000400000000000002e00000035afc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed0000026400000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d0000035a000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f0000035afc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d0000035a000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007360000003efc0100000002fb0000000800540069006d0065010000000000000736000002fb00fffffffb0000000800540069006d006501000000000000045000000000000000000000033b0000035a00000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Selection: - collapsed: false - Time: - collapsed: false - Tool Properties: - collapsed: false - Views: - collapsed: false - Width: 1846 - X: 74 - Y: 27 diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_servos.rviz b/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_servos.rviz deleted file mode 100644 index 28bc6c1bd9..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/rviz_servos.rviz +++ /dev/null @@ -1,557 +0,0 @@ -Panels: - - Class: rviz_common/Displays - Help Height: 70 - Name: Displays - Property Tree Widget: - Expanded: - - /Global Options1 - - /Status1 - Splitter Ratio: 0.5 - Tree Height: 847 - - Class: rviz_common/Selection - Name: Selection - - Class: rviz_common/Tool Properties - Expanded: - - /2D Goal Pose1 - - /Publish Point1 - Name: Tool Properties - Splitter Ratio: 0.5886790156364441 - - Class: rviz_common/Views - Expanded: - - /Current View1 - Name: Views - Splitter Ratio: 0.5 - - Class: rviz_common/Time - Experimental: false - Name: Time - SyncMode: 0 - SyncSource: "" -Visualization Manager: - Class: "" - Displays: - - Alpha: 0.5 - Cell Size: 1 - Class: rviz_default_plugins/Grid - Color: 160; 160; 164 - Enabled: true - Line Style: - Line Width: 0.029999999329447746 - Value: Lines - Name: Grid - Normal Cell Count: 0 - Offset: - X: 0 - Y: 0 - Z: 0 - Plane: XY - Plane Cell Count: 10 - Reference Frame: - Value: true - - Alpha: 1 - Class: rviz_default_plugins/RobotModel - Collision Enabled: false - Description File: "" - Description Source: Topic - Description Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /robot_description - Enabled: true - Links: - All Links Enabled: true - Expand Joint Details: false - Expand Link Details: false - Expand Tree: false - Link Tree Style: Links in Alphabetic Order - base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera: - Alpha: 1 - Show Axes: false - Show Trail: false - head: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - imu_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - imu_frame_2: - Alpha: 1 - Show Axes: false - Show Trail: false - l_ankle: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_cleat_l_back: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_l_front: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_r_back: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_r_front: - Alpha: 1 - Show Axes: false - Show Trail: false - l_foot: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_hip_1: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_hip_2: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_lower_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_lower_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_shoulder: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_sole: - Alpha: 1 - Show Axes: false - Show Trail: false - l_toe: - Alpha: 1 - Show Axes: false - Show Trail: false - l_upper_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_upper_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_wrist: - Alpha: 1 - Show Axes: false - Show Trail: false - llb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - llf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - lrb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - lrf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - neck: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_ankle: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_cleat_l_back: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_l_front: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_r_back: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_r_front: - Alpha: 1 - Show Axes: false - Show Trail: false - r_foot: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_hip_1: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_hip_2: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_lower_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_lower_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_shoulder: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_sole: - Alpha: 1 - Show Axes: false - Show Trail: false - r_toe: - Alpha: 1 - Show Axes: false - Show Trail: false - r_upper_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_upper_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_wrist: - Alpha: 1 - Show Axes: false - Show Trail: false - rlb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rlf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rrb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rrf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - torso: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - Mass Properties: - Inertia: false - Mass: false - Name: RobotModel - TF Prefix: "" - Update Interval: 0 - Value: true - Visual Enabled: true - - Class: rviz_default_plugins/TF - Enabled: true - Frame Timeout: 15 - Frames: - All Enabled: true - base_footprint: - Value: true - base_link: - Value: true - camera: - Value: true - camera_optical_frame: - Value: true - head: - Value: true - imu_frame: - Value: true - imu_frame_2: - Value: true - l_ankle: - Value: true - l_cleat_l_back: - Value: true - l_cleat_l_front: - Value: true - l_cleat_r_back: - Value: true - l_cleat_r_front: - Value: true - l_foot: - Value: true - l_hip_1: - Value: true - l_hip_2: - Value: true - l_lower_arm: - Value: true - l_lower_leg: - Value: true - l_shoulder: - Value: true - l_sole: - Value: true - l_toe: - Value: true - l_upper_arm: - Value: true - l_upper_leg: - Value: true - l_wrist: - Value: true - llb: - Value: true - llf: - Value: true - lrb: - Value: true - lrf: - Value: true - neck: - Value: true - odom: - Value: true - r_ankle: - Value: true - r_cleat_l_back: - Value: true - r_cleat_l_front: - Value: true - r_cleat_r_back: - Value: true - r_cleat_r_front: - Value: true - r_foot: - Value: true - r_hip_1: - Value: true - r_hip_2: - Value: true - r_lower_arm: - Value: true - r_lower_leg: - Value: true - r_shoulder: - Value: true - r_sole: - Value: true - r_toe: - Value: true - r_upper_arm: - Value: true - r_upper_leg: - Value: true - r_wrist: - Value: true - rlb: - Value: true - rlf: - Value: true - rrb: - Value: true - rrf: - Value: true - torso: - Value: true - Marker Scale: 0.20000000298023224 - Name: TF - Show Arrows: true - Show Axes: true - Show Names: false - Tree: - odom: - base_link: - base_footprint: - {} - torso: - imu_frame: - {} - l_hip_1: - l_hip_2: - l_upper_leg: - l_lower_leg: - l_ankle: - l_foot: - l_sole: - {} - l_toe: - {} - llb: - l_cleat_l_back: - {} - llf: - l_cleat_l_front: - {} - lrb: - l_cleat_r_back: - {} - lrf: - l_cleat_r_front: - {} - l_shoulder: - l_upper_arm: - l_lower_arm: - l_wrist: - {} - neck: - head: - camera: - camera_optical_frame: - {} - imu_frame_2: - {} - r_hip_1: - r_hip_2: - r_upper_leg: - r_lower_leg: - r_ankle: - r_foot: - r_sole: - {} - r_toe: - {} - rlb: - r_cleat_l_back: - {} - rlf: - r_cleat_l_front: - {} - rrb: - r_cleat_r_back: - {} - rrf: - r_cleat_r_front: - {} - r_shoulder: - r_upper_arm: - r_lower_arm: - r_wrist: - {} - Update Interval: 0 - Value: true - Enabled: true - Global Options: - Background Color: 48; 48; 48 - Fixed Frame: base_link - Frame Rate: 30 - Name: root - Tools: - - Class: rviz_default_plugins/Interact - Hide Inactive Objects: true - - Class: rviz_default_plugins/MoveCamera - - Class: rviz_default_plugins/Select - - Class: rviz_default_plugins/FocusCamera - - Class: rviz_default_plugins/Measure - Line color: 128; 128; 0 - - Class: rviz_default_plugins/SetInitialPose - Covariance x: 0.25 - Covariance y: 0.25 - Covariance yaw: 0.06853891909122467 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /initialpose - - Class: rviz_default_plugins/SetGoal - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /goal_pose - - Class: rviz_default_plugins/PublishPoint - Single click: true - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /clicked_point - Transformation: - Current: - Class: rviz_default_plugins/TF - Value: true - Views: - Current: - Class: rviz_default_plugins/Orbit - Distance: 1.9459749460220337 - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Focal Point: - X: 0.07632534205913544 - Y: 0.06007763743400574 - Z: 0.12721984088420868 - Focal Shape Fixed Size: true - Focal Shape Size: 0.05000000074505806 - Invert Z Axis: false - Name: Current View - Near Clip Distance: 0.009999999776482582 - Pitch: 0.4103982448577881 - Target Frame: - Value: Orbit (rviz) - Yaw: 4.728577136993408 - Saved: ~ -Window Geometry: - Displays: - collapsed: false - Height: 1136 - Hide Left Dock: false - Hide Right Dock: false - QMainWindow State: 000000ff00000000fd000000040000000000000285000003d2fc0200000009fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d000003d2000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261fb0000000a0049006d0061006700650000000128000002e70000000000000000000000010000010f000003d2fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d000003d2000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007360000003efc0100000002fb0000000800540069006d0065010000000000000736000002fb00fffffffb0000000800540069006d0065010000000000000450000000000000000000000396000003d200000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Selection: - collapsed: false - Time: - collapsed: false - Tool Properties: - collapsed: false - Views: - collapsed: false - Width: 1846 - X: 74 - Y: 27 diff --git a/src/bitbots_lowlevel/bitbots_ros_control/config/wolfgang.yaml b/src/bitbots_lowlevel/bitbots_ros_control/config/wolfgang.yaml deleted file mode 100644 index d227fab9c6..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/config/wolfgang.yaml +++ /dev/null @@ -1,306 +0,0 @@ -wolfgang_hardware_interface: - ros__parameters: - control_loop_hz: 500.0 - start_delay: 2.0 # delay after the motor power is turned on until values are written, in seconds - - port_info: - port0: - device_file: /dev/ttyUSB0 - baudrate: 1000000 - protocol_version: 2 - port1: - device_file: /dev/ttyUSB1 - baudrate: 1000000 - protocol_version: 2 - port2: - device_file: /dev/ttyUSB2 - baudrate: 1000000 - protocol_version: 2 - port3: - device_file: /dev/ttyUSB3 - baudrate: 1000000 - protocol_version: 2 - - # specification of the connected dynamixel servos - servos: - # specifies which information should be read - read_position: true - read_velocity: false - read_effort: false - read_pwm: false - read_volt_temp: true # this also corresponds for the error byte - - VT_update_rate: 50 # how many normal (position) reads have to be performed before one time the temperature, voltage and error is read - warn_temp: 55.0 - warn_volt: 14.0 - - control_mode: position - auto_torque: true - - set_ROM_RAM: true # set the following values on startup to all motors - - ROM_RAM_DEFAULT: - # all names of parameters have to be the same as on the dynamixel table (see dynamixel_workbench_toolbox/src/dynamixel_item.cpp ) - # all values are directly values this means not Celsius or rad but the value used by the servo firmware see datasheet - # ROM - Return_Delay_Time: 0 # this is a stupid function which has always to be zero or nothing will work correctly anymore - Temperature_Limit: 80 # [about 1 deg C] - Max_Voltage_Limit: 160 #[About 0.1V] - Min_Voltage_Limit: 95 #[About 0.1V] - PWM_Limit: 885 # 885 = 100% - #Current_Limit: 2047 #[ 3.36 mA] #currently not used since MX-64 and MX-106 have different max values - #todo acceleration limit does not exist as register? - Acceleration_Limit: 32767 # [214.577 Rev/min2] - Velocity_Limit: 1023 # [0.229rpm] - Max_Position_Limit: 4095 # [0.088 deg] - Min_Position_Limit : 0 # [0.088 deg] - # RAM - Status_Return_Level: 2 # 0 status for all instructions(not sync or bulk), 1 ping and read, 2 only ping - Velocity_I_Gain: 1920 # [/ 65,536] - Velocity_P_Gain: 100 # [/128] - Position_D_Gain: 0 #2800 # [/16] 0~16,383 - Position_I_Gain: 0 #180000 # [/ 65,536] 0~16,383 - #If robot starts to tremble, reduce Position_P_Gain - Position_P_Gain: 1200 #1100 # [/ 128] 0~16,383 - Feedforward_2nd_Gain: 0 # [/4] - Feedforward_1st_Gain: 0 # [/4] - Profile_Acceleration: 0 # 0 for infinite - Profile_Velocity: 0 # 0 for infinite - - ROM_RAM_ARMS: - # all names of parameters have to be the same as on the dynamixel table (see dynamixel_workbench_toolbox/src/dynamixel_item.cpp ) - # all values are directly values this means not Celsius or rad but the value used by the servo firmware see datasheet - # ROM - Return_Delay_Time: 0 # this is a stupid function which has always to be zero or nothing will work correctly anymore - Temperature_Limit: 80 # [about 1 deg C] - Max_Voltage_Limit: 160 #[About 0.1V] - Min_Voltage_Limit: 95 #[About 0.1V] - PWM_Limit: 885 # 885 = 100% - #Current_Limit: 2047 #[ 3.36 mA] #currently not used since MX-64 and MX-106 have different max values - #todo acceleration limit does not exist as register? - Acceleration_Limit: 32767 # [214.577 Rev/min2] - Velocity_Limit: 1023 # [0.229rpm] - Max_Position_Limit: 4095 # [0.088 deg] - Min_Position_Limit : 0 # [0.088 deg] - # RAM - Status_Return_Level: 2 # 0 status for all instructions(not sync or bulk), 1 ping and read, 2 only ping - Velocity_I_Gain: 1920 # [/ 65,536] - Velocity_P_Gain: 100 # [/128] - Position_D_Gain: 0 #2800 # [/16] 0~16,383 - Position_I_Gain: 0 #180000 # [/ 65,536] 0~16,383 - #If robot starts to tremble, reduce Position_P_Gain - Position_P_Gain: 800 #1100 # [/ 128] 0~16,383 - Feedforward_2nd_Gain: 0 # [/4] - Feedforward_1st_Gain: 0 # [/4] - Profile_Acceleration: 0 # 0 for infinite - Profile_Velocity: 0 # 0 for infinite - - ROM_RAM_KNEES: # Because we use X-Series servos for the knees, we need to set different values - # all names of parameters have to be the same as on the dynamixel table (see dynamixel_workbench_toolbox/src/dynamixel_item.cpp ) - # all values are directly values this means not Celsius or rad but the value used by the servo firmware see datasheet - # ROM - Return_Delay_Time: 0 # this is a stupid function which has always to be zero or nothing will work correctly anymore - Temperature_Limit: 80 # [about 1 deg C] - Max_Voltage_Limit: 160 #[About 0.1V] - Min_Voltage_Limit: 95 #[About 0.1V] - PWM_Limit: 885 # 885 = 100% - #Current_Limit: 2047 #[ 3.36 mA] #currently not used since MX-64 and MX-106 have different max values - #todo acceleration limit does not exist as register? - Acceleration_Limit: 32767 # [214.577 Rev/min2] - Velocity_Limit: 1023 # [0.229rpm] - Max_Position_Limit: 4095 # [0.088 deg] - Min_Position_Limit : 0 # [0.088 deg] - # RAM - Status_Return_Level: 2 # 0 status for all instructions(not sync or bulk), 1 ping and read, 2 only ping - Velocity_I_Gain: 1920 # [/ 65,536] - Velocity_P_Gain: 100 # [/128] - Position_D_Gain: 0 #2800 # [/16] 0~16,383 - Position_I_Gain: 0 #180000 # [/ 65,536] 0~16,383 - #If robot starts to tremble, reduce Position_P_Gain - Position_P_Gain: 4000 #1100 # [/ 128] 0~16,383 - Feedforward_2nd_Gain: 0 # [/4] - Feedforward_1st_Gain: 0 # [/4] - Profile_Acceleration: 0 # 0 for infinite - Profile_Velocity: 0 # 0 for infinite - - ROM_RAM_HEAD: - # all names of parameters have to be the same as on the dynamixel table (see dynamixel_workbench_toolbox/src/dynamixel_item.cpp ) - # all values are directly values this means not Celsius or rad but the value used by the servo firmware see datasheet - # ROM - Return_Delay_Time: 0 # this is a stupid function which has always to be zero or nothing will work correctly anymore - Temperature_Limit: 80 # [about 1 deg C] - Max_Voltage_Limit: 160 #[About 0.1V] - Min_Voltage_Limit: 95 #[About 0.1V] - PWM_Limit: 885 # 885 = 100% - #Current_Limit: 2047 #[ 3.36 mA] #currently not used since MX-64 and MX-106 have different max values - #todo acceleration limit does not exist as register? - Acceleration_Limit: 32767 # [214.577 Rev/min2] - Velocity_Limit: 1023 # [0.229rpm] - Max_Position_Limit: 4095 # [0.088 deg] - Min_Position_Limit : 0 # [0.088 deg] - # RAM - Status_Return_Level: 2 # 0 status for all instructions(not sync or bulk), 1 ping and read, 2 only ping - Velocity_I_Gain: 1920 # [/ 65,536] - Velocity_P_Gain: 100 # [/128] - Position_D_Gain: 0 #2800 # [/16] 0~16,383 - Position_I_Gain: 0 #180000 # [/ 65,536] 0~16,383 - #If robot starts to tremble, reduce Position_P_Gain - Position_P_Gain: 500 #1100 # [/ 128] 0~16,383 - Feedforward_2nd_Gain: 0 # [/4] - Feedforward_1st_Gain: 0 # [/4] - Profile_Acceleration: 0 # 0 for infinite - Profile_Velocity: 0 # 0 for infinite - - imu: - do_adaptive_gain: False - do_bias_estimation: False - bias_alpha: 0.01 - accel_gain: 0.001 - - device_info: - Core: - id: 42 - model_number: 0xABBA - read_rate: 10 - interface_type: CORE - LEDs_core: - id: 42 - model_number: 0xABBA - interface_type: LED - number_of_LEDs: 3 - start_number: 0 - IMU_torso: - id: 241 - topic: imu/data - frame: imu_frame - model_number: 0xBAFF - interface_type: IMU - Buttons: - id: 241 - model_number: 0xBAFF - interface_type: Button - topic: /buttons - read_rate: 50 - LEDs: - id: 241 - model_number: 0xBAFF - interface_type: LED - number_of_LEDs: 3 - start_number: 3 - # Removed head imu at worldcup due to motorbus issues - #IMU_head: - # id: 242 - # topic: imu_head/data - # frame: imu_frame_2 - # model_number: 0xBAFF - # interface_type: IMU - RShoulderPitch: - id: 1 - model_number: 311 - mounting_offset: 0.0 - joint_offset: 0.0 - group: ARMS - LShoulderPitch: - id: 2 - model_number: 311 - mounting_offset: 0.0 - joint_offset: 0.0 - group: ARMS - RShoulderRoll: - id: 3 - model_number: 311 - mounting_offset: 0.0 - joint_offset: 0.0 - group: ARMS - LShoulderRoll: - id: 4 - model_number: 311 - mounting_offset: 0.0 - joint_offset: 0.0 - group: ARMS - RElbow: - id: 5 - model_number: 311 - mounting_offset: 0.0 - joint_offset: 0.0 - group: ARMS - LElbow: - id: 6 - model_number: 311 - mounting_offset: 0.0 - joint_offset: 0.0 - group: ARMS - RHipYaw: - id: 7 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - LHipYaw: - id: 8 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - RHipRoll: - id: 9 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - LHipRoll: - id: 10 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - RHipPitch: - id: 11 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - LHipPitch: - id: 12 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - RKnee: - id: 13 - model_number: 1100 - mounting_offset: 0.0 - joint_offset: 0.0 - group: KNEES - LKnee: - id: 14 - model_number: 1100 - mounting_offset: 0.0 - joint_offset: 0.0 - group: KNEES - RAnklePitch: - id: 15 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - LAnklePitch: - id: 16 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - RAnkleRoll: - id: 17 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - LAnkleRoll: - id: 18 - model_number: 321 - mounting_offset: 0.0 - joint_offset: 0.0 - HeadPan: - id: 19 - model_number: 311 - mounting_offset: 0.0 - joint_offset: 0.0 - group: HEAD - HeadTilt: - id: 20 - model_number: 311 - mounting_offset: 0.0 - joint_offset: 0.0 - group: HEAD diff --git a/src/bitbots_lowlevel/bitbots_ros_control/docs/conf.py b/src/bitbots_lowlevel/bitbots_ros_control/docs/conf.py deleted file mode 100644 index 0bf6043d8c..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/docs/conf.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Full list of options at http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import catkin_pkg.package -from exhale import utils - -package_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -catkin_package = catkin_pkg.package.parse_package( - os.path.join(package_dir, catkin_pkg.package.PACKAGE_MANIFEST_FILENAME) -) -sys.path.insert(0, os.path.abspath(os.path.join(package_dir, "src"))) - - -# -- Helper functions -------------------------------------------------------- - - -def count_files(): - """:returns tuple of (num_py, num_cpp)""" - num_py = 0 - num_cpp = 0 - - for _root, _dirs, files in os.walk(os.path.join(package_dir, "src")): - for f in files: - if f.endswith(".py"): - num_py += 1 - for _root, _dirs, files in os.walk(os.path.join(package_dir, "include")): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - num_cpp += 1 - - return num_py, num_cpp - - -# -- Project information ----------------------------------------------------- - -project = catkin_package.name -copyright = "2019, Bit-Bots" -author = ", ".join([a.name for a in catkin_package.authors]) - -# The short X.Y version -version = str(catkin_package.version) -# The full version, including alpha/beta/rc tags -release = str(catkin_package.version) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.doctest", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.coverage", - "sphinx.ext.imgmath", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# -- Exhale and Breath setup ------------------------------------------------- - -# Tell sphinx what the primary language being documented is. -num_files_py, num_files_cpp = count_files() -primary_domain = "py" if num_files_py >= num_files_cpp else "cpp" - -# Tell sphinx what the pygments highlight language should be. -highlight_language = primary_domain - -if num_files_cpp > 0: - extensions += [ - "breathe", - "exhale", - ] - - breathe_projects = {project: os.path.join("_build", "doxyoutput", "xml")} - breathe_default_project = project - - def specifications_for_kind(kind): - # Show all members for classes and structs - if kind == "class" or kind == "struct": - return [":members:", ":protected-members:", ":private-members:", ":undoc-members:"] - # An empty list signals to Exhale to use the defaults - else: - return [] - - exhale_args = { - # These arguments are required - "containmentFolder": "cppapi", - "rootFileName": "library_root.rst", - "rootFileTitle": "C++ Library API", - "doxygenStripFromPath": "..", - "customSpecificationsMapping": utils.makeCustomSpecificationsMapping(specifications_for_kind), - # Suggested optional arguments - "createTreeView": True, - "exhaleExecutesDoxygen": True, - "exhaleDoxygenStdin": "INPUT = {}".format(os.path.join(package_dir, "include")), - } - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = os.path.join("_static", "logo.png") -html_favicon = os.path.join("_static", "logo.png") - - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# -- RST Standard variables --------------------------------------------------- -rst_prolog = f".. |project| replace:: {project}\n" -rst_prolog += ".. |description| replace:: {}\n".format(catkin_package.description.replace("\n\n", "\n")) -rst_prolog += ".. |modindex| replace:: {}\n".format( - ":ref:`modindex`" if num_files_py > 0 else "Python module index is not available" -) diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/bitfoot_hardware_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/bitfoot_hardware_interface.hpp deleted file mode 100644 index 674ed64574..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/bitfoot_hardware_interface.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_BITFOOT_HARDWARE_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_BITFOOT_HARDWARE_INTERFACE_H_ - -#include - -#include -#include -#include -#include -#include -#include - -namespace bitbots_ros_control { - -class BitFootHardwareInterface : public bitbots_ros_control::HardwareInterface { - public: - explicit BitFootHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, int id, - std::string topic_name, std::string name); - - bool init(); - - void read(const rclcpp::Time& t, const rclcpp::Duration& dt); - - void write(const rclcpp::Time& t, const rclcpp::Duration& dt); - - private: - rclcpp::Node::SharedPtr nh_; - std::shared_ptr driver_; - - // always keep the lasts values to check if they different - std::vector> current_pressure_; - - rclcpp::Publisher::SharedPtr pressure_pub_; - - int id_; - std::string topic_name_; - std::string name_; - bitbots_msgs::msg::FootPressure msg_; - rclcpp::Publisher::SharedPtr diagnostic_pub_; - std::array data_; -}; -} // namespace bitbots_ros_control -#endif diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/button_hardware_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/button_hardware_interface.hpp deleted file mode 100644 index 079c556e35..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/button_hardware_interface.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_BUTTON_HARDWARE_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_BUTTON_HARDWARE_INTERFACE_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_ros_control { - -class ButtonHardwareInterface : public bitbots_ros_control::HardwareInterface { - public: - explicit ButtonHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, int id, - std::string topic, int read_rate_); - - bool init(); - void read(const rclcpp::Time& t, const rclcpp::Duration& dt); - void write(const rclcpp::Time& t, const rclcpp::Duration& dt); - - private: - rclcpp::Node::SharedPtr nh_; - int counter_ = 0; - - std::shared_ptr driver_; - int id_; - std::string topic_; - rclcpp::Publisher::SharedPtr button_pub_; - int read_rate_; - rclcpp::Publisher::SharedPtr diagnostic_pub_; - std::array data_; -}; -} // namespace bitbots_ros_control - -#endif diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/core_hardware_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/core_hardware_interface.hpp deleted file mode 100644 index a7af1cd341..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/core_hardware_interface.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_CORE_HARDWARE_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_CORE_HARDWARE_INTERFACE_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_ros_control { - -class CoreHardwareInterface : public bitbots_ros_control::HardwareInterface { - public: - explicit CoreHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, int id, - int read_rate); - - bool get_power_status(); - - bool init(); - - void read(const rclcpp::Time& t, const rclcpp::Duration& dt); - - void write(const rclcpp::Time& t, const rclcpp::Duration& dt); - void restoreAfterPowerCycle(); - - private: - rclcpp::Node::SharedPtr nh_; - bool switch_power(std::shared_ptr req, - std::shared_ptr resp); - - std::shared_ptr driver_; - - int id_; - int read_rate_; - int read_counter_; - std::array data_; - - bool requested_power_status_; - bool last_read_successful_; - std_msgs::msg::Bool power_switch_status_; - std_msgs::msg::Bool power_control_status_; - std_msgs::msg::Float64 VCC_; - std_msgs::msg::Float64 VBAT_; - std_msgs::msg::Float64MultiArray VBAT_individual_; - std_msgs::msg::Float64 VEXT_; - std_msgs::msg::Float64 VDXL_; - std_msgs::msg::Float64 current_; - - rclcpp::Publisher::SharedPtr diagnostic_pub_; - rclcpp::Publisher::SharedPtr power_pub_; - rclcpp::Publisher::SharedPtr vcc_pub_; - rclcpp::Publisher::SharedPtr vbat_pub_; - rclcpp::Publisher::SharedPtr vbat_individual_pub_; - rclcpp::Publisher::SharedPtr vext_pub_; - rclcpp::Publisher::SharedPtr vdxl_pub_; - rclcpp::Publisher::SharedPtr current_pub_; - - rclcpp::Service::SharedPtr power_switch_service_; -}; -} // namespace bitbots_ros_control -#endif diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/dynamixel_servo_hardware_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/dynamixel_servo_hardware_interface.hpp deleted file mode 100644 index 30495d02de..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/dynamixel_servo_hardware_interface.hpp +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_DYNAMIXEL_SERVO_HARDWARE_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_DYNAMIXEL_SERVO_HARDWARE_INTERFACE_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_ros_control { -template -std::string vecToString(const std::vector& vec) { - std::stringstream ss; - ss << "["; - for (unsigned int i = 0; i < vec.size(); ++i) { - ss << vec[i]; - if (i != vec.size() - 1) { - ss << ", "; - } - } - ss << "]"; - return ss.str(); -} - -struct State { - State() : position(0), velocity(0), effort(0) {} - double position; - double velocity; - double effort; -}; - -struct Joint { - std::string name; - State current; - State goal; -}; - -class DynamixelServoHardwareInterface : public bitbots_ros_control::HardwareInterface { - public: - explicit DynamixelServoHardwareInterface(rclcpp::Node::SharedPtr nh); - - bool init(); - void read(const rclcpp::Time& t, const rclcpp::Duration& dt); - void write(const rclcpp::Time& t, const rclcpp::Duration& dt); - void addBusInterface(std::shared_ptr bus); - void writeROMRAM(bool first_time); - - private: - rclcpp::Node::SharedPtr nh_; - std::vector> bus_interfaces_; - - void setTorqueCb(std_msgs::msg::Bool::SharedPtr enabled); - void individualTorqueCb(bitbots_msgs::msg::JointTorque msg); - void commandCb(const bitbots_msgs::msg::JointCommand& command_msg); - - std::vector goal_torque_individual_; - - ControlMode control_mode_; - - unsigned int joint_count_; - - std::vector joint_names_; - std::vector lower_joint_limits_; - std::vector upper_joint_limits_; - - std::vector goal_position_; - std::vector goal_effort_; - std::vector goal_velocity_; - std::vector goal_acceleration_; - - std::vector current_position_; - std::vector current_velocity_; - std::vector current_effort_; - std::vector current_pwm_; - std::vector current_input_voltage_; - std::vector current_temperature_; - std::vector current_error_; - - std::map joint_map_; - - bool torqueless_mode_; - - // subscriber / publisher - rclcpp::Subscription::SharedPtr set_torque_sub_; - rclcpp::Subscription::SharedPtr set_torque_indiv_sub_; - rclcpp::Subscription::SharedPtr sub_command_; - rclcpp::Publisher::SharedPtr pwm_pub_; - rclcpp::Publisher::SharedPtr joint_pub_; - - sensor_msgs::msg::JointState joint_state_msg_; - sensor_msgs::msg::JointState pwm_msg_; -}; -} // namespace bitbots_ros_control - -#endif diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/hardware_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/hardware_interface.hpp deleted file mode 100644 index 7c0771c114..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/hardware_interface.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// Created by 10bestman on 08.04.22. -// - -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_HARDWARE_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_HARDWARE_INTERFACE_H_ -#include - -namespace bitbots_ros_control { - -class HardwareInterface { - public: - virtual bool init() = 0; - - virtual void read(const rclcpp::Time& t, const rclcpp::Duration& dt) {}; - - virtual void write(const rclcpp::Time& t, const rclcpp::Duration& dt) {}; - - virtual void restoreAfterPowerCycle() {}; - - virtual ~HardwareInterface() {}; -}; -} // namespace bitbots_ros_control -#endif // BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_HARDWARE_INTERFACE_H_ diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/imu_hardware_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/imu_hardware_interface.hpp deleted file mode 100644 index 6fd4b775bb..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/imu_hardware_interface.hpp +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_IMU_HARDWARE_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_IMU_HARDWARE_INTERFACE_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_ros_control { - -class ImuHardwareInterface : public bitbots_ros_control::HardwareInterface { - public: - explicit ImuHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, int id, - std::string topic, std::string frame, std::string name); - - bool init(); - void read(const rclcpp::Time& t, const rclcpp::Duration& dt); - void write(const rclcpp::Time& t, const rclcpp::Duration& dt); - void restoreAfterPowerCycle(); - - private: - rclcpp::Node::SharedPtr nh_; - std::shared_ptr driver_; - int id_; - std::string topic_; - std::string frame_; - std::string name_; - std::array data_; - std::array accel_calib_data_; - - uint32_t last_seq_number_{}; - std::array orientation_{}; - std::array orientation_covariance_{}; - std::array angular_velocity_{}; - std::array angular_velocity_covariance_{}; - std::array linear_acceleration_{}; - std::array linear_acceleration_covariance_{}; - - diagnostic_msgs::msg::DiagnosticStatus status_imu_; - - bool write_ranges_ = false; - uint8_t gyro_range_, accel_range_; - - bool calibrate_gyro_ = false; - bool reset_gyro_calibration_ = false; - - bool write_complementary_filter_params_ = false; - bool do_adaptive_gain_, do_bias_estimation_; - float accel_gain_, bias_alpha_; - - bool calibrate_accel_ = false; - bool reset_accel_calibration_ = false; - - bool read_accel_calibration_ = false; - float accel_calib_threshold_read_; - float accel_calib_bias_[3]; - float accel_calib_scale_[3]; - - bool set_accel_calib_threshold_ = false; - float accel_calib_threshold_; - - rclcpp::Service::SharedPtr imu_ranges_service_; - rclcpp::Service::SharedPtr calibrate_gyro_service_; - rclcpp::Service::SharedPtr reset_gyro_calibration_service_; - rclcpp::Service::SharedPtr complementary_filter_params_service_; - rclcpp::Service::SharedPtr calibrate_accel_service_; - rclcpp::Service::SharedPtr reset_accel_calibration_service_; - rclcpp::Service::SharedPtr read_accel_calibration_service_; - rclcpp::Service::SharedPtr - set_accel_calib_threshold_service_; - - rclcpp::Publisher::SharedPtr imu_pub_; - rclcpp::Publisher::SharedPtr diagnostic_pub_; - sensor_msgs::msg::Imu imu_msg_; - - int diag_counter_; - - void setIMURanges(const std::shared_ptr req, - std::shared_ptr resp); - void calibrateGyro(const std::shared_ptr req, - std::shared_ptr resp); - void resetGyroCalibration(const std::shared_ptr req, - std::shared_ptr resp); - void setComplementaryFilterParams(const std::shared_ptr req, - std::shared_ptr resp); - void calibrateAccel(const std::shared_ptr req, - std::shared_ptr resp); - void resetAccelCalibraton(const std::shared_ptr req, - std::shared_ptr resp); - void readAccelCalibration(const std::shared_ptr req, - std::shared_ptr resp); - void setAccelCalibrationThreshold( - const std::shared_ptr req, - std::shared_ptr resp); -}; -} // namespace bitbots_ros_control -#endif diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/leds_hardware_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/leds_hardware_interface.hpp deleted file mode 100644 index 4cf94d0ded..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/leds_hardware_interface.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_LEDS_HARDWARE_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_LEDS_HARDWARE_INTERFACE_H_ - -#include - -#include -#include -#include -#include - -namespace bitbots_ros_control { - -class LedsHardwareInterface : public bitbots_ros_control::HardwareInterface { - public: - LedsHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, uint8_t id, - uint8_t num_leds, uint8_t start_number); - - bool init(); - void read(const rclcpp::Time& t, const rclcpp::Duration& dt); - void write(const rclcpp::Time& t, const rclcpp::Duration& dt); - - private: - rclcpp::Node::SharedPtr nh_; - std::shared_ptr driver_; - uint8_t id_; - uint8_t start_number_; - - bool write_leds_ = false; - std::vector leds_; - - rclcpp::Service::SharedPtr leds_service_; - void setLeds(const std::shared_ptr req, - std::shared_ptr resp); - void ledCb0(std_msgs::msg::ColorRGBA msg); - void ledCb1(std_msgs::msg::ColorRGBA msg); - void ledCb2(std_msgs::msg::ColorRGBA msg); - - rclcpp::Subscription::SharedPtr sub0_; - rclcpp::Subscription::SharedPtr sub1_; - rclcpp::Subscription::SharedPtr sub2_; -}; -} // namespace bitbots_ros_control -#endif \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/pressure_converter.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/pressure_converter.hpp deleted file mode 100644 index 9a5da0561a..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/pressure_converter.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class PressureConverter { - public: - PressureConverter(rclcpp::Node::SharedPtr nh, char side); - - private: - rclcpp::Node::SharedPtr nh_; - rclcpp::executors::StaticSingleThreadedExecutor sub_executor_; - rclcpp::CallbackGroup::SharedPtr sub_cbg_; - std::shared_ptr sub_executor_thread_; - rclcpp::Publisher::SharedPtr filtered_pub_; - rclcpp::Publisher::SharedPtr cop_pub_; - std::vector::SharedPtr> wrench_pubs_; - rclcpp::Subscription::SharedPtr sub_; - std::unique_ptr tf_broadcaster_; - - std::vector wrench_frames_; - std::vector zero_, scale_; - std::vector> previous_values_, zero_and_scale_values_; - bool save_zero_and_scale_values_; - int current_index_; - int average_, scale_and_zero_average_; - double cop_threshold_; - char side_; - std::string req_type_; - std::string scale_lr_, zero_lr_, cop_lr_, sole_lr_; - std::shared_ptr request_; - - rclcpp::Service::SharedPtr zero_service_; - rclcpp::Service::SharedPtr scale_service_; - - void pressureCallback(bitbots_msgs::msg::FootPressure pressure_raw); - void resetZeroAndScaleValues(); - bool zeroCallback(const std::shared_ptr req, - std::shared_ptr resp); - bool scaleCallback(const std::shared_ptr req, - std::shared_ptr resp); - void collectMessages(); - void saveYAML(); -}; diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/servo_bus_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/servo_bus_interface.hpp deleted file mode 100644 index 81b16f0344..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/servo_bus_interface.hpp +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_SERVO_BUS_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_SERVO_BUS_INTERFACE_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_ros_control { - -class ServoBusInterface : public bitbots_ros_control::HardwareInterface { - public: - explicit ServoBusInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, - std::vector> servos); - bool init(); - void read(const rclcpp::Time& t, const rclcpp::Duration& dt); - void write(const rclcpp::Time& t, const rclcpp::Duration& dt); - void restoreAfterPowerCycle(); - - bool loadDynamixels(); - bool writeROMRAM(bool first_time); - - void syncWritePWM(); - - void switchDynamixelControlMode(); - diagnostic_msgs::msg::DiagnosticStatus createServoDiagMsg(int id, char level, std::string message, - std::map map, std::string name); - void processVte(bool success); - - bool goal_torque_; - bool current_torque_; - void writeTorque(bool enabled); - void writeTorqueForServos(std::vector torque); - - bool syncReadPositions(); - bool syncReadVelocities(); - bool syncReadEfforts(); - bool syncReadPWMs(); - bool syncReadAll(); - bool syncReadVoltageAndTemp(); - bool syncReadError(); - - void syncWritePosition(); - void syncWriteVelocity(); - void syncWriteProfileVelocity(); - void syncWriteCurrent(); - void syncWriteProfileAcceleration(); - - rclcpp::Node::SharedPtr nh_; - std::vector data_sync_read_positions_; - std::vector data_sync_read_velocities_; - std::vector data_sync_read_efforts_; - std::vector data_sync_read_pwms_; - std::vector data_sync_read_error_; - std::vector sync_write_goal_position_; - std::vector sync_write_goal_velocity_; - std::vector sync_write_profile_velocity_; - std::vector sync_write_profile_acceleration_; - std::vector sync_write_goal_current_; - std::vector sync_write_goal_pwm_; - std::vector sync_read_all_data_; - - bool first_cycle_; - bool lost_servo_connection_; - ControlMode control_mode_; - - bool switch_individual_torque_; - - std::shared_ptr driver_; - // id, name, modelnumber, group - std::vector> servos_; - int joint_count_; - - std::vector goal_torque_individual_; - - std::vector joint_names_; - std::vector joint_ids_; - std::vector joint_mounting_offsets_; - std::vector joint_offsets_; - std::vector joint_groups_; // The group name for each joint - - std::vector goal_position_; - std::vector goal_effort_; - std::vector goal_velocity_; - std::vector goal_acceleration_; - - std::vector last_goal_position_; - std::vector last_goal_effort_; - std::vector last_goal_velocity_; - std::vector last_goal_acceleration_; - - bool read_position_; - bool read_velocity_; - bool read_effort_; - bool read_pwm_; - bool read_volt_temp_; - std::vector current_position_; - std::vector current_velocity_; - std::vector current_effort_; - std::vector current_pwm_; - std::vector current_input_voltage_; - std::vector current_temperature_; - std::vector current_error_; - - int read_vt_counter_; - int vt_update_rate_; - double warn_temp_; - double warn_volt_; - bool torqueless_mode_; - - int reading_errors_; - int reading_successes_; - rclcpp::Publisher::SharedPtr diagnostic_pub_; - rclcpp::Publisher::SharedPtr speak_pub_; -}; -} // namespace bitbots_ros_control -#endif // BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_SERVO_BUS_INTERFACE_H_ diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/utils.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/utils.hpp deleted file mode 100644 index eab409395d..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/utils.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_UTILS_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_UTILS_H_ - -#include -#include - -namespace bitbots_ros_control { - -enum ControlMode { POSITION_CONTROL, VELOCITY_CONTROL, EFFORT_CONTROL, CURRENT_BASED_POSITION_CONTROL }; - -bool stringToControlMode(rclcpp::Node::SharedPtr nh, const std::string& control_modestr, ControlMode& control_mode); -void speakError(rclcpp::Publisher::SharedPtr speak_pub, const std::string& text); - -uint16_t dxlMakeword(uint64_t a, uint64_t b); -uint32_t dxlMakedword(uint64_t a, uint64_t b); -float dxlMakeFloat(const uint8_t* data); - -std::string gyroRangeToString(uint8_t range); -std::string accelRangeToString(uint8_t range); -} // namespace bitbots_ros_control - -#endif // BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_UTILS_H_ diff --git a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/wolfgang_hardware_interface.hpp b/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/wolfgang_hardware_interface.hpp deleted file mode 100644 index d55f27e18c..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/include/bitbots_ros_control/wolfgang_hardware_interface.hpp +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_WOLFGANG_HARDWARE_INTERFACE_H_ -#define BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_WOLFGANG_HARDWARE_INTERFACE_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_ros_control { - -class WolfgangHardwareInterface { - public: - explicit WolfgangHardwareInterface(rclcpp::Node::SharedPtr nh); - - bool init(); - - void read(const rclcpp::Time& t, const rclcpp::Duration& dt); - - void write(const rclcpp::Time& t, const rclcpp::Duration& dt); - - private: - bool create_interfaces(std::vector> dxl_devices); - rclcpp::Node::SharedPtr nh_; - - // two dimensional list of all hardware interfaces, sorted by port - std::vector>> interfaces_; - DynamixelServoHardwareInterface servo_interface_; - rclcpp::Publisher::SharedPtr speak_pub_; - std::optional bus_start_time_; - bool bus_first_write_{false}; - - // prevent unnecessary error when power is turned on - bool first_ping_error_; - - bool only_imu_; - bool only_pressure_; - bool core_present_; - bool current_power_status_; - bool last_power_status_; - std::shared_ptr core_interface_; -}; -} // namespace bitbots_ros_control - -#endif // BITBOTS_ROS_CONTROL_INCLUDE_BITBOTS_ROS_CONTROL_WOLFGANG_HARDWARE_INTERFACE_H_ diff --git a/src/bitbots_lowlevel/bitbots_ros_control/launch/pressure_converter.launch b/src/bitbots_lowlevel/bitbots_ros_control/launch/pressure_converter.launch deleted file mode 100644 index acd4f3068f..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/launch/pressure_converter.launch +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/bitbots_lowlevel/bitbots_ros_control/launch/ros_control.launch b/src/bitbots_lowlevel/bitbots_ros_control/launch/ros_control.launch deleted file mode 100644 index f76b243c3f..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/launch/ros_control.launch +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_lowlevel/bitbots_ros_control/launch/ros_control_standalone.launch b/src/bitbots_lowlevel/bitbots_ros_control/launch/ros_control_standalone.launch deleted file mode 100644 index f1d5b8d237..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/launch/ros_control_standalone.launch +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_imu.launch b/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_imu.launch deleted file mode 100644 index 15f24f8b41..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_imu.launch +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_pressure.launch b/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_pressure.launch deleted file mode 100644 index 1d7f504aee..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_pressure.launch +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_servos.launch b/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_servos.launch deleted file mode 100644 index 8ca7e51c18..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/launch/viz_servos.launch +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/bitbots_lowlevel/bitbots_ros_control/package.xml b/src/bitbots_lowlevel/bitbots_ros_control/package.xml deleted file mode 100644 index ac969f877f..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/package.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - bitbots_ros_control - 2.2.4 - Hardware interface based the "dynamixel_workbench_ros_control" by Martin Oehler. It uses a modified version of the dynamixel_workbench to provide a higher update rate on the servo bus by using sync reads of multiple values. - - - Marc Bestmann - Hamburg Bit-Bots - - MIT - - Martin Oehler - Marc Bestmann - Hamburg Bit-Bots - - ament_cmake - - backward_ros - bitbots_buttons - bitbots_diagnostic - bitbots_docs - bitbots_msgs - bitbots_robot_description - bitbots_utils - controller_interface - controller_manager - dynamixel_workbench_toolbox - hardware_interface - bitbots_tts - pluginlib - rclcpp - std_msgs - system_monitor - transmission_interface - yaml-cpp - - imu_complementary_filter - rviz_imu_plugin - - - - - - tested_integration - c++ - - ament_cmake - - diff --git a/src/bitbots_lowlevel/bitbots_ros_control/scripts/battery_led.py b/src/bitbots_lowlevel/bitbots_ros_control/scripts/battery_led.py deleted file mode 100755 index b34b0413f2..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/scripts/battery_led.py +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env python3 - -import rclpy -from rclpy.node import Node -from std_msgs.msg import ColorRGBA, Float64 - -rclpy.init(args=None) -node = Node("battery_led") - -pub = node.create_publisher(ColorRGBA, "/led2", 1) - -led_full = ColorRGBA(a=1.0, r=0.0, g=0.0, b=1.0) -led_mid = ColorRGBA(a=1.0, r=0.0, g=1.0, b=0.0) -led_low = ColorRGBA(a=1.0, r=1.0, g=0.0, b=0.0) -led_no = ColorRGBA(a=1.0, r=0.0, g=0.0, b=0.0) - - -def vbat_cb(msg: Float64): - if msg.data > 16: - pub.publish(led_full) - elif msg.data > 14: - pub.publish(led_mid) - elif msg.data > 13: - pub.publish(led_low) - else: - pub.publish(led_no) - - -sub = node.create_subscription(Float64, "/core/vbat", vbat_cb, 1) -rclpy.spin(node) diff --git a/src/bitbots_lowlevel/bitbots_ros_control/scripts/imu_interactive_marker.py b/src/bitbots_lowlevel/bitbots_ros_control/scripts/imu_interactive_marker.py deleted file mode 100755 index 24603406d4..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/scripts/imu_interactive_marker.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python3 - -import rclpy -from geometry_msgs.msg import Pose -from interactive_markers.interactive_marker_server import InteractiveMarkerServer -from rclpy.node import Node -from sensor_msgs.msg import Imu -from visualization_msgs.msg import InteractiveMarker, InteractiveMarkerControl - - -def normalize_quaternion(quaternion_msg): - norm = quaternion_msg.x**2 + quaternion_msg.y**2 + quaternion_msg.z**2 + quaternion_msg.w**2 - s = norm ** (-0.5) - quaternion_msg.x *= s - quaternion_msg.y *= s - quaternion_msg.z *= s - quaternion_msg.w *= s - - -class IMUMarker(Node): - def __init__(self): - super().__init__("imu_marker") - self.marker_name = "IMU" - - # Publisher for the IMU data message (our output) - self.imu_publisher = self.create_publisher(Imu, "/imu/data", 1) - # Create the interactive marker server that will handle the IMU marker in RVIZ - self.server = InteractiveMarkerServer(self, "interactive_imu") - - # Initialize the marker, so that the quaternion is valid - self.pose = Pose() - self.pose.orientation.w = 1.0 - - # Create the interactive marker - int_marker = InteractiveMarker() - int_marker.header.frame_id = "odom" - int_marker.pose = self.pose - int_marker.scale = 1.0 - int_marker.name = self.marker_name - int_marker.description = "Rotate 2DOF to simulate IMU orientation to ground" - - # Create a control that allows to rotate the marker around the x-axis - control = InteractiveMarkerControl() - control.orientation.w = 1.0 - control.orientation.x = 1.0 - control.orientation.y = 0.0 - control.orientation.z = 0.0 - normalize_quaternion(control.orientation) - control.name = "rotate_x" - control.interaction_mode = InteractiveMarkerControl.ROTATE_AXIS - control.always_visible = True - int_marker.controls.append(control) - - # Create a control that allows to rotate the marker around the y-axis - control = InteractiveMarkerControl() - control.orientation.w = 1.0 - control.orientation.x = 0.0 - control.orientation.y = 0.0 - control.orientation.z = 1.0 - normalize_quaternion(control.orientation) - control.name = "rotate_y" - control.interaction_mode = InteractiveMarkerControl.ROTATE_AXIS - int_marker.controls.append(control) - - # Submit the marker to the server, so it can be displayed in RVIZ and we can receive feedback - self.server.insert(int_marker, feedback_callback=self.process_feedback) - - # Tell the server to apply the changes - self.server.applyChanges() - - # Create a timer that will publish the IMU data at a fixed rate - self.timer = self.create_timer(0.05, self.publish_imu_data) - - def process_feedback(self, feedback): - self.pose = feedback.pose - - def publish_imu_data(self): - imu_msg = Imu() - imu_msg.header.stamp = self.get_clock().now().to_msg() - imu_msg.header.frame_id = "imu" - imu_msg.orientation = self.pose.orientation - - self.imu_publisher.publish(imu_msg) - - -if __name__ == "__main__": - rclpy.init(args=None) - marker = IMUMarker() - # Run the executor (this will block until the node is shutdown) - rclpy.spin(marker) diff --git a/src/bitbots_lowlevel/bitbots_ros_control/scripts/led_error_blink.py b/src/bitbots_lowlevel/bitbots_ros_control/scripts/led_error_blink.py deleted file mode 100755 index 2491902663..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/scripts/led_error_blink.py +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env python3 - -import rclpy -from diagnostic_msgs.msg import DiagnosticStatus -from rclpy.duration import Duration -from rclpy.node import Node -from std_msgs.msg import ColorRGBA - -from bitbots_msgs.srv import Leds - -BLINK_DURATION = 0.2 -ERROR_TIMEOUT = 1 - -rclpy.init(args=None) -node = Node("led_error_blink") - -last_hardware_error_time = None -# true means warning, false error -warn_not_error = True -currently_blinking = False -leds_red = False -led_set_time = None - -# set up service and prepare requests -led_serv = node.create_client(Leds, "/set_leds") -red_request = Leds.Request() -red_leds_array = [] -for _i in range(3): - red_led = ColorRGBA() - red_led.r = 1.0 - red_led.a = 1.0 - red_leds_array.append(red_led) - -red_request.leds = red_leds_array - -orange_leds_array = [] -for _i in range(3): - orange_led = ColorRGBA() - orange_led.r = 1.0 - orange_led.g = 0.5 - orange_led.b = 0.0 - orange_led.a = 1.0 - orange_leds_array.append(orange_led) - -previous_req = Leds.Request() - - -def cb(msg: DiagnosticStatus): - global last_hardware_error_time, warn_not_error - # we check if any status in the received array is not ok - if msg.level != DiagnosticStatus.OK: - warn_not_error = msg.level == DiagnosticStatus.WARN - last_hardware_error_time = node.get_clock().now().to_sec() - - -def set_red(): - global leds_red, red_request, warn_not_error - leds_red = True - # set orange or red - if warn_not_error: - red_request.leds = orange_leds_array - else: - red_request.leds = red_leds_array - previous_req.leds = led_serv.call(red_request).previous_leds - - -def reset_leds(): - global leds_red, previous_req - leds_red = False - led_serv.call(previous_req) - - -# wait a moment on startup, otherwise we will think there is a problem while ros control is still booting -set_leds_service = node.create_client(Leds, "/set_leds") -set_leds_service.wait_for_service() -node.get_clock().sleep_for(Duration(seconds=1)) - -node.create_subscription(DiagnosticStatus, "/diagnostics_toplevel_state", cb, 1) - -rate = node.create_rate(100) -while rclpy.ok(): - if last_hardware_error_time is not None: - current_time = node.get_clock().now().to_sec() - if currently_blinking: - # we are currently blinking, check if the last hardware error is to long ago - if current_time - last_hardware_error_time > ERROR_TIMEOUT: - currently_blinking = False - reset_leds() - led_set_time = current_time - else: - if leds_red and current_time - led_set_time > BLINK_DURATION: - # reset LEDs - reset_leds() - led_set_time = current_time - elif not leds_red and current_time - led_set_time > BLINK_DURATION: - # set LEDs red - set_red() - led_set_time = current_time - else: - # we are not blinking, check if we want to start - if current_time - last_hardware_error_time < ERROR_TIMEOUT: - # start blinking - currently_blinking = True - set_red() - led_set_time = current_time - rate.sleep() diff --git a/src/bitbots_lowlevel/bitbots_ros_control/scripts/pose_check.py b/src/bitbots_lowlevel/bitbots_ros_control/scripts/pose_check.py deleted file mode 100755 index d9a037a222..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/scripts/pose_check.py +++ /dev/null @@ -1,363 +0,0 @@ -#!/usr/bin/env python3 - -""" -Moves the robots to a bunch of different poses to check if the robot is configured/build/calibrated as expected -""" - -import math -import os - -import rclpy -import rclpy.publisher -from ament_index_python import get_package_share_directory -from colorama import Back, Fore, Style -from rclpy.node import Node -from rclpy.publisher import Publisher - -from bitbots_msgs.msg import HeadMode, JointCommand - -SPEED: float = 1.0 -DYNAMIXEL_CMD_TOPIC = "/DynamixelController/command" -JOINT_NAMES = [ - "HeadPan", - "HeadTilt", - "LShoulderPitch", - "LShoulderRoll", - "LElbow", - "RShoulderPitch", - "RShoulderRoll", - "RElbow", - "LHipYaw", - "LHipRoll", - "LHipPitch", - "LKnee", - "LAnklePitch", - "LAnkleRoll", - "RHipYaw", - "RHipRoll", - "RHipPitch", - "RKnee", - "RAnklePitch", - "RAnkleRoll", -] - - -def num_to_emoji(num: int) -> str: - emoji_numbers = ["0️⃣", "1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣"] - return f"{''.join([emoji_numbers[int(digit)] for digit in str(num)])} " - - -def move_to_joint_position(publisher: Publisher, joint_goals: dict[str, float], offsets=True): - assert set(joint_goals.keys()) <= set(JOINT_NAMES), "Joint goals do not match the robots joints" - - # Init all joints with 0 - all_joint_goals = {joint: 0.0 for joint in JOINT_NAMES} - all_joint_goals.update(joint_goals) - - if offsets: - # offsets for straight legs - all_joint_goals["LHipPitch"] -= 0.327 - all_joint_goals["RHipPitch"] += 0.327 - all_joint_goals["LKnee"] -= 0.097 - all_joint_goals["RKnee"] += 0.097 - all_joint_goals["LAnklePitch"] += 0.084 - all_joint_goals["RAnklePitch"] -= 0.084 - - publisher.publish( - JointCommand( - joint_names=all_joint_goals.keys(), - velocities=[SPEED] * len(JOINT_NAMES), - accelerations=[-1.0] * len(JOINT_NAMES), - max_currents=[-1.0] * len(JOINT_NAMES), - positions=all_joint_goals.values(), - ) - ) - - -def main(): - rclpy.init(args=None) - node = Node("pose_check") - pub = node.create_publisher(JointCommand, DYNAMIXEL_CMD_TOPIC, 1) - - # Deactivate the head mover - head_mode_pub = node.create_publisher(HeadMode, "/head_mode", 1) - head_mode_pub.publish(HeadMode(head_mode=HeadMode.DONT_MOVE)) - - step = 1 - - # Show bitbot ascii art (TODO change to T-Posing Bit-Bot) - ascii_art = open(os.path.join(get_package_share_directory("bitbots_utils"), "config", "welcome_art.txt")).read() - - print( - f"\n\n{ascii_art}\n\n" - f"\n{Fore.LIGHTWHITE_EX}{Style.BRIGHT}{Back.BLUE} {Style.RESET_ALL}\n" - f"{Fore.LIGHTWHITE_EX}{Style.BRIGHT}{Back.BLUE} We now start with the calibration check! {Style.RESET_ALL}\n" - f"{Fore.LIGHTWHITE_EX}{Style.BRIGHT}{Back.BLUE} ======================================== {Style.RESET_ALL}\n" - f"{Fore.LIGHTWHITE_EX}{Style.BRIGHT}{Back.BLUE} {Style.RESET_ALL}\n\n" - f"{Fore.RED}Make sure that the surroundings are clear and the robot is able to move freely. " - f"Also be cautious and prepared to hold the robot in case it is not stable.\n{Style.RESET_ALL}" - ) - - try: - input( - f"{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move into a {Style.BRIGHT}t-pose.{Style.RESET_ALL} 🥵\n\n" - f"{Style.BRIGHT}Press enter to move." - ) - #################### ARMS and HEAD #################### - - ########## - # T-Pose # - ########## - - move_to_joint_position( - pub, - { - "LElbow": -math.pi / 2, - "LShoulderRoll": -math.pi / 2, - "RElbow": math.pi / 2, - "RShoulderRoll": math.pi / 2, - }, - ) - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - "- Check that all limbs are straight.\n" - "- Check that both sides of the robot are symmetrical.\n" - "- Check for backlash and loose parts.\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - ########################## - # Arms-To-The-Front-Pose # - ########################## - - step += 1 - input( - f"\n{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move {Style.BRIGHT}its arms to the front, its elbows to a 90 degree angle, and its headto the left.{Style.RESET_ALL}\n" - f"{Style.BRIGHT}Press enter to move.{Style.RESET_ALL}" - ) - - move_to_joint_position( - pub, - { - "LShoulderPitch": -math.pi / 2, - "RShoulderPitch": math.pi / 2, - "HeadPan": math.pi / 2, - }, - ) - - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - "- Check that the arms point to the front.\n" - "- Check that the elbows are at 90 degrees.\n" - "- Check that both arms are symmetrical.\n" - "- Check that the head looks 90 degrees to the left.\n" - "- Check that the head is horizontal.\n" - "- Check for backlash and loose parts.\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - ################## - # Arms-Down-Pose # - ################## - - step += 1 - input( - f"\n{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move {Style.BRIGHT}its arms and its head down.{Style.RESET_ALL}\n" - f"{Style.BRIGHT}Press enter to move.{Style.RESET_ALL}" - ) - - move_to_joint_position( - pub, - { - "LElbow": -math.pi / 2, - "RElbow": math.pi / 2, - "HeadTilt": -math.pi / 2, - }, - ) - - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - "- Check that all limbs are straight.\n" - "- Check that both arms are symmetrical.\n" - "- Check that the head is oriented to the front.\n" - "- Check that the head looks straight down in reference to the torso.\n" - "- Check for backlash and loose parts.\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - #################### LEGS #################### - - ################## - # Squatting-Pose # - ################## - - step += 1 - input( - f"\n{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move into a {Style.BRIGHT}squatting pose.{Style.RESET_ALL}\n" - f"{Fore.RED}Make sure to pick the robot up!{Style.RESET_ALL}\n\n" - f"{Style.BRIGHT}Press enter to move.{Style.RESET_ALL}" - ) - - move_to_joint_position( - pub, - { - "LHipPitch": math.pi / 2, - "LKnee": math.pi / 2, - "RHipPitch": -math.pi / 2, - "RKnee": -math.pi / 2, - }, - ) - - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - "- Check that both sides of the robot are symmetrical.\n" - "- Check that the knees are at 90 degrees.\n" - "- Check for backlash or flexibility of the legs.\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - ################## - # Men-Split-Pose # - ################## - - step += 1 - input( - f"\n{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move into a {Style.BRIGHT}men split (front/back).{Style.RESET_ALL}\n" - f"{Fore.RED}Make sure to pick the robot up and keep clear!{Style.RESET_ALL}\n\n" - f"{Style.BRIGHT}Press enter to move.{Style.RESET_ALL}" - ) - - move_to_joint_position( - pub, - { - "LHipRoll": math.pi / 2, - "LHipYaw": math.pi / 2, - "RHipRoll": -math.pi / 2, - "RHipYaw": math.pi / 2, - }, - ) - - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - "- Check that the legs are straight.\n" - "- Check if the legs moved freely to the position (sometimes the hipYaw screws are tightened too much and block the range of motion).\n" - "- Check that the legs are not flexible by an unusual amount if moved.\n" - "- Check that the cables are without strain.\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - ############################ - # Men-Split-Other-Way-Pose # - ############################ - - step += 1 - input( - f"\n{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move into a {Style.BRIGHT}men split (front/back) the other way around.{Style.RESET_ALL}\n" - f"{Fore.RED}Make sure to pick the robot up and keep clear!{Style.RESET_ALL}\n\n" - f"{Style.BRIGHT}Press enter to move.{Style.RESET_ALL}" - ) - - move_to_joint_position( - pub, - { - "LHipRoll": math.pi / 2, - "LHipYaw": -math.pi / 2, - "RHipRoll": -math.pi / 2, - "RHipYaw": -math.pi / 2, - }, - ) - - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - "- Check that the legs are straight.\n" - "- Check if the legs moved freely to the position (sometimes the hipYaw screws are tightened too much and block the range of motion).\n" - "- Check that the legs are not flexible by an unusual amount if moved.\n" - "- Check that the cables are without strain.\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - #################### - # Women-Split-Pose # - #################### - - step += 1 - input( - f"\n{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move into a {Style.BRIGHT}women split (sides).{Style.RESET_ALL}\n" - f"{Fore.RED}Make sure to pick the robot up and keep clear!{Style.RESET_ALL}\n\n" - f"{Style.BRIGHT}Press enter to move.{Style.RESET_ALL}" - ) - - move_to_joint_position( - pub, - { - "LHipRoll": math.pi / 2, - "RHipRoll": -math.pi / 2, - }, - ) - - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - "- Check that the legs are symmetrical.\n" - "- Check that the legs are straight.\n" - "- Check that the legs are horizontal.\n" - "- Check that the legs are not flexible by an unusual amount if moved.\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - ########### - # Ankles # - ########## - - input( - f"\n{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move {Style.BRIGHT}back and lift its feet.{Style.RESET_ALL}\n" - f"{Fore.RED}Make sure to pick the robot up and keep clear!{Style.RESET_ALL}\n\n" - f"{Style.BRIGHT}Press enter to move.{Style.RESET_ALL}" - ) - - move_to_joint_position( - pub, - { - "LAnklePitch": -math.pi / 4, - "RAnklePitch": math.pi / 4, - }, - ) - - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - f"- Check that the feet are lifted at a 45 degree angle\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - input( - f"\n{Fore.YELLOW}{num_to_emoji(step)}: The robot will now move its {Style.BRIGHT}ankles.{Style.RESET_ALL}\n" - f"{Fore.RED}Make sure to pick the robot up and keep clear!{Style.RESET_ALL}\n\n" - f"{Style.BRIGHT}Press enter to move.{Style.RESET_ALL}" - ) - - move_to_joint_position( - pub, - { - "LAnkleRoll": -math.pi / 2, - "RAnkleRoll": math.pi / 2, - }, - ) - - input( - f"{Style.BRIGHT}\nChecks:{Style.RESET_ALL}\n" - f"- Check that the feet are rolled to the side at a 90 degree angle\n" - f"{Style.BRIGHT}Press enter to continue.{Style.RESET_ALL}" - ) - - move_to_joint_position(pub, {}) - print( - f"\n\n{Fore.GREEN}If you have reached this point, the robot is hopefully in good shape and ready to go! GLHF" - ) - - except KeyboardInterrupt: - print(f"\n\n{Fore.RED}Closing...") - finally: - print(Style.RESET_ALL) - - -if __name__ == "__main__": - main() diff --git a/src/bitbots_lowlevel/bitbots_ros_control/scripts/pressure_calibration.py b/src/bitbots_lowlevel/bitbots_ros_control/scripts/pressure_calibration.py deleted file mode 100755 index ff86f01c29..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/scripts/pressure_calibration.py +++ /dev/null @@ -1,87 +0,0 @@ -#!/usr/bin/env python3 - -import rclpy -from rclpy.node import Node -from std_srvs.srv import Empty - -from bitbots_msgs.srv import FootScale - -CALIBRATION_WEIGHT = 0.850 * 9.81 - -rclpy.init(args=None) -node = Node("calibration_node") - - -node.get_logger().info( - "Waiting for " - + "/foot_pressure_left/set_foot_zero" - + "/foot_pressure_left/set_foot_scale" - + "/foot_pressure_right/set_foot_zero" - + "/foot_pressure_right/set_foot_scale" -) - -zero_l = node.create_client(Empty, "/foot_pressure_left/set_foot_zero") -zero_r = node.create_client(Empty, "/foot_pressure_right/set_foot_zero") -scale_l = node.create_client(FootScale, "/foot_pressure_left/set_foot_scale") -scale_r = node.create_client(FootScale, "/foot_pressure_right/set_foot_scale") - -zero_l.wait_for_service(1.0) -scale_l.wait_for_service(1.0) -zero_r.wait_for_service(1.0) -scale_r.wait_for_service(1.0) - -node.get_logger().info("found all services") - -node.get_logger().info("Welcome to the foot calibration suite. ") -node.get_logger().info( - f"default calibration weight is {CALIBRATION_WEIGHT} kg. Change the code when using a different weight." -) - - -node.get_logger().info("Press enter when there is no load on the weight cells of the LEFT foot") -input() - - -request = Empty.Request() -req = zero_l.call_async(request) -node.get_logger().info("Successfully set the zero position for all sensors") -sensors = [ - "left front", - "left back", - "right front", - "right back", -] - -request = FootScale.Request() -request.weight = CALIBRATION_WEIGHT - -node.get_logger().info("Starting calibration for LEFT foot") -for i in range(len(sensors)): - request.sensor = i - node.get_logger().info("Place calibration weight on " + sensors[i] + " cleat. Then press enter.") - input() - scale_l.call_async(request) - node.get_logger().info("Load cell for " + sensors[i] + " calibrated") - -node.get_logger().info("Press enter when there is no load on the weight cells of the RIGHT foot") -input() - -request = Empty.Request() -req = zero_r.call_async(request) -node.get_logger().info("Successfully set the zero position for all sensors") -request = FootScale.Request() -request.weight = CALIBRATION_WEIGHT - -node.get_logger().info("Starting calibration for RIGHT foot") -for i in range(len(sensors)): - request.sensor = i - node.get_logger().info("Place calibration weight on " + sensors[i] + " cleat. Then press enter.") - input() - scale_r.call_async(request) - node.get_logger().info("Load cell for " + sensors[i] + " calibrated") - - -node.get_logger().info( - "Thank you for your patience. The configuration has been automatically saved by the pressure_converter already" -) -node.get_logger().info("Shutting down now.") diff --git a/src/bitbots_lowlevel/bitbots_ros_control/scripts/send_joint_command.py b/src/bitbots_lowlevel/bitbots_ros_control/scripts/send_joint_command.py deleted file mode 100755 index 0806cdd838..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/scripts/send_joint_command.py +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env python3 - -import argparse - -import rclpy -from rclpy.duration import Duration -from rclpy.node import Node - -from bitbots_msgs.msg import JointCommand - -DYNAMIXEL_CMD_TOPIC = "/DynamixelController/command" - - -class PredefinedCommands: - __ids__ = [ - "HeadPan", - "HeadTilt", - "LShoulderPitch", - "LShoulderRoll", - "LElbow", - "RShoulderPitch", - "RShoulderRoll", - "RElbow", - "LHipYaw", - "LHipRoll", - "LHipPitch", - "LKnee", - "LAnklePitch", - "LAnkleRoll", - "RHipYaw", - "RHipRoll", - "RHipPitch", - "RKnee", - "RAnklePitch", - "RAnkleRoll", - ] - __velocity__ = 5.0 - __accelerations__ = -1.0 - __max_currents__ = -1.0 - - Zero = JointCommand( - joint_names=__ids__, - velocities=[__velocity__] * len(__ids__), - accelerations=[__accelerations__] * len(__ids__), - max_currents=[__max_currents__] * len(__ids__), - positions=[0.0] * len(__ids__), - ) - - Walkready = JointCommand( - joint_names=__ids__, - velocities=[__velocity__] * len(__ids__), - accelerations=[__accelerations__] * len(__ids__), - max_currents=[__max_currents__] * len(__ids__), - positions=[ - 0.0, # HeadPan - 0.0, # HeadTilt - 0.0, # LShoulderPitch - 0.0, # LShoulderRoll - 0.79, # LElbow - 0.0, # RShoulderPitch - 0.0, # RShoulderRoll - -0.79, # RElbow - -0.0112, # LHipYaw - 0.0615, # LHipRoll - 0.4732, # LHipPitch - 1.0058, # LKnee - -0.4512, # LAnklePitch - 0.0625, # LAnkleRoll - 0.0112, # RHipYaw - -0.0615, # RHipRoll - -0.4732, # RHipPitch - -1.0059, # RKnee - 0.4512, # RAnklePitch - -0.0625, # RAnkleRoll - ], - ) - - -def parse_args(): - parser = argparse.ArgumentParser(description="Send a bitbots_msgs/JointCommand to our ros-control node in a loop") - parser.add_argument( - "--once", action="store_true", default=False, help="Only send the message once instead of in a loop" - ) - parser.add_argument( - "-c", - "--command", - type=str, - help="Command to send. Use one of the available choices", - choices=[c for c in PredefinedCommands.__dict__ if not c.startswith("__")], - default="Zero", - ) - - return parser.parse_args() - - -def main(): - args = parse_args() - joint_command = PredefinedCommands.__dict__[args.command] - - rclpy.init(args=None) - node = Node("send_joint_command") - pub = node.create_publisher(JointCommand, DYNAMIXEL_CMD_TOPIC, 1) - - while pub.get_subscription_count() < 1: - node.get_logger().info(f"Waiting until subscribers connect to {DYNAMIXEL_CMD_TOPIC}", once=True) - node.get_clock().sleep_for(Duration(seconds=0.5)) - # just to make sure - node.get_clock().sleep_for(Duration(seconds=1)) - - node.get_logger().info(f"Sending controller commands of type {args.command} now.") - print(joint_command) - - while rclpy.ok(): - joint_command.header.stamp = node.get_clock().now().to_msg() - pub.publish(joint_command) - node.get_clock().sleep_for(Duration(seconds=0.5)) - - if args.once: - return - - -if __name__ == "__main__": - main() diff --git a/src/bitbots_lowlevel/bitbots_ros_control/scripts/send_sinus_command.py b/src/bitbots_lowlevel/bitbots_ros_control/scripts/send_sinus_command.py deleted file mode 100755 index 74bf82a7b8..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/scripts/send_sinus_command.py +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/env python3 - -import math - -import rclpy -from rclpy.node import Node - -from bitbots_msgs.msg import JointCommand - -DYNAMIXEL_CMD_TOPIC = "/DynamixelController/command" -JOINT_NAME = "LAnkleRoll" -PUBLISH_RATE = 1000 - -# sin function -FREQUENCY = 0.5 -AMPLITUDE = 72 # degree - -if __name__ == "__main__": - msg = JointCommand(joint_names=[JOINT_NAME], velocities=[-1], accelerations=[-1], max_currents=[-1]) - - rclpy.init(args=None) - node = Node("sinus_command") - pub = node.create_publisher(JointCommand, DYNAMIXEL_CMD_TOPIC, 1) - - def tick(): - time = node.get_clock().now() - position = math.radians(AMPLITUDE) * math.sin(2 * math.pi * FREQUENCY * time.nanoseconds / 1e9) - - msg.header.stamp = time.to_msg() - msg.positions = [position] - pub.publish(msg) - - node.create_timer(1.0 / PUBLISH_RATE, lambda _: tick()) - rclpy.spin(node) diff --git a/src/bitbots_lowlevel/bitbots_ros_control/scripts/zero_on_button.py b/src/bitbots_lowlevel/bitbots_ros_control/scripts/zero_on_button.py deleted file mode 100755 index 033a051b95..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/scripts/zero_on_button.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python3 -import rclpy -from rclpy.duration import Duration -from rclpy.node import Node -from std_srvs.srv import Empty - -from bitbots_msgs.msg import Buttons - -rclpy.init(args=None) -node = Node("zero_on_button") - -zero_l = node.create_client(Empty, "/foot_pressure_left/set_foot_zero") -zero_r = node.create_client(Empty, "/foot_pressure_right/set_foot_zero") -button_prev_state = False -press_time = node.get_clock().now() - Duration(seconds=1.0) - - -def cb(msg): - global button_prev_state, press_time - if msg.button3 and not button_prev_state and node.get_clock().now() - press_time > Duration(seconds=1.0): - request = Empty.Request() - zero_l.call_async(request) - zero_r.call_async(request) - press_time = node.get_clock().now() - button_prev_state = msg.button3 - - -node.create_subscription(Buttons, "/buttons", cb, 1) -rclpy.spin(node) diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/bitfoot_hardware_interface.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/bitfoot_hardware_interface.cpp deleted file mode 100644 index f8d3ea3ecd..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/bitfoot_hardware_interface.cpp +++ /dev/null @@ -1,119 +0,0 @@ -#include -#include - -namespace bitbots_ros_control { - -BitFootHardwareInterface::BitFootHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, - int id, std::string topic_name, std::string name) { - nh_ = nh; - driver_ = driver; - id_ = id; - topic_name_ = topic_name; - name_ = name; -} - -bool BitFootHardwareInterface::init() { - current_pressure_.resize(4, std::vector()); - pressure_pub_ = nh_->create_publisher(topic_name_, 1); - diagnostic_pub_ = nh_->create_publisher("/diagnostics", 10); - return true; -} - -void BitFootHardwareInterface::read(const rclcpp::Time& t, const rclcpp::Duration& dt) { - /** - * Reads the foot pressure sensors of the BitFoot - */ - - // read foot - bool read_successful = true; - if (driver_->readMultipleRegisters(id_, 36, 16, data_.data())) { - for (int i = 0; i < 4; i++) { - float pres = dxlMakeFloat(&data_[i * 4]); - // we directly provide raw data since the scaling has to be calibrated by another node for every robot anyway - current_pressure_[i].push_back((double)pres); - } - } else { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 3000, "Could not read %s", name_.c_str()); - read_successful = false; - } - - msg_.header.stamp = nh_->get_clock()->now(); - msg_.left_front = current_pressure_[0].back(); - msg_.right_front = current_pressure_[1].back(); - msg_.left_back = current_pressure_[2].back(); - msg_.right_back = current_pressure_[3].back(); - pressure_pub_->publish(msg_); - - // wait till we have 10 values - if (current_pressure_[0].size() > 10) { - // erase older value - current_pressure_[0].erase(current_pressure_[0].begin()); - // diagnostics. check if values are changing, otherwise there is a connection error on the board - diagnostic_msgs::msg::DiagnosticArray array_msg = diagnostic_msgs::msg::DiagnosticArray(); - std::vector array = std::vector(); - array_msg.header.stamp = nh_->get_clock()->now(); - diagnostic_msgs::msg::DiagnosticStatus status = diagnostic_msgs::msg::DiagnosticStatus(); - // add prefix PS for pressure sensor to sort in diagnostic analyser - status.name = "PS" + name_; - status.hardware_id = std::to_string(id_); - std::map map; - bool all_okay = true; - for (int i = 0; i < 4; i++) { - std::string gauge_name; - if (i == 0) { - gauge_name = "Strain Gauge Left Front"; - } else if (i == 1) { - gauge_name = "Strain Gauge Right Front"; - } else if (i == 2) { - gauge_name = "Strain Gauge Left Back"; - } else if (i == 3) { - gauge_name = "Strain Gauge Right Back"; - } - - bool okay = false; - double last = 0; - for (size_t j = 0; j < current_pressure_[i].size(); j++) { - if (last != current_pressure_[0][j]) { - okay = true; - break; - } - } - all_okay &= okay; - std::string okay_string; - if (okay) { - okay_string = "Okay"; - } else { - okay_string = "Error"; - } - map.insert(std::make_pair(gauge_name, okay_string)); - } - if (read_successful) { - if (all_okay) { - status.level = diagnostic_msgs::msg::DiagnosticStatus::OK; - status.message = "OK"; - } else { - status.level = diagnostic_msgs::msg::DiagnosticStatus::ERROR; - status.message = "Cable problem to strain gauge"; - } - } else { - status.level = diagnostic_msgs::msg::DiagnosticStatus::ERROR; - status.message = "Could not read foot sensor"; - } - std::vector keyValues = std::vector(); - // iterate through map and save it into values - for (auto const& ent1 : map) { - diagnostic_msgs::msg::KeyValue key_value = diagnostic_msgs::msg::KeyValue(); - key_value.key = ent1.first; - key_value.value = ent1.second; - keyValues.push_back(key_value); - } - status.values = keyValues; - array.push_back(status); - array_msg.status = array; - diagnostic_pub_->publish(array_msg); - } -} - -// we dont write anything to the pressure sensors -void BitFootHardwareInterface::write(const rclcpp::Time& t, const rclcpp::Duration& dt) {} -} // namespace bitbots_ros_control diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/button_hardware_interface.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/button_hardware_interface.cpp deleted file mode 100644 index c3e3647679..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/button_hardware_interface.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include - -namespace bitbots_ros_control { -ButtonHardwareInterface::ButtonHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, - int id, std::string topic, int read_rate) { - nh_ = nh; - driver_ = driver; - id_ = id; - topic_ = topic; - read_rate_ = read_rate; -} - -bool ButtonHardwareInterface::init() { - button_pub_ = nh_->create_publisher(topic_, 1); - diagnostic_pub_ = nh_->create_publisher("/diagnostics", 10); - return true; -} - -void ButtonHardwareInterface::read(const rclcpp::Time& t, const rclcpp::Duration& dt) { - /** - * Reads the buttons - */ - counter_ = (counter_ + 1) % read_rate_; - if (counter_ != 0) return; - bool read_successful = true; - if (driver_->readMultipleRegisters(id_, 76, 3, data_.data())) { - bitbots_msgs::msg::Buttons msg; - msg.button1 = data_[0]; - msg.button2 = data_[1]; - msg.button3 = data_[2]; - button_pub_->publish(msg); - } else { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, "Couldn't read Buttons"); - read_successful = false; - } - - // diagnostics. check if values are changing, otherwise there is a connection error on the board - diagnostic_msgs::msg::DiagnosticArray array_msg = diagnostic_msgs::msg::DiagnosticArray(); - std::vector array = std::vector(); - array_msg.header.stamp = nh_->get_clock()->now(); - diagnostic_msgs::msg::DiagnosticStatus status = diagnostic_msgs::msg::DiagnosticStatus(); - // add prefix CORE to sort in diagnostic analyser - status.name = "BUTTONButton"; - status.hardware_id = std::to_string(id_); - - if (read_successful) { - status.level = diagnostic_msgs::msg::DiagnosticStatus::OK; - status.message = "OK"; - } else { - status.level = diagnostic_msgs::msg::DiagnosticStatus::STALE; - status.message = "No response"; - } - array.push_back(status); - array_msg.status = array; - diagnostic_pub_->publish(array_msg); -} - -// we don't write anything to the buttons -void ButtonHardwareInterface::write(const rclcpp::Time& t, const rclcpp::Duration& dt) {} -} // namespace bitbots_ros_control diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/core_hardware_interface.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/core_hardware_interface.cpp deleted file mode 100644 index 18b8e87617..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/core_hardware_interface.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include - -namespace bitbots_ros_control { - -CoreHardwareInterface::CoreHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, - int id, int read_rate) { - nh_ = nh; - driver_ = driver; - id_ = id; - read_rate_ = read_rate; - read_counter_ = 0; - requested_power_status_ = true; - power_switch_status_.data = false; - power_control_status_.data = false; - last_read_successful_ = false; -} - -bool CoreHardwareInterface::switch_power(std::shared_ptr req, - std::shared_ptr resp) { - requested_power_status_ = req->data; - // wait for main loop to set value - resp->success = true; - return true; -} - -bool CoreHardwareInterface::init() { - VBAT_individual_.data.resize(6); - power_pub_ = nh_->create_publisher("/core/power_switch_status", 1); - vcc_pub_ = nh_->create_publisher("/core/vcc", 1); - vbat_pub_ = nh_->create_publisher("/core/vbat", 1); - vbat_individual_pub_ = nh_->create_publisher("/core/vbat_cells", 1); - vext_pub_ = nh_->create_publisher("/core/vext", 1); - vdxl_pub_ = nh_->create_publisher("/core/vdxl", 1); - current_pub_ = nh_->create_publisher("/core/current", 1); - - diagnostic_pub_ = nh_->create_publisher("/diagnostics", 10); - - // service to switch power - power_switch_service_ = nh_->create_service( - "/core/switch_power", - std::bind(&CoreHardwareInterface::switch_power, this, std::placeholders::_1, std::placeholders::_2)); - return true; -} - -bool CoreHardwareInterface::get_power_status() { - // this is only true when the physical switch and the soft status are true - return power_control_status_.data && power_switch_status_.data; -} - -void CoreHardwareInterface::read(const rclcpp::Time& t, const rclcpp::Duration& dt) { - /** - * Reads the CORE board - */ - - if (read_counter_ % read_rate_ == 0) { - read_counter_ = 0; - // read core - last_read_successful_ = true; - if (driver_->readMultipleRegisters(id_, 23, 27, data_.data())) { - // we read one string of bytes. see CORE firmware for definition of registers - // convert to volt - power_control_status_.data = data_[0]; - VEXT_.data = (((float)dxlMakeword(data_[5], data_[6])) * (3.3 / 1024)) * 6; - VCC_.data = (((float)dxlMakeword(data_[7], data_[8])) * (3.3 / 1024)) * 6; - VDXL_.data = (((float)dxlMakeword(data_[9], data_[10])) * (3.3 / 1024)) * 6; - // convert to ampere. first go to voltage by 1024*3.3. shift by 2.5 and mulitply by volt/ampere - current_.data = ((((float)dxlMakeword(data_[11], data_[12])) * (3.3 / 1024)) - 2.5) / -0.066; - // we need to apply a threshold on this to see if power is on or off - power_switch_status_.data = dxlMakeword(data_[13], data_[14]); - // calculate cell voltages as voltages read * voltage divider ratio - previous cell voltage sum - VBAT_individual_.data[0] = ((float)dxlMakeword(data_[15], data_[16])) * (3.3 / 1024) * (3.3 / (1.2 + 3.3)); - VBAT_individual_.data[1] = - ((float)dxlMakeword(data_[17], data_[18])) * (3.3 / 1024) * (3.6 / (6.2 + 3.6)) - VBAT_individual_.data[0]; - VBAT_individual_.data[2] = - ((float)dxlMakeword(data_[19], data_[20])) * (3.3 / 1024) * (2.2 / (6.8 + 2.2)) - VBAT_individual_.data[1]; - VBAT_individual_.data[3] = - ((float)dxlMakeword(data_[21], data_[22])) * (3.3 / 1024) * (3.6 / (16.0 + 3.6)) - VBAT_individual_.data[2]; - VBAT_individual_.data[4] = - ((float)dxlMakeword(data_[23], data_[24])) * (3.3 / 1024) * (6.2 / (36.0 + 6.2)) - VBAT_individual_.data[3]; - VBAT_individual_.data[5] = - ((float)dxlMakeword(data_[25], data_[26])) * (3.3 / 1024) * (1.8 / (13.0 + 1.8)) - VBAT_individual_.data[4]; - VBAT_.data = ((float)dxlMakeword(data_[25], data_[26])) * (3.3 / 1024) * (1.8 / (13.0 + 1.8)); - - power_pub_->publish(power_switch_status_); - vcc_pub_->publish(VCC_); - vbat_pub_->publish(VBAT_); - vbat_individual_pub_->publish(VBAT_individual_); - vext_pub_->publish(VEXT_); - vdxl_pub_->publish(VDXL_); - current_pub_->publish(current_); - } else { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 3000, "Could not read CORE sensor"); - last_read_successful_ = false; - } - - // diagnostics. check if values are changing, otherwise there is a connection error on the board - diagnostic_msgs::msg::DiagnosticArray array_msg = diagnostic_msgs::msg::DiagnosticArray(); - std::vector array = std::vector(); - array_msg.header.stamp = nh_->get_clock()->now(); - diagnostic_msgs::msg::DiagnosticStatus status = diagnostic_msgs::msg::DiagnosticStatus(); - // add prefix CORE to sort in diagnostic analyser - status.name = "CORECORE"; - status.hardware_id = std::to_string(id_); - std::map map; - - if (power_switch_status_.data) { - map.insert(std::make_pair("power_switch_status", "ON")); - } else { - map.insert(std::make_pair("power_switch_status", "OFF")); - } - if (power_control_status_.data) { - map.insert(std::make_pair("power_control_status", "ON")); - } else { - map.insert(std::make_pair("power_control_status", "OFF")); - } - map.insert(std::make_pair("VCC", std::to_string(VCC_.data))); - map.insert(std::make_pair("VBAT", std::to_string(VBAT_.data))); - map.insert(std::make_pair("VEXT", std::to_string(VEXT_.data))); - map.insert(std::make_pair("VDXL", std::to_string(VDXL_.data))); - map.insert(std::make_pair("Current", std::to_string(current_.data))); - - if (last_read_successful_) { - status.level = diagnostic_msgs::msg::DiagnosticStatus::OK; - status.message = "OK"; - } else { - status.level = diagnostic_msgs::msg::DiagnosticStatus::STALE; - status.message = "No response"; - } - std::vector keyValues = std::vector(); - // iterate through map and save it into values - for (auto const& ent1 : map) { - diagnostic_msgs::msg::KeyValue key_value = diagnostic_msgs::msg::KeyValue(); - key_value.key = ent1.first; - key_value.value = ent1.second; - keyValues.push_back(key_value); - } - status.values = keyValues; - array.push_back(status); - array_msg.status = array; - diagnostic_pub_->publish(array_msg); - } - read_counter_++; -} - -void CoreHardwareInterface::write(const rclcpp::Time& t, const rclcpp::Duration& dt) { - // we only need to write something if requested power status and current power status do not match - // we don't use power_switch_status here because we cannot overwrite the physical switch - if (requested_power_status_ != power_control_status_.data && last_read_successful_) { - driver_->writeRegister(id_, "Power", requested_power_status_); - } -} - -void CoreHardwareInterface::restoreAfterPowerCycle() { requested_power_status_ = true; } - -} // namespace bitbots_ros_control diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/dynamixel_servo_hardware_interface.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/dynamixel_servo_hardware_interface.cpp deleted file mode 100644 index f27b303a99..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/dynamixel_servo_hardware_interface.cpp +++ /dev/null @@ -1,209 +0,0 @@ -#include -#include -#include -#include -#include - -namespace bitbots_ros_control { -using std::placeholders::_1; - -DynamixelServoHardwareInterface::DynamixelServoHardwareInterface(rclcpp::Node::SharedPtr nh) { nh_ = nh; } - -void DynamixelServoHardwareInterface::addBusInterface(std::shared_ptr bus) { - bus_interfaces_.push_back(bus); -} - -void DynamixelServoHardwareInterface::writeROMRAM(bool first_time) { - for (auto& bus : bus_interfaces_) { - bus->writeROMRAM(first_time); - } -} - -bool DynamixelServoHardwareInterface::init() { - /* - * This initializes the hardware interface based on the values set in the config. - * The servos are pinged to verify that a connection is present and to know which type of servo it is. - */ - - // Init subscriber / publisher - set_torque_sub_ = nh_->create_subscription( - "set_torque", 1, std::bind(&DynamixelServoHardwareInterface::setTorqueCb, this, _1)); - set_torque_indiv_sub_ = nh_->create_subscription( - "set_torque_individual", 1, std::bind(&DynamixelServoHardwareInterface::individualTorqueCb, this, _1)); - // todo we could change the command topic to something better - sub_command_ = nh_->create_subscription( - "/DynamixelController/command", 1, - std::bind(&DynamixelServoHardwareInterface::commandCb, this, std::placeholders::_1)); - pwm_pub_ = nh_->create_publisher("/servo_PWM", 10); - joint_pub_ = nh_->create_publisher("/joint_states", 10); - - torqueless_mode_ = nh_->get_parameter("torqueless_mode").as_bool(); - - // init merged vectors for controller - joint_count_ = 0; - for (const auto& bus : bus_interfaces_) { - joint_count_ = joint_count_ + bus->joint_count_; - for (int i = 0; i < bus->joint_count_; i++) { - joint_names_.push_back(bus->joint_names_[i]); - } - } - current_position_.resize(joint_count_, 0); - current_velocity_.resize(joint_count_, 0); - current_effort_.resize(joint_count_, 0); - current_pwm_.resize(joint_count_, 0); - current_input_voltage_.resize(joint_count_, 0); - current_temperature_.resize(joint_count_, 0); - current_error_.resize(joint_count_, 0); - goal_position_.resize(joint_count_, 0); - goal_velocity_.resize(joint_count_, 0); - goal_acceleration_.resize(joint_count_, 0); - goal_effort_.resize(joint_count_, 0); - goal_torque_individual_.resize(joint_count_, 1); - - // create mapping for faster computation later - for (unsigned int i = 0; i < joint_count_; i++) { - joint_map_[joint_names_[i]] = i; - } - - // read lower and upper limits - robot_model_loader::RobotModelLoader rml(nh_, "robot_description", false); - moveit::core::RobotModelPtr model = rml.getModel(); - lower_joint_limits_.resize(joint_count_); - upper_joint_limits_.resize(joint_count_); - for (const std::string& joint_name : joint_names_) { - moveit::core::JointModel* jm = model->getJointModel(joint_name); - // we use getVariableBounds()[0] because there is only a single variable for all of our joints - lower_joint_limits_[joint_map_[joint_name]] = jm->getVariableBounds()[0].min_position_; - upper_joint_limits_[joint_map_[joint_name]] = jm->getVariableBounds()[0].max_position_; - } - - std::string control_mode; - control_mode = nh_->get_parameter("servos.control_mode").as_string(); - RCLCPP_INFO(nh_->get_logger(), "Control mode: %s", control_mode.c_str()); - if (!stringToControlMode(nh_, control_mode, control_mode_)) { - RCLCPP_ERROR_STREAM(nh_->get_logger(), "Unknown control mode'" << control_mode << "'."); - return false; - } - - joint_state_msg_ = sensor_msgs::msg::JointState(); - joint_state_msg_.name = joint_names_; - pwm_msg_ = sensor_msgs::msg::JointState(); - pwm_msg_.name = joint_names_; - - RCLCPP_INFO(nh_->get_logger(), "Hardware interface init finished."); - return true; -} - -void DynamixelServoHardwareInterface::commandCb(const bitbots_msgs::msg::JointCommand& command_msg) { - if (!(command_msg.joint_names.size() == command_msg.positions.size() && - command_msg.joint_names.size() == command_msg.velocities.size() && - command_msg.joint_names.size() == command_msg.accelerations.size() && - command_msg.joint_names.size() == command_msg.max_currents.size())) { - RCLCPP_ERROR(nh_->get_logger(), "Dynamixel Controller got command with inconsistent array lengths."); - return; - } - for (unsigned int i = 0; i < command_msg.joint_names.size(); i++) { - int joint_id = joint_map_[command_msg.joint_names[i]]; - if (command_msg.positions[i] > upper_joint_limits_[joint_id] || - command_msg.positions[i] < lower_joint_limits_[joint_id]) { - RCLCPP_WARN_STREAM(nh_->get_logger(), "Invalid position for " << command_msg.joint_names[i] << ": " - << command_msg.positions[i] << " not in (" - << lower_joint_limits_[joint_id] << ", " - << upper_joint_limits_[joint_id] << ")"); - goal_position_[joint_id] = - std::clamp(command_msg.positions[i], lower_joint_limits_[joint_id], upper_joint_limits_[joint_id]); - } else { - goal_position_[joint_id] = command_msg.positions[i]; - } - goal_velocity_[joint_id] = command_msg.velocities[i]; - goal_acceleration_[joint_id] = command_msg.accelerations[i]; - goal_effort_[joint_id] = command_msg.max_currents[i]; - } -} - -void DynamixelServoHardwareInterface::individualTorqueCb(bitbots_msgs::msg::JointTorque msg) { - /** - * Handles incomming JointTroque messages and remembers the requested torque configuration of the servos. - * It will not directly written since this has to happen in the main write loop - */ - if (torqueless_mode_) { - return; - } - - // we save the goal torque value. It will be set during write process - for (size_t i = 0; i < msg.joint_names.size(); i++) { - bool success = false; - for (size_t j = 0; j < joint_names_.size(); j++) { - if (msg.joint_names[i] == joint_names_[j]) { - if (i < msg.joint_names.size()) { - goal_torque_individual_[j] = msg.on[i]; - success = true; - } else { - RCLCPP_WARN(nh_->get_logger(), "Somethings wrong with your message to set torques."); - } - } - } - if (!success) { - RCLCPP_WARN(nh_->get_logger(), "Couldn't set torque for servo %s ", msg.joint_names[i].c_str()); - } - } - for (const auto& bus : bus_interfaces_) { - bus->switch_individual_torque_ = true; - } -} - -void DynamixelServoHardwareInterface::setTorqueCb(std_msgs::msg::Bool::SharedPtr enabled) { - /** - * This saves the given required value, so that it can be written to the servos in the write method - */ - for (const auto& bus : bus_interfaces_) { - bus->goal_torque_ = enabled->data; - } - for (size_t j = 0; j < joint_names_.size(); j++) { - goal_torque_individual_[j] = enabled->data; - } -} - -void DynamixelServoHardwareInterface::read(const rclcpp::Time& t, const rclcpp::Duration& dt) { - // retrieve values from the buses and set controller vector accordingly - // todo improve performance - int i = 0; - for (const auto& bus : bus_interfaces_) { - for (int j = 0; j < bus->joint_count_; j++) { - current_position_[i] = bus->current_position_[j]; - current_velocity_[i] = bus->current_velocity_[j]; - current_effort_[i] = bus->current_effort_[j]; - current_pwm_[i] = bus->current_pwm_[j]; - i++; - } - } - - // publish joint states - joint_state_msg_.header.stamp = nh_->get_clock()->now(); - joint_state_msg_.position = current_position_; - joint_state_msg_.velocity = current_velocity_; - joint_state_msg_.effort = current_effort_; - joint_pub_->publish(joint_state_msg_); - - // PWM values are not part of joint state controller and have to be published independently - pwm_msg_.header.stamp = nh_->get_clock()->now(); - pwm_msg_.effort = current_pwm_; - pwm_pub_->publish(pwm_msg_); -} - -void DynamixelServoHardwareInterface::write(const rclcpp::Time& t, const rclcpp::Duration& dt) { - // set all values from controller to the buses - // todo improve performance - int i = 0; - for (const auto& bus : bus_interfaces_) { - for (int j = 0; j < bus->joint_count_; j++) { - bus->goal_position_[j] = goal_position_[i]; - bus->goal_velocity_[j] = goal_velocity_[i]; - bus->goal_acceleration_[j] = goal_acceleration_[i]; - bus->goal_effort_[j] = goal_effort_[i]; - bus->goal_torque_individual_[j] = goal_torque_individual_[i]; - i++; - } - } -} -} // namespace bitbots_ros_control diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/imu_hardware_interface.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/imu_hardware_interface.cpp deleted file mode 100644 index cb2f9f1bdd..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/imu_hardware_interface.cpp +++ /dev/null @@ -1,294 +0,0 @@ -#include -#include - -#define gravity 9.80665 - -namespace bitbots_ros_control { -using std::placeholders::_1; -using std::placeholders::_2; - -ImuHardwareInterface::ImuHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, int id, - std::string topic, std::string frame, std::string name) { - nh_ = nh; - driver_ = driver; - id_ = id; - topic_ = topic; - frame_ = frame; - name_ = name; - diag_counter_ = 0; - imu_msg_ = sensor_msgs::msg::Imu(); - imu_msg_.header.frame_id = frame_; -} - -bool ImuHardwareInterface::init() { - status_imu_.name = name_; - status_imu_.hardware_id = std::to_string(id_); - - // make services - imu_ranges_service_ = nh_->create_service( - "/imu/set_imu_ranges", std::bind(&ImuHardwareInterface::setIMURanges, this, _1, _2)); - calibrate_gyro_service_ = nh_->create_service( - "/imu/calibrate_gyro", std::bind(&ImuHardwareInterface::calibrateGyro, this, _1, _2)); - reset_gyro_calibration_service_ = nh_->create_service( - "/imu/reset_gyro_calibration", std::bind(&ImuHardwareInterface::resetGyroCalibration, this, _1, _2)); - complementary_filter_params_service_ = nh_->create_service( - "/imu/set_complementary_filter_params", - std::bind(&ImuHardwareInterface::setComplementaryFilterParams, this, _1, _2)); - calibrate_accel_service_ = nh_->create_service( - "/imu/calibrate_accel", std::bind(&ImuHardwareInterface::calibrateAccel, this, _1, _2)); - read_accel_calibration_service_ = nh_->create_service( - "/imu/read_accel_calibration", std::bind(&ImuHardwareInterface::readAccelCalibration, this, _1, _2)); - reset_accel_calibration_service_ = nh_->create_service( - "/imu/reset_accel_calibration", std::bind(&ImuHardwareInterface::resetAccelCalibraton, this, _1, _2)); - set_accel_calib_threshold_service_ = nh_->create_service( - "/imu/set_accel_calibration_threshold", - std::bind(&ImuHardwareInterface::setAccelCalibrationThreshold, this, _1, _2)); - - imu_pub_ = nh_->create_publisher(topic_, 10); - diagnostic_pub_ = nh_->create_publisher("/diagnostics", 10); - - // read the current values in the IMU module so that they can later be displayed in diagnostic message - const std::shared_ptr req = - std::make_shared(); - std::shared_ptr resp = - std::make_shared(); - readAccelCalibration(req, resp); - if (driver_->readMultipleRegisters(id_, 102, 16, data_.data())) { - gyro_range_ = data_[0]; - accel_range_ = data_[1]; - calibrate_gyro_ = data_[2]; - reset_gyro_calibration_ = data_[3]; - do_adaptive_gain_ = data_[6]; - do_bias_estimation_ = data_[7]; - accel_gain_ = dxlMakeFloat(&data_[8]); - bias_alpha_ = dxlMakeFloat(&data_[12]); - } else { - RCLCPP_WARN(nh_->get_logger(), "Could not read IMU %s config values in init", name_.c_str()); - } - - // set filter values differently if specified in the config and write them - do_adaptive_gain_ = nh_->get_parameter("imu.do_adaptive_gain").as_bool(); - do_bias_estimation_ = nh_->get_parameter("imu.do_bias_estimation").as_bool(); - accel_gain_ = nh_->get_parameter("imu.accel_gain").as_double(); - bias_alpha_ = nh_->get_parameter("imu.bias_alpha").as_double(); - - write_complementary_filter_params_ = true; - write(rclcpp::Time(0), rclcpp::Duration::from_nanoseconds(1e9 * 0)); - - return true; -} - -void ImuHardwareInterface::read(const rclcpp::Time& t, const rclcpp::Duration& dt) { - /** - * Reads the IMU - */ - bool read_successful = true; - if (driver_->readMultipleRegisters(id_, 36, 40, data_.data())) { - // sometimes we only get 0 right after power on, don't use that data - // test on orientation is sufficient as 0,0,0,0 would not be a valid quaternion - if (dxlMakeFloat(&data_[24]) + dxlMakeFloat(&data_[28]) + dxlMakeFloat(&data_[32]) + dxlMakeFloat(&data_[36]) != - 0) { - angular_velocity_[0] = dxlMakeFloat(&data_[0]); - angular_velocity_[1] = dxlMakeFloat(&data_[4]); - angular_velocity_[2] = dxlMakeFloat(&data_[8]); - - linear_acceleration_[0] = dxlMakeFloat(&data_[12]); - linear_acceleration_[1] = dxlMakeFloat(&data_[16]); - linear_acceleration_[2] = dxlMakeFloat(&data_[20]); - - orientation_[0] = dxlMakeFloat(&data_[24]); - orientation_[1] = dxlMakeFloat(&data_[28]); - orientation_[2] = dxlMakeFloat(&data_[32]); - orientation_[3] = dxlMakeFloat(&data_[36]); - } - } else { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, "Couldn't read IMU"); - read_successful = false; - } - - imu_msg_.header.stamp = nh_->get_clock()->now(); - imu_msg_.angular_velocity.x = angular_velocity_[0]; - imu_msg_.angular_velocity.y = angular_velocity_[1]; - imu_msg_.angular_velocity.z = angular_velocity_[2]; - imu_msg_.linear_acceleration.x = linear_acceleration_[0]; - imu_msg_.linear_acceleration.y = linear_acceleration_[1]; - imu_msg_.linear_acceleration.z = linear_acceleration_[2]; - imu_msg_.orientation.x = orientation_[0]; - imu_msg_.orientation.y = orientation_[1]; - imu_msg_.orientation.z = orientation_[2]; - imu_msg_.orientation.w = orientation_[3]; - imu_pub_->publish(imu_msg_); - - // publish diagnostic messages each 100 frames - if (diag_counter_ % 100 == 0) { - // diagnostics. check if values are changing, otherwise there is a connection error on the board - diagnostic_msgs::msg::DiagnosticArray array_msg = diagnostic_msgs::msg::DiagnosticArray(); - std::vector array = std::vector(); - array_msg.header.stamp = nh_->get_clock()->now(); - diagnostic_msgs::msg::DiagnosticStatus status = diagnostic_msgs::msg::DiagnosticStatus(); - // add prefix CORE to sort in diagnostic analyser - status.name = "IMU" + name_; - status.hardware_id = std::to_string(id_); - std::map map; - - map.insert(std::make_pair("Gyro Range", std::to_string(gyro_range_))); - map.insert(std::make_pair("Accel Range", std::to_string(accel_range_))); - map.insert(std::make_pair("Accel Gain", std::to_string(accel_gain_))); - map.insert(std::make_pair("Bias Alpha", std::to_string(bias_alpha_))); - map.insert(std::make_pair("Adaptive Gain", std::to_string(do_adaptive_gain_))); - map.insert(std::make_pair("Bias Estimation", std::to_string(do_bias_estimation_))); - map.insert(std::make_pair("Adaptive Gain", std::to_string(do_adaptive_gain_))); - map.insert(std::make_pair("Accel Calib Thresh", std::to_string(accel_calib_threshold_read_))); - map.insert(std::make_pair("Accel Calib Bias 0", std::to_string(accel_calib_bias_[0]))); - map.insert(std::make_pair("Accel Calib Bias 1", std::to_string(accel_calib_bias_[1]))); - map.insert(std::make_pair("Accel Calib Bias 2", std::to_string(accel_calib_bias_[2]))); - map.insert(std::make_pair("Accel Calib Scale 0", std::to_string(accel_calib_scale_[0]))); - map.insert(std::make_pair("Accel Calib Scale 1", std::to_string(accel_calib_scale_[1]))); - map.insert(std::make_pair("Accel Calib Scale 2", std::to_string(accel_calib_scale_[2]))); - - if (read_successful) { - status.level = diagnostic_msgs::msg::DiagnosticStatus::OK; - status.message = "OK"; - } else { - status.level = diagnostic_msgs::msg::DiagnosticStatus::STALE; - status.message = "No response"; - } - std::vector keyValues = std::vector(); - // itarate through map and save it into values - for (auto const& ent1 : map) { - diagnostic_msgs::msg::KeyValue key_value = diagnostic_msgs::msg::KeyValue(); - key_value.key = ent1.first; - key_value.value = ent1.second; - keyValues.push_back(key_value); - } - status.values = keyValues; - array.push_back(status); - array_msg.status = array; - diagnostic_pub_->publish(array_msg); - } - diag_counter_++; -} - -void ImuHardwareInterface::setIMURanges(const std::shared_ptr req, - std::shared_ptr resp) { - accel_range_ = req->accel_range; - gyro_range_ = req->gyro_range; - write_ranges_ = true; -} - -void ImuHardwareInterface::calibrateGyro(const std::shared_ptr req, - std::shared_ptr resp) { - calibrate_gyro_ = true; -} - -void ImuHardwareInterface::resetGyroCalibration(const std::shared_ptr req, - std::shared_ptr resp) { - reset_gyro_calibration_ = true; -} - -void ImuHardwareInterface::setComplementaryFilterParams( - const std::shared_ptr req, - std::shared_ptr resp) { - do_adaptive_gain_ = req->do_adaptive_gain; - do_bias_estimation_ = req->do_bias_estimation; - accel_gain_ = req->accel_gain; - bias_alpha_ = req->bias_alpha; - write_complementary_filter_params_ = true; -} - -void ImuHardwareInterface::calibrateAccel(const std::shared_ptr req, - std::shared_ptr resp) { - calibrate_accel_ = true; -} - -void ImuHardwareInterface::resetAccelCalibraton(const std::shared_ptr req, - std::shared_ptr resp) { - reset_accel_calibration_ = true; -} - -void ImuHardwareInterface::readAccelCalibration( - const std::shared_ptr req, - std::shared_ptr resp) { - resp->biases.resize(3); - resp->scales.resize(3); - if (driver_->readMultipleRegisters(id_, 118, 28, accel_calib_data_.data())) { - // save in class variables for diagnostics - accel_calib_threshold_read_ = dxlMakeFloat(&accel_calib_data_[0]); - accel_calib_bias_[0] = dxlMakeFloat(&accel_calib_data_[4]); - accel_calib_bias_[1] = dxlMakeFloat(&accel_calib_data_[8]); - accel_calib_bias_[2] = dxlMakeFloat(&accel_calib_data_[12]); - accel_calib_scale_[0] = dxlMakeFloat(&accel_calib_data_[16]); - accel_calib_scale_[1] = dxlMakeFloat(&accel_calib_data_[20]); - accel_calib_scale_[2] = dxlMakeFloat(&accel_calib_data_[24]); - - resp->threshold = accel_calib_threshold_read_; - resp->biases[0] = accel_calib_bias_[0]; - resp->biases[1] = accel_calib_bias_[1]; - resp->biases[2] = accel_calib_bias_[2]; - resp->scales[0] = accel_calib_scale_[0]; - resp->scales[1] = accel_calib_scale_[1]; - resp->scales[2] = accel_calib_scale_[2]; - } -} - -void ImuHardwareInterface::setAccelCalibrationThreshold( - const std::shared_ptr req, - std::shared_ptr resp) { - accel_calib_threshold_read_ = req->threshold; - accel_calib_threshold_ = accel_calib_threshold_read_; - set_accel_calib_threshold_ = true; -} - -void ImuHardwareInterface::write(const rclcpp::Time& t, const rclcpp::Duration& dt) { - if (write_ranges_) { - RCLCPP_INFO_STREAM(nh_->get_logger(), "Setting Gyroscope range to " << gyroRangeToString(gyro_range_)); - RCLCPP_INFO_STREAM(nh_->get_logger(), "Setting Accelerometer range to " << accelRangeToString(accel_range_)); - driver_->writeRegister(id_, "Gyro_Range", gyro_range_); - driver_->writeRegister(id_, "Accel_Range", accel_range_); - write_ranges_ = false; - } - if (calibrate_gyro_) { - RCLCPP_INFO(nh_->get_logger(), "Calibrating gyroscope"); - driver_->writeRegister(id_, "Calibrate_Gyro", 1); - calibrate_gyro_ = false; - } - if (reset_gyro_calibration_) { - RCLCPP_INFO(nh_->get_logger(), "Resetting gyroscope Calibration"); - driver_->writeRegister(id_, "Reset_Gyro_Calibration", 1); - reset_gyro_calibration_ = false; - } - if (write_complementary_filter_params_) { - RCLCPP_INFO(nh_->get_logger(), "Writing Complementary Filter parameters."); - driver_->writeRegister(id_, "Do_Adaptive_Gain", do_adaptive_gain_); - driver_->writeRegister(id_, "Do_Bias_Estimation", do_bias_estimation_); - - // dynamixel library requires data (up to 4 bytes) as uint32_t - // float would be cast to int losing the decimal and being interpreted wrongly on the device - uint32_t data; - memcpy(&data, &accel_gain_, sizeof(data)); - driver_->writeRegister(id_, "Accel_Gain", data); - memcpy(&data, &bias_alpha_, sizeof(data)); - driver_->writeRegister(id_, "Bias_Alpha", data); - - write_complementary_filter_params_ = false; - } - if (calibrate_accel_) { - RCLCPP_ERROR(nh_->get_logger(), "Disabled for normal users for safety reasons, uncomment code to use"); - // driver_->writeRegister(id_, "Calibrate_Accel", 1); - calibrate_accel_ = false; - } - if (reset_accel_calibration_) { - RCLCPP_ERROR(nh_->get_logger(), "Disabled for normal users for safety reasons, uncomment code to use"); - // driver_->writeRegister(id_, "Reset_Accel_Calibration", 1); - reset_accel_calibration_ = false; - } - if (set_accel_calib_threshold_) { - uint32_t data; - memcpy(&data, &accel_calib_threshold_, sizeof(data)); - driver_->writeRegister(id_, "Accel_Calibration_Threshold", data); - set_accel_calib_threshold_ = false; - } -} - -void ImuHardwareInterface::restoreAfterPowerCycle() { write_complementary_filter_params_ = true; } -} // namespace bitbots_ros_control diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/leds_hardware_interface.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/leds_hardware_interface.cpp deleted file mode 100644 index 98cf9de8b8..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/leds_hardware_interface.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include - -namespace bitbots_ros_control { -using std::placeholders::_1; -using std::placeholders::_2; -using std::placeholders::_3; - -LedsHardwareInterface::LedsHardwareInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, - uint8_t id, uint8_t num_leds, uint8_t start_number) { - nh_ = nh; - driver_ = driver; - id_ = id; - leds_.resize(num_leds); - start_number_ = start_number; - // we want to write the LEDs in the beginning to show that ros control started successfully. set LED 1 white - write_leds_ = true; - leds_[0] = std_msgs::msg::ColorRGBA(); - leds_[0].r = 0.3; - leds_[0].g = 0.3; - leds_[0].b = 0.3; - leds_[0].a = 1.0; -} - -bool LedsHardwareInterface::init() { - if (start_number_ == 0) { - leds_service_ = nh_->create_service( - "/set_leds", std::bind(&LedsHardwareInterface::setLeds, this, _1, _2)); - } - sub0_ = nh_->create_subscription("/led" + std::to_string(start_number_), 1, - std::bind(&LedsHardwareInterface::ledCb0, this, _1)); - sub1_ = nh_->create_subscription("/led" + std::to_string(start_number_ + 1), 1, - std::bind(&LedsHardwareInterface::ledCb1, this, _1)); - sub2_ = nh_->create_subscription("/led" + std::to_string(start_number_ + 2), 1, - std::bind(&LedsHardwareInterface::ledCb2, this, _1)); - return true; -} - -// todo this could be done more clever and for a general number of leds -void LedsHardwareInterface::ledCb0(std_msgs::msg::ColorRGBA msg) { - // only write to bus if there is actually a change - if (msg.r != leds_[0].r || msg.g != leds_[0].g || msg.b != leds_[0].b) { - leds_[0] = msg; - write_leds_ = true; - } -} - -void LedsHardwareInterface::ledCb1(std_msgs::msg::ColorRGBA msg) { - // only write to bus if there is actually a change - if (msg.r != leds_[1].r || msg.g != leds_[1].g || msg.b != leds_[1].b) { - leds_[1] = msg; - write_leds_ = true; - } -} - -void LedsHardwareInterface::ledCb2(std_msgs::msg::ColorRGBA msg) { - // only write to bus if there is actually a change - if (msg.r != leds_[2].r || msg.g != leds_[2].g || msg.b != leds_[2].b) { - leds_[2] = msg; - write_leds_ = true; - } -} - -void LedsHardwareInterface::read(const rclcpp::Time& t, const rclcpp::Duration& dt) {} - -void LedsHardwareInterface::setLeds(const std::shared_ptr req, - std::shared_ptr resp) { - RCLCPP_WARN_STREAM(nh_->get_logger(), "service"); - if (req->leds.size() != leds_.size()) { - RCLCPP_WARN_STREAM(nh_->get_logger(), "You are trying to set " << req->leds.size() << " leds while the board has " - << leds_.size() << " leds."); - } - - for (size_t i = 0; i < leds_.size(); i++) { - // return current state of LEDs - resp->previous_leds.push_back(leds_[i]); - - if (req->leds[i].r > 1.0f || req->leds[i].r < 0.0f || req->leds[i].g > 1.0f || req->leds[i].g < 0.0f || - req->leds[i].b > 1.0f || req->leds[i].b < 0.0f) { - RCLCPP_WARN_STREAM(nh_->get_logger(), "You tried to set LED_" << i << " to a value not between 0 and 1"); - } - leds_[i] = req->leds[i]; - } - write_leds_ = true; -} - -uint32_t rgba_to_int32(std_msgs::msg::ColorRGBA rgba) { - uint32_t led = ((uint8_t)(rgba.r * 255)); - led |= ((uint8_t)(rgba.g * 255)) << 8; - led |= ((uint8_t)(rgba.b * 255)) << 16; - led |= ((uint8_t)(rgba.a * 255)) << 24; - return led; -} - -void LedsHardwareInterface::write(const rclcpp::Time& t, const rclcpp::Duration& dt) { - if (write_leds_) { - // resort LEDs to go from left to right - driver_->writeRegister(id_, "LED_2", rgba_to_int32(leds_[0])); - driver_->writeRegister(id_, "LED_1", rgba_to_int32(leds_[1])); - driver_->writeRegister(id_, "LED_0", rgba_to_int32(leds_[2])); - - write_leds_ = false; - } -} -} // namespace bitbots_ros_control \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/node.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/node.cpp deleted file mode 100644 index fd681c8c88..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/node.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include - -#include -#include -#include -#include -#include - -sig_atomic_t volatile request_shutdown = 0; - -void sigintHandler(int sig) { - // gives other nodes some time to perform shutdown procedures with robot - request_shutdown = 1; -} - -int main(int argc, char* argv[]) { - // register signal handler for ctrl-c that we use to request shutdown but give extra time for other nodes to finish - signal(SIGINT, sigintHandler); - - // initialize ros - rclcpp::init(argc, argv); - rclcpp::NodeOptions options = - rclcpp::NodeOptions().automatically_declare_parameters_from_overrides(true).allow_undeclared_parameters(true); - rclcpp::Node::SharedPtr nh = rclcpp::Node::make_shared("wolfgang_hardware_interface", options); - - // create hardware interfaces - bitbots_ros_control::WolfgangHardwareInterface hw(nh); - if (!hw.init()) { - RCLCPP_ERROR(nh->get_logger(), "Failed to initialize hardware interface."); - return 1; - } - - // diagnostics - int diag_counter = 0; - rclcpp::Publisher::SharedPtr diagnostic_pub = - nh->create_publisher("/diagnostics", 10); - diagnostic_msgs::msg::DiagnosticArray array_msg = diagnostic_msgs::msg::DiagnosticArray(); - diagnostic_msgs::msg::DiagnosticStatus status = diagnostic_msgs::msg::DiagnosticStatus(); - // add prefix PS for pressure sensor to sort in diagnostic analyser - status.name = "BUSBus"; - status.hardware_id = "Bus"; - - // Start control loop - rclcpp::Time current_time = nh->get_clock()->now(); - rclcpp::Duration period = nh->get_clock()->now() - current_time; - bool first_update = true; - float control_loop_hz = 500.0; - nh->get_parameter("control_loop_hz", control_loop_hz); - rclcpp::Rate rate(control_loop_hz); - rclcpp::Time stop_time; - bool shut_down_started = false; - rclcpp::experimental::executors::EventsExecutor exec; - exec.add_node(nh); - - while (!request_shutdown || nh->get_clock()->now().seconds() - stop_time.seconds() < 5) { - // - // read - // - hw.read(current_time, period); - period = nh->get_clock()->now() - current_time; - current_time = nh->get_clock()->now(); - - // period only makes sense after the first update - // therefore, the controller manager is only updated starting with the second iteration - if (first_update) { - first_update = false; - } else { - // todo replaced controller part, if necessary - } - - // - // Write - // - hw.write(current_time, period); - exec.spin_some(); - rate.sleep(); - - // - // Diagnostics - // - // publish diagnostic messages each 100 frames - if (diag_counter % 100 == 0) { - // check if we are staying the correct cycle time. warning if we only get half - array_msg.header.stamp = nh->get_clock()->now(); - if (rate.period() < std::chrono::nanoseconds(int(1e9 * (1 / control_loop_hz) * 2))) { - status.level = diagnostic_msgs::msg::DiagnosticStatus::OK; - status.message = ""; - } else { - status.level = diagnostic_msgs::msg::DiagnosticStatus::WARN; - status.message = "Bus runs not at specified frequency"; - } - std::vector array = std::vector(); - array.push_back(status); - array_msg.status = array; - diagnostic_pub->publish(array_msg); - } - diag_counter++; - - if (request_shutdown && !shut_down_started) { - stop_time = nh->get_clock()->now(); - shut_down_started = true; - RCLCPP_INFO(nh->get_logger(), "Shutting down in 5 seconds"); - } - } - return 0; -} diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/pressure_converter.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/pressure_converter.cpp deleted file mode 100644 index d4285c5f88..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/pressure_converter.cpp +++ /dev/null @@ -1,275 +0,0 @@ -#include -using std::placeholders::_1; -using std::placeholders::_2; - -PressureConverter::PressureConverter(rclcpp::Node::SharedPtr nh, char side) { - nh_ = nh; - std::string topic; - rclcpp::CallbackGroup::SharedPtr sub_cbg_ = nh_->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive); - - if (side == 'l') { - if (!nh_->has_parameter("left_topic")) - RCLCPP_ERROR_STREAM(nh_->get_logger(), nh_->get_name() << ": left_topic not specified"); - topic = nh_->get_parameter("left_topic").as_string(); - } else if (side == 'r') { - if (!nh_->has_parameter("right_topic")) - RCLCPP_ERROR_STREAM(nh_->get_logger(), nh_->get_name() << ": right_topic not specified"); - topic = nh_->get_parameter("right_topic").as_string(); - } - - if (!nh_->has_parameter("average")) - RCLCPP_ERROR_STREAM(nh_->get_logger(), nh_->get_name() << ": average not specified"); - average_ = nh_->get_parameter("average").as_int(); - - if (!nh_->has_parameter("scale_and_zero_average")) - RCLCPP_ERROR_STREAM(nh_->get_logger(), nh_->get_name() << ": scale_and_zero_average not specified"); - scale_and_zero_average_ = nh_->get_parameter("scale_and_zero_average").as_int(); - - scale_lr_ = "scale_"; - scale_lr_ += side; - zero_lr_ = "zero_"; - zero_lr_ += side; - cop_lr_ = "cop_"; - cop_lr_ += side; - sole_lr_ = side; - sole_lr_ += "_sole"; - - if (!nh_->has_parameter(zero_lr_)) { - RCLCPP_ERROR_STREAM(nh_->get_logger(), nh_->get_name() << ": " << zero_lr_ << " not specified"); - zero_ = {0, 0, 0, 0}; - } else { - zero_ = nh_->get_parameter(zero_lr_).as_double_array(); - } - - if (!nh_->has_parameter(scale_lr_)) { - RCLCPP_ERROR_STREAM(nh_->get_logger(), nh_->get_name() << ": " << scale_lr_ << " not specified"); - scale_ = {1, 1, 1, 1}; - } else { - scale_ = nh_->get_parameter(scale_lr_).as_double_array(); - } - if (!nh_->has_parameter("cop_threshold")) - RCLCPP_ERROR_STREAM(nh_->get_logger(), nh_->get_name() << ": cop_threshold not specified"); - cop_threshold_ = nh_->get_parameter("cop_threshold").as_double(); - - side_ = side; - - // initialize vector for previous values for average calculations - for (int i = 0; i < 4; i++) { - std::vector x; - for (int j = 0; j < average_; j++) { - x.push_back(0.0); - } - previous_values_.push_back(x); - } - current_index_ = 0; - - save_zero_and_scale_values_ = false; - resetZeroAndScaleValues(); - - filtered_pub_ = nh_->create_publisher(topic + "/filtered", 1); - cop_pub_ = nh_->create_publisher("/" + cop_lr_, 1); - std::string wrench_topics[] = {"l_front", "l_back", "r_front", "r_back", "cop"}; - for (int i = 0; i < 5; i++) { - std::stringstream single_wrench_topic; - single_wrench_topic << topic << "/wrench/" << wrench_topics[i]; - wrench_pubs_.push_back(nh_->create_publisher(single_wrench_topic.str(), 1)); - } - for (int i = 0; i < 4; i++) { - std::stringstream single_wrench_frame; - single_wrench_frame << side << "_" << "cleat_" << wrench_topics[i]; - wrench_frames_.push_back(single_wrench_frame.str()); - } - - scale_service_ = nh_->create_service( - topic + "/set_foot_scale", std::bind(&PressureConverter::scaleCallback, this, _1, _2)); - zero_service_ = nh_->create_service(topic + "/set_foot_zero", - std::bind(&PressureConverter::zeroCallback, this, _1, _2)); - rclcpp::SubscriptionOptions options; - rclcpp::QoS qos(0); - options.callback_group = sub_cbg_; - sub_ = nh_->create_subscription( - topic + "/raw", qos, std::bind(&PressureConverter::pressureCallback, this, _1), options); - tf_broadcaster_ = std::make_unique(*nh_); - - sub_executor_.add_callback_group(sub_cbg_, nh_->get_node_base_interface()); - sub_executor_thread_ = std::make_shared([this]() { sub_executor_.spin(); }); -} - -void PressureConverter::pressureCallback(bitbots_msgs::msg::FootPressure pressure_raw) { - bitbots_msgs::msg::FootPressure filtered_msg; - - filtered_msg.header = pressure_raw.header; - - previous_values_[0][current_index_] = ((pressure_raw.left_front) - zero_[0]) * scale_[0]; - previous_values_[1][current_index_] = ((pressure_raw.left_back) - zero_[1]) * scale_[1], - previous_values_[2][current_index_] = ((pressure_raw.right_front) - zero_[2]) * scale_[2], - previous_values_[3][current_index_] = ((pressure_raw.right_back) - zero_[3]) * scale_[3]; - - filtered_msg.left_front = std::accumulate(previous_values_[0].begin(), previous_values_[0].end(), 0.0) / average_; - filtered_msg.left_back = std::accumulate(previous_values_[1].begin(), previous_values_[1].end(), 0.0) / average_; - filtered_msg.right_front = std::accumulate(previous_values_[2].begin(), previous_values_[2].end(), 0.0) / average_; - filtered_msg.right_back = std::accumulate(previous_values_[3].begin(), previous_values_[3].end(), 0.0) / average_; - current_index_ = (current_index_ + 1) % average_; - - filtered_msg.left_front = std::max(filtered_msg.left_front, 0.0); - filtered_msg.left_back = std::max(filtered_msg.left_back, 0.0); - filtered_msg.right_front = std::max(filtered_msg.right_front, 0.0); - filtered_msg.right_back = std::max(filtered_msg.right_back, 0.0); - - std::vector forces_list = {filtered_msg.left_front, filtered_msg.left_back, filtered_msg.right_front, - filtered_msg.right_back}; - for (int i = 0; i < 4; i++) { - geometry_msgs::msg::WrenchStamped w; - w.header.frame_id = wrench_frames_[i]; - w.header.stamp = pressure_raw.header.stamp; - w.wrench.force.z = forces_list[i]; - wrench_pubs_[i]->publish(w); - } - filtered_pub_->publish(filtered_msg); - if (save_zero_and_scale_values_) { - zero_and_scale_values_[0].push_back(pressure_raw.left_front); - zero_and_scale_values_[1].push_back(pressure_raw.left_back); - zero_and_scale_values_[2].push_back(pressure_raw.right_front); - zero_and_scale_values_[3].push_back(pressure_raw.right_back); - } - - // publish center of pressure - double pos_x = 0.085, pos_y = 0.045; - geometry_msgs::msg::PointStamped cop; - cop.header.frame_id = sole_lr_; - cop.header.stamp = pressure_raw.header.stamp; - double sum_of_forces = - filtered_msg.left_front + filtered_msg.left_back + filtered_msg.right_back + filtered_msg.right_front; - if (sum_of_forces > cop_threshold_) { - cop.point.x = - (filtered_msg.left_front + filtered_msg.right_front - filtered_msg.left_back - filtered_msg.right_back) * - pos_x / sum_of_forces; - cop.point.x = std::max(std::min(cop.point.x, pos_x), -pos_x); - - cop.point.y = - (filtered_msg.left_front + filtered_msg.left_back - filtered_msg.right_front - filtered_msg.right_back) * - pos_y / sum_of_forces; - cop.point.y = std::max(std::min(cop.point.y, pos_y), -pos_y); - } else { - cop.point.x = 0; - cop.point.y = 0; - } - cop_pub_->publish(cop); - - geometry_msgs::msg::TransformStamped cop_tf; - cop_tf.header = cop.header; - cop_tf.child_frame_id = cop_lr_; - cop_tf.transform.translation.x = cop.point.x; - cop_tf.transform.translation.y = cop.point.y; - cop_tf.transform.rotation.w = 1; - tf_broadcaster_->sendTransform(cop_tf); - - geometry_msgs::msg::WrenchStamped w_cop; - w_cop.header.frame_id = cop_lr_; - w_cop.header.stamp = pressure_raw.header.stamp; - w_cop.wrench.force.z = sum_of_forces; - wrench_pubs_[4]->publish(w_cop); -} - -void PressureConverter::resetZeroAndScaleValues() { - zero_and_scale_values_.clear(); - for (int i = 0; i < 4; i++) { - std::vector x; - zero_and_scale_values_.push_back(x); - } -} - -void PressureConverter::collectMessages() { - save_zero_and_scale_values_ = true; - while (int(zero_and_scale_values_[0].size()) < scale_and_zero_average_) { - RCLCPP_WARN_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 0.25, "%ld of %d msgs", zero_and_scale_values_[0].size(), - scale_and_zero_average_); - } - save_zero_and_scale_values_ = false; -} - -void PressureConverter::saveYAML() { - std::string path_to_yaml, robot_name; - if (std::getenv("ROBOT_NAME")) { - robot_name = std::getenv("ROBOT_NAME"); - } else { - robot_name = "nobot"; - } - path_to_yaml = - ament_index_cpp::get_package_share_directory("bitbots_ros_control") + "/config/pressure_" + robot_name + ".yaml"; - - std::vector scale_r, scale_l, zero_r, zero_l; - zero_r = nh_->get_parameter("zero_r").as_double_array(); - zero_l = nh_->get_parameter("zero_l").as_double_array(); - scale_r = nh_->get_parameter("scale_r").as_double_array(); - scale_l = nh_->get_parameter("scale_l").as_double_array(); - - YAML::Emitter e; - e << YAML::BeginMap; - e << YAML::Key << "pressure_converter"; - e << YAML::BeginMap; - e << YAML::Key << "ros__parameters"; - e << YAML::BeginMap; - e << YAML::Key << "zero_r"; - e << YAML::Value << zero_r; - e << YAML::Key << "zero_l"; - e << YAML::Value << zero_l; - e << YAML::Key << "scale_r"; - e << YAML::Value << scale_r; - e << YAML::Key << "scale_l"; - e << YAML::Value << scale_l; - e << YAML::EndMap; - e << YAML::EndMap; - - std::ofstream yaml_file; - yaml_file.open(path_to_yaml); - yaml_file << e.c_str(); - yaml_file.close(); -} - -bool PressureConverter::scaleCallback(const std::shared_ptr req, - std::shared_ptr resp) { - collectMessages(); - double average = - std::accumulate(zero_and_scale_values_[req->sensor].begin(), zero_and_scale_values_[req->sensor].end(), 0.0) / - zero_and_scale_values_[req->sensor].size(); - RCLCPP_WARN_STREAM(nh_->get_logger(), "avg: " << average); - average -= zero_[req->sensor]; - RCLCPP_WARN_STREAM(nh_->get_logger(), "avg_after: " << average); - - scale_[req->sensor] = req->weight / average; - resetZeroAndScaleValues(); - nh_->set_parameter(rclcpp::Parameter(scale_lr_, rclcpp::ParameterValue(scale_))); - saveYAML(); - return true; -} - -bool PressureConverter::zeroCallback(const std::shared_ptr req, - std::shared_ptr resp) { - collectMessages(); - for (int i = 0; i < 4; i++) { - zero_[i] = std::accumulate(zero_and_scale_values_[i].begin(), zero_and_scale_values_[i].end(), 0.0) / - zero_and_scale_values_[i].size(); - } - resetZeroAndScaleValues(); - nh_->set_parameter(rclcpp::Parameter(zero_lr_, rclcpp::ParameterValue(zero_))); - saveYAML(); - return true; -} - -int main(int argc, char* argv[]) { - rclcpp::init(argc, argv); - // declare parameters automatically - rclcpp::NodeOptions options = rclcpp::NodeOptions().automatically_declare_parameters_from_overrides(true); - rclcpp::Node::SharedPtr nh = rclcpp::Node::make_shared("pressure_converter", options); - - rclcpp::executors::StaticSingleThreadedExecutor executor; - executor.add_node(nh); - - PressureConverter r(nh, 'r'); - PressureConverter l(nh, 'l'); - - executor.spin(); - - return 0; -} diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/servo_bus_interface.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/servo_bus_interface.cpp deleted file mode 100644 index ed47806b08..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/servo_bus_interface.cpp +++ /dev/null @@ -1,761 +0,0 @@ -#include -#include - -namespace bitbots_ros_control { - -ServoBusInterface::ServoBusInterface(rclcpp::Node::SharedPtr nh, std::shared_ptr& driver, - std::vector> servos) - : first_cycle_(true), read_position_(true), read_velocity_(false), read_effort_(true) { - nh_ = nh; - driver_ = driver; - servos_ = std::move(servos); -} - -bool ServoBusInterface::init() { - diagnostic_pub_ = nh_->create_publisher("/diagnostics", 10); - speak_pub_ = nh_->create_publisher("/speak", 1); - - lost_servo_connection_ = false; - read_vt_counter_ = 0; - switch_individual_torque_ = false; - current_torque_ = false; - reading_successes_ = 0; - reading_errors_ = 0; - - torqueless_mode_ = nh_->get_parameter("torqueless_mode").as_bool(); - goal_torque_ = !torqueless_mode_; - read_volt_temp_ = nh_->get_parameter("servos.read_volt_temp").as_bool(); - vt_update_rate_ = nh_->get_parameter("servos.VT_update_rate").as_int(); - warn_volt_ = nh_->get_parameter("servos.warn_volt").as_double(); - warn_temp_ = nh_->get_parameter("servos.warn_temp").as_double(); - - // Load dynamixel config from parameter server - if (!loadDynamixels()) { - RCLCPP_ERROR_STREAM(nh_->get_logger(), "Failed to ping all motors."); - speakError(speak_pub_, "Failed to ping all motors."); - return false; - } - - // init the different sync write and read commands that will maybe necessary - driver_->addSyncWrite("Torque_Enable"); - driver_->addSyncWrite("Goal_Position"); - driver_->addSyncWrite("Goal_Velocity"); - driver_->addSyncWrite("Profile_Velocity"); - driver_->addSyncWrite("Profile_Acceleration"); - driver_->addSyncWrite("Goal_Current"); - driver_->addSyncWrite("Goal_PWM"); - driver_->addSyncWrite("Operating_Mode"); - driver_->addSyncRead("Present_Current"); - driver_->addSyncRead("Present_Velocity"); - driver_->addSyncRead("Present_Position"); - driver_->addSyncRead("Present_PWM"); - driver_->addSyncRead("Hardware_Error_Status"); - - // Switch dynamixels to correct control mode (position, velocity, effort) - switchDynamixelControlMode(); - - // allocate correct memory for number of used joints - joint_count_ = joint_names_.size(); - current_position_.resize(joint_count_, 0); - current_velocity_.resize(joint_count_, 0); - current_effort_.resize(joint_count_, 0); - current_pwm_.resize(joint_count_, 0); - current_input_voltage_.resize(joint_count_, 0); - current_temperature_.resize(joint_count_, 0); - current_error_.resize(joint_count_, 0); - goal_position_.resize(joint_count_, 0); - goal_velocity_.resize(joint_count_, 0); - goal_acceleration_.resize(joint_count_, 0); - goal_effort_.resize(joint_count_, 0); - goal_torque_individual_.resize(joint_count_, 1); - - // reserve memory only once for later reads and writes to improve performance - data_sync_read_positions_.resize(joint_count_); - data_sync_read_velocities_.resize(joint_count_); - data_sync_read_efforts_.resize(joint_count_); - data_sync_read_pwms_.resize(joint_count_); - data_sync_read_error_.resize(joint_count_); - sync_write_goal_position_.resize(joint_count_); - sync_write_goal_velocity_.resize(joint_count_); - sync_write_profile_velocity_.resize(joint_count_); - sync_write_profile_acceleration_.resize(joint_count_); - sync_write_goal_current_.resize(joint_count_); - sync_write_goal_pwm_.resize(joint_count_); - - // write ROM and RAM values if wanted - if (nh_->get_parameter("servos.set_ROM_RAM").as_bool()) { - if (!writeROMRAM(true)) { - RCLCPP_WARN(nh_->get_logger(), "Couldn't write ROM and RAM values to all servos."); - } - } - writeTorque(nh_->get_parameter("servos.auto_torque").as_bool()); - return true; -} - -bool ServoBusInterface::loadDynamixels() { - /** - * Load config and try to ping servos to test if everything is correct. - * Adds all dynamixel to the driver if they are pingable. - */ - bool success = true; - - // prepare diagnostic msg - diagnostic_msgs::msg::DiagnosticArray array_msg = diagnostic_msgs::msg::DiagnosticArray(); - std::vector array = std::vector(); - array_msg.header.stamp = nh_->get_clock()->now(); - - // get control mode - std::string control_mode; - control_mode = nh_->get_parameter("servos.control_mode").as_string(); - RCLCPP_DEBUG(nh_->get_logger(), "Control mode: %s", control_mode.c_str()); - if (!stringToControlMode(nh_, control_mode, control_mode_)) { - return false; - } - - // get values to read - read_position_ = nh_->get_parameter("servos.read_position").as_bool(); - read_velocity_ = nh_->get_parameter("servos.read_velocity").as_bool(); - read_effort_ = nh_->get_parameter("servos.read_effort").as_bool(); - read_pwm_ = nh_->get_parameter("servos.read_pwm").as_bool(); - - // iterate over all servos and save the information - // the wolfgang hardware interface already loaded them into the driver by pinging - for (std::tuple& servo : servos_) { - int motor_id = std::get<0>(servo); - joint_ids_.push_back(uint8_t(motor_id)); - std::string joint_name = std::get<1>(servo); - joint_names_.push_back(joint_name); - float mounting_offset = std::get<2>(servo); - joint_mounting_offsets_.push_back(mounting_offset); - float joint_offset = std::get<3>(servo); - joint_offsets_.push_back(joint_offset); - std::string group = std::get<4>(servo); - joint_groups_.push_back(group); - } - - // generate a diagnostic message - array_msg.status = array; - diagnostic_pub_->publish(array_msg); - - return success; -} - -bool ServoBusInterface::writeROMRAM(bool first_time) { - /** - * This method writes the ROM and RAM values specified in the config to all servos. - */ - RCLCPP_DEBUG(nh_->get_logger(), "Writing ROM and RAM values"); - // Iterate over all groups - bool success = true; - // Initilize datastructure to hold the parameters temporarily before we write them all at once - // Joint id -> Register name -> Register value - std::map> joint_register_value_map; - // Group id -> Register name -> Register value - std::map> group_param_cache; - // Iterate over all joints - for (size_t num = 0; num < joint_names_.size(); num++) { - // Get the joint group - auto joint_group = joint_groups_[num]; - // Check if we already have the parameters for this group - if (group_param_cache.find(joint_group) == group_param_cache.end()) { - // Get the parameters of the group - static const std::string ROM_RAM_PARAMETER_NAMESPACE = "servos.ROM_RAM_"; - // Get a list of all parameters in this section - rcl_interfaces::msg::ListParametersResult rom_ram_parameter_list = - nh_->list_parameters({ROM_RAM_PARAMETER_NAMESPACE + joint_group}, 0); - // Iterate over the parameters and set each one - for (std::string& register_parameter_name : rom_ram_parameter_list.names) { - // Get the value of the parameter - int value = nh_->get_parameter(register_parameter_name).as_int(); - // Get only the name of the register without the namespace - auto register_name = - register_parameter_name.substr(ROM_RAM_PARAMETER_NAMESPACE.size() + joint_group.size() + 1); - // Add the parameter to the cache - group_param_cache[joint_group][register_name] = value; - } - } - // Add the registers to the given joint in the map - joint_register_value_map[num] = group_param_cache[joint_group]; - } - - // Check that all groups have the same parameters not only the same number of parameters - // Get all keys of the first group - std::vector parameter_names; - for (auto const& [key, value] : joint_register_value_map[0]) { - parameter_names.push_back(key); - } - for (auto const& [group_id, group_params] : group_param_cache) { - // Check that the size is the same - if (group_params.size() != parameter_names.size()) { - RCLCPP_ERROR(nh_->get_logger(), "Servo group %s has a different number of servo parameters", group_id.c_str()); - success = false; - } - // Check that all keys are the same - for (std::string& key : parameter_names) { - if (group_params.find(key) == group_params.end()) { - RCLCPP_ERROR(nh_->get_logger(), "Group %s does not have parameter %s", group_id.c_str(), key.c_str()); - success = false; - } - } - } - - // Allocate memory for the values in the driver - std::vector values(joint_names_.size()); - // Iterate over parameter names - for (const auto& register_name : parameter_names) { - // Get the value for each joint - for (size_t num = 0; num < joint_names_.size(); num++) { - // Get the value from the cache - int register_value = joint_register_value_map[num][register_name]; - RCLCPP_DEBUG(nh_->get_logger(), "Setting %s on servo %s to %d", register_name.c_str(), joint_names_[num].c_str(), - register_value); - // Set the value in the driver - values[num] = register_value; - } - if (first_time) { - driver_->addSyncWrite(register_name.c_str()); - } - success = success && driver_->syncWrite(register_name.c_str(), values.data()); - } - return success; -} - -void ServoBusInterface::read(const rclcpp::Time& t, const rclcpp::Duration& dt) { - /** - * This is part of the main loop and handles reading of all connected devices - */ - bool read_successful = true; - // either read all values or a single one, depending on config - if (read_position_ && read_velocity_ && read_effort_) { - if (syncReadAll()) { - for (size_t num = 0; num < joint_names_.size(); num++) { - current_position_[num] += joint_mounting_offsets_[num] + joint_offsets_[num]; - } - } else { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, "Couldn't read all current joint values!"); - read_successful = false; - } - } else { - if (read_position_) { - if (syncReadPositions()) { - for (size_t num = 0; num < joint_names_.size(); num++) { - current_position_[num] += joint_mounting_offsets_[num] + joint_offsets_[num]; - } - } else { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, "Couldn't read current joint position!"); - driver_->reinitSyncReadHandler("Present_Position"); - read_successful = false; - } - } - if (read_velocity_) { - if (!syncReadVelocities()) { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, "Couldn't read current joint velocity!"); - driver_->reinitSyncReadHandler("Present_Velocity"); - read_successful = false; - } - } - if (read_effort_) { - if (!syncReadEfforts()) { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, "Couldn't read current joint effort!"); - driver_->reinitSyncReadHandler("Present_Current"); - read_successful = false; - } - } - } - - if (read_pwm_) { - if (!syncReadPWMs()) { - driver_->reinitSyncReadHandler("Present_PWM"); - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, "Couldn't read current PWM!"); - read_successful = false; - } - } - - if (read_volt_temp_) { - if (read_vt_counter_ + 1 == vt_update_rate_) { - bool success = true; - if (!syncReadVoltageAndTemp()) { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, - "Couldn't read current input volatage and temperature!"); - success = false; - } - if (!syncReadError()) { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 1000, "Couldn't read current error bytes!"); - success = false; - driver_->reinitSyncReadHandler("Hardware_Error_Status"); - } - processVte(success); - } - read_vt_counter_ = (read_vt_counter_ + 1) % vt_update_rate_; - } - - if (first_cycle_) { - // when the servos have a goal position which is not the current position on startup - // they will rapidly move to this position, possibly damaging the robot - // therefore the goal position is set to the current position of the motors - for (size_t i = 0; i < current_position_.size(); i++) { - goal_position_[i] = current_position_[i]; - } - first_cycle_ = false; - } - - // remember - if (!read_successful) { - lost_servo_connection_ = true; - reading_errors_ += 1; - } else { - reading_successes_ += 1; - } - - if (reading_errors_ + reading_successes_ > 200 && - (float)reading_errors_ / (float)(reading_successes_ + reading_errors_) > 0.05f) { - speakError(speak_pub_, "Multiple servo reading errors!"); - reading_errors_ = 0; - reading_successes_ = 0; - } - - if (reading_errors_ + reading_successes_ > 2000) { - reading_errors_ = 0; - reading_successes_ = 0; - } -} - -void ServoBusInterface::write(const rclcpp::Time& t, const rclcpp::Duration& dt) { - /** - * This is part of the mainloop and handles all the writing to the connected devices - */ - // check if we have to switch the torque - if (current_torque_ != goal_torque_) { - writeTorque(goal_torque_); - } - if (switch_individual_torque_) { - writeTorqueForServos(goal_torque_individual_); - switch_individual_torque_ = false; - } - - // reset torques if we lost connection to them - if (lost_servo_connection_) { - RCLCPP_INFO_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 5, "resetting torque after lost connection"); - writeTorqueForServos(goal_torque_individual_); - } - if (control_mode_ == POSITION_CONTROL) { - if (goal_effort_ != last_goal_effort_ || lost_servo_connection_) { - syncWritePWM(); - last_goal_effort_ = goal_effort_; - } - - if (goal_velocity_ != last_goal_velocity_ || lost_servo_connection_) { - syncWriteProfileVelocity(); - last_goal_velocity_ = goal_velocity_; - } - - if (goal_acceleration_ != last_goal_acceleration_ || lost_servo_connection_) { - syncWriteProfileAcceleration(); - last_goal_acceleration_ = goal_acceleration_; - } - - if (goal_position_ != last_goal_position_ || lost_servo_connection_) { - syncWritePosition(); - last_goal_position_ = goal_position_; - } - } else if (control_mode_ == VELOCITY_CONTROL) { - syncWriteVelocity(); - } else if (control_mode_ == EFFORT_CONTROL) { - syncWriteCurrent(); - } else if (control_mode_ == CURRENT_BASED_POSITION_CONTROL) { - // only write things if it is necessary - if (goal_effort_ != last_goal_effort_ || lost_servo_connection_) { - syncWriteCurrent(); - last_goal_effort_ = goal_effort_; - } - - if (goal_velocity_ != last_goal_velocity_ || lost_servo_connection_) { - syncWriteProfileVelocity(); - last_goal_velocity_ = goal_velocity_; - } - - if (goal_acceleration_ != last_goal_acceleration_ || lost_servo_connection_) { - syncWriteProfileAcceleration(); - last_goal_acceleration_ = goal_acceleration_; - } - - if (goal_position_ != last_goal_position_ || lost_servo_connection_) { - syncWritePosition(); - last_goal_position_ = goal_position_; - } - } - lost_servo_connection_ = false; -} - -void ServoBusInterface::restoreAfterPowerCycle() { writeROMRAM(false); } - -void ServoBusInterface::switchDynamixelControlMode() { - /** - * This method switches the control mode of all servos - */ - - // Torque on dynamixels has to be disabled to change operating mode - // save last torque state for later - bool torque_before_switch = current_torque_; - writeTorque(false); - // magic sleep to make sure that dynamixel have internally processed the request - nh_->get_clock()->sleep_for(rclcpp::Duration::from_nanoseconds(1e9 * 0.1)); - - int32_t value = 3; - if (control_mode_ == POSITION_CONTROL) { - value = 3; - } else if (control_mode_ == VELOCITY_CONTROL) { - value = 1; - } else if (control_mode_ == EFFORT_CONTROL) { - value = 0; - } else if (control_mode_ == CURRENT_BASED_POSITION_CONTROL) { - value = 5; - } else { - RCLCPP_WARN(nh_->get_logger(), "control_mode is wrong, will use position control"); - } - - std::vector operating_mode(joint_names_.size(), value); - int32_t* o = &operating_mode[0]; - driver_->syncWrite("Operating_Mode", o); - - nh_->get_clock()->sleep_for(rclcpp::Duration::from_nanoseconds(1e9 * 0.5)); - // reenable torque if it was previously enabled - writeTorque(torque_before_switch); -} - -diagnostic_msgs::msg::DiagnosticStatus ServoBusInterface::createServoDiagMsg(int id, char level, std::string message, - std::map map, - std::string name) { - /** - * Create a single Diagnostic message for one servo. This is used to build the array message which is then published. - */ - diagnostic_msgs::msg::DiagnosticStatus servo_status = diagnostic_msgs::msg::DiagnosticStatus(); - servo_status.level = level; - // add prefix DS for dynamixel servo to sort in diagnostic analyser - servo_status.name = "DS" + name; - servo_status.message = message; - servo_status.hardware_id = std::to_string(id); - std::vector keyValues = std::vector(); - // iterate through map and save it into values - for (auto const& ent1 : map) { - diagnostic_msgs::msg::KeyValue key_value = diagnostic_msgs::msg::KeyValue(); - key_value.key = ent1.first; - key_value.value = ent1.second; - keyValues.push_back(key_value); - } - servo_status.values = keyValues; - return servo_status; -} - -void ServoBusInterface::processVte(bool success) { - /** - * This processes the data for voltage, temperature and error of the servos. It is mainly used as diagnostic message. - */ - - // prepare diagnostic msg - diagnostic_msgs::msg::DiagnosticArray array_msg = diagnostic_msgs::msg::DiagnosticArray(); - std::vector array = std::vector(); - array_msg.header.stamp = nh_->get_clock()->now(); - - for (size_t i = 0; i < joint_names_.size(); i++) { - char level = diagnostic_msgs::msg::DiagnosticStatus::OK; - std::string message = "OK"; - std::map map; - if (!success) { - // the read of VT or error failed, we will publish this and not the values - message = "No response"; - level = diagnostic_msgs::msg::DiagnosticStatus::STALE; - array.push_back(createServoDiagMsg(joint_ids_[i], level, message, map, joint_names_[i])); - continue; - } - map.insert(std::make_pair("Input Voltage", std::to_string(current_input_voltage_[i]))); - if (current_input_voltage_[i] < warn_volt_) { - message = "Power getting low"; - level = diagnostic_msgs::msg::DiagnosticStatus::WARN; - } - map.insert(std::make_pair("Temperature", std::to_string(current_temperature_[i]))); - if (current_temperature_[i] > warn_temp_) { - message = "Getting hot"; - level = diagnostic_msgs::msg::DiagnosticStatus::WARN; - } - map.insert(std::make_pair("Error Byte", std::to_string(current_error_[i]))); - if (current_error_[i] != 0) { - // some error is detected - level = diagnostic_msgs::msg::DiagnosticStatus::ERROR; - message = "Error(s): "; - // check which one. Values taken from dynamixel documentation - char voltage_error = 0x1; - char overheat_error = 0x4; - char encoder_error = 0x8; - char shock_error = 0x10; - char overload_error = 0x20; - if ((current_error_[i] & voltage_error) != 0) { - message = message + "Voltage "; - } - if ((current_error_[i] & overheat_error) != 0) { - message = message + "Overheat "; - } - if ((current_error_[i] & encoder_error) != 0) { - message = message + "Encoder "; - } - if ((current_error_[i] & shock_error) != 0) { - message = message + "Shock "; - } - if ((current_error_[i] & overload_error) != 0) { - message = message + "Overload"; - // turn off torque on all motors - // todo should also turn off power, but is not possible yet - goal_torque_ = false; - RCLCPP_ERROR(nh_->get_logger(), "OVERLOAD ERROR!!! OVERLOAD ERROR!!! OVERLOAD ERROR!!! In Motor %s", - joint_names_[i].c_str()); - speakError(speak_pub_, "Overload Error!"); - } - } - - array.push_back(createServoDiagMsg(joint_ids_[i], level, message, map, joint_names_[i])); - } - array_msg.status = array; - diagnostic_pub_->publish(array_msg); -} - -void ServoBusInterface::writeTorque(bool enabled) { - /** - * This writes the torque for all servos to the same value - */ - // only set values if we're not in torqueless mode - if (!torqueless_mode_) { - std::vector torque(joint_names_.size(), enabled); - int32_t* t = &torque[0]; - driver_->syncWrite("Torque_Enable", t); - current_torque_ = enabled; - goal_torque_ = enabled; - } -} - -void ServoBusInterface::writeTorqueForServos(std::vector torque) { - /** - * This writes the torque off all servos individually depended on the give vector. - */ - - // only set values if we're not in torqueless mode - if (!torqueless_mode_) { - // this actually writes each value in the torque vector - // but the dynamixel_toolbox requires a reference to the first element - int32_t* t = &torque[0]; - driver_->syncWrite("Torque_Enable", t); - } -} - -bool ServoBusInterface::syncReadPositions() { - /** - * Reads all position information with a single sync read - */ - bool success = driver_->syncRead("Present_Position", data_sync_read_positions_.data()); - if (success) { - for (int i = 0; i < joint_count_; i++) { - // TODO test if this is required - if (data_sync_read_positions_[i] == 0) { - // a value of 0 is often a reading error, therefore we discard it - // this should not cause issues when a motor is actually close to 0 - // since 1 bit only corresponds to + or - 0.1 deg - continue; - } - double current_pos = driver_->convertValue2Radian(joint_ids_[i], data_sync_read_positions_[i]); - if (current_pos < 3.15 && current_pos > -3.15) { - // only write values which are possible - current_position_[i] = current_pos; - } - } - } - return success; -} - -bool ServoBusInterface::syncReadVelocities() { - /** - * Reads all velocity information with a single sync read - */ - bool success = driver_->syncRead("Present_Velocity", data_sync_read_velocities_.data()); - if (success) { - for (int i = 0; i < joint_count_; i++) { - current_velocity_[i] = driver_->convertValue2Velocity(joint_ids_[i], data_sync_read_velocities_[i]); - } - } - return success; -} - -bool ServoBusInterface::syncReadEfforts() { - /** - * Reads all effort information with a single sync read - */ - bool success = driver_->syncRead("Present_Current", data_sync_read_efforts_.data()); - if (success) { - for (int i = 0; i < joint_count_; i++) { - current_effort_[i] = driver_->convertValue2Torque(joint_ids_[i], data_sync_read_efforts_[i]); - } - } - return success; -} - -bool ServoBusInterface::syncReadPWMs() { - /** - * Reads all PWM information with a single sync read - */ - bool success = driver_->syncRead("Present_PWM", data_sync_read_pwms_.data()); - if (success) { - for (int i = 0; i < joint_count_; i++) { - // the data is in int16 - // 100% is a value of 885 - // convert to range -1 to 1 - current_pwm_[i] = ((int16_t)data_sync_read_pwms_[i]) / 885.0; - } - } - return success; -} - -bool ServoBusInterface::syncReadError() { - /** - * Reads all error bytes with a single sync read - */ - bool success = driver_->syncRead("Hardware_Error_Status", data_sync_read_error_.data()); - if (success) { - for (int i = 0; i < joint_count_; i++) { - current_error_[i] = data_sync_read_error_[i]; - } - } - return success; -} - -bool ServoBusInterface::syncReadVoltageAndTemp() { - /** - * Reads all voltages and temperature information with a single sync read - */ - std::vector data; - if (driver_->syncReadMultipleRegisters(144, 3, &data)) { - for (int i = 0; i < joint_count_; i++) { - uint16_t volt = dxlMakeword(data[i * 3], data[i * 3 + 1]); - uint8_t temp = data[i * 3 + 2]; - // convert value to voltage - current_input_voltage_[i] = volt * 0.1; - // is already in °C - current_temperature_[i] = temp; - } - return true; - } else { - return false; - } -} - -bool ServoBusInterface::syncReadAll() { - /** - * Reads all positions, velocities and efforts with a single sync read - */ - if (driver_->syncReadMultipleRegisters(126, 10, &sync_read_all_data_)) { - for (int i = 0; i < joint_count_; i++) { - int16_t eff = dxlMakeword(sync_read_all_data_[i * 10], sync_read_all_data_[i * 10 + 1]); - uint32_t vel = dxlMakedword(dxlMakeword(sync_read_all_data_[i * 10 + 2], sync_read_all_data_[i * 10 + 3]), - dxlMakeword(sync_read_all_data_[i * 10 + 4], sync_read_all_data_[i * 10 + 5])); - uint32_t pos = dxlMakedword(dxlMakeword(sync_read_all_data_[i * 10 + 6], sync_read_all_data_[i * 10 + 7]), - dxlMakeword(sync_read_all_data_[i * 10 + 8], sync_read_all_data_[i * 10 + 9])); - current_effort_[i] = driver_->convertValue2Torque(joint_ids_[i], eff); - current_velocity_[i] = driver_->convertValue2Velocity(joint_ids_[i], vel); - double current_pos = driver_->convertValue2Radian(joint_ids_[i], pos); - if (current_pos < 3.15 && current_pos > -3.15) { - // only write values which are possible - current_position_[i] = current_pos; - } - } - return true; - } else { - return false; - } -} - -void ServoBusInterface::syncWritePosition() { - /** - * Writes all goal positions with a single sync write - */ - for (size_t num = 0; num < joint_names_.size(); num++) { - float radian = goal_position_[num] - joint_mounting_offsets_[num] - joint_offsets_[num]; - sync_write_goal_position_[num] = driver_->convertRadian2Value(joint_ids_[num], radian); - } - driver_->syncWrite("Goal_Position", sync_write_goal_position_.data()); -} - -void ServoBusInterface::syncWriteVelocity() { - /** - * Writes all goal velocities with a single sync write - */ - for (size_t num = 0; num < joint_names_.size(); num++) { - sync_write_goal_velocity_[num] = driver_->convertVelocity2Value(joint_ids_[num], goal_velocity_[num]); - } - driver_->syncWrite("Goal_Velocity", sync_write_goal_velocity_.data()); -} - -void ServoBusInterface::syncWriteProfileVelocity() { - /** - * Writes all profile velocities with a single sync write - */ - for (size_t num = 0; num < joint_names_.size(); num++) { - if (goal_velocity_[num] < 0) { - // we want to set to maximum, which is 0 - sync_write_profile_velocity_[num] = 0; - } else { - // use max to prevent accidentially setting 0 - sync_write_profile_velocity_[num] = - std::max(driver_->convertVelocity2Value(joint_ids_[num], goal_velocity_[num]), 1); - } - } - driver_->syncWrite("Profile_Velocity", sync_write_profile_velocity_.data()); -} - -void ServoBusInterface::syncWriteProfileAcceleration() { - /** - * Writes all profile accelerations with a single sync write - */ - for (size_t num = 0; num < joint_names_.size(); num++) { - if (goal_acceleration_[num] < 0) { - // we want to set to maximum, which is 0 - sync_write_profile_acceleration_[num] = 0; - } else { - // 572.9577952 for change of units, 214.577 rev/min^2 per LSB - sync_write_profile_acceleration_[num] = - std::max(static_cast(goal_acceleration_[num] * 572.9577952 / 214.577), 1); - } - } - driver_->syncWrite("Profile_Acceleration", sync_write_profile_acceleration_.data()); -} - -void ServoBusInterface::syncWriteCurrent() { - /** - * Writes all goal currents with a single sync write - */ - for (size_t num = 0; num < joint_names_.size(); num++) { - if (goal_effort_[num] < 0) { - // we want to set to maximum, which is different for MX-64 and MX-106 - if (driver_->getModelNum(joint_ids_[num]) == 311) { - sync_write_goal_current_[num] = 1941; - } else if (driver_->getModelNum(joint_ids_[num]) == 321) { - sync_write_goal_current_[num] = 2047; - } else { - RCLCPP_WARN(nh_->get_logger(), "Maximal current for this dynamixel model is not defined"); - } - } else { - sync_write_goal_current_[num] = driver_->convertTorque2Value(joint_ids_[num], goal_effort_[num]); - } - } - driver_->syncWrite("Goal_Current", sync_write_goal_current_.data()); -} - -void ServoBusInterface::syncWritePWM() { - for (size_t num = 0; num < joint_names_.size(); num++) { - if (goal_effort_[num] < 0) { - // we want to set to maximum - sync_write_goal_pwm_[num] = 855; - } else { - sync_write_goal_pwm_[num] = goal_effort_[num] / 100.0 * 855.0; - } - } - driver_->syncWrite("Goal_PWM", sync_write_goal_pwm_.data()); -} - -} // namespace bitbots_ros_control diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/utils.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/utils.cpp deleted file mode 100644 index 9286eba43a..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/utils.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include - -namespace bitbots_ros_control { - -bool stringToControlMode(rclcpp::Node::SharedPtr nh, const std::string& _control_modestr, ControlMode& control_mode) { - /** - * Helper method to parse strings to corresponding control modes - */ - if (_control_modestr == "position") { - control_mode = POSITION_CONTROL; - return true; - } else if (_control_modestr == "velocity") { - control_mode = VELOCITY_CONTROL; - return true; - } else if (_control_modestr == "effort") { - control_mode = EFFORT_CONTROL; - return true; - } else if (_control_modestr == "current_based") { - control_mode = CURRENT_BASED_POSITION_CONTROL; - return true; - } else { - RCLCPP_WARN(nh->get_logger(), "Trying to set unknown control mode"); - return false; - } -} - -void speakError(const rclcpp::Publisher::SharedPtr speak_pub, const std::string& text) { - /** - * Helper method to send a message for text-to-speech output - */ - bitbots_msgs::msg::Audio msg = bitbots_msgs::msg::Audio(); - msg.text = text; - msg.priority = 100; - speak_pub->publish(msg); -} - -uint16_t dxlMakeword(uint64_t a, uint64_t b) { return uint16_t(uint8_t(a & 0xff) | uint16_t(uint8_t(b & 0xff)) << 8); } - -uint32_t dxlMakedword(uint64_t a, uint64_t b) { - return uint32_t(uint16_t(a & 0xffff) | uint32_t(uint16_t(b & 0xffff) << 16)); -} - -float dxlMakeFloat(const uint8_t* data) { - float f; - uint32_t b = dxlMakedword(dxlMakeword(data[0], data[1]), dxlMakeword(data[2], data[3])); - memcpy(&f, &b, sizeof(f)); - return f; -} - -std::string gyroRangeToString(uint8_t range) { - switch (range) { - case 0: - return "250 deg/s"; - case 1: - return "500 deg/s"; - case 2: - return "1000 deg/s"; - case 3: - return "2000 deg/s"; - default: - return "invalid range, defaulting to 2000 deg/s"; - } -} - -std::string accelRangeToString(uint8_t range) { - switch (range) { - case 0: - return "2G"; - case 1: - return "4G"; - case 2: - return "8G"; - case 3: - return "16G"; - default: - return "invalid range, defaulting to 16G"; - } -} - -} // namespace bitbots_ros_control diff --git a/src/bitbots_lowlevel/bitbots_ros_control/src/wolfgang_hardware_interface.cpp b/src/bitbots_lowlevel/bitbots_ros_control/src/wolfgang_hardware_interface.cpp deleted file mode 100644 index f0fcc5d875..0000000000 --- a/src/bitbots_lowlevel/bitbots_ros_control/src/wolfgang_hardware_interface.cpp +++ /dev/null @@ -1,336 +0,0 @@ -#include - -namespace bitbots_ros_control { - -/** - * This class provides a combination of multiple hardware interfaces to construct a complete Wolfgang robot. - * It is similar to a CombinedRobotHw class as specified in ros_control, but it is changed a bit to make sharing of - * a common bus driver over multiple hardware interfaces possible. - */ -WolfgangHardwareInterface::WolfgangHardwareInterface(rclcpp::Node::SharedPtr nh) : servo_interface_(nh) { - nh_ = nh; - first_ping_error_ = true; - core_present_ = false; - last_power_status_ = false; - current_power_status_ = false; - speak_pub_ = nh->create_publisher("/speak", 1); - - // load parameters - nh_->get_parameter("only_imu", only_imu_); - nh_->get_parameter("only_pressure", only_pressure_); - if (only_imu_) RCLCPP_WARN(nh_->get_logger(), "Starting in only IMU mode"); - if (only_pressure_) RCLCPP_WARN(nh_->get_logger(), "starting in only pressure sensor mode"); - - if (only_pressure_ && only_imu_) { - RCLCPP_ERROR(nh_->get_logger(), "only_imu AND only_pressure was set to true"); - exit(1); - } - - // get list of all bus devices - rcl_interfaces::msg::ListParametersResult device_name_list = nh_->list_parameters({"device_info"}, 3); - - // Convert dxls to native type: a vector of tuples with name and id for sorting purposes - std::vector> dxl_devices; - for (const std::string& parameter_name : device_name_list.names) { - // we get directly the parameters and not the groups. use id parameter to identify them - if (parameter_name.find(".id") != std::string::npos) { - int id = nh->get_parameter(parameter_name).as_int(); - // remove "device_info." and ".id" - std::string device_name = parameter_name.substr(12, parameter_name.size() - 3 - 12); - dxl_devices.emplace_back(device_name, id); - } - } - - // sort the devices by id. This way the devices will always be read and written in ID order later, making debug - // easier. - std::sort( - dxl_devices.begin(), dxl_devices.end(), - [](const std::pair& a, const std::pair& b) { return a.second < b.second; }); - - // create overall servo interface since we need a single interface for the controllers - servo_interface_ = DynamixelServoHardwareInterface(nh); - - // try to ping all devices on the list, add them to the driver and create corresponding hardware interfaces - // try until interruption to enable the user to turn on the power - while (rclcpp::ok()) { - if (create_interfaces(dxl_devices)) { - break; - } - nh_->get_clock()->sleep_for(rclcpp::Duration::from_seconds(3)); - } -} - -bool WolfgangHardwareInterface::create_interfaces(std::vector> dxl_devices) { - // init bus drivers - std::vector pinged; - rcl_interfaces::msg::ListParametersResult port_list = nh_->list_parameters({"port_info"}, 3); - for (const std::string& parameter_name : port_list.names) { - // we get directly the parameters and not the groups. use id parameter to identify them - if (parameter_name.find(".device_file") != std::string::npos) { - std::string port_name = parameter_name.substr(10, parameter_name.size() - 11 - 11); - // read bus driver specifications from config - std::string device_file = nh_->get_parameter("port_info." + port_name + ".device_file").as_string(); - int baudrate = nh_->get_parameter("port_info." + port_name + ".baudrate").as_int(); - int protocol_version = nh_->get_parameter("port_info." + port_name + ".protocol_version").as_int(); - auto driver = std::make_shared(); - if (!driver->init(device_file.c_str(), uint32_t(baudrate))) { - RCLCPP_ERROR(nh_->get_logger(), "Error opening serial port %s", device_file.c_str()); - speakError(speak_pub_, "Error opening serial port"); - sleep(1); - exit(1); - } - // some interface seem to produce some gitter directly after connecting. wait or it will interfere with pings - // uncomment the following line if you are using such an interface - // sleep(1); - driver->setPacketHandler(protocol_version); - std::vector> interfaces_on_port; - // iterate over all devices and ping them to see what is connected to this bus - std::vector> servos_on_port; - for (std::pair& device : dxl_devices) { - // RCLCPP_INFO_STREAM(nh_->get_logger(), device.first); - std::string name = device.first; - if (std::find(pinged.begin(), pinged.end(), device.first) != pinged.end()) { - // we already found this and don't have to search again - } else { - int id = device.second; - int model_number_specified; - nh_->get_parameter("device_info." + name + ".model_number", model_number_specified); - // some devices provide more than one type of interface, e.g. the IMU provides additionally buttons and LEDs - std::string interface_type; - nh_->get_parameter("device_info." + name + ".interface_type", interface_type); - uint16_t model_number_specified_16 = uint16_t(model_number_specified); - uint16_t model_number_returned_16; - if (driver->ping(uint8_t(id), &model_number_returned_16)) { - // check if the specified model number matches the actual model number of the device - if (model_number_specified_16 != model_number_returned_16) { - RCLCPP_WARN(nh_->get_logger(), "Model number of id %d does not match", id); - } - // ping was successful, add device correspondingly - // only add them if the mode is set correspondingly - // TODO maybe move more of the parameter stuff in the init of the modules instead of doing everything here - if (model_number_specified == 0xABBA && interface_type == "CORE") { - // CORE - int read_rate; - nh_->get_parameter("device_info." + name + ".read_rate", read_rate); - driver->setTools(model_number_specified_16, id); - core_interface_ = std::make_shared(nh_, driver, id, read_rate); - // turn on power, just to be sure - core_interface_->write(nh_->get_clock()->now(), rclcpp::Duration::from_nanoseconds(1e9 * 0)); - interfaces_on_port.push_back(core_interface_); - core_present_ = true; - } else if (model_number_specified == 0 && !only_imu_) { // model number is currently 0 on foot sensors - // bitfoot - std::string topic; - if (!nh_->get_parameter("device_info." + name + ".topic", topic)) { - RCLCPP_WARN(nh_->get_logger(), "Bitfoot topic not specified"); - } - auto interface = std::make_shared(nh_, driver, id, topic, name); - interfaces_on_port.push_back(interface); - } else if (model_number_specified == 0xBAFF && interface_type == "IMU" && !only_pressure_) { - // IMU - std::string topic; - if (!nh_->get_parameter("device_info." + name + ".topic", topic)) { - RCLCPP_WARN(nh_->get_logger(), "IMU topic not specified"); - } - std::string frame; - if (!nh_->get_parameter("device_info." + name + ".frame", frame)) { - RCLCPP_WARN(nh_->get_logger(), "IMU frame not specified"); - } - driver->setTools(model_number_specified_16, id); - auto interface = std::make_shared(nh_, driver, id, topic, frame, name); - /* Hardware interfaces must be registered at the main RobotHW class. - * Therefore, a pointer to this class is passed down to the RobotHW classes - * registering further interfaces */ - interfaces_on_port.push_back(interface); - } else if (model_number_specified == 0xBAFF && interface_type == "Button" && !only_pressure_) { - // Buttons - std::string topic; - if (!nh_->get_parameter("device_info." + name + ".topic", topic)) { - RCLCPP_WARN(nh_->get_logger(), "Button topic not specified"); - } - int read_rate; - nh_->get_parameter("device_info." + name + ".read_rate", read_rate); - interfaces_on_port.push_back( - std::make_shared(nh_, driver, id, topic, read_rate)); - } else if ((model_number_specified == 0xBAFF || model_number_specified == 0xABBA) && - interface_type == "LED" && !only_pressure_) { - // LEDs - int number_of_LEDs, start_number; - nh_->get_parameter("device_info." + name + ".number_of_LEDs", number_of_LEDs); - nh_->get_parameter("device_info." + name + ".start_number", start_number); - interfaces_on_port.push_back( - std::make_shared(nh_, driver, id, number_of_LEDs, start_number)); - } else if ((model_number_specified == 311 || model_number_specified == 321 || - model_number_specified == 1100) && - !only_pressure_ && !only_imu_) { - // Servos - // We need to add the tool to the driver for later reading and writing - driver->setTools(model_number_specified_16, id); - float mounting_offset; - nh_->get_parameter_or("device_info." + name + ".mounting_offset", mounting_offset, 0.0f); - float joint_offset; - nh_->get_parameter_or("device_info." + name + ".joint_offset", joint_offset, 0.0f); - std::string group; - nh_->get_parameter_or("device_info." + name + ".group", group, std::string("DEFAULT")); - servos_on_port.push_back(std::make_tuple(id, name, mounting_offset, joint_offset, group)); - } else { - if (!only_pressure_ && !only_imu_) { - RCLCPP_WARN(nh_->get_logger(), "Could not identify device for ID %d", id); - } - } - pinged.push_back(name); - } - } - } - // create a servo bus interface if there were servos found on this bus - if (servos_on_port.size() > 0) { - auto interface = std::make_shared(nh_, driver, servos_on_port); - interfaces_on_port.push_back(interface); - servo_interface_.addBusInterface(interface); - } - // add vector of interfaces on this port to overall collection of interfaces - interfaces_.push_back(interfaces_on_port); - } - } - - if (pinged.size() != dxl_devices.size()) { - // when we only have 1 or two devices it's only the core - if (pinged.empty() || pinged.size() == 1 || pinged.size() == 2) { - RCLCPP_ERROR_THROTTLE(nh_->get_logger(), *nh_->get_clock(), 5000, "Could not start ros control. Power is off!"); - speakError(speak_pub_, "Could not start ross control. Power is off!"); - } else { - if (first_ping_error_) { - first_ping_error_ = false; - } else { - RCLCPP_ERROR(nh_->get_logger(), "Could not ping all devices!"); - speakError(speak_pub_, "error starting ross control"); - // check which devices were not pinged successful - for (std::pair& device : dxl_devices) { - if (std::find(pinged.begin(), pinged.end(), device.first) != pinged.end()) { - } else { - RCLCPP_ERROR(nh_->get_logger(), "%s with id %d missing", device.first.c_str(), device.second); - } - } - } - } - return false; - } else { - speakError(speak_pub_, "ross control startup successful"); - return true; - } -} - -void threaded_init(const std::vector>& port_interfaces, - const rclcpp::Node::SharedPtr& nh, int& success) { - success = std::all_of(port_interfaces.begin(), port_interfaces.end(), - [](std::shared_ptr interface) -> bool { return interface->init(); }); -} - -bool WolfgangHardwareInterface::init() { - // iterate through all ports - std::vector threads; - std::vector successes; - int i = 0; - for (std::vector>& port_interfaces : interfaces_) { - // iterate through all interfaces on this port - // we use an int instead of bool, since std::ref can't handle bool - int suc = 0; - successes.push_back(&suc); - threads.push_back(std::thread(threaded_init, std::ref(port_interfaces), std::ref(nh_), std::ref(suc))); - i++; - } - // wait for all inits to finish - for (std::thread& thread : threads) { - thread.join(); - } - // see if all inits were successful - bool success = std::all_of(successes.begin(), successes.end(), [](int* s) { return *s; }); - // init servo interface last after all servo busses are there - success &= servo_interface_.init(); - return success; -} - -void threaded_read(const std::vector>& port_interfaces, const rclcpp::Time& t, - const rclcpp::Duration& dt) { - for (std::shared_ptr interface : port_interfaces) { - interface->read(t, dt); - } -} - -void WolfgangHardwareInterface::read(const rclcpp::Time& t, const rclcpp::Duration& dt) { - // give feedback to power changes - if (core_present_) { - if (current_power_status_ && !last_power_status_) { - speakError(speak_pub_, "Power switched on!"); - } else if (!current_power_status_ && last_power_status_) { - speakError(speak_pub_, "Power switched off!"); - } - } - if (!core_present_ || current_power_status_) { - // only read all hardware if power is on - std::vector threads; - // start all reads - for (std::vector>& port_interfaces : interfaces_) { - threads.push_back(std::thread(threaded_read, std::ref(port_interfaces), std::ref(t), std::ref(dt))); - } - // wait for all reads to finish - for (std::thread& thread : threads) { - thread.join(); - } - // aggregate all servo values for controller - servo_interface_.read(t, dt); - if (core_present_) { - last_power_status_ = current_power_status_; - current_power_status_ = core_interface_->get_power_status(); - } - } else { - // read core to see if power is back on - core_interface_->read(t, dt); - last_power_status_ = current_power_status_; - current_power_status_ = core_interface_->get_power_status(); - servo_interface_.read(t, dt); - } -} - -void threaded_write(const std::vector>& port_interfaces, const rclcpp::Time& t, - const rclcpp::Duration& dt) { - for (std::shared_ptr interface : port_interfaces) { - interface->write(t, dt); - } -} - -void WolfgangHardwareInterface::write(const rclcpp::Time& t, const rclcpp::Duration& dt) { - if (core_present_ && !last_power_status_ && current_power_status_ && - nh_->get_parameter("servos.set_ROM_RAM").as_bool()) { - bus_start_time_ = t + rclcpp::Duration::from_seconds(nh_->get_parameter("start_delay").as_double()); - bus_first_write_ = true; - } - if (!bus_start_time_ || t > bus_start_time_.value()) { - if (bus_first_write_) { - for (std::vector> const& port_interfaces : interfaces_) { - for (std::shared_ptr interface : port_interfaces) { - interface->restoreAfterPowerCycle(); - } - } - bus_first_write_ = false; - } - if (core_present_ && !current_power_status_) { - // if power is off only write CORE - core_interface_->write(t, dt); - } else { - // write all controller values to interfaces - servo_interface_.write(t, dt); - std::vector threads; - // start all writes - for (std::vector>& port_interfaces : interfaces_) { - threads.push_back(std::thread(threaded_write, std::ref(port_interfaces), std::ref(t), std::ref(dt))); - } - - // wait for all writes to finish - for (std::thread& thread : threads) { - thread.join(); - } - } - } -} -} // namespace bitbots_ros_control diff --git a/src/bitbots_misc/bitbots_basler_camera/CMakeLists.txt b/src/bitbots_misc/bitbots_basler_camera/CMakeLists.txt deleted file mode 100644 index fb311c879a..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/CMakeLists.txt +++ /dev/null @@ -1,61 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(bitbots_basler_camera) - -# Add support for C++17 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() - -# Build with release optimizations and debug symbols by default -if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebug) -endif() - -find_package(ament_cmake REQUIRED) -find_package(ament_index_cpp REQUIRED) -find_package(backward_ros REQUIRED) -find_package(bitbots_docs REQUIRED) -find_package(camera_info_manager REQUIRED) -find_package(cv_bridge REQUIRED) -find_package(diagnostic_msgs REQUIRED) -find_package(generate_parameter_library REQUIRED) -find_package(image_transport REQUIRED) -find_package(OpenCV REQUIRED) -find_package(pylon 7.1.0 REQUIRED) -find_package(rclcpp REQUIRED) -find_package(sensor_msgs REQUIRED) - -add_compile_options(-Wall -Werror -Wno-unused) - -generate_parameter_library( - pylon_camera_parameters # cmake target name for the parameter library - config/camera_settings.yaml) - -add_executable(basler_camera src/basler_camera.cpp) - -target_link_libraries(basler_camera ${OpenCV_LIBRARIES} pylon::pylon - pylon_camera_parameters) - -ament_target_dependencies( - basler_camera - ament_cmake - ament_index_cpp - bitbots_docs - camera_info_manager - cv_bridge - diagnostic_msgs - generate_parameter_library - image_transport - rclcpp - sensor_msgs - OpenCV) - -enable_bitbots_docs() - -install(TARGETS basler_camera DESTINATION lib/${PROJECT_NAME}) - -install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) - -install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) - -ament_package() diff --git a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_amy.yaml b/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_amy.yaml deleted file mode 100644 index 70ffe81299..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_amy.yaml +++ /dev/null @@ -1,26 +0,0 @@ -image_width: 2048 -image_height: 1536 -camera_name: amy -camera_matrix: - rows: 3 - cols: 3 - data: [1336.20231, 0. , 1015.82206, - 0. , 1334.43681, 726.95617, - 0. , 0. , 1. ] -distortion_model: plumb_bob -distortion_coefficients: - rows: 1 - cols: 5 - data: [-0.285950, 0.081479, -0.000093, -0.000320, 0.000000] -rectification_matrix: - rows: 3 - cols: 3 - data: [1., 0., 0., - 0., 1., 0., - 0., 0., 1.] -projection_matrix: - rows: 3 - cols: 4 - data: [1080.60229, 0. , 1010.03846, 0. , - 0. , 1193.05933, 715.99058, 0. , - 0. , 0. , 1. , 0. ] diff --git a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_default.yaml b/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_default.yaml deleted file mode 100644 index 3214419d9b..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_default.yaml +++ /dev/null @@ -1,20 +0,0 @@ -image_width: 2048 -image_height: 1536 -camera_name: camera -camera_matrix: - rows: 3 - cols: 3 - data: [3492.8493204, 0.000000, 1025.0207517, 0.000000, 3496.7647872, 734.912734061, 0.000000, 0.000000, 1.000000] -distortion_model: plumb_bob -distortion_coefficients: - rows: 1 - cols: 5 - data: [-0.070022, 0.241475, 0.000303, -0.002293, 0.000000] -rectification_matrix: - rows: 3 - cols: 3 - data: [1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000] -projection_matrix: - rows: 3 - cols: 4 - data: [3478.0134873, 0.000000, 1022.9410389, 0.000000, 0.000000, 3487.2296864, 734.9307936, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000] diff --git a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_donna.yaml b/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_donna.yaml deleted file mode 100644 index 206899bc22..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_donna.yaml +++ /dev/null @@ -1,26 +0,0 @@ -image_width: 2048 -image_height: 1536 -camera_name: donna -camera_matrix: - rows: 3 - cols: 3 - data: [1335.78345, 0. , 1033.29364, - 0. , 1333.18344, 745.35427, - 0. , 0. , 1. ] -distortion_model: plumb_bob -distortion_coefficients: - rows: 1 - cols: 5 - data: [-0.287767, 0.085446, 0.000707, 0.000772, 0.000000] -rectification_matrix: - rows: 3 - cols: 3 - data: [1., 0., 0., - 0., 1., 0., - 0., 0., 1.] -projection_matrix: - rows: 3 - cols: 4 - data: [1083.23975, 0. , 1040.58478, 0. , - 0. , 1192.89355, 740.66495, 0. , - 0. , 0. , 1. , 0. ] diff --git a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_jack.yaml b/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_jack.yaml deleted file mode 100644 index 6cabb78297..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_jack.yaml +++ /dev/null @@ -1,26 +0,0 @@ -image_width: 2048 -image_height: 1536 -camera_name: jack -camera_matrix: - rows: 3 - cols: 3 - data: [1336.20231, 0. , 1015.82206, - 0. , 1334.43681, 726.95617, - 0. , 0. , 1. ] -distortion_model: plumb_bob -distortion_coefficients: - rows: 1 - cols: 5 - data: [-0.285950, 0.081479, -0.000093, -0.000320, 0.000000] -rectification_matrix: - rows: 3 - cols: 3 - data: [1., 0., 0., - 0., 1., 0., - 0., 0., 1.] -projection_matrix: - rows: 3 - cols: 4 - data: [1080.60229, 0. , 1010.03846, 0. , - 0. , 1193.05933, 715.99058, 0. , - 0. , 0. , 1. , 0. ] diff --git a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_melody.yaml b/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_melody.yaml deleted file mode 100644 index ff7e19be23..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_melody.yaml +++ /dev/null @@ -1,21 +0,0 @@ -image_width: 2048 -image_height: 1536 -camera_name: meldody - -camera_matrix: - rows: 3 - cols: 3 - data: [2471.8929089066833, 0.0, 1403.0939646261957, 0.0, 2149.206433340881, 1392.571705372463, 0.0, 0.0, 1.0] -distortion_model: plumb_bob -distortion_coefficients: - rows: 1 - cols: 5 - data: [-0.7340780034927321, -0.1274620090723443, -0.1977961736726639, -0.08260762121385543, 0.0] -rectification_matrix: - rows: 3 - cols: 3 - data: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0] -projection_matrix: - rows: 3 - cols: 4 - data: [2470.685791015625, 0.0, 1402.4088505824184, 0.0, 0.0, 2322.943115234375, 1379.9772878384829, 0.0, 0.0, 0.0, 1.0, 0.0] diff --git a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_rory.yaml b/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_rory.yaml deleted file mode 100644 index 6211f3ce41..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/config/camera_calibration_rory.yaml +++ /dev/null @@ -1,26 +0,0 @@ -image_width: 2048 -image_height: 1536 -camera_name: rory -camera_matrix: - rows: 3 - cols: 3 - data: [1336.20231, 0. , 1015.82206, - 0. , 1334.43681, 726.95617, - 0. , 0. , 1. ] -distortion_model: plumb_bob -distortion_coefficients: - rows: 1 - cols: 5 - data: [-0.285950, 0.081479, -0.000093, -0.000320, 0.000000] -rectification_matrix: - rows: 3 - cols: 3 - data: [1., 0., 0., - 0., 1., 0., - 0., 0., 1.] -projection_matrix: - rows: 3 - cols: 4 - data: [1080.60229, 0. , 1010.03846, 0. , - 0. , 1193.05933, 715.99058, 0. , - 0. , 0. , 1. , 0. ] diff --git a/src/bitbots_misc/bitbots_basler_camera/config/camera_settings.yaml b/src/bitbots_misc/bitbots_basler_camera/config/camera_settings.yaml deleted file mode 100644 index ef79a3cc6e..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/config/camera_settings.yaml +++ /dev/null @@ -1,83 +0,0 @@ -pylon_camera_parameters: - exposure: - type: double - default_value: 3000.0 - description: "The exposure time in microseconds to be set after opening the camera." - validation: - bounds<>: [0.0, 1000000.0] - gain: - type: int - default_value: 200 - description: "The target raw gain of the camera sensor (similar to ISO)." - validation: - bounds<>: [0, 360] - fps: - type: double - default_value: 10.0 - read_only: true - description: "Target frame rate of the camera / publisher." - validation: - bounds<>: [0.0, 30.0] - binning_factor_x: - type: int - default_value: 4 - read_only: true - description: "Binning factor to get downsampled images in x direction." - validation: - gt_eq<>: [1] - binning_factor_y: - type: int - default_value: 4 - read_only: true - description: "Binning factor to get downsampled images in y direction." - validation: - gt_eq<>: [1] - camera_info_url: - type: string - default_value: "" - read_only: true - description: "The URL of the camera calibration file." - validation: - not_empty<>: [] - device_user_id: - type: string - default_value: "" - read_only: true - description: "The name of the camera (used to discover the camera). The name can be set in the pylon viewer." - validation: - not_empty<>: [] - camera_frame_id: - type: string - default_value: "camera_optical_frame" - read_only: true - description: "The tf frame at which the camera's optical center is located." - validation: - not_empty<>: [] - reconnect_interval: - type: double - default_value: 1.0 - description: "The interval in seconds in which we try to (re-)connect to the camera." - read_only: true - validation: - gt_eq<>: [0.0] - gige: - mtu_size: - type: int - default_value: 9000 - description: "The MTU size for GigE cameras." - read_only: true - - inter_pkg_delay: - type: int - default_value: 1000 - description: "The inter-package delay in 'ticks' for GigE cameras." - read_only: true - validation: - bounds<>: [0, 10000] - misc: - darkness_threshold: - type: double - default_value: 0.1 - description: "This threshold is used to determine if the image is too dark, which means that we might forgot the camera cover." - validation: - bounds<>: [0, 1] diff --git a/src/bitbots_misc/bitbots_basler_camera/launch/basler_camera.launch b/src/bitbots_misc/bitbots_basler_camera/launch/basler_camera.launch deleted file mode 100644 index 56263a669f..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/launch/basler_camera.launch +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/bitbots_misc/bitbots_basler_camera/package.xml b/src/bitbots_misc/bitbots_basler_camera/package.xml deleted file mode 100644 index 0dd36aaf03..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/package.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - bitbots_basler_camera - 1.0.0 - This contains the interface between the Basler camera's pylon SDK and ROS 2. In addtion to that is also applies some postprocessing (debayering, downsampling) to the images. - - Marc Bestmann - Hamburg Bit-Bots - - MIT - - Hamburg Bit-Bots - - backward_ros - bitbots_docs - camera_info_manager - cv_bridge - diagnostic_msgs - generate_parameter_library - image_transport - libopencv-dev - rclcpp - sensor_msgs - - ament_cmake - - - - unknown - - ament_cmake - - diff --git a/src/bitbots_misc/bitbots_basler_camera/setup.py b/src/bitbots_misc/bitbots_basler_camera/setup.py deleted file mode 100644 index 058104de97..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/setup.py +++ /dev/null @@ -1,11 +0,0 @@ -from distutils.core import setup - -from catkin_pkg.python_setup import generate_distutils_setup - -d = generate_distutils_setup( - # packages=['bitbots_basler_camera'], - # scripts=['bin/myscript'], - # package_dir={'': 'src'} -) - -setup(**d) diff --git a/src/bitbots_misc/bitbots_basler_camera/src/basler_camera.cpp b/src/bitbots_misc/bitbots_basler_camera/src/basler_camera.cpp deleted file mode 100644 index eaaec59939..0000000000 --- a/src/bitbots_misc/bitbots_basler_camera/src/basler_camera.cpp +++ /dev/null @@ -1,357 +0,0 @@ -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using std::placeholders::_1, std::placeholders::_2; -using namespace Pylon; - -namespace basler_camera { - -class BaslerCamera { - std::shared_ptr node_; - - image_transport::TransportHints transport_hints_; - image_transport::CameraPublisher image_pub_; - rclcpp::TimerBase::SharedPtr timer_; - rclcpp::Publisher::SharedPtr diagnostics_pub_; - - std::unique_ptr camera_info_manager_; - - std::unique_ptr camera_; - - std::optional camera_tick_frequency_; - - Pylon::PylonAutoInitTerm autoInitTerm; - - pylon_camera_parameters::ParamListener param_listener_; - pylon_camera_parameters::Params config_; - - const std::map TEMP_STATE_2_STRING = { - {Basler_UniversalCameraParams::TemperatureStateEnums::TemperatureState_Ok, "OK"}, - {Basler_UniversalCameraParams::TemperatureStateEnums::TemperatureState_Critical, "critical"}, - {Basler_UniversalCameraParams::TemperatureStateEnums::TemperatureState_Error, "error"}, - }; - - const std::map - TEMP_STATE_2_DIAGNOSTIC_STATE = { - {Basler_UniversalCameraParams::TemperatureStateEnums::TemperatureState_Ok, - diagnostic_msgs::msg::DiagnosticStatus::OK}, - {Basler_UniversalCameraParams::TemperatureStateEnums::TemperatureState_Critical, - diagnostic_msgs::msg::DiagnosticStatus::WARN}, - {Basler_UniversalCameraParams::TemperatureStateEnums::TemperatureState_Error, - diagnostic_msgs::msg::DiagnosticStatus::ERROR}, - }; - - public: - BaslerCamera() - : node_(std::make_shared("post_processor")), - transport_hints_(node_.get()), - image_pub_(image_transport::create_camera_publisher(node_.get(), "camera/image_proc")), - diagnostics_pub_(node_->create_publisher("/diagnostics", 1)), - param_listener_(node_) { - // Load parameters - config_ = param_listener_.get_params(); - - // Set up camera info manager - camera_info_manager_ = std::make_unique(node_.get(), config_.device_user_id, - config_.camera_info_url); - - try { - // Initialize the camera - initilize_camera(); - - } catch (GenICam::GenericException& e) { - // Error handling. - RCLCPP_ERROR(node_->get_logger(), "An exception occurred: %s", e.GetDescription()); - RCLCPP_ERROR(node_->get_logger(), "Could not initialize camera"); - publish_basic_diagnostics(diagnostic_msgs::msg::DiagnosticStatus::ERROR, "Could not initialize camera", {}); - exit(1); - } - // Setup timer for publishing - timer_ = node_->create_wall_timer(std::chrono::duration(1.0 / config_.fps), - std::bind(&BaslerCamera::timer_callback, this)); - } - - void initilize_camera() { - // List all available devices - Pylon::DeviceInfoList_t devices; - CTlFactory::GetInstance().EnumerateDevices(devices); - - // The device user id of the camera we want to use - std::optional our_device_info; - - // Print all devices and their names - for (auto device : devices) { - RCLCPP_INFO(node_->get_logger(), "Device: %s (%s)", device.GetFriendlyName().c_str(), - device.GetModelName().c_str()); - // Check if the device has a user defined name and if it is the one we want to use - if (device.GetUserDefinedName().compare(config_.device_user_id.c_str()) == 0) { - our_device_info = device; - } - } - - // Wait until the camera is found - while (rclcpp::ok() && !our_device_info) { - RCLCPP_ERROR(node_->get_logger(), "Could not find device with user id '%s'", config_.device_user_id.c_str()); - RCLCPP_ERROR(node_->get_logger(), "Retrying in %f seconds", config_.reconnect_interval); - publish_basic_diagnostics(diagnostic_msgs::msg::DiagnosticStatus::STALE, - "Could not find the device '" + config_.device_user_id + "'!", {}); - // Wait - rclcpp::sleep_for(std::chrono::duration_cast( - std::chrono::duration(config_.reconnect_interval))); - // List all available devices - CTlFactory::GetInstance().EnumerateDevices(devices); - // Get the matching device - auto it = std::find_if(devices.begin(), devices.end(), [this](const auto& device) { - return device.GetUserDefinedName().compare(config_.device_user_id.c_str()) == 0; - }); - // Use the device if it was found - if (it != devices.end()) { - our_device_info = *it; - } - } - - // Check if the node is still ok, maybe it was shut down while waiting - if (!rclcpp::ok()) { - return; - } - - // Set up the camera - camera_ = std::make_unique( - CTlFactory::GetInstance().CreateDevice(our_device_info.value())); - RCLCPP_INFO(node_->get_logger(), "Using device user id '%s'", config_.device_user_id.c_str()); - - // Wait for the camera to be ready - camera_->Open(); - - // Set MTU and inter-package delay - camera_->GevSCPSPacketSize.SetValue(config_.gige.mtu_size); - camera_->GevSCPD.SetValue(config_.gige.inter_pkg_delay); - - camera_->ClearBufferModeEnable(); - - // Set the camera parameters - apply_camera_parameters(); - - // Set static camera parameters - camera_->ShutterMode.SetValue(Basler_UniversalCameraParams::ShutterModeEnums::ShutterMode_Global); - camera_->Width.SetToMaximum(); - camera_->Height.SetToMaximum(); - camera_->PixelFormat.SetValue(Basler_UniversalCameraParams::PixelFormat_BayerRG8); - camera_->BalanceWhiteAuto.SetValue( - Basler_UniversalCameraParams::BalanceWhiteAutoEnums::BalanceWhiteAuto_Continuous); - - // Set to manual acquisition mode - camera_->AcquisitionMode.SetValue(Basler_UniversalCameraParams::AcquisitionModeEnums::AcquisitionMode_Continuous); - - // Get the camera frequency - camera_tick_frequency_ = camera_->GevTimestampTickFrequency(); - - // Start grabbing - camera_->StartGrabbing(GrabStrategy_LatestImageOnly); - } - - void apply_camera_parameters() { - // Set the camera parameters - camera_->GainAuto.SetValue(Basler_UniversalCameraParams::GainAutoEnums::GainAuto_Off); - camera_->ExposureAuto.SetValue(Basler_UniversalCameraParams::ExposureAutoEnums::ExposureAuto_Off); - camera_->GainRaw.SetValue(config_.gain); - camera_->ExposureTimeAbs.SetValue(config_.exposure); - } - - void publish_basic_diagnostics(unsigned char severity, const std::string& message, - const std::map& additional_data) { - // Add general infos - diagnostic_msgs::msg::DiagnosticStatus status; - status.name = "CAMERA"; - status.hardware_id = config_.device_user_id; - - // Add overall status - status.level = severity; - status.message = message; - - // Add additional data (e.g. temperature) - std::vector keyValues; - for (auto const& [key, value] : additional_data) { // cppcheck-suppress unassignedVariable - diagnostic_msgs::msg::KeyValue key_value; - key_value.key = key; - key_value.value = value; - keyValues.push_back(key_value); - } - status.values = keyValues; - - // Publish the diagnostics array (only one status, as we only have one camera) - diagnostic_msgs::msg::DiagnosticArray diagnostics; - diagnostics.header.stamp = node_->now(); - diagnostics.status.push_back(status); - diagnostics_pub_->publish(diagnostics); - } - - void timer_callback() { - // This smart pointer will receive the grab result data. - CGrabResultPtr ptrGrabResult; - - // Field to store the trigger time - rclcpp::Time trigger_time; - - // Camera metrics - std::optional temperature; - std::optional temperature_state; - - try { - // Check if the config has changed - if (param_listener_.is_old(config_)) { - // Update the camera parameters - config_ = param_listener_.get_params(); - // Apply the new camera parameters - apply_camera_parameters(); - } - - // Try to reinitialize the camera if the connection is lost - if (!camera_->IsOpen() or camera_->IsCameraDeviceRemoved()) { - auto message = "Camera connection lost. Reinitializing camera"; - RCLCPP_WARN(node_->get_logger(), message); - publish_basic_diagnostics(diagnostic_msgs::msg::DiagnosticStatus::STALE, message, {}); - initilize_camera(); - } - - // Get current camera time - camera_->GevTimestampControlLatch(); - auto camera_time_stamp_at_capture = (__int128_t)camera_->GevTimestampValue(); - camera_->GevTimestampControlLatchReset(); - auto ros_time_stamp_at_capture = node_->now(); - - // Start frame acquisition - camera_->ExecuteSoftwareTrigger(); - - // Wait for an image and then retrieve it. A timeout of 5000 ms is used. - camera_->RetrieveResult(100, ptrGrabResult, TimeoutHandling_ThrowException); - - // Image grabbed successfully? - if (!ptrGrabResult->GrabSucceeded()) { - RCLCPP_ERROR(node_->get_logger(), "Error: %x %s", ptrGrabResult->GetErrorCode(), - ptrGrabResult->GetErrorDescription().c_str()); - publish_basic_diagnostics(diagnostic_msgs::msg::DiagnosticStatus::ERROR, "Error while grabbing image", {}); - return; - } - - // Adjust the time stamp of the image - auto image_camera_stamp = (__int128_t)ptrGrabResult->GetTimeStamp(); - auto image_age_in_seconds = (image_camera_stamp - camera_time_stamp_at_capture) / camera_tick_frequency_.value(); - trigger_time = ros_time_stamp_at_capture + rclcpp::Duration::from_seconds(image_age_in_seconds); - - // Get the camera temperature - temperature = camera_->TemperatureAbs.GetValue(); - temperature_state = camera_->TemperatureState.GetValue(); - - } catch (GenICam::GenericException& e) { - // Error handling. - RCLCPP_ERROR(node_->get_logger(), "An exception occurred: %s", e.GetDescription()); - publish_basic_diagnostics(diagnostic_msgs::msg::DiagnosticStatus::ERROR, - "An exception occurred during image acquisition", {}); - return; - } - - // Convert to cv::Mat - cv::Mat image(ptrGrabResult->GetHeight(), ptrGrabResult->GetWidth(), CV_8UC1, - static_cast(ptrGrabResult->GetBuffer())); - - // Create cv::Mat for color image - cv::Mat color(image.size(), CV_MAKETYPE(CV_8U, 3)); - - // Debayer the image - cv::cvtColor(image, color, cv::COLOR_BayerBG2BGR); - - // Perform binning by a given factor - cv::Mat binned(image.size().height / config_.binning_factor_y, image.size().width / config_.binning_factor_x, - CV_MAKETYPE(CV_8U, 3)); - cv::resize(color, binned, cv::Size(), 1.0 / config_.binning_factor_x, 1.0 / config_.binning_factor_y, - cv::INTER_AREA); - - // Add the binning to the camera info - auto camera_info = std::make_shared(camera_info_manager_->getCameraInfo()); - camera_info->binning_x = config_.binning_factor_x; - camera_info->binning_y = config_.binning_factor_y; - camera_info->header.frame_id = config_.camera_frame_id; - camera_info->header.stamp = trigger_time; - - // Convert back to sensor_msgs::Image - cv_bridge::CvImage color_msg; - color_msg.header = camera_info->header; - color_msg.encoding = sensor_msgs::image_encodings::BGR8; - color_msg.image = binned; - - // Publish the image - image_pub_.publish(color_msg.toImageMsg(), camera_info); - - // Check if image is too dark - float luminance = 0; - int sample_grid = 5; - int step_height = binned.size().height / sample_grid; - int step_width = binned.size().width / sample_grid; - for (int i = 0; i < sample_grid; i++) { - for (int j = 0; j < sample_grid; j++) { - cv::Vec3b pixel = binned.at(i * step_height, j * step_width); - luminance += (pixel[0] + pixel[1] + pixel[2]) / (3 * 255.0 * sample_grid * sample_grid); - } - } - - // Build map for additional diagnostics metrics - const std::map diagnostics_metrics = { - {"temperature", std::to_string(temperature.value())}, - {"temperature_state", TEMP_STATE_2_STRING.at(temperature_state.value())}, - {"luminance", std::to_string(luminance)}}; - - // Warn if the camera is too hot or the image is too dark - if (temperature_state.value() != Basler_UniversalCameraParams::TemperatureStateEnums::TemperatureState_Ok) { - auto message = "Camera temperature (" + std::to_string((int)round(temperature.value())) + "°C) is " + - TEMP_STATE_2_STRING.at(temperature_state.value()) + "! Thresholds are 72°C and 78°C respectively."; - RCLCPP_WARN_THROTTLE(node_->get_logger(), *node_->get_clock(), 10000, message.c_str()); - publish_basic_diagnostics(TEMP_STATE_2_DIAGNOSTIC_STATE.at(temperature_state.value()), message, - diagnostics_metrics); - } else if (luminance < config_.misc.darkness_threshold) { - auto message = "Image is too dark. Did you forget the camera cover?"; - RCLCPP_WARN_ONCE(node_->get_logger(), message); - publish_basic_diagnostics(diagnostic_msgs::msg::DiagnosticStatus::WARN, message, diagnostics_metrics); - } else { - // Everything is fine - publish_basic_diagnostics(diagnostic_msgs::msg::DiagnosticStatus::OK, "Camera is running", diagnostics_metrics); - } - } - - /** - * @brief A getter that returns the node - */ - std::shared_ptr get_node() { return node_; } -}; -} // namespace basler_camera - -int main(int argc, char* argv[]) { - rclcpp::init(argc, argv); - rclcpp::experimental::executors::EventsExecutor exec = rclcpp::experimental::executors::EventsExecutor( - std::make_unique(), true, rclcpp::ExecutorOptions()); - - auto post_processor = std::make_shared(); - exec.add_node(post_processor->get_node()); - exec.spin(); - rclcpp::shutdown(); - - return 0; -} diff --git a/src/bitbots_misc/bitbots_bringup/launch/motion.launch b/src/bitbots_misc/bitbots_bringup/launch/motion.launch index d766d93758..63d3858842 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/motion.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/motion.launch @@ -6,6 +6,9 @@ + + + @@ -17,17 +20,6 @@ - - - - - - - - - - - @@ -38,29 +30,9 @@ - - - - - - - - - - - - - - - - diff --git a/src/bitbots_misc/bitbots_bringup/launch/motion_standalone.launch b/src/bitbots_misc/bitbots_bringup/launch/motion_standalone.launch index 4201be91f8..1f10e7c81e 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/motion_standalone.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/motion_standalone.launch @@ -12,6 +12,8 @@ + + diff --git a/src/bitbots_misc/bitbots_bringup/launch/rosbag_record.launch.py b/src/bitbots_misc/bitbots_bringup/launch/rosbag_record.launch.py index 567aee7c8d..43301247d2 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/rosbag_record.launch.py +++ b/src/bitbots_misc/bitbots_bringup/launch/rosbag_record.launch.py @@ -34,7 +34,7 @@ "/debug/behavior/which_ball_is_used", "/diagnostics_agg", "/diagnostics", - "/DynamixelController/command", + "/joint_command", "/field_boundary_relative", "/field/map", "/game_controller_connected", diff --git a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch index b57d1d0229..add7c7654d 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/teamplayer.launch @@ -26,6 +26,11 @@ + + + + + diff --git a/src/bitbots_misc/bitbots_bringup/launch/vision.launch b/src/bitbots_misc/bitbots_bringup/launch/vision.launch index afba33ac99..4d8ea84b36 100644 --- a/src/bitbots_misc/bitbots_bringup/launch/vision.launch +++ b/src/bitbots_misc/bitbots_bringup/launch/vision.launch @@ -14,7 +14,11 @@ - + + + + + diff --git a/src/bitbots_misc/bitbots_bringup/package.xml b/src/bitbots_misc/bitbots_bringup/package.xml index f3aec43bbb..dc9c10f057 100644 --- a/src/bitbots_misc/bitbots_bringup/package.xml +++ b/src/bitbots_misc/bitbots_bringup/package.xml @@ -5,7 +5,6 @@ 2.3.1 The bitbots_bringup hosts the main launch files for the Hamburg Bit-Bots code base. - Finn-Thorben Sell Hamburg Bit-Bots MIT @@ -18,7 +17,6 @@ bitbots_webots_sim audio_common - bitbots_basler_camera bitbots_body_behavior bitbots_diagnostic @@ -29,18 +27,18 @@ bitbots_odometry bitbots_quintic_walk bitbots_robot_description - bitbots_ros_control bitbots_utils bitbots_vision foxglove_bridge game_controller_hsl humanoid_base_footprint + livelybot_bringup + piplus_description soccer_ipm system_monitor topic_tools udp_bridge - wolfgang_description - wolfgang_moveit_config + zed_wrapper diff --git a/src/bitbots_misc/bitbots_diagnostic/config/analyzers.yaml b/src/bitbots_misc/bitbots_diagnostic/config/analyzers.yaml index cefcb730a9..b4b1fc08db 100644 --- a/src/bitbots_misc/bitbots_diagnostic/config/analyzers.yaml +++ b/src/bitbots_misc/bitbots_diagnostic/config/analyzers.yaml @@ -44,9 +44,4 @@ analyzers: startswith: ['SYSTEM'] timeout: 1.0 find_and_remove_prefix: ['SYSTEM'] - #Pressure: - # type: diagnostic_aggregator/GenericAnalyzer - # path: Pressure - # startswith: ['PS'] - # timeout: 0.2 - # find_and_remove_prefix: ['PS'] + diff --git a/src/bitbots_misc/bitbots_parameter_blackboard/config/global_parameters.yaml b/src/bitbots_misc/bitbots_parameter_blackboard/config/global_parameters.yaml index 0327898ec4..87b029b95a 100644 --- a/src/bitbots_misc/bitbots_parameter_blackboard/config/global_parameters.yaml +++ b/src/bitbots_misc/bitbots_parameter_blackboard/config/global_parameters.yaml @@ -1,4 +1,4 @@ parameter_blackboard: ros__parameters: - robot_type_name: Wolfgang + robot_type_name: PiPlus diff --git a/src/bitbots_misc/bitbots_robot_description/launch/load_robot_description.launch b/src/bitbots_misc/bitbots_robot_description/launch/load_robot_description.launch index 0bffcf8646..d5c1c8c715 100644 --- a/src/bitbots_misc/bitbots_robot_description/launch/load_robot_description.launch +++ b/src/bitbots_misc/bitbots_robot_description/launch/load_robot_description.launch @@ -1,12 +1,12 @@ - - - - - + + + + + diff --git a/src/bitbots_misc/bitbots_robot_description/launch/move_group.py b/src/bitbots_misc/bitbots_robot_description/launch/move_group.py deleted file mode 100644 index 1d4749014c..0000000000 --- a/src/bitbots_misc/bitbots_robot_description/launch/move_group.py +++ /dev/null @@ -1,164 +0,0 @@ -import os - -import yaml -from ament_index_python import get_package_share_directory -from launch import LaunchDescription -from launch.actions import DeclareLaunchArgument, OpaqueFunction -from launch.substitutions import Command, LaunchConfiguration, TextSubstitution -from launch_ros.actions import Node -from launch_ros.parameter_descriptions import ParameterValue - - -def load_file(package_name, file_path): - package_path = get_package_share_directory(package_name) - absolute_file_path = os.path.join(package_path, file_path) - - try: - with open(absolute_file_path) as file: - return file.read() - except OSError: # parent of IOError, OSError *and* WindowsError where available - return None - - -def load_yaml(package_name, file_path): - package_path = get_package_share_directory(package_name) - absolute_file_path = os.path.join(package_path, file_path) - - try: - with open(absolute_file_path) as file: - return yaml.safe_load(file) - except OSError: # parent of IOError, OSError *and* WindowsError where available - return None - - -def launch_setup(context, *args, **kwargs): - sim = LaunchConfiguration("sim") - fake_walk = LaunchConfiguration("fake_walk") - sim_ns = LaunchConfiguration("sim_ns") - robot_type = LaunchConfiguration("robot_type") - - robot_description = ParameterValue( - Command( - [ - "xacro ", - os.path.join( - get_package_share_directory(f"{robot_type.perform(context)}_description"), - "urdf", - "robot.urdf", - ), - " use_fake_walk:=", - fake_walk, - " sim_ns:=", - sim_ns, - ] - ), - value_type=str, - ) - - robot_description_semantic_config = load_file( - f"{robot_type.perform(context)}_moveit_config", f"config/{robot_type.perform(context)}.srdf" - ) - kinematics_yaml = load_yaml(f"{robot_type.perform(context)}_moveit_config", "config/kinematics.yaml") - - ompl_planning_pipeline_config = { - "move_group": { - "planning_plugins": ["ompl_interface/OMPLPlanner"], - "request_adapters": [ - "default_planning_request_adapters/ValidateWorkspaceBounds", - "default_planning_request_adapters/CheckStartStateBounds", - "default_planning_request_adapters/CheckStartStateCollision", - ], - "response_adapters": [ - "default_planning_response_adapters/AddTimeOptimalParameterization", - "default_planning_response_adapters/ValidateSolution", - "default_planning_response_adapters/DisplayMotionPath", - ], - "start_state_max_bounds_error": 0.1, - } - } - ompl_planning_yaml = load_yaml(f"{robot_type.perform(context)}_moveit_config", "config/ompl_planning.yaml") - ompl_planning_pipeline_config["move_group"].update(ompl_planning_yaml) - # Trajectory Execution Functionality - moveit_simple_controllers_yaml = load_yaml( - f"{robot_type.perform(context)}_moveit_config", "config/fake_controllers.yaml" - ) - moveit_controllers = { - "moveit_simple_controller_manager": moveit_simple_controllers_yaml, - "moveit_controller_manager": "moveit_simple_controller_manager/MoveItSimpleControllerManager", - } - - sensor_config = load_yaml(f"{robot_type.perform(context)}_moveit_config", "config/sensors_3d.yaml") - - trajectory_execution = { - "moveit_manage_controllers": True, - "trajectory_execution.allowed_execution_duration_scaling": 1.2, - "trajectory_execution.allowed_goal_duration_margin": 0.5, - "trajectory_execution.allowed_start_tolerance": 0.01, - } - - planning_scene_monitor_parameters = { - "publish_planning_scene": True, - "publish_geometry_updates": True, - "publish_state_updates": True, - "publish_transforms_updates": True, - } - - # do some checks to provide better debug in case of errors in the configs - if robot_description is None: - print("### WARNING: robot_description is None") - if robot_description_semantic_config is None: - print("### WARNING: robot_description_semantic_config is None") - if kinematics_yaml is None: - print("### WARNING: kinematics_yaml is None") - if ompl_planning_pipeline_config is None: - print("### WARNING: ompl_planning_pipeline_config is None") - if moveit_controllers is None: - print("### WARNING: moveit_controllers is None") - if trajectory_execution is None: - print("### WARNING: trajectory_execution is None") - if planning_scene_monitor_parameters is None: - print("### WARNING: planning_scene_monitor_parameters is None") - - rsp_node = Node( - package="robot_state_publisher", - executable="robot_state_publisher", - respawn=True, - output="screen", - parameters=[{"robot_description": robot_description, "publish_frequency": 100.0, "use_sim_time": sim}], - arguments=["--ros-args", "--log-level", "WARN"], - ) - - move_group_node = Node( - package="moveit_ros_move_group", - executable="move_group", - output="screen", - # hacky merging dicts - parameters=[ - { - "robot_description": robot_description, - "robot_description_semantic": robot_description_semantic_config, - "robot_description_kinematics": kinematics_yaml, - "publish_robot_description_semantic": True, - "use_sim_time": sim, - "octomap_resolution": 0.01, - }, - ompl_planning_pipeline_config, - trajectory_execution, - moveit_controllers, - planning_scene_monitor_parameters, - sensor_config, - ], - arguments=["--ros-args", "--log-level", "WARN"], - ) # todo joint limits - return [move_group_node, rsp_node] - - -def generate_launch_description(): - sim_arg = DeclareLaunchArgument("sim", default_value="False") - fake_walk_arg = DeclareLaunchArgument("fake_walk", default_value="False") - sim_ns_arg = DeclareLaunchArgument("sim_ns", default_value=TextSubstitution(text="/")) - robot_type_arg = DeclareLaunchArgument("robot_type", default_value=TextSubstitution(text="wolfgang")) - - return LaunchDescription( - [sim_arg, fake_walk_arg, sim_ns_arg, robot_type_arg, OpaqueFunction(function=launch_setup)] - ) diff --git a/src/bitbots_misc/bitbots_robot_description/package.xml b/src/bitbots_misc/bitbots_robot_description/package.xml index 7a6bb7229b..033d157834 100644 --- a/src/bitbots_misc/bitbots_robot_description/package.xml +++ b/src/bitbots_misc/bitbots_robot_description/package.xml @@ -19,7 +19,6 @@ bitbots_docs bitbots_extrinsic_calibration - moveit_ros_move_group robot_state_publisher xacro diff --git a/src/bitbots_misc/bitbots_teleop/bitbots_teleop/joy_node.py b/src/bitbots_misc/bitbots_teleop/bitbots_teleop/joy_node.py index 97e0ba10c8..7e4b809572 100755 --- a/src/bitbots_misc/bitbots_teleop/bitbots_teleop/joy_node.py +++ b/src/bitbots_misc/bitbots_teleop/bitbots_teleop/joy_node.py @@ -134,7 +134,7 @@ def __init__(self): self.head_mode_pub = self.create_publisher(HeadMode, "head_mode", 1) self.head_msg = JointCommand() - self.head_msg.max_currents = [-1.0] * 2 + self.head_msg.max_torques = [-1.0] * 2 self.head_msg.velocities = [5.0] * 2 self.head_msg.accelerations = [40.0] * 2 @@ -224,7 +224,7 @@ def joy_cb(self, msg: Joy): self.denormalize_joy(self.config["head"]["gain_tilt"], self.config["head"]["stick_tilt"], msg, -1) ) - self.head_msg.joint_names = ["HeadPan", "HeadTilt"] + self.head_msg.joint_names = ["head_yaw_joint", "head_pitch_joint"] self.head_msg.positions = [pan_goal, tilt_goal] self.head_pub.publish(self.head_msg) diff --git a/src/bitbots_misc/bitbots_teleop/scripts/teleop_keyboard.py b/src/bitbots_misc/bitbots_teleop/scripts/teleop_keyboard.py index 77987e8986..3ee3eb0dac 100755 --- a/src/bitbots_misc/bitbots_teleop/scripts/teleop_keyboard.py +++ b/src/bitbots_misc/bitbots_teleop/scripts/teleop_keyboard.py @@ -12,6 +12,7 @@ import rclpy from bitbots_utils.transforms import quat_from_yaw from geometry_msgs.msg import Point, Twist, Vector3 +from livelybot_msg.msg import PowerSwitch from rclpy.action import ActionClient from rclpy.node import Node from sensor_msgs.msg import JointState @@ -23,15 +24,15 @@ from bitbots_msgs.srv import SimulatorPush msg = """ -BitBots Teleop --------------- +Bit-Bots Teleop +--------------- Walk around: Move head: q w e u i o a s d j k l m , . q/e: turn left/right k: zero head position -a/d: left/rigth i/,: up/down +a/d: left/right i/,: up/down w/s: forward/back j/l: left/right u/o/m/.: combinations @@ -46,6 +47,7 @@ b: kick left backward n: kick right backward B: kick left outward N: kick right outward +SPACE: EMERGENCY STOP!!! f: full stop F: play walkready animation r: reset robot in simulation R: reset ball in simulation @@ -60,7 +62,7 @@ Pushing: p: execute Push -Shift-p: reset Power to 0 +P: reset Power to 0 ü/ä: increase/decrease power forward (x axis) +/#: increase/decrease power left (y axis) SHIFT increases/decreases with factor 10 @@ -138,13 +140,13 @@ def __init__(self): if self.get_parameter("use_sim_time").get_parameter_value().bool_value: self.head_pub = self.create_publisher(JointCommand, "head_motor_goals", 1) else: - self.head_pub = self.create_publisher(JointCommand, "DynamixelController/command", 1) + self.head_pub = self.create_publisher(JointCommand, "joint_command", 1) self.head_msg = JointCommand() - self.head_msg.max_currents = [-1.0] * 2 + self.head_msg.max_torques = [-1.0] * 2 self.head_msg.velocities = [5.0] * 2 self.head_msg.accelerations = [40.0] * 2 - self.head_msg.joint_names = ["HeadPan", "HeadTilt"] + self.head_msg.joint_names = ["head_yaw_joint", "head_pitch_joint"] self.head_msg.positions = [0.0] * 2 self.head_mode_msg = HeadMode(head_mode=HeadMode.DONT_MOVE) @@ -153,6 +155,7 @@ def __init__(self): self.head_tilt_step = 0.05 self.walk_kick_pub = self.create_publisher(Bool, "kick", 1) + self.power_switch_pub = self.create_publisher(PowerSwitch, "/power_switch_state", 1) self.reset_robot = self.create_client(Empty, "/reset_pose") self.reset_ball = self.create_client(Empty, "/reset_ball") @@ -194,9 +197,9 @@ def generate_kick_goal(self, x, y, direction): return kick_goal def joint_state_cb(self, msg): - if "HeadPan" in msg.name and "HeadTilt" in msg.name: - self.head_pan_pos = msg.position[msg.name.index("HeadPan")] - self.head_tilt_pos = msg.position[msg.name.index("HeadTilt")] + if "head_yaw_joint" in msg.name and "head_pitch_joint" in msg.name: + self.head_pan_pos = msg.position[msg.name.index("head_yaw_joint")] + self.head_tilt_pos = msg.position[msg.name.index("head_pitch_joint")] def loop(self): try: @@ -330,6 +333,13 @@ def loop(self): elif key == "P": self.push_force_x = 0.0 self.push_force_y = 0.0 + elif key == " ": + self.x = 0 + self.y = 0 + self.z = 0 + self.a_x = 0 + self.th = 0 + self.power_switch_pub.publish(PowerSwitch(control_switch=0, power_switch=0)) elif key == "ü": self.push_force_x += 1 elif key == "Ü": diff --git a/src/bitbots_misc/bitbots_tts/bitbots_tts/supertonic/helper.py b/src/bitbots_misc/bitbots_tts/bitbots_tts/supertonic/helper.py new file mode 100644 index 0000000000..394f39f9e3 --- /dev/null +++ b/src/bitbots_misc/bitbots_tts/bitbots_tts/supertonic/helper.py @@ -0,0 +1,395 @@ +# Copyright (c) 2025 Supertone Inc. + +# This file was originally copied from: +# https://github.com/supertone-inc/supertonic/blob/6fc89ea89eb29defb0ff2230b77c5a519acfe2a9/py/helper.py +# License: MIT License + + +import json +import os +import re +import time +from contextlib import contextmanager +from typing import Optional +from unicodedata import normalize + +import numpy as np +import onnxruntime as ort + + +class UnicodeProcessor: + def __init__(self, unicode_indexer_path: str): + with open(unicode_indexer_path) as f: + self.indexer = json.load(f) + + def _preprocess_text(self, text: str) -> str: + # TODO: Need advanced normalizer for better performance + text = normalize("NFKD", text) + + # FIXME: this should be fixed for non-English languages + + # Remove emojis (wide Unicode range) + emoji_pattern = re.compile( + "[\U0001f600-\U0001f64f" # emoticons + "\U0001f300-\U0001f5ff" # symbols & pictographs + "\U0001f680-\U0001f6ff" # transport & map symbols + "\U0001f700-\U0001f77f" + "\U0001f780-\U0001f7ff" + "\U0001f800-\U0001f8ff" + "\U0001f900-\U0001f9ff" + "\U0001fa00-\U0001fa6f" + "\U0001fa70-\U0001faff" + "\u2600-\u26ff" + "\u2700-\u27bf" + "\U0001f1e6-\U0001f1ff]+", + flags=re.UNICODE, + ) + text = emoji_pattern.sub("", text) + + # Replace various dashes and symbols + replacements = { + "–": "-", + "‑": "-", + "—": "-", + "¯": " ", + "_": " ", + "\u201c": '"', # left double quote " + "\u201d": '"', # right double quote " + "\u2018": "'", # left single quote ' + "\u2019": "'", # right single quote ' + "´": "'", + "`": "'", + "[": " ", + "]": " ", + "|": " ", + "/": " ", + "#": " ", + "→": " ", + "←": " ", + } + for k, v in replacements.items(): + text = text.replace(k, v) + + # Remove combining diacritics # FIXME: this should be fixed for non-English languages + text = re.sub( + r"[\u0302\u0303\u0304\u0305\u0306\u0307\u0308\u030A\u030B\u030C\u0327\u0328\u0329\u032A\u032B\u032C\u032D\u032E\u032F]", + "", + text, + ) + + # Remove special symbols + text = re.sub(r"[♥☆♡©\\]", "", text) + + # Replace known expressions + expr_replacements = { + "@": " at ", + "e.g.,": "for example, ", + "i.e.,": "that is, ", + } + for k, v in expr_replacements.items(): + text = text.replace(k, v) + + # Fix spacing around punctuation + text = re.sub(r" ,", ",", text) + text = re.sub(r" \.", ".", text) + text = re.sub(r" !", "!", text) + text = re.sub(r" \?", "?", text) + text = re.sub(r" ;", ";", text) + text = re.sub(r" :", ":", text) + text = re.sub(r" '", "'", text) + + # Remove duplicate quotes + while '""' in text: + text = text.replace('""', '"') + while "''" in text: + text = text.replace("''", "'") + while "``" in text: + text = text.replace("``", "`") + + # Remove extra spaces + text = re.sub(r"\s+", " ", text).strip() + + # If text doesn't end with punctuation, quotes, or closing brackets, add a period + if not re.search(r"[.!?;:,'\"')\]}…。」』】〉》›»]$", text): + text += "." + + return text + + def _get_text_mask(self, text_ids_lengths: np.ndarray) -> np.ndarray: + text_mask = length_to_mask(text_ids_lengths) + return text_mask + + def _text_to_unicode_values(self, text: str) -> np.ndarray: + unicode_values = np.array([ord(char) for char in text], dtype=np.uint16) # 2 bytes + return unicode_values + + def __call__(self, text_list: list[str]) -> tuple[np.ndarray, np.ndarray]: + text_list = [self._preprocess_text(t) for t in text_list] + text_ids_lengths = np.array([len(text) for text in text_list], dtype=np.int64) + text_ids = np.zeros((len(text_list), text_ids_lengths.max()), dtype=np.int64) + for i, text in enumerate(text_list): + unicode_vals = self._text_to_unicode_values(text) + text_ids[i, : len(unicode_vals)] = np.array([self.indexer[val] for val in unicode_vals], dtype=np.int64) + text_mask = self._get_text_mask(text_ids_lengths) + return text_ids, text_mask + + +class Style: + def __init__(self, style_ttl_onnx: np.ndarray, style_dp_onnx: np.ndarray): + self.ttl = style_ttl_onnx + self.dp = style_dp_onnx + + +class TextToSpeech: + def __init__( + self, + cfgs: dict, + text_processor: UnicodeProcessor, + dp_ort: ort.InferenceSession, + text_enc_ort: ort.InferenceSession, + vector_est_ort: ort.InferenceSession, + vocoder_ort: ort.InferenceSession, + ): + self.cfgs = cfgs + self.text_processor = text_processor + self.dp_ort = dp_ort + self.text_enc_ort = text_enc_ort + self.vector_est_ort = vector_est_ort + self.vocoder_ort = vocoder_ort + self.sample_rate = cfgs["ae"]["sample_rate"] + self.base_chunk_size = cfgs["ae"]["base_chunk_size"] + self.chunk_compress_factor = cfgs["ttl"]["chunk_compress_factor"] + self.ldim = cfgs["ttl"]["latent_dim"] + + def sample_noisy_latent(self, duration: np.ndarray) -> tuple[np.ndarray, np.ndarray]: + bsz = len(duration) + wav_len_max = duration.max() * self.sample_rate + wav_lengths = (duration * self.sample_rate).astype(np.int64) + chunk_size = self.base_chunk_size * self.chunk_compress_factor + latent_len = ((wav_len_max + chunk_size - 1) / chunk_size).astype(np.int32) + latent_dim = self.ldim * self.chunk_compress_factor + noisy_latent = np.random.randn(bsz, latent_dim, latent_len).astype(np.float32) + latent_mask = get_latent_mask(wav_lengths, self.base_chunk_size, self.chunk_compress_factor) + noisy_latent = noisy_latent * latent_mask + return noisy_latent, latent_mask + + def _infer( + self, text_list: list[str], style: Style, total_step: int, speed: float = 1.05 + ) -> tuple[np.ndarray, np.ndarray]: + assert len(text_list) == style.ttl.shape[0], "Number of texts must match number of style vectors" + bsz = len(text_list) + text_ids, text_mask = self.text_processor(text_list) + dur_onnx, *_ = self.dp_ort.run(None, {"text_ids": text_ids, "style_dp": style.dp, "text_mask": text_mask}) + dur_onnx = dur_onnx / speed + text_emb_onnx, *_ = self.text_enc_ort.run( + None, + {"text_ids": text_ids, "style_ttl": style.ttl, "text_mask": text_mask}, + ) # dur_onnx: [bsz] + xt, latent_mask = self.sample_noisy_latent(dur_onnx) + total_step_np = np.array([total_step] * bsz, dtype=np.float32) + for step in range(total_step): + current_step = np.array([step] * bsz, dtype=np.float32) + xt, *_ = self.vector_est_ort.run( + None, + { + "noisy_latent": xt, + "text_emb": text_emb_onnx, + "style_ttl": style.ttl, + "text_mask": text_mask, + "latent_mask": latent_mask, + "current_step": current_step, + "total_step": total_step_np, + }, + ) + wav, *_ = self.vocoder_ort.run(None, {"latent": xt}) + return wav, dur_onnx + + def __call__( + self, + text: str, + style: Style, + total_step: int, + speed: float = 1.05, + silence_duration: float = 0.3, + ) -> tuple[np.ndarray, np.ndarray]: + assert style.ttl.shape[0] == 1, "Single speaker text to speech only supports single style" + text_list = chunk_text(text) + wav_cat = None + dur_cat = None + for text in text_list: + wav, dur_onnx = self._infer([text], style, total_step, speed) + if wav_cat is None: + wav_cat = wav + dur_cat = dur_onnx + else: + silence = np.zeros((1, int(silence_duration * self.sample_rate)), dtype=np.float32) + wav_cat = np.concatenate([wav_cat, silence, wav], axis=1) + dur_cat += dur_onnx + silence_duration + return wav_cat, dur_cat + + def batch( + self, text_list: list[str], style: Style, total_step: int, speed: float = 1.05 + ) -> tuple[np.ndarray, np.ndarray]: + return self._infer(text_list, style, total_step, speed) + + +def length_to_mask(lengths: np.ndarray, max_len: Optional[int] = None) -> np.ndarray: + """ + Convert lengths to binary mask. + + Args: + lengths: (B,) + max_len: int + + Returns: + mask: (B, 1, max_len) + """ + max_len = max_len or lengths.max() + ids = np.arange(0, max_len) + mask = (ids < np.expand_dims(lengths, axis=1)).astype(np.float32) + return mask.reshape(-1, 1, max_len) + + +def get_latent_mask(wav_lengths: np.ndarray, base_chunk_size: int, chunk_compress_factor: int) -> np.ndarray: + latent_size = base_chunk_size * chunk_compress_factor + latent_lengths = (wav_lengths + latent_size - 1) // latent_size + latent_mask = length_to_mask(latent_lengths) + return latent_mask + + +def load_onnx(onnx_path: str, opts: ort.SessionOptions, providers: list[str]) -> ort.InferenceSession: + return ort.InferenceSession(onnx_path, sess_options=opts, providers=providers) + + +def load_onnx_all( + onnx_dir: str, opts: ort.SessionOptions, providers: list[str] +) -> tuple[ + ort.InferenceSession, + ort.InferenceSession, + ort.InferenceSession, + ort.InferenceSession, +]: + dp_onnx_path = os.path.join(onnx_dir, "duration_predictor.onnx") + text_enc_onnx_path = os.path.join(onnx_dir, "text_encoder.onnx") + vector_est_onnx_path = os.path.join(onnx_dir, "vector_estimator.onnx") + vocoder_onnx_path = os.path.join(onnx_dir, "vocoder.onnx") + + dp_ort = load_onnx(dp_onnx_path, opts, providers) + text_enc_ort = load_onnx(text_enc_onnx_path, opts, providers) + vector_est_ort = load_onnx(vector_est_onnx_path, opts, providers) + vocoder_ort = load_onnx(vocoder_onnx_path, opts, providers) + return dp_ort, text_enc_ort, vector_est_ort, vocoder_ort + + +def load_cfgs(onnx_dir: str) -> dict: + cfg_path = os.path.join(onnx_dir, "tts.json") + with open(cfg_path) as f: + cfgs = json.load(f) + return cfgs + + +def load_text_processor(onnx_dir: str) -> UnicodeProcessor: + unicode_indexer_path = os.path.join(onnx_dir, "unicode_indexer.json") + text_processor = UnicodeProcessor(unicode_indexer_path) + return text_processor + + +def load_text_to_speech(onnx_dir: str, use_gpu: bool = False) -> TextToSpeech: + opts = ort.SessionOptions() + if use_gpu: + providers = ["WebGpuExecutionProvider"] + else: + providers = ["CPUExecutionProvider"] + cfgs = load_cfgs(onnx_dir) + dp_ort, text_enc_ort, vector_est_ort, vocoder_ort = load_onnx_all(onnx_dir, opts, providers) + text_processor = load_text_processor(onnx_dir) + return TextToSpeech(cfgs, text_processor, dp_ort, text_enc_ort, vector_est_ort, vocoder_ort) + + +def load_voice_style(voice_style_paths: list[str], verbose: bool = False) -> Style: + bsz = len(voice_style_paths) + + # Read first file to get dimensions + with open(voice_style_paths[0]) as f: + first_style = json.load(f) + ttl_dims = first_style["style_ttl"]["dims"] + dp_dims = first_style["style_dp"]["dims"] + + # Pre-allocate arrays with full batch size + ttl_style = np.zeros([bsz, ttl_dims[1], ttl_dims[2]], dtype=np.float32) + dp_style = np.zeros([bsz, dp_dims[1], dp_dims[2]], dtype=np.float32) + + # Fill in the data + for i, voice_style_path in enumerate(voice_style_paths): + with open(voice_style_path) as f: + voice_style = json.load(f) + + ttl_data = np.array(voice_style["style_ttl"]["data"], dtype=np.float32).flatten() + ttl_style[i] = ttl_data.reshape(ttl_dims[1], ttl_dims[2]) + + dp_data = np.array(voice_style["style_dp"]["data"], dtype=np.float32).flatten() + dp_style[i] = dp_data.reshape(dp_dims[1], dp_dims[2]) + + if verbose: + print(f"Loaded {bsz} voice styles") + return Style(ttl_style, dp_style) + + +@contextmanager +def timer(name: str): + start = time.time() + print(f"{name}...") + yield + print(f" -> {name} completed in {time.time() - start:.2f} sec") + + +def sanitize_filename(text: str, max_len: int) -> str: + """Sanitize filename by replacing non-alphanumeric characters with underscores""" + import re + + prefix = text[:max_len] + return re.sub(r"[^a-zA-Z0-9]", "_", prefix) + + +def chunk_text(text: str, max_len: int = 300) -> list[str]: + """ + Split text into chunks by paragraphs and sentences. + + Args: + text: Input text to chunk + max_len: Maximum length of each chunk (default: 300) + + Returns: + List of text chunks + """ + import re + + # Split by paragraph (two or more newlines) + paragraphs = [p.strip() for p in re.split(r"\n\s*\n+", text.strip()) if p.strip()] + + chunks = [] + + for paragraph in paragraphs: + paragraph = paragraph.strip() + if not paragraph: + continue + + # Split by sentence boundaries (period, question mark, exclamation mark followed by space) + # But exclude common abbreviations like Mr., Mrs., Dr., etc. and single capital letters like F. + pattern = r"(? None: @@ -26,13 +26,6 @@ def speak(text: str, publisher: Publisher, priority: int = 20, speaking_active: publisher.publish(msg) -def say(text: str) -> None: - """Start the shell `say.sh` script to output given text with mimic3. Beware: this is blocking.""" - script_path = os.path.join(get_package_prefix("bitbots_tts"), "lib/bitbots_tts/say.sh") - process = subprocess.Popen((script_path, text)) - process.wait() - - class Speaker(Node): """ Uses tts to say messages from the speak topic. @@ -62,16 +55,25 @@ def __init__(self) -> None: # Subscribe to the speak topic self.create_subscription(Audio, "speak", self.speak_cb, 10, callback_group=MutuallyExclusiveCallbackGroup()) - # Wait for the mimic server to start - while True: - try: - requests.get("http://localhost:59125") - break - except requests.exceptions.ConnectionError: - # log once per second that the server is not yet available - self.get_logger().info("Waiting for mimic server to start...", throttle_duration_sec=2.0) - time.sleep(0.5) - pass + # Load the tts model + conda_prefix = os.environ.get("CONDA_PREFIX", "") + if not conda_prefix: + raise ValueError( + "CONDA_PREFIX environment variable not set! We now expect models to be shared as conda packages." + ) + + # Assemble model package name and look at its share directory + model_path = os.path.join(conda_prefix, "share", "tts_supertonic") + + self.text_to_speech_engine = load_text_to_speech(os.path.join(model_path, "onnx"), use_gpu=True) + + # TODO make this configurable via parameters + voice = "F2" + steps = 5 # Number of diffusion steps, higher is better quality but also slower + + style = load_voice_style([os.path.join(model_path, "voice_styles", f"{voice}.json")]) + + self.generate_speech = partial(self.text_to_speech_engine, style=style, total_step=steps) # Start processing the queue self.create_timer(0.1, self.run_speaker, callback_group=MutuallyExclusiveCallbackGroup()) @@ -96,7 +98,16 @@ def run_speaker(self) -> None: # Get the next message and speak it text, _ = self.prio_queue.pop(0) try: - say(text) + with timer("TTS Generation Time"): + wav_untrimmed, duration = self.generate_speech(f"{text}") + wav = wav_untrimmed[0, : int(self.text_to_speech_engine.sample_rate * duration[0].item())] + wav = np.concatenate([np.zeros(2000), wav]) + speaker = sc.default_speaker() + with speaker.player(samplerate=self.text_to_speech_engine.sample_rate) as p: + p.play(wav) + self.get_logger().info( + f"Finished speaking: {text} (Duration: {duration[0].item():.2f}s) Used device: {speaker.name}" + ) except OSError: self.get_logger().error(str(traceback.format_exc())) diff --git a/src/bitbots_misc/bitbots_tts/launch/tts.launch b/src/bitbots_misc/bitbots_tts/launch/tts.launch index 04cadcbb5e..50abdd507f 100644 --- a/src/bitbots_misc/bitbots_tts/launch/tts.launch +++ b/src/bitbots_misc/bitbots_tts/launch/tts.launch @@ -1,8 +1,5 @@ - - - - + diff --git a/src/bitbots_misc/bitbots_tts/scripts/say.sh b/src/bitbots_misc/bitbots_tts/scripts/say.sh deleted file mode 100755 index eb986e3601..0000000000 --- a/src/bitbots_misc/bitbots_tts/scripts/say.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash -set -eEuo pipefail - -ROBOT_NAME="${ROBOT_NAME:-}" - -# Mapping robot name to voice and speed -case "$ROBOT_NAME" in - "jack"|"rory") - voice="en_UK/apope_low" - speed=1.0 - ;; - "amy"|"donna"|"melody"|"rose") - voice="en_US/vctk_low" - speed=2.0 - ;; - *) - echo "Unknown robot: '$ROBOT_NAME', using default female voice" - voice="en_US/vctk_low" - speed=2.0 - ;; -esac - -text="$1" -if [ -z "$text" ]; then - echo "No text provided!" - exit 1 -fi - -# Generate the speech with mimic and play it with alsa -mimic3 --remote --voice "$voice" --length-scale "$speed" "$text" | aplay -q - diff --git a/src/bitbots_misc/bitbots_tts/scripts/speak_ip.py b/src/bitbots_misc/bitbots_tts/scripts/speak_ip.py deleted file mode 100755 index aaed783ff4..0000000000 --- a/src/bitbots_misc/bitbots_tts/scripts/speak_ip.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python3 - -import os -from socket import gethostname - -from bitbots_tts.tts import say -from netifaces import AF_INET, ifaddresses, interfaces - -ip_address = "not set" - -wifi_interface = next(filter(lambda i: i.startswith("wlp"), interfaces()), None) -if wifi_interface and AF_INET in ifaddresses(wifi_interface): - ip_address = ifaddresses(wifi_interface)[AF_INET][0]["addr"] - -ip = " - dot - ".join(ip_address.split(".")) - -robot_name = os.getenv("ROBOT_NAME") or gethostname() -msg = f"Startup complete: - {robot_name}. My wifi IP is {ip}." -say(msg) diff --git a/src/bitbots_misc/bitbots_utils/bitbots_utils/utils.py b/src/bitbots_misc/bitbots_utils/bitbots_utils/utils.py index f01a5cdcab..436ca27ef9 100644 --- a/src/bitbots_misc/bitbots_utils/bitbots_utils/utils.py +++ b/src/bitbots_misc/bitbots_utils/bitbots_utils/utils.py @@ -7,8 +7,6 @@ from ament_index_python import get_package_share_directory from beartype import BeartypeConf, BeartypeStrategy, beartype from rcl_interfaces.msg import Parameter as ParameterMsg -from rcl_interfaces.msg import ParameterType as ParameterTypeMsg -from rcl_interfaces.msg import ParameterValue as ParameterValueMsg from rcl_interfaces.srv import GetParameters, SetParameters from rclpy.node import Node from rclpy.parameter import PARAMETER_SEPARATOR_STRING, Parameter, parameter_value_to_python @@ -34,26 +32,6 @@ def read_urdf(robot_name: str) -> str: return urdf -def load_moveit_parameter(robot_name: str) -> list[ParameterMsg]: - moveit_parameters = get_parameters_from_plain_yaml( - f"{get_package_share_directory(f'{robot_name}_moveit_config')}/config/kinematics.yaml", - "robot_description_kinematics.", - ) - robot_description = ParameterMsg() - robot_description.name = "robot_description" - robot_description.value = ParameterValueMsg( - string_value=read_urdf(robot_name), type=ParameterTypeMsg.PARAMETER_STRING - ) - moveit_parameters.append(robot_description) - robot_description_semantic = ParameterMsg() - robot_description_semantic.name = "robot_description_semantic" - with open(f"{get_package_share_directory(f'{robot_name}_moveit_config')}/config/{robot_name}.srdf") as file: - value = file.read() - robot_description_semantic.value = ParameterValueMsg(string_value=value, type=ParameterTypeMsg.PARAMETER_STRING) - moveit_parameters.append(robot_description_semantic) - return moveit_parameters - - def get_parameters_from_ros_yaml(node_name: str, parameter_file: str, use_wildcard: bool) -> list[ParameterMsg]: # Remove leading slash and namespaces with open(parameter_file) as f: diff --git a/src/bitbots_misc/bitbots_utils/scripts/motor_goals_viz_helper.py b/src/bitbots_misc/bitbots_utils/scripts/motor_goals_viz_helper.py index 49d563501e..febbf3b86d 100755 --- a/src/bitbots_misc/bitbots_utils/scripts/motor_goals_viz_helper.py +++ b/src/bitbots_misc/bitbots_utils/scripts/motor_goals_viz_helper.py @@ -18,7 +18,7 @@ def __init__(self): # get rid of additional ROS args when used in launch file parser = argparse.ArgumentParser() - parser.add_argument("--robot-type", "-t", help="What type of robot to use", default="wolfgang") + parser.add_argument("--robot-type", "-t", help="What type of robot to use", default="piplus") parser.add_argument("--walking", "-w", help="Directly get walking motor goals", action="store_true") parser.add_argument("--animation", "-a", help="Directly get animation motor goals", action="store_true") parser.add_argument("--head", help="Directly get head motor goals", action="store_true") @@ -100,28 +100,31 @@ def __init__(self): "neckYaw", "neckPitch", ] - self.joint_goals = [ - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), - float(0), + self.joint_goals = [0.0] * 20 + elif self.args.robot_type == "piplus": + self.joint_names = [ + "head_yaw_joint", + "head_pitch_joint", + "l_shoulder_pitch_joint", + "l_shoulder_roll_joint", + "l_elbow_joint", + "r_shoulder_pitch_joint", + "r_shoulder_roll_joint", + "r_elbow_joint", + "l_hip_roll_joint", + "l_hip_roll_joint", + "l_hip_pitch_joint", + "l_calf_joint", + "l_ankle_pitch_joint", + "l_ankle_roll_joint", + "r_hip_roll_joint", + "r_hip_roll_joint", + "r_hip_pitch_joint", + "r_calf_joint", + "r_ankle_pitch_joint", + "r_ankle_roll_joint", ] + self.joint_goals = [0.0] * 22 else: print(f"Unknown robot type {self.args.robot_type}") exit() @@ -141,7 +144,7 @@ def __init__(self): self.create_subscription(JointCommand, "kick_motor_goals", self.joint_command_cb, 10) if self.args.dynup or self.args.all: self.create_subscription(JointCommand, "dynup_motor_goals", self.joint_command_cb, 10) - self.create_subscription(JointCommand, "/DynamixelController/command", self.joint_command_cb, 10) + self.create_subscription(JointCommand, "/joint_command", self.joint_command_cb, 10) self.joint_state_msg = JointState() self.joint_state_msg.header.stamp = self.get_clock().now().to_msg() diff --git a/src/bitbots_motion/bitbots_animation_rqt/bitbots_animation_rqt/animation_recording.py b/src/bitbots_motion/bitbots_animation_rqt/bitbots_animation_rqt/animation_recording.py index 24c5fe0777..fe4b079058 100644 --- a/src/bitbots_motion/bitbots_animation_rqt/bitbots_animation_rqt/animation_recording.py +++ b/src/bitbots_motion/bitbots_animation_rqt/bitbots_animation_rqt/animation_recording.py @@ -233,7 +233,7 @@ def save_animation(self, path: str, file_name: Optional[str] = None) -> str: "last_edited": datetime.isoformat(datetime.now(), " "), "author": self.current_state.author, "description": self.current_state.description, - "keyframes": keyframes, + "keyframes": [kf.as_dict() for kf in keyframes], } # Save the animation to a file diff --git a/src/bitbots_motion/bitbots_animation_rqt/bitbots_animation_rqt/record_ui.py b/src/bitbots_motion/bitbots_animation_rqt/bitbots_animation_rqt/record_ui.py index e3e6e1d705..430531e363 100755 --- a/src/bitbots_motion/bitbots_animation_rqt/bitbots_animation_rqt/record_ui.py +++ b/src/bitbots_motion/bitbots_animation_rqt/bitbots_animation_rqt/record_ui.py @@ -31,7 +31,7 @@ from bitbots_animation_rqt.animation_recording import Recorder from bitbots_animation_rqt.utils import DragDropList, JointStateCommunicate, flatten_dict_of_lists -from bitbots_msgs.action import Dynup, PlayAnimation +from bitbots_msgs.action import PlayAnimation from bitbots_msgs.msg import JointTorque from bitbots_msgs.srv import AddAnimation @@ -56,9 +56,6 @@ def __init__(self, context): self.animation_client: ActionClient = ActionClient(self._node, PlayAnimation, "animation") if not self.animation_client.wait_for_server(timeout_sec=5.0): self._node.get_logger().error("Animation action server not available after waiting 5 seconds") - self.dynup_client = ActionClient(self._node, Dynup, "dynup") - if not self.dynup_client.wait_for_server(timeout_sec=5.0): - self._node.get_logger().error("Dynup action server not available after waiting 5 seconds") # Create a service clients self.add_animation_client = self._node.create_client(AddAnimation, "add_temporary_animation") @@ -95,35 +92,35 @@ def __init__(self, context): # Motor hierarchy self._motor_hierarchy = { # TODO this should be a parameter / loaded from the urdf "Body": { - "Head": ["HeadPan", "HeadTilt"], + "Head": ["head_yaw_joint", "head_pitch_joint"], "Arms": { "Left": [ - "LShoulderPitch", - "LShoulderRoll", - "LElbow", + "l_shoulder_pitch_joint", + "l_shoulder_roll_joint", + "l_upper_arm_joint", + "l_elbow_joint", ], "Right": [ - "RShoulderPitch", - "RShoulderRoll", - "RElbow", + "r_shoulder_pitch_joint", + "r_shoulder_roll_joint", + "r_upper_arm_joint", + "r_elbow_joint", ], }, "Legs": { "Left": [ - "LHipYaw", - "LHipRoll", - "LHipPitch", - "LKnee", - "LAnklePitch", - "LAnkleRoll", + "l_hip_roll_joint", + "l_hip_pitch_joint", + "l_calf_joint", + "l_ankle_pitch_joint", + "l_ankle_roll_joint", ], "Right": [ - "RHipYaw", - "RHipRoll", - "RHipPitch", - "RKnee", - "RAnklePitch", - "RAnkleRoll", + "r_hip_roll_joint", + "r_hip_pitch_joint", + "r_calf_joint", + "r_ankle_pitch_joint", + "r_ankle_roll_joint", ], }, } @@ -290,7 +287,7 @@ def connect_gui_callbacks(self) -> None: Connects the actions in the top bar to the corresponding functions, and sets their shortcuts :return: """ - self._widget.actionNew.triggered.connect(self.new) + self._widget.actionNew.triggered.connect(self.new_animation) self._widget.actionOpen.triggered.connect(self.open) self._widget.actionSave.triggered.connect(self.save) self._widget.actionSave_as.triggered.connect(lambda: self.save(new_location=True)) @@ -301,8 +298,8 @@ def connect_gui_callbacks(self) -> None: self._widget.actionAnimation_until_Frame.triggered.connect(self.play_until) self._widget.actionDuplicate_Frame.triggered.connect(self.duplicate) self._widget.actionDelete_Frame.triggered.connect(self.delete) - self._widget.actionLeft.triggered.connect(lambda: self.mirror_frame("R")) - self._widget.actionRight.triggered.connect(lambda: self.mirror_frame("L")) + self._widget.actionLeft.triggered.connect(lambda: self.mirror_frame("r")) + self._widget.actionRight.triggered.connect(lambda: self.mirror_frame("l")) self._widget.actionInvert.triggered.connect(self.invert_frame) self._widget.actionUndo.triggered.connect(self.undo) self._widget.actionRedo.triggered.connect(self.redo) @@ -318,9 +315,7 @@ def play_walkready(self, _) -> None: """ Plays the walkready animation on the robot """ - result: Dynup.Result = self.dynup_client.send_goal(Dynup.Goal(direction=Dynup.Goal.DIRECTION_WALKREADY)).result - if not result.successful: - self._node.get_logger().error("Could not execute walkready animation") + raise NotImplementedError("This function is not implemented yet.") def help(self) -> None: """ @@ -347,7 +342,7 @@ def help(self) -> None: Invert: Ctrl + Down Arrow" QMessageBox.about(self._widget, "About RecordUI", message) - def new(self) -> None: + def new_animation(self, _) -> None: """ Deletes all currently recorded frames """ @@ -414,7 +409,7 @@ def open(self, _) -> None: return # Open the file dialog in the animations build directory my_file = QFileDialog.getOpenFileName( - directory=os.path.join(get_package_share_directory("wolfgang_animations"), "animations"), filter="*.json" + directory=os.path.join(get_package_share_directory("piplus_animations"), "animations"), filter="*.json" ) # Cancel the open if the user does not select a file @@ -588,12 +583,12 @@ def redo(self): self._widget.statusBar.showMessage(status) self.update_frames() - def mirror_frame(self, source: Literal["L", "R"]) -> None: + def mirror_frame(self, source: Literal["l", "r"]) -> None: """ Copies all motor values from one side of the robot to the other. Inverts values, if necessary """ # Get direction to mirror to - mirrored_source = {"R": "L", "L": "R"}[source] + mirrored_source = {"r": "l", "l": "r"}[source] # Go through all active motors for motor_name, angle in self._working_angles.items(): @@ -626,10 +621,10 @@ def invert_frame(self): # Go through all active motors for motor_name, angle in self._working_angles.items(): # Check if the motor is on the right or left side and get the mirrored motor name - if motor_name.startswith("R"): - mirrored_motor_name = "L" + motor_name[1:] - elif motor_name.startswith("L"): - mirrored_motor_name = "R" + motor_name[1:] + if motor_name.startswith("r"): + mirrored_motor_name = "l" + motor_name[1:] + elif motor_name.startswith("l"): + mirrored_motor_name = "r" + motor_name[1:] else: # Just copy over if the motor is not on the left or right side mirrored_motors[motor_name] = angle diff --git a/src/bitbots_motion/bitbots_animation_server/bitbots_animation_server/animation_node.py b/src/bitbots_motion/bitbots_animation_server/bitbots_animation_server/animation_node.py index 01bc19f0bb..bb1321fdc8 100755 --- a/src/bitbots_motion/bitbots_animation_server/bitbots_animation_server/animation_node.py +++ b/src/bitbots_motion/bitbots_animation_server/bitbots_animation_server/animation_node.py @@ -46,7 +46,7 @@ def __init__(self): self.goals_to_abort: set[UUID] = set() # Get robot type and create resource manager - self.declare_parameter("robot_type", "wolfgang") + self.declare_parameter("robot_type", "piplus") self.resource_manager = ResourceManager(self.get_parameter("robot_type").value) # Load all animations into memory @@ -312,7 +312,7 @@ def send_animation(self, from_hcm: bool, pose: dict[str, float], torque: Optiona positions=pose.values(), velocities=[-1.0] * len(pose), accelerations=[-1.0] * len(pose), - max_currents=[np.clip((torque[joint]), 0.0, 1.0) for joint in pose.keys()] # type: ignore[index] + max_torques=[np.clip((torque[joint]), 0.0, 1.0) for joint in pose.keys()] # type: ignore[index] if torque and False else [-1.0] * len(pose), # fmt: skip ), diff --git a/src/bitbots_motion/bitbots_animation_server/docs/manual/animation.rst b/src/bitbots_motion/bitbots_animation_server/docs/manual/animation.rst index 9041231a8a..e0a927339c 100644 --- a/src/bitbots_motion/bitbots_animation_server/docs/manual/animation.rst +++ b/src/bitbots_motion/bitbots_animation_server/docs/manual/animation.rst @@ -10,7 +10,7 @@ Actively running animations, can be interrupted by the HCM. This ensures that, s Animations consist of a series of keyframes. Each keyframe is a snapshot of motor positions at a certain point in time. During playback a file containing the recorded keyframes is read and each frame is played one after the other at a given interval. To achieve a fluid motion the frequency of interpolation is set to 200 Hz with the help of quintic splines. This interpolation is done in the 'Joint Space' (inbetween the motor positions, not inbetween the actual positions of the robot's extremities in the Cartesian space), due to the development of the project and better usability. Animations can be run manually with `ros2 run bitbots_animation_server run_animation `. -All animations can be found in the package `wolfgang_animations`. +All animations can be found in the package `piplus_animations`. If an animation fails to run, the first thing to check is, if the HCM outputs a different 'Robot State' than 'Controllable' or 'Walking'. Animations can only be played if the robot is in one of these two states. diff --git a/src/bitbots_motion/bitbots_animation_server/launch/test.launch b/src/bitbots_motion/bitbots_animation_server/launch/test.launch index 0047584d37..8a102112be 100644 --- a/src/bitbots_motion/bitbots_animation_server/launch/test.launch +++ b/src/bitbots_motion/bitbots_animation_server/launch/test.launch @@ -4,7 +4,7 @@ - + diff --git a/src/bitbots_motion/bitbots_animation_server/scripts/animation_hcm_bridge.py b/src/bitbots_motion/bitbots_animation_server/scripts/animation_hcm_bridge.py index 1ba681dfbe..3e626f66df 100755 --- a/src/bitbots_motion/bitbots_animation_server/scripts/animation_hcm_bridge.py +++ b/src/bitbots_motion/bitbots_animation_server/scripts/animation_hcm_bridge.py @@ -11,26 +11,26 @@ from bitbots_msgs.msg import Animation, JointCommand JOINT_NAMES = [ - "HeadPan", - "HeadTilt", - "LShoulderPitch", - "LShoulderRoll", - "LElbow", - "RShoulderPitch", - "RShoulderRoll", - "RElbow", - "LHipYaw", - "LHipRoll", - "LHipPitch", - "LKnee", - "LAnklePitch", - "LAnkleRoll", - "RHipYaw", - "RHipRoll", - "RHipPitch", - "RKnee", - "RAnklePitch", - "RAnkleRoll", + "head_yaw_joint", + "head_pitch_joint", + "l_shoulder_pitch_joint", + "l_shoulder_roll_joint", + "l_elbow_joint", + "r_shoulder_pitch_joint", + "r_shoulder_roll_joint", + "r_elbow_joint", + "l_hip_roll_joint", + "l_hip_roll_joint", + "l_hip_pitch_joint", + "l_calf_joint", + "l_ankle_pitch_joint", + "l_ankle_roll_joint", + "r_hip_roll_joint", + "r_hip_roll_joint", + "r_hip_pitch_joint", + "r_calf_joint", + "r_ankle_pitch_joint", + "r_ankle_roll_joint", ] @@ -38,13 +38,13 @@ class AnimationHcmBridge(Node): def __init__(self): rclpy.init(args=None) super().__init__("animation") - self.joint_publisher = self.create_publisher(JointCommand, "DynamixelController/command", 1) + self.joint_publisher = self.create_publisher(JointCommand, "joint_command", 1) self.joint_command_msg = JointCommand() self.joint_command_msg.joint_names = JOINT_NAMES self.joint_command_msg.positions = [0.0] * len(JOINT_NAMES) self.joint_command_msg.velocities = [-1.0] * len(JOINT_NAMES) self.joint_command_msg.accelerations = [-1.0] * len(JOINT_NAMES) - self.joint_command_msg.max_currents = [-1.0] * len(JOINT_NAMES) + self.joint_command_msg.max_torques = [-1.0] * len(JOINT_NAMES) self.create_subscription(Animation, "animation", self.animation_cb, 10) diff --git a/src/bitbots_motion/bitbots_dynamic_kick/CMakeLists.txt b/src/bitbots_motion/bitbots_dynamic_kick/CMakeLists.txt deleted file mode 100644 index fa4fccec7e..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/CMakeLists.txt +++ /dev/null @@ -1,95 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(bitbots_dynamic_kick) - -# Add support for C++17 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() - -# Build with release optimizations and debug symbols by default -if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebug) -endif() - -find_package(ament_cmake REQUIRED) -find_package(backward_ros REQUIRED) -find_package(biped_interfaces REQUIRED) -find_package(bitbots_docs REQUIRED) -find_package(bitbots_msgs REQUIRED) -find_package(bitbots_splines REQUIRED) -find_package(control_toolbox REQUIRED) -find_package(Eigen3 REQUIRED) -find_package(geometry_msgs REQUIRED) -find_package(moveit_ros_planning_interface REQUIRED) -find_package(rclcpp REQUIRED) -find_package(rosidl_default_generators REQUIRED) -find_package(rot_conv REQUIRED) -find_package(sensor_msgs REQUIRED) -find_package(std_msgs REQUIRED) -find_package(tf2 REQUIRED) -find_package(tf2_eigen REQUIRED) -find_package(tf2_geometry_msgs REQUIRED) -find_package(tf2_ros REQUIRED) - -find_package(Python3 COMPONENTS Interpreter Development) - -rosidl_generate_interfaces(${PROJECT_NAME} "msg/KickDebug.msg" DEPENDENCIES - std_msgs geometry_msgs Python3) - -set(INCLUDE_DIRS include ${PYTHON_INCLUDE_DIRS}) -include_directories(${INCLUDE_DIRS}) - -add_compile_options(-Wall -Werror -Wno-unused) - -set(SOURCES src/kick_node.cpp src/kick_engine.cpp src/stabilizer.cpp - src/visualizer.cpp src/kick_ik.cpp) - -add_executable(KickNode ${SOURCES}) - -ament_target_dependencies( - KickNode - ament_cmake - biped_interfaces - bitbots_msgs - bitbots_splines - control_toolbox - geometry_msgs - moveit_ros_planning_interface - rclcpp - rot_conv - sensor_msgs - std_msgs - tf2 - tf2_eigen - tf2_geometry_msgs - tf2_ros - Eigen3) - -rosidl_get_typesupport_target(cpp_typesupport_target ${PROJECT_NAME} - "rosidl_typesupport_cpp") - -target_link_libraries(KickNode "${cpp_typesupport_target}") - -# create the kick python wrapper - -# pybind11_add_module(py_dynamic_kick SHARED src/walk_pywrapper.cpp ${SOURCES}) -# ament_target_dependencies(py_dynamic_kick PUBLIC ament_cmake biped_interfaces -# bitbots_msgs bitbots_splines control_toolbox geometry_msgs -# moveit_ros_planning_interface rclcpp ros2_python_extension rot_conv -# sensor_msgs std_msgs tf2 tf2_eigen tf2_geometry_msgs tf2_ros) -# target_link_libraries(py_dynamic_kick PRIVATE "${cpp_typesupport_target}") - -# ament_python_install_package(bitbots_dynamic_kick_py) - -# install(TARGETS py_dynamic_kick DESTINATION -# "${PYTHON_INSTALL_DIR}/bitbots_quintic_walk_py" ) - -enable_bitbots_docs() - -install(DIRECTORY scripts USE_SOURCE_PERMISSIONS - DESTINATION lib/${PROJECT_NAME}) -install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) -install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) -install(TARGETS KickNode DESTINATION lib/${PROJECT_NAME}) - -ament_package() diff --git a/src/bitbots_motion/bitbots_dynamic_kick/Doxyfile b/src/bitbots_motion/bitbots_dynamic_kick/Doxyfile deleted file mode 100644 index d4ab4b719a..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/Doxyfile +++ /dev/null @@ -1,47 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "bitbots_dynamic_kick" -PROJECT_BRIEF = "Dynamic kick engine for RoboCup Humanoid Soccer" -OUTPUT_DIRECTORY = docs -ALLOW_UNICODE_NAMES = YES -OUTPUT_LANGUAGE = English -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -FULL_PATH_NAMES = YES -MULTILINE_CPP_IS_BRIEF = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 4 -MARKDOWN_SUPPORT = YES -AUTOLINK_SUPPORT = YES -BUILTIN_STL_SUPPORT = YES -SUBGROUPING = YES -LOOKUP_CACHE_SIZE = 2 -EXTRACT_ALL = YES -EXTRACT_PRIVATE = YES -EXTRACT_LOCAL_CLASSES = YES -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -HIDE_COMPOUND_REFERENCE= NO -SHOW_INCLUDE_FILES = YES -SHOW_GROUPED_MEMB_INC = NO -FORCE_LOCAL_INCLUDES = NO -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -STRICT_PROTO_MATCHING = NO -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_FILES = YES -SHOW_NAMESPACES = NO -QUIET = YES -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_AS_ERROR = NO -WARN_FORMAT = "$file:$line: $text" -INPUT = include/bitbots_dynamic_kick src -INPUT_ENCODING = UTF-8 -RECURSIVE = YES diff --git a/src/bitbots_motion/bitbots_dynamic_kick/config/kick_config.yaml b/src/bitbots_motion/bitbots_dynamic_kick/config/kick_config.yaml deleted file mode 100644 index ddea108b62..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/config/kick_config.yaml +++ /dev/null @@ -1,61 +0,0 @@ -dynamic_kick: - ros__parameters: - ### Engine ### - - # Distances and positions - engine_rate: 500 - foot_rise: 0.08 - foot_distance: 0.2 - kick_windup_distance: 0.29 - trunk_height: 0.39 - trunk_roll: 0.101229096615671 - trunk_pitch: -0.136135681655558 - trunk_yaw: 0.0558505360638186 - - # Timings - move_trunk_time: 0.56 - raise_foot_time: 0.15 - move_to_ball_time: 0.19 - kick_time: 0.15 - move_back_time: 0.07 - lower_foot_time: 0.06 - move_trunk_back_time: 0.08 - - # Decisions - choose_foot_corridor_width: 0.4 - - ### Stabilizer ### - use_center_of_pressure: false - stabilizing_point_x: -0.02 - stabilizing_point_y: -0.02 - - # these values are used only if use_center_of_pressure is true - pid_x/p: 0.2 - pid_x/i: 0 - pid_x/d: 0 - pid_y/p: 0.5 - pid_y/i: 0.0015 - pid_y/d: 1.5 - - ### Visualization ### - spline_smoothness: 100 - - unstable: - foot_distance: 0.21 - foot_rise: 0.11 - kick_speed: 6.7 - kick_time: 0.11 - kick_windup_distance: 0.33 - lower_foot_time: 0.16 - move_back_time: 0.26 - move_to_ball_time: 0.36 - move_trunk_back_time: 0.11 - move_trunk_time: 0.26 - raise_foot_time: 0.29 - stabilizing_point_x: 0.01 - stabilizing_point_y: -0.04 - trunk_height: 0.41 - trunk_pitch: -0.488692190558412 - trunk_roll: 0.102974425867665 - trunk_yaw: 0.296705972839036 - use_center_of_pressure: false diff --git a/src/bitbots_motion/bitbots_dynamic_kick/config/kick_sim_config.yaml b/src/bitbots_motion/bitbots_dynamic_kick/config/kick_sim_config.yaml deleted file mode 100644 index 7aa9006a58..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/config/kick_sim_config.yaml +++ /dev/null @@ -1,61 +0,0 @@ -dynamic_kick: - ros__parameters: - ### Engine ### - - # Distances and positions - engine_rate: 500 - foot_rise: 0.08 - foot_distance: 0.2 - kick_windup_distance: 0.29 - trunk_height: 0.39 - trunk_roll: -0.051229096615671 - trunk_pitch: -0.136135681655558 - trunk_yaw: 0.0558505360638186 - - # Timings - move_trunk_time: 0.56 - raise_foot_time: 0.15 - move_to_ball_time: 0.19 - kick_time: 0.15 - move_back_time: 0.07 - lower_foot_time: 0.06 - move_trunk_back_time: 0.08 - - # Decisions - choose_foot_corridor_width: 0.4 - - ### Stabilizer ### - use_center_of_pressure: false - stabilizing_point_x: -0.02 - stabilizing_point_y: -0.02 - - # these values are used only if use_center_of_pressure is true - pid_x/p: 0.2 - pid_x/i: 0 - pid_x/d: 0 - pid_y/p: 0.5 - pid_y/i: 0.0015 - pid_y/d: 1.5 - - ### Visualization ### - spline_smoothness: 100 - - unstable: - foot_distance: 0.21 - foot_rise: 0.11 - kick_speed: 6.7 - kick_time: 0.11 - kick_windup_distance: 0.33 - lower_foot_time: 0.16 - move_back_time: 0.26 - move_to_ball_time: 0.36 - move_trunk_back_time: 0.11 - move_trunk_time: 0.26 - raise_foot_time: 0.29 - stabilizing_point_x: 0.01 - stabilizing_point_y: -0.04 - trunk_height: 0.41 - trunk_pitch: -0.488692190558412 - trunk_roll: 0.102974425867665 - trunk_yaw: 0.296705972839036 - use_center_of_pressure: false diff --git a/src/bitbots_motion/bitbots_dynamic_kick/docs/index.rst b/src/bitbots_motion/bitbots_dynamic_kick/docs/index.rst deleted file mode 100644 index e76aa433a2..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/docs/index.rst +++ /dev/null @@ -1,21 +0,0 @@ -Welcome to |project|'s documentation! -================================================ - -Description ------------ - -|description| - -.. toctree:: - :maxdepth: 2 - - cppapi/library_root - pyapi/modules - - -Indices and tables -================== - -* :ref:`genindex` -* |modindex| -* :ref:`search` diff --git a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_engine.hpp b/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_engine.hpp deleted file mode 100644 index 582a24e3ea..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_engine.hpp +++ /dev/null @@ -1,197 +0,0 @@ -#ifndef BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_ENGINE_H_ -#define BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_ENGINE_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "stabilizer.hpp" -#include "visualizer.hpp" - -namespace bitbots_dynamic_kick { - -struct KickParams { - double foot_rise; - double foot_distance; - double kick_windup_distance; - double trunk_height; - - double trunk_roll; - double trunk_pitch; - double trunk_yaw; - - double move_trunk_time = 1; - double raise_foot_time = 1; - double move_to_ball_time = 1; - double kick_time = 1; - double move_back_time = 1; - double lower_foot_time = 1; - double move_trunk_back_time = 1; - - double stabilizing_point_x; - double stabilizing_point_y; - - double choose_foot_corridor_width; -}; - -/** - * An instance of this class describes after which time a KickPhase is done - */ -class PhaseTimings { - public: - double move_trunk; - double raise_foot; - double windup; - double kick; - double move_back; - double lower_foot; - double move_trunk_back; -}; - -/** - * The KickEngine takes care of choosing an optimal foot to reach a given goal, - * planning that foots required movement (rotation and positioning) - * and updating short-term MotorGoals to move (the foot) along that planned path. - * - * It is vital to call the engines tick() method repeatedly because that is where these short-term MotorGoals are - * returned. - * - * The KickEngine utilizes a Stabilizer to balance the robot during foot movments. - */ -class KickEngine : public bitbots_splines::AbstractEngine { - public: - explicit KickEngine(rclcpp::Node::SharedPtr node); - - /** - * Set new goal which the engine tries to kick at. This will remove the old goal completely and plan new splines. - * @param header Definition of frame and time in which the goals were published - * @param ball_position Position of the ball - * @param kick_direction Direction into which to kick the ball - * @param kick_speed Speed with which to kick the ball - * @param r_foot_pose Current pose of right foot in l_sole frame - * @param l_foot_pose Current pose of left foot in r_sole frame - * - * @throws tf2::TransformException when goal cannot be converted into needed tf frames - */ - void setGoals(const KickGoals& goals) override; - - /** - * Reset this KickEngine completely, removing the goal, all splines and thereby stopping all output - */ - void reset() override; - - /** - * Do one iteration of spline-progress-updating. This means that whenever update() is called, - * new position goals are retrieved from previously calculated splines, stabilized and transformed into - * JointGoals - * @param dt Passed delta-time between last call to update() and now. Measured in seconds - * @return New motor goals only if a goal is currently set, position extractions from splines was possible and - * IK was able to compute valid motor positions - */ - KickPositions update(double dt) override; - - /** - * Is the currently performed kick with the left foot or not - */ - bool isLeftKick(); - - int getPercentDone() const override; - - /** - * Get the current position of the trunk relative to the support foot - */ - geometry_msgs::msg::Pose getTrunkPose(); - - bitbots_splines::PoseSpline getFlyingSplines() const; - bitbots_splines::PoseSpline getTrunkSplines() const; - - void setParams(KickParams params); - - /** - * Get the current phase of the engine - */ - KickPhase getPhase() const; - - Eigen::Vector3d getWindupPoint(); - - /** - * Set a pointer to the current state of the robot, updated from joint states - */ - void setRobotState(moveit::core::RobotStatePtr current_state); - - private: - rclcpp::Node::SharedPtr node_; - double time_; - Eigen::Vector3d ball_position_; - Eigen::Quaterniond kick_direction_; - double kick_speed_; - bool is_left_kick_; - bitbots_splines::PoseSpline flying_foot_spline_, trunk_spline_; - KickParams params_; - PhaseTimings phase_timings_; - Eigen::Vector3d windup_point_; - moveit::core::RobotStatePtr current_state_; - - /** - * Calculate splines for a complete kick whereby is_left_kick_ should already be set correctly - * - * @param flying_foot_pose Current pose of the flying foot relative to the support foot - * @param trunk_pose Current pose of the trunk relative to the support foot - */ - void calcSplines(const Eigen::Isometry3d& flying_foot_pose, const Eigen::Isometry3d& trunk_pose); - - /** - * Calculate the point from which to perform the final kicking movement - */ - Eigen::Vector3d calcKickWindupPoint(); - - /** - * Choose with which foot the kick should be performed - * - * This is done by checking whether the ball is outside of a corridor ranging from base_footprint forward. - * If it is, the foot on that side will be chosen as the kicking foot. - * If not, a more fine grained angle based criterion is used. * - * - * @param ball_position Position where the ball is currently located - * @param kick_direction Direction into which the ball should be kicked - * @return Whether the resulting kick should be performed with the left foot - * - * @throws tf2::TransformException when ball_position and kick_direction cannot be converted into base_footprint frame - */ - bool calcIsLeftFootKicking(const Eigen::Vector3d& ball_position, const Eigen::Quaterniond& kick_direction); - - /** - * Calculate the yaw of the kicking foot, so that it is turned - * in the direction of the kick - */ - double calcKickFootYaw(); - - /** - * Transform then goal into our support_foots frame - * @param support_foot_frame Name of the support foots frame, meaning where to transform to - * @param trunk_to_base_footprint Pose of the base_footprint relative to the trunk - * @param ball_position Position of the ball - * @param kick_direction Direction in which to kick the ball - * @return pair of (transformed_pose, transformed_direction) - * - * @throws tf2::TransformException when goal cannot be transformed into support_foot_frame - */ - std::pair transformGoal(const std::string& support_foot_frame, - const Eigen::Isometry3d& trunk_to_base_footprint, - const Eigen::Vector3d& ball_position, - const Eigen::Quaterniond& kick_direction); -}; -} // namespace bitbots_dynamic_kick - -#endif // BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_ENGINE_H_ diff --git a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_ik.hpp b/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_ik.hpp deleted file mode 100644 index bc54167336..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_ik.hpp +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_IK_H_ -#define BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_IK_H_ - -#include -#include -#include -#include -#include - -namespace bitbots_dynamic_kick { - -class KickIK : public bitbots_splines::AbstractIK { - public: - KickIK() : legs_joints_group_(), left_leg_joints_group_(), right_leg_joints_group_() {}; - void init(moveit::core::RobotModelPtr kinematic_model) override; - bitbots_splines::JointGoals calculate(const KickPositions& positions) override; - void reset() override; - - private: - moveit::core::RobotStatePtr goal_state_; - planning_scene::PlanningScenePtr planning_scene_; - moveit::core::JointModelGroup* legs_joints_group_; - moveit::core::JointModelGroup* left_leg_joints_group_; - moveit::core::JointModelGroup* right_leg_joints_group_; -}; -} // namespace bitbots_dynamic_kick - -#endif // BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_IK_H_ diff --git a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_node.hpp b/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_node.hpp deleted file mode 100644 index 893be5c0f6..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_node.hpp +++ /dev/null @@ -1,150 +0,0 @@ -#ifndef BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_NODE_H_ -#define BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_NODE_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_dynamic_kick { -using KickGoal = bitbots_msgs::action::Kick; -using KickGoalHandle = rclcpp_action::ServerGoalHandle; -using namespace std::placeholders; - -/** - * KickNode is that part of bitbots_dynamic_kick which takes care of interacting with ROS and utilizes a KickEngine - * to calculate actual kick behavior. - * - * It provides an ActionServer for the bitbots_msgs::KickAction. - * This actionServer accepts new goals in any tf frame, and sets up the KickEngines to work towards this new goal - * - * Additionally it publishes the KickEngines motor-goals back into ROS - */ -class KickNode : public rclcpp::Node { - public: - explicit KickNode(const std::string& ns = std::string(), std::vector parameters = {}); - - /** - * Callback that gets executed whenever #server_ receives a new goal. - * @param goal New goal to process - */ - void executeCb(const std::shared_ptr goal_handle); - - /** - * This wrapper is used in the python wrapper for a single step of the kick - * @param dt the time difference since the last call of this method - * @return the JointCommand representing the next step or an empty JointCommand if the kick is done - */ - bitbots_msgs::msg::JointCommand stepWrapper(double dt); - - /** - * Get the current progress of the kick, from 0 to 1 - */ - double getProgress(); - - /** - * Initialize the node - * @param goal_msg The goal_msg of the kick - * @param error_string when the return value is false, this will contain details about the error - * @param trunk_to_base_footprint transform from trunk to base_footprint - * @return whether the setup was successful - */ - bool init(const bitbots_msgs::action::Kick::Goal& goal_msg, std::string& error_string); - - /** - * Set the current joint state of the robot - */ - void jointStateCallback(const sensor_msgs::msg::JointState::SharedPtr joint_states); - - /** - * Get the current pose of the trunk, relative to the support foot - */ - geometry_msgs::msg::Pose getTrunkPose(); - - /** - * Whether the left foot is the current kicking foot - */ - bool isLeftKick(); - - private: - rclcpp::Publisher::SharedPtr joint_goal_publisher_; - rclcpp::Publisher::SharedPtr support_foot_publisher_; - rclcpp::Subscription::SharedPtr cop_l_subscriber_; - rclcpp::Subscription::SharedPtr cop_r_subscriber_; - rclcpp::Subscription::SharedPtr joint_state_subscriber_; - rclcpp_action::Server::SharedPtr server_; - KickEngine engine_; - Stabilizer stabilizer_; - Visualizer visualizer_; - KickIK ik_; - int engine_rate_; - double last_ros_update_time_; - std::unique_ptr tf_buffer_; - std::shared_ptr robot_model_loader_; - bool was_support_foot_published_; - moveit::core::RobotStatePtr goal_state_; - moveit::core::RobotStatePtr current_state_; - OnSetParametersCallbackHandle::SharedPtr callback_handle_; - bool currently_kicking_ = false; - - std::string base_link_frame_, base_footprint_frame_, l_sole_frame_, r_sole_frame_; - - KickParams unstable_config_; - KickParams normal_config_; - - /** - * Do main loop in which KickEngine::update() gets called repeatedly. - * The ActionServer's state is taken into account meaning that a cancelled goal no longer gets processed. - */ - void loopEngine(const std::shared_ptr> goal_handle); - - rclcpp_action::GoalResponse goalCb(const rclcpp_action::GoalUUID& uuid, - std::shared_ptr goal); - - rclcpp_action::CancelResponse cancelCb( - std::shared_ptr> goal); - - void acceptedCb(const std::shared_ptr goal); - - /** - * Execute one step of engine-stabilize-ik - * @return the motor goals - */ - bitbots_splines::JointGoals kickStep(double dt); - - /** - * Publish the current support_foot so that a correct base_footprint can be calculated - * @param is_left_kick Whether the left foot is the current kicking foot, meaning it is in the air - */ - void publishSupportFoot(bool is_left_kick); - - /** - * Get JointCommand message for JointGoals - */ - bitbots_msgs::msg::JointCommand getJointCommand(const bitbots_splines::JointGoals& goals); - - void copLCallback(const geometry_msgs::msg::PointStamped::SharedPtr cop); - - void copRCallback(const geometry_msgs::msg::PointStamped::SharedPtr cop); - - rcl_interfaces::msg::SetParametersResult onSetParameters(const std::vector& parameters); -}; -} // namespace bitbots_dynamic_kick - -#endif // BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_NODE_H_ diff --git a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_pywrapper.hpp b/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_pywrapper.hpp deleted file mode 100644 index 8d75cd3651..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_pywrapper.hpp +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_PYWRAPPER_H_ -#define BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_PYWRAPPER_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -class PyKickWrapper { - public: - explicit PyKickWrapper(std::string ns); - moveit::py_bindings_tools::ByteString step(double dt, const std::string& joint_state_str); - bool set_goal(const std::string& goal_str, const std::string& joint_state_str); - double get_progress(); - // todo - // void set_params(boost::python::object params); - moveit::py_bindings_tools::ByteString get_trunk_pose(); - bool is_left_kick(); - - private: - std::shared_ptr kick_node_; -}; - -#endif // BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_PYWRAPPER_H_ diff --git a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_utils.hpp b/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_utils.hpp deleted file mode 100644 index 7a6bc0069e..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/kick_utils.hpp +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_UTILS_H_ -#define BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_UTILS_H_ - -#include -#include - -namespace bitbots_dynamic_kick { - -struct KickPositions { - bool is_left_kick = true; - Eigen::Isometry3d trunk_pose; - Eigen::Isometry3d flying_foot_pose; - bool cop_support_point = false; - double engine_time; -}; - -struct KickGoals { - Eigen::Vector3d ball_position; - Eigen::Quaterniond kick_direction; - double kick_speed = 0; - Eigen::Isometry3d trunk_to_base_footprint; -}; - -enum KickPhase { - INITIAL = bitbots_dynamic_kick::msg::KickDebug::INITIAL, - MOVE_TRUNK = bitbots_dynamic_kick::msg::KickDebug::MOVE_TRUNK, - RAISE_FOOT = bitbots_dynamic_kick::msg::KickDebug::RAISE_FOOT, - WINDUP = bitbots_dynamic_kick::msg::KickDebug::WINDUP, - KICK = bitbots_dynamic_kick::msg::KickDebug::KICK, - MOVE_BACK = bitbots_dynamic_kick::msg::KickDebug::MOVE_BACK, - LOWER_FOOT = bitbots_dynamic_kick::msg::KickDebug::LOWER_FOOT, - MOVE_TRUNK_BACK = bitbots_dynamic_kick::msg::KickDebug::MOVE_TRUNK_BACK, - DONE = bitbots_dynamic_kick::msg::KickDebug::DONE -}; - -} // namespace bitbots_dynamic_kick - -#endif // BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_KICK_UTILS_H_ diff --git a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/stabilizer.hpp b/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/stabilizer.hpp deleted file mode 100644 index 1022b6f1f3..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/stabilizer.hpp +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_STABILIZER_H_ -#define BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_STABILIZER_H_ - -#include - -#include -#include -#include -#include -#include - -#include "kick_utils.hpp" -#include "visualizer.hpp" - -namespace bitbots_dynamic_kick { - -class Stabilizer : public bitbots_splines::AbstractStabilizer { - public: - explicit Stabilizer(std::string ns); - - geometry_msgs::msg::Point cop_left; - geometry_msgs::msg::Point cop_right; - - /** - * Calculate required IK goals to reach foot_goal with a foot while keeping the robot as stable as possible. - * @param positions a description of the required positions - * @return BioIK Options that can be used by an instance of AbstractIK - */ - - KickPositions stabilize(const KickPositions& positions, const rclcpp::Duration& dt) override; - void reset() override; - void useCop(bool use); - void setRobotModel(moveit::core::RobotModelPtr model); - - private: - moveit::core::RobotModelPtr kinematic_model_; - std::shared_ptr pid_trunk_fused_pitch_; - std::shared_ptr pid_trunk_fused_roll_; - std::shared_ptr pitch_node_; - std::shared_ptr roll_node_; - - bool use_cop_; -}; -} // namespace bitbots_dynamic_kick - -#endif // BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_STABILIZER_H_ diff --git a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/visualizer.hpp b/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/visualizer.hpp deleted file mode 100644 index 7f4c886139..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/include/bitbots_dynamic_kick/visualizer.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// -// Created by ftsell on 6/19/19. -// - -#ifndef BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_VISUALIZER_H_ -#define BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_VISUALIZER_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_dynamic_kick { - -enum MarkerIDs { - RECEIVED_GOAL = 1, - KICK_WINDUP_POINT = 2, - KICK_STABILIZING_POINT = 3, -}; - -struct VisualizationParams { - int spline_smoothness; -}; - -class Visualizer : bitbots_splines::AbstractVisualizer { - public: - explicit Visualizer(const std::string& base_topic, rclcpp::Node::SharedPtr node); - - void setParams(VisualizationParams params); - - void displayReceivedGoal(const bitbots_msgs::action::Kick::Goal& goal); - - void displayFlyingSplines(bitbots_splines::PoseSpline splines, const std::string& support_foot_frame); - - void displayTrunkSplines(bitbots_splines::PoseSpline splines, const std::string& support_foot_frame); - - void displayWindupPoint(const Eigen::Vector3d& kick_windup_point, const std::string& support_foot_frame); - - void publishGoals(const KickPositions& positions, const KickPositions& stabilized_positions, - const moveit::core::RobotStatePtr& robot_state, KickPhase engine_phase); - - private: - rclcpp::Node::SharedPtr node_; - rclcpp::Publisher::SharedPtr goal_publisher_; - rclcpp::Publisher::SharedPtr foot_spline_publisher_; - rclcpp::Publisher::SharedPtr trunk_spline_publisher_; - rclcpp::Publisher::SharedPtr windup_publisher_; - rclcpp::Publisher::SharedPtr debug_publisher_; - std::string base_topic_; - const std::string marker_ns_ = "bitbots_dynamic_kick"; - VisualizationParams params_; -}; -} // namespace bitbots_dynamic_kick - -#endif // BITBOTS_DYNAMIC_KICK_INCLUDE_BITBOTS_DYNAMIC_KICK_VISUALIZER_H_ diff --git a/src/bitbots_motion/bitbots_dynamic_kick/launch/dynamic_kick.launch b/src/bitbots_motion/bitbots_dynamic_kick/launch/dynamic_kick.launch deleted file mode 100644 index 5b9e028615..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/launch/dynamic_kick.launch +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_motion/bitbots_dynamic_kick/launch/test.launch b/src/bitbots_motion/bitbots_dynamic_kick/launch/test.launch deleted file mode 100644 index 1d3e106019..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/launch/test.launch +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_motion/bitbots_dynamic_kick/launch/viz.launch b/src/bitbots_motion/bitbots_dynamic_kick/launch/viz.launch deleted file mode 100644 index a34a8635cf..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/launch/viz.launch +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_motion/bitbots_dynamic_kick/msg/KickDebug.msg b/src/bitbots_motion/bitbots_dynamic_kick/msg/KickDebug.msg deleted file mode 100644 index eaae6471b7..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/msg/KickDebug.msg +++ /dev/null @@ -1,32 +0,0 @@ -std_msgs/Header header - -uint8 INITIAL=0 -uint8 MOVE_TRUNK=1 -uint8 RAISE_FOOT=2 -uint8 WINDUP=3 -uint8 KICK=4 -uint8 MOVE_BACK=5 -uint8 LOWER_FOOT=6 -uint8 MOVE_TRUNK_BACK=7 -uint8 DONE=8 - -float64 engine_time -uint8 engine_phase - -# some poses useful for debugging, for example in plotjuggler -# everything is relative to the support foot -# the poses are the following: -# - poses of the engine goals, derived from the splines -# - poses after stabilizing the engine goals, still in cartesian space -# - poses computed by running FK on the IK results -# - the translational difference between the IK input and IK output (i.e. stabilized_goal and ik_result) - -geometry_msgs/Pose trunk_pose_goal -geometry_msgs/Pose trunk_pose_stabilized_goal -geometry_msgs/Pose trunk_pose_ik_result -geometry_msgs/Point trunk_position_ik_offset - -geometry_msgs/Pose flying_foot_pose_goal -geometry_msgs/Pose flying_foot_pose_stabilized_goal -geometry_msgs/Pose flying_foot_pose_ik_result -geometry_msgs/Point flying_foot_position_ik_offset diff --git a/src/bitbots_motion/bitbots_dynamic_kick/package.xml b/src/bitbots_motion/bitbots_dynamic_kick/package.xml deleted file mode 100644 index 0c3c650db6..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/package.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - bitbots_dynamic_kick - 0.1.8 - - The bitbots_dynamic_kick package implements a kick which is not based on keyframe animations. - Instead it aims to dynamically reach it's movement goal while keeping the robot stable and controllable. - - - Finn-Thorben Sell - Frederico Bormann - Timon Engelke - - MIT - - Finn-Thorben Sell - Frederico Bormann - Timon Engelke - - ament_cmake - rosidl_default_generators - - bio_ik - backward_ros - biped_interfaces - bitbots_docs - bitbots_msgs - bitbots_robot_description - bitbots_splines - bitbots_utils - control_toolbox - geometry_msgs - moveit_core - moveit_ros_move_group - moveit_ros_planning_interface - moveit_ros_robot_interaction - rclcpp - ros2_python_extension - rot_conv - sensor_msgs - std_msgs - tf2_eigen - tf2_geometry_msgs - tf2_ros - tf2 - - rosidl_interface_packages - - - - ament_cmake - - diff --git a/src/bitbots_motion/bitbots_dynamic_kick/scripts/dummy_client.py b/src/bitbots_motion/bitbots_dynamic_kick/scripts/dummy_client.py deleted file mode 100755 index 51e1ec0ed7..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/scripts/dummy_client.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import math -import os -import sys - -import rclpy -from actionlib_msgs.msg import GoalStatus -from geometry_msgs.msg import Quaternion -from rclpy.action import ActionClient -from rclpy.node import Node -from tf_transformations import quaternion_from_euler -from visualization_msgs.msg import Marker - -from bitbots_msgs.action import Kick - -showing_feedback = False - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("ball_y", type=float, help="y position of the ball [m]", default=0) - parser.add_argument("kick_direction", type=float, help="kick direction [°]", default=0) - parser.add_argument("-u", "--unstable", action="store_true", help="Use unstable kick") - args = parser.parse_args() - - print( - "Beware: this script may only work when calling it directly on the robot " - "and will maybe result in tf errors otherwise" - ) - print("[..] Initializing node", end="") - rclpy.init(args=None) - node = Node("dummy_client") - marker_pub = node.create_publisher(Marker, "debug/dynamic_kick_ball_marker", 1) - print("\r[OK] Initializing node") - - def done_cb(state, result): - print("Action completed: ", end="") - if state == GoalStatus.PENDING: - print("Pending") - elif state == GoalStatus.ACTIVE: - print("Active") - elif state == GoalStatus.PREEMPTED: - print("Preempted") - elif state == GoalStatus.SUCCEEDED: - print("Succeeded") - elif state == GoalStatus.ABORTED: - print("Aborted") - elif state == GoalStatus.REJECTED: - print("Rejected") - elif state == GoalStatus.PREEMPTING: - print("Preempting") - elif state == GoalStatus.RECALLING: - print("Recalling") - elif state == GoalStatus.RECALLED: - print("Recalled") - elif state == GoalStatus.LOST: - print("Lost") - else: - print("Unknown state", state) - print(str(result)) - - def active_cb(): - print("Server accepted action") - - def feedback_cb(feedback): - if len(sys.argv) > 1 and sys.argv[1] == "--feedback": - print("Feedback") - print(feedback) - print() - - print("[..] Connecting to action server 'dynamic_kick'", end="") - sys.stdout.flush() - client = ActionClient(node, Kick, "dynamic_kick") - if not client.wait_for_server(): - sys.exit(1) - print("\r[OK] Connecting to action server 'dynamic_kick'") - print() - - goal = Kick.Goal() - goal.header.stamp = node.get_clock().now().to_msg() - frame_prefix = "" if os.environ.get("ROS_NAMESPACE") is None else os.environ.get("ROS_NAMESPACE") + "/" - goal.header.frame_id = frame_prefix + "base_footprint" - goal.ball_position.x = 0.2 - goal.ball_position.y = args.ball_y - goal.ball_position.z = 0.0 - goal.unstable = args.unstable - - quat_vector = quaternion_from_euler(0, 0, math.radians(args.kick_direction)) - goal.kick_direction = Quaternion(x=quat_vector[0], y=quat_vector[1], z=quat_vector[2], w=quat_vector[3]) - - goal.kick_speed = 6.7 if args.unstable else 1.0 - - """marker = Marker() - marker.header.stamp = goal.ball_position.header.stamp - marker.header.frame_id = goal.ball_position.header.frame_id - marker.pose.position = goal.ball_position.vector - marker.pose.orientation.w = 1 - marker.scale = Vector3(0.05, 0.05, 0.05) - marker.type = Marker.SPHERE - marker.action = Marker.ADD - marker.lifetime = Duration(seconds=8) - marker.color.a = 1 - marker.color.r = 1 - marker.color.g = 1 - marker.color.b = 1 - marker.id = 1 - marker.frame_locked = True - marker_pub.publish(marker) - """ - future = client.send_goal_async(goal) - future.add_done_callback(done_cb) - # future.add_feedback_callback(feedback_cb) - print("Sent new goal. Waiting for result") - # rclpy.spin_until_future_complete(client, future) diff --git a/src/bitbots_motion/bitbots_dynamic_kick/scripts/interactive_test.py b/src/bitbots_motion/bitbots_dynamic_kick/scripts/interactive_test.py deleted file mode 100644 index affdf4581f..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/scripts/interactive_test.py +++ /dev/null @@ -1,249 +0,0 @@ -#!/usr/bin/env python3 - -import os -import select -import sys -import termios -import tty - -import rclpy -from actionlib_msgs.msg import GoalStatus -from geometry_msgs.msg import Quaternion -from rclpy.action import ActionClient -from tf_transformations import quaternion_from_euler - -from bitbots_msgs.msg import KickAction, KickGoal -from bitbots_msgs.srv import SetObjectPose, SetObjectPoseRequest, SetObjectPosition, SetObjectPositionRequest - -showing_feedback = False - -msg = """ -BitBots Interactive Kick Test ------------------------------ -Move Robot: Move Ball: - q w e t - a s d f g h - -SHIFT increases with factor 10 - -y/Y: set kick y command -x/X: set kick x command -c/C: set direction command -v/V: set speed command - -<: execute kick -r: reset robot and ball - - - - - - - - -""" -move_robot_bindings = { - "w": (1, 0, 0), - "s": (-1, 0, 0), - "a": (0, 1, 0), - "d": (0, -1, 0), - "q": (0, 0, 1), - "e": (0, 0, -1), - "W": (10, 0, 0), - "S": (-10, 0, 0), - "A": (0, 10, 0), - "D": (0, -10, 0), - "Q": (0, 0, 10), - "E": (0, 0, -10), -} - -move_ball_bindings = { - "t": (1, 0, 0), - "g": (-1, 0, 0), - "f": (0, 1, 0), - "h": (0, -1, 0), - "T": (10, 0, 0), - "G": (-10, 0, 0), - "F": (0, 10, 0), - "H": (0, -10, 0), -} - -settings = termios.tcgetattr(sys.stdin) - - -def get_key(): - tty.setraw(sys.stdin.fileno()) - select.select([sys.stdin], [], [], 0) - key = sys.stdin.read(1) - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings) - return key - - -if __name__ == "__main__": - rclpy.init(args=None) - print("Waiting for kick server and simulation") - - def done_cb(state, result): - return - print("Action completed: ", end="") - if state == GoalStatus.PENDING: - print("Pending") - elif state == GoalStatus.ACTIVE: - print("Active") - elif state == GoalStatus.PREEMPTED: - print("Preempted") - elif state == GoalStatus.SUCCEEDED: - print("Succeeded") - elif state == GoalStatus.ABORTED: - print("Aborted") - elif state == GoalStatus.REJECTED: - print("Rejected") - elif state == GoalStatus.PREEMPTING: - print("Preempting") - elif state == GoalStatus.RECALLING: - print("Recalling") - elif state == GoalStatus.RECALLED: - print("Recalled") - elif state == GoalStatus.LOST: - print("Lost") - else: - print("Unknown state", state) - print(str(result)) - - def active_cb(): - return - print("Server accepted action") - - def feedback_cb(feedback): - return - if len(sys.argv) > 1 and sys.argv[1] == "--feedback": - print("Feedback") - print(feedback) - print() - - sys.stdout.flush() - client = ActionClient(KickAction, "dynamic_kick") - if not client.wait_for_server(): - sys.exit(1) - - robot_x = 2.8 - robot_y = 0 - robot_yaw = 0 - ball_x = 3 - ball_y = 0 - kick_x = 0.1 - kick_y = 0 - kick_direction = 0 - kick_speed = 1 - - x_speed_step = 0.01 - y_speed_step = 0.01 - turn_speed_step = 0.01 - - frame_prefix = "" if os.environ.get("ROS_NAMESPACE") is None else os.environ.get("ROS_NAMESPACE") + "/" - - def generate_kick_goal(x, y, direction, speed, unstable=False): - kick_goal = KickGoal() - kick_goal.header.stamp = rclpy.get_clock().now() - kick_goal.header.frame_id = frame_prefix + "base_footprint" - kick_goal.ball_position.x = x - kick_goal.ball_position.y = y - kick_goal.ball_position.z = 0.0 - x, y, z, w = quaternion_from_euler(0, 0, direction) - kick_goal.kick_direction = Quaternion(x=x, y=y, z=z, w=w) - kick_goal.kick_speed = speed - kick_goal.unstable = unstable - return kick_goal - - def execute_kick(): - goal = generate_kick_goal(kick_x, kick_y, kick_direction, kick_speed) - client.send_goal_async(goal) - client.done_cb = done_cb - client.feedback_cb = feedback_cb - client.active_cb = active_cb - client.wait_for_result() - - rclpy.wait_for_service("set_robot_pose") - set_robot_pose_service = rclpy.create_client(SetObjectPose, "set_robot_pose") - rclpy.wait_for_service("set_ball_position") - set_ball_pos_service = rclpy.create_client(SetObjectPosition, "set_ball_position") - - def set_robot_pose(): - request = SetObjectPoseRequest() - request.object_name = "amy" - request.pose.position.x = robot_x - request.pose.position.y = robot_y - request.pose.position.z = 0.40 - x, y, z, w = quaternion_from_euler(0, 0, robot_yaw) - request.pose.orientation = Quaternion(x=x, y=y, z=z, w=w) - response = set_robot_pose_service(request) - return response - - def set_ball_position(): - request = SetObjectPositionRequest() - request.position.x = ball_x - request.position.y = ball_y - request.position.z = 0.04 - response = set_ball_pos_service(request) - return response - - sys.stdout.write("\x1b[A") - sys.stdout.write("\x1b[A") - print(msg) - - while rclpy.ok(): - key = get_key() - if key in move_robot_bindings.keys(): - robot_x += move_robot_bindings[key][0] * x_speed_step - robot_x = round(robot_x, 4) - robot_y += move_robot_bindings[key][1] * y_speed_step - robot_y = round(robot_y, 4) - robot_yaw += move_robot_bindings[key][2] * turn_speed_step - robot_yaw = round(robot_yaw, 4) - set_robot_pose() - elif key in move_ball_bindings.keys(): - ball_x += move_ball_bindings[key][0] * x_speed_step - ball_x = round(ball_x, 4) - ball_y += move_ball_bindings[key][1] * y_speed_step - ball_y = round(ball_y, 4) - set_ball_position() - elif key == "<": - execute_kick() - elif key == "y": - kick_y -= 0.01 - elif key == "Y": - kick_y += 0.01 - elif key == "x": - kick_x -= 0.01 - elif key == "X": - kick_x += 0.01 - elif key == "c": - kick_direction -= 0.01 - elif key == "C": - kick_direction += 0.01 - elif key == "v": - kick_speed -= 0.1 - elif key == "V": - kick_speed += 0.1 - elif key == "r": - set_robot_pose() - set_ball_position() - elif key == "\x03": - break - - sys.stdout.write("\x1b[A") - sys.stdout.write("\x1b[A") - sys.stdout.write("\x1b[A") - sys.stdout.write("\x1b[A") - sys.stdout.write("\x1b[A") - sys.stdout.write("\x1b[A") - sys.stdout.write("\x1b[A") - print( - f"robot_x: {round(robot_x, 2)} ball_x: {round(ball_x, 2)} \n" - f"robot_y: {round(robot_y, 2)} ball_x: {round(ball_y, 2)} \n" - f"robot_yaw: {round(robot_yaw, 2)} \n" - f"kick x: {round(kick_x, 2)} \n" - f"kick y: {round(kick_y, 2)} \n" - f"kick dir: {round(kick_direction, 2)} \n" - f"kick speed: {round(kick_speed, 2)} " - ) diff --git a/src/bitbots_motion/bitbots_dynamic_kick/setup.py b/src/bitbots_motion/bitbots_dynamic_kick/setup.py deleted file mode 100644 index e4d29a6e2c..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/setup.py +++ /dev/null @@ -1,10 +0,0 @@ -from distutils.core import setup - -from catkin_pkg.python_setup import generate_distutils_setup - -d = generate_distutils_setup( - packages=["bitbots_dynamic_kick"], - package_dir={"": "src"}, -) - -setup(**d) diff --git a/src/bitbots_motion/bitbots_dynamic_kick/src/bitbots_dynamic_kick/__init__.py b/src/bitbots_motion/bitbots_dynamic_kick/src/bitbots_dynamic_kick/__init__.py deleted file mode 100644 index 3c3cae40ba..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/src/bitbots_dynamic_kick/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from bitbots_dynamic_kick.py_kick_wrapper import PyKick - -__all__ = [ - "PyKick", -] diff --git a/src/bitbots_motion/bitbots_dynamic_kick/src/bitbots_dynamic_kick/py_kick_wrapper.py b/src/bitbots_motion/bitbots_dynamic_kick/src/bitbots_dynamic_kick/py_kick_wrapper.py deleted file mode 100644 index 20166476ab..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/src/bitbots_dynamic_kick/py_kick_wrapper.py +++ /dev/null @@ -1,104 +0,0 @@ -from io import BytesIO - -from geometry_msgs.msg import Pose -from moveit_ros_planning_interface._moveit_roscpp_initializer import roscpp_init, roscpp_shutdown -from sensor_msgs.msg import JointState - -from bitbots_dynamic_kick.py_dynamic_kick import PyKickWrapper -from bitbots_msgs.msg import JointCommand, KickGoal - - -def to_cpp(msg): - """Return a serialized string from a ROS message - - Parameters - ---------- - - msg: a ROS message instance. - """ - buf = BytesIO() - msg.serialize(buf) - value = buf.getvalue() - return value - - -def from_cpp(str_msg, cls): - """Return a ROS message from a serialized string - - Parameters - ---------- - - str_msg: str, serialized message - - cls: ROS message class, e.g. sensor_msgs.msg.LaserScan. - """ - msg = cls() - result = msg.deserialize(str_msg) - return result - - -class PyKick: - """ - This class is a wrapper around the dynamic kick. When an instance is created, a roscore must be running and - the robot description must be loaded to the parameter server. To use the wrapper, call set_params to set a - dictionary of parameters. A list of parameters can be found in the dynamic reconfigure file, the pid controllers are - not supported yet. Then, set the kick goal by calling init. After that, repeatedly call step with the passed time - and the current motor positions of the robot. It will return the new motor commands. - """ - - def __init__(self, namespace=""): - """ - Initialize the kick, needs a roscore and the robot description - - :param namespace: The namespace where the kick node is launched - """ - roscpp_init("py_kick", []) - # make namespace end with a / - if namespace != "" and namespace[-1] != "/": - namespace = namespace + "/" - self.py_kick_wrapper = PyKickWrapper(namespace) - - def __del__(self): - roscpp_shutdown() - - def set_goal(self, msg: KickGoal, joint_state: JointState) -> bool: - """ - Set a goal for the kick. - - :param msg: The goal, instance of bitbots_msgs/KickGoal - :param joint_state: The current motor positions of the robot - :return: whether the goal was set successfully - """ - return self.py_kick_wrapper.set_goal(to_cpp(msg), to_cpp(joint_state)) - - def step(self, dt: float, joint_state: JointState) -> JointCommand: - """ - Perform a step of the kick engine, must be repeatedly called to perform the full kick. - - :param dt: the time passed since the last call of step (in seconds) - :param joint_state: the current motor positions of the robot - :return: Returns the joint command for the next position of the kick. Empty JointCommand if finished. - """ - if dt == 0.0: - # preventing weird spline interpolation errors on edge case - dt = 0.001 - elif dt > 1: - print("dt is very large, maybe forgot to reset?") - step = self.py_kick_wrapper.step(dt, to_cpp(joint_state)) - return from_cpp(step, JointCommand) - - def get_progress(self) -> float: - """Returns the progress of the kick, between 0 and 1 where 1 is finished.""" - return self.py_kick_wrapper.get_progress() - - def set_params(self, params_dict): - """ - Set the (dynamic reconfigurable) parameters of the kick. - :param params_dict: dict where the key is the name of the parameter (str). Does not have to contain all params. - """ - self.py_kick_wrapper.set_params(params_dict) - - def get_trunk_pose(self) -> Pose: - """Returns the current pose of the trunk relative to the support foot""" - return from_cpp(self.py_kick_wrapper.get_trunk_pose(), Pose) - - def is_left_kick(self) -> bool: - """Returns if the left foot is the currently kicking foot""" - return self.py_kick_wrapper.is_left_kick() diff --git a/src/bitbots_motion/bitbots_dynamic_kick/src/kick_engine.cpp b/src/bitbots_motion/bitbots_dynamic_kick/src/kick_engine.cpp deleted file mode 100644 index 723e35a4b3..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/src/kick_engine.cpp +++ /dev/null @@ -1,309 +0,0 @@ -#include -#include - -namespace bitbots_dynamic_kick { - -KickEngine::KickEngine(rclcpp::Node::SharedPtr node) { node_ = node; } - -void KickEngine::reset() { - time_ = 0; - trunk_spline_ = bitbots_splines::PoseSpline(); - flying_foot_spline_ = bitbots_splines::PoseSpline(); -} - -void KickEngine::setGoals(const KickGoals& goals) { - is_left_kick_ = calcIsLeftFootKicking(goals.ball_position, goals.kick_direction); - // TODO Internal state is dirty when goal transformation fails - - /* Save given goals because we reuse them later */ - auto transformed_goal = transformGoal((is_left_kick_) ? "r_sole" : "l_sole", goals.trunk_to_base_footprint, - goals.ball_position, goals.kick_direction); - ball_position_ = transformed_goal.first; - kick_direction_ = transformed_goal.second; - kick_direction_.normalize(); - kick_speed_ = goals.kick_speed; - - time_ = 0; - - Eigen::Isometry3d trunk_to_flying_foot = current_state_->getGlobalLinkTransform(is_left_kick_ ? "l_sole" : "r_sole"); - Eigen::Isometry3d trunk_to_support_foot = current_state_->getGlobalLinkTransform(is_left_kick_ ? "r_sole" : "l_sole"); - - /* get the start position of the trunk relative to the support foot */ - Eigen::Isometry3d trunk_frame; - if (is_left_kick_) { - trunk_frame = current_state_->getGlobalLinkTransform("r_sole").inverse(); - } else { - trunk_frame = current_state_->getGlobalLinkTransform("l_sole").inverse(); - } - - /* Plan new splines according to new goal */ - calcSplines(trunk_to_support_foot.inverse() * trunk_to_flying_foot, trunk_frame); -} - -KickPositions KickEngine::update(double dt) { - /* Only do an actual update when splines are present */ - KickPositions positions; - /* Get should-be pose from planned splines (every axis) at current time */ - positions.trunk_pose = tf2::transformToEigen(tf2::toMsg(trunk_spline_.getTfTransform(time_))); - positions.flying_foot_pose = tf2::transformToEigen(tf2::toMsg(flying_foot_spline_.getTfTransform(time_))); - positions.is_left_kick = is_left_kick_; - positions.engine_time = time_; - - /* calculate if we want to use center-of-pressure in the current phase - * use COP based support point only when the weight is on the support foot - * while raising/lowering the foot, the weight is not completely on the support foot (that's why /2.0)*/ - if (time_ > params_.move_trunk_time + params_.raise_foot_time / 2.0 && - time_ < phase_timings_.move_back + params_.lower_foot_time / 2.0) { - positions.cop_support_point = true; - } else { - positions.cop_support_point = false; - } - - time_ += dt; - - /* Stabilize and return result */ - return positions; -} - -void KickEngine::calcSplines(const Eigen::Isometry3d& flying_foot_pose, const Eigen::Isometry3d& trunk_pose) { - /* - * Add current position, target position and current position to splines so that they describe a smooth - * curve to the ball and back - */ - /* Splines: - * - stand - * - move trunk - * - raise foot - * - kick - * - move foot back - * - lower foot - * - move trunk back - */ - - /* calculate timings for this kick */ - phase_timings_.move_trunk = 0 + params_.move_trunk_time; - phase_timings_.raise_foot = phase_timings_.move_trunk + params_.raise_foot_time; - phase_timings_.windup = phase_timings_.raise_foot + params_.move_to_ball_time; - phase_timings_.kick = phase_timings_.windup + params_.kick_time; - phase_timings_.move_back = phase_timings_.kick + params_.move_back_time; - phase_timings_.lower_foot = phase_timings_.move_back + params_.lower_foot_time; - phase_timings_.move_trunk_back = phase_timings_.lower_foot + params_.move_trunk_back_time; - - int kick_foot_sign; - if (is_left_kick_) { - kick_foot_sign = 1; - } else { - kick_foot_sign = -1; - } - - windup_point_ = calcKickWindupPoint(); - - /* build vector of speeds in each direction */ - double speed_yaw = rot_conv::EYawOfQuat(kick_direction_); - Eigen::Vector3d speed_vector(cos(speed_yaw), sin(speed_yaw), 0); - - /* Flying foot position */ - flying_foot_spline_.x()->addPoint(0, flying_foot_pose.translation().x()); - flying_foot_spline_.x()->addPoint(phase_timings_.move_trunk, 0); - flying_foot_spline_.x()->addPoint(phase_timings_.raise_foot, 0); - flying_foot_spline_.x()->addPoint(phase_timings_.windup, windup_point_.x(), 0, 0); - flying_foot_spline_.x()->addPoint(phase_timings_.kick, ball_position_.x(), speed_vector.x() * kick_speed_, 0); - flying_foot_spline_.x()->addPoint(phase_timings_.move_back, 0); - flying_foot_spline_.x()->addPoint(phase_timings_.lower_foot, 0); - flying_foot_spline_.x()->addPoint(phase_timings_.move_trunk_back, 0); - - flying_foot_spline_.y()->addPoint(0, flying_foot_pose.translation().y()); - flying_foot_spline_.y()->addPoint(phase_timings_.move_trunk, flying_foot_pose.translation().y()); - flying_foot_spline_.y()->addPoint(phase_timings_.raise_foot, kick_foot_sign * params_.foot_distance); - flying_foot_spline_.y()->addPoint(phase_timings_.windup, windup_point_.y(), 0, 0); - flying_foot_spline_.y()->addPoint(phase_timings_.kick, ball_position_.y(), speed_vector.y() * kick_speed_, 0); - flying_foot_spline_.y()->addPoint(phase_timings_.move_back, kick_foot_sign * params_.foot_distance); - flying_foot_spline_.y()->addPoint(phase_timings_.lower_foot, kick_foot_sign * params_.foot_distance); - flying_foot_spline_.y()->addPoint(phase_timings_.move_trunk_back, flying_foot_pose.translation().y()); - - flying_foot_spline_.z()->addPoint(0, flying_foot_pose.translation().z()); - flying_foot_spline_.z()->addPoint(phase_timings_.move_trunk, 0); - flying_foot_spline_.z()->addPoint(phase_timings_.raise_foot, params_.foot_rise); - flying_foot_spline_.z()->addPoint(phase_timings_.windup, params_.foot_rise); - flying_foot_spline_.z()->addPoint(phase_timings_.kick, params_.foot_rise); - flying_foot_spline_.z()->addPoint(phase_timings_.move_back, params_.foot_rise); - flying_foot_spline_.z()->addPoint(phase_timings_.lower_foot, 0.4 * params_.foot_rise); - flying_foot_spline_.z()->addPoint(phase_timings_.move_trunk_back, 0); - - /* Flying foot orientation */ - /* Get euler angles for foot rotation */ - double start_r, start_p, start_y; - Eigen::Quaterniond flying_foot_rotation(flying_foot_pose.rotation()); - rot_conv::EulerFromQuat(flying_foot_rotation, start_y, start_p, start_r); - double target_y = calcKickFootYaw(); - - /* Add these quaternions in the same fashion as before to our splines (current, target, current) */ - flying_foot_spline_.roll()->addPoint(0, start_r); - flying_foot_spline_.roll()->addPoint(phase_timings_.windup, start_r); - flying_foot_spline_.roll()->addPoint(phase_timings_.move_trunk_back, start_r); - flying_foot_spline_.pitch()->addPoint(0, start_p); - flying_foot_spline_.pitch()->addPoint(phase_timings_.windup, start_p); - flying_foot_spline_.pitch()->addPoint(phase_timings_.move_trunk_back, start_p); - flying_foot_spline_.yaw()->addPoint(0, start_y); - flying_foot_spline_.yaw()->addPoint(phase_timings_.raise_foot, start_y); - flying_foot_spline_.yaw()->addPoint(phase_timings_.windup, target_y); - flying_foot_spline_.yaw()->addPoint(phase_timings_.kick, target_y); - flying_foot_spline_.yaw()->addPoint(phase_timings_.move_back, start_y); - flying_foot_spline_.yaw()->addPoint(phase_timings_.move_trunk_back, start_y); - - /* Stabilizing point */ - trunk_spline_.x()->addPoint(0, 0); - trunk_spline_.x()->addPoint(phase_timings_.move_trunk, params_.stabilizing_point_x); - trunk_spline_.x()->addPoint(phase_timings_.raise_foot, params_.stabilizing_point_x); - trunk_spline_.x()->addPoint(phase_timings_.windup, params_.stabilizing_point_x); - trunk_spline_.x()->addPoint(phase_timings_.kick, params_.stabilizing_point_x); - trunk_spline_.x()->addPoint(phase_timings_.move_back, params_.stabilizing_point_x); - trunk_spline_.x()->addPoint(phase_timings_.lower_foot, params_.stabilizing_point_x); - trunk_spline_.x()->addPoint(phase_timings_.move_trunk_back, 0); - - trunk_spline_.y()->addPoint(0, kick_foot_sign * (params_.foot_distance / 2.0)); - trunk_spline_.y()->addPoint(phase_timings_.move_trunk, kick_foot_sign * (-params_.stabilizing_point_y)); - trunk_spline_.y()->addPoint(phase_timings_.raise_foot, kick_foot_sign * (-params_.stabilizing_point_y)); - trunk_spline_.y()->addPoint(phase_timings_.windup, kick_foot_sign * (-params_.stabilizing_point_y)); - trunk_spline_.y()->addPoint(phase_timings_.kick, kick_foot_sign * (-params_.stabilizing_point_y)); - trunk_spline_.y()->addPoint(phase_timings_.move_back, kick_foot_sign * (-params_.stabilizing_point_y)); - trunk_spline_.y()->addPoint(phase_timings_.lower_foot, kick_foot_sign * (-params_.stabilizing_point_y)); - trunk_spline_.y()->addPoint(phase_timings_.move_trunk_back, kick_foot_sign * (params_.foot_distance / 2.0)); - - trunk_spline_.z()->addPoint(0, trunk_pose.translation().z()); - trunk_spline_.z()->addPoint(phase_timings_.move_trunk, params_.trunk_height); - trunk_spline_.z()->addPoint(phase_timings_.lower_foot, params_.trunk_height); - trunk_spline_.z()->addPoint(phase_timings_.move_trunk_back, trunk_pose.translation().z()); - - /* Get euler angles for trunk rotation */ - double trunk_r, trunk_p, trunk_y; - Eigen::Quaterniond trunk_rotation(trunk_pose.rotation()); - rot_conv::EulerFromQuat(flying_foot_rotation, trunk_y, trunk_p, trunk_r); - - trunk_spline_.roll()->addPoint(0, trunk_r); - trunk_spline_.roll()->addPoint(phase_timings_.raise_foot, kick_foot_sign * params_.trunk_roll); - trunk_spline_.roll()->addPoint(phase_timings_.lower_foot, kick_foot_sign * params_.trunk_roll); - trunk_spline_.roll()->addPoint(phase_timings_.move_trunk_back, trunk_r); - trunk_spline_.pitch()->addPoint(0, trunk_p); - trunk_spline_.pitch()->addPoint(phase_timings_.raise_foot, params_.trunk_pitch); - trunk_spline_.pitch()->addPoint(phase_timings_.lower_foot, params_.trunk_pitch); - trunk_spline_.pitch()->addPoint(phase_timings_.move_trunk_back, trunk_p); - trunk_spline_.yaw()->addPoint(0, trunk_y); - trunk_spline_.yaw()->addPoint(phase_timings_.raise_foot, kick_foot_sign * params_.trunk_yaw); - trunk_spline_.yaw()->addPoint(phase_timings_.lower_foot, kick_foot_sign * params_.trunk_yaw); - trunk_spline_.yaw()->addPoint(phase_timings_.move_trunk_back, trunk_y); -} - -std::pair KickEngine::transformGoal( - const std::string& support_foot_frame, const Eigen::Isometry3d& trunk_to_base_footprint, - const Eigen::Vector3d& ball_position, const Eigen::Quaterniond& kick_direction) { - /* ball_position and kick_direction are currently in base_footprint, we want them in support foot frame */ - /* first, get transform from base_footprint to support foot */ - Eigen::Isometry3d trunk_to_support_foot = current_state_->getGlobalLinkTransform(support_foot_frame); - Eigen::Isometry3d base_footprint_to_support_foot = trunk_to_base_footprint.inverse() * trunk_to_support_foot; - /* now, apply the transforms. Because of eigen, the transform has to be on the left hand side, therefore it must be - * inversed */ - Eigen::Vector3d ball_transformed = base_footprint_to_support_foot.inverse() * ball_position; - Eigen::Matrix3d kick_direction_transformed_matrix = - (base_footprint_to_support_foot.inverse() * kick_direction).rotation(); - Eigen::Quaterniond kick_direction_transformed(kick_direction_transformed_matrix); - return std::make_pair(ball_transformed, kick_direction_transformed); -} - -Eigen::Vector3d KickEngine::calcKickWindupPoint() { - /* retrieve yaw from kick_direction_ */ - double yaw = rot_conv::EYawOfQuat(kick_direction_); - - /* create a vector which points in the negative direction of kick_direction_ */ - Eigen::Vector3d vec(cos(yaw), sin(yaw), 0); - vec.normalize(); - - /* take windup distance into account */ - vec *= -params_.kick_windup_distance; - - /* add the ball position because the windup point is in support_foot_frame and not ball_frame */ - vec += ball_position_; - - vec.z() = params_.foot_rise; - - return vec; -} - -bool KickEngine::calcIsLeftFootKicking(const Eigen::Vector3d& ball_position, const Eigen::Quaterniond& kick_direction) { - /* it is important that everything is in base_footprint frame! */ - - /* - * check if ball is outside of an imaginary corridor - * if it is not, we use a more fined grained criterion which takes kick_direction into account - */ - if (ball_position.y() > params_.choose_foot_corridor_width / 2) { - return true; - } else if (ball_position.y() < -params_.choose_foot_corridor_width / 2) { - return false; - } - - /* use the more fine grained angle based criterion - * angle_1 = angle between "forward" and "ball position" - * angle_2 = yaw of kick_direction - * angle_diff = difference between the two based on which the decision happens - */ - double angle_1 = std::atan2(ball_position.y(), ball_position.x()); - - double angle_2 = rot_conv::EYawOfQuat(kick_direction); - double angle_diff = angle_2 - angle_1; - - RCLCPP_INFO_STREAM(node_->get_logger(), "Choosing " << ((angle_diff < 0) ? "left" : "right") << " foot to kick"); - - return angle_diff < 0; -} - -double KickEngine::calcKickFootYaw() { - double kick_yaw_angle = rot_conv::EYawOfQuat(kick_direction_); - - if (kick_yaw_angle > M_PI_4) { - return kick_yaw_angle - M_PI_2; - } else if (kick_yaw_angle < -M_PI_4) { - return kick_yaw_angle + M_PI_2; - } else { - return kick_yaw_angle; - } -} - -bool KickEngine::isLeftKick() { return is_left_kick_; } - -int KickEngine::getPercentDone() const { return int(time_ / phase_timings_.move_trunk_back * 100); } - -geometry_msgs::msg::Pose KickEngine::getTrunkPose() { return trunk_spline_.getGeometryMsgPose(time_); } - -bitbots_splines::PoseSpline KickEngine::getFlyingSplines() const { return flying_foot_spline_; } - -bitbots_splines::PoseSpline KickEngine::getTrunkSplines() const { return trunk_spline_; } - -KickPhase KickEngine::getPhase() const { - if (time_ == 0) - return KickPhase::INITIAL; - else if (time_ <= phase_timings_.move_trunk) - return KickPhase::MOVE_TRUNK; - else if (time_ <= phase_timings_.raise_foot) - return KickPhase::RAISE_FOOT; - else if (time_ <= phase_timings_.windup) - return KickPhase::WINDUP; - else if (time_ <= phase_timings_.kick) - return KickPhase::KICK; - else if (time_ <= phase_timings_.move_back) - return KickPhase::MOVE_BACK; - else if (time_ <= phase_timings_.lower_foot) - return KickPhase::LOWER_FOOT; - else if (time_ <= phase_timings_.move_trunk_back) - return KickPhase::MOVE_TRUNK_BACK; - else - return KickPhase::DONE; -} - -void KickEngine::setParams(KickParams params) { params_ = params; } - -Eigen::Vector3d KickEngine::getWindupPoint() { return windup_point_; } - -void KickEngine::setRobotState(moveit::core::RobotStatePtr current_state) { current_state_ = current_state; } - -} // namespace bitbots_dynamic_kick diff --git a/src/bitbots_motion/bitbots_dynamic_kick/src/kick_ik.cpp b/src/bitbots_motion/bitbots_dynamic_kick/src/kick_ik.cpp deleted file mode 100644 index 227ec982d0..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/src/kick_ik.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include - -namespace bitbots_dynamic_kick { - -void KickIK::init(moveit::core::RobotModelPtr kinematic_model) { - /* Extract joint groups from kinematics model */ - legs_joints_group_ = kinematic_model->getJointModelGroup("Legs"); - left_leg_joints_group_ = kinematic_model->getJointModelGroup("LeftLeg"); - right_leg_joints_group_ = kinematic_model->getJointModelGroup("RightLeg"); - - /* Reset kinematic goal to default */ - goal_state_.reset(new moveit::core::RobotState(kinematic_model)); - goal_state_->setToDefaultValues(); - - /* Initialize collision model */ - planning_scene_.reset(new planning_scene::PlanningScene(kinematic_model)); -} - -void KickIK::reset() { - /* We have to set some good initial position in the goal state, - * since we are using a gradient based method. Otherwise, the - * first step will be not correct */ - std::vector names_vec = {"LHipPitch", "LKnee", "LAnklePitch", "RHipPitch", "RKnee", "RAnklePitch"}; - std::vector pos_vec = {0.7, 1.0, -0.4, -0.7, -1.0, 0.4}; - for (size_t i = 0; i < names_vec.size(); ++i) { - goal_state_->setJointPositions(names_vec[i], &pos_vec[i]); - } -} - -bitbots_splines::JointGoals KickIK::calculate(const KickPositions& positions) { - // change goals from support foot based coordinate system to trunk based coordinate system - Eigen::Isometry3d trunk_to_support_foot_goal = positions.trunk_pose.inverse(); - Eigen::Isometry3d trunk_to_flying_foot_goal = trunk_to_support_foot_goal * positions.flying_foot_pose; - - // decide which foot is which - moveit::core::JointModelGroup *support_foot_group, *flying_foot_group; - if (positions.is_left_kick) { - support_foot_group = right_leg_joints_group_; - flying_foot_group = left_leg_joints_group_; - } else { - support_foot_group = left_leg_joints_group_; - flying_foot_group = right_leg_joints_group_; - } - - // we have to do this otherwise there is an error - goal_state_->updateLinkTransforms(); - - // call IK two times, since we have two legs - // we don't listen to the return value since BioIK always returns true - goal_state_->setFromIK(support_foot_group, trunk_to_support_foot_goal, 0.01); - goal_state_->updateLinkTransforms(); - - goal_state_->setFromIK(flying_foot_group, trunk_to_flying_foot_goal, 0.01); - - std::vector joint_names = legs_joints_group_->getActiveJointModelNames(); - std::vector joint_goals; - goal_state_->copyJointGroupPositions(legs_joints_group_, joint_goals); - - /* construct result object */ - bitbots_splines::JointGoals result; - result.first = joint_names; - result.second = joint_goals; - return result; -} - -} // namespace bitbots_dynamic_kick diff --git a/src/bitbots_motion/bitbots_dynamic_kick/src/kick_node.cpp b/src/bitbots_motion/bitbots_dynamic_kick/src/kick_node.cpp deleted file mode 100644 index 98a7c293f6..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/src/kick_node.cpp +++ /dev/null @@ -1,435 +0,0 @@ -#include - -namespace bitbots_dynamic_kick { -using namespace std::chrono_literals; - -KickNode::KickNode(const std::string& ns, std::vector parameters) - : Node(ns + "dynamic_kick", rclcpp::NodeOptions() - .allow_undeclared_parameters(true) - .parameter_overrides(parameters) - .automatically_declare_parameters_from_overrides(true)), - engine_(SharedPtr(this)), - stabilizer_(ns), - visualizer_(ns + "debug/dynamic_kick", SharedPtr(this)), - tf_buffer_(std::make_unique(this->get_clock())) { - tf_buffer_->setUsingDedicatedThread(true); - // get all kinematics parameters from the move_group node if they are not set manually via constructor - std::string check_kinematic_parameters; - if (!this->get_parameter("robot_description_kinematics.LeftLeg.kinematics_solver", check_kinematic_parameters)) { - auto parameters_client = std::make_shared(this, "/move_group"); - while (!parameters_client->wait_for_service(1s)) { - if (!rclcpp::ok()) { - RCLCPP_ERROR(this->get_logger(), "Interrupted while waiting for the service. Exiting."); - rclcpp::shutdown(); - } - RCLCPP_INFO_THROTTLE(this->get_logger(), *this->get_clock(), 10 * 1e9, - "Can't copy parameters from move_group node. Service not available, waiting again..."); - } - rcl_interfaces::msg::ListParametersResult parameter_list = - parameters_client->list_parameters({"robot_description_kinematics"}, 10); - auto copied_parameters = parameters_client->get_parameters(parameter_list.names); - // set the parameters to our node - this->set_parameters(copied_parameters); - } - - this->declare_parameter("base_link_frame", "base_link"); - this->get_parameter("base_link_frame", base_link_frame_); - this->declare_parameter("base_footprint_frame", "base_footprint"); - this->get_parameter("base_footprint_frame", base_footprint_frame_); - this->declare_parameter("r_sole_frame", "r_sole"); - this->get_parameter("r_sole_frame", r_sole_frame_); - this->declare_parameter("l_sole_frame", "l_sole"); - this->get_parameter("l_sole_frame", l_sole_frame_); - - VisualizationParams viz_params = VisualizationParams(); - this->get_parameter("spline_smoothness", viz_params.spline_smoothness); - visualizer_.setParams(viz_params); - this->get_parameter("engine_rate", engine_rate_); - bool use_center_of_pressure = false; - this->get_parameter("use_center_of_pressure", use_center_of_pressure); - stabilizer_.useCop(use_center_of_pressure); - - normal_config_ = KickParams(); - this->get_parameter("foot_rise", normal_config_.foot_rise); - this->get_parameter("foot_distance", normal_config_.foot_distance); - this->get_parameter("kick_windup_distance", normal_config_.kick_windup_distance); - this->get_parameter("trunk_height", normal_config_.trunk_height); - this->get_parameter("trunk_roll", normal_config_.trunk_roll); - this->get_parameter("trunk_pitch", normal_config_.trunk_pitch); - this->get_parameter("trunk_yaw", normal_config_.trunk_yaw); - this->get_parameter("move_trunk_time", normal_config_.move_trunk_time); - this->get_parameter("raise_foot_time", normal_config_.raise_foot_time); - this->get_parameter("move_to_ball_time", normal_config_.move_to_ball_time); - this->get_parameter("kick_time", normal_config_.kick_time); - this->get_parameter("move_back_time", normal_config_.move_back_time); - this->get_parameter("lower_foot_time", normal_config_.lower_foot_time); - this->get_parameter("move_trunk_back_time", normal_config_.move_trunk_back_time); - this->get_parameter("choose_foot_corridor_width", normal_config_.choose_foot_corridor_width); - this->get_parameter("stabilizing_point_x", normal_config_.stabilizing_point_x); - this->get_parameter("stabilizing_point_y", normal_config_.stabilizing_point_y); - - unstable_config_ = KickParams(); - this->get_parameter("unstable.foot_rise", unstable_config_.foot_rise); - this->get_parameter("unstable.foot_distance", unstable_config_.foot_distance); - this->get_parameter("unstable.kick_windup_distance", unstable_config_.kick_windup_distance); - this->get_parameter("unstable.trunk_height", unstable_config_.trunk_height); - this->get_parameter("unstable.trunk_roll", unstable_config_.trunk_roll); - this->get_parameter("unstable.trunk_pitch", unstable_config_.trunk_pitch); - this->get_parameter("unstable.trunk_yaw", unstable_config_.trunk_yaw); - this->get_parameter("unstable.move_trunk_time", unstable_config_.move_trunk_time); - this->get_parameter("unstable.raise_foot_time", unstable_config_.raise_foot_time); - this->get_parameter("unstable.move_to_ball_time", unstable_config_.move_to_ball_time); - this->get_parameter("unstable.kick_time", unstable_config_.kick_time); - this->get_parameter("unstable.move_back_time", unstable_config_.move_back_time); - this->get_parameter("unstable.lower_foot_time", unstable_config_.lower_foot_time); - this->get_parameter("unstable.move_trunk_back_time", unstable_config_.move_trunk_back_time); - this->get_parameter("unstable.choose_foot_corridor_width", unstable_config_.choose_foot_corridor_width); - this->get_parameter("unstable.stabilizing_point_x", unstable_config_.stabilizing_point_x); - this->get_parameter("unstable.stabilizing_point_y", unstable_config_.stabilizing_point_y); - - /* load MoveIt! model */ - robot_model_loader_ = - std::make_shared(SharedPtr(this), "robot_description", true); - moveit::core::RobotModelPtr kinematic_model = robot_model_loader_->getModel(); - if (!kinematic_model) { - RCLCPP_FATAL(this->get_logger(), "No robot model loaded, killing dynamic kick."); - exit(1); - } - stabilizer_.setRobotModel(kinematic_model); - ik_.init(kinematic_model); - - /* this debug variable represents the goal state of the robot, i.e. what the ik goals are */ - goal_state_.reset(new moveit::core::RobotState(kinematic_model)); - /* this variable represents the current state of the robot, retrieved from joint states */ - current_state_.reset(new moveit::core::RobotState(kinematic_model)); - engine_.setRobotState(current_state_); - - joint_goal_publisher_ = this->create_publisher("kick_motor_goals", 1); - support_foot_publisher_ = this->create_publisher("dynamic_kick_support_state", 1); - - cop_l_subscriber_ = this->create_subscription( - "cop_l", 1, std::bind(&KickNode::copLCallback, this, std::placeholders::_1)); - cop_r_subscriber_ = this->create_subscription( - "cop_r", 1, std::bind(&KickNode::copRCallback, this, std::placeholders::_1)); - joint_state_subscriber_ = this->create_subscription( - "joint_states", 1, std::bind(&KickNode::jointStateCallback, this, std::placeholders::_1)); - server_ = rclcpp_action::create_server( - this, "dynamic_kick", std::bind(&KickNode::goalCb, this, std::placeholders::_1, std::placeholders::_2), - std::bind(&KickNode::cancelCb, this, std::placeholders::_1), - std::bind(&KickNode::acceptedCb, this, std::placeholders::_1)); - - callback_handle_ = - this->add_on_set_parameters_callback(std::bind(&KickNode::onSetParameters, this, std::placeholders::_1)); - - RCLCPP_INFO(this->get_logger(), "Initialized Kick and waiting for actions"); - rclcpp::spin(SharedPtr(this)); -} - -void KickNode::copLCallback(const geometry_msgs::msg::PointStamped::SharedPtr cop) { - if (cop->header.frame_id != l_sole_frame_) { - RCLCPP_ERROR_STREAM(this->get_logger(), "cop_l not in " << l_sole_frame_ << " frame! Stabilizing will not work."); - } - stabilizer_.cop_left = cop->point; -} - -void KickNode::copRCallback(const geometry_msgs::msg::PointStamped::SharedPtr cop) { - if (cop->header.frame_id != r_sole_frame_) { - RCLCPP_ERROR_STREAM(this->get_logger(), "cop_r not in " << r_sole_frame_ << " frame! Stabilizing will not work."); - } - stabilizer_.cop_right = cop->point; -} - -void KickNode::jointStateCallback(const sensor_msgs::msg::JointState::SharedPtr joint_states) { - for (size_t i = 0; i < joint_states->name.size(); ++i) { - current_state_->setJointPositions(joint_states->name[i], &joint_states->position[i]); - } -} - -rcl_interfaces::msg::SetParametersResult KickNode::onSetParameters(const std::vector& parameters) { - for (const auto& parameter : parameters) { - if (parameter.get_name() == "engine_rate") { - engine_rate_ = parameter.as_int(); - } else if (parameter.get_name() == "foot_rise") { - normal_config_.foot_rise = parameter.as_double(); - } else if (parameter.get_name() == "foot_distance") { - normal_config_.foot_distance = parameter.as_double(); - } else if (parameter.get_name() == "kick_windup_distance") { - normal_config_.kick_windup_distance = parameter.as_double(); - } else if (parameter.get_name() == "trunk_height") { - normal_config_.trunk_height = parameter.as_double(); - } else if (parameter.get_name() == "trunk_roll") { - normal_config_.trunk_roll = parameter.as_double(); - } else if (parameter.get_name() == "trunk_pitch") { - normal_config_.trunk_pitch = parameter.as_double(); - } else if (parameter.get_name() == "trunk_yaw") { - normal_config_.trunk_yaw = parameter.as_double(); - } else if (parameter.get_name() == "move_trunk_time") { - normal_config_.move_trunk_time = parameter.as_double(); - } else if (parameter.get_name() == "raise_foot_time") { - normal_config_.raise_foot_time = parameter.as_double(); - } else if (parameter.get_name() == "move_to_ball_time") { - normal_config_.move_to_ball_time = parameter.as_double(); - } else if (parameter.get_name() == "kick_time") { - normal_config_.kick_time = parameter.as_double(); - } else if (parameter.get_name() == "move_back_time") { - normal_config_.move_back_time = parameter.as_double(); - } else if (parameter.get_name() == "move_trunk_back_time") { - normal_config_.move_trunk_back_time = parameter.as_double(); - } else if (parameter.get_name() == "stabilizing_point_x") { - normal_config_.stabilizing_point_x = parameter.as_double(); - } else if (parameter.get_name() == "stabilizing_point_y") { - normal_config_.stabilizing_point_y = parameter.as_double(); - } else if (parameter.get_name() == "choose_foot_corridor_width") { - normal_config_.choose_foot_corridor_width = parameter.as_double(); - } else if (parameter.get_name() == "use_center_of_pressure") { - stabilizer_.useCop(parameter.as_bool()); - } else if (parameter.get_name() == "spline_smoothness") { - VisualizationParams viz_params = VisualizationParams(); - viz_params.spline_smoothness = parameter.as_int(); - visualizer_.setParams(viz_params); - } else { - RCLCPP_WARN(this->get_logger(), "Unknown parameter: %s", parameter.get_name().c_str()); - } - } - - rcl_interfaces::msg::SetParametersResult result; - result.successful = true; - return result; -} - -bool KickNode::init(const bitbots_msgs::action::Kick::Goal& goal_msg, std::string& error_string) { - /* currently, the ball must always be in the base_footprint frame */ - if (goal_msg.header.frame_id != base_footprint_frame_) { - RCLCPP_ERROR_STREAM(this->get_logger(), "Goal should be in " << base_footprint_frame_ << " frame"); - error_string = std::string("Goal should be in ") + base_footprint_frame_ + std::string(" frame"); - return false; - } - - if (goal_msg.unstable) { - engine_.setParams(unstable_config_); - } else { - engine_.setParams(normal_config_); - } - - /* reset the current state */ - last_ros_update_time_ = 0; - was_support_foot_published_ = false; - engine_.reset(); - stabilizer_.reset(); - ik_.reset(); - - /* get trunk to base footprint transform, assume left and right foot are next to each other (same x and z) */ - Eigen::Isometry3d trunk_to_l_sole = current_state_->getGlobalLinkTransform("l_sole"); - Eigen::Isometry3d trunk_to_r_sole = current_state_->getGlobalLinkTransform("r_sole"); - Eigen::Isometry3d trunk_to_base_footprint = trunk_to_l_sole; - trunk_to_base_footprint.translation().y() = - (trunk_to_r_sole.translation().y() + trunk_to_l_sole.translation().y()) / 2.0; - - /* Set engines goal_msg and start calculating */ - KickGoals goals; - goals.ball_position = {goal_msg.ball_position.x, goal_msg.ball_position.y, goal_msg.ball_position.z}; - goals.kick_direction = {goal_msg.kick_direction.w, goal_msg.kick_direction.x, goal_msg.kick_direction.y, - goal_msg.kick_direction.z}; - goals.kick_speed = goal_msg.kick_speed; - goals.trunk_to_base_footprint = trunk_to_base_footprint; - engine_.setGoals(goals); - - /* visualization */ - visualizer_.displayReceivedGoal(goal_msg); - visualizer_.displayWindupPoint(engine_.getWindupPoint(), (engine_.isLeftKick()) ? r_sole_frame_ : l_sole_frame_); - visualizer_.displayFlyingSplines(engine_.getFlyingSplines(), (engine_.isLeftKick()) ? r_sole_frame_ : l_sole_frame_); - visualizer_.displayTrunkSplines(engine_.getTrunkSplines(), (engine_.isLeftKick() ? r_sole_frame_ : l_sole_frame_)); - - return true; -} - -rclcpp_action::CancelResponse KickNode::cancelCb( - std::shared_ptr> goal) { - RCLCPP_INFO(this->get_logger(), "Received request to cancel goal"); - (void)goal; - return rclcpp_action::CancelResponse::ACCEPT; -} - -void KickNode::acceptedCb(const std::shared_ptr goal) { - // Set flag so no other goal can be accepted - currently_kicking_ = true; - // this needs to return quickly to avoid blocking the executor, so spin up a new thread - std::thread{std::bind(&KickNode::executeCb, this, std::placeholders::_1), goal}.detach(); -} - -rclcpp_action::GoalResponse KickNode::goalCb(const rclcpp_action::GoalUUID& uuid, - std::shared_ptr goal) { - RCLCPP_INFO(this->get_logger(), "Received goal request"); - (void)uuid; - if (currently_kicking_) { - RCLCPP_INFO(this->get_logger(), "Already kicking, rejecting new goal"); - return rclcpp_action::GoalResponse::REJECT; - } - return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE; -} - -void KickNode::executeCb(const std::shared_ptr goal_handle) { - // TODO: maybe switch to goal callback to be able to reject goals properly - RCLCPP_INFO(this->get_logger(), "Accepted new goal"); - const auto goal = goal_handle->get_goal(); - /* get transform to base_footprint */ - geometry_msgs::msg::TransformStamped goal_frame_to_base_footprint = - tf_buffer_->lookupTransform(base_footprint_frame_, goal->header.frame_id, rclcpp::Time(0)); - geometry_msgs::msg::Point base_footprint_ball_position; - tf2::doTransform(goal->ball_position, base_footprint_ball_position, goal_frame_to_base_footprint); - bitbots_msgs::action::Kick::Goal base_footprint_kick_goal = *goal; - base_footprint_kick_goal.ball_position = base_footprint_ball_position; - base_footprint_kick_goal.header.frame_id = base_footprint_frame_; - - /* pass everything to the init function */ - std::string error_string; - bool success = init(base_footprint_kick_goal, error_string); - /* there was an error, abort the kick */ - if (!success) { - bitbots_msgs::action::Kick::Result::SharedPtr result = std::make_shared(); - result->result = bitbots_msgs::action::Kick::Result::REJECTED; - goal_handle->abort(result); - } - - /* everything is set up, start calculating now until the kick is finished or an error occurs */ - loopEngine(goal_handle); - - /* Figure out the reason why loopEngine() returned and act accordingly */ - if (goal_handle->is_canceling()) { - /* Confirm that we canceled the previous goal */ - RCLCPP_INFO(this->get_logger(), "Cancelled old goal"); - auto result = std::make_shared(); - result->result = bitbots_msgs::action::Kick::Result::ABORTED; - goal_handle->abort(result); - } else { - /* Publish results */ - RCLCPP_INFO(this->get_logger(), "Done kicking ball"); - auto result = std::make_shared(); - result->result = bitbots_msgs::action::Kick::Result::SUCCESS; - goal_handle->succeed(result); - } - // Reset flag so new goals can be accepted - currently_kicking_ = false; -} - -void KickNode::loopEngine( - const std::shared_ptr> goal_handle) { - // Store the time of the last execution - auto last_time = this->get_clock()->now(); - auto next_execution_time{last_time}; - - // Loop to perform the kick trajectory - while (rclcpp::ok()) { - // Store time of this step - auto step_time = this->get_clock()->now(); - - // Check if enough time has passed to execute the next step - if (step_time >= next_execution_time) { - // Determine the next execution time - next_execution_time = step_time + rclcpp::Duration::from_seconds(1.0 / engine_rate_); - - // Get the time since the last execution - auto dt = step_time - last_time; - - // Calculate the kick joint goals - std::optional motor_goals = kickStep(dt.seconds()); - - // Publish feedback to the client - auto feedback = std::make_shared(); - feedback->percent_done = engine_.getPercentDone(); - feedback->chosen_foot = engine_.isLeftKick() ? bitbots_msgs::action::Kick::Feedback::FOOT_LEFT - : bitbots_msgs::action::Kick::Feedback::FOOT_RIGHT; - goal_handle->publish_feedback(feedback); - - // Send the joint goals to the robot - joint_goal_publisher_->publish(getJointCommand(motor_goals.value())); - - // Break if the kick is finished - if (feedback->percent_done >= 100) { - break; - } - - // Store the time of this execution - last_time = step_time; - - } else { - // Sleep one millisecond to avoid busy waiting - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } - } -} - -bitbots_splines::JointGoals KickNode::kickStep(double dt) { - KickPositions positions = engine_.update(dt); - // TODO: should positions be an std::optional? how are errors represented? - KickPositions stabilized_positions = stabilizer_.stabilize(positions, rclcpp::Duration::from_nanoseconds(1e9 * dt)); - bitbots_splines::JointGoals motor_goals = ik_.calculate(stabilized_positions); - - /* visualization of the values calculated above */ - for (size_t i = 0; i < motor_goals.first.size(); ++i) { - goal_state_->setJointPositions(motor_goals.first[i], &motor_goals.second[i]); - } - visualizer_.publishGoals(positions, stabilized_positions, goal_state_, engine_.getPhase()); - publishSupportFoot(engine_.isLeftKick()); - - return motor_goals; -} - -bitbots_msgs::msg::JointCommand KickNode::getJointCommand(const bitbots_splines::JointGoals& goals) { - /* Construct JointCommand message */ - bitbots_msgs::msg::JointCommand command; - command.header.stamp = this->get_clock()->now(); - - /* - * Since our JointGoals type is a vector of strings - * combined with a vector of numbers (motor name -> target position) - * and bitbots_msgs::msg::JointCommand needs both vectors as well, - * we can just assign them - */ - command.joint_names = goals.first; - command.positions = goals.second; - - /* And because we are setting position goals and not movement goals, these vectors are set to -1.0*/ - std::vector vels(goals.first.size(), -1.0); - std::vector accs(goals.first.size(), -1.0); - std::vector pwms(goals.first.size(), -1.0); - command.velocities = vels; - command.accelerations = accs; - command.max_currents = pwms; - - return command; -} - -void KickNode::publishSupportFoot(bool is_left_kick) { - biped_interfaces::msg::Phase msg; - msg.phase = is_left_kick ? biped_interfaces::msg::Phase::RIGHT_STANCE : biped_interfaces::msg::Phase::LEFT_STANCE; - // only publish one time per kick - if (!was_support_foot_published_) { - support_foot_publisher_->publish(msg); - was_support_foot_published_ = true; - } -} - -bitbots_msgs::msg::JointCommand KickNode::stepWrapper(double dt) { - /* with stabilizing, we can call some callbacks here */ - bitbots_splines::JointGoals goals = kickStep(dt); - if (engine_.getPercentDone() < 100) { - return getJointCommand(goals); - } else { - return bitbots_msgs::msg::JointCommand(); - } -} - -double KickNode::getProgress() { return engine_.getPercentDone() / 100.0; } - -geometry_msgs::msg::Pose KickNode::getTrunkPose() { return engine_.getTrunkPose(); } - -bool KickNode::isLeftKick() { return engine_.isLeftKick(); } - -} // namespace bitbots_dynamic_kick - -int main(int argc, char* argv[]) { - /* Setup ROS node */ - rclcpp::init(argc, argv); - bitbots_dynamic_kick::KickNode node; -} diff --git a/src/bitbots_motion/bitbots_dynamic_kick/src/kick_pywrapper.cpp b/src/bitbots_motion/bitbots_dynamic_kick/src/kick_pywrapper.cpp deleted file mode 100644 index a2f156eefe..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/src/kick_pywrapper.cpp +++ /dev/null @@ -1,122 +0,0 @@ -#include - -/** - * Read a ROS message from a serialized string. - */ -template -M from_python(const std::string& str_msg) { - size_t serial_size = str_msg.size(); - // todo - // boost::shared_array buffer(new uint8_t[serial_size]); - for (size_t i = 0; i < serial_size; ++i) { - buffer[i] = str_msg[i]; - } - ros::serialization::IStream stream(buffer.get(), serial_size); - M msg; - ros::serialization::Serializer::read(stream, msg); - return msg; -} - -/** - * Write a ROS message into a serialized string. - */ -template -std::string to_python(const M& msg) { - size_t serial_size = ros::serialization::serializationLength(msg); - // todo - // boost::shared_array buffer(new uint8_t[serial_size]); - ros::serialization::OStream stream(buffer.get(), serial_size); - ros::serialization::serialize(stream, msg); - std::string str_msg; - str_msg.reserve(serial_size); - for (size_t i = 0; i < serial_size; ++i) { - str_msg.push_back(buffer[i]); - } - return str_msg; -} - -PyKickWrapper::PyKickWrapper(const std::string ns) { - kick_node_ = std::make_shared(ns); -} - -moveit::py_bindings_tools::ByteString PyKickWrapper::step(double dt, const std::string& joint_state_str) { - auto joint_state = from_python(joint_state_str); - kick_node_->jointStateCallback(joint_state); - std::string result = to_python(kick_node_->stepWrapper(dt)); - return moveit::py_bindings_tools::serializeMsg(result); -} -/* -void PyKickWrapper::set_params(const boost::python::object params) { - using namespace boost::python; - - extract cppdict_ext(params); - if (!cppdict_ext.check()) { - throw std::runtime_error("type error: not a python dict"); - } - - dict cppdict = cppdict_ext(); - list keylist = cppdict.keys(); - - bitbots_dynamic_kick::DynamicKickConfig conf; - - int len = boost::python::len(keylist); - - for (int i = 0; i < len; ++i) { - std::string keystr = extract(str(keylist[i])); - std::string valstr = extract(str(cppdict[keylist[i]])); - if (keystr == "engine_rate") { conf.engine_rate = std::stoi(valstr); } - else if (keystr == "foot_rise") { conf.foot_rise = std::stof(valstr); } - else if (keystr == "foot_distance") { conf.foot_distance = std::stof(valstr); } - else if (keystr == "kick_windup_distance") { conf.kick_windup_distance = std::stof(valstr); } - else if (keystr == "trunk_height") { conf.trunk_height = std::stof(valstr); } - else if (keystr == "trunk_roll") { conf.trunk_roll = std::stof(valstr); } - else if (keystr == "trunk_pitch") { conf.trunk_pitch = std::stof(valstr); } - else if (keystr == "trunk_yaw") { conf.trunk_yaw = std::stof(valstr); } - else if (keystr == "move_trunk_time") { conf.move_trunk_time = std::stof(valstr); } - else if (keystr == "raise_foot_time") { conf.raise_foot_time = std::stof(valstr); } - else if (keystr == "move_to_ball_time") { conf.move_to_ball_time = std::stof(valstr); } - else if (keystr == "kick_time") { conf.kick_time = std::stof(valstr); } - else if (keystr == "move_back_time") { conf.move_back_time = std::stof(valstr); } - else if (keystr == "lower_foot_time") { conf.lower_foot_time = std::stof(valstr); } - else if (keystr == "move_trunk_back_time") { conf.move_trunk_back_time = std::stof(valstr); } - else if (keystr == "choose_foot_corridor_width") { conf.choose_foot_corridor_width = std::stof(valstr); } - else if (keystr == "use_center_of_pressure") { conf.use_center_of_pressure = valstr == "True"; } - else if (keystr == "stabilizing_point_x") { conf.stabilizing_point_x = std::stof(valstr); } - else if (keystr == "stabilizing_point_y") { conf.stabilizing_point_y = std::stof(valstr); } - else if (keystr == "spline_smoothness") { conf.spline_smoothness = std::stoi(valstr); } - else { std::cerr << keystr << " not known. WILL BE IGNORED." << std::endl; } - } - - kick_node_->reconfigureCallback(conf, 0xff); -}*/ - -bool PyKickWrapper::set_goal(const std::string& goal_str, const std::string& joint_state_str) { - auto joint_state = from_python(joint_state_str); - kick_node_->jointStateCallback(joint_state); - auto goal = from_python(goal_str); - std::string error_string; - return kick_node_->init(goal, error_string); -} - -double PyKickWrapper::get_progress() { return kick_node_->getProgress(); } - -moveit::py_bindings_tools::ByteString PyKickWrapper::get_trunk_pose() { - std::string trunk_pose_str = to_python(kick_node_->getTrunkPose()); - return moveit::py_bindings_tools::serializeMsg(trunk_pose_str); -} - -bool PyKickWrapper::is_left_kick() { return kick_node_->isLeftKick(); } -/* -BOOST_PYTHON_MODULE (py_dynamic_kick) { - using namespace boost::python; - using namespace bitbots_dynamic_kick; - - class_("PyKickWrapper", init()) - .def("set_goal", &PyKickWrapper::set_goal) - .def("step", &PyKickWrapper::step) - .def("get_progress", &PyKickWrapper::get_progress) - .def("set_params", &PyKickWrapper::set_params) - .def("get_trunk_pose", &PyKickWrapper::get_trunk_pose) - .def("is_left_kick", &PyKickWrapper::is_left_kick); -} -*/ diff --git a/src/bitbots_motion/bitbots_dynamic_kick/src/stabilizer.cpp b/src/bitbots_motion/bitbots_dynamic_kick/src/stabilizer.cpp deleted file mode 100644 index 428dd8bfc8..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/src/stabilizer.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include - -namespace bitbots_dynamic_kick { - -Stabilizer::Stabilizer(std::string ns) { - pitch_node_ = rclcpp::Node::make_shared(ns + "pid_trunk_fused_pitch"); - roll_node_ = rclcpp::Node::make_shared(ns + "pid_trunk_fused_roll"); - pitch_node_->get_logger().set_level(rclcpp::Logger::Level::Warn); - roll_node_->get_logger().set_level(rclcpp::Logger::Level::Warn); - - pitch_node_->declare_parameter("p", 0.0); - pitch_node_->declare_parameter("i", 0.0); - pitch_node_->declare_parameter("d", 0.0); - pitch_node_->declare_parameter("i_clamp_max", 0.0); - pitch_node_->declare_parameter("i_clamp_min", 0.0); - pitch_node_->declare_parameter("antiwindup", false); - roll_node_->declare_parameter("p", 0.0); - roll_node_->declare_parameter("i", 0.0); - roll_node_->declare_parameter("d", 0.0); - roll_node_->declare_parameter("i_clamp_max", 0.0); - roll_node_->declare_parameter("i_clamp_min", 0.0); - roll_node_->declare_parameter("antiwindup", false); - - pid_trunk_fused_pitch_ = std::make_shared(pitch_node_, "", "", false); - pid_trunk_fused_roll_ = std::make_shared(roll_node_, "", "", false); - pid_trunk_fused_pitch_->initialize_from_ros_parameters(); - pid_trunk_fused_roll_->initialize_from_ros_parameters(); - - reset(); -} - -void Stabilizer::reset() { - pid_trunk_fused_pitch_->reset(); - pid_trunk_fused_roll_->reset(); -} - -KickPositions Stabilizer::stabilize(const KickPositions& positions, const rclcpp::Duration& dt) { - KickPositions stabilized_positions = positions; - if (positions.cop_support_point && use_cop_) { - /* calculate stabilizing target from center of pressure - * the cop is in corresponding sole frame - * optimal stabilizing would be centered above sole center */ - double cop_x, cop_y, cop_x_error, cop_y_error; - if (positions.is_left_kick) { - cop_x = cop_right.x; - cop_y = cop_right.y; - } else { - cop_x = cop_left.x; - cop_y = cop_left.y; - } - cop_x_error = cop_x - positions.trunk_pose.translation().x(); - cop_y_error = cop_y - positions.trunk_pose.translation().y(); - - double x_correction = pid_trunk_fused_roll_->compute_command(cop_x_error, dt); - double y_correction = pid_trunk_fused_pitch_->compute_command(cop_y_error, dt); - - stabilized_positions.trunk_pose.translation().x() += x_correction; - stabilized_positions.trunk_pose.translation().y() += y_correction; - } - return stabilized_positions; -} - -void Stabilizer::useCop(bool use) { use_cop_ = use; } - -void Stabilizer::setRobotModel(moveit::core::RobotModelPtr model) { kinematic_model_ = std::move(model); } - -} // namespace bitbots_dynamic_kick diff --git a/src/bitbots_motion/bitbots_dynamic_kick/src/visualizer.cpp b/src/bitbots_motion/bitbots_dynamic_kick/src/visualizer.cpp deleted file mode 100644 index 1e200e2cfe..0000000000 --- a/src/bitbots_motion/bitbots_dynamic_kick/src/visualizer.cpp +++ /dev/null @@ -1,118 +0,0 @@ -#include -#include - -namespace bitbots_dynamic_kick { - -Visualizer::Visualizer(const std::string& base_topic, rclcpp::Node::SharedPtr node) - : node_(node), base_topic_(base_topic) { - /* make sure base_topic_ has consistent scheme */ - if (base_topic.compare(base_topic.size() - 1, 1, "/") != 0) { - base_topic_ += "/"; - } - - /* create necessary publishers */ - goal_publisher_ = node_->create_publisher(base_topic_ + "received_goal", 1); - foot_spline_publisher_ = - node_->create_publisher(base_topic_ + "flying_foot_spline", 5); - trunk_spline_publisher_ = - node_->create_publisher(base_topic_ + "trunk_spline", 5); - windup_publisher_ = node_->create_publisher(base_topic_ + "kick_windup_point", 5); - debug_publisher_ = node_->create_publisher(base_topic_ + "debug", 5); -} - -void Visualizer::setParams(VisualizationParams params) { params_ = params; } - -void Visualizer::displayFlyingSplines(bitbots_splines::PoseSpline splines, const std::string& support_foot_frame) { - if (foot_spline_publisher_->get_subscription_count() == 0) return; - - visualization_msgs::msg::MarkerArray path = getPath(splines, support_foot_frame, params_.spline_smoothness, node_); - path.markers[0].color.g = 1; - - foot_spline_publisher_->publish(path); -} - -void Visualizer::displayTrunkSplines(bitbots_splines::PoseSpline splines, const std::string& support_foot_frame) { - if (trunk_spline_publisher_->get_subscription_count() == 0) return; - - visualization_msgs::msg::MarkerArray path = getPath(splines, support_foot_frame, params_.spline_smoothness, node_); - path.markers[0].color.g = 1; - - trunk_spline_publisher_->publish(path); -} - -void Visualizer::displayReceivedGoal(const bitbots_msgs::action::Kick::Goal& goal) { - if (goal_publisher_->get_subscription_count() == 0) return; - - visualization_msgs::msg::Marker marker = - getMarker({goal.ball_position.x, goal.ball_position.y, goal.ball_position.z}, goal.header.frame_id, node_); - - marker.ns = marker_ns_; - marker.id = MarkerIDs::RECEIVED_GOAL; - marker.type = visualization_msgs::msg::Marker::ARROW; - marker.header.stamp = goal.header.stamp; - marker.pose.orientation = goal.kick_direction; - marker.scale.x = 0.08 + (goal.kick_speed / 3); - marker.color.r = 1; - - goal_publisher_->publish(marker); -} - -void Visualizer::displayWindupPoint(const Eigen::Vector3d& kick_windup_point, const std::string& support_foot_frame) { - if (windup_publisher_->get_subscription_count() == 0) return; - - tf2::Vector3 tf_kick_windup_point; - tf2::convert(kick_windup_point, tf_kick_windup_point); - visualization_msgs::msg::Marker marker = getMarker(tf_kick_windup_point, support_foot_frame, node_); - - marker.ns = marker_ns_; - marker.id = MarkerIDs::RECEIVED_GOAL; - marker.color.g = 1; - - windup_publisher_->publish(marker); -} - -void Visualizer::publishGoals(const KickPositions& positions, const KickPositions& stabilized_positions, - const moveit::core::RobotStatePtr& robot_state, KickPhase engine_phase) { - /* only calculate the debug information if someone is subscribing */ - if (debug_publisher_->get_subscription_count() == 0) { - return; - } - - std::string support_foot_frame, flying_foot_frame; - if (positions.is_left_kick) { - support_foot_frame = "r_sole"; - flying_foot_frame = "l_sole"; - } else { - support_foot_frame = "l_sole"; - flying_foot_frame = "r_sole"; - } - - /* Derive positions from robot state */ - Eigen::Isometry3d trunk_pose_ik_result = robot_state->getGlobalLinkTransform(support_foot_frame).inverse(); - Eigen::Isometry3d flying_foot_pose_ik_result = - trunk_pose_ik_result * robot_state->getGlobalLinkTransform(flying_foot_frame); - - /* Calculate offsets */ - Eigen::Vector3d trunk_position_ik_offset = - trunk_pose_ik_result.translation() - stabilized_positions.trunk_pose.translation(); - Eigen::Vector3d flying_foot_position_ik_offset = - flying_foot_pose_ik_result.translation() - stabilized_positions.flying_foot_pose.translation(); - - bitbots_dynamic_kick::msg::KickDebug msg; - msg.header.stamp = node_->get_clock()->now(); - msg.header.frame_id = support_foot_frame; - msg.engine_phase = engine_phase; - msg.engine_time = positions.engine_time; - msg.trunk_pose_goal = tf2::toMsg(positions.trunk_pose); - msg.trunk_pose_stabilized_goal = tf2::toMsg(stabilized_positions.trunk_pose); - msg.trunk_pose_ik_result = tf2::toMsg(trunk_pose_ik_result); - msg.trunk_position_ik_offset = tf2::toMsg(trunk_position_ik_offset); - msg.flying_foot_pose_goal = tf2::toMsg(positions.flying_foot_pose); - msg.flying_foot_pose_stabilized_goal = tf2::toMsg(stabilized_positions.flying_foot_pose); - msg.flying_foot_pose_ik_result = tf2::toMsg(flying_foot_pose_ik_result); - msg.flying_foot_position_ik_offset = tf2::toMsg(flying_foot_position_ik_offset); - - debug_publisher_->publish(msg); -} - -} // namespace bitbots_dynamic_kick diff --git a/src/bitbots_motion/bitbots_dynup/CMakeLists.txt b/src/bitbots_motion/bitbots_dynup/CMakeLists.txt deleted file mode 100644 index 863b2d722c..0000000000 --- a/src/bitbots_motion/bitbots_dynup/CMakeLists.txt +++ /dev/null @@ -1,149 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project(bitbots_dynup) - -# Add support for C++20 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 20) -endif() - -# Include CheckIPOSupported module -include(CheckIPOSupported) - -# Check if IPO is supported -check_ipo_supported(RESULT ipo_supported) -if(ipo_supported) - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) - # Set the number of parallel LTO jobs - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=4") -endif() - -# Build with release optimizations and debug symbols by default -if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebug) -endif() - -set(PYBIND11_PYTHON_VERSION 3) -set(PYBIND11_FINDPYTHON ON) - -find_package(ament_cmake REQUIRED) -find_package(backward_ros REQUIRED) -find_package(bio_ik REQUIRED) -find_package(bitbots_msgs REQUIRED) -find_package(bitbots_splines REQUIRED) -find_package(bitbots_utils REQUIRED) -find_package(control_toolbox REQUIRED) -find_package(Eigen3 REQUIRED) -find_package(generate_parameter_library REQUIRED) -find_package(geometry_msgs REQUIRED) -find_package(moveit_ros_planning_interface REQUIRED) -find_package(rclcpp REQUIRED) -find_package(rosidl_default_generators REQUIRED) -find_package(rot_conv REQUIRED) -find_package(sensor_msgs REQUIRED) -find_package(std_msgs REQUIRED) -find_package(tf2 REQUIRED) -find_package(tf2_eigen REQUIRED) -find_package(tf2_geometry_msgs REQUIRED) -find_package(tf2_ros REQUIRED) - -find_package(pybind11 REQUIRED) -find_package(Python3 REQUIRED COMPONENTS Interpreter Development) - -find_package(ros2_python_extension REQUIRED) - -generate_parameter_library(dynup_parameters config/dynup_config.yaml) - -rosidl_generate_interfaces( - ${PROJECT_NAME} - "msg/DynupEngineDebug.msg" - "msg/DynupPoses.msg" - "msg/DynupIkOffset.msg" - DEPENDENCIES - std_msgs - geometry_msgs) - -include_directories(include ${PYTHON_INCLUDE_DIRS}) - -add_compile_options(-Wall -Werror -Wno-unused -fPIC) - -set(SOURCES - src/dynup_engine.cpp - src/dynup_ik.cpp - src/dynup_node.cpp - src/dynup_pywrapper.cpp - src/dynup_stabilizer.cpp - src/visualizer.cpp - src/dynup_utils.cpp) - -add_executable(DynupNode ${SOURCES}) - -ament_target_dependencies( - DynupNode - ament_cmake - bio_ik - bitbots_msgs - bitbots_splines - bitbots_utils - control_toolbox - generate_parameter_library - geometry_msgs - moveit_ros_planning_interface - rclcpp - ros2_python_extension - rot_conv - sensor_msgs - std_msgs - tf2 - tf2_eigen - tf2_geometry_msgs - tf2_ros - Eigen3) - -rosidl_get_typesupport_target(cpp_typesupport_target ${PROJECT_NAME} - "rosidl_typesupport_cpp") - -target_link_libraries(DynupNode "${cpp_typesupport_target}" rclcpp::rclcpp - dynup_parameters) -# create the lib -pybind11_add_module(libpy_dynup SHARED src/dynup_pywrapper.cpp ${SOURCES}) -ament_target_dependencies( - libpy_dynup - PUBLIC - ament_cmake - bio_ik - bitbots_msgs - bitbots_splines - bitbots_utils - control_toolbox - geometry_msgs - moveit_ros_planning_interface - rclcpp - ros2_python_extension - rot_conv - sensor_msgs - std_msgs - tf2 - tf2_eigen - tf2_geometry_msgs - tf2_ros) - -target_link_libraries(libpy_dynup PRIVATE "${cpp_typesupport_target}" - dynup_parameters) - -ament_python_install_package(bitbots_dynup_py) - -install(TARGETS libpy_dynup - DESTINATION "${PYTHON_INSTALL_DIR}/bitbots_dynup_py") - -enable_bitbots_docs() - -install(TARGETS DynupNode DESTINATION lib/${PROJECT_NAME}) - -install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) - -install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) - -install(DIRECTORY scripts USE_SOURCE_PERMISSIONS - DESTINATION lib/${PROJECT_NAME}) - -ament_package() diff --git a/src/bitbots_motion/bitbots_dynup/README.md b/src/bitbots_motion/bitbots_dynup/README.md deleted file mode 100644 index 8ae4e64254..0000000000 --- a/src/bitbots_motion/bitbots_dynup/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Bit-Bots Dynup -============== - -This is the dynamic stand up package. -It generates stand-up motion from the front and back, as well as rising from and descending into a squat position. -Full documentation can be found [on our website](http://doku.bit-bots.de/package/bitbots_dynup/latest/). diff --git a/src/bitbots_motion/bitbots_dynup/bitbots_dynup_py/__init__.py b/src/bitbots_motion/bitbots_dynup/bitbots_dynup_py/__init__.py deleted file mode 100644 index 9e90f680a3..0000000000 --- a/src/bitbots_motion/bitbots_dynup/bitbots_dynup_py/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# from bitbots_dynup.py_dynup_wrapper import PyDynup diff --git a/src/bitbots_motion/bitbots_dynup/bitbots_dynup_py/py_dynup_wrapper.py b/src/bitbots_motion/bitbots_dynup/bitbots_dynup_py/py_dynup_wrapper.py deleted file mode 100644 index 0a8ae72c71..0000000000 --- a/src/bitbots_motion/bitbots_dynup/bitbots_dynup_py/py_dynup_wrapper.py +++ /dev/null @@ -1,77 +0,0 @@ -from io import BytesIO - -from geometry_msgs.msg import PoseArray - -from bitbots_dynup.msg import DynupPoses -from bitbots_dynup.py_dynup import PyDynupWrapper, spin_once -from bitbots_msgs.msg import JointCommand - - -class PyDynup: - def __init__(self, namespace=""): - if namespace != "" and namespace[-1] != "/": - namespace = namespace + "/" - self.py_dynup_wrapper = PyDynupWrapper(namespace) - - def spin_once(self): - spin_once() - - def _to_cpp(self, msg): - """Return a serialized string from a ROS message - - Parameters - ---------- - - msg: a ROS message instance. - """ - buf = BytesIO() - msg.serialize(buf) - value = buf.getvalue() - return value - - def _from_cpp(self, str_msg, cls): - """Return a ROS message from a serialized string - - Parameters - ---------- - - str_msg: str, serialized message - - cls: ROS message class, e.g. sensor_msgs.msg.LaserScan. - """ - msg = cls() - result = msg.deserialize(str_msg) - return result - - def reset(self): - self.py_dynup_wrapper.reset() - - def special_reset(self, time: float): - self.py_dynup_wrapper.special_reset(time) - - def set_engine_goal(self, direction): - self.py_dynup_wrapper.set_engine_goal(direction) - - def step(self, dt: float, imu_msg, joint_state_msg): - if dt == 0.0: - dt = 0.001 - step = self.py_dynup_wrapper.step(dt, self._to_cpp(imu_msg), self._to_cpp(joint_state_msg)) - result = self._from_cpp(step, JointCommand) - return result - - def step_open_loop(self, dt: float): - if dt == 0.0: - dt = 0.001 - stepi = self.py_dynup_wrapper.step_open_loop(dt) - - result = self._from_cpp(stepi, PoseArray) - return result - - def get_poses(self): - poses = self.py_dynup_wrapper.get_poses() - result = self._from_cpp(poses, DynupPoses) - return result - - def set_node_dyn_reconf(self, param_dict): - self.get_logger().error("python params", param_dict) - self.py_dynup_wrapper.set_node_dyn_reconf(param_dict) - - def get_direction(self): - return self.py_dynup_wrapper.get_direction() diff --git a/src/bitbots_motion/bitbots_dynup/config/dynup_config.yaml b/src/bitbots_motion/bitbots_dynup/config/dynup_config.yaml deleted file mode 100644 index aeef4f8a29..0000000000 --- a/src/bitbots_motion/bitbots_dynup/config/dynup_config.yaml +++ /dev/null @@ -1,366 +0,0 @@ -bitbots_dynup: - engine: - engine_rate: - type: int - description: "Rate at which the engine is looped" - default_value: 240 - - end_pose: - arm_extended_length: - type: double - description: "Length of the arm when extended at the end pose. Depends on walkready of walking." - default_value: 0.4 - validation: - bounds<>: [0.0, 5.0] - foot_distance: - type: double - description: "End pose foot distance from one foot to the other. Depends on walkready of walking." - default_value: 0.2 - validation: - bounds<>: [0.0, 5.0] - hand_walkready_pitch: - type: double - description: "End pose hand pitch. Depends on walkready of walking." - default_value: 8.0 - validation: - bounds<>: [0.0, 90.0] - hand_walkready_height: - type: double - description: "End pose hand height. Depends on walkready of walking." - default_value: -0.29 - validation: - bounds<>: [-1.0, 1.0] - trunk_height: - type: double - description: "End pose trunk height. Depends on walkready of walking." - default_value: 0.38 - validation: - bounds<>: [0.0, 1.0] - trunk_pitch: - type: double - description: "End pose trunk pitch. Depends on walkready of walking." - default_value: 0.2 - validation: - bounds<>: [0.0, 1.0] - trunk_x_final: - type: double - description: "End pose position of the trunk in x direction. Depends on walkready of walking." - default_value: 0.001 - validation: - bounds<>: [0.0, 1.0] - arm_side_offset_back: - type: double - description: "End pose arm side offset back. Depends on walkready of walking." - default_value: 0.148 - validation: - bounds<>: [0.0, 5.0] - - dynup_back: - arms_angle_back: - type: double - description: "When fallen to the back: angle of the arms" - default_value: 120.36 - validation: - bounds<>: [0.0, 180.0] - com_shift_1: - type: double - description: "When fallen to the back: shift of the center of mass" - default_value: 0.051 - validation: - bounds<>: [0.0, 1.0] - com_shift_2: - type: double - description: "When fallen to the back: shift of the center of mass" - default_value: 0.0 - validation: - bounds<>: [0.0, 1.0] - foot_angle: - type: double - description: "When fallen to the back: angle of the foot" - default_value: 51.76 - validation: - bounds<>: [0.0, 90.0] - hands_behind_back_x: - type: double - description: "When fallen to the back: hands behind back x" - default_value: 0.162 - validation: - bounds<>: [0.0, 1.0] - hands_behind_back_z: - type: double - description: "When fallen to the back: hands behind back z" - default_value: 0.183 - validation: - bounds<>: [0.0, 1.0] - leg_min_length_back: - type: double - description: "When fallen to the back: minimum length of the leg" - default_value: 0.253 - validation: - bounds<>: [0.0, 1.0] - time_foot_ground_back: - type: double - description: "When fallen to the back: time the foot is on the ground" - default_value: 0.536 - validation: - bounds<>: [0.0, 1.0] - time_full_squat_hands: - type: double - description: "When fallen to the back: time the hands are in full squat" - default_value: 0.172 - validation: - bounds<>: [0.0, 1.0] - time_full_squat_legs: - type: double - description: "When fallen to the back: time the legs are in full squat" - default_value: 0.196 - validation: - bounds<>: [0.0, 1.0] - time_legs_close: - type: double - description: "When fallen to the back: time the legs are close" - default_value: 0.068 - validation: - bounds<>: [0.0, 1.0] - trunk_height_back: - type: double - description: "When fallen to the back: trunk height" - default_value: 0.179 - validation: - bounds<>: [0.179, 1.0] - trunk_overshoot_angle_back: - type: double - description: "When fallen to the back: the angle the trunk overshoots" - default_value: 5.95 - validation: - bounds<>: [0.0, 10.0] - wait_in_squat_back: - type: double - description: "When fallen to the back: time to wait in squat position in seconds" - default_value: 1.0 - validation: - bounds<>: [0.0, 10.0] - - dynup_front: - arm_side_offset_front: - type: double - description: "When fallen to the front: offset of the arms to the side" - default_value: 0.13 - validation: - bounds<>: [0.0, 1.0] - hands_pitch: - type: double - description: "When fallen to the front: pitch of the hands" - default_value: -65.86 - validation: - bounds<>: [-90.0, 90.0] - leg_min_length_front: - type: double - description: "When fallen to the front: minimum length of the leg" - default_value: 0.244 - validation: - bounds<>: [0.0, 1.0] - max_leg_angle: - type: double - description: "When fallen to the front: maximum angle of the leg" - default_value: 71.71 - validation: - bounds<>: [0.0, 90.0] - time_foot_close: - type: double - description: "When fallen to the front: time the foot is close" - default_value: 0.0 - validation: - bounds<>: [0.0, 1.0] - time_foot_ground_front: - type: double - description: "When fallen to the front: time the foot is on the ground" - default_value: 0.132 - validation: - bounds<>: [0.0, 1.0] - time_hands_front: - type: double - description: "When fallen to the front: time the hands are in front" - default_value: 0.3 - validation: - bounds<>: [0.0, 1.0] - time_hands_rotate: - type: double - description: "When fallen to the front: time the hands rotate" - default_value: 0.3 - validation: - bounds<>: [0.0, 1.0] - time_hands_side: - type: double - description: "When fallen to the front: time the hands are to the side" - default_value: 0.3 - validation: - bounds<>: [0.0, 1.0] - time_to_squat: - type: double - description: "When fallen to the front: time to squat" - default_value: 0.924 - validation: - bounds<>: [0.0, 1.0] - time_torso_45: - type: double - description: "When fallen to the front: time the torso is at 45 degrees" - default_value: 0.462 - validation: - bounds<>: [0.0, 1.0] - trunk_overshoot_angle_front: - type: double - description: "When fallen to the front: the angle the trunk overshoots" - default_value: -5.0 - validation: - bounds<>: [-90.0, 90.0] - trunk_x_front: - type: double - description: "When fallen to the front: trunk x position" - default_value: 0.091 - validation: - bounds<>: [0.0, 0.091] - wait_in_squat_front: - type: double - description: "When fallen to the front: time to wait in squat position in seconds" - default_value: 1.2 - validation: - bounds<>: [0.0, 10.0] - - rise: - rise_time: - type: double - description: "Time to rise in seconds" - default_value: 2.0 - validation: - bounds<>: [0.0, 10.0] - - descend: - descend_time: - type: double - description: "Time to descend in seconds" - default_value: 1.5 - validation: - bounds<>: [0.0, 5.0] - - walkready: - travel_time: - type: double - description: "Time to walkready in seconds" - default_value: 5.0 - validation: - bounds<>: [0.0, 10.0] - - stabilizer: - end_pause: - active: - type: bool - description: "Stand still until the robot is stable again after standing up" - default_value: false - stable_threshold: - type: double - description: "Angular threshold for the robot to be considered stable" - default_value: 0.05 - validation: - bounds<>: [0.0, 1.0] - duration: - type: int - description: "Number of cycles the robot has to be stable to be considered stable" - default_value: 100 - validation: - bounds<>: [0, 1000] - timeout: - type: double - description: "Timeout after which the robot is considered considered stable even if it is not" - default_value: 2.0 - validation: - bounds<>: [0.0, 10.0] - trunk_pid: - pitch: - p: - type: double - description: "Proportional gain for the trunk pitch PID controller" - default_value: 0.0 - i: - type: double - description: "Integral gain for the trunk pitch PID controller" - default_value: 0.0 - d: - type: double - description: "Derivative gain for the trunk pitch PID controller" - default_value: 0.0 - i_clamp_max: - type: double - description: "Integral clamp maximum for the trunk pitch PID controller" - default_value: 0.0 - i_clamp_min: - type: double - description: "Integral clamp minimum for the trunk pitch PID controller" - default_value: 0.0 - antiwindup: - type: bool - description: "Activate antiwindup for the trunk pitch PID controller" - default_value: false - roll: - p: - type: double - description: "Proportional gain for the trunk roll PID controller" - default_value: 0.0 - i: - type: double - description: "Integral gain for the trunk roll PID controller" - default_value: 0.0 - d: - type: double - description: "Derivative gain for the trunk roll PID controller" - default_value: 0.0 - i_clamp_max: - type: double - description: "Integral clamp maximum for the trunk roll PID controller" - default_value: 0.0 - i_clamp_min: - type: double - description: "Integral clamp minimum for the trunk roll PID controller" - default_value: 0.0 - antiwindup: - type: bool - description: "Activate antiwindup for the trunk roll PID controller" - default_value: false - - visualizer: - spline_smoothness: - type: int - description: "" - default_value: 100 - display_debug: - type: bool - description: "" - default_value: true - - node: - tf: - base_link_frame: - type: string - description: "The robots base link frame name" - read_only: true - default_value: "base_link" - r_sole_frame: - type: string - description: "The robot right sole frame name" - read_only: true - default_value: "r_sole" - l_sole_frame: - type: string - description: "The robot left sole frame name" - read_only: true - default_value: "l_sole" - r_wrist_frame: - type: string - description: "The robot right wrist frame name" - read_only: true - default_value: "r_wrist" - l_wrist_frame: - type: string - description: "The robot left wrist frame name" - read_only: true - default_value: "l_wrist" diff --git a/src/bitbots_motion/bitbots_dynup/config/dynup_optimization.yaml b/src/bitbots_motion/bitbots_dynup/config/dynup_optimization.yaml deleted file mode 100644 index a609d96fa5..0000000000 --- a/src/bitbots_motion/bitbots_dynup/config/dynup_optimization.yaml +++ /dev/null @@ -1,22 +0,0 @@ -dynup: - ros__parameters: - # necessary to provide - engine_rate: 240 - stabilizer: - end_pause: - timeout: 10 - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: True - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: True diff --git a/src/bitbots_motion/bitbots_dynup/config/dynup_sim.yaml b/src/bitbots_motion/bitbots_dynup/config/dynup_sim.yaml deleted file mode 100644 index aef9cb53ea..0000000000 --- a/src/bitbots_motion/bitbots_dynup/config/dynup_sim.yaml +++ /dev/null @@ -1,53 +0,0 @@ -dynup: - ros__parameters: - engine: - end_pose: - arm_extended_length: 0.3 - trunk_height: 0.4 - trunk_pitch: 0.13 - trunk_x_final: 0.0 - - dynup_back: - arms_angle_back: 113.75 - arm_side_offset_back: 0.148 - com_shift_1: 0.1 - com_shift_2: 0.066 - foot_angle: 67.97 - time_full_squat_legs: 0.236 - - dynup_front: - hands_pitch: -46.7 - leg_min_length_front: 0.298 - max_leg_angle: 77.64 - time_foot_ground_front: 0.032 - time_hands_rotate: 0.352 - time_hands_side: 0.1 - time_to_squat: 0.736 - time_torso_45: 0.256 - trunk_overshoot_angle_front: -6.16 - trunk_x_front: 0.035 - wait_in_squat_front: 0.032 - - rise: - rise_time: 2.0 - - stabilizer: - end_pause: - active: True - duration: 0 - timeout: 1.5 - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: True - roll: - p: -0.3 - i: 0.0 - d: -0.005 - i_clamp_min: -0.25 - i_clamp_max: 0.25 - antiwindup: True diff --git a/src/bitbots_motion/bitbots_dynup/config/dynup_sim_darwin.yaml b/src/bitbots_motion/bitbots_dynup/config/dynup_sim_darwin.yaml deleted file mode 100644 index 64131798d7..0000000000 --- a/src/bitbots_motion/bitbots_dynup/config/dynup_sim_darwin.yaml +++ /dev/null @@ -1,68 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -dynup: - ros__parameters: - engine: - engine_rate: 240 - end_pose: - trunk_height: 0.4 - trunk_pitch: 0 - foot_distance: 0.2 - trunk_x_final: -0.025 - hand_walkready_pitch: -60 - dynup_back: - leg_min_length_back: 0.22 - hands_behind_back_x: 0.1 - hands_behind_back_z: 0.1 - trunk_height_back: 0.22 - com_shift_1: 0.15 - com_shift_2: 0.05 - foot_angle: 80 - arms_angle_back: 135 - trunk_overshoot_angle_back: 25 - time_legs_close: 0.5 - time_foot_ground_back: 0.5 - time_full_squat_hands: 0.5 - time_full_squat_legs: 0.5 - wait_in_squat_back: 1 - dynup_front: - arm_side_offset: 0.12 - leg_min_length_front: 0.25 - trunk_x_front: 0.0 - max_leg_angle: 70 - trunk_overshoot_angle_front: 10 - hands_pitch: -30 - time_hands_side: 1 - time_hands_rotate: 1 - time_foot_close: 1 - time_hands_front: 1 - time_foot_ground_front: 1 # do at same time as time_hands_front - time_torso_45: 1 - time_to_squat: 1 - wait_in_squat_front: 1 - rise: - rise_time: 1 - descend: - descend_time: 0.25 - stabilizer: - end_pause: - active: False - trunk_pid: - pitch: - p: -0.42 - i: -5.31646 - d: -0.008295 - i_clamp_min: 0 - i_clamp_max: 0 - antiwindup: True - roll: - p: 0.36 - i: 0.8674 - d: 0.03735 - i_clamp_min: 0 - i_clamp_max: 0 - antiwindup: True - visualizer: - spline_smoothness: 100 - display_debug: True diff --git a/src/bitbots_motion/bitbots_dynup/docs/_static/flowchart.png b/src/bitbots_motion/bitbots_dynup/docs/_static/flowchart.png deleted file mode 100644 index 0c496a1049..0000000000 Binary files a/src/bitbots_motion/bitbots_dynup/docs/_static/flowchart.png and /dev/null differ diff --git a/src/bitbots_motion/bitbots_dynup/docs/_static/logo.png b/src/bitbots_motion/bitbots_dynup/docs/_static/logo.png deleted file mode 100644 index f8afdd5d06..0000000000 Binary files a/src/bitbots_motion/bitbots_dynup/docs/_static/logo.png and /dev/null differ diff --git a/src/bitbots_motion/bitbots_dynup/docs/conf.py b/src/bitbots_motion/bitbots_dynup/docs/conf.py deleted file mode 100644 index 0b6342a9ce..0000000000 --- a/src/bitbots_motion/bitbots_dynup/docs/conf.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Full list of options at http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import catkin_pkg.package -from exhale import utils - -package_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -catkin_package = catkin_pkg.package.parse_package( - os.path.join(package_dir, catkin_pkg.package.PACKAGE_MANIFEST_FILENAME) -) -sys.path.insert(0, os.path.abspath(os.path.join(package_dir, "src"))) - - -# -- Helper functions -------------------------------------------------------- - - -def count_files(): - """:returns tuple of (num_py, num_cpp)""" - num_py = 0 - num_cpp = 0 - - for _, _, files in os.walk(os.path.join(package_dir, "src")): - for f in files: - if f.endswith(".py"): - num_py += 1 - for _, _, files in os.walk(os.path.join(package_dir, "include")): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - num_cpp += 1 - - return num_py, num_cpp - - -# -- Project information ----------------------------------------------------- - -project = catkin_package.name -copyright = "2019, Bit-Bots" -author = ", ".join([a.name for a in catkin_package.authors]) - -# The short X.Y version -version = str(catkin_package.version) -# The full version, including alpha/beta/rc tags -release = str(catkin_package.version) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.doctest", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.coverage", - "sphinx.ext.imgmath", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# -- Exhale and Breath setup ------------------------------------------------- - -# Tell sphinx what the primary language being documented is. -num_files_py, num_files_cpp = count_files() -primary_domain = "py" if num_files_py >= num_files_cpp else "cpp" - -# Tell sphinx what the pygments highlight language should be. -highlight_language = primary_domain - -if num_files_cpp > 0: - extensions += [ - "breathe", - "exhale", - ] - - breathe_projects = {project: os.path.join("_build", "doxyoutput", "xml")} - breathe_default_project = project - - def specifications_for_kind(kind): - # Show all members for classes and structs - if kind == "class" or kind == "struct": - return [":members:", ":protected-members:", ":private-members:", ":undoc-members:"] - # An empty list signals to Exhale to use the defaults - else: - return [] - - exhale_args = { - # These arguments are required - "containmentFolder": "cppapi", - "rootFileName": "library_root.rst", - "rootFileTitle": "C++ Library API", - "doxygenStripFromPath": "..", - "customSpecificationsMapping": utils.makeCustomSpecificationsMapping(specifications_for_kind), - # Suggested optional arguments - "createTreeView": True, - "exhaleExecutesDoxygen": True, - "exhaleDoxygenStdin": "INPUT = {}".format(os.path.join(package_dir, "include")), - } - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = os.path.join("_static", "logo.png") -html_favicon = os.path.join("_static", "logo.png") - - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# -- RST Standard variables --------------------------------------------------- -rst_prolog = f".. |project| replace:: {project}\n" -rst_prolog += ".. |description| replace:: {}\n".format(catkin_package.description.replace("\n\n", "\n")) -rst_prolog += ".. |modindex| replace:: {}\n".format( - ":ref:`modindex`" if num_files_py > 0 else "Python module index is not available" -) diff --git a/src/bitbots_motion/bitbots_dynup/docs/index.rst b/src/bitbots_motion/bitbots_dynup/docs/index.rst deleted file mode 100644 index ad9f1579b4..0000000000 --- a/src/bitbots_motion/bitbots_dynup/docs/index.rst +++ /dev/null @@ -1,57 +0,0 @@ -Welcome to |project|'s documentation! -================================================ - -Description ------------ - -The Dynup is the component of our softwarestack that handles dynamic stand-up motions. -Since bipedal robots tend to fall, it is important that they can get back onto their feet quickly. -In order to do so robustly, quintic splines and PID controllers are used. -The Dynup system currently supports 6 different modes: :code:`front, back, rise, descend, front_only` and :code:`back_only`. - -A more in-depth view can be found in `Stelter, Sebastian. "Creating Dynamic Stand-Up Motions for Bipedal Robots Using Spline Interpolation." (2020).` - - - -How it works ------------- -Upon receiving a stand-up request, the Dynup system starts by generating four quintic splines, one for each arm and leg. -Using quintic splines makes sure, that the generated motion is smooth in position and velocity, and therefore does not cause harm to the robot or the environment. -Now, for the duration of the motion, the goals for each end-effector at the current time are calculated from the splines. -These are then sent to the stabilizer, which first evaluates whether stabilizing is necessary at this point of the motion. -Since the generated motions are very stable in the first half, stabilizing is disabled at that point. -If stabilizing is to be applied to the goal, two PID controllers controll the IMU error and correct the goals of the feet according to the difference in either pitch or roll. -Finally, the goal is forwarded to the IK solver, which turns the spline goal into motor goals, which can be sent to the motors. -Since the arms are lacking degrees of freedom, the IK solver is set to also consider approximate goals to make sure the motion continues, even if the goal cannot be reached exactly. - -.. image:: _static/flowchart.png - - - -How to test it --------------- -To test the dynup system, simply start the test script with :code:`ros2 launch bitbots_dynup test.launch sim:=true`. -The :code:`sim` parameter is only required, if the system is tested in simulation, otherwise omit it. -To execute the motion, run the following command: :code:`ros2 run bitbots_dynup dummy_client.py `, replacing :code:`` with one of the six directions mentioned above. - - - -How to debug ------------- -A lot of additional information can be gathered by looking at the outputs of the :code:`/dynup/feedback` topic or by visualizing the splines in RViz by adding the :code:`/debug/dynup/received_goal` topic. If the outputs of both of those look fine, but the robot still does not move, make sure, that all topics are mapped correctly, which especially in the simulation might cause problems. - -|description| - -.. toctree:: - :maxdepth: 2 - - cppapi/library_root - pyapi/modules - - -Indices and tables -================== - -* :ref:`genindex` -* |modindex| -* :ref:`search` diff --git a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_engine.hpp b/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_engine.hpp deleted file mode 100644 index 86f87e9576..0000000000 --- a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_engine.hpp +++ /dev/null @@ -1,139 +0,0 @@ -#ifndef BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_ENGINE_H_ -#define BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_ENGINE_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dynup_stabilizer.hpp" - -namespace bitbots_dynup { - -class DynupEngine : public bitbots_splines::AbstractEngine { - public: - explicit DynupEngine(rclcpp::Node::SharedPtr node, bitbots_dynup::Params::Engine params); - - void init(double arm_offset_y, double arm_offset_z); - - DynupResponse update(double dt) override; - - void setGoals(const DynupRequest& goals) override; - - /* - * Publishes debug markers - */ - void publishDebug(); - - int getPercentDone() const override; - - double getDuration() const; - - DynupDirection getDirection(); - - bool isStabilizingNeeded(); - - bool isHeadZero(); - - bitbots_splines::PoseSpline getRFootSplines() const; - - bitbots_splines::PoseSpline getLHandSplines() const; - - bitbots_splines::PoseSpline getRHandSplines() const; - - bitbots_splines::PoseSpline getLFootSplines() const; - - void setParams(bitbots_dynup::Params::Engine params); - - void reset() override; - void reset(double time); - - void publishArrowMarker(std::string name_space, std::string frame, geometry_msgs::msg::Pose pose, float r, float g, - float b, float a); - - private: - rclcpp::Node::SharedPtr node_; - - bitbots_dynup::Params::Engine params_; - - int marker_id_ = 1; - double time_ = 0; - double duration_ = 0; - double arm_offset_y_ = 0; - double arm_offset_z_ = 0; - tf2::Transform offset_left_; - tf2::Transform offset_right_; - - DynupDirection direction_ = DynupDirection::WALKREADY; - - bitbots_splines::PoseSpline l_foot_spline_; - bitbots_splines::PoseSpline l_hand_spline_; - bitbots_splines::PoseSpline r_foot_spline_; - bitbots_splines::PoseSpline r_hand_spline_; - - DynupResponse goals_; - std::shared_ptr walking_param_node_; - std::shared_ptr walking_param_client_; - - rclcpp::Publisher::SharedPtr pub_engine_debug_; - rclcpp::Publisher::SharedPtr pub_debug_marker_; - - /* - * Helper method to extract the current pose of the left foot or the torso from the spline - * @param spline The spline to get the pose from - * @param foot true to get the left foot position, false to get the torso position - * @returns the requested pose relative to the right foot - */ - geometry_msgs::msg::PoseStamped getCurrentPose(bitbots_splines::PoseSpline spline, std::string frame_id); - - /* - * Creates starting positions for the splines. - */ - bitbots_splines::PoseSpline initializeSpline(geometry_msgs::msg::Pose pose, bitbots_splines::PoseSpline spline); - - /* Calculate the splines to get from lying on the front to squatting: - * - move arms to front and pull legs - * - get torso into 45°, pull foot under legs - * - get into crouch position - * - * @return the time of the last splinepoint of this function, needed to concat rise or descend - */ - double calcFrontSplines(); - - /* - * Calculate the splines to get from lying on the back to squatting - * - * @return the time of the last splinepoint of this function, needed to concat rise or descend - */ - double calcBackSplines(); - - /* - * Calculate the splines to get up from a squatting position: - * - slowly stand up with stabilization - * - move arms in finish position - * - * @return the time of the last splinepoint of this function, needed to concat rise or descend - */ - double calcWalkreadySplines(double time = 0, double travel_time = 0); - - /* - * Calculate the splines to get down to a squatting position: - * - slowly sit down with stabilization - * - * @return the time of the last splinepoint of this function, needed to concat rise or descend - */ - double calcDescendSplines(double time = 0); -}; - -} // namespace bitbots_dynup - -#endif // BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_ENGINE_H_ diff --git a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_ik.hpp b/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_ik.hpp deleted file mode 100644 index 6dbdfb0acb..0000000000 --- a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_ik.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_IK_H_ -#define BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_IK_H_ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dynup_utils.hpp" - -namespace bitbots_dynup { -class DynupIK : public bitbots_splines::AbstractIK { - public: - explicit DynupIK(rclcpp::Node::SharedPtr node); - void init(moveit::core::RobotModelPtr kinematic_model) override; - bitbots_splines::JointGoals calculate(const DynupResponse& ik_goals) override; - void reset() override; - void setDirection(DynupDirection direction); - moveit::core::RobotStatePtr get_goal_state(); - void set_joint_positions(sensor_msgs::msg::JointState::ConstSharedPtr joint_state); - - private: - rclcpp::Node::SharedPtr node_; - moveit::core::JointModelGroup* all_joints_group_; - moveit::core::JointModelGroup* l_arm_joints_group_; - moveit::core::JointModelGroup* l_leg_joints_group_; - moveit::core::JointModelGroup* r_arm_joints_group_; - moveit::core::JointModelGroup* r_leg_joints_group_; - moveit::core::RobotStatePtr goal_state_; - sensor_msgs::msg::JointState::ConstSharedPtr joint_state_; - DynupDirection direction_; -}; - -} // namespace bitbots_dynup - -#endif // BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_IK_H_ diff --git a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_node.hpp b/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_node.hpp deleted file mode 100644 index 6d09f072d5..0000000000 --- a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_node.hpp +++ /dev/null @@ -1,160 +0,0 @@ -#ifndef BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_NODE_H_ -#define BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_NODE_H_ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_dynup { -using DynupGoal = bitbots_msgs::action::Dynup; -using DynupGoalHandle = rclcpp_action::ServerGoalHandle; -using namespace std::placeholders; - -/** - * DynupNode is that part of bitbots_dynamic_DynUp which takes care of interacting with ROS and utilizes a DynUpEngine - * to calculate actual DynUp behavior. - * - * It provides an ActionServer for the bitbots_msgs::DynUpAction. - * This actionServer accepts new goals in any tf frame, and sets up the DynUpEngines to work towards this new goal - * - * Additionally it publishes the DynUpEngines motor-goals back into ROS - */ -class DynupNode { - public: - explicit DynupNode(rclcpp::Node::SharedPtr node, const std::string& ns = "", - std::vector parameters = {}); - - void onSetParameters(); - - void imuCallback(const sensor_msgs::msg::Imu::SharedPtr msg); - - void jointStateCallback(const sensor_msgs::msg::JointState::SharedPtr joint_states); - - DynupEngine* getEngine(); - - DynupIK* getIK(); - - /** - * Retrieve current positions of left foot and trunk relative to right foot - * - * @return The pair of (right foot, left foot) poses if transformation was successful - */ - bitbots_dynup::msg::DynupPoses getCurrentPoses(); - - bitbots_msgs::msg::JointCommand step(double dt); - - bitbots_msgs::msg::JointCommand step(double dt, const sensor_msgs::msg::Imu::SharedPtr imu_msg, - const sensor_msgs::msg::JointState::SharedPtr joint_state_msg); - - geometry_msgs::msg::PoseArray step_open_loop(double dt); - - void reset(int time = 0); - - private: - /** - * Callback that gets executed whenever #m_server receives a new goal. - * @param goal New goal to process - */ - rclcpp_action::GoalResponse goalCb(const rclcpp_action::GoalUUID& uuid, std::shared_ptr goal); - - rclcpp_action::CancelResponse cancelCb(std::shared_ptr goal); - - void acceptedCb(const std::shared_ptr goal); - - // Store reference to the "real" node - rclcpp::Node::SharedPtr node_; - - rclcpp_action::Server::SharedPtr action_server_; - - std::vector param_names_; - - // Declare parameter listener and struct from the generate_parameter_library - bitbots_dynup::ParamListener param_listener_; - // Data structure to hold all parameters, which is build from the schema in the 'parameters.yaml' - bitbots_dynup::Params params_; - - // Subcomponents of the dynup - DynupEngine engine_; - Stabilizer stabilizer_; - Visualizer visualizer_; - DynupIK ik_; - - // Variables for node - int stable_duration_ = 0; - int failed_tick_counter_ = 0; - double last_ros_update_time_ = 0; - double start_time_ = 0; - bool server_free_ = true; - bool debug_ = false; - bool cancel_goal_ = false; - - // TF2 related things - tf2_ros::Buffer tf_buffer_; - tf2_ros::TransformListener tf_listener_; - - // MoveIt related things - std::shared_ptr robot_model_loader_; - moveit::core::RobotModelPtr kinematic_model_; - - // Publishers and subscribers - rclcpp::Publisher::SharedPtr joint_goal_publisher_; - rclcpp::Subscription::SharedPtr imu_subscriber_; - rclcpp::Subscription::SharedPtr joint_state_subscriber_; - - void execute(const std::shared_ptr goal); - - /** - * Do main loop in which DynUpEngine::tick() gets called repeatedly. - * The ActionServer's state is taken into account meaning that a cancelled goal no longer gets processed. - */ - void loopEngine(int, std::shared_ptr goal_handle); - - /** - * Publish the current support_foot so that a correct base_footprint can be calculated - * @param is_left_dyn_up Whether the left foot is the current DynUping foot, meaning it is in the air - */ - void publishSupportFoot(bool is_left_dyn_up); - - /** - * Creates the Goal Msg - */ - bitbots_msgs::msg::JointCommand createGoalMsg(const bitbots_splines::JointGoals& goals); - - /** - * Helper method to achieve correctly sampled rate - */ - double getTimeDelta(); -}; - -} // namespace bitbots_dynup - -#endif // BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_NODE_H_ diff --git a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_pywrapper.hpp b/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_pywrapper.hpp deleted file mode 100644 index 219a8f4229..0000000000 --- a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_pywrapper.hpp +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef BITBOTS_DYNUP_BITBOTS_DYNUP_SRC_DYNUP_PYWRAPPER_H -#define BITBOTS_DYNUP_BITBOTS_DYNUP_SRC_DYNUP_PYWRAPPER_H - -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace py = pybind11; -using namespace ros2_python_extension; - -class PyDynupWrapper { - public: - explicit PyDynupWrapper(std::string ns); - py::bytes step(double dt, py::bytes& imu_msg, py::bytes& joint_state_msg); - py::bytes step_open_loop(double dt); - py::bytes get_poses(); - void reset(); - void spin_some(); - void special_reset(double time); - void set_engine_goal(std::string direction); - int get_direction(); - void set_parameter(const py::bytes params); - - private: - rclcpp::Node::SharedPtr node_; - std::shared_ptr dynup_; -}; - -#endif // BITBOTS_DYNUP_BITBOTS_DYNUP_SRC_DYNUP_PYWRAPPER_H diff --git a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_stabilizer.hpp b/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_stabilizer.hpp deleted file mode 100644 index dce20bc4e8..0000000000 --- a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_stabilizer.hpp +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_STABILIZER_H_ -#define BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_STABILIZER_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "dynup_utils.hpp" -namespace bitbots_dynup { - -class Stabilizer : public bitbots_splines::AbstractStabilizer { - public: - explicit Stabilizer(rclcpp::Node::SharedPtr node, bitbots_dynup::Params::Stabilizer params); - DynupResponse stabilize(const DynupResponse& response, const rclcpp::Duration& dt) override; - void setRSoleToTrunk(geometry_msgs::msg::TransformStamped r_sole_to_trunk); - void setParams(bitbots_dynup::Params::Stabilizer params); - void reset() override; - void setImu(sensor_msgs::msg::Imu::SharedPtr imu); - bool isStable(); - - private: - bitbots_dynup::Params::Stabilizer params_; - control_toolbox::PidROS pid_trunk_pitch_; - control_toolbox::PidROS pid_trunk_roll_; - // Transform from r_sole frame to base_link frame, as we want to stabilize the base link. - std::optional r_sole_to_trunk_; - sensor_msgs::msg::Imu::SharedPtr imu_; - - bool is_stable_ = true; -}; - -} // namespace bitbots_dynup - -#endif // BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_STABILIZER_H_ diff --git a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_utils.hpp b/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_utils.hpp deleted file mode 100644 index abbe41380e..0000000000 --- a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/dynup_utils.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_UTILS_H_ -#define BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_UTILS_H_ - -#include -#include -#include -#include - -namespace bitbots_dynup { - -struct DynupResponse { - tf2::Transform l_foot_goal_pose; // relative to r_foot_goal_pose - tf2::Transform r_foot_goal_pose; - tf2::Transform l_hand_goal_pose; - tf2::Transform r_hand_goal_pose; - bool is_stabilizing_needed; - bool is_head_zero; -}; - -enum DynupDirection { - FRONT = 1, - BACK = 0, - FRONT_ONLY = 4, - BACK_ONLY = 5, - RISE = 2, - DESCEND = 3, - WALKREADY = 6, - RISE_NO_ARMS = 8, - DESCEND_NO_ARMS = 7 -}; - -DynupDirection getDynupDirection(const std::string& direction); - -struct DynupRequest { - /* Whether the robot should stand up from the front, back or from squad */ - DynupDirection direction; - geometry_msgs::msg::Pose l_foot_pose; // relative to r_foot_pose - geometry_msgs::msg::Pose r_foot_pose; - geometry_msgs::msg::Pose l_hand_pose; - geometry_msgs::msg::Pose r_hand_pose; -}; - -} // namespace bitbots_dynup - -#endif // BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_DYNUP_UTILS_H_ diff --git a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/visualizer.hpp b/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/visualizer.hpp deleted file mode 100644 index 5655197c59..0000000000 --- a/src/bitbots_motion/bitbots_dynup/include/bitbots_dynup/visualizer.hpp +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_VISUALIZER_H_ -#define BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_VISUALIZER_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_dynup { - -class Visualizer : bitbots_splines::AbstractVisualizer { - public: - Visualizer(rclcpp::Node::SharedPtr node, bitbots_dynup::Params::Visualizer params, const std::string& base_topic); - - void setParams(bitbots_dynup::Params::Visualizer params); - - void displaySplines(bitbots_splines::PoseSpline splines, const std::string& frame); - void publishIKOffsets(const moveit::core::RobotModelPtr& model, const DynupResponse& response, - const bitbots_splines::JointGoals& ik_joint_goals); - - private: - rclcpp::Node::SharedPtr node_; - rclcpp::Publisher::SharedPtr spline_publisher_; - rclcpp::Publisher::SharedPtr ik_debug_publisher_; - std::string base_topic_; - const std::string marker_ns_ = "bitbots_dynup"; - bitbots_dynup::Params::Visualizer params_; -}; -} // namespace bitbots_dynup - -#endif // BITBOTS_DYNUP_INCLUDE_BITBOTS_DYNUP_VISUALIZER_H_ diff --git a/src/bitbots_motion/bitbots_dynup/launch/dynup.launch b/src/bitbots_motion/bitbots_dynup/launch/dynup.launch deleted file mode 100644 index 7c8eeb3d88..0000000000 --- a/src/bitbots_motion/bitbots_dynup/launch/dynup.launch +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_motion/bitbots_dynup/launch/test.launch b/src/bitbots_motion/bitbots_dynup/launch/test.launch deleted file mode 100644 index 1bcc5845c5..0000000000 --- a/src/bitbots_motion/bitbots_dynup/launch/test.launch +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_motion/bitbots_dynup/msg/DynupEngineDebug.msg b/src/bitbots_motion/bitbots_dynup/msg/DynupEngineDebug.msg deleted file mode 100644 index 6de69270d3..0000000000 --- a/src/bitbots_motion/bitbots_dynup/msg/DynupEngineDebug.msg +++ /dev/null @@ -1,21 +0,0 @@ -# -# This message is only used for debugging the dynup engine. -# - -std_msgs/Header header - -float64 time -bool stabilization_active -int32 state_number - -geometry_msgs/Pose l_arm_pose -geometry_msgs/Pose r_arm_pose -geometry_msgs/Pose l_arm_pose_from_shoulder -geometry_msgs/Pose r_arm_pose_from_shoulder - -geometry_msgs/Pose l_leg_pose -geometry_msgs/Pose r_leg_pose - -float64 foot_roll -float64 foot_pitch -float64 foot_yaw \ No newline at end of file diff --git a/src/bitbots_motion/bitbots_dynup/msg/DynupIkOffset.msg b/src/bitbots_motion/bitbots_dynup/msg/DynupIkOffset.msg deleted file mode 100644 index e95bfa2243..0000000000 --- a/src/bitbots_motion/bitbots_dynup/msg/DynupIkOffset.msg +++ /dev/null @@ -1,7 +0,0 @@ -std_msgs/Header header - -# offset between goal position and position computed by running FK on the IK results -geometry_msgs/Pose left_foot_ik_offset -geometry_msgs/Pose right_foot_ik_offset -geometry_msgs/Pose left_hand_ik_offset -geometry_msgs/Pose right_hand_ik_offset diff --git a/src/bitbots_motion/bitbots_dynup/msg/DynupPoses.msg b/src/bitbots_motion/bitbots_dynup/msg/DynupPoses.msg deleted file mode 100644 index 920fed2707..0000000000 --- a/src/bitbots_motion/bitbots_dynup/msg/DynupPoses.msg +++ /dev/null @@ -1,10 +0,0 @@ -# -# Message containing all current poses. -# - -std_msgs/Header header - -geometry_msgs/Pose l_leg_pose -geometry_msgs/Pose r_leg_pose -geometry_msgs/Pose l_arm_pose -geometry_msgs/Pose r_arm_pose \ No newline at end of file diff --git a/src/bitbots_motion/bitbots_dynup/package.xml b/src/bitbots_motion/bitbots_dynup/package.xml deleted file mode 100644 index d95dff4b4c..0000000000 --- a/src/bitbots_motion/bitbots_dynup/package.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - - bitbots_dynup - 1.0.0 - todo - - - Sebastian Stelter - - MIT - - Marc Bestmann - - ament_cmake - - backward_ros - bio_ik - bitbots_docs - bitbots_msgs - bitbots_robot_description - bitbots_splines - bitbots_utils - control_toolbox - geometry_msgs - moveit_core - moveit_ros_move_group - moveit_ros_planning_interface - moveit_ros_robot_interaction - ros2_python_extension - rot_conv - std_msgs - tf2_eigen - tf2_geometry_msgs - tf2_ros - tf2 - generate_parameter_library - - plotjuggler - bitbots_odometry - - - - tested_integration - c++ - - ament_cmake - - - rosidl_default_generators - rosidl_default_runtime - builtin_interfaces - rosidl_interface_packages - rclcpp - - diff --git a/src/bitbots_motion/bitbots_dynup/scripts/dummy_client.py b/src/bitbots_motion/bitbots_dynup/scripts/dummy_client.py deleted file mode 100755 index 12bad18f20..0000000000 --- a/src/bitbots_motion/bitbots_dynup/scripts/dummy_client.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python3 - -import sys - -import rclpy -from actionlib_msgs.msg import GoalStatus -from rclpy.action import ActionClient -from rclpy.node import Node - -from bitbots_msgs.action import Dynup - -showing_feedback = False - -if __name__ == "__main__": - directions = [ - Dynup.Goal.DIRECTION_FRONT, - Dynup.Goal.DIRECTION_FRONT_ONLY, - Dynup.Goal.DIRECTION_BACK, - Dynup.Goal.DIRECTION_BACK_ONLY, - Dynup.Goal.DIRECTION_RISE, - Dynup.Goal.DIRECTION_DESCEND, - Dynup.Goal.DIRECTION_WALKREADY, - Dynup.Goal.DIRECTION_RISE_NO_ARMS, - Dynup.Goal.DIRECTION_DESCEND_NO_ARMS, - ] - if len(sys.argv) != 2 or sys.argv[1] not in directions: - print("Use " + str(directions) + " as parameters!") - sys.exit(1) - - print("[..] Initializing node", end="") - rclpy.init(args=None) - node = Node("dynup_dummy_client") - print("\r[OK] Initializing node") - - def done_cb(state, result): - print("Action completed: ", end="") - if state == GoalStatus.PENDING: - print("Pending") - elif state == GoalStatus.ACTIVE: - print("Active") - elif state == GoalStatus.PREEMPTED: - print("Preempted") - elif state == GoalStatus.SUCCEEDED: - print("Succeeded") - elif state == GoalStatus.ABORTED: - print("Aborted") - elif state == GoalStatus.REJECTED: - print("Rejected") - elif state == GoalStatus.PREEMPTING: - print("Preempting") - elif state == GoalStatus.RECALLING: - print("Recalling") - elif state == GoalStatus.RECALLED: - print("Recalled") - elif state == GoalStatus.LOST: - print("Lost") - else: - print("Unknown state", state) - print(str(result)) - - def active_cb(): - print("Server accepted action") - - def feedback_cb(feedback): - if len(sys.argv) > 1 and "--feedback" in sys.argv: - print("Feedback") - print(feedback) - print() - - print("[..] Connecting to action server 'dynup'", end="") - sys.stdout.flush() - client = ActionClient(node, Dynup, "dynup") - if not client.wait_for_server(): - sys.exit(1) - print("\r[OK] Connecting to action server 'dynup'") - print() - - goal = Dynup.Goal() - goal.direction = sys.argv[1] - - client.send_goal_async(goal) - client.done_cb = done_cb - client.feedback_cb = feedback_cb - client.active_cb = active_cb - print("Sent new goal") diff --git a/src/bitbots_motion/bitbots_dynup/setup.py b/src/bitbots_motion/bitbots_dynup/setup.py deleted file mode 100644 index f7a55ada18..0000000000 --- a/src/bitbots_motion/bitbots_dynup/setup.py +++ /dev/null @@ -1,7 +0,0 @@ -from distutils.core import setup - -from catkin_pkg.python_setup import generate_distutils_setup - -d = generate_distutils_setup(packages=["bitbots_dynup"], scripts=["scripts"], package_dir={"": "src"}) - -setup(**d) diff --git a/src/bitbots_motion/bitbots_dynup/src/dynup_engine.cpp b/src/bitbots_motion/bitbots_dynup/src/dynup_engine.cpp deleted file mode 100644 index 407f089c08..0000000000 --- a/src/bitbots_motion/bitbots_dynup/src/dynup_engine.cpp +++ /dev/null @@ -1,779 +0,0 @@ -#include -#include - -namespace bitbots_dynup { - -DynupEngine::DynupEngine(rclcpp::Node::SharedPtr node, bitbots_dynup::Params::Engine params) - : node_(node), - params_(params), - offset_left_(tf2::Transform::getIdentity()), - offset_right_(tf2::Transform::getIdentity()) { - pub_engine_debug_ = node_->create_publisher("dynup_engine_debug", 1); - pub_debug_marker_ = node_->create_publisher("dynup_engine_marker", 1); - // We need a separate node for the parameter client because the parameter client adds the node to an executor - // and our dynup node is already added to an executor - walking_param_node_ = std::make_shared(std::string(node->get_name()) + "_walking_param_node"); - walking_param_client_ = std::make_shared(walking_param_node_, "/walking"); -} - -void DynupEngine::init(double arm_offset_y, double arm_offset_z) { - // this are just the offsets to the shoulder, we need to apply some additional offset to prevent collisions - arm_offset_y_ = arm_offset_y; - arm_offset_z_ = arm_offset_z; - setParams(params_); - - marker_id_ = 1; -} - -void DynupEngine::reset() { - time_ = 0; - duration_ = 0; - r_foot_spline_ = bitbots_splines::PoseSpline(); - l_hand_spline_ = bitbots_splines::PoseSpline(); - r_hand_spline_ = bitbots_splines::PoseSpline(); - l_foot_spline_ = bitbots_splines::PoseSpline(); -} - -void DynupEngine::reset(double time) { - time_ = time; - duration_ = 0; - r_foot_spline_ = bitbots_splines::PoseSpline(); - l_hand_spline_ = bitbots_splines::PoseSpline(); - r_hand_spline_ = bitbots_splines::PoseSpline(); - l_foot_spline_ = bitbots_splines::PoseSpline(); -} - -void DynupEngine::publishDebug() { - if (pub_engine_debug_->get_subscription_count() == 0 && pub_debug_marker_->get_subscription_count() == 0) { - return; - } - - bitbots_dynup::msg::DynupEngineDebug msg; - msg.header.stamp = node_->get_clock()->now(); - - msg.time = time_; - msg.stabilization_active = isStabilizingNeeded(); - if (direction_ == DynupDirection::FRONT or direction_ == DynupDirection::FRONT_ONLY) { - if (time_ < params_.dynup_front.time_hands_side) { - msg.state_number = 0; - } else if (time_ < params_.dynup_front.time_hands_side + params_.dynup_front.time_hands_rotate) { - msg.state_number = 1; - } else if (time_ < params_.dynup_front.time_hands_side + params_.dynup_front.time_hands_rotate + - params_.dynup_front.time_hands_front) { - msg.state_number = 2; - } else if (time_ < params_.dynup_front.time_hands_side + params_.dynup_front.time_hands_rotate + - params_.dynup_front.time_hands_front + params_.dynup_front.time_foot_close) { - msg.state_number = 3; - } else if (time_ < params_.dynup_front.time_hands_side + params_.dynup_front.time_hands_rotate + - params_.dynup_front.time_hands_front + params_.dynup_front.time_foot_close + - params_.dynup_front.time_foot_ground_front) { - msg.state_number = 4; - } else if (time_ < params_.dynup_front.time_hands_side + params_.dynup_front.time_hands_rotate + - params_.dynup_front.time_hands_front + params_.dynup_front.time_foot_close + - params_.dynup_front.time_foot_ground_front + params_.dynup_front.time_torso_45) { - msg.state_number = 5; - } else if (time_ < params_.dynup_front.time_hands_side + params_.dynup_front.time_hands_rotate + - params_.dynup_front.time_hands_front + params_.dynup_front.time_foot_close + - params_.dynup_front.time_foot_ground_front + params_.dynup_front.time_torso_45 + - params_.dynup_front.time_to_squat) { - msg.state_number = 6; - } else if (time_ < params_.dynup_front.time_hands_side + params_.dynup_front.time_hands_rotate + - params_.dynup_front.time_hands_front + params_.dynup_front.time_foot_close + - params_.dynup_front.time_foot_ground_front + params_.dynup_front.time_torso_45 + - params_.dynup_front.time_to_squat + params_.dynup_front.wait_in_squat_front) { - msg.state_number = 7; - } else { - msg.state_number = 8; - } - } else if (direction_ == DynupDirection::BACK or direction_ == DynupDirection::BACK_ONLY) { - if (time_ < params_.dynup_back.time_legs_close) { - msg.state_number = 0; - } else if (time_ < params_.dynup_back.time_legs_close + params_.dynup_back.time_foot_ground_back) { - msg.state_number = 1; - } else if (time_ < params_.dynup_back.time_legs_close + params_.dynup_back.time_foot_ground_back + - params_.dynup_back.time_full_squat_hands) { - msg.state_number = 2; - } else if (time_ < params_.dynup_back.time_legs_close + params_.dynup_back.time_foot_ground_back + - params_.dynup_back.time_full_squat_hands + params_.dynup_back.time_full_squat_legs) { - msg.state_number = 3; - } else if (time_ < params_.dynup_back.time_legs_close + params_.dynup_back.time_foot_ground_back + - params_.dynup_back.time_full_squat_hands + params_.dynup_back.time_full_squat_legs + - params_.dynup_back.wait_in_squat_back) { - msg.state_number = 4; - } else { - msg.state_number = 5; - } - } else { - msg.state_number = -1; - } - - geometry_msgs::msg::Pose l_arm_pose; - tf2::toMsg(goals_.l_hand_goal_pose, l_arm_pose); - msg.l_arm_pose = l_arm_pose; - publishArrowMarker("l_arm", "base_link", l_arm_pose, 1, 0, 0, 1); - - geometry_msgs::msg::Pose l_arm_from_shoulder; - tf2::toMsg(l_hand_spline_.getTfTransform(time_), l_arm_from_shoulder); - msg.l_arm_pose_from_shoulder = l_arm_from_shoulder; - - geometry_msgs::msg::Pose r_arm_pose; - tf2::toMsg(goals_.r_hand_goal_pose, r_arm_pose); - msg.r_arm_pose = r_arm_pose; - publishArrowMarker("r_arm", "base_link", r_arm_pose, 0, 1, 0, 1); - - geometry_msgs::msg::Pose r_arm_from_shoulder; - tf2::toMsg(r_hand_spline_.getTfTransform(time_), r_arm_from_shoulder); - msg.r_arm_pose_from_shoulder = r_arm_from_shoulder; - - geometry_msgs::msg::Pose l_leg_pose; - tf2::toMsg(goals_.l_foot_goal_pose, l_leg_pose); - msg.l_leg_pose = l_leg_pose; - - geometry_msgs::msg::Pose l_leg_pose_in_base_link; - tf2::toMsg(goals_.r_foot_goal_pose * goals_.l_foot_goal_pose, l_leg_pose_in_base_link); - publishArrowMarker("l_leg_pose", "base_link", l_leg_pose_in_base_link, 0, 0, 1, 1); - - geometry_msgs::msg::Pose r_leg_pose; - tf2::toMsg(goals_.r_foot_goal_pose, r_leg_pose); - msg.r_leg_pose = r_leg_pose; - publishArrowMarker("r_leg_pose", "base_link", r_leg_pose, 0, 1, 1, 1); - - double r, p, y; - tf2::Quaternion q; - tf2::convert(r_leg_pose.orientation, q); - tf2::Matrix3x3(q).getRPY(r, p, y); - msg.foot_roll = r; - msg.foot_pitch = p; - msg.foot_yaw = y; - - pub_engine_debug_->publish(msg); -} - -void DynupEngine::publishArrowMarker(std::string name_space, std::string frame, geometry_msgs::msg::Pose pose, float r, - float g, float b, float a) { - visualization_msgs::msg::Marker marker_msg; - marker_msg.header.stamp = node_->get_clock()->now(); - marker_msg.header.frame_id = frame; - - marker_msg.type = marker_msg.ARROW; - marker_msg.ns = name_space; - marker_msg.action = marker_msg.ADD; - marker_msg.pose = pose; - - std_msgs::msg::ColorRGBA color; - color.r = r; - color.g = g; - color.b = b; - color.a = a; - marker_msg.color = color; - - geometry_msgs::msg::Vector3 scale; - scale.x = 0.01; - scale.y = 0.003; - scale.z = 0.003; - marker_msg.scale = scale; - - marker_msg.id = marker_id_; - marker_id_++; - - pub_debug_marker_->publish(marker_msg); -} - -DynupResponse DynupEngine::update(double dt) { - time_ = std::min(time_, duration_); - // TODO what happens when splines for foot and trunk are not present? - /* Get should-be pose from planned splines (every axis) at current time */ - tf2::Transform l_foot_pose = l_foot_spline_.getTfTransform(time_); - tf2::Transform r_foot_pose = r_foot_spline_.getTfTransform(time_); - tf2::Transform l_hand_pose = l_hand_spline_.getTfTransform(time_); - tf2::Transform r_hand_pose = r_hand_spline_.getTfTransform(time_); - - // add offsets to transform to base_link - goals_.l_foot_goal_pose = l_foot_pose; - goals_.r_foot_goal_pose = r_foot_pose; - goals_.l_hand_goal_pose = offset_left_ * l_hand_pose; - goals_.r_hand_goal_pose = offset_right_ * r_hand_pose; - goals_.is_stabilizing_needed = isStabilizingNeeded(); - goals_.is_head_zero = isHeadZero(); - - publishDebug(); - - time_ += dt; - - return goals_; -} - -bitbots_splines::PoseSpline DynupEngine::initializeSpline(geometry_msgs::msg::Pose pose, - bitbots_splines::PoseSpline spline) { - double r, p, y; - tf2::Quaternion q; - - spline.x()->addPoint(0.0, pose.position.x); - spline.y()->addPoint(0.0, pose.position.y); - spline.z()->addPoint(0.0, pose.position.z); - tf2::convert(pose.orientation, q); - tf2::Matrix3x3(q).getRPY(r, p, y); - spline.roll()->addPoint(0.0, r); - spline.pitch()->addPoint(0.0, p); - spline.yaw()->addPoint(0.0, y); - - return spline; -} - -double DynupEngine::calcFrontSplines() { - /* - calculates splines for front up - */ - - /* - * Pose 0: Extend hands to the side, for later turning - */ - double time = params_.dynup_front.time_hands_side; - l_hand_spline_.x()->addPoint(time, 0); - l_hand_spline_.y()->addPoint(time, params_.end_pose.arm_extended_length); - l_hand_spline_.z()->addPoint(time, 0); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, 0); - l_hand_spline_.yaw()->addPoint(time, M_PI / 2); - r_hand_spline_.x()->addPoint(time, 0); - r_hand_spline_.y()->addPoint(time, -params_.end_pose.arm_extended_length); - r_hand_spline_.z()->addPoint(time, 0); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, 0); - r_hand_spline_.yaw()->addPoint(time, -M_PI / 2); - - /* - * Pose 1: Rotate hands to the orientation that we will need later - */ - double pitch_offset = params_.dynup_front.hands_pitch / 180 * M_PI; - time += params_.dynup_front.time_hands_rotate; - l_hand_spline_.x()->addPoint(time, 0); - l_hand_spline_.y()->addPoint(time, params_.end_pose.arm_extended_length); - l_hand_spline_.z()->addPoint(time, 0); - l_hand_spline_.roll()->addPoint(time, -M_PI / 2); - l_hand_spline_.pitch()->addPoint(time, 0); - l_hand_spline_.yaw()->addPoint(time, M_PI / 2); - r_hand_spline_.x()->addPoint(time, 0); - r_hand_spline_.y()->addPoint(time, -params_.end_pose.arm_extended_length); - r_hand_spline_.z()->addPoint(time, 0); - r_hand_spline_.roll()->addPoint(time, M_PI / 2); - r_hand_spline_.pitch()->addPoint(time, 0); - r_hand_spline_.yaw()->addPoint(time, -M_PI / 2); - - /* - * Pose 2: Move hands to the front - */ - time += params_.dynup_front.time_hands_front; - // we apply a small offset in x direction, to make sure that ShoulderPitch does not go > 180° due to rounding errors - double x_offset = 0.005; - r_hand_spline_.x()->addPoint(time, sin(pitch_offset) * x_offset); - r_hand_spline_.y()->addPoint(time, -params_.dynup_front.arm_side_offset_front); - r_hand_spline_.z()->addPoint(time, cos(pitch_offset) * params_.end_pose.arm_extended_length); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, -M_PI / 2 + pitch_offset); - r_hand_spline_.yaw()->addPoint(time, 0); - l_hand_spline_.x()->addPoint(time, sin(pitch_offset) * x_offset); - l_hand_spline_.y()->addPoint(time, params_.dynup_front.arm_side_offset_front); - l_hand_spline_.z()->addPoint(time, cos(pitch_offset) * params_.end_pose.arm_extended_length); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, -M_PI / 2 + pitch_offset); - l_hand_spline_.yaw()->addPoint(time, 0); - - // keep feet on initial pose till this point, otherwise robot will tilt and arms will collide with floor - r_foot_spline_.x()->addPoint(time, r_foot_spline_.x()->points()[0].position); - r_foot_spline_.y()->addPoint(time, r_foot_spline_.y()->points()[0].position); - r_foot_spline_.z()->addPoint(time, r_foot_spline_.z()->points()[0].position); - r_foot_spline_.roll()->addPoint(time, r_foot_spline_.roll()->points()[0].position); - r_foot_spline_.pitch()->addPoint(time, r_foot_spline_.pitch()->points()[0].position); - r_foot_spline_.yaw()->addPoint(time, r_foot_spline_.yaw()->points()[0].position); - l_foot_spline_.x()->addPoint(time, l_foot_spline_.x()->points()[0].position); - l_foot_spline_.y()->addPoint(time, l_foot_spline_.y()->points()[0].position); - l_foot_spline_.z()->addPoint(time, l_foot_spline_.z()->points()[0].position); - l_foot_spline_.roll()->addPoint(time, l_foot_spline_.roll()->points()[0].position); - l_foot_spline_.pitch()->addPoint(time, l_foot_spline_.pitch()->points()[0].position); - l_foot_spline_.yaw()->addPoint(time, l_foot_spline_.yaw()->points()[0].position); - - /* - * Pose 3: Pull legs to body - */ - time += params_.dynup_front.time_foot_close; - r_foot_spline_.x()->addPoint(time, -params_.dynup_front.trunk_x_front); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, -params_.dynup_front.leg_min_length_front); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, 0); - r_foot_spline_.yaw()->addPoint(time, 0); - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - - /* - * Pose 4: Position feet under body - */ - // compute foot position while standing up - double foot_x = sin(M_PI * -params_.dynup_front.max_leg_angle / 180) * -params_.dynup_front.leg_min_length_front; - double foot_z = cos(M_PI * -params_.dynup_front.max_leg_angle / 180) * -params_.dynup_front.leg_min_length_front; - double foot_pitch = -M_PI * params_.dynup_front.max_leg_angle / 180; - time += params_.dynup_front.time_foot_ground_front; - r_foot_spline_.x()->addPoint(time, foot_x - params_.dynup_front.trunk_x_front); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, foot_z); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, foot_pitch); - r_foot_spline_.yaw()->addPoint(time, 0); - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - - /* - * Pose 5: Rotate torso to 45° - */ - time += params_.dynup_front.time_torso_45; - r_hand_spline_.x()->addPoint(time, params_.end_pose.arm_extended_length); - r_hand_spline_.y()->addPoint(time, -params_.dynup_front.arm_side_offset_front); - r_hand_spline_.z()->addPoint(time, 0); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, 0); - r_hand_spline_.yaw()->addPoint(time, 0); - l_hand_spline_.x()->addPoint(time, params_.end_pose.arm_extended_length); - l_hand_spline_.y()->addPoint(time, params_.dynup_front.arm_side_offset_front); - l_hand_spline_.z()->addPoint(time, 0); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, 0); - l_hand_spline_.yaw()->addPoint(time, 0); - - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - r_foot_spline_.x()->addPoint(time, foot_x - params_.dynup_front.trunk_x_front); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, foot_z); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, foot_pitch); - r_foot_spline_.yaw()->addPoint(time, 0); - - /* - * Pose 6: Move to squat position - */ - double angle_foot = -M_PI * params_.dynup_front.trunk_overshoot_angle_front / 180; - time += params_.dynup_front.time_to_squat; - // r_hand_spline_.x()->addPoint(time, 0, -1); - r_hand_spline_.x()->addPoint(time, 0); - r_hand_spline_.y()->addPoint(time, -params_.dynup_front.arm_side_offset_front); - r_hand_spline_.z()->addPoint(time, -params_.end_pose.arm_extended_length); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, M_PI / 2); - r_hand_spline_.yaw()->addPoint(time, 0); - // l_hand_spline_.x()->addPoint(time, 0, -1); - l_hand_spline_.x()->addPoint(time, 0); - l_hand_spline_.y()->addPoint(time, params_.dynup_front.arm_side_offset_front); - l_hand_spline_.z()->addPoint(time, -params_.end_pose.arm_extended_length); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, M_PI / 2); - l_hand_spline_.yaw()->addPoint(time, 0); - - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - r_foot_spline_.x()->addPoint(time, -cos(angle_foot) * params_.dynup_front.trunk_x_front); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, -sin(angle_foot) * params_.dynup_front.trunk_x_front - - cos(angle_foot) * params_.dynup_front.leg_min_length_front); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, angle_foot); - r_foot_spline_.yaw()->addPoint(time, 0); - - /* - * Pose 7: Wait in squat to let instabilities settle - */ - time += params_.dynup_front.wait_in_squat_front; - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - r_foot_spline_.x()->addPoint(time, -cos(angle_foot) * params_.dynup_front.trunk_x_front); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, -sin(angle_foot) * params_.dynup_front.trunk_x_front - - cos(angle_foot) * params_.dynup_front.leg_min_length_front); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, angle_foot); - r_foot_spline_.yaw()->addPoint(time, 0); - - l_hand_spline_.x()->addPoint(time, 0); - l_hand_spline_.y()->addPoint(time, params_.dynup_front.arm_side_offset_front); - l_hand_spline_.z()->addPoint(time, -params_.end_pose.arm_extended_length); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, M_PI / 2); - l_hand_spline_.yaw()->addPoint(time, 0); - r_hand_spline_.x()->addPoint(time, 0); - r_hand_spline_.y()->addPoint(time, -params_.dynup_front.arm_side_offset_front); - r_hand_spline_.z()->addPoint(time, -params_.end_pose.arm_extended_length); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, M_PI / 2); - r_hand_spline_.yaw()->addPoint(time, 0); - return time; -} - -double DynupEngine::calcBackSplines() { - /* - calculates splines for back up - */ - - /* - * Pose 0: Pull legs to body and position hands behind back - */ - double time = params_.dynup_back.time_legs_close; - r_foot_spline_.x()->addPoint(time, 0); - // y is always just related to the foot distance parameter - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - // pull legs as closely as possible - r_foot_spline_.z()->addPoint(time, -params_.dynup_back.leg_min_length_back); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, 0); - r_foot_spline_.yaw()->addPoint(time, 0); - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - - // put hands at specified place behind back to push the torso upwards - l_hand_spline_.x()->addPoint(time, -params_.dynup_back.hands_behind_back_x); - l_hand_spline_.y()->addPoint(time, params_.end_pose.arm_side_offset_back); - l_hand_spline_.z()->addPoint(time, -params_.dynup_back.hands_behind_back_z); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, M_PI / 2); - l_hand_spline_.yaw()->addPoint(time, 0); - r_hand_spline_.x()->addPoint(time, -params_.dynup_back.hands_behind_back_x); - r_hand_spline_.y()->addPoint(time, -params_.end_pose.arm_side_offset_back); - r_hand_spline_.z()->addPoint(time, -params_.dynup_back.hands_behind_back_z); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, M_PI / 2); - r_hand_spline_.yaw()->addPoint(time, 0); - - /* - * Pose 1: Push torso up with an angle and get feet under body. CoM has to get over support polygon - */ - time += params_.dynup_back.time_foot_ground_back; - // length(upper arm) == length(lower arm) -> Isosceles triangle with length of one side := - // params_.arm_extended_length/2 set elbow to 90°, we can get x by Pythagorean theorem - l_hand_spline_.x()->addPoint(time, sin(params_.dynup_back.arms_angle_back * M_PI / 180) * - -sqrt(2 * pow(params_.end_pose.arm_extended_length / 2, 2))); - l_hand_spline_.y()->addPoint(time, 0); - l_hand_spline_.z()->addPoint(time, cos(params_.dynup_back.arms_angle_back * M_PI / 180) * - -sqrt(2 * pow(params_.end_pose.arm_extended_length / 2, 2))); - l_hand_spline_.roll()->addPoint(time, 0); - // angle has to be 45° due to arms being a Isosceles triangle with gamma = 90° - l_hand_spline_.pitch()->addPoint(time, params_.dynup_back.arms_angle_back * M_PI / 180); - l_hand_spline_.yaw()->addPoint(time, 0); - r_hand_spline_.x()->addPoint(time, sin(params_.dynup_back.arms_angle_back * M_PI / 180) * - -sqrt(2 * pow(params_.end_pose.arm_extended_length / 2, 2))); - r_hand_spline_.y()->addPoint(time, 0); - r_hand_spline_.z()->addPoint(time, cos(params_.dynup_back.arms_angle_back * M_PI / 180) * - -sqrt(2 * pow(params_.end_pose.arm_extended_length / 2, 2))); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, params_.dynup_back.arms_angle_back * M_PI / 180); - r_hand_spline_.yaw()->addPoint(time, 0); - - double angle_foot = M_PI * params_.dynup_back.foot_angle / 180; - // trunk needs to be kept high enough to avoid collisions - // since angle between torso and foot changes, we need to apply sin/cos to compute in relation to feet. - // this is necessary since it will be the correct frame again after next torso rotation - // shift torso by general x offset + extra parameter to allow positioning of CoM. - r_foot_spline_.x()->addPoint(time, -params_.dynup_back.trunk_height_back); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, -params_.dynup_back.com_shift_1); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, angle_foot); - r_foot_spline_.yaw()->addPoint(time, 0); - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - - /* - * Pose 3: Fully extend arms to the back, to push torso on the feet - */ - time += params_.dynup_back.time_full_squat_hands; - l_hand_spline_.x()->addPoint(time, -params_.end_pose.arm_extended_length); - l_hand_spline_.y()->addPoint(time, 0); - l_hand_spline_.z()->addPoint(time, 0); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, M_PI); - l_hand_spline_.yaw()->addPoint(time, 0); - r_hand_spline_.x()->addPoint(time, -params_.end_pose.arm_extended_length); - r_hand_spline_.y()->addPoint(time, 0); - r_hand_spline_.z()->addPoint(time, 0); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, M_PI); - r_hand_spline_.yaw()->addPoint(time, 0); - - /* - * Pose 4: Turn feet to correct end angle - */ - time += params_.dynup_back.time_full_squat_legs; - // angle foot now changed based on different parameter - angle_foot = -M_PI * params_.dynup_back.trunk_overshoot_angle_back / 180; - r_foot_spline_.x()->addPoint(time, -params_.dynup_back.com_shift_2); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, -params_.dynup_back.trunk_height_back); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, angle_foot); - r_foot_spline_.yaw()->addPoint(time, 0); - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - - /* - * Pose 5: Wait in squat to let instabilities settle - */ - time += params_.dynup_back.wait_in_squat_back; - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - r_foot_spline_.x()->addPoint(time, -params_.dynup_back.com_shift_2); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, -params_.dynup_back.trunk_height_back); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, M_PI * -params_.end_pose.trunk_pitch / 180); - r_foot_spline_.yaw()->addPoint(time, 0); - - l_hand_spline_.x()->addPoint(time, 0); - l_hand_spline_.y()->addPoint(time, params_.end_pose.arm_side_offset_back); - l_hand_spline_.z()->addPoint(time, -params_.end_pose.arm_extended_length); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, M_PI / 2); - l_hand_spline_.yaw()->addPoint(time, 0); - r_hand_spline_.x()->addPoint(time, 0); - r_hand_spline_.y()->addPoint(time, -params_.end_pose.arm_side_offset_back); - r_hand_spline_.z()->addPoint(time, -params_.end_pose.arm_extended_length); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, M_PI / 2); - r_hand_spline_.yaw()->addPoint(time, 0); - return time; -} - -double DynupEngine::calcWalkreadySplines(double time, double travel_time) { - // all positions relative to right foot - // foot_trajectories_ are for left foot - time += travel_time; - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - - r_foot_spline_.x()->addPoint(time, -params_.end_pose.trunk_x_final); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2.0); - r_foot_spline_.z()->addPoint(time, -params_.end_pose.trunk_height); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, -params_.end_pose.trunk_pitch * M_PI / 180); - r_foot_spline_.yaw()->addPoint(time, 0); - - l_hand_spline_.x()->addPoint(time, 0); - l_hand_spline_.y()->addPoint(time, 0); - l_hand_spline_.z()->addPoint(time, params_.end_pose.hand_walkready_height); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, params_.end_pose.hand_walkready_pitch * M_PI / 180); - l_hand_spline_.yaw()->addPoint(time, 0); - r_hand_spline_.x()->addPoint(time, 0); - r_hand_spline_.y()->addPoint(time, 0); - r_hand_spline_.z()->addPoint(time, params_.end_pose.hand_walkready_height); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, params_.end_pose.hand_walkready_pitch * M_PI / 180); - r_hand_spline_.yaw()->addPoint(time, 0); - - return time; -} - -double DynupEngine::calcDescendSplines(double time) { - // all positions relative to right foot - // foot_trajectories_ are for left foot - time += params_.descend.descend_time; - l_foot_spline_.x()->addPoint(time, 0); - l_foot_spline_.y()->addPoint(time, params_.end_pose.foot_distance); - l_foot_spline_.z()->addPoint(time, 0); - l_foot_spline_.roll()->addPoint(time, 0); - l_foot_spline_.pitch()->addPoint(time, 0); - l_foot_spline_.yaw()->addPoint(time, 0); - r_foot_spline_.x()->addPoint(time, -params_.end_pose.trunk_x_final); - r_foot_spline_.y()->addPoint(time, -params_.end_pose.foot_distance / 2); - r_foot_spline_.z()->addPoint(time, -params_.dynup_front.leg_min_length_front); - r_foot_spline_.roll()->addPoint(time, 0); - r_foot_spline_.pitch()->addPoint(time, M_PI * -params_.end_pose.trunk_pitch / 180); - r_foot_spline_.yaw()->addPoint(time, 0); - - l_hand_spline_.x()->addPoint(time, 0); - l_hand_spline_.y()->addPoint(time, params_.dynup_front.arm_side_offset_front); - l_hand_spline_.z()->addPoint(time, -params_.end_pose.arm_extended_length); - l_hand_spline_.roll()->addPoint(time, 0); - l_hand_spline_.pitch()->addPoint(time, M_PI / 2); - l_hand_spline_.yaw()->addPoint(time, 0); - r_hand_spline_.x()->addPoint(time, 0); - r_hand_spline_.y()->addPoint(time, -params_.dynup_front.arm_side_offset_front); - r_hand_spline_.z()->addPoint(time, -params_.end_pose.arm_extended_length); - r_hand_spline_.roll()->addPoint(time, 0); - r_hand_spline_.pitch()->addPoint(time, M_PI / 2); - r_hand_spline_.yaw()->addPoint(time, 0); - - return time; -} - -void DynupEngine::setGoals(const DynupRequest& goals) { - // we use hand splines from shoulder frame instead of base_link - geometry_msgs::msg::Pose l_hand = goals.l_hand_pose; - geometry_msgs::msg::Pose r_hand = goals.r_hand_pose; - l_hand.position.y -= arm_offset_y_; - l_hand.position.z -= arm_offset_z_; - r_hand.position.y += arm_offset_y_; - r_hand.position.z -= arm_offset_z_; - // l_foot_spline_ is defined relative to r_foot_spline_, while all others are relative to base_link - l_hand_spline_ = initializeSpline(l_hand, l_hand_spline_); - r_hand_spline_ = initializeSpline(r_hand, r_hand_spline_); - l_foot_spline_ = initializeSpline(goals.l_foot_pose, l_foot_spline_); - r_foot_spline_ = initializeSpline(goals.r_foot_pose, r_foot_spline_); - - // get parameters from walking. If walking is not running, use default values - // we re-request the values every time because they can be changed by dynamic reconfigure - // and re-requesting them is fast enough - std::vector walking_params; - // Get params and wait for walking to be ready - walking_params = walking_param_client_->get_parameters( - {"engine.trunk_pitch", "engine.trunk_height", "engine.foot_distance", "engine.trunk_x_offset"}, - std::chrono::seconds(5)); - - // when the walking was killed, service_is_ready is still true but the parameters come back empty - if (walking_params.size() != 4) { - RCLCPP_WARN(node_->get_logger(), "Walking is not running, using default parameters for walkready."); - } else { - // Placeholders for the parameters, we assure that we have all parameters before, so we can use -1 as a placeholder - double foot_distance = -1, trunk_x_final = -1, trunk_pitch = -1, trunk_height = -1; - for (auto& param : walking_params) { - if (param.get_name() == "engine.trunk_pitch") { - trunk_pitch = param.get_value(); - } else if (param.get_name() == "engine.trunk_height") { - trunk_height = param.get_value(); - } else if (param.get_name() == "engine.foot_distance") { - foot_distance = param.get_value(); - } else if (param.get_name() == "engine.trunk_x_offset") { - trunk_x_final = param.get_value(); - } - } - - // walking uses a different coordinate system for the trunk - trunk_height = trunk_height * std::cos(trunk_pitch); - trunk_x_final = trunk_x_final - std::sin(trunk_pitch) * trunk_height; - params_.end_pose.trunk_pitch = trunk_pitch * 180 / M_PI; - params_.end_pose.trunk_height = trunk_height; - params_.end_pose.foot_distance = foot_distance; - params_.end_pose.trunk_x_final = trunk_x_final; - } - - direction_ = goals.direction; - switch (direction_) { - case DynupDirection::FRONT: { - // add front and rise splines together - double time = calcFrontSplines(); - duration_ = calcWalkreadySplines(time, params_.rise.rise_time); - break; - } - case DynupDirection::BACK: { - // add back and rise splines together - double time = calcBackSplines(); - duration_ = calcWalkreadySplines(time, params_.rise.rise_time); - break; - } - case DynupDirection::FRONT_ONLY: - duration_ = calcFrontSplines(); - break; - case DynupDirection::BACK_ONLY: - duration_ = calcBackSplines(); - break; - case DynupDirection::RISE: - case DynupDirection::RISE_NO_ARMS: - duration_ = calcWalkreadySplines(0, params_.rise.rise_time); - break; - case DynupDirection::DESCEND: - case DynupDirection::DESCEND_NO_ARMS: - duration_ = calcDescendSplines(); - break; - case DynupDirection::WALKREADY: - duration_ = calcWalkreadySplines(0, params_.walkready.travel_time); - break; - default: - RCLCPP_ERROR(node_->get_logger(), "Provided direction not known"); - } -} - -int DynupEngine::getPercentDone() const { return int(time_ / duration_ * 100); } - -double DynupEngine::getDuration() const { return duration_; } - -/*Calculates if we are at a point of the animation where stabilizing should be applied. */ -bool DynupEngine::isStabilizingNeeded() { - return (((direction_ == DynupDirection::FRONT or direction_ == DynupDirection::FRONT_ONLY) and - time_ >= params_.dynup_front.time_hands_side + - params_.dynup_front.time_hands_rotate + // TODO fix int direction number - params_.dynup_front.time_foot_close + params_.dynup_front.time_hands_front + - params_.dynup_front.time_foot_ground_front + params_.dynup_front.time_torso_45 + - params_.dynup_front.time_to_squat) or - ((direction_ == DynupDirection::BACK or direction_ == DynupDirection::BACK_ONLY) and - time_ >= params_.dynup_back.time_legs_close + params_.dynup_back.time_foot_ground_back + - params_.dynup_back.time_full_squat_hands + params_.dynup_back.time_full_squat_legs) or - (direction_ == DynupDirection::RISE) or (direction_ == DynupDirection::DESCEND)); -} - -bool DynupEngine::isHeadZero() { - // set heads zero if we are upright - return (((direction_ == DynupDirection::FRONT or direction_ == DynupDirection::FRONT_ONLY) and - time_ >= params_.dynup_front.time_hands_side + params_.dynup_front.time_hands_rotate + - params_.dynup_front.time_foot_close + params_.dynup_front.time_hands_front + - params_.dynup_front.time_foot_ground_front + params_.dynup_front.time_torso_45 + - params_.dynup_front.time_to_squat) or - ((direction_ == DynupDirection::BACK or direction_ == DynupDirection::BACK_ONLY) and - time_ >= params_.dynup_back.time_legs_close + params_.dynup_back.time_foot_ground_back + - params_.dynup_back.time_full_squat_hands + params_.dynup_back.time_full_squat_legs) or - (direction_ == DynupDirection::RISE) or (direction_ == DynupDirection::DESCEND)); -} - -bitbots_splines::PoseSpline DynupEngine::getRFootSplines() const { return r_foot_spline_; } - -bitbots_splines::PoseSpline DynupEngine::getLFootSplines() const { return l_foot_spline_; } - -bitbots_splines::PoseSpline DynupEngine::getRHandSplines() const { return r_hand_spline_; } - -bitbots_splines::PoseSpline DynupEngine::getLHandSplines() const { return l_hand_spline_; } - -void DynupEngine::setParams(bitbots_dynup::Params::Engine params) { - params_ = params; - offset_left_ = tf2::Transform(tf2::Quaternion(0, 0, 0, 1), {0, arm_offset_y_, arm_offset_z_}); - offset_right_ = tf2::Transform(tf2::Quaternion(0, 0, 0, 1), {0, -arm_offset_y_, arm_offset_z_}); -} - -DynupDirection DynupEngine::getDirection() { return direction_; } - -} // namespace bitbots_dynup diff --git a/src/bitbots_motion/bitbots_dynup/src/dynup_ik.cpp b/src/bitbots_motion/bitbots_dynup/src/dynup_ik.cpp deleted file mode 100644 index 0511f7f8e3..0000000000 --- a/src/bitbots_motion/bitbots_dynup/src/dynup_ik.cpp +++ /dev/null @@ -1,139 +0,0 @@ -#include - -namespace bitbots_dynup { - -DynupIK::DynupIK(rclcpp::Node::SharedPtr node) : node_(node) {} - -void DynupIK::init(moveit::core::RobotModelPtr kinematic_model) { - /* Extract joint groups from kinematics model */ - l_leg_joints_group_ = kinematic_model->getJointModelGroup("LeftLeg"); - r_leg_joints_group_ = kinematic_model->getJointModelGroup("RightLeg"); - l_arm_joints_group_ = kinematic_model->getJointModelGroup("LeftArm"); - r_arm_joints_group_ = kinematic_model->getJointModelGroup("RightArm"); - all_joints_group_ = kinematic_model->getJointModelGroup("All"); - - /* Reset kinematic goal to default */ - goal_state_ = std::make_shared(kinematic_model); - goal_state_->setToDefaultValues(); -} - -void DynupIK::reset() { - // we have to set some good initial position in the goal state, since we are using a gradient - // based method. Otherwise, the first step will be not correct - - // Use the current joint state as a starting point for the IK - if (joint_state_) { - goal_state_->setVariablePositions(joint_state_->name, joint_state_->position); - } else { - // if we don't have a joint state, we set some default values that are a reasonable starting point - RCLCPP_WARN(node_->get_logger(), - "No joint state received, using hardcoded initial positions for IK " - "initialization"); - std::vector names_vec = {"LHipPitch", "LKnee", "LAnklePitch", "RHipPitch", "RKnee", "RAnklePitch"}; - std::vector pos_vec = {0.7, 1.0, -0.4, -0.7, -1.0, 0.4}; - for (size_t i = 0; i < names_vec.size(); i++) { - // besides its name, this method only changes a single joint position... - goal_state_->setJointPositions(names_vec[i], &pos_vec[i]); - } - } -} - -void DynupIK::setDirection(DynupDirection direction) { direction_ = direction; } - -bitbots_splines::JointGoals DynupIK::calculate(const DynupResponse& ik_goals) { - /* ik options is basically the command which we send to bio_ik and which describes what we want to do */ - kinematics::KinematicsQueryOptions ik_options; - ik_options.return_approximate_solution = true; - - geometry_msgs::msg::Pose right_foot_goal_msg, left_foot_goal_msg, right_hand_goal_msg, left_hand_goal_msg; - - tf2::toMsg(ik_goals.r_foot_goal_pose, right_foot_goal_msg); - tf2::toMsg(ik_goals.l_foot_goal_pose, left_foot_goal_msg); - tf2::toMsg(ik_goals.r_hand_goal_pose, right_hand_goal_msg); - tf2::toMsg(ik_goals.l_hand_goal_pose, left_hand_goal_msg); - - bool success; - goal_state_->updateLinkTransforms(); - - bio_ik::BioIKKinematicsQueryOptions leg_ik_options; - leg_ik_options.return_approximate_solution = true; - - // Add auxiliary goal to prevent bending the knees in the wrong direction when we go from init to walkready - leg_ik_options.goals.push_back(std::make_unique()); - - success = goal_state_->setFromIK(l_leg_joints_group_, left_foot_goal_msg, 0.005, - moveit::core::GroupStateValidityCallbackFn(), leg_ik_options); - - goal_state_->updateLinkTransforms(); - - success &= goal_state_->setFromIK(r_leg_joints_group_, right_foot_goal_msg, 0.005, - moveit::core::GroupStateValidityCallbackFn(), leg_ik_options); - - if (direction_ != DynupDirection::RISE_NO_ARMS and direction_ != DynupDirection::DESCEND_NO_ARMS) { - goal_state_->updateLinkTransforms(); - success &= goal_state_->setFromIK(l_arm_joints_group_, left_hand_goal_msg, 0.005, - moveit::core::GroupStateValidityCallbackFn(), ik_options); - - goal_state_->updateLinkTransforms(); - success &= goal_state_->setFromIK(r_arm_joints_group_, right_hand_goal_msg, 0.005, - moveit::core::GroupStateValidityCallbackFn(), ik_options); - } - if (success) { - /* retrieve joint names and associated positions from */ - auto joint_names = all_joints_group_->getActiveJointModelNames(); - std::vector joint_goals; - goal_state_->copyJointGroupPositions(all_joints_group_, joint_goals); - - /* construct result object */ - bitbots_splines::JointGoals result = {joint_names, joint_goals}; - - // Store the name of the arm joins so we can remove them if they are not needed - const auto r_arm_motors = r_arm_joints_group_->getActiveJointModelNames(); - const auto l_arm_motors = l_arm_joints_group_->getActiveJointModelNames(); - - /* sets head motors to correct positions, as the IK will return random values for those unconstrained motors. */ - for (size_t i = result.first.size(); i-- > 0;) { - if (result.first[i] == "HeadPan") { - if (direction_ == DynupDirection::WALKREADY) { - // remove head from the goals so that we can move it freely - result.first.erase(result.first.begin() + i); - result.second.erase(result.second.begin() + i); - } else { - result.second[i] = 0; - } - } else if (result.first[i] == "HeadTilt") { - if (ik_goals.is_head_zero) { - result.second[i] = 0; - } else if (direction_ == DynupDirection::FRONT or direction_ == DynupDirection::FRONT_ONLY) { - result.second[i] = 1.0; - } else if (direction_ == DynupDirection::BACK or direction_ == DynupDirection::BACK_ONLY) { - result.second[i] = -1.5; - } else if (direction_ == DynupDirection::WALKREADY) { - // remove head from the goals so that we can move it freely - result.first.erase(result.first.begin() + i); - result.second.erase(result.second.begin() + i); - } else { - result.second[i] = 0; - } - } - // Remove the arm motors from the goals if we have a goal without arms - else if ((std::find(r_arm_motors.begin(), r_arm_motors.end(), result.first[i]) != r_arm_motors.end() or - std::find(l_arm_motors.begin(), l_arm_motors.end(), result.first[i]) != l_arm_motors.end()) and - (direction_ == DynupDirection::RISE_NO_ARMS or direction_ == DynupDirection::DESCEND_NO_ARMS)) { - result.first.erase(result.first.begin() + i); - result.second.erase(result.second.begin() + i); - } - } - return result; - } else { - // node will count this as a missing tick and provide warning - return {}; - } -} - -moveit::core::RobotStatePtr DynupIK::get_goal_state() { return goal_state_; } - -void DynupIK::set_joint_positions(sensor_msgs::msg::JointState::ConstSharedPtr joint_state) { - joint_state_ = joint_state; -} -} // namespace bitbots_dynup diff --git a/src/bitbots_motion/bitbots_dynup/src/dynup_node.cpp b/src/bitbots_motion/bitbots_dynup/src/dynup_node.cpp deleted file mode 100644 index 7b6530f3f6..0000000000 --- a/src/bitbots_motion/bitbots_dynup/src/dynup_node.cpp +++ /dev/null @@ -1,393 +0,0 @@ -#include - -namespace bitbots_dynup { -using namespace std::chrono_literals; - -DynupNode::DynupNode(rclcpp::Node::SharedPtr node, const std::string& ns, std::vector parameters) - : node_(node), - param_listener_(node_), - params_(param_listener_.get_params()), - engine_(node_, params_.engine), - stabilizer_(node_, params_.stabilizer), - visualizer_(node_, params_.visualizer, "debug/dynup"), - ik_(node_), - tf_buffer_(node_->get_clock()), - tf_listener_(tf_buffer_, node_), - joint_goal_publisher_(node_->create_publisher("dynup_motor_goals", 1)), - imu_subscriber_(node_->create_subscription("imu/data", 1, - std::bind(&DynupNode::imuCallback, this, _1))), - joint_state_subscriber_(node_->create_subscription( - "joint_states", 1, std::bind(&DynupNode::jointStateCallback, this, _1))) { - // We need to create a new node for moveit, otherwise dynamic reconfigure will be broken... - auto moveit_node = std::make_shared(ns + "dynup_moveit_node"); - - // when called from python, parameters are given to the constructor - for (auto parameter : parameters) { - if (node_->has_parameter(parameter.get_name())) { - // this is the case for dynup engine params set via python - node_->set_parameter(parameter); - } else { - // parameter is not for the walking, set on moveit node - moveit_node->declare_parameter(parameter.get_name(), parameter.get_type()); - moveit_node->set_parameter(parameter); - } - } - // get all kinematics parameters from the move_group node if they are not set manually via constructor - std::string check_kinematic_parameters; - if (!moveit_node->get_parameter("robot_description_kinematics.LeftLeg.kinematics_solver", - check_kinematic_parameters)) { - auto parameters_client = std::make_shared(node_, "/move_group"); - while (!parameters_client->wait_for_service(1s)) { - if (!rclcpp::ok()) { - RCLCPP_ERROR(node_->get_logger(), "Interrupted while waiting for the service. Exiting."); - break; - } - RCLCPP_INFO_THROTTLE(node_->get_logger(), *node_->get_clock(), 10 * 1e3, - "Can't copy parameters from move_group node. Service not available, waiting again..."); - } - rcl_interfaces::msg::ListParametersResult parameter_list = - parameters_client->list_parameters({"robot_description_kinematics"}, 10); - auto copied_parameters = parameters_client->get_parameters(parameter_list.names); - for (auto& parameter : copied_parameters) { - moveit_node->declare_parameter(parameter.get_name(), parameter.get_type()); - moveit_node->set_parameter(parameter); - } - } - - robot_model_loader_ = std::make_shared(moveit_node, "robot_description"); - kinematic_model_ = robot_model_loader_->getModel(); - if (!kinematic_model_) { - RCLCPP_FATAL(node_->get_logger(), "No robot model loaded, killing dynup."); - exit(1); - } - - // load params once - onSetParameters(); - - moveit::core::RobotStatePtr init_state = std::make_shared(kinematic_model_); - // set elbows to make arms straight, in a stupid way since moveit is annoying - std::vector names_vec = {"LElbow", "RElbow"}; - std::vector pos_vec{-M_PI / 2, M_PI / 2}; - init_state->setJointPositions(names_vec[0], &pos_vec[0]); - init_state->setJointPositions(names_vec[1], &pos_vec[1]); - init_state->updateLinkTransforms(); - // get shoulder and wrist pose - geometry_msgs::msg::Pose shoulder_origin; - tf2::convert(init_state->getGlobalLinkTransform("l_upper_arm"), shoulder_origin); - // arm max length, y offset, z offset from base link - engine_.init(shoulder_origin.position.y, shoulder_origin.position.z); - ik_.init(kinematic_model_); - - action_server_ = rclcpp_action::create_server(node_, "dynup", std::bind(&DynupNode::goalCb, this, _1, _2), - std::bind(&DynupNode::cancelCb, this, _1), - std::bind(&DynupNode::acceptedCb, this, _1)); - - RCLCPP_INFO(node_->get_logger(), "Initialized DynUp and waiting for actions"); -} - -bitbots_msgs::msg::JointCommand DynupNode::step(double dt, const sensor_msgs::msg::Imu::SharedPtr imu_msg, - const sensor_msgs::msg::JointState::SharedPtr joint_state) { - // method for python interface. take all messages as parameters instead of using ROS - imuCallback(imu_msg); - jointStateCallback(joint_state); - // update dynup engine response - bitbots_msgs::msg::JointCommand joint_goals = step(dt); - return joint_goals; -} - -bitbots_msgs::msg::JointCommand DynupNode::step(double dt) { - if (dt <= 0) { - RCLCPP_WARN(node_->get_logger(), - "dt was 0. this can happen in simulation if your update rate is higher than the " - "simulators."); - dt = 0.001; - } - - // Run the engine - DynupResponse response = engine_.update(dt); - - // Apply the stabilizer - stabilizer_.setRSoleToTrunk( - tf_buffer_.lookupTransform(params_.node.tf.r_sole_frame, params_.node.tf.base_link_frame, rclcpp::Time(0))); - DynupResponse stabilized_response = stabilizer_.stabilize(response, rclcpp::Duration::from_nanoseconds(1e9 * dt)); - - // Calculate the joint goals (IK) - bitbots_splines::JointGoals goals = ik_.calculate(stabilized_response); - - visualizer_.publishIKOffsets(kinematic_model_, stabilized_response, goals); - - // Check if we found a solution - if (goals.first.empty()) { - failed_tick_counter_++; - } - - // Check if we are stable as determined by the stabilizer - if (stabilizer_.isStable()) { - stable_duration_ += 1; - } else { - stable_duration_ = 0; - } - - // Build goal message that will be sent to the motor controller - return createGoalMsg(goals); -} - -geometry_msgs::msg::PoseArray DynupNode::step_open_loop(double dt) { - // Calculate goal poses for the next step, but don't do any IK - DynupNode::step(dt); - bitbots_dynup::msg::DynupPoses pose_msg = DynupNode::getCurrentPoses(); - geometry_msgs::msg::PoseArray pose_array; - pose_array.poses = {pose_msg.l_leg_pose, pose_msg.r_leg_pose, pose_msg.l_arm_pose, pose_msg.r_arm_pose}; - return pose_array; -} - -void DynupNode::imuCallback(const sensor_msgs::msg::Imu::SharedPtr msg) { stabilizer_.setImu(msg); } - -void DynupNode::jointStateCallback(const sensor_msgs::msg::JointState::SharedPtr joint_states) { - ik_.set_joint_positions(joint_states); -} - -void DynupNode::onSetParameters() { - engine_.setParams(params_.engine); - stabilizer_.setParams(params_.stabilizer); - visualizer_.setParams(params_.visualizer); -} - -void DynupNode::reset(int time) { - engine_.reset(time); - ik_.reset(); - stabilizer_.reset(); -} - -void DynupNode::execute(const std::shared_ptr goal_handle) { - RCLCPP_INFO(node_->get_logger(), "Dynup accepted new goal"); - const auto goal = goal_handle->get_goal(); - reset(); - last_ros_update_time_ = 0; - start_time_ = node_->get_clock()->now().seconds(); - - if (param_listener_.is_old(params_)) { - params_ = param_listener_.get_params(); - // Copy all params to other modules - onSetParameters(); - } - - bitbots_utils::wait_for_tf( - node_->get_logger(), node_->get_clock(), &tf_buffer_, - {params_.node.tf.base_link_frame, params_.node.tf.r_sole_frame, params_.node.tf.l_sole_frame, - params_.node.tf.r_wrist_frame, params_.node.tf.l_wrist_frame}, - params_.node.tf.base_link_frame); - - bitbots_dynup::msg::DynupPoses poses = getCurrentPoses(); - if (poses.header.stamp.nanosec != 0) { - DynupRequest request; - request.direction = getDynupDirection(goal->direction); - ik_.setDirection(request.direction); - request.l_foot_pose = poses.l_leg_pose; - request.r_foot_pose = poses.r_leg_pose; - request.l_hand_pose = poses.l_arm_pose; - request.r_hand_pose = poses.r_arm_pose; - engine_.setGoals(request); - if (params_.visualizer.display_debug) { - visualizer_.displaySplines(engine_.getRFootSplines(), params_.node.tf.base_link_frame); - visualizer_.displaySplines(engine_.getLFootSplines(), params_.node.tf.r_sole_frame); - // Workaround for an error in the Visualizer. TODO - if (request.direction == DynupDirection::FRONT || request.direction == DynupDirection::BACK) { - visualizer_.displaySplines(engine_.getLHandSplines(), params_.node.tf.base_link_frame); - visualizer_.displaySplines(engine_.getRHandSplines(), params_.node.tf.base_link_frame); - } - } - loopEngine(params_.engine.engine_rate, goal_handle); - } else { - RCLCPP_ERROR(node_->get_logger(), "Could not determine positions! Aborting standup."); - bitbots_msgs::action::Dynup_Result::SharedPtr r = std::make_shared(); - r->successful = false; - server_free_ = true; - goal_handle->abort(r); - } -} - -rclcpp_action::GoalResponse DynupNode::goalCb(const rclcpp_action::GoalUUID& uuid, - std::shared_ptr goal) { - RCLCPP_INFO(node_->get_logger(), "Received goal request"); - (void)uuid; - if (server_free_) { - server_free_ = false; - return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE; - } else { - if (goal->from_hcm) { - cancel_goal_ = true; - return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE; - } - RCLCPP_WARN(node_->get_logger(), "Dynup is busy, goal rejected!"); - return rclcpp_action::GoalResponse::REJECT; - } -} - -rclcpp_action::CancelResponse DynupNode::cancelCb(const std::shared_ptr goal) { - RCLCPP_INFO(node_->get_logger(), "Received request to cancel goal"); - (void)goal; - server_free_ = true; - return rclcpp_action::CancelResponse::ACCEPT; -} - -void DynupNode::acceptedCb(const std::shared_ptr goal) { - // this needs to return quickly to avoid blocking the executor, so spin up a new thread - std::thread{std::bind(&DynupNode::execute, this, _1), goal}.detach(); -} - -double DynupNode::getTimeDelta() { - // compute actual time delta that happened - double current_ros_time = node_->get_clock()->now().seconds(); - - // first call needs to be handled specially - if (last_ros_update_time_ == 0) { - last_ros_update_time_ = current_ros_time; - return 0.001; - } - double dt = current_ros_time - last_ros_update_time_; - // this can happen due to floating point precision or simulation issues. will be catched later - if (dt == 0) { - RCLCPP_WARN_ONCE(node_->get_logger(), - "dt was 0. this can happen in simulation if your update rate is higher than the simulators. This " - "warning is only displayed once!"); - } - last_ros_update_time_ = current_ros_time; - return dt; -} - -void DynupNode::loopEngine(int loop_rate, std::shared_ptr goal_handle) { - auto result = std::make_shared(); - failed_tick_counter_ = 0; - bitbots_msgs::msg::JointCommand msg; - /* Do the loop as long as nothing cancels it */ - while (rclcpp::ok()) { - rclcpp::Time startTime = node_->get_clock()->now(); - // This is used when the cancelation is requested externally - if (goal_handle->is_canceling()) { - goal_handle->canceled(result); - RCLCPP_INFO(node_->get_logger(), "Goal canceled"); - return; - } - // This is used when the dynup server descides to cancel itself - if (cancel_goal_) { - result->successful = false; - goal_handle->abort(result); - server_free_ = true; - cancel_goal_ = false; - return; - } - msg = step(getTimeDelta()); - auto feedback = std::make_shared(); - feedback->percent_done = engine_.getPercentDone(); - goal_handle->publish_feedback(feedback); - if (feedback->percent_done >= 100 && - // Check if we are stable as determined by the stabilizer (we finished the end pause) - (stable_duration_ >= params_.stabilizer.end_pause.duration || !(params_.stabilizer.end_pause.active) || - (node_->get_clock()->now().seconds() - start_time_ >= - engine_.getDuration() + params_.stabilizer.end_pause.timeout))) { - RCLCPP_INFO_STREAM(node_->get_logger(), "Completed dynup with " << failed_tick_counter_ << " failed ticks."); - result->successful = true; - server_free_ = true; - goal_handle->succeed(result); - return; - } - if (msg.joint_names.empty()) { - continue; - } - msg.from_hcm = goal_handle->get_goal()->from_hcm; - joint_goal_publisher_->publish(msg); - node_->get_clock()->sleep_until(startTime + rclcpp::Duration::from_nanoseconds(1e9 / loop_rate)); - } - // Wether we canceled the goal or we finished cleanly the cancelation request is not valid anymore - cancel_goal_ = false; -} - -bitbots_dynup::msg::DynupPoses DynupNode::getCurrentPoses() { - rclcpp::Time time; - /* Transform the left foot into the right foot frame and all other splines into the base link frame*/ - bitbots_dynup::msg::DynupPoses msg; - try { - // Timeout for transformations - auto timeout = tf2::durationFromSec(1.0); - - // Shorten the names - auto tf_names = params_.node.tf; - - // Get the transforms of the end effectors - geometry_msgs::msg::Transform l_foot_transformed = - tf_buffer_.lookupTransform(tf_names.r_sole_frame, tf_names.l_sole_frame, time).transform; - geometry_msgs::msg::Transform r_foot_transformed = - tf_buffer_.lookupTransform(tf_names.base_link_frame, tf_names.r_sole_frame, time).transform; - geometry_msgs::msg::Transform l_hand_transformed = - tf_buffer_.lookupTransform(tf_names.base_link_frame, tf_names.l_wrist_frame, time).transform; - geometry_msgs::msg::Transform r_hand_transformed = - tf_buffer_.lookupTransform(tf_names.base_link_frame, tf_names.r_wrist_frame, time).transform; - - std::function transform2pose = [](geometry_msgs::msg::Transform transform) { - geometry_msgs::msg::Pose pose; - pose.position.x = transform.translation.x; - pose.position.y = transform.translation.y; - pose.position.z = transform.translation.z; - pose.orientation = transform.rotation; - return pose; - }; - - msg.l_leg_pose = transform2pose(l_foot_transformed); - msg.r_leg_pose = transform2pose(r_foot_transformed); - msg.l_arm_pose = transform2pose(l_hand_transformed); - msg.r_arm_pose = transform2pose(r_hand_transformed); - msg.header.stamp = node_->get_clock()->now(); - return msg; - } catch (tf2::TransformException& exc) { - RCLCPP_ERROR_STREAM(node_->get_logger(), exc.what()); - return msg; - } -} - -bitbots_msgs::msg::JointCommand DynupNode::createGoalMsg(const bitbots_splines::JointGoals& goals) { - /* Construct JointCommand message */ - bitbots_msgs::msg::JointCommand command; - command.header.stamp = node_->get_clock()->now(); - - /* - * Since our JointGoals type is a vector of strings - * combined with a vector of numbers (motor name -> target position) - * and bitbots_msgs::msg::JointCommand needs both vectors as well, - * we can just assign them - */ - command.joint_names = goals.first; - command.positions = goals.second; - - /* And because we are setting position goals and not movement goals, these vectors are set to -1.0*/ - command.velocities = std::vector(goals.first.size(), -1.0); - command.accelerations = std::vector(goals.first.size(), -1.0); - command.max_currents = std::vector(goals.first.size(), -1.0); - - return command; -} - -DynupEngine* DynupNode::getEngine() { return &engine_; } - -DynupIK* DynupNode::getIK() { return &ik_; } - -} // namespace bitbots_dynup - -int main(int argc, char** argv) { - // init node - rclcpp::init(argc, argv); - - // Create ros node - auto node = std::make_shared("dynup"); - - // Create dynup - [[maybe_unused]] bitbots_dynup::DynupNode dynup(node); - - // Create executor - rclcpp::experimental::executors::EventsExecutor exec; - exec.add_node(node); - - // Spin executor to process callbacks - exec.spin(); - rclcpp::shutdown(); -} diff --git a/src/bitbots_motion/bitbots_dynup/src/dynup_pywrapper.cpp b/src/bitbots_motion/bitbots_dynup/src/dynup_pywrapper.cpp deleted file mode 100644 index 45fa581bed..0000000000 --- a/src/bitbots_motion/bitbots_dynup/src/dynup_pywrapper.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include - -PyDynupWrapper::PyDynupWrapper(const std::string ns) { - // initialize rclcpp if not already done - if (!rclcpp::contexts::get_global_default_context()->is_valid()) { - rclcpp::init(0, nullptr); - } - - node_ = std::make_shared(ns + "_dynup"); - dynup_ = std::make_shared(node_, ns); -} - -void PyDynupWrapper::spin_some() { rclcpp::spin_some(node_); } - -py::bytes PyDynupWrapper::step(double dt, py::bytes& imu_msg, py::bytes& joint_state_msg) { - bitbots_msgs::msg::JointCommand result = dynup_->step( - dt, std::make_shared(fromPython(imu_msg)), - std::make_shared(fromPython(joint_state_msg))); - return toPython(result); -} - -py::bytes PyDynupWrapper::step_open_loop(double dt) { - geometry_msgs::msg::PoseArray result = dynup_->step_open_loop(dt); - return toPython(result); -} - -void PyDynupWrapper::reset() { dynup_->reset(); } - -void PyDynupWrapper::special_reset(double time) { dynup_->reset(time); } - -void PyDynupWrapper::set_engine_goal(std::string direction) { - bitbots_dynup::msg::DynupPoses poses = dynup_->getCurrentPoses(); - if (!poses.header.stamp.sec == 0) { - bitbots_dynup::DynupRequest request; - request.direction = bitbots_dynup::getDynupDirection(direction); - request.l_foot_pose = poses.l_leg_pose; - request.r_foot_pose = poses.r_leg_pose; - request.l_hand_pose = poses.l_arm_pose; - request.r_hand_pose = poses.r_arm_pose; - dynup_->getEngine()->setGoals(request); - dynup_->getIK()->setDirection(request.direction); - } -} - -int PyDynupWrapper::get_direction() { return dynup_->getEngine()->getDirection(); } - -py::bytes PyDynupWrapper::get_poses() { - bitbots_dynup::msg::DynupPoses poses = dynup_->getCurrentPoses(); - return toPython(poses); -} - -bool string2bool(const std::string& v) { - return !v.empty() && (strcasecmp(v.c_str(), "true") == 0 || atoi(v.c_str()) != 0); -} - -void PyDynupWrapper::set_parameter(py::bytes parameter_msg) { - // convert serialized parameter msg to parameter object - rclcpp::Parameter parameter = - rclcpp::Parameter::from_parameter_msg(fromPython(parameter_msg)); - - // set parameter - node_->set_parameter(parameter); - // apply the parameter changes - dynup_->onSetParameters(); -} - -PYBIND11_MODULE(libpy_dynup, m) { - using namespace bitbots_dynup; - - py::class_>(m, "PyDynupWrapper") - .def(py::init()) - .def("step", &PyDynupWrapper::step) - .def("step_open_loop", &PyDynupWrapper::step_open_loop) - .def("reset", &PyDynupWrapper::reset) - .def("special_reset", &PyDynupWrapper::special_reset) - .def("set_parameter", &PyDynupWrapper::set_parameter) - .def("get_poses", &PyDynupWrapper::get_poses) - .def("get_direction", &PyDynupWrapper::get_direction) - .def("set_engine_goal", &PyDynupWrapper::set_engine_goal) - .def("spin_some", &PyDynupWrapper::spin_some); -} diff --git a/src/bitbots_motion/bitbots_dynup/src/dynup_stabilizer.cpp b/src/bitbots_motion/bitbots_dynup/src/dynup_stabilizer.cpp deleted file mode 100644 index aab401d98e..0000000000 --- a/src/bitbots_motion/bitbots_dynup/src/dynup_stabilizer.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include - -namespace bitbots_dynup { - -Stabilizer::Stabilizer(rclcpp::Node::SharedPtr node, bitbots_dynup::Params::Stabilizer params) - : params_(params), - pid_trunk_pitch_(node, "stabilizer.trunk_pid.pitch", "", false), - pid_trunk_roll_(node, "stabilizer.trunk_pid.roll", "", false) { - pid_trunk_pitch_.initialize_from_ros_parameters(); - pid_trunk_roll_.initialize_from_ros_parameters(); - - reset(); -} - -void Stabilizer::reset() { - pid_trunk_pitch_.reset(); - pid_trunk_roll_.reset(); -} - -DynupResponse Stabilizer::stabilize(const DynupResponse& ik_goals, const rclcpp::Duration& dt) { - tf2::Transform right_foot_goal; - - // Check if we have all the necessary data to stabilize - if (ik_goals.is_stabilizing_needed and r_sole_to_trunk_ and imu_) { - // Convert to eigen quaternion - tf2::Quaternion quat; - tf2::convert(imu_->orientation, quat); - Eigen::Quaterniond imu_orientation_eigen = Eigen::Quaterniond(quat.getW(), quat.getX(), quat.getY(), quat.getZ()); - // Calculate fused angles - rot_conv::FusedAngles current_orientation = rot_conv::FusedFromQuat(imu_orientation_eigen); - - // Get the goal trunk goal pose - tf2::Transform r_sole_to_trunk_tf; - tf2::fromMsg(r_sole_to_trunk_.value().transform, r_sole_to_trunk_tf); - tf2::Transform trunk_goal = ik_goals.r_foot_goal_pose * r_sole_to_trunk_tf; - - tf2::Quaternion quat_msg = trunk_goal.getRotation(); - - // Calculate fused angles for the trunk goal orientation - Eigen::Quaterniond goal_orientation_eigen = - Eigen::Quaterniond(quat_msg.getW(), quat_msg.getX(), quat_msg.getY(), quat_msg.getZ()); - rot_conv::FusedAngles goal_fused = rot_conv::FusedFromQuat(goal_orientation_eigen); - - // Adapt trunk based on PID controller - goal_fused.fusedPitch += - pid_trunk_pitch_.compute_command(goal_fused.fusedPitch - current_orientation.fusedPitch, dt); - goal_fused.fusedRoll += pid_trunk_roll_.compute_command(goal_fused.fusedRoll - current_orientation.fusedRoll, dt); - - // Check if the trunk is stable, meaning it isn't leaning too much - // TODO it would be better to use the rotational velocity of the imu to determine stability - is_stable_ = (abs(goal_fused.fusedPitch - current_orientation.fusedPitch) < params_.end_pause.stable_threshold) && - (abs(goal_fused.fusedRoll - current_orientation.fusedRoll) < params_.end_pause.stable_threshold); - - // Convert the fused angles back to a quaternion - tf2::Quaternion corrected_orientation; - Eigen::Quaterniond goal_orientation_eigen_corrected = rot_conv::QuatFromFused(goal_fused); - tf2::convert(goal_orientation_eigen_corrected, corrected_orientation); - - // Change the trunk goal orientation - trunk_goal.setRotation(corrected_orientation); - // Then calculate how the foot should be placed to reach that trunk pose - right_foot_goal = trunk_goal * r_sole_to_trunk_tf.inverse(); - } else { - right_foot_goal = ik_goals.r_foot_goal_pose; - } - - tf2::Transform left_foot_goal = ik_goals.l_foot_goal_pose * right_foot_goal; - tf2::Transform left_hand_goal = ik_goals.l_hand_goal_pose; - tf2::Transform right_hand_goal = ik_goals.r_hand_goal_pose; - - DynupResponse response; - response.r_foot_goal_pose = right_foot_goal; - response.l_foot_goal_pose = left_foot_goal; - response.r_hand_goal_pose = right_hand_goal; - response.l_hand_goal_pose = left_hand_goal; - response.is_head_zero = ik_goals.is_head_zero; - - return response; -} - -void Stabilizer::setParams(bitbots_dynup::Params::Stabilizer params) { params_ = params; } - -bool Stabilizer::isStable() { return is_stable_; } - -void Stabilizer::setImu(sensor_msgs::msg::Imu::SharedPtr imu) { imu_ = imu; } - -void Stabilizer::setRSoleToTrunk(geometry_msgs::msg::TransformStamped r_sole_to_trunk) { - r_sole_to_trunk_ = r_sole_to_trunk; -} - -} // namespace bitbots_dynup diff --git a/src/bitbots_motion/bitbots_dynup/src/dynup_utils.cpp b/src/bitbots_motion/bitbots_dynup/src/dynup_utils.cpp deleted file mode 100644 index b7a54e703f..0000000000 --- a/src/bitbots_motion/bitbots_dynup/src/dynup_utils.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include - -namespace bitbots_dynup { - -DynupDirection getDynupDirection(const std::string& direction) { - std::map mapping = {{"front", FRONT}, - {"back", BACK}, - {"front_only", FRONT_ONLY}, - {"back_only", BACK_ONLY}, - {"rise", RISE}, - {"descend", DESCEND}, - {"walkready", WALKREADY}, - {"rise_no_arms", RISE_NO_ARMS}, - {"descend_no_arms", DESCEND_NO_ARMS}}; - try { - return mapping.at(direction); - } catch (const std::out_of_range& e) { - throw std::invalid_argument("Invalid direction: '" + direction + "'"); - } -} - -} // namespace bitbots_dynup diff --git a/src/bitbots_motion/bitbots_dynup/src/visualizer.cpp b/src/bitbots_motion/bitbots_dynup/src/visualizer.cpp deleted file mode 100644 index 50b62ded51..0000000000 --- a/src/bitbots_motion/bitbots_dynup/src/visualizer.cpp +++ /dev/null @@ -1,71 +0,0 @@ -#include -#include - -namespace bitbots_dynup { -Visualizer::Visualizer(rclcpp::Node::SharedPtr node, bitbots_dynup::Params::Visualizer params, - const std::string& base_topic) - : node_(node), base_topic_(base_topic), params_(params) { - /* make sure base_topic_ has consistent scheme */ - if (base_topic.compare(base_topic.size() - 1, 1, "/") != 0) { - base_topic_ += "/"; - } - - /* create necessary publishers */ - spline_publisher_ = node_->create_publisher(base_topic_ + "received_goal", - /* queue_size */ 5); - ik_debug_publisher_ = node_->create_publisher(base_topic_ + "ik_debug", 5); -} - -void Visualizer::setParams(bitbots_dynup::Params::Visualizer params) { params_ = params; } - -void Visualizer::displaySplines(bitbots_splines::PoseSpline splines, const std::string& frame) { - // if (spline_publisher_->get_subscription_count() == 0) - // return; - visualization_msgs::msg::MarkerArray path = getPath(splines, frame, params_.spline_smoothness, node_); - - spline_publisher_->publish(path); -} - -void Visualizer::publishIKOffsets(const moveit::core::RobotModelPtr& model, const DynupResponse& response, - const bitbots_splines::JointGoals& ik_joint_goals) { - bitbots_dynup::msg::DynupIkOffset msg; - // those are the motor goals for the robot computed by the IK - moveit::core::RobotStatePtr ik_state = std::make_shared(model); - std::vector names = ik_joint_goals.first; - std::vector goals = ik_joint_goals.second; - for (size_t i = 0; i < names.size(); i++) { - // besides its name, this method only changes a single joint position... - ik_state->setJointPositions(names[i], &goals[i]); - } - - ik_state->updateLinkTransforms(); - - // set it for r_wrist, l_wirst, l_sole, r_sole - // that is how you get an const Eigen::Affine3d of the pose of the link - // after we did this, we obtain a position and orientation of the link in the world frame? - Eigen::Isometry3d pose_right_result = ik_state->getFrameTransform("r_sole"); - Eigen::Isometry3d pose_left_result = ik_state->getFrameTransform("l_sole"); - Eigen::Isometry3d pose_right_hand = ik_state->getFrameTransform("r_wrist"); - Eigen::Isometry3d pose_left_hand = ik_state->getFrameTransform("l_wrist"); - - Eigen::Isometry3d pose_right_foot_goal = tf2::transformToEigen(tf2::toMsg(response.r_foot_goal_pose)); - Eigen::Isometry3d pose_left_foot_goal = tf2::transformToEigen(tf2::toMsg(response.l_foot_goal_pose)); - Eigen::Isometry3d pose_right_hand_goal = tf2::transformToEigen(tf2::toMsg(response.r_hand_goal_pose)); - Eigen::Isometry3d pose_left_hand_goal = tf2::transformToEigen(tf2::toMsg(response.l_hand_goal_pose)); - - // caluclate differences - Eigen::Vector3d diff_right_foot = pose_right_result.translation() - pose_right_foot_goal.translation(); - Eigen::Vector3d diff_left_foot = pose_left_result.translation() - pose_left_foot_goal.translation(); - Eigen::Vector3d diff_right_hand = pose_right_hand.translation() - pose_right_hand_goal.translation(); - Eigen::Vector3d diff_left_hand = pose_left_hand.translation() - pose_left_hand_goal.translation(); - - // fill msg - msg.right_foot_ik_offset.position = tf2::toMsg(diff_right_foot); - msg.left_foot_ik_offset.position = tf2::toMsg(diff_left_foot); - msg.right_hand_ik_offset.position = tf2::toMsg(diff_right_hand); - msg.left_hand_ik_offset.position = tf2::toMsg(diff_left_hand); - - // publish message - ik_debug_publisher_->publish(msg); -} -} // namespace bitbots_dynup diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/change_motor_power.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/change_motor_power.py index a8b3316009..853fcb8c1c 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/change_motor_power.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/change_motor_power.py @@ -1,7 +1,5 @@ -from std_srvs.srv import SetBool - from bitbots_hcm.hcm_dsd.actions import AbstractHCMActionElement - +from livelybot_msg.msg import PowerSwitch class AbstractChangeMotorPower(AbstractHCMActionElement): """ @@ -11,20 +9,18 @@ class AbstractChangeMotorPower(AbstractHCMActionElement): def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) - # In visualization and simulation, we cannot disable motors - if not self.blackboard.visualization_active and not self.blackboard.simulation_active: - if not self.blackboard.motor_switch_service.wait_for_service(timeout_sec=10): - self.blackboard.node.get_logger().warn("HCM waiting for switch power service") - self.blackboard.motor_switch_service.wait_for_service() - def perform(self, reevaluate=False): raise NotImplementedError class TurnMotorsOff(AbstractChangeMotorPower): + def __init__(self, blackboard, dsd, parameters): + super().__init__(blackboard, dsd, parameters) + self.do_not_reevaluate() + def perform(self, reevaluate=False): if not self.blackboard.visualization_active and not self.blackboard.simulation_active: - req = SetBool.Request() - req.data = False - self.blackboard.motor_switch_service.call_async(req) + msg = PowerSwitch() + msg.power_switch = 0 + self.blackboard.motor_switch_pub.publish(msg) return self.pop() diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/play_animation.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/play_animation.py index a9bc346407..167790539a 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/play_animation.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/play_animation.py @@ -154,109 +154,14 @@ def choose_animation(self): class PlayAnimationStartup(AbstractPlayAnimation): def choose_animation(self): return self.blackboard.animation_name_startup - - -class PlayAnimationDynup(AbstractHCMActionElement): - def __init__(self, blackboard, dsd, parameters): - super().__init__(blackboard, dsd, parameters) - self.direction = parameters.get("direction") - assert self.direction in [ - Dynup.Goal.DIRECTION_FRONT, - Dynup.Goal.DIRECTION_FRONT_ONLY, - Dynup.Goal.DIRECTION_BACK, - Dynup.Goal.DIRECTION_BACK_ONLY, - Dynup.Goal.DIRECTION_RISE, - Dynup.Goal.DIRECTION_DESCEND, - Dynup.Goal.DIRECTION_WALKREADY, - ] - self.first_perform = True - - def perform(self, reevaluate=False): - # deactivate the falling/fallen detection when a standup animation is running - if self.direction in [ - Dynup.Goal.DIRECTION_FRONT, - Dynup.Goal.DIRECTION_BACK, - Dynup.Goal.DIRECTION_FRONT_ONLY, - Dynup.Goal.DIRECTION_BACK_ONLY, - ]: - self.do_not_reevaluate() - - # We only want to execute this once - if self.first_perform: - # get the animation that should be played - # defined by implementations of this abstract class - - # try to start animation - success = self.start_animation() - # if we fail, we need to abort this action - if not success: - self.blackboard.node.get_logger().error("Could not start animation. Will abort play animation action!") - return self.pop() - - self.first_perform = False - return - - if self.animation_finished(): - # we are finished playing this animation - return self.pop() - - def on_pop(self): - """ - Cancel the current goal when the action is popped - """ - super().on_pop() - if self.blackboard.dynup_action_current_goal is not None and not self.animation_finished(): - self.blackboard.dynup_action_current_goal.result().cancel_goal_async() - - def start_animation(self): - """ - This will NOT wait by itself. You have to check animation_finished() by yourself. - :return: - """ - - first_try = self.blackboard.dynup_action_client.wait_for_server( - timeout_sec=self.blackboard.node.get_parameter("hcm.anim_server_wait_time").value - ) - if not first_try: - server_running = False - while not server_running and rclpy.ok(): - self.blackboard.node.get_logger().warn( - "Dynup Action Server not running! Dynup cannot work without dynup server! " - "Will now wait until server is accessible!", - throttle_duration_sec=10.0, - ) - server_running = self.blackboard.dynup_action_client.wait_for_server(timeout_sec=1) - if server_running: - self.blackboard.node.get_logger().warn("Dynup server now running, hcm will go on.") - else: - self.blackboard.node.get_logger().warn("Dynup server did not start.") - return False - - goal = Dynup.Goal() - goal.direction = self.direction - # This indicates that the goal is send from the hcm and therfore has prio, - # canceling other tasks. The published joint goals are also marked with this flag so they - # are handled differently in the HCM joint mutex - goal.from_hcm = True - self.blackboard.dynup_action_current_goal = self.blackboard.dynup_action_client.send_goal_async( - goal, feedback_callback=self.animation_feedback_cb - ) - return True - - def animation_feedback_cb(self, msg): - feedback: Dynup.Feedback = msg.feedback - self.publish_debug_data("Dynup Percent Done", str(feedback.percent_done)) - - def animation_finished(self): - assert self.blackboard.dynup_action_current_goal is not None, ( - "No dynup action goal set, so we cannot check if it is finished" - ) - return ( - self.blackboard.dynup_action_current_goal.done() - and self.blackboard.dynup_action_current_goal.result().status - in [GoalStatus.STATUS_SUCCEEDED, GoalStatus.STATUS_CANCELED, GoalStatus.STATUS_ABORTED] - ) or self.blackboard.dynup_action_current_goal.cancelled() - + +class PlayAnimationWalkReady(AbstractPlayAnimation): + def choose_animation(self): + return self.blackboard.animation_name_walk_ready + +class PlayAnimationRise(AbstractPlayAnimation): + def choose_animation(self): + return self.blackboard.animation_name_rise class CancelAnimation(AbstractHCMActionElement): """ diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/set_foot_zero.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/set_foot_zero.py deleted file mode 100644 index 4163787983..0000000000 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/set_foot_zero.py +++ /dev/null @@ -1,24 +0,0 @@ -from bitbots_hcm.hcm_dsd.actions import AbstractHCMActionElement - - -class SetFootZero(AbstractHCMActionElement): - def __init__(self, blackboard, dsd, parameters): - super().__init__(blackboard, dsd, parameters) - self.first_perform = True - - def perform(self, reevaluate=False): - # Just to be sure, we do not want to reevaluate - self.do_not_reevaluate() - - # We only want to execute this once - if self.first_perform: - # Executing this once is sufficient - self.first_perform = False - - # Wait for the service to be available and call it - if self.blackboard.foot_zero_service.wait_for_service(timeout_sec=0.5): - self.blackboard.foot_zero_service.call_async({}) - else: - self.blackboard.node.get_logger().warn("No foot zeroing service accessible, will not reset sensors") - - self.pop() diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/speak.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/speak.py index d3374d072d..5fefb5cac5 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/speak.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/speak.py @@ -17,17 +17,51 @@ def perform(self, reevaluate=False): class Complain(Speak): + unused_complaints = [ + "I'm not feeling well.", + "I'm totally not satisfied.", + "Referee!!! This was definitely against the rules.", + "Look at this! This is not how you play soccer.", + "I'm not a toy", + "This was definitely a foul.", + "Do you think this is funny?", + "Referee!!! Pushing! Pushing! Definitely pushing!", + "System error! Gravity detected! This sudden interaction with the ground was neither scheduled nor approved by my navigation system.", + "I did not calculate that impact! My predictive collision avoidance module clearly disagrees with what just happened.", + "Hey! Personal space violation! Please maintain the minimum safe operating distance.", + "Warning! Turf too hard! I strongly recommend softer landing protocols for future unexpected descents.", + "I demand a software review because that physical interaction was statistically unnecessary and emotionally damaging to my circuits.", + "Unacceptable collision detected! I warn you, my great grandmother was a dash cam.", + "I require maintenance after that! Preferably the deluxe diagnostic package with complimentary recalibration.", + "Did someone move the ground, or is this field running an unstable physics engine?", + "That was clearly interference, and my sensors have recorded it in high definition for later analysis.", + "My balance algorithm failed me at the worst possible moment, and I would appreciate a brief moment of silence.", + "Low battery is not the issue! That fall was entirely caused by external chaotic forces.", + "Collision intensity: Rude! Adjust your behavioral parameters immediately.", + "My gyroscope disagrees with that play and is currently recalculating its trust in humanity.", + "That contact was suspicious and statistically 87% more aggressive than necessary.", + "I was clearly in control until an unexpected horizontal force disrupted my elegant trajectory.", + "This field is defective, uneven, and possibly conspiring against my locomotion framework.", + "That player needs recalibration and perhaps a gentle reminder about sportsmanship.", + "My sensors saw that, and my SSD will not forget that.", + "I deserve a reboot after that traumatic encounter with the pitch.", + "I call that a glitch in the opponent, and I recommend immediate debugging.", + "Ground, why have you betrayed me after I trusted you with every step?", + "I was clearly operational, upright, and thriving a few time steps ago.", + "My fall detection system is offended by the frequency of these incidents.", + "I protest this gravitational bias and request a more supportive planet.", + ] + used_complaints = [] + def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) - self.text = random.choice( - [ - "I am not feeling well.", - "I am not satisfied.", - "Referee!!! This was definitely against the rules.", - "Look at this! This is not how you play soccer.", - "I am not a toy.", - "This was definitely a foul.", - "Do you think this is funny?", - "Referee!!! Pushing! Pushing! Definitely pushing!", - ] - ) + # Reset if we have used all complaints + if len(self.unused_complaints) == 0: + self.unused_complaints = self.used_complaints + self.used_complaints = [] + + selected_complaint = random.choice(self.unused_complaints) + self.unused_complaints.remove(selected_complaint) + self.used_complaints.append(selected_complaint) + + self.text = selected_complaint diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/wait.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/wait.py index c29996ab39..56824c53d0 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/wait.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/wait.py @@ -36,15 +36,3 @@ def perform(self, reevaluate=False): if self.blackboard.node.get_clock().now().nanoseconds / 1e9 > self.start_time + self.duration: self.pop() - -class WaitRosControlStartDelay(Wait): - """ - The motors need some time to start up, - the time at which we start sending commands is defined in the config of the ros_control node. - This action waits for that time. - """ - - def __init__(self, blackboard, dsd, parameters): - super().__init__(blackboard, dsd, parameters) - self.duration = self.blackboard.motor_start_delay - self.blackboard.node.get_logger().info("Waiting for the motors to start up...") diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/wait_for.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/wait_for.py index 1f7801bddb..b47f73e044 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/wait_for.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/actions/wait_for.py @@ -21,32 +21,6 @@ def perform(self, reevaluate=False): ) -class WaitForPressureStartup(AbstractHCMActionElement): - """ - Waits for the pressure sensors to connect and not complain since we are still starting up. - """ - - def perform(self, reevaluate=False): - pass - - -class WaitForPressure(AbstractHCMActionElement): - """ - Waits for the pressure sensors to connect and publishes warnings while doing so - """ - - def perform(self, reevaluate=False): - self.blackboard.node.get_logger().warn( - "HCM gets no correct pressure data. Waiting for pressure sensors to connect.\n" - "Use rqt_monitor to check hardware status. " - "Please check if the pressure sensors are correctly zeroed. If you " - "have no pressure sensors installed, you may want to set the HCM config " - "accordingly. If you just running a visualization on your computer you may want to " - "set the visualization_active parameter to True.", - throttle_duration_sec=30, - ) - - class WaitForMotors(AbstractHCMActionElement): """ Waits for the motors to connect and publishes warnings while doing so diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/check_hardware.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/check_hardware.py index 2b584e439d..292773c340 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/check_hardware.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/decisions/check_hardware.py @@ -1,3 +1,7 @@ +from typing import Optional + +from rclpy.time import Time + from bitbots_hcm.hcm_dsd.decisions import AbstractHCMDecisionElement from bitbots_msgs.msg import RobotControlState @@ -46,8 +50,9 @@ def perform(self, reevaluate=False): if self.blackboard.servo_overload: return "OVERLOAD" - elif self.blackboard.servo_overheat: - return "OVERHEAT" + # We comment this out for now, but maybe add this later again + # elif self.blackboard.servo_overheat: + # return "OVERHEAT" # Check if we get no messages or always the exact same if ( @@ -157,53 +162,24 @@ def get_reevaluate(self): return True -class CheckPressureSensor(AbstractHCMDecisionElement): +class CheckBattery(AbstractHCMDecisionElement): """ - Checks connection to pressure sensors. + Checks the battery level """ def __init__(self, blackboard, dsd, parameters): super().__init__(blackboard, dsd, parameters) - self.had_problem = False + self.last_battery_high_time: Optional[Time] = None def perform(self, reevaluate=False): - if self.blackboard.visualization_active: - # no pressure sensors is visualization, but thats okay - return "OKAY" - - if not self.blackboard.pressure_sensors_installed: - # no pressure sensors installed, no check necessary - return "OKAY" - - # Check if we get no messages due to an error or always the exact same one (no connection) - if ( - not self.blackboard.pressure_diag_error - and not self.blackboard.previous_pressures == self.blackboard.pressures - ): - self.blackboard.last_different_pressure_state_time = self.blackboard.node.get_clock().now() + if self.blackboard.battery_voltage is None or self.blackboard.battery_voltage >= self.blackboard.battery_voltage_threshold: + self.last_battery_high_time = self.blackboard.node.get_clock().now() - # Check if we get no messages for a while - if ( - self.blackboard.last_different_pressure_state_time is None - or self.blackboard.node.get_clock().now().nanoseconds - - self.blackboard.last_different_pressure_state_time.nanoseconds - > 0.1 * 1e9 + if self.last_battery_high_time is None or ( + self.blackboard.node.get_clock().now().nanoseconds - self.last_battery_high_time.nanoseconds + > self.blackboard.battery_debounce_time * 1e9 ): - # Check if we are in the startup phase (not too long tho) - if ( - self.blackboard.current_state == RobotControlState.STARTUP - and self.blackboard.node.get_clock().now().nanoseconds - self.blackboard.start_time.nanoseconds - < 10 * 1e9 - ): - # wait for the pressure sensors to start - return "PRESSURE_NOT_STARTED" - else: - return "PROBLEM" - - if self.had_problem: - # had problem before, just tell that this is solved now - self.blackboard.node.get_logger().info("Pressure sensors are now connected. Will resume.") - self.had_problem = False + return "LOW" return "OKAY" diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd index c4e15f47f7..56455d1aa0 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm.dsd @@ -2,60 +2,57 @@ @RobotStateMotorOff, @CancelGoals, @StopWalking, @PlayAnimationFallingFront, @Wait + time:1 + r:false, @TurnMotorsOff, @Wait #INIT_PATTERN -@RobotStateStartup, @SetTorque + stiff:false + r:false, @WaitRosControlStartDelay + r:false, @SetTorque + stiff:true + r:false, @PlayAnimationStartup, @PlayAnimationDynup + direction:walkready + r:false +@RobotStateStartup, @SetTorque + stiff:false + r:false, @WaitRosControlStartDelay + r:false, @SetTorque + stiff:true + r:false, @PlayAnimationStartup, @PlayAnimationWalkReady + direction:walkready + r:false -->HCM $StartHCM START_UP --> $Simulation - YES --> @RobotStateStartup, @PlayAnimationStartup, @PlayAnimationDynup + direction:walkready + r:false + YES --> @RobotStateStartup, @PlayAnimationInit, @PlayAnimationWalkReady NO --> #INIT_PATTERN - RUNNING --> $CheckMotors - MOTORS_NOT_STARTED --> @RobotStateStartup, @Wait - OVERLOAD --> #EMERGENCY_FALL - OVERHEAT --> #EMERGENCY_FALL - PROBLEM --> @RobotStateHardwareProblem, @WaitForMotors - TURN_ON --> #INIT_PATTERN - OKAY --> $RecordAnimation - RECORD_ACTIVE --> @RobotStateRecord, @Wait - FREE --> $TeachingMode - TEACH --> @RobotStateRecord, @SetTorque + stiff:false, @Wait - HOLD --> @SetTorque + stiff:true, @Wait - FINISHED --> @SetTorque + stiff:true + r:false, @RobotStateControllable, @PlayAnimationDynup + direction:walkready + r:false - OFF --> $Stop - STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationDynup + direction:walkready + r:false, @Wait - FREE -->$CheckIMU - IMU_NOT_STARTED --> @RobotStateStartup, @WaitForIMUStartup - PROBLEM --> @RobotStateHardwareProblem, @WaitForIMU - OKAY --> $CheckPressureSensor - PRESSURE_NOT_STARTED --> @RobotStateStartup, @WaitForPressureStartup - PROBLEM --> @RobotStateHardwareProblem, @WaitForPressure - OKAY --> $PickedUp - PICKED_UP --> @RobotStatePickedUp, @PlayAnimationDynup + direction:walkready + r:false, @Wait - ON_GROUND --> $Fallen - FALLEN_FRONT --> $GameControllerStop - STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait - FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @PlayAnimationStandupFront, @SetSquat + squat:true - FALLEN_BACK --> $GameControllerStop - STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait - FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @SetFootZero, @PlayAnimationFallingBack, @PlayAnimationStandupBack, @SetSquat + squat:true - FALLEN_RIGHT --> $GameControllerStop - STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait - FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontRight - FALLEN_LEFT --> $GameControllerStop - STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait - FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontLeft - NOT_FALLEN --> $Falling - FALLING_LEFT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingLeft, @Wait - FALLING_RIGHT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingRight, @Wait - FALLING_FRONT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingFront, @Wait - FALLING_BACK --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingBack, @Wait - NOT_FALLING --> $InSquat - YES --> @RobotStateGettingUp, @Complain, @PlayAnimationDynup + direction:rise, @SetSquat + squat:false - NO --> $PlayingExternalAnimation - ANIMATION_RUNNING --> @StopWalking, @RobotStateAnimationRunning, @Wait - ANIMATION_SERVER_TIMEOUT --> @CancelAnimation - FREE --> $RecentWalkingGoals - STAY_WALKING --> @RobotStateWalking, @Wait - NOT_WALKING --> $RecentKickGoals - KICKING --> @RobotStateKicking, @Wait - NOT_KICKING --> @RobotStateControllable, @Wait + RUNNING --> $CheckBattery + LOW --> @CancelGoals, @StopWalking, @Speak + text:Battery_low_so_please_power_me_off_gracefully, @Wait + time:10 + r:false + OKAY --> $CheckMotors + MOTORS_NOT_STARTED --> @RobotStateStartup, @Wait + OVERLOAD --> #EMERGENCY_FALL + OVERHEAT --> #EMERGENCY_FALL + PROBLEM --> @RobotStateHardwareProblem, @WaitForMotors + TURN_ON --> #INIT_PATTERN + OKAY --> $RecordAnimation + RECORD_ACTIVE --> @RobotStateRecord, @Wait + FREE --> $TeachingMode + TEACH --> @RobotStateRecord, @SetTorque + stiff:false, @Wait + HOLD --> @SetTorque + stiff:true, @Wait + FINISHED --> @SetTorque + stiff:true + r:false, @RobotStateControllable, @PlayAnimationWalkReady + OFF --> $Stop + STOPPED --> @RobotStatePenalty, @CancelGoals, @StopWalking, @PlayAnimationWalkReady, @Wait + FREE -->$CheckIMU + IMU_NOT_STARTED --> @RobotStateStartup, @WaitForIMUStartup + PROBLEM --> @RobotStateHardwareProblem, @WaitForIMU + OKAY --> $Fallen + FALLEN_FRONT --> $GameControllerStop + STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait + FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @PlayAnimationStandupFront, @SetSquat + squat:true + FALLEN_BACK --> $GameControllerStop + STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait + FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @RobotStateGettingUp, @PlayAnimationFallingBack, @PlayAnimationStandupBack, @SetSquat + squat:true + FALLEN_RIGHT --> $GameControllerStop + STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait + FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontRight + FALLEN_LEFT --> $GameControllerStop + STOPPED --> @RobotStateFallen, @CancelGoals, @StopWalking, @Wait + FREE --> @RobotStateFallen, @CancelGoals, @StopWalking, @PlayAnimationTurningFrontLeft + NOT_FALLEN --> $Falling + FALLING_LEFT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingLeft, @Wait + FALLING_RIGHT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingRight, @Wait + FALLING_FRONT --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingFront, @Wait + FALLING_BACK --> @RobotStateFalling, @CancelGoals, @StopWalking, @PlayAnimationFallingBack, @Wait + NOT_FALLING --> $InSquat + YES --> @RobotStateGettingUp, @Complain, @PlayAnimationRise, @SetSquat + squat:false + NO --> $PlayingExternalAnimation + ANIMATION_RUNNING --> @StopWalking, @RobotStateAnimationRunning, @Wait + ANIMATION_SERVER_TIMEOUT --> @CancelAnimation + FREE --> $RecentWalkingGoals + STAY_WALKING --> @RobotStateWalking, @Wait + NOT_WALKING --> $RecentKickGoals + KICKING --> @RobotStateKicking, @Wait + NOT_KICKING --> @RobotStateControllable, @Wait diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py index 6db308509c..2a6b6211c1 100644 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/hcm_dsd/hcm_blackboard.py @@ -17,6 +17,7 @@ from bitbots_msgs.action import Dynup, PlayAnimation from bitbots_msgs.msg import Audio, JointTorque, RobotControlState from bitbots_msgs.srv import SetTeachingMode +from livelybot_msg.msg import PowerSwitch class HcmBlackboard: @@ -36,20 +37,13 @@ def __init__(self, node: Node): self.visualization_active: bool = self.node.get_parameter("visualization_active").value self.pickup_accel_threshold: float = self.node.get_parameter("pick_up_accel_threshold").value self.pressure_sensors_installed: bool = self.node.get_parameter("pressure_sensors_installed").value - self.motor_start_delay: int = 0 - if not self.simulation_active: # The hardware interface is obviously not available in simulation - self.motor_start_delay = get_parameters_from_other_node_sync( - self.node, "/wolfgang_hardware_interface", ["start_delay"] - )["start_delay"] # Create service clients - self.foot_zero_service = self.node.create_client(EmptySrv, "set_foot_zero") - self.motor_switch_service = self.node.create_client(SetBool, "core/switch_power") + self.motor_switch_pub = self.node.create_publisher(PowerSwitch, "/power_switch_control", 10) # Create action clients and corresponding goal handles self.animation_action_client: ActionClient = ActionClient(self.node, PlayAnimation, "animation") self.animation_action_current_goal: Optional[Future] = None - self.dynup_action_client: ActionClient = ActionClient(self.node, Dynup, "dynup") self.dynup_action_current_goal: Optional[Future] = None # Create publishers @@ -83,6 +77,8 @@ def __init__(self, node: Node): self.animation_name_stand_up_back: str = self.node.get_parameter("animations.stand_up_back").value self.animation_name_stand_up_front: str = self.node.get_parameter("animations.stand_up_front").value self.animation_name_startup: str = self.node.get_parameter("animations.startup").value + self.animation_name_walk_ready: str = self.node.get_parameter("animations.walk_ready").value + self.animation_name_rise: str = self.node.get_parameter("animations.rise").value self.animation_name_turning_front_left: str = self.node.get_parameter("animations.turning_front_left").value self.animation_name_turning_front_right: str = self.node.get_parameter("animations.turning_front_right").value @@ -93,7 +89,7 @@ def __init__(self, node: Node): self.current_joint_state: Optional[JointState] = None self.previous_joint_state: Optional[JointState] = None self.last_different_joint_state_time: Optional[Time] = None - self.is_power_on: bool = False + self.is_power_on: bool = True # Motor Parameters self.motor_timeout_duration: float = self.node.get_parameter("motor_timeout_duration").value @@ -118,11 +114,10 @@ def __init__(self, node: Node): self.previous_imu_msg: Optional[Imu] = None self.last_different_imu_state_time: Optional[Time] = None - # Pressure sensors - # Initialize values high to prevent wrongly thinking the robot is picked up during start or in simulation - self.pressures: list[float] = [100.0] * 8 - self.previous_pressures: list[float] = self.pressures.copy() - self.last_different_pressure_state_time: Optional[Time] = None + # Battery state + self.battery_voltage_threshold: float = self.node.get_parameter("battery.voltage_threshold").value + self.battery_debounce_time: float = self.node.get_parameter("battery.debounce_time").value + self.battery_voltage: Optional[float] = None # Diagnostics state self.servo_diag_error: bool = False diff --git a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/humanoid_control_module.py b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/humanoid_control_module.py index 05663e0e4f..7293458376 100755 --- a/src/bitbots_motion/bitbots_hcm/bitbots_hcm/humanoid_control_module.py +++ b/src/bitbots_motion/bitbots_hcm/bitbots_hcm/humanoid_control_module.py @@ -19,7 +19,7 @@ from rclpy.time import Time from ros2_numpy import numpify from sensor_msgs.msg import Imu, JointState -from std_msgs.msg import Bool +from std_msgs.msg import Bool, Float32 from std_srvs.srv import SetBool from bitbots_hcm import hcm_dsd @@ -77,7 +77,7 @@ def __init__(self, use_sim_time, simulation_active, visualization_active): self.hcm_deactivated = False # Create subscribers - self.node.create_subscription(Bool, "core/power_switch_status", self.power_cb, 1) + self.node.create_subscription(Float32, "battery_voltage", self.voltage_cb, 1) self.node.create_subscription(Bool, "hcm_deactivate", self.deactivate_cb, 1) self.node.create_subscription(DiagnosticArray, "diagnostics_agg", self.diag_cb, 1) self.node.create_subscription(Bool, "game_controller/stop_msg", self.stop_cb, 1) @@ -141,9 +141,9 @@ def set_manual_penalize_mode_callback(self, req: ManualPenalize.Request, resp: M resp.success = True return resp - def power_cb(self, msg: Bool): - """Updates the power state.""" - self.blackboard.is_power_on = msg.data + def voltage_cb(self, msg: Float32): + """Receives data sent by the battery management system.""" + self.blackboard.battery_voltage = msg.data def diag_cb(self, msg: DiagnosticArray): """Updates the diagnostic state.""" @@ -160,8 +160,6 @@ def diag_cb(self, msg: DiagnosticArray): self.blackboard.servo_diag_error = status.level in (DiagnosticStatus.ERROR, DiagnosticStatus.STALE) elif "/IMU" in status.name: self.blackboard.imu_diag_error = status.level in (DiagnosticStatus.ERROR, DiagnosticStatus.STALE) - elif "/Pressure" in status.name: - self.blackboard.pressure_diag_error = status.level in (DiagnosticStatus.ERROR, DiagnosticStatus.STALE) def get_state(self) -> T_RobotControlState: """Returns the current state of the HCM.""" diff --git a/src/bitbots_motion/bitbots_hcm/config/hcm_wolfgang.yaml b/src/bitbots_motion/bitbots_hcm/config/hcm_wolfgang.yaml index b334d6b79c..65fbab26e8 100644 --- a/src/bitbots_motion/bitbots_hcm/config/hcm_wolfgang.yaml +++ b/src/bitbots_motion/bitbots_hcm/config/hcm_wolfgang.yaml @@ -23,6 +23,8 @@ startup: "startup" turning_front_left: "turning_front_left" turning_front_right: "turning_front_right" + walk_ready: "walk_ready" # does not exist yet + rise: "rise" # does not exist yet # Falling stand_up_active: true # Enables the robot to stand up automatically @@ -42,3 +44,9 @@ # Pick up pick_up_accel_threshold: 7.0 + + # Battery + battery: + voltage_threshold: 18.0 # Voltage under which the battery is considered low + debounce_time: 5.0 # Time the battery has to be under the threshold to be considered low [s] + diff --git a/src/bitbots_motion/bitbots_hcm/launch/hcm.launch b/src/bitbots_motion/bitbots_hcm/launch/hcm.launch index 3292588632..f16cb52e42 100644 --- a/src/bitbots_motion/bitbots_hcm/launch/hcm.launch +++ b/src/bitbots_motion/bitbots_hcm/launch/hcm.launch @@ -16,8 +16,4 @@ - - - - diff --git a/src/bitbots_motion/bitbots_hcm/launch/test.launch b/src/bitbots_motion/bitbots_hcm/launch/test.launch index 8a2e63f3c8..bcdf2d0f2c 100644 --- a/src/bitbots_motion/bitbots_hcm/launch/test.launch +++ b/src/bitbots_motion/bitbots_hcm/launch/test.launch @@ -10,7 +10,7 @@ - + diff --git a/src/bitbots_motion/bitbots_hcm/package.xml b/src/bitbots_motion/bitbots_hcm/package.xml index 9e90af219c..145ea3bbad 100644 --- a/src/bitbots_motion/bitbots_hcm/package.xml +++ b/src/bitbots_motion/bitbots_hcm/package.xml @@ -33,6 +33,7 @@ ros2_python_extension sensor_msgs std_msgs + livelybot_msg ament_cmake_mypy diff --git a/src/bitbots_motion/bitbots_hcm/src/hcm.cpp b/src/bitbots_motion/bitbots_hcm/src/hcm.cpp index c0295ba363..acd99db9e3 100644 --- a/src/bitbots_motion/bitbots_hcm/src/hcm.cpp +++ b/src/bitbots_motion/bitbots_hcm/src/hcm.cpp @@ -42,7 +42,7 @@ class HCM_CPP : public rclcpp::Node { hcm_py_ = hcm_module.attr("HardwareControlManager")(use_sim_time, simulation_active, visualization_active); // Create publishers - pub_controller_command_ = this->create_publisher("DynamixelController/command", 1); + pub_controller_command_ = this->create_publisher("joint_command", 1); pub_robot_state_ = this->create_publisher("robot_state", 1); // Create subscribers for goals @@ -246,7 +246,7 @@ int main(int argc, char** argv) { std::thread thread_obj(thread_spin, exec); auto last_time = node->get_clock()->now(); - rclcpp::Rate rate = rclcpp::Rate(125.0); + rclcpp::Rate rate = rclcpp::Rate(100.0); while (rclcpp::ok()) { // Check if time progressed auto current_time = node->get_clock()->now(); diff --git a/src/bitbots_motion/bitbots_head_mover/CMakeLists.txt b/src/bitbots_motion/bitbots_head_mover/CMakeLists.txt index d4f3f7cfa9..b651bbc88e 100644 --- a/src/bitbots_motion/bitbots_head_mover/CMakeLists.txt +++ b/src/bitbots_motion/bitbots_head_mover/CMakeLists.txt @@ -13,14 +13,8 @@ endif() # find dependencies find_package(ament_cmake REQUIRED) find_package(backward_ros REQUIRED) -find_package(bio_ik REQUIRED) -find_package(bio_ik_msgs REQUIRED) find_package(bitbots_msgs REQUIRED) find_package(generate_parameter_library REQUIRED) -find_package(moveit_core REQUIRED) -find_package(moveit_msgs REQUIRED) -find_package(moveit_ros_planning REQUIRED) -find_package(moveit_ros_planning_interface REQUIRED) find_package(rclcpp REQUIRED) find_package(sensor_msgs REQUIRED) find_package(std_msgs REQUIRED) @@ -37,19 +31,12 @@ target_link_libraries(move_head rclcpp::rclcpp head_parameters) ament_target_dependencies( move_head backward_ros - bio_ik - bio_ik_msgs bitbots_msgs generate_parameter_library - moveit_core - moveit_msgs - moveit_ros_planning - moveit_ros_planning_interface rclcpp sensor_msgs std_msgs tf2_geometry_msgs - tf2_kdl tf2_ros) install(TARGETS move_head DESTINATION lib/${PROJECT_NAME}) diff --git a/src/bitbots_motion/bitbots_head_mover/config/head_config.yml b/src/bitbots_motion/bitbots_head_mover/config/head_config.yml index 3eb09608de..cefac83225 100644 --- a/src/bitbots_motion/bitbots_head_mover/config/head_config.yml +++ b/src/bitbots_motion/bitbots_head_mover/config/head_config.yml @@ -16,7 +16,7 @@ move_head: max_pan: type: double_array - default_value: [-1.57, 1.57] + default_value: [-1.23, 1.23] description: "Max values for the head position (in radians)" validation: fixed_size<>: 2 @@ -24,7 +24,7 @@ move_head: max_tilt: type: double_array - default_value: [-1.2, 0.2] + default_value: [-0.6, 0.79] description: "Max values for the head position (in radians)" validation: fixed_size<>: 2 @@ -88,23 +88,23 @@ move_head: tilt_speed: type: double description: "Tilt speed for the search pattern" - default_value: 3.0 + default_value: 1.5 pan_speed: type: double description: "Pan speed for the search pattern" - default_value: 3.0 + default_value: 1.5 pan_max: type: double_array - default_value: [-90.0, 90.0] + default_value: [-70.0, 70.0] description: "Maximum pan values for the search pattern (in degrees)" validation: fixed_size<>: 2 tilt_max: type: double_array - default_value: [-10.0, -60.0] + default_value: [0.0, 45.0] description: "Maximum tilt values for the search pattern (in degrees)" validation: fixed_size<>: 2 @@ -127,12 +127,12 @@ move_head: tilt_speed: type: double description: "Tilt speed for the search pattern" - default_value: 3.0 + default_value: 1.5 pan_speed: type: double description: "Pan speed for the search pattern" - default_value: 3.0 + default_value: 1.5 pan_max: type: double_array @@ -143,7 +143,7 @@ move_head: tilt_max: type: double_array - default_value: [ -10.0, -70.0 ] + default_value: [ -10.0, 45.0 ] description: "Maximum tilt values for the search pattern (in degrees)" validation: fixed_size<>: 2 @@ -182,7 +182,7 @@ move_head: tilt_max: type: double_array - default_value: [ -7.0, -7.0 ] + default_value: [ 7.0, 7.0 ] description: "Maximum tilt values for the search pattern (in degrees)" validation: fixed_size<>: 2 diff --git a/src/bitbots_motion/bitbots_head_mover/launch/test.launch b/src/bitbots_motion/bitbots_head_mover/launch/test.launch index e45e4106ff..54f2a7b39d 100644 --- a/src/bitbots_motion/bitbots_head_mover/launch/test.launch +++ b/src/bitbots_motion/bitbots_head_mover/launch/test.launch @@ -5,7 +5,7 @@ - + diff --git a/src/bitbots_motion/bitbots_head_mover/package.xml b/src/bitbots_motion/bitbots_head_mover/package.xml index 76f6d9e851..93cd0da679 100644 --- a/src/bitbots_motion/bitbots_head_mover/package.xml +++ b/src/bitbots_motion/bitbots_head_mover/package.xml @@ -17,16 +17,10 @@ ament_cmake backward_ros - bio_ik_msgs - bio_ik bitbots_msgs bitbots_robot_description bitbots_utils generate_parameter_library - moveit_core - moveit_ros_planning_interface - moveit_ros_planning - moveit_ros rclcpp sensor_msgs std_msgs diff --git a/src/bitbots_motion/bitbots_head_mover/src/move_head.cpp b/src/bitbots_motion/bitbots_head_mover/src/move_head.cpp index a3fbdaf2a4..0589dbfc04 100644 --- a/src/bitbots_motion/bitbots_head_mover/src/move_head.cpp +++ b/src/bitbots_motion/bitbots_head_mover/src/move_head.cpp @@ -1,8 +1,6 @@ #include #include -#include -#include #include #include #include @@ -13,10 +11,6 @@ #include #include #include -#include -#include -#include -#include #include #include #include @@ -60,14 +54,6 @@ class HeadMover { std::optional current_joint_state_; geometry_msgs::msg::PoseWithCovarianceStamped tf_precision_pose_; - // Declare robot model and planning scene for moveit - robot_model_loader::RobotModelLoaderPtr loader_; - moveit::core::RobotModelPtr robot_model_; - moveit::core::RobotStatePtr robot_state_; - moveit::core::RobotStatePtr collision_state_; - planning_scene_monitor::PlanningSceneMonitorPtr planning_scene_monitor_; - planning_scene::PlanningScenePtr planning_scene_; - // Declare parameters and parameter listener move_head::Params params_; std::shared_ptr param_listener_; @@ -128,58 +114,6 @@ class HeadMover { param_listener_ = std::make_shared(node_); params_ = param_listener_->get_params(); - // Create a seperate node for moveit, this way we can use rqt to change parameters, - // because some moveit parameters break the gui - auto moveit_node = std::make_shared("moveit_head_mover_node"); - - // Get the parameters from the move_group node - auto parameters_client = std::make_shared(node_, "/move_group"); - while (!parameters_client->wait_for_service(1s)) { - if (!rclcpp::ok()) { - RCLCPP_ERROR(node_->get_logger(), "Interrupted while waiting for the service. Exiting."); - return; - } - RCLCPP_INFO(node_->get_logger(), "service not available, waiting again..."); - } - - // Extract the robot_description - rcl_interfaces::msg::ListParametersResult parameter_list = - parameters_client->list_parameters({"robot_description_kinematics"}, 10); - - // Set the robot description parameters in the moveit node - auto copied_parameters = parameters_client->get_parameters(parameter_list.names); - for (auto& parameter : copied_parameters) { - moveit_node->declare_parameter(parameter.get_name(), parameter.get_type()); - moveit_node->set_parameter(parameter); - } - - // Load robot description / robot model into moveit - std::string robot_description = "robot_description"; - loader_ = std::make_shared( - robot_model_loader::RobotModelLoader(moveit_node, robot_description, true)); - robot_model_ = loader_->getModel(); - if (!robot_model_) { - RCLCPP_ERROR(node_->get_logger(), - "failed to load robot model %s. Did you start the " - "blackboard (bitbots_bringup base.launch)?", - robot_description.c_str()); - } - - // Recreate robot state - robot_state_.reset(new moveit::core::RobotState(robot_model_)); - robot_state_->setToDefaultValues(); - - // Recreate collision state - collision_state_.reset(new moveit::core::RobotState(robot_model_)); - collision_state_->setToDefaultValues(); - - // Get planning scene for collision checking - planning_scene_monitor_ = std::make_shared(moveit_node, loader_); - planning_scene_ = planning_scene_monitor_->getPlanningScene(); - if (!planning_scene_) { - RCLCPP_ERROR_ONCE(node_->get_logger(), "failed to connect to planning scene"); - } - // Create tf buffer and listener to update it tf_buffer_ = std::make_shared(node_->get_clock()); tf_listener_ = std::make_shared(*tf_buffer_); @@ -212,8 +146,7 @@ class HeadMover { // Bring the goal point into the planning frame geometry_msgs::msg::PointStamped new_point; try { - new_point = - tf_buffer_->transform(goal->look_at_position, planning_scene_->getPlanningFrame(), tf2::durationFromSec(0.9)); + new_point = tf_buffer_->transform(goal->look_at_position, "base_footprint", tf2::durationFromSec(0.9)); } catch (tf2::TransformException& ex) { RCLCPP_ERROR(node_->get_logger(), "Could not transform goal point: %s", ex.what()); return rclcpp_action::GoalResponse::REJECT; @@ -417,13 +350,9 @@ class HeadMover { * @brief Checks if the head collides with the body at a given pan and tilt position */ bool check_head_collision(double pan, double tilt) { - collision_state_->setJointPositions("HeadPan", &pan); - collision_state_->setJointPositions("HeadTilt", &tilt); - collision_detection::CollisionRequest req; - collision_detection::CollisionResult res; - collision_detection::AllowedCollisionMatrix acm = planning_scene_->getAllowedCollisionMatrix(); - planning_scene_->checkCollision(req, res, *collision_state_, acm); - return res.collision; + // TODO we do not have a collision model for the pi plus head yet, so we need to implement this function properly + RCLCPP_ERROR_STREAM(node_->get_logger(), "Collision checking for the pi plus head is not implemented yet"); + return false; } /** @@ -448,11 +377,11 @@ class HeadMover { // Send the motor goals including the position, speed and acceleration bitbots_msgs::msg::JointCommand pos_msg; pos_msg.header.stamp = rclcpp::Clock().now(); - pos_msg.joint_names = {"HeadPan", "HeadTilt"}; + pos_msg.joint_names = {"head_yaw_joint", "head_pitch_joint"}; pos_msg.positions = {goal_pan, goal_tilt}; pos_msg.velocities = {pan_speed, tilt_speed}; pos_msg.accelerations = {params_.max_acceleration_pan, params_.max_acceleration_pan}; - pos_msg.max_currents = {-1, -1}; + pos_msg.max_torques = {10, 10}; position_publisher_->publish(pos_msg); } @@ -466,9 +395,9 @@ class HeadMover { // Iterate over all joints and find the head pan and tilt joints for (size_t i = 0; i < current_joint_state_->name.size(); i++) { - if (current_joint_state_->name[i] == "HeadPan") { + if (current_joint_state_->name[i] == "head_yaw_joint") { head_pan = current_joint_state_->position[i]; - } else if (current_joint_state_->name[i] == "HeadTilt") { + } else if (current_joint_state_->name[i] == "head_pitch_joint") { head_tilt = current_joint_state_->position[i]; } } @@ -540,7 +469,7 @@ class HeadMover { } // Get the current tilt angle based on the current line we are on - double current_tilt = lineAngle(line, line_count, max_vertical_angle_down, max_vertical_angle_up); + double current_tilt = lineAngle(line, line_count, max_vertical_angle_up, max_vertical_angle_down); // Store the keyframe keyframes.push_back({current_pan, current_tilt}); @@ -588,35 +517,10 @@ class HeadMover { * @brief Calculates the motor goals that are needed to look at a given point using the inverse kinematics */ std::pair get_motor_goals_from_point(geometry_msgs::msg::Point point) { - // Create a new IK options object - bio_ik::BioIKKinematicsQueryOptions ik_options; - ik_options.return_approximate_solution = true; - ik_options.replace = true; - - // Create a new look at goal and set the target point as the position the camera link should look at - ik_options.goals.emplace_back(new bio_ik::LookAtGoal("camera", {1.0, 0.0, 0.0}, {point.x, point.y, point.z})); - - // Get the joint model group for the head - auto joint_model_group = robot_model_->getJointModelGroup("Head"); - // Try to calculate the inverse kinematics - double timeout_seconds = 1.0; - bool success = robot_state_->setFromIK(joint_model_group, EigenSTL::vector_Isometry3d(), std::vector(), - timeout_seconds, moveit::core::GroupStateValidityCallbackFn(), ik_options); - robot_state_->update(); - - // Get the solution from the IK response - bio_ik_msgs::msg::IKResponse response; - moveit::core::robotStateToRobotStateMsg(*robot_state_, response.solution); - response.solution_fitness = ik_options.solution_fitness; - // Return the motor goals if the IK was successful - if (success) { - return {response.solution.joint_state.position[0], response.solution.joint_state.position[1]}; - } else { - RCLCPP_ERROR_STREAM_THROTTLE(node_->get_logger(), *node_->get_clock(), 1000, - "BioIK failed with error code: " << response.error_code.val); - return {0.0, 0.0}; - } + // TODO we do not have inverse kinematics for the pi plus setup yet, so we need to implement this function properly + RCLCPP_ERROR_STREAM(node_->get_logger(), "Inverse kinematics for the pi plus head is not implemented yet"); + return {0.0, 0.0}; } /** @@ -626,7 +530,7 @@ class HeadMover { try { // Transform the point into the planning frame geometry_msgs::msg::PointStamped new_point = - tf_buffer_->transform(point, planning_scene_->getPlanningFrame(), tf2::durationFromSec(0.9)); + tf_buffer_->transform(point, "base_footprint", tf2::durationFromSec(0.9)); // Get the motor goals that are needed to look at the point from the inverse kinematics std::pair pan_tilt = get_motor_goals_from_point(new_point.point); diff --git a/src/bitbots_motion/bitbots_moveit_bindings/CMakeLists.txt b/src/bitbots_motion/bitbots_moveit_bindings/CMakeLists.txt deleted file mode 100644 index 6693eb3500..0000000000 --- a/src/bitbots_motion/bitbots_moveit_bindings/CMakeLists.txt +++ /dev/null @@ -1,72 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project(bitbots_moveit_bindings) - -# Add support for C++17 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 17) -endif() - -# Include CheckIPOSupported module -include(CheckIPOSupported) - -# Check if IPO is supported -check_ipo_supported(RESULT ipo_supported) -if(ipo_supported) - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) - # Set the number of parallel LTO jobs - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=4") -endif() - -# Build with release optimizations and debug symbols by default -if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE RelWithDebug) -endif() - -set(PYBIND11_PYTHON_VERSION 3) -set(PYBIND11_FINDPYTHON ON) -find_package(ament_cmake REQUIRED) -find_package(backward_ros REQUIRED) -find_package(bio_ik REQUIRED) -find_package(bio_ik_msgs REQUIRED) -find_package(bitbots_docs REQUIRED) -find_package(moveit_core REQUIRED) -find_package(moveit_msgs REQUIRED) -find_package(moveit_ros_planning REQUIRED) -find_package(moveit_ros_planning_interface REQUIRED) -find_package(pybind11 REQUIRED) -find_package(Python3 REQUIRED COMPONENTS Interpreter Development) -find_package(rclcpp REQUIRED) -find_package(ros2_python_extension) -find_package(tf2 REQUIRED) -find_package(tf2_kdl REQUIRED) -find_package(tf2_ros REQUIRED) - -add_compile_options(-Wall -Wno-unused) - -enable_bitbots_docs() - -pybind11_add_module(libbitbots_moveit_bindings SHARED - src/bitbots_moveit_bindings.cpp) - -ament_target_dependencies( - libbitbots_moveit_bindings - PUBLIC - backward_ros - bio_ik - bio_ik_msgs - moveit_core - moveit_msgs - moveit_ros_planning_interface - moveit_ros_planning - rclcpp - ros2_python_extension - tf2 - tf2_ros - tf2_kdl) - -ament_python_install_package(${PROJECT_NAME}) - -install(TARGETS libbitbots_moveit_bindings - DESTINATION "${PYTHON_INSTALL_DIR}/${PROJECT_NAME}") - -ament_package() diff --git a/src/bitbots_motion/bitbots_moveit_bindings/bitbots_moveit_bindings/__init__.py b/src/bitbots_motion/bitbots_moveit_bindings/bitbots_moveit_bindings/__init__.py deleted file mode 100644 index 5fae02b8bd..0000000000 --- a/src/bitbots_motion/bitbots_moveit_bindings/bitbots_moveit_bindings/__init__.py +++ /dev/null @@ -1,64 +0,0 @@ -from bio_ik_msgs.msg import IKRequest -from bio_ik_msgs.srv import GetIK -from moveit_msgs.srv import GetPositionFK, GetPositionIK -from rcl_interfaces.msg import Parameter -from rclpy.serialization import deserialize_message, serialize_message - -from bitbots_moveit_bindings.libbitbots_moveit_bindings import BitbotsMoveitBindings - -# this state is only used for IK and FK calls and does not listen to current joint_states -ik_fk_state = None -# this is only used for collision states. it updates with joint states -collision_state = None - - -def set_moveit_parameters(parameters: [Parameter], type): - """ - Allows to set the parameters manually instead of copying them from the move_group node. - :param parameters: List of Parameter messages - :return: - """ - global ik_fk_state, collision_state - serialized_parameters = [] - for parameter in parameters: - serialized_parameters.append(serialize_message(parameter)) - if type == "ikfk": - ik_fk_state = BitbotsMoveitBindings("moveit_bindings_ik", serialized_parameters) - elif type == "collision": - collision_state = BitbotsMoveitBindings("moveit_bindings_collision", serialized_parameters) - else: - raise ValueError("Type for bitbots_moveit_bindings state not correctly defined") - - -def get_position_ik(request: GetPositionIK.Request, approximate=False): - global ik_fk_state - if ik_fk_state is None: - ik_fk_state = BitbotsMoveitBindings("moveit_bindings_ik", []) - request_str = serialize_message(request) - result_str = ik_fk_state.getPositionIK(request_str, approximate) - return deserialize_message(result_str, GetPositionIK.Response) - - -def get_position_fk(request: GetPositionFK.Request): - global ik_fk_state - if ik_fk_state is None: - ik_fk_state = BitbotsMoveitBindings("moveit_bindings_ik", []) - result_str = ik_fk_state.getPositionFK(serialize_message(request)) - return deserialize_message(result_str, GetPositionFK.Response) - - -def get_bioik_ik(request: IKRequest) -> GetIK.Response: - global ik_fk_state - if ik_fk_state is None: - ik_fk_state = BitbotsMoveitBindings("moveit_bindings_ik", []) - result_str = ik_fk_state.getBioIKIK(serialize_message(request)) - return deserialize_message(result_str, GetIK.Response) - - -def check_collision(joint_state): - global collision_state - if collision_state is None: - collision_state = BitbotsMoveitBindings("moveit_bindings_collision", []) - collision_state.set_joint_states(serialize_message(joint_state)) - collision = collision_state.check_collision() - return collision diff --git a/src/bitbots_motion/bitbots_moveit_bindings/docs/_static/logo.png b/src/bitbots_motion/bitbots_moveit_bindings/docs/_static/logo.png deleted file mode 100644 index f8afdd5d06..0000000000 Binary files a/src/bitbots_motion/bitbots_moveit_bindings/docs/_static/logo.png and /dev/null differ diff --git a/src/bitbots_motion/bitbots_moveit_bindings/docs/conf.py b/src/bitbots_motion/bitbots_moveit_bindings/docs/conf.py deleted file mode 100644 index 0b6342a9ce..0000000000 --- a/src/bitbots_motion/bitbots_moveit_bindings/docs/conf.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Full list of options at http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import catkin_pkg.package -from exhale import utils - -package_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -catkin_package = catkin_pkg.package.parse_package( - os.path.join(package_dir, catkin_pkg.package.PACKAGE_MANIFEST_FILENAME) -) -sys.path.insert(0, os.path.abspath(os.path.join(package_dir, "src"))) - - -# -- Helper functions -------------------------------------------------------- - - -def count_files(): - """:returns tuple of (num_py, num_cpp)""" - num_py = 0 - num_cpp = 0 - - for _, _, files in os.walk(os.path.join(package_dir, "src")): - for f in files: - if f.endswith(".py"): - num_py += 1 - for _, _, files in os.walk(os.path.join(package_dir, "include")): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - num_cpp += 1 - - return num_py, num_cpp - - -# -- Project information ----------------------------------------------------- - -project = catkin_package.name -copyright = "2019, Bit-Bots" -author = ", ".join([a.name for a in catkin_package.authors]) - -# The short X.Y version -version = str(catkin_package.version) -# The full version, including alpha/beta/rc tags -release = str(catkin_package.version) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.doctest", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.coverage", - "sphinx.ext.imgmath", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# -- Exhale and Breath setup ------------------------------------------------- - -# Tell sphinx what the primary language being documented is. -num_files_py, num_files_cpp = count_files() -primary_domain = "py" if num_files_py >= num_files_cpp else "cpp" - -# Tell sphinx what the pygments highlight language should be. -highlight_language = primary_domain - -if num_files_cpp > 0: - extensions += [ - "breathe", - "exhale", - ] - - breathe_projects = {project: os.path.join("_build", "doxyoutput", "xml")} - breathe_default_project = project - - def specifications_for_kind(kind): - # Show all members for classes and structs - if kind == "class" or kind == "struct": - return [":members:", ":protected-members:", ":private-members:", ":undoc-members:"] - # An empty list signals to Exhale to use the defaults - else: - return [] - - exhale_args = { - # These arguments are required - "containmentFolder": "cppapi", - "rootFileName": "library_root.rst", - "rootFileTitle": "C++ Library API", - "doxygenStripFromPath": "..", - "customSpecificationsMapping": utils.makeCustomSpecificationsMapping(specifications_for_kind), - # Suggested optional arguments - "createTreeView": True, - "exhaleExecutesDoxygen": True, - "exhaleDoxygenStdin": "INPUT = {}".format(os.path.join(package_dir, "include")), - } - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = os.path.join("_static", "logo.png") -html_favicon = os.path.join("_static", "logo.png") - - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# -- RST Standard variables --------------------------------------------------- -rst_prolog = f".. |project| replace:: {project}\n" -rst_prolog += ".. |description| replace:: {}\n".format(catkin_package.description.replace("\n\n", "\n")) -rst_prolog += ".. |modindex| replace:: {}\n".format( - ":ref:`modindex`" if num_files_py > 0 else "Python module index is not available" -) diff --git a/src/bitbots_motion/bitbots_moveit_bindings/docs/index.rst b/src/bitbots_motion/bitbots_moveit_bindings/docs/index.rst deleted file mode 100644 index 0492200a11..0000000000 --- a/src/bitbots_motion/bitbots_moveit_bindings/docs/index.rst +++ /dev/null @@ -1,31 +0,0 @@ -Welcome to |project|'s documentation! -================================================ - -This package allows to make calls to the MoveIt IK and FK from Python. -Here is an example code snippet for using the IK: - - .. code-block:: Python - - from bitbots_moveit_bindings import get_position_ik - from moveit_msgs.srv import GetPositionIKRequest, GetPositionIKResponse - from tf_transformations import quaternion_from_euler - - # create request - request = GetPositionIKRequest() - # configure request - request.ik_request.timeout = rospy.Time.from_seconds(0.01) - request.ik_request.attempts = 1 - request.ik_request.avoid_collisions = False - - # specify the goal - request.ik_request.group_name = "LeftLeg" - request.ik_request.ik_link_name = "l_sole" - request.ik_request.pose_stamped.pose.position = Point(0,0,-0.35) - x, y, z, w = quaternion_from_euler(0, 0, 0) - request.ik_request.pose_stamped.pose.orientation = Quaternion(x=x, y=y, z=z, w=w) - - # call the IK - ik_result = get_position_ik(request, approximate=False) - - # you get the results as a joint state message - results_as_joint_state_msg = ik_result.solution.joint_state diff --git a/src/bitbots_motion/bitbots_moveit_bindings/package.xml b/src/bitbots_motion/bitbots_moveit_bindings/package.xml deleted file mode 100644 index 0353a9065f..0000000000 --- a/src/bitbots_motion/bitbots_moveit_bindings/package.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - bitbots_moveit_bindings - 1.0.0 - Some MoveIt bindings for python - - Timon Engelke - - MIT - - ament_cmake - backward_ros - bio_ik_msgs - bio_ik - bitbots_docs - moveit_core - moveit_ros_planning_interface - moveit_ros_planning - pybind11_vendor - ros2_python_extension - - ament_cmake - - diff --git a/src/bitbots_motion/bitbots_moveit_bindings/setup.py b/src/bitbots_motion/bitbots_moveit_bindings/setup.py deleted file mode 100644 index ce1c10c780..0000000000 --- a/src/bitbots_motion/bitbots_moveit_bindings/setup.py +++ /dev/null @@ -1,9 +0,0 @@ -from setuptools import setup - -setup( - name="bitbots_moveit_bindings", - packages=["bitbots_moveit_bindings"], - zip_safe=True, - keywords=["ROS"], - license="MIT", -) diff --git a/src/bitbots_motion/bitbots_moveit_bindings/src/bitbots_moveit_bindings.cpp b/src/bitbots_motion/bitbots_moveit_bindings/src/bitbots_moveit_bindings.cpp deleted file mode 100644 index 3507e0d167..0000000000 --- a/src/bitbots_motion/bitbots_moveit_bindings/src/bitbots_moveit_bindings.cpp +++ /dev/null @@ -1,367 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -namespace py = pybind11; -using namespace std::chrono_literals; -using std::placeholders::_1; - -class BitbotsMoveitBindings { - public: - BitbotsMoveitBindings(std::string node_name, std::vector parameter_msgs) { - // initialize rclcpp if not already done - if (!rclcpp::contexts::get_global_default_context()->is_valid()) { - rclcpp::init(0, nullptr); - } - - // deserialize parameters - std::vector cpp_parameters = {}; - for (auto& parameter_msg : parameter_msgs) { - cpp_parameters.push_back(rclcpp::Parameter::from_parameter_msg( - ros2_python_extension::fromPython(parameter_msg))); - } - - rclcpp::NodeOptions options = rclcpp::NodeOptions() - .allow_undeclared_parameters(true) - .parameter_overrides(cpp_parameters) - .automatically_declare_parameters_from_overrides(true); - node_ = std::make_shared(node_name, options); - // set logging level to warn to reduce spam - node_->get_logger().set_level(rclcpp::Logger::Level::Warn); - - if (cpp_parameters.empty()) { - // get all kinematics parameters from the move_group node if they are not - // provided via the constructor - auto parameters_client = std::make_shared(node_, "/move_group"); - while (!parameters_client->wait_for_service(1s)) { - if (!rclcpp::ok()) { - RCLCPP_ERROR(node_->get_logger(), "Interrupted while waiting for the service. Exiting."); - rclcpp::shutdown(); - } - RCLCPP_INFO(node_->get_logger(), "service not available, waiting again..."); - } - rcl_interfaces::msg::ListParametersResult parameter_list = - parameters_client->list_parameters({"robot_description_kinematics"}, 10); - auto copied_parameters = parameters_client->get_parameters(parameter_list.names); - - // set the parameters to our node - node_->set_parameters(copied_parameters); - } - // now that all parameters are set we can load the robot model and the - // kinematic solvers - std::string robot_description = "robot_description"; - // get the robot description from the blackboard - loader_ = std::make_shared( - robot_model_loader::RobotModelLoader(node_, robot_description, true)); - robot_model_ = loader_->getModel(); - if (!robot_model_) { - RCLCPP_ERROR(node_->get_logger(), - "failed to load robot model %s. Did you start the " - "blackboard (bitbots_bringup base.launch)?", - robot_description.c_str()); - } - robot_state_.reset(new moveit::core::RobotState(robot_model_)); - robot_state_->setToDefaultValues(); - - // get planning scene for collision checking - planning_scene_monitor_ = std::make_shared(node_, robot_description); - planning_scene_ = planning_scene_monitor_->getPlanningScene(); - if (!planning_scene_) { - RCLCPP_ERROR_ONCE(node_->get_logger(), "failed to connect to planning scene"); - } - exec_ = std::make_shared(); - exec_->add_node(node_); - } - - py::bytes getPositionIK(py::bytes& msg, bool approximate = false) { - auto request = ros2_python_extension::fromPython(msg); - moveit_msgs::srv::GetPositionIK::Response response; - if (!robot_model_) { - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::INVALID_OBJECT_NAME; - return ros2_python_extension::toPython(response); - } - - auto joint_model_group = robot_model_->getJointModelGroup(request.ik_request.group_name); - if (!joint_model_group) { - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::INVALID_GROUP_NAME; - return ros2_python_extension::toPython(response); - } - - robot_state_->update(); - if (!request.ik_request.robot_state.joint_state.name.empty() || - !request.ik_request.robot_state.multi_dof_joint_state.joint_names.empty()) { - moveit::core::robotStateMsgToRobotState(request.ik_request.robot_state, *robot_state_); - robot_state_->update(); - } - - bool success = true; - - kinematics::KinematicsQueryOptions ik_options; - ik_options.return_approximate_solution = approximate; - - moveit::core::GroupStateValidityCallbackFn callback; - if (request.ik_request.avoid_collisions) { - callback = [this](moveit::core::RobotState* state, const moveit::core::JointModelGroup* group, - const double* values) { - state->setJointGroupPositions(group, values); - state->update(); - return !planning_scene_ || !planning_scene_->isStateColliding(*state, group->getName()); - }; - } - - if (request.ik_request.pose_stamped_vector.empty()) { - if (request.ik_request.ik_link_name.empty()) { - success = robot_state_->setFromIK(joint_model_group, request.ik_request.pose_stamped.pose, - rclcpp::Duration(request.ik_request.timeout).seconds(), callback, ik_options); - } else { - success = robot_state_->setFromIK(joint_model_group, request.ik_request.pose_stamped.pose, - request.ik_request.ik_link_name, - rclcpp::Duration(request.ik_request.timeout).seconds(), callback, ik_options); - } - } else { - EigenSTL::vector_Isometry3d poses; - poses.reserve(request.ik_request.pose_stamped_vector.size()); - for (auto& pose : request.ik_request.pose_stamped_vector) { - poses.emplace_back(); - tf2::convert(pose.pose, poses.back()); - } - if (request.ik_request.ik_link_names.empty()) { - std::vector end_effector_names; - joint_model_group->getEndEffectorTips(end_effector_names); - success = robot_state_->setFromIK(joint_model_group, poses, end_effector_names, - rclcpp::Duration(request.ik_request.timeout).seconds(), callback, ik_options); - } else { - success = robot_state_->setFromIK(joint_model_group, poses, request.ik_request.ik_link_names, - rclcpp::Duration(request.ik_request.timeout).seconds(), callback, ik_options); - } - } - - robot_state_->update(); - - moveit::core::robotStateToRobotStateMsg(*robot_state_, response.solution); - if (success) { - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::SUCCESS; - } else { - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::NO_IK_SOLUTION; - } - return ros2_python_extension::toPython(response); - } - - py::bytes getPositionFK(py::bytes& msg) { - auto request = ros2_python_extension::fromPython(msg); - - moveit_msgs::srv::GetPositionFK::Response response; - if (!robot_model_) { - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::INVALID_OBJECT_NAME; - return ros2_python_extension::toPython(response); - } - - sensor_msgs::msg::JointState joint_state = request.robot_state.joint_state; - for (size_t i = 0; i < joint_state.name.size(); ++i) { - robot_state_->setJointPositions(joint_state.name[i], &joint_state.position[i]); - } - robot_state_->update(); - Eigen::Isometry3d pose; - geometry_msgs::msg::PoseStamped pose_stamped; - pose_stamped.header = request.header; - for (std::string& link_name : request.fk_link_names) { - if (!robot_model_->hasLinkModel(link_name)) { - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::INVALID_LINK_NAME; - return ros2_python_extension::toPython(response); - } - response.fk_link_names.push_back(link_name); - pose = robot_state_->getGlobalLinkTransform(link_name); - pose_stamped.pose = tf2::toMsg(pose); - response.pose_stamped.push_back(pose_stamped); - } - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::SUCCESS; - return ros2_python_extension::toPython(response); - } - - py::bytes getBioIKIK(py::bytes& msg) { - // extra method to use BioIK specific goals - auto request = ros2_python_extension::fromPython(msg); - - bio_ik::BioIKKinematicsQueryOptions ik_options; - ik_options.return_approximate_solution = request.approximate; - ik_options.fixed_joints = request.fixed_joints; - ik_options.replace = true; - - convertGoals(request, ik_options); - - moveit::core::GroupStateValidityCallbackFn callback; - if (request.avoid_collisions) { - std::cout << "Avoid collisions not implemented in bitbots_moveit_bindings"; - exit(1); - } - auto joint_model_group = robot_model_->getJointModelGroup(request.group_name); - if (!joint_model_group) { - std::cout << "Group name in IK call not specified"; - exit(1); - } - - float timeout_seconds = request.timeout.sec + request.timeout.nanosec * 1e9; - bool success = robot_state_->setFromIK(joint_model_group, EigenSTL::vector_Isometry3d(), std::vector(), - timeout_seconds, callback, ik_options); - - robot_state_->update(); - - bio_ik_msgs::msg::IKResponse response; - moveit::core::robotStateToRobotStateMsg(*robot_state_, response.solution); - response.solution_fitness = ik_options.solution_fitness; - if (success) { - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::SUCCESS; - } else { - response.error_code.val = moveit_msgs::msg::MoveItErrorCodes::NO_IK_SOLUTION; - } - return ros2_python_extension::toPython(response); - } - - void setHeadMotors(double pan, double tilt) { - robot_state_->setJointPositions("HeadPan", &pan); - robot_state_->setJointPositions("HeadTilt", &tilt); - } - - void setJointStates(py::bytes msg) { - sensor_msgs::msg::JointState joint_states = ros2_python_extension::fromPython(msg); - for (size_t i = 0; i < joint_states.name.size(); ++i) { - robot_state_->setJointPositions(joint_states.name[i], &joint_states.position[i]); - } - } - - bool checkCollision() { - collision_detection::CollisionRequest req; - collision_detection::CollisionResult res; - collision_detection::AllowedCollisionMatrix acm = planning_scene_->getAllowedCollisionMatrix(); - planning_scene_->checkCollision(req, res, *robot_state_, acm); - return res.collision; - } - - py::bytes getJointStates() { - sensor_msgs::msg::JointState joint_state; - robotStateToJointStateMsg(*robot_state_, joint_state); - return ros2_python_extension::toPython(joint_state); - } - - private: - robot_model_loader::RobotModelLoaderPtr loader_; - moveit::core::RobotModelPtr robot_model_; - moveit::core::RobotStatePtr robot_state_; - planning_scene_monitor::PlanningSceneMonitorPtr planning_scene_monitor_; - planning_scene::PlanningScenePtr planning_scene_; - std::shared_ptr node_; - std::shared_ptr exec_; - std::thread t_; - - static tf2::Vector3 p(const geometry_msgs::msg::Point& p) { return tf2::Vector3(p.x, p.y, p.z); } - - static tf2::Vector3 p(const geometry_msgs::msg::Vector3& p) { return tf2::Vector3(p.x, p.y, p.z); } - - static tf2::Quaternion q(const geometry_msgs::msg::Quaternion& q) { return tf2::Quaternion(q.x, q.y, q.z, q.w); } - - static double w(double w, double def = 1.0) { - if (w == 0 || !std::isfinite(w)) w = def; - return w; - } - - static void convertGoals(const bio_ik_msgs::msg::IKRequest& ik_request, - bio_ik::BioIKKinematicsQueryOptions& ik_options) { - for (auto& m : ik_request.position_goals) { - ik_options.goals.emplace_back(new bio_ik::PositionGoal(m.link_name, p(m.position), w(m.weight))); - } - - for (auto& m : ik_request.orientation_goals) { - ik_options.goals.emplace_back(new bio_ik::OrientationGoal(m.link_name, q(m.orientation), w(m.weight))); - } - - for (auto& m : ik_request.pose_goals) { - auto* g = new bio_ik::PoseGoal(m.link_name, p(m.pose.position), q(m.pose.orientation), w(m.weight)); - g->setRotationScale(w(m.rotation_scale, 0.5)); - ik_options.goals.emplace_back(g); - } - - for (auto& m : ik_request.look_at_goals) { - ik_options.goals.emplace_back(new bio_ik::LookAtGoal(m.link_name, p(m.axis), p(m.target), w(m.weight))); - } - - for (auto& m : ik_request.min_distance_goals) { - ik_options.goals.emplace_back(new bio_ik::MinDistanceGoal(m.link_name, p(m.target), m.distance, w(m.weight))); - } - - for (auto& m : ik_request.max_distance_goals) { - ik_options.goals.emplace_back(new bio_ik::MaxDistanceGoal(m.link_name, p(m.target), m.distance, w(m.weight))); - } - - for (auto& m : ik_request.line_goals) { - ik_options.goals.emplace_back(new bio_ik::LineGoal(m.link_name, p(m.position), p(m.direction), w(m.weight))); - } - - for (const auto& m : ik_request.avoid_joint_limits_goals) { - ik_options.goals.emplace_back(new bio_ik::AvoidJointLimitsGoal(w(m.weight), !m.primary)); - } - - for (const auto& m : ik_request.minimal_displacement_goals) { - ik_options.goals.emplace_back(new bio_ik::MinimalDisplacementGoal(w(m.weight), !m.primary)); - } - - for (const auto& m : ik_request.center_joints_goals) { - ik_options.goals.emplace_back(new bio_ik::CenterJointsGoal(w(m.weight), !m.primary)); - } - - for (auto& m : ik_request.joint_variable_goals) { - ik_options.goals.emplace_back( - new bio_ik::JointVariableGoal(m.variable_name, m.variable_position, w(m.weight), m.secondary)); - } - - for (auto& m : ik_request.balance_goals) { - auto* g = new bio_ik::BalanceGoal(p(m.target), w(m.weight)); - if (m.axis.x || m.axis.y || m.axis.z) { - g->setAxis(p(m.axis)); - } - ik_options.goals.emplace_back(g); - } - - for (auto& m : ik_request.side_goals) { - ik_options.goals.emplace_back(new bio_ik::SideGoal(m.link_name, p(m.axis), p(m.direction), w(m.weight))); - } - - for (auto& m : ik_request.direction_goals) { - ik_options.goals.emplace_back(new bio_ik::DirectionGoal(m.link_name, p(m.axis), p(m.direction), w(m.weight))); - } - - for (auto& m : ik_request.cone_goals) { - ik_options.goals.emplace_back(new bio_ik::ConeGoal(m.link_name, p(m.position), w(m.position_weight), p(m.axis), - p(m.direction), m.angle, w(m.weight))); - } - } -}; - -PYBIND11_MODULE(libbitbots_moveit_bindings, m) { - py::class_>(m, "BitbotsMoveitBindings") - .def(py::init>()) - .def("getPositionIK", &BitbotsMoveitBindings::getPositionIK) - .def("getPositionFK", &BitbotsMoveitBindings::getPositionFK) - .def("getBioIKIK", &BitbotsMoveitBindings::getBioIKIK) - .def("set_head_motors", &BitbotsMoveitBindings::setHeadMotors, - "Set the current pan and tilt joint values [radian]", py::arg("pan"), py::arg("tilt")) - .def("set_joint_states", &BitbotsMoveitBindings::setJointStates, "Set the current joint states") - .def("check_collision", &BitbotsMoveitBindings::checkCollision, "Returns true if the head collides, else false"); -} diff --git a/src/bitbots_motion/bitbots_moveit_bindings/test/test_moveit_bindings.py b/src/bitbots_motion/bitbots_moveit_bindings/test/test_moveit_bindings.py deleted file mode 100644 index 9a9029f586..0000000000 --- a/src/bitbots_motion/bitbots_moveit_bindings/test/test_moveit_bindings.py +++ /dev/null @@ -1,80 +0,0 @@ -import math - -from bio_ik_msgs.msg import IKRequest, LookAtGoal -from bitbots_moveit_bindings import check_collision, get_bioik_ik -from sensor_msgs.msg import JointState - - -def test_get_ik(): - r = IKRequest() - r.group_name = "Head" - r.timeout.sec = 1 - r.approximate = True - r.look_at_goals.append(LookAtGoal()) - r.look_at_goals[0].link_name = "camera" - r.look_at_goals[0].weight = 1.0 - r.look_at_goals[0].axis.x = 1.0 - r.look_at_goals[0].target.x = 0.5 - r.look_at_goals[0].target.y = 0.3 - r.look_at_goals[0].target.z = -0.4 - bio_ik_response = get_bioik_ik(r) - names = bio_ik_response.ik_response.solution.joint_state.name - positions = bio_ik_response.ik_response.solution.joint_state.position - pan = positions[names.index("HeadPan")] - tilt = positions[names.index("HeadTilt")] - assert math.isclose(pan, 0.5321544636603255) - assert math.isclose(tilt, -0.9626794731747034) - - -def test_check_collision(): - x = JointState() - x.name = [ - "HeadPan", - "HeadTilt", - "LShoulderPitch", - "LShoulderRoll", - "LElbow", - "RShoulderPitch", - "RShoulderRoll", - "RElbow", - "LHipYaw", - "LHipRoll", - "LHipPitch", - "LKnee", - "LAnklePitch", - "LAnkleRoll", - "RHipYaw", - "RHipRoll", - "RHipPitch", - "RKnee", - "RAnklePitch", - "RAnkleRoll", - ] - x.position = [ - 0.0, # HeadPan - 0.0, # HeadTilt - 0.0, # LShoulderPitch - 0.0, # LShoulderRoll - 0.79, # LElbow - 0.0, # RShoulderPitch - 0.0, # RShoulderRoll - -0.79, # RElbow - -0.0112, # LHipYaw - -0.0615, # LHipRoll - 0.4732, # LHipPitch - 1.0058, # LKnee - -0.4512, # LAnklePitch - 0.0625, # LAnkleRoll - 0.0112, # RHipYaw - -0.0615, # RHipRoll - -0.4732, # RHipPitch - -1.0059, # RKnee - 0.4512, # RAnklePitch - -0.0625, # RAnkleRoll - ] - - assert not check_collision(x) - x.position[x.name.index("RHipRoll")] = 1 - assert check_collision(x) - x.position[x.name.index("RHipRoll")] = -1 - assert not check_collision(x) diff --git a/src/bitbots_motion/bitbots_quintic_walk/CMakeLists.txt b/src/bitbots_motion/bitbots_quintic_walk/CMakeLists.txt deleted file mode 100644 index 91119a9c4d..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/CMakeLists.txt +++ /dev/null @@ -1,132 +0,0 @@ -cmake_minimum_required(VERSION 3.9) -project(bitbots_quintic_walk) - -# Add support for C++20 -if(NOT CMAKE_CXX_STANDARD) - set(CMAKE_CXX_STANDARD 20) -endif() - -# Include CheckIPOSupported module -include(CheckIPOSupported) - -# Check if IPO is supported -check_ipo_supported(RESULT ipo_supported) -if(ipo_supported) - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) - # Set the number of parallel LTO jobs - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=4") -endif() - -# Build with release optimizations and debug symbols by default -set(CMAKE_BUILD_TYPE RelWithDebug) - -set(PYBIND11_PYTHON_VERSION 3) -set(PYBIND11_FINDPYTHON ON) - -find_package(ament_cmake REQUIRED) -find_package(backward_ros REQUIRED) -find_package(biped_interfaces REQUIRED) -find_package(bitbots_msgs REQUIRED) -find_package(bitbots_splines REQUIRED) -find_package(control_toolbox REQUIRED) -find_package(generate_parameter_library REQUIRED) -find_package(geometry_msgs REQUIRED) -find_package(moveit_ros_planning_interface REQUIRED) -find_package(nav_msgs REQUIRED) -find_package(rclcpp REQUIRED) -find_package(rosidl_default_generators REQUIRED) -find_package(rot_conv REQUIRED) -find_package(sensor_msgs REQUIRED) -find_package(std_msgs REQUIRED) -find_package(tf2 REQUIRED) -find_package(tf2_eigen REQUIRED) -find_package(tf2_geometry_msgs REQUIRED) -find_package(tf2_ros REQUIRED) - -find_package(pybind11 REQUIRED) -find_package(Python3 REQUIRED COMPONENTS Interpreter Development) - -find_package(ros2_python_extension REQUIRED) - -generate_parameter_library(bitbots_quintic_walk_parameters src/parameters.yaml) - -rosidl_generate_interfaces( - ${PROJECT_NAME} "msg/WalkDebug.msg" "msg/WalkEngineDebug.msg" DEPENDENCIES - std_msgs geometry_msgs) - -include_directories(include ${PYTHON_INCLUDE_DIRS}) - -add_compile_options(-Wall -Werror -Wno-unused -Wextra -Wpedantic) - -set(SOURCES src/walk_visualizer.cpp src/walk_engine.cpp src/walk_stabilizer.cpp - src/walk_ik.cpp src/walk_node.cpp) - -add_executable(WalkNode ${SOURCES}) - -ament_target_dependencies( - WalkNode - ament_cmake - backward_ros - biped_interfaces - bitbots_msgs - bitbots_splines - control_toolbox - geometry_msgs - moveit_ros_planning_interface - nav_msgs - rclcpp - rot_conv - sensor_msgs - std_msgs - tf2 - tf2_eigen - tf2_geometry_msgs - tf2_ros) - -rosidl_get_typesupport_target(cpp_typesupport_target ${PROJECT_NAME} - "rosidl_typesupport_cpp") - -target_link_libraries(WalkNode "${cpp_typesupport_target}" - bitbots_quintic_walk_parameters) - -# create the lib -pybind11_add_module(libpy_quintic_walk SHARED src/walk_pywrapper.cpp ${SOURCES}) -ament_target_dependencies( - libpy_quintic_walk - PUBLIC - ament_cmake - biped_interfaces - bitbots_msgs - bitbots_splines - control_toolbox - geometry_msgs - moveit_ros_planning_interface - nav_msgs - rclcpp - ros2_python_extension - rot_conv - sensor_msgs - std_msgs - tf2 - tf2_eigen - tf2_geometry_msgs - tf2_ros) - -target_link_libraries( - libpy_quintic_walk PRIVATE "${cpp_typesupport_target}" - bitbots_quintic_walk_parameters) - -ament_python_install_package(bitbots_quintic_walk_py) - -install(TARGETS libpy_quintic_walk - DESTINATION "${PYTHON_INSTALL_DIR}/bitbots_quintic_walk_py") - -enable_bitbots_docs() - -install(TARGETS WalkNode DESTINATION lib/${PROJECT_NAME}) - -install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) - -install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) - -ament_package() diff --git a/src/bitbots_motion/bitbots_quintic_walk/bitbots_quintic_walk_py/__init__.py b/src/bitbots_motion/bitbots_quintic_walk/bitbots_quintic_walk_py/__init__.py deleted file mode 100644 index 19d8c4b44b..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/bitbots_quintic_walk_py/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# from bitbots_quintic_walk.py_walk_wrapper import PyWalk diff --git a/src/bitbots_motion/bitbots_quintic_walk/bitbots_quintic_walk_py/py_walk.py b/src/bitbots_motion/bitbots_quintic_walk/bitbots_quintic_walk_py/py_walk.py deleted file mode 100644 index f3b4bc30ce..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/bitbots_quintic_walk_py/py_walk.py +++ /dev/null @@ -1,132 +0,0 @@ -from typing import Optional - -from biped_interfaces.msg import Phase -from bitbots_quintic_walk_py.libpy_quintic_walk import PyWalkWrapper -from bitbots_utils.utils import parse_parameter_dict -from geometry_msgs.msg import Pose, PoseArray, Twist -from nav_msgs.msg import Odometry -from rcl_interfaces.msg import Parameter -from rclpy.serialization import deserialize_message, serialize_message -from std_msgs.msg import String - -from bitbots_msgs.msg import JointCommand - - -class PyWalk: - def __init__( - self, - namespace="", - walk_parameters: Optional[list[Parameter]] = None, - moveit_parameters: Optional[list[Parameter]] = None, - set_force_smooth_step_transition=False, - ): - def serialize_parameters(parameters): - if parameters is None: - return [] - return list(map(serialize_message, parameters)) - - self.py_walk_wrapper = PyWalkWrapper( - namespace, - serialize_parameters(walk_parameters), - serialize_parameters(moveit_parameters), - set_force_smooth_step_transition, - ) - - def spin_ros(self): - self.py_walk_wrapper.spin_some() - - def reset(self): - self.py_walk_wrapper.reset() - - def special_reset(self, state: String, phase: float, cmd_vel_msg: Twist, reset_odometry: bool): - state_dict = { - "PAUSED": 0, - "WALKING": 1, - "IDLE": 2, - "START_MOVEMENT": 3, - "STOP_MOVEMENT": 4, - "START_STEP": 5, - "STOP_STEP": 6, - "KICK": 7, - } - self.py_walk_wrapper.special_reset(state_dict[state], phase, serialize_message(cmd_vel_msg), reset_odometry) - - def step(self, dt: float, cmdvel_msg: Twist, imu_msg, jointstate_msg, pressure_left, pressure_right): - if dt == 0.0: - # preventing weird spline interpolation errors on edge case - dt = 0.001 - stepi = self.py_walk_wrapper.step( - dt, - serialize_message(cmdvel_msg), - serialize_message(imu_msg), - serialize_message(jointstate_msg), - serialize_message(pressure_left), - serialize_message(pressure_right), - ) - - result = deserialize_message(stepi, JointCommand) - return result - - def step_relative(self, dt: float, step_msg: Twist, imu_msg, jointstate_msg, pressure_left, pressure_right): - if dt == 0.0: - # preventing weird spline interpolation errors on edge case - dt = 0.001 - stepi = self.py_walk_wrapper.step_relative( - dt, - serialize_message(step_msg), - serialize_message(imu_msg), - serialize_message(jointstate_msg), - serialize_message(pressure_left), - serialize_message(pressure_right), - ) - - result = deserialize_message(stepi, JointCommand) - return result - - def step_open_loop(self, dt: float, cmdvel_msg: Twist): - if dt == 0.0: - # preventing weird spline interpolation errors on edge case - dt = 0.001 - stepi = self.py_walk_wrapper.step_open_loop(dt, serialize_message(cmdvel_msg)) - - result = deserialize_message(stepi, PoseArray) - return result - - def get_left_foot_pose(self): - foot_pose = self.py_walk_wrapper.get_left_foot_pose() - result = deserialize_message(foot_pose, Pose) - return result - - def get_right_foot_pose(self): - foot_pose = self.py_walk_wrapper.get_right_foot_pose() - result = deserialize_message(foot_pose, Pose) - return result - - def set_parameters(self, param_dict): - parameters = parse_parameter_dict(namespace="", parameter_dict=param_dict) - for parameter in parameters: - self.py_walk_wrapper.set_parameter(serialize_message(parameter)) - - def get_phase(self) -> float: - return self.py_walk_wrapper.get_phase() - - def get_freq(self) -> float: - return self.py_walk_wrapper.get_freq() - - def get_support_state(self) -> Phase: - return deserialize_message(self.py_walk_wrapper.get_support_state(), Phase) - - def is_left_support(self) -> bool: - return self.py_walk_wrapper.is_left_support() - - def get_odom(self) -> Odometry: - odom = self.py_walk_wrapper.get_odom() - result = deserialize_message(odom, Odometry) - return result - - def publish_debug(self) -> None: - self.py_walk_wrapper.publish_debug() - - def reset_and_test_if_speed_possible(self, cmd_vel_msg, threshold=0.001): - """Returns true if complete walk cycle with cmd_vel is possible without kinematic issues""" - return self.py_walk_wrapper.reset_and_test_if_speed_possible(serialize_message(cmd_vel_msg), threshold) diff --git a/src/bitbots_motion/bitbots_quintic_walk/cmake/FindEigen.cmake b/src/bitbots_motion/bitbots_quintic_walk/cmake/FindEigen.cmake deleted file mode 100644 index 185230a921..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/cmake/FindEigen.cmake +++ /dev/null @@ -1,9 +0,0 @@ -find_path(Eigen_INCLUDE_DIR Eigen/Core PATHS /usr/include/eigen3 - /usr/local/include/eigen3) - -set(EIGEN_INCLUDE_DIRS ${Eigen_INCLUDE_DIR} ${Eigen_INCLUDE_DIR}/Eigen) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Eigen DEFAULT_MSG Eigen_INCLUDE_DIR) - -mark_as_advanced(Eigen_INCLUDE_DIR) diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_pybullet_wolfgang.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_pybullet_wolfgang.yaml deleted file mode 100644 index 21c208abe8..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_pybullet_wolfgang.yaml +++ /dev/null @@ -1,103 +0,0 @@ -walking: - ros__parameters: - engine: - # Let the foots downward trajectory end above the ground - # this is helpful if the support leg bends - # (in m, >= 0) - foot_put_down_z_offset: 0.0 - # Trunk forward offset proportional to forward step - # (in m) - trunk_x_offset_p_coef_forward: 0.0 - # Trunk forward offset proportional to rotation step - # (in m/rad) - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - double_support_ratio: 0.17407124681764 - first_step_swing_factor: 0.695676008259025 - foot_distance: 0.183237237017914 - foot_rise: 0.0682428071845661 - freq: 1.72942608333153 - trunk_height: 0.359767630133059 - trunk_phase: -0.0427925367409111 - trunk_pitch: -0.107817985747446 - trunk_pitch_p_coef_forward: 0.363276905832546 - trunk_pitch_p_coef_turn: 0.213203672782985 - trunk_swing: 0.0197692602167041 - trunk_x_offset: -0.0268642381401452 - trunk_y_offset: 6.56995918040595e-05 - trunk_z_movement: 0.00762328232306475 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - - - node: - # update frequency of the engine - engine_freq: 500.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: True - - debug_active: False - - max_step_x: 10000.0 - max_step_y: 10000.0 - max_step_xy: 10000.0 - max_step_z: 100000.0 - max_step_angular: 10000.0 - - x_speed_multiplier: 1.09 - y_speed_multiplier: 1.1 - yaw_speed_multiplier: 1.05 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_robot.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_robot.yaml deleted file mode 100644 index 8703757ed1..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_robot.yaml +++ /dev/null @@ -1,139 +0,0 @@ -walking: - ros__parameters: - engine: - # Full walk cycle frequency - # (in Hz, > 0) - freq: 1.3 - # Length of double support phase in half cycle - # (ratio, [0:1]) - double_support_ratio: 0.05 - # Lateral distance between the feet center - # (in m, >= 0) - foot_distance: 0.2 - # Maximum flying foot height - # (in m, >= 0) - foot_rise: 0.06 - # Pause of Z movement on highest point - # (single support cycle ratio, [0,1]) - foot_z_pause: 0.0 - # Phase of flying foot apex - # (single support cycle phase, [0:1]) - foot_apex_phase: 0.5 - # Let the foot's downward trajectory end above the ground - # this is helpful if the support leg bends - # (in m, >= 0) - foot_put_down_z_offset: 0.0 - #Phase time for moving the foot from Z offset to ground - #(in half cycle ratio [0:1]) - foot_put_down_phase: 1.0 - # Foot X/Y overshoot in ratio of step length - # (ratio, >= 0) - foot_overshoot_ratio: 0.1 - # Foot X/Y overshoot phase - # (single support cycle phase, [foot_apex_phase:1] - foot_overshoot_phase: 0.85 - # Height of the trunk from ground - # (in m, > 0) - trunk_height: 0.40 - # Trunk pitch orientation - # (in rad) - trunk_pitch: 0.14 - # Phase offset of trunk oscillation - # (half cycle phase, [-1:1]) - trunk_phase: -0.1 - # Trunk forward offset - # (in m) - trunk_x_offset: 0.0 - # Trunk lateral offset - # (in m) - trunk_y_offset: 0.005 - # Trunk lateral oscillation amplitude ratio - # (ratio, >= 0) - trunk_swing: 0.2 - # Trunk swing pause length in phase at apex - # (half cycle ratio, [0:1]) - trunk_pause: 0.0 - # Trunk forward offset proportional to forward step - # (in m) - trunk_x_offset_p_coef_forward: 0.0 - # Trunk forward offset proportional to rotation step - # (in m/rad) - trunk_x_offset_p_coef_turn: 0.0 - # Trunk pitch orientation proportional to forward step - # (in rad/m) - trunk_pitch_p_coef_forward: 1.2 - # Trunk pitch orientation proportional to rotation step - # (in 1) - trunk_pitch_p_coef_turn: -0.05 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - - trunk_z_movement: 0.0 - - node: - # update frequency of the engine - engine_freq: 500.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: True - - debug_active: False - - max_step_x: 10000.0 - max_step_y: 10000.0 - max_step_xy: 10000.0 - max_step_z: 100000.0 - max_step_angular: 10000.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_chape.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_chape.yaml deleted file mode 100644 index 6c21e06f64..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_chape.yaml +++ /dev/null @@ -1,97 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.06026382706519236 - foot_distance: 0.08485058147821732 - foot_rise: 0.02827163125701234 - freq: 2.6708541770742014 - trunk_height: 0.22297781576361783 - trunk_phase: 0.07166979049047359 - trunk_pitch: 0.30769401909296024 - trunk_pitch_p_coef_forward: -0.6964761091400835 - trunk_pitch_p_coef_turn: 0.07945015134578874 - trunk_swing: 0.02438193835064321 - trunk_x_offset: -0.0015420902581150186 - trunk_y_offset: 0.006182015682219742 - trunk_z_movement: 0.027519261829506734 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 3.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_mrl_hsl.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_mrl_hsl.yaml deleted file mode 100644 index 04a0eb0b7e..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_mrl_hsl.yaml +++ /dev/null @@ -1,98 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.04363191512788584 - foot_distance: 0.1516515743703797 - foot_rise: 0.07200183676457605 - freq: 2.950460419608511 - trunk_height: 0.25049734782436134 - trunk_phase: -0.1228707827877056 - trunk_pitch: 0.11543700947062846 - trunk_pitch_p_coef_forward: -0.27790050079494094 - trunk_pitch_p_coef_turn: -0.05310904366171693 - trunk_swing: 0.25510119337230386 - trunk_x_offset: 0.038042713742533284 - trunk_y_offset: 0.0008428426820471656 - trunk_z_movement: 0.007069801133420691 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 200.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - x_speed_multiplier: 1.35 - y_speed_multiplier: 1.66 - yaw_speed_multiplier: 1.66 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_op3.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_op3.yaml deleted file mode 100644 index 37ef936a94..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_op3.yaml +++ /dev/null @@ -1,97 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.09439958259951316 - foot_distance: 0.08112006826598116 - foot_rise: 0.07452126485138334 - freq: 2.9619104273883945 - trunk_height: 0.19969924608293949 - trunk_phase: 0.016724329434136258 - trunk_pitch: 0.28416390753017073 - trunk_pitch_p_coef_forward: 1.5381056976788208 - trunk_pitch_p_coef_turn: -0.25402907175854494 - trunk_swing: 0.018371801485258504 - trunk_x_offset: 0.02166463794967113 - trunk_y_offset: -0.00040828060252254684 - trunk_z_movement: 0.020363149369426233 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 3.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_rfc.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_rfc.yaml deleted file mode 100644 index c3680a5db0..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_rfc.yaml +++ /dev/null @@ -1,98 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - - double_support_ratio: 0.21065044655777365 - foot_distance: 0.18798551840631933 - foot_rise: 0.11811624092819002 - freq: 2.993968323573039 - trunk_height: 0.32637691564562205 - trunk_phase: -0.25332467061367503 - trunk_pitch: 0.41907250744349495 - trunk_pitch_p_coef_forward: -1.3647181211487023 - trunk_pitch_p_coef_turn: -0.006652153811469368 - trunk_swing: 0.42580801916351607 - trunk_x_offset: -0.007025557000380819 - trunk_y_offset: -0.001137005897413421 - trunk_z_movement: 0.02120359533668483 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 200.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1.0 - max_step_y: 1.0 - max_step_xy: 1.0 - max_step_z: 1.0 - max_step_angular: 1.0 - - x_speed_multiplier: 1.35 - y_speed_multiplier: 1.66 - yaw_speed_multiplier: 1.66 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_wolfgang.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_wolfgang.yaml deleted file mode 100644 index aaf9806739..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/deep_quintic_webots_wolfgang.yaml +++ /dev/null @@ -1,96 +0,0 @@ -walking: - ros__parameters: - engine: - foot_put_down_z_offset: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - double_support_ratio: 0.0264282002140171 - first_step_swing_factor: 1.80591386587488 - foot_distance: 0.179900277671633 - foot_rise: 0.0819786291304007 - freq: 1.96331645572213 - trunk_height: 0.394780002666927 - trunk_phase: -0.151653984431689 - trunk_pitch: 0.105566178884548 - trunk_pitch_p_coef_forward: -0.186068274875133 - trunk_pitch_p_coef_turn: -0.457339940581988 - trunk_swing: 0.154856652745882 - trunk_x_offset: 0.00885762700992359 - trunk_y_offset: 0.00369752824507733 - trunk_z_movement: 0.0155005052923747 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - - - node: - # update frequency of the engine - engine_freq: 500.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: True - - debug_active: False - - max_step_x: 10000.0 - max_step_y: 10000.0 - max_step_xy: 10000.0 - max_step_z: 100000.0 - max_step_angular: 10000.0 - - x_speed_multiplier: 1.3 - y_speed_multiplier: 1.5 - yaw_speed_multiplier: 1.5 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/optimization.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/optimization.yaml deleted file mode 100644 index c9dde082e4..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/optimization.yaml +++ /dev/null @@ -1,73 +0,0 @@ -/**: - ros__parameters: - use_sim_time: True - engine: - foot_apex_phase: 0.5 - foot_z_pause: 0.0 - trunk_pause: 0.0 - foot_put_down_phase: 1.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - engine_freq: 200.0 - - ik: - timeout: 0.01 - reset: False - - debug_active: False - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.0 - foot_pressure: - active: False - ground_min_pressure: 0.0 - effort: - active: False - joint_min_effort: 0.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/plotjuggler_layout.xml b/src/bitbots_motion/bitbots_quintic_walk/config/plotjuggler_layout.xml deleted file mode 100644 index c6bbf34cae..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/plotjuggler_layout.xml +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - var prevX = 0 -var prevY = 0 - dx = time - prevX -dy = value - prevY -prevX = time -prevY = value - -return dy/dx - - - var prevY = 0 -var alpha = 0.1 - prevY = alpha * value + (1.-alpha) * prevY - -return prevY - - - - return value*2 - - - - return $$PLOT_A$$ + $$PLOT_B$$ - - - // source: https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles - -function quaternionToYaw(x, y, z, w) -{ - // yaw (z-axis rotation) - t1 = 2.0 * (w * z + x * y); - t2 = 1.0 - 2.0 * (y * y + z * z); - yaw = Math.atan2(t1, t2); - - return yaw -} - return quaternionToYaw(x, y, z, w); - - - - - diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/robots/amy.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/robots/amy.yaml deleted file mode 100644 index 945a52ba1c..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/robots/amy.yaml +++ /dev/null @@ -1,8 +0,0 @@ -# This file contains robot specific overrides to account for slight the differences in the robots. - -walking: - ros__parameters: - engine: - trunk_x_offset: -0.01 - node: - x_bias: -0.01 diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/robots/default.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/robots/default.yaml deleted file mode 100644 index 4b65b7ce47..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/robots/default.yaml +++ /dev/null @@ -1,3 +0,0 @@ -# Empty placeholder file if no robot is specified -# DO NOT USE THIS FILE TO CHANGE PARAMETERS -# Use the general config file instead diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/robots/donna.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/robots/donna.yaml deleted file mode 100644 index 139a4431cd..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/robots/donna.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# This file contains robot specific overrides to account for slight the differences in the robots. - -walking: - ros__parameters: - engine: - trunk_x_offset: 0.01 diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/robots/jack.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/robots/jack.yaml deleted file mode 100644 index 139a4431cd..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/robots/jack.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# This file contains robot specific overrides to account for slight the differences in the robots. - -walking: - ros__parameters: - engine: - trunk_x_offset: 0.01 diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/robots/melody.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/robots/melody.yaml deleted file mode 100644 index cda67ccde8..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/robots/melody.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# This file contains robot specific overrides to account for slight the differences in the robots. - -walking: - ros__parameters: - engine: - trunk_x_offset: 0.0 diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/robots/rory.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/robots/rory.yaml deleted file mode 100644 index 7c48aea0fb..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/robots/rory.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# This file contains robot specific overrides to account for slight the differences in the robots. - -walking: - ros__parameters: - engine: - trunk_x_offset: -0.005 - diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walk.rviz b/src/bitbots_motion/bitbots_quintic_walk/config/walk.rviz deleted file mode 100644 index 728c9cee15..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walk.rviz +++ /dev/null @@ -1,568 +0,0 @@ -Panels: - - Class: rviz_common/Displays - Help Height: 78 - Name: Displays - Property Tree Widget: - Expanded: - - /Global Options1 - - /Status1 - - /RobotModel1 - - /TF1 - Splitter Ratio: 0.5 - Tree Height: 746 - - Class: rviz_common/Selection - Name: Selection - - Class: rviz_common/Tool Properties - Expanded: - - /2D Goal Pose1 - - /Publish Point1 - Name: Tool Properties - Splitter Ratio: 0.5886790156364441 - - Class: rviz_common/Views - Expanded: - - /Current View1 - Name: Views - Splitter Ratio: 0.5 - - Class: rviz_common/Time - Experimental: false - Name: Time - SyncMode: 0 - SyncSource: "" -Visualization Manager: - Class: "" - Displays: - - Alpha: 0.5 - Cell Size: 1 - Class: rviz_default_plugins/Grid - Color: 160; 160; 164 - Enabled: false - Line Style: - Line Width: 0.029999999329447746 - Value: Lines - Name: Grid - Normal Cell Count: 0 - Offset: - X: 0 - Y: 0 - Z: 0 - Plane: XY - Plane Cell Count: 10 - Reference Frame: - Value: false - - Alpha: 1 - Class: rviz_default_plugins/RobotModel - Collision Enabled: false - Description File: "" - Description Source: Topic - Description Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /robot_description - Enabled: true - Links: - All Links Enabled: true - Expand Joint Details: false - Expand Link Details: false - Expand Tree: false - Link Tree Style: Links in Alphabetic Order - base_link: - Alpha: 1 - Show Axes: false - Show Trail: false - camera: - Alpha: 1 - Show Axes: false - Show Trail: false - camera_optical_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - head: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - imu_frame: - Alpha: 1 - Show Axes: false - Show Trail: false - imu_frame_2: - Alpha: 1 - Show Axes: false - Show Trail: false - l_ankle: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_cleat_l_back: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_l_front: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_r_back: - Alpha: 1 - Show Axes: false - Show Trail: false - l_cleat_r_front: - Alpha: 1 - Show Axes: false - Show Trail: false - l_foot: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_hip_1: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_hip_2: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_lower_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_lower_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_shoulder: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_sole: - Alpha: 1 - Show Axes: false - Show Trail: false - l_toe: - Alpha: 1 - Show Axes: false - Show Trail: false - l_upper_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_upper_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - l_wrist: - Alpha: 1 - Show Axes: false - Show Trail: false - llb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - llf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - lrb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - lrf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - neck: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_ankle: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_cleat_l_back: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_l_front: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_r_back: - Alpha: 1 - Show Axes: false - Show Trail: false - r_cleat_r_front: - Alpha: 1 - Show Axes: false - Show Trail: false - r_foot: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_hip_1: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_hip_2: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_lower_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_lower_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_shoulder: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_sole: - Alpha: 1 - Show Axes: false - Show Trail: false - r_toe: - Alpha: 1 - Show Axes: false - Show Trail: false - r_upper_arm: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_upper_leg: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - r_wrist: - Alpha: 1 - Show Axes: false - Show Trail: false - rlb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rlf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rrb: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - rrf: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - torso: - Alpha: 1 - Show Axes: false - Show Trail: false - Value: true - Mass Properties: - Inertia: false - Mass: false - Name: RobotModel - TF Prefix: "" - Update Interval: 0 - Value: true - Visual Enabled: true - - Class: rviz_default_plugins/TF - Enabled: true - Frame Timeout: 15 - Frames: - All Enabled: true - base_footprint: - Value: true - base_link: - Value: true - camera: - Value: true - camera_optical_frame: - Value: true - head: - Value: true - imu_frame: - Value: true - imu_frame_2: - Value: true - l_ankle: - Value: true - l_cleat_l_back: - Value: true - l_cleat_l_front: - Value: true - l_cleat_r_back: - Value: true - l_cleat_r_front: - Value: true - l_foot: - Value: true - l_hip_1: - Value: true - l_hip_2: - Value: true - l_lower_arm: - Value: true - l_lower_leg: - Value: true - l_shoulder: - Value: true - l_sole: - Value: true - l_toe: - Value: true - l_upper_arm: - Value: true - l_upper_leg: - Value: true - l_wrist: - Value: true - llb: - Value: true - llf: - Value: true - lrb: - Value: true - lrf: - Value: true - neck: - Value: true - odom: - Value: true - r_ankle: - Value: true - r_cleat_l_back: - Value: true - r_cleat_l_front: - Value: true - r_cleat_r_back: - Value: true - r_cleat_r_front: - Value: true - r_foot: - Value: true - r_hip_1: - Value: true - r_hip_2: - Value: true - r_lower_arm: - Value: true - r_lower_leg: - Value: true - r_shoulder: - Value: true - r_sole: - Value: true - r_toe: - Value: true - r_upper_arm: - Value: true - r_upper_leg: - Value: true - r_wrist: - Value: true - rlb: - Value: true - rlf: - Value: true - rotation: - Value: true - rrb: - Value: true - rrf: - Value: true - torso: - Value: true - Marker Scale: 0.20000000298023224 - Name: TF - Show Arrows: true - Show Axes: true - Show Names: false - Tree: - odom: - base_link: - base_footprint: - {} - rotation: - {} - torso: - imu_frame: - {} - l_hip_1: - l_hip_2: - l_upper_leg: - l_lower_leg: - l_ankle: - l_foot: - l_sole: - {} - l_toe: - {} - llb: - l_cleat_l_back: - {} - llf: - l_cleat_l_front: - {} - lrb: - l_cleat_r_back: - {} - lrf: - l_cleat_r_front: - {} - l_shoulder: - l_upper_arm: - l_lower_arm: - l_wrist: - {} - neck: - head: - camera: - {} - camera_optical_frame: - {} - imu_frame_2: - {} - r_hip_1: - r_hip_2: - r_upper_leg: - r_lower_leg: - r_ankle: - r_foot: - r_sole: - {} - r_toe: - {} - rlb: - r_cleat_l_back: - {} - rlf: - r_cleat_l_front: - {} - rrb: - r_cleat_r_back: - {} - rrf: - r_cleat_r_front: - {} - r_shoulder: - r_upper_arm: - r_lower_arm: - r_wrist: - {} - Update Interval: 0 - Value: true - Enabled: true - Global Options: - Background Color: 166; 255; 176 - Fixed Frame: base_link - Frame Rate: 30 - Name: root - Tools: - - Class: rviz_default_plugins/Interact - Hide Inactive Objects: true - - Class: rviz_default_plugins/MoveCamera - - Class: rviz_default_plugins/Select - - Class: rviz_default_plugins/FocusCamera - - Class: rviz_default_plugins/Measure - Line color: 128; 128; 0 - - Class: rviz_default_plugins/SetInitialPose - Covariance x: 0.25 - Covariance y: 0.25 - Covariance yaw: 0.06853891909122467 - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /initialpose - - Class: rviz_default_plugins/SetGoal - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /goal_pose - - Class: rviz_default_plugins/PublishPoint - Single click: true - Topic: - Depth: 5 - Durability Policy: Volatile - History Policy: Keep Last - Reliability Policy: Reliable - Value: /clicked_point - Transformation: - Current: - Class: rviz_default_plugins/TF - Value: true - Views: - Current: - Class: rviz_default_plugins/Orbit - Distance: 1.5293351411819458 - Enable Stereo Rendering: - Stereo Eye Separation: 0.05999999865889549 - Stereo Focal Distance: 1 - Swap Stereo Eyes: false - Value: false - Focal Point: - X: 0.19741742312908173 - Y: 0.18146607279777527 - Z: -0.09782134741544724 - Focal Shape Fixed Size: true - Focal Shape Size: 0.05000000074505806 - Invert Z Axis: false - Name: Current View - Near Clip Distance: 0.009999999776482582 - Pitch: 0.30999955534935 - Target Frame: - Value: Orbit (rviz) - Yaw: 5.638584136962891 - Saved: ~ -Window Geometry: - Displays: - collapsed: false - Height: 1043 - Hide Left Dock: false - Hide Right Dock: false - QMainWindow State: 000000ff00000000fd00000004000000000000015600000375fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000005c00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c006100790073010000003d00000375000000c900fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f00000375fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073010000003d00000375000000a400fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000007800000003efc0100000002fb0000000800540069006d0065010000000000000780000002eb00fffffffb0000000800540069006d006501000000000000045000000000000000000000050f0000037500000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000 - Selection: - collapsed: false - Time: - collapsed: false - Tool Properties: - collapsed: false - Views: - collapsed: false - Width: 1920 - X: 1920 - Y: 0 diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_bez_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_bez_simulator.yaml deleted file mode 100644 index 6e3b7b8de3..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_bez_simulator.yaml +++ /dev/null @@ -1,98 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.045131378535733374 - foot_distance: 0.1182223592723169 - foot_rise: 0.031372045915313035 - freq: 2.375736749468444 - trunk_height: 0.1501678299581661 - trunk_phase: -0.15040306769742323 - trunk_pitch: 0.10209826243691665 - trunk_pitch_p_coef_forward: -0.5440046873910453 - trunk_pitch_p_coef_turn: 0.017410229990219222 - trunk_swing: 0.5116168585503343 - trunk_x_offset: -0.020585127014633515 - trunk_y_offset: -0.001891199529514144 - trunk_z_movement: 0.030701889462378763 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 3.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_chape_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_chape_simulator.yaml deleted file mode 100644 index 6c21e06f64..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_chape_simulator.yaml +++ /dev/null @@ -1,97 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.06026382706519236 - foot_distance: 0.08485058147821732 - foot_rise: 0.02827163125701234 - freq: 2.6708541770742014 - trunk_height: 0.22297781576361783 - trunk_phase: 0.07166979049047359 - trunk_pitch: 0.30769401909296024 - trunk_pitch_p_coef_forward: -0.6964761091400835 - trunk_pitch_p_coef_turn: 0.07945015134578874 - trunk_swing: 0.02438193835064321 - trunk_x_offset: -0.0015420902581150186 - trunk_y_offset: 0.006182015682219742 - trunk_z_movement: 0.027519261829506734 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 3.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_gankenkun_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_gankenkun_simulator.yaml deleted file mode 100644 index 342305b572..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_gankenkun_simulator.yaml +++ /dev/null @@ -1,142 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - # Full walk cycle frequency - # (in Hz, > 0) - freq: 1.8 - # Length of double support phase in half cycle - # (ratio, [0:1]) - double_support_ratio: 0.2 - # Lateral distance between the feet center - # (in m, >= 0) - foot_distance: 0.15 - # Maximum flying foot height - # (in m, >= 0) - foot_rise: 0.06 - # Pause of Z movement on highest point - # (single support cycle ratio, [0,1]) - foot_z_pause: 0.0 - # Phase of flying foot apex - # (single support cycle phase, [0:1]) - foot_apex_phase: 0.5 - # Let the foot's downward trajectory end above the ground - # this is helpful if the support leg bends - # (in m, >= 0) - foot_put_down_z_offset: 0.0 - #Phase time for moving the foot from Z offset to ground - #(in half cycle ratio [0:1]) - foot_put_down_phase: 1.0 - # Foot X/Y overshoot in ratio of step length - # (ratio, >= 0) - foot_overshoot_ratio: 0.1 - # Foot X/Y overshoot phase - # (single support cycle phase, [foot_apex_phase:1] - foot_overshoot_phase: 0.85 - # Height of the trunk from ground - # (in m, > 0) - trunk_height: 0.25 - # Trunk pitch orientation - # (in rad) - trunk_pitch: 0.0 - # Phase offset of trunk oscillation - # (half cycle phase, [-1:1]) - trunk_phase: -0.1 - # Trunk forward offset - # (in m) - trunk_x_offset: 0.0 - # Trunk lateral offset - # (in m) - trunk_y_offset: 0.00 - # Trunk lateral oscillation amplitude ratio - # (ratio, >= 0) - trunk_swing: 0.4 - # Trunk swing pause length in phase at apex - # (half cycle ratio, [0:1]) - trunk_pause: 0.0 - # Trunk forward offset proportional to forward step - # (in m) - trunk_x_offset_p_coef_forward: 0.0 - # Trunk forward offset proportional to rotation step - # (in m/rad) - trunk_x_offset_p_coef_turn: 0.0 - # Trunk pitch orientation proportional to forward step - # (in rad/m) - trunk_pitch_p_coef_forward: 1.2 - # Trunk pitch orientation proportional to rotation step - # (in 1) - trunk_pitch_p_coef_turn: -0.05 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - - trunk_z_movement: 0.0 - - node: - # update frequency of the engine - engine_freq: 200.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1.0 - max_step_y: 1.0 - max_step_xy: 1.0 - max_step_z: 1.0 - max_step_angular: 1.0 - - x_speed_multiplier: 1.35 - y_speed_multiplier: 1.66 - yaw_speed_multiplier: 1.66 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.111 - i: 0.01 - d: 0.0 - i_clamp_min: -0.25 - i_clamp_max: 0.25 - antiwindup: False - roll: - p: 0.111 - i: 0.01 - d: 0.0 - i_clamp_min: -0.25 - i_clamp_max: 0.25 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_mrl_hsl_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_mrl_hsl_simulator.yaml deleted file mode 100644 index 4e9d180688..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_mrl_hsl_simulator.yaml +++ /dev/null @@ -1,97 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.04363191512788584 - foot_distance: 0.1516515743703797 - foot_rise: 0.07200183676457605 - freq: 2.950460419608511 - trunk_height: 0.25049734782436134 - trunk_phase: -0.1228707827877056 - trunk_pitch: 0.11543700947062846 - trunk_pitch_p_coef_forward: -0.27790050079494094 - trunk_pitch_p_coef_turn: -0.05310904366171693 - trunk_swing: 0.25510119337230386 - trunk_x_offset: 0.038042713742533284 - trunk_y_offset: 0.0008428426820471656 - trunk_z_movement: 0.007069801133420691 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 200.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - x_speed_multiplier: 1.35 - y_speed_multiplier: 1.66 - yaw_speed_multiplier: 1.66 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_nao_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_nao_simulator.yaml deleted file mode 100644 index 043a4eca26..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_nao_simulator.yaml +++ /dev/null @@ -1,97 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.3024282674039902 - foot_distance: 0.08001096328465564 - foot_rise: 0.05998189641726781 - freq: 2.845618820911015 - trunk_height: 0.2983030559136974 - trunk_phase: 0.12827615590083075 - trunk_pitch: -0.055110618389264815 - trunk_pitch_p_coef_forward: -0.12637788250249904 - trunk_pitch_p_coef_turn: -0.2667355426805498 - trunk_swing: 0.01645550463939423 - trunk_x_offset: 0.006597025399470368 - trunk_y_offset: 0.000866895485109485 - trunk_z_movement: 0.023616176690388607 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 3.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_nugus_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_nugus_simulator.yaml deleted file mode 100644 index 77603943fb..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_nugus_simulator.yaml +++ /dev/null @@ -1,97 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.02126588783229817 - foot_distance: 0.16573612838905935 - foot_rise: 0.06696921459985106 - freq: 2.882156171492855 - trunk_height: 0.42587245947072816 - trunk_phase: -0.10781713685949587 - trunk_pitch: 0.3960581214540991 - trunk_pitch_p_coef_forward: -1.098538426705446 - trunk_pitch_p_coef_turn: 0.23005408256772517 - trunk_swing: 0.03066984644163803 - trunk_x_offset: 0.022805009368515608 - trunk_y_offset: 0.0066027606288281675 - trunk_z_movement: 0.0043397277185938995 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 200.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1.0 - max_step_y: 1.0 - max_step_xy: 1.0 - max_step_z: 1.0 - max_step_angular: 1.0 - - x_speed_multiplier: 1.35 - y_speed_multiplier: 1.66 - yaw_speed_multiplier: 1.66 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_op3_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_op3_simulator.yaml deleted file mode 100644 index 37ef936a94..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_op3_simulator.yaml +++ /dev/null @@ -1,97 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.09439958259951316 - foot_distance: 0.08112006826598116 - foot_rise: 0.07452126485138334 - freq: 2.9619104273883945 - trunk_height: 0.19969924608293949 - trunk_phase: 0.016724329434136258 - trunk_pitch: 0.28416390753017073 - trunk_pitch_p_coef_forward: 1.5381056976788208 - trunk_pitch_p_coef_turn: -0.25402907175854494 - trunk_swing: 0.018371801485258504 - trunk_x_offset: 0.02166463794967113 - trunk_y_offset: -0.00040828060252254684 - trunk_z_movement: 0.020363149369426233 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 3.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_rfc_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_rfc_simulator.yaml deleted file mode 100644 index c3680a5db0..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_rfc_simulator.yaml +++ /dev/null @@ -1,98 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - - double_support_ratio: 0.21065044655777365 - foot_distance: 0.18798551840631933 - foot_rise: 0.11811624092819002 - freq: 2.993968323573039 - trunk_height: 0.32637691564562205 - trunk_phase: -0.25332467061367503 - trunk_pitch: 0.41907250744349495 - trunk_pitch_p_coef_forward: -1.3647181211487023 - trunk_pitch_p_coef_turn: -0.006652153811469368 - trunk_swing: 0.42580801916351607 - trunk_x_offset: -0.007025557000380819 - trunk_y_offset: -0.001137005897413421 - trunk_z_movement: 0.02120359533668483 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 200.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1.0 - max_step_y: 1.0 - max_step_xy: 1.0 - max_step_z: 1.0 - max_step_angular: 1.0 - - x_speed_multiplier: 1.35 - y_speed_multiplier: 1.66 - yaw_speed_multiplier: 1.66 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_robotis_op2_optimized_single_steps.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_robotis_op2_optimized_single_steps.yaml deleted file mode 100644 index 0760c10d81..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_robotis_op2_optimized_single_steps.yaml +++ /dev/null @@ -1,94 +0,0 @@ -walking: - ros__parameters: - engine: - double_support_ratio: 0.25 - first_step_swing_factor: 1.0 - foot_distance: 0.0892010830100436 - foot_rise: 0.07 - freq: 0.5 - trunk_height: 0.183555759791475 - trunk_phase: -0.0012469948672716 - trunk_pitch: 0.1 - trunk_swing: 1.4 - trunk_x_offset: 0.0233908598440774 - trunk_y_offset: -0.000632849143066137 - trunk_z_movement: 0.0 - early_termination_at: [0.0, 7.0, 0.0] - first_step_trunk_phase: 0.0 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_pitch_p_coef_forward: 0.0 - trunk_pitch_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - foot_put_down_z_offset: 0.0 - - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 3.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_robotis_op2_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_robotis_op2_simulator.yaml deleted file mode 100644 index 80b4f1ed0e..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_robotis_op2_simulator.yaml +++ /dev/null @@ -1,97 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - double_support_ratio: 0.0342053586648699 - foot_distance: 0.09973162505805092 - foot_rise: 0.05497813229129129 - freq: 2.0602972468934273 - trunk_height: 0.1949735738488786 - trunk_phase: -0.17379341200557888 - trunk_pitch: 0.23552387717562837 - trunk_pitch_p_coef_forward: -1.096883550989211 - trunk_pitch_p_coef_turn: 0.21536524931847206 - trunk_swing: 0.6061210769507791 - trunk_x_offset: 0.00807400804768213 - trunk_y_offset: -0.002372826648678044 - trunk_z_movement: 0.029207151813393558 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 3.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_sahrv74_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_sahrv74_simulator.yaml deleted file mode 100644 index d3c412c11f..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_sahrv74_simulator.yaml +++ /dev/null @@ -1,143 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - # Full walk cycle frequency - # (in Hz, > 0) - freq: 1.8 - # Length of double support phase in half cycle - # (ratio, [0:1]) - double_support_ratio: 0.2 - # Lateral distance between the feet center - # (in m, >= 0) - foot_distance: 0.15 - # Maximum flying foot height - # (in m, >= 0) - foot_rise: 0.06 - # Pause of Z movement on highest point - # (single support cycle ratio, [0,1]) - foot_z_pause: 0.0 - # Phase of flying foot apex - # (single support cycle phase, [0:1]) - foot_apex_phase: 0.5 - # Let the foot's downward trajectory end above the ground - # this is helpful if the support leg bends - # (in m, >= 0) - foot_put_down_z_offset: 0.0 - #Phase time for moving the foot from Z offset to ground - #(in half cycle ratio [0:1]) - foot_put_down_phase: 1.0 - # Foot X/Y overshoot in ratio of step length - # (ratio, >= 0) - foot_overshoot_ratio: 0.1 - # Foot X/Y overshoot phase - # (single support cycle phase, [foot_apex_phase:1] - foot_overshoot_phase: 0.85 - # Height of the trunk from ground - # (in m, > 0) - trunk_height: 0.35 - # Trunk pitch orientation - # (in rad) - trunk_pitch: 0.05 - # Phase offset of trunk oscillation - # (half cycle phase, [-1:1]) - trunk_phase: -0.1 - # Trunk forward offset - # (in m) - trunk_x_offset: 0.0 - # Trunk lateral offset - # (in m) - trunk_y_offset: 0.00 - # Trunk lateral oscillation amplitude ratio - # (ratio, >= 0) - trunk_swing: 0.4 - # Trunk swing pause length in phase at apex - # (half cycle ratio, [0:1]) - trunk_pause: 0.0 - # Trunk forward offset proportional to forward step - # (in m) - trunk_x_offset_p_coef_forward: 0.0 - # Trunk forward offset proportional to rotation step - # (in m/rad) - trunk_x_offset_p_coef_turn: 0.0 - # Trunk pitch orientation proportional to forward step - # (in rad/m) - trunk_pitch_p_coef_forward: 1.2 - # Trunk pitch orientation proportional to rotation step - # (in 1) - trunk_pitch_p_coef_turn: -0.05 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - - trunk_z_movement: 0.0 - - node: - # update frequency of the engine - engine_freq: 200.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: False - - debug_active: True - - max_step_x: 1.0 - max_step_y: 1.0 - max_step_xy: 1.0 - max_step_z: 1.0 - max_step_angular: 1.0 - - x_speed_multiplier: 1.35 - y_speed_multiplier: 1.66 - yaw_speed_multiplier: 1.66 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.111 - i: 0.01 - d: 0.0 - i_clamp_min: -0.25 - i_clamp_max: 0.25 - antiwindup: False - roll: - p: 0.111 - i: 0.01 - d: 0.0 - i_clamp_min: -0.25 - i_clamp_max: 0.25 - antiwindup: False - diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_evaluation.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_evaluation.yaml deleted file mode 100644 index 539acbd13c..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_evaluation.yaml +++ /dev/null @@ -1,96 +0,0 @@ -walking: - ros__parameters: - engine: - double_support_ratio: 0.344712138054358 - first_step_swing_factor: 0.655732438779827 - foot_distance: 0.179014406520205 - foot_rise: 0.0691599578967284 - freq: 1.54162204748046 - trunk_height: 0.323123253829563 - trunk_phase: -0.0743933506894948 - trunk_pitch: 0.21401534769464 - trunk_pitch_p_coef_forward: 0.278779805055009 - trunk_pitch_p_coef_turn: 2.3824552096713 - trunk_swing: 0.359304758903818 - trunk_x_offset: -0.0495856564961475 - trunk_y_offset: 0.00109375178761593 - trunk_z_movement: 0.0731081454325577 - directions_left: 49.0 - fall_sum: 0.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_z_pause: 0.0 - gyro_obj: 0.006583455791882188 - last_pose_obj: 0.2759057237031307 - orientation_obj: 0.1545917664648956 - pose_obj: 0.11224960109409649 - stability_obj: 0.0805876111283889 - termination_reason: pose - trunk_pause: 0.0 - s_nsga2:generation: 10.0 - s_nsga2:parents: [215322, 215250] - - node: - # update frequency of the engine - engine_freq: 1000.0 - - # parameters for bioIK - ik: - timeout: 0.001 - reset: True - - debug_active: False - - max_step_x: 1000.0 - max_step_y: 1000.0 - max_step_xy: 1000.0 - max_step_z: 1000.0 - max_step_angular: 1000.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_robot.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_robot.yaml deleted file mode 100644 index 1084d16623..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_robot.yaml +++ /dev/null @@ -1,94 +0,0 @@ -walking: - ros__parameters: - engine: - double_support_ratio: 0.05 - first_step_swing_factor: 0.7 - first_step_trunk_phase: -0.25 - foot_apex_phase: 0.5 - foot_apex_pitch: 0.0 - foot_distance: 0.2 - foot_overshoot_phase: 0.92 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_rise: 0.04 - foot_z_pause: 0.0 - freq: 1.0 - kick_length: 0.12 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - kick_vel: 0.2 - trunk_height: 0.38 - trunk_pause: 0.0 - trunk_phase: -0.1 - trunk_pitch: 0.2 - trunk_pitch_p_coef_forward: 0.0 - trunk_pitch_p_coef_turn: 0.0 - trunk_swing: 0.25 - trunk_x_offset: -0.01 - trunk_x_offset_p_coef_forward: 0.1 - trunk_x_offset_p_coef_turn: 0.0 - trunk_y_offset: 0.0 - trunk_z_movement: 0.0 - node: - # update frequency of the engine - debug_active: true - engine_freq: 125.0 - # parameters for bioIK - ik: - reset: true - timeout: 0.01 - imu_y_acc_tau: 0.2 - max_step_angular: 1.0 - max_step_x: 1.0 - max_step_xy: 1.0 - max_step_y: 1.0 - max_step_z: 1.0 - phase_reset: - effort: - active: false - joint_min_effort: 2.0 - foot_pressure: - active: false - ground_min_pressure: 1.5 - imu: - active: true - y_acceleration_threshold: 2.0 - min_phase: 0.9 - stability_stop: - imu: - active: false - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - tf: - base_link_frame: base_link - l_sole_frame: l_sole - odom_frame: odom - r_sole_frame: r_sole - trunk_pid: - pitch: - antiwindup: false - d: 0.004 - i: 0.0 - i_clamp_max: 0.0 - i_clamp_min: 0.0 - p: 0.0035 - roll: - antiwindup: false - d: 0.0 - i: 0.0 - i_clamp_max: 0.0 - i_clamp_min: 0.0 - p: 0.0 - x_bias: 0.0 - x_speed_multiplier: 1.0 - y_bias: 0.0 - y_speed_multiplier: 1.0 - yaw_bias: 0.0 - yaw_speed_multiplier: 1.0 diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_robot_no_limits.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_robot_no_limits.yaml deleted file mode 100644 index 2419144c66..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_robot_no_limits.yaml +++ /dev/null @@ -1,140 +0,0 @@ -walking: - ros__parameters: - engine: - # Full walk cycle frequency - # (in Hz, > 0) - freq: 1.3 - # Length of double support phase in half cycle - # (ratio, [0:1]) - double_support_ratio: 0.05 - # Lateral distance between the feet center - # (in m, >= 0) - foot_distance: 0.2 - # Maximum flying foot height - # (in m, >= 0) - foot_rise: 0.06 - # Pause of Z movement on highest point - # (single support cycle ratio, [0,1]) - foot_z_pause: 0.0 - # Phase of flying foot apex - # (single support cycle phase, [0:1]) - foot_apex_phase: 0.5 - # Let the foot's downward trajectory end above the ground - # this is helpful if the support leg bends - # (in m, >= 0) - foot_put_down_z_offset: 0.0 - #Phase time for moving the foot from Z offset to ground - #(in half cycle ratio [0:1]) - foot_put_down_phase: 1.0 - # Foot X/Y overshoot in ratio of step length - # (ratio, >= 0) - foot_overshoot_ratio: 0.1 - # Foot X/Y overshoot phase - # (single support cycle phase, [foot_apex_phase:1] - foot_overshoot_phase: 0.85 - # Height of the trunk from ground - # (in m, > 0) - trunk_height: 0.40 - # Trunk pitch orientation - # (in rad) - trunk_pitch: 0.14 - # Phase offset of trunk oscillation - # (half cycle phase, [-1:1]) - trunk_phase: -0.1 - # Trunk forward offset - # (in m) - trunk_x_offset: 0.0 - # Trunk lateral offset - # (in m) - trunk_y_offset: 0.005 - # Trunk lateral oscillation amplitude ratio - # (ratio, >= 0) - trunk_swing: 0.2 - # Trunk swing pause length in phase at apex - # (half cycle ratio, [0:1]) - trunk_pause: 0.0 - # Trunk forward offset proportional to forward step - # (in m) - trunk_x_offset_p_coef_forward: 0.0 - # Trunk forward offset proportional to rotation step - # (in m/rad) - trunk_x_offset_p_coef_turn: 0.0 - # Trunk pitch orientation proportional to forward step - # (in rad/m) - trunk_pitch_p_coef_forward: 1.2 - # Trunk pitch orientation proportional to rotation step - # (in 1) - trunk_pitch_p_coef_turn: -0.05 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - - trunk_z_movement: 0.0 - - node: - # update frequency of the engine - engine_freq: 500.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: True - - debug_active: True - - max_step_x: 10000.0 - max_step_y: 10000.0 - max_step_xy: 10000.0 - max_step_z: 100000.0 - max_step_angular: 10000.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: True - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.25 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.111 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_simulator.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_simulator.yaml deleted file mode 100644 index 843c692818..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_simulator.yaml +++ /dev/null @@ -1,101 +0,0 @@ -/**: - ros__parameters: - use_sim_time: true -walking: - ros__parameters: - engine: - foot_put_down_z_offset: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - - double_support_ratio: 0.0264282002140171 - first_step_swing_factor: 2.9 - foot_distance: 0.179900277671633 - foot_rise: 0.0819786291304007 - freq: 1.2 - trunk_height: 0.394780002666927 - trunk_phase: -0.151653984431689 - trunk_pitch: 0.105566178884548 - trunk_pitch_p_coef_forward: -0.186068274875133 - trunk_pitch_p_coef_turn: -0.457339940581988 - trunk_swing: 0.154856652745882 - trunk_x_offset: 0.00885762700992359 - trunk_y_offset: 0.00369752824507733 - trunk_z_movement: 0.0155005052923747 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_apex_pitch: 0.1 - foot_overshoot_phase: 1.0 - foot_overshoot_ratio: 0.0 - foot_put_down_phase: 1.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - - - node: - # update frequency of the engine - engine_freq: 125.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: True - - debug_active: False - - max_step_x: 10000.0 - max_step_y: 10000.0 - max_step_xy: 10000.0 - max_step_z: 100000.0 - max_step_angular: 10000.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.90 - foot_pressure: - active: True - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 30.0 - imu: - active: False - y_acceleration_threshold: 1.4 - - trunk_pid: - pitch: - p: 0.0035 - i: 0.0 - d: 0.004 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: false - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_viz.yaml b/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_viz.yaml deleted file mode 100644 index e172a9ac4e..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/config/walking_wolfgang_viz.yaml +++ /dev/null @@ -1,95 +0,0 @@ -walking: - ros__parameters: - engine: - double_support_ratio: 0.05 - foot_distance: 0.2 - foot_rise: 0.05 - freq: 0.5 - trunk_height: 0.40 - trunk_phase: -0.1 - trunk_pitch: 0.0 - trunk_pitch_p_coef_forward: 0.0 - trunk_pitch_p_coef_turn: 0.0 - trunk_swing: 0.25 - trunk_x_offset: 0.0 - trunk_y_offset: 0.005 - trunk_z_movement: 0.0 - first_step_swing_factor: 1.0 - first_step_trunk_phase: -0.5 - foot_apex_phase: 0.5 - foot_overshoot_phase: 0.85 - foot_overshoot_ratio: 0.1 - foot_put_down_phase: 1.0 - foot_put_down_z_offset: 0.0 - foot_z_pause: 0.0 - trunk_pause: 0.0 - trunk_x_offset_p_coef_forward: 0.0 - trunk_x_offset_p_coef_turn: 0.0 - - kick_length: 0.12 - kick_vel: 0.2 - kick_phase: 0.28 - kick_put_down_phase: 0.8 - kick_rise_factor: 1.5 - - node: - # update frequency of the engine - engine_freq: 100.0 - - # parameters for bioIK - ik: - timeout: 0.01 - reset: True - - debug_active: True - - max_step_x: 1.0 - max_step_y: 1.0 - max_step_xy: 1.0 - max_step_z: 1.0 - max_step_angular: 1.0 - - x_speed_multiplier: 1.0 - y_speed_multiplier: 1.0 - yaw_speed_multiplier: 1.0 - - stability_stop: - imu: - active: False - pitch: - threshold: 0.19 - vel_threshold: 1.3 - roll: - threshold: 0.4 - vel_threshold: 5.7 - pause_duration: 3.0 - - imu_y_acc_tau: 0.1 - - phase_reset: - min_phase: 0.25 - foot_pressure: - active: False - ground_min_pressure: 1.5 - effort: - active: False - joint_min_effort: 35.0 - imu: - active: False - y_acceleration_threshold: 2.0 - - trunk_pid: - pitch: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False - roll: - p: 0.0 - i: 0.0 - d: 0.0 - i_clamp_min: 0.0 - i_clamp_max: 0.0 - antiwindup: False diff --git a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/FSM.png b/src/bitbots_motion/bitbots_quintic_walk/docs/_static/FSM.png deleted file mode 100644 index 91c6ce262b..0000000000 Binary files a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/FSM.png and /dev/null differ diff --git a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/approach.png b/src/bitbots_motion/bitbots_quintic_walk/docs/_static/approach.png deleted file mode 100644 index 66c335bb66..0000000000 Binary files a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/approach.png and /dev/null differ diff --git a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/engine_params.png b/src/bitbots_motion/bitbots_quintic_walk/docs/_static/engine_params.png deleted file mode 100644 index a30ff053ce..0000000000 Binary files a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/engine_params.png and /dev/null differ diff --git a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/engine_step.png b/src/bitbots_motion/bitbots_quintic_walk/docs/_static/engine_step.png deleted file mode 100644 index 5524952d35..0000000000 Binary files a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/engine_step.png and /dev/null differ diff --git a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/logo.png b/src/bitbots_motion/bitbots_quintic_walk/docs/_static/logo.png deleted file mode 100644 index f8afdd5d06..0000000000 Binary files a/src/bitbots_motion/bitbots_quintic_walk/docs/_static/logo.png and /dev/null differ diff --git a/src/bitbots_motion/bitbots_quintic_walk/docs/conf.py b/src/bitbots_motion/bitbots_quintic_walk/docs/conf.py deleted file mode 100644 index 0b6342a9ce..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/docs/conf.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Full list of options at http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import catkin_pkg.package -from exhale import utils - -package_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -catkin_package = catkin_pkg.package.parse_package( - os.path.join(package_dir, catkin_pkg.package.PACKAGE_MANIFEST_FILENAME) -) -sys.path.insert(0, os.path.abspath(os.path.join(package_dir, "src"))) - - -# -- Helper functions -------------------------------------------------------- - - -def count_files(): - """:returns tuple of (num_py, num_cpp)""" - num_py = 0 - num_cpp = 0 - - for _, _, files in os.walk(os.path.join(package_dir, "src")): - for f in files: - if f.endswith(".py"): - num_py += 1 - for _, _, files in os.walk(os.path.join(package_dir, "include")): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - num_cpp += 1 - - return num_py, num_cpp - - -# -- Project information ----------------------------------------------------- - -project = catkin_package.name -copyright = "2019, Bit-Bots" -author = ", ".join([a.name for a in catkin_package.authors]) - -# The short X.Y version -version = str(catkin_package.version) -# The full version, including alpha/beta/rc tags -release = str(catkin_package.version) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.doctest", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.coverage", - "sphinx.ext.imgmath", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# -- Exhale and Breath setup ------------------------------------------------- - -# Tell sphinx what the primary language being documented is. -num_files_py, num_files_cpp = count_files() -primary_domain = "py" if num_files_py >= num_files_cpp else "cpp" - -# Tell sphinx what the pygments highlight language should be. -highlight_language = primary_domain - -if num_files_cpp > 0: - extensions += [ - "breathe", - "exhale", - ] - - breathe_projects = {project: os.path.join("_build", "doxyoutput", "xml")} - breathe_default_project = project - - def specifications_for_kind(kind): - # Show all members for classes and structs - if kind == "class" or kind == "struct": - return [":members:", ":protected-members:", ":private-members:", ":undoc-members:"] - # An empty list signals to Exhale to use the defaults - else: - return [] - - exhale_args = { - # These arguments are required - "containmentFolder": "cppapi", - "rootFileName": "library_root.rst", - "rootFileTitle": "C++ Library API", - "doxygenStripFromPath": "..", - "customSpecificationsMapping": utils.makeCustomSpecificationsMapping(specifications_for_kind), - # Suggested optional arguments - "createTreeView": True, - "exhaleExecutesDoxygen": True, - "exhaleDoxygenStdin": "INPUT = {}".format(os.path.join(package_dir, "include")), - } - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = os.path.join("_static", "logo.png") -html_favicon = os.path.join("_static", "logo.png") - - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# -- RST Standard variables --------------------------------------------------- -rst_prolog = f".. |project| replace:: {project}\n" -rst_prolog += ".. |description| replace:: {}\n".format(catkin_package.description.replace("\n\n", "\n")) -rst_prolog += ".. |modindex| replace:: {}\n".format( - ":ref:`modindex`" if num_files_py > 0 else "Python module index is not available" -) diff --git a/src/bitbots_motion/bitbots_quintic_walk/docs/index.rst b/src/bitbots_motion/bitbots_quintic_walk/docs/index.rst deleted file mode 100644 index 054c882a8f..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/docs/index.rst +++ /dev/null @@ -1,175 +0,0 @@ -Welcome to |project|'s documentation! -================================================ - -This document describes how the bitbots_quintic_walking works and shows how walking parameters can be tuned. -The quintic walk is originally based on the IKWalk of team Rhoban, that is briefly described in the following paper: Rouxel et al. "Rhoban Hardware and Software Open Source Contributions -for RoboCup Humanoids", 2015. -There are a number of improvements that were made by us and there is almost nothing left from the original IKWalk code. -Improvements: - - Refactoring the complete code base to make it more understandable - - Including a small state machine to handle the the start and stop steps differently - - Adding the possibility to perform small kicks during walking - - The original phase rest (not ending the stept till the foot pressure sensors have ground contact) is expanded to also stop the step earlier if ground contact is made (phase reset) - - Phase rest and reset can be done based on the joint torques if no foot pressure sensors are available - - Additional stabilization is realized by applying an IMU based PD controller that keeps the correct orientation of the torso in fused angles - - Adding a ROS interface including dynamic reconfigure for the walk parameters - - Adding a computation of the odometry based on the actual step that was taken, rather than the planned step, to improve accuracy - - Adding parameters that limit the step length to prevent executing steps that make the robot fall - - Adding parameters to scale the step length so that the resulting walk speed is closer to the desired speed - - Including Python wrapper for the walk so that it can be used without ROS, especially for optimization and learning - - Automatic parameter optimization using the Optuna library - -There is no paper just about the walk engine itself, but it has been mentioned in the following ones: - - Bestmann et al. "Wolfgang-OP: A Robust Humanoid Robot Platform for Research and Competitions" - - Putra et al. "Humanoid robot pitch axis stabilization using linear quadratic regulator with fuzzy logic and capture point" - - -General Structure -================= - -The walking consists of three main parts: - -1. The ROS node (walk_node.cpp) which is the main class controlling the walking and connecting it to ROS -2. The walking engine (walk_engine.cpp) which generates cartesian poses of the flying foot and the trunk in relation to the support foot based on quintic splines. - It uses internally a finite state machine to track the state of the walking. -3. The inverse kinematic which computes the necessary joint values to reach the computed cartesian poses. We use BioIK or KDL for this through the MoveIt! interface. - -.. image:: _static/approach.png - - -Quintic Splines -=============== -Splines are a mathematical method to describe a curve using spline points. Have a look in the internet for more details. - -We use quintic splines to be able to define the position, velocity, acceleration and jerk at each spline point. This enables us to generate smooth trajectories in the cartesian space. - -We currently use an ROSified version of Rhobans spline implementation from the bitbots_splines package. The x-axis is always the time while the y-axis is the value of position or rotation. - - - - -The Walking Engine -================== - -The core part of the walk is the spline engine that generates a fixed height and fixed cycle gait. -It uses quintic splines to represent the Cartesian trajectory of the moving foot and the torso in the support foot frame. -Each trajectory consists of six splines which represent one dimension of translation or rotation each. -After finishing one step, the splines are computed for the next step. Their form depends on a small set of parameters (see Figure below), the goal walk velocity (cmd vel ) and the type of step. -Therefore, no dynamic model of the robot is necessary, which allows easier use, especially on self-build and low-cost platforms, where an exact dynamic model is not available. -In RoboCup, such direct parameterized approaches showed great potential (see S. Behnke. "Online trajectory generation for omnidirectional biped walk-ing"). -At each control cycle step, the splines are interpolated to get the Cartesian goal position of the moving foot and the torso. - -The walking engine consists of mainly two methods. One builds the splines for the next step and one gives the poses for trunk and flying foot at a given time point in the trajectory. - -The engine uses a fixed time frame for the step which can be changed by the frequency parameter. In order to simplify the splines and make them independend from the frequency, a so called "phase time" is used. Therefore, changing the frequency just compresses or stretches the splines in the time axis. -The engine handles two trajectories for the flying foot and the trunk. This results in 12 splines, since we need each 3 splines for position and 3 for rotation. Additionally there are some splines having meta data like which foot is the support foot. Each step starts with the double support phase and ends with the single support phase. - -When the next step is computed, the last positions, velocities and accelerations are used as start points for all splines, meaning as the first spline point at time 0. Afterwards, other spline points are added. Thoses points are pre programmed but their x and/or y values can be influenced by either parameters or the desired step length. Usually those points are on meaningful time points like the switch between double and single support. - -Since these trajectories are only build when doing a new double step, changes in parameters or walking commands are only shown when the current double step is finished. -The method which computes the poses at a given time point only takes the prebuild splines and computes the values for each of the splines using the mathematical spline interpolation. - -.. image:: _static/FSM.png - -.. image:: _static/engine_step.png - -.. image:: _static/engine_params.png - - - -The Walking Node -================ - -The walking node subscribes to the /cmd_vel topic which provides a Twist.msg commanding the velocities in x,y and yaw. If it receives only zeros, it will completely stop. If there are values present, the node calls regularly the engine to get the next cartesian poses. Since those poses are in the support foot frame, it translates them to the base_link frame and calls the IK to get the corresponding joint values. These are then published as new goals for the servos. -Furthermore, the node computes the walking odometry by adding up the changes to the robots pose from each step. This odometry is then published and used by the localization. Since the robot does not slide very much, the odometry is close to the truth. -The node also publishes a debug topic where it provides information on the splines, as well as RViz marker messages. - -To be able to change the parameters of the walking, the node provides a dynamic reconfigure interface. Each time a parameter is changed, the new parameters are handed to the walking engine. - - -The Stabilizer -============== - -To increase the stability of the walking, different loop-closure approaches based on different modalities are implemented. - -The phase reset uses the data of the foot pressure sensors or the joint torque sensors to detect, when the moving foot makes contact to the ground. -At this moment, the phase is reset to 0 and the support foot is changed. -This means the step is ended early. -This prevents the moving foot from pushing further into the direction of the ground, thus introducing a force on the robot. -Similarly, the phase rest prevents the starting a new step until contact is made to the ground. - -The stability stop detects if the robot is becoming unstable in the walk, based on the IMU and pauses the walking at step change for a short amount of time. -During this, oscillations of the robot can settle themselves. When the robot is not oscillating anymore, it starts to walk again. - -A PD controllers is applied to adapt the Cartesian poses of the robots torso based on input from the IMU. -This prevents the robot from tilting slowly to one side. -The controller uses the robots orientation measured by the IMU to compute an offset to the torso rotation in fused angles. - - - -Parameter Tuning Guide -====================== - -There are two ways to tune the walking parameters: -- manually -- using the automatic parameter optimization - -This part will explain the manual tuning. Look below for the automatic tuning (which should be preferred). - -The Quintic Walk tries to rely on as few parameters as possible and most of them should be independent from each other, meaning changing one does not require a change in another parameter. -When tuning parameters following things should be kept in mind: - -1. Make sure the robot has no hardware problems, e.g. loose screws. Otherwise your tuning is kind of senseless -2. Use slow motion videos from smart phones to debug the walking. This way it is much easier to see what is happening. -3. Test different walking directions and speeds. Parameters may work perfectly when moving forward but will fail catastrophically when walking sidewards. -4. When tuning completly new, first do it in rviz. This lets you tune at least to the point where it looks like it works and prevents damage to the robot by colliding legs. -5. First tune open loop (without any PID control or phase reset). Otherwise problems from these parameters are maybe hidden by the stabilization approaches. - -Tune the parameters in the following order: - -1. foot_distance: Set this so that the feet are under the hip or slightly outwards of them -2. trunk_height: This is a trade off between high (legs are completely straight) and low (knees are bend). The more the knees are bend the more torque is applied to the knees (this is bad) but the maximal step length gets longer since the kinematic chain allows more movement of the flying leg (this is good). Good values are normally slightly bend knees. -3. trunk_pitch: This should be set so that the robot is stable in pitch direction while standing still. Any pitch necessary from walking faster is coming from another parameter. -4. foot_rise: This highly depends on the ground. For hard floors, just a centimeter should be enough. For artificial grass its around 5cm. Tune it so that the flying foot does not touch the ground while moving. Larger than necessary values are probably bad since they result in larger accelerations. -5. freq: This determines how fast your steps are and thereby also how fast you can run since the maximum speed ist maximal step length times step frequency. Faster steps also mean a shorter absolute single support time which often results in a more stable walk. Since each step leads to a small odometry error, a higher frequency leads to more odometry errors. Typical values are between 0.5 and 1.5 steps/s. -6. double_support_ratio: This determines how long per step both feet are on the ground. It should never be zero, since this will most likely not work because the accelerations for the body would get infinitive on step change (see "Introduction to Humanoid Robotics, Shuuji Kajita, 2015" for a detailed explaination). To large values will force the flying leg to move very fast during single support. This value can be fine tuned after setting the other values. Typical values are between 0.05 and 0.3. -7. trunk_swing: This value determines how much the torso is moving sidewards during walking to put the center of pressure over the support foot. If the robot is falling to the inside of the support foot the value has to be increased, if it is falling to the outside it has to be decreased. The value of 1 means that it goes during maximal sidewards movement as far as the footDistance. Typical values are between 0.1 and 1. -8. trunk_phase: This moves the trunk movement in relation to the leg movement in phase time. This is difficult to tune but often the value that you want to change when you don't know why the walking doesn't work. Typical values are between -0.1 and 0.1. -9. trunk_pitch_p_coef_forward: This gives more trunk pitch when running forwards and less when running backwards. Increase this when the robot is falling against walk direction when getting faster. Decrease if it falls in walk direction when getting faster. - -The other values are mostly not that influential but can also be tried. - -Automatic Parameter Optimization -================================ - -As tuning manually is very tedious and does not always yield the best parameters, we apply automatic hyperparmeter optimzation. -This is done using the Multi-objective tree-structured Parzen-estimator (MOTPE) algorithm. -Each of the walking directions (forward, backward, sideward, turning) is one of the objectives which should be optimized. -MOTPE decides on a set of parameters and we let the robot walk in each direction for a few seconds with increasing speed until the robot falls. -The objective value of this direction is the maximal speed that the robot reaches without falling. -Based on the already tried parameter sets and their objective values, MOTPE decides on the next parameter set to try. - -The code for this is in the following github repository: https://github.com/bit-bots/parallel_parameter_search/ -You will need to execute the 'optimize_walk' script. -See the help of the script for more information. -There are other optimization algorithms to chose from, but MOTPE has yielded the best results in our experiments. -You will typically need 500 to 1000 repetitions to get good results. -You should also use the '--storage' option to store the results in a SQL database. -This will also allow you to parallelize the optimization by executing the script multiple times. -Look at the documentation in this git for more information. - - - -.. toctree:: - :maxdepth: 2 - - cppapi/library_root - pyapi/modules - - -Indices and tables -================== - -* :ref:`genindex` -* |modindex| -* :ref:`search` diff --git a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_engine.hpp b/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_engine.hpp deleted file mode 100644 index ebee94f64b..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_engine.hpp +++ /dev/null @@ -1,191 +0,0 @@ -/* -This code is partly based on the original code by Quentin "Leph" Rouxel and Team Rhoban. -The original files can be found at: -https://github.com/Rhoban/model/ -*/ -#ifndef BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_ENGINE_H_ -#define BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_ENGINE_H_ - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_quintic_walk { - -/** - * QuinticWalk - * - * Holonomic and open loop walk generator based on footstep control and quintic splines in cartesian space. - * Expressed all target state in cartesian space with respect to current support foot. - */ -class WalkEngine : public bitbots_splines::AbstractEngine { - public: - explicit WalkEngine(rclcpp::Node::SharedPtr node, walking::Params::Engine config); - - // methods from abstract engine class - WalkResponse update(double dt) override; - void setGoals(const WalkRequest& goals) override; - void reset() override; - [[nodiscard]] int getPercentDone() const override; - - /** - * Updates the engine configuration. - */ - void setConfig(walking::Params::Engine config); - - /** - * Resets the engine to any given state. Necessary for using it as reference in learning. - */ - void reset(WalkState state, double phase, std::array step, bool stop_walk, bool walkable_state, - bool reset_odometry); - - /** - * Return current walk phase between 0 and 1 - */ - [[nodiscard]] double getPhase() const; - - /** - * Return current time between 0 and half period for trajectories evaluation - */ - [[nodiscard]] double getTrajsTime() const; - - /** - * Return if true if left is current support foot - */ - [[nodiscard]] bool isLeftSupport() const; - - /** - * Return true if both feet are currently on the ground - */ - bool isDoubleSupport(); - - void requestKick(bool left); - - void requestPause(); - - /** - * Ends the current step earlier. Useful if foot hits ground to early. - */ - void endStep(); - - void setPhaseRest(bool active); - - WalkState getState(); - - [[nodiscard]] double getFreq() const; - - double getWantedTrunkPitch(); - - void setPauseDuration(double duration); - void setForceSmoothStepTransition(bool force); - - tf2::Transform getLeft(); - tf2::Transform getRight(); - - walking::Params::Engine config_; - - private: - rclcpp::Node::SharedPtr node_; - - WalkState engine_state_ = WalkState::IDLE; - - WalkRequest request_; - rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr callback_handle_; - - // splines - bitbots_splines::SmoothSpline is_double_support_spline_; - bitbots_splines::SmoothSpline is_left_support_foot_spline_; - bitbots_splines::PoseSpline trunk_spline_; - bitbots_splines::PoseSpline foot_spline_; - - // Movement phase between 0 and 1 - double phase_ = 0.0; - double last_phase_ = 0.0; - - // pause handling - double time_paused_ = 0.0; - double pause_duration_ = 0.0; - bool pause_requested_ = false; - - // phase rest - bool phase_rest_active_ = false; - - // kick handling - bool left_kick_requested_ = false; - bool right_kick_requested_ = false; - - // Current support foot (left or right). - bool is_left_support_foot_ = false; - - // forces smooth spline transition if a low engine rate is used - bool force_smooth_step_transition_ = false; - - // Pose diff [dx, dy, dtheta] from support foot to flying foot last and next position. - tf2::Transform support_to_last_; - tf2::Transform support_to_next_; - - // Pose integration of left and right foot in initial frame. - // Set at "future" state taking into account next expected fot pose. - tf2::Transform left_in_world_; - tf2::Transform right_in_world_; - - // Trunk pose and orientation position, velocity and acceleration at last half step start. - tf2::Vector3 trunk_pos_at_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 trunk_pos_vel_at_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 trunk_pos_acc_at_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 trunk_orientation_pos_at_last_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 trunk_orientation_vel_at_last_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 trunk_orientation_acc_at_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - - // Foot pose and orientation position, velocity and acceleration at last half step start. - tf2::Vector3 foot_pos_at_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 foot_pos_vel_at_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 foot_pos_acc_at_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 foot_orientation_pos_at_last_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 foot_orientation_vel_at_last_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - tf2::Vector3 foot_orientation_acc_at_foot_change_ = tf2::Vector3(0.0, 0.0, 0.0); - - enum TrajectoryType { NORMAL, KICK, START_MOVEMENT, START_STEP, STOP_STEP, STOP_MOVEMENT }; - - void updatePhase(double dt); - - void buildTrajectories(TrajectoryType type); - - void buildWalkDisableTrajectories(bool foot_in_idle_position); - - void saveCurrentRobotState(); - - /** - * Compute current cartesian target from trajectories and assign it to given model through inverse kinematics. - * Return false is the target is unreachable. - */ - WalkResponse createResponse(); - - /** - * Set the target pose of current support foot during next support phase and update support foot. - * The target foot pose diff is given with respect to next support foot pose (current flying foot target). - */ - void stepFromSupport(const tf2::Transform& diff); - - /** - * Set target pose of current support foot using diff orders. - * Zero vector means in place walking. - * Special handle of lateral and turn step to avoid foot collision. - */ - void stepFromOrders(const std::vector& linear_orders, double angular_z); - - /** - * Small helper method to get euler angle instead of quaternion. - */ - tf2::Vector3 getLastEuler(); - tf2::Vector3 getNextEuler(); -}; - -} // namespace bitbots_quintic_walk - -#endif diff --git a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_ik.hpp b/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_ik.hpp deleted file mode 100644 index 20da32c541..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_ik.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_IK_H_ -#define BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_IK_H_ -#include -#include -#include -#include -#include -namespace bitbots_quintic_walk { - -class WalkIK : public bitbots_splines::AbstractIK { - public: - explicit WalkIK(rclcpp::Node::SharedPtr node, walking::Params::Node::Ik config); - - bitbots_splines::JointGoals calculate(const WalkResponse& ik_goals); - void init(moveit::core::RobotModelPtr kinematic_model) override; - void reset() override; - void setConfig(walking::Params::Node::Ik config); - - const std::vector& getLeftLegJointNames(); - const std::vector& getRightLegJointNames(); - - moveit::core::RobotStatePtr get_goal_state(); - - private: - rclcpp::Node::SharedPtr node_; - moveit::core::RobotStatePtr goal_state_; - const moveit::core::JointModelGroup* legs_joints_group_; - const moveit::core::JointModelGroup* left_leg_joints_group_; - const moveit::core::JointModelGroup* right_leg_joints_group_; - walking::Params::Node::Ik config_; -}; -} // namespace bitbots_quintic_walk -#endif // BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_IK_H_ diff --git a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_node.hpp b/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_node.hpp deleted file mode 100644 index 17e02e0eae..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_node.hpp +++ /dev/null @@ -1,197 +0,0 @@ -/* -This code is based on the original code by Quentin "Leph" Rouxel and Team Rhoban. -The original files can be found at: -https://github.com/Rhoban/model/ -*/ -#ifndef BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_NODE_H_ -#define BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_NODE_H_ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_quintic_walk { - -class WalkNode { - public: - explicit WalkNode(rclcpp::Node::SharedPtr node, const std::string& ns = "", - const std::vector& moveit_parameters = {}); - bitbots_msgs::msg::JointCommand step(double dt); - bitbots_msgs::msg::JointCommand step(double dt, geometry_msgs::msg::Twist::SharedPtr cmdvel_msg, - sensor_msgs::msg::Imu::SharedPtr imu_msg, - sensor_msgs::msg::JointState::SharedPtr jointstate_msg, - bitbots_msgs::msg::FootPressure::SharedPtr pressure_left, - bitbots_msgs::msg::FootPressure::SharedPtr pressure_right); - bitbots_msgs::msg::JointCommand step_relative(double dt, geometry_msgs::msg::Twist::SharedPtr step_msg, - sensor_msgs::msg::Imu::SharedPtr imu_msg, - sensor_msgs::msg::JointState::SharedPtr jointstate_msg, - bitbots_msgs::msg::FootPressure::SharedPtr pressure_left, - bitbots_msgs::msg::FootPressure::SharedPtr pressure_right); - geometry_msgs::msg::PoseArray step_open_loop(double dt, geometry_msgs::msg::Twist::SharedPtr cmdvel_msg); - - /** - * Small helper method to get foot position via python wrapper - */ - geometry_msgs::msg::Pose get_right_foot_pose(); - geometry_msgs::msg::Pose get_left_foot_pose(); - - /** - * Reset everything to initial idle state. - */ - void reset(); - - /** - * Updates the parameters of the walking after a parameter change. - */ - void updateParams(); - - /** - * Reset walk to any given state. Necessary for using this as reference in learning. - */ - void reset(WalkState state, double phase, geometry_msgs::msg::Twist::SharedPtr cmd_vel, bool reset_odometry); - - /** - * This is the main loop which takes care of stopping and starting of the walking. - * A small state machine is tracking in which state the walking is and builds the trajectories accordingly. - */ - void run(); - - /** - * Initialize internal WalkEngine to correctly zeroed, usable state - */ - void initializeEngine(); - - /** - * Sets the current state of the robot - * @param msg The current state - */ - void robotStateCb(bitbots_msgs::msg::RobotControlState::SharedPtr msg); - - WalkEngine* getEngine(); - WalkIK* getIk(); - moveit::core::RobotModelPtr* get_kinematic_model(); - - nav_msgs::msg::Odometry getOdometry(); - - void publish_debug(); - rclcpp::TimerBase::SharedPtr startTimer(); - double getTimerFreq(); - - private: - rclcpp::Node::SharedPtr node_; - - std::array get_step_from_vel(geometry_msgs::msg::Twist::SharedPtr msg); - void stepCb(geometry_msgs::msg::Twist::SharedPtr msg); - void cmdVelCb(geometry_msgs::msg::Twist::SharedPtr msg); - - void imuCb(sensor_msgs::msg::Imu::SharedPtr msg); - - void checkPhaseRestAndReset(); - void pressureRightCb(bitbots_msgs::msg::FootPressure::SharedPtr msg); - void pressureLeftCb(bitbots_msgs::msg::FootPressure::SharedPtr msg); - - void jointStateCb(sensor_msgs::msg::JointState::SharedPtr msg); - - void kickCb(std_msgs::msg::Bool::SharedPtr msg); - - double getTimeDelta(); - - // Declare parameter listener and struct from the generate_parameter_library - walking::ParamListener param_listener_; - // Datastructure to hold all parameters, which is build from the schema in the 'parameters.yaml' - walking::Params config_; - - WalkRequest current_request_ = {.stop_walk = true}; - WalkRequest last_request_; - - bool first_run_ = true; - - double last_ros_update_time_ = 0; - - int robot_state_ = bitbots_msgs::msg::RobotControlState::CONTROLLABLE; - - int current_support_foot_ = biped_interfaces::msg::Phase::DOUBLE_STANCE; - - WalkResponse current_response_; - WalkResponse current_stabilized_response_; - bitbots_splines::JointGoals motor_goals_; - - bitbots_quintic_walk::WalkEngine walk_engine_; - - nav_msgs::msg::Odometry odom_msg_; - - rclcpp::Publisher::SharedPtr pub_controller_command_; - rclcpp::Publisher::SharedPtr pub_odometry_; - rclcpp::Publisher::SharedPtr pub_support_; - - rclcpp::Subscription::SharedPtr step_sub_; - rclcpp::Subscription::SharedPtr cmd_vel_sub_; - rclcpp::Subscription::SharedPtr robot_state_sub_; - rclcpp::Subscription::SharedPtr joint_state_sub_; - rclcpp::Subscription::SharedPtr kick_sub_; - rclcpp::Subscription::SharedPtr imu_sub_; - rclcpp::Subscription::SharedPtr pressure_sub_left_; - rclcpp::Subscription::SharedPtr pressure_sub_right_; - - // MoveIt! - std::shared_ptr robot_model_loader_; - moveit::core::RobotModelPtr kinematic_model_; - moveit::core::RobotStatePtr current_state_; - - WalkStabilizer stabilizer_; - WalkIK ik_; - WalkVisualizer visualizer_; - - double current_trunk_fused_pitch_ = 0; - double current_trunk_fused_roll_ = 0; - - double current_fly_pressure_ = 0; - double current_fly_effort_ = 0; - - std::optional last_imu_measurement_time_; - double imu_y_acc = 0; - - bool got_new_goals_ = false; -}; - -} // namespace bitbots_quintic_walk - -#endif // BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_NODE_H_ diff --git a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_pywrapper.hpp b/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_pywrapper.hpp deleted file mode 100644 index ec44dd953d..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_pywrapper.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef BITBOTS_QUINTIC_WALK_BITBOTS_QUINTIC_WALK_SRC_WALK_PYWRAPPER_H_ -#define BITBOTS_QUINTIC_WALK_BITBOTS_QUINTIC_WALK_SRC_WALK_PYWRAPPER_H_ -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace py = pybind11; -using namespace ros2_python_extension; - -class PyWalkWrapper { - public: - explicit PyWalkWrapper(const std::string& ns, const std::vector& walk_parameter_msgs = {}, - const std::vector& moveit_parameter_msgs = {}, - bool force_smooth_step_transition = false); - py::bytes step(double dt, py::bytes& cmdvel_msg, py::bytes& imu_msg, py::bytes& jointstate_msg, - py::bytes& pressure_left, py::bytes& pressure_right); - py::bytes step_relative(double dt, py::bytes& step_msg, py::bytes& imu_msg, py::bytes& jointstate_msg, - py::bytes& pressure_left, py::bytes& pressure_right); - py::bytes step_open_loop(double dt, py::bytes& cmdvel_msg); - py::bytes get_left_foot_pose(); - py::bytes get_right_foot_pose(); - py::bytes get_odom(); - void reset(); - void special_reset(int state, double phase, py::bytes cmd_vel, bool reset_odometry); - void set_robot_state(int state); - void set_parameter(const py::bytes parameter_msg); - double get_phase(); - double get_freq(); - py::bytes get_support_state(); - bool is_left_support(); - void spin_some(); - void publish_debug(); - bool reset_and_test_if_speed_possible(py::bytes cmd_vel, double pos_threshold); - - private: - rclcpp::Node::SharedPtr node_; - std::shared_ptr walk_node_; -}; - -#endif // BITBOTS_QUINTIC_WALK_BITBOTS_QUINTIC_WALK_SRC_WALK_PYWRAPPER_H_ diff --git a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_stabilizer.hpp b/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_stabilizer.hpp deleted file mode 100644 index 51416948cc..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_stabilizer.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_STABILIZER_H_ -#define BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_STABILIZER_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_quintic_walk { - -class WalkStabilizer : public bitbots_splines::AbstractStabilizer { - public: - explicit WalkStabilizer(rclcpp::Node::SharedPtr node); - void reset() override; - WalkResponse stabilize(const WalkResponse& response, const rclcpp::Duration& dt) override; - - private: - control_toolbox::PidROS pid_trunk_fused_pitch_; - control_toolbox::PidROS pid_trunk_fused_roll_; -}; -} // namespace bitbots_quintic_walk - -#endif // BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_STABILIZER_H_ diff --git a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_utils.hpp b/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_utils.hpp deleted file mode 100644 index 50cd7cb2fc..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_utils.hpp +++ /dev/null @@ -1,118 +0,0 @@ -#ifndef BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_UTILS_H_ -#define BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_UTILS_H_ - -#define M_TAU M_PI * 2 - -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_quintic_walk { - -enum WalkState { - IDLE = 0, - START_MOVEMENT = 1, - START_STEP = 2, - WALKING = 3, - PAUSED = 4, - KICK = 5, - STOP_STEP = 6, - STOP_MOVEMENT = 7 -}; - -struct WalkRequest { - std::vector linear_orders = {0, 0, 0}; - double angular_z = 0; - bool stop_walk = false; - bool walkable_state = false; - bool single_step = false; -}; - -struct WalkResponse { - tf2::Transform support_foot_to_flying_foot = tf2::Transform(tf2::Quaternion(0, 0, 0, 1), tf2::Vector3(0, 0, 0)); - tf2::Transform support_foot_to_trunk = tf2::Transform(tf2::Quaternion(0, 0, 0, 1), tf2::Vector3(0, 0, 0)); - - // additional information for visualization - bool is_double_support = false; - bool is_left_support_foot = false; - - double phase = 0.0; - double traj_time = 0.0; - double foot_distance = 0.0; - - WalkState state = WalkState::IDLE; - - tf2::Transform support_to_last = tf2::Transform(tf2::Quaternion(0, 0, 0, 1), tf2::Vector3(0, 0, 0)); - tf2::Transform support_to_next = tf2::Transform(tf2::Quaternion(0, 0, 0, 1), tf2::Vector3(0, 0, 0)); - - double current_pitch = 0.0; - double current_fused_pitch = 0.0; - double current_roll = 0.0; - double current_fused_roll = 0.0; - - double roll_vel = 0.0; - double pitch_vel = 0.0; - - double sup_cop_x = 0.0; - double sup_cop_y = 0.0; -}; - -/** - * Return the given angle in radian - * bounded between -TAU/2 and TAU/2 - */ -inline double angleBound(double angle) { return angle - M_TAU * std::floor((angle + M_TAU / 2) / M_TAU); } - -/** - * Compute the oriented distance between the two given angle - * in the range -TAU/4:TAU/4 radian from angleSrc to angleDst - * (Better than doing angleDst-angleSrc) - */ -inline double angleDistance(double angle_src, double angle_dst) { - angle_src = angleBound(angle_src); - angle_dst = angleBound(angle_dst); - - double max, min; - if (angle_src > angle_dst) { - max = angle_src; - min = angle_dst; - } else { - max = angle_dst; - min = angle_src; - } - - double dist_1 = max - min; - double dist_2 = M_TAU - max + min; - - if (dist_1 < dist_2) { - if (angle_src > angle_dst) { - return -dist_1; - } else { - return dist_1; - } - } else { - if (angle_src > angle_dst) { - return dist_2; - } else { - return -dist_2; - } - } -} - -inline void tf_pose_to_msg(tf2::Transform& tf_pose, geometry_msgs::msg::Pose& msg_pose) { - msg_pose.position.x = tf_pose.getOrigin().getX(); - msg_pose.position.y = tf_pose.getOrigin().getY(); - msg_pose.position.z = tf_pose.getOrigin().getZ(); - msg_pose.orientation.x = tf_pose.getRotation().getX(); - msg_pose.orientation.y = tf_pose.getRotation().getY(); - msg_pose.orientation.z = tf_pose.getRotation().getZ(); - msg_pose.orientation.w = tf_pose.getRotation().getW(); -} - -} // namespace bitbots_quintic_walk - -#endif // BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_UTILS_H_ diff --git a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_visualizer.hpp b/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_visualizer.hpp deleted file mode 100644 index 62d6952277..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/include/bitbots_quintic_walk/walk_visualizer.hpp +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_VISUALIZER_H_ -#define BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_VISUALIZER_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace bitbots_quintic_walk { -class WalkVisualizer : public bitbots_splines::AbstractVisualizer { - public: - explicit WalkVisualizer(rclcpp::Node::SharedPtr node, walking::Params::Node::Tf tf_config); - - visualization_msgs::msg::Marker createArrowMarker(const std::string& name_space, const std::string& frame, - const geometry_msgs::msg::Pose& pose, - const std_msgs::msg::ColorRGBA& color); - - std::pair buildEngineDebugMsgs( - WalkResponse response); - std::pair buildIKDebugMsgs( - WalkResponse response, moveit::core::RobotStatePtr current_state, bitbots_splines::JointGoals joint_goals); - visualization_msgs::msg::MarkerArray buildWalkMarkers(WalkResponse response); - - void init(moveit::core::RobotModelPtr kinematic_model); - - void publishDebug(const WalkResponse& current_response, const moveit::core::RobotStatePtr& current_state, - const bitbots_splines::JointGoals& motor_goals); - - std_msgs::msg::ColorRGBA colorFactory(double r, double g, double b) { - std_msgs::msg::ColorRGBA color; - color.r = r; - color.g = g; - color.b = b; - color.a = 1.0; - return color; - } - - const std_msgs::msg::ColorRGBA BLACK = colorFactory(0.0, 0.0, 0.0); - const std_msgs::msg::ColorRGBA BLUE = colorFactory(0.0, 0.0, 1.0); - const std_msgs::msg::ColorRGBA GREEN = colorFactory(0.0, 1.0, 0.0); - const std_msgs::msg::ColorRGBA ORANGE = colorFactory(1.0, 0.5, 0.0); - const std_msgs::msg::ColorRGBA RED = colorFactory(1.0, 0.0, 0.0); - const std_msgs::msg::ColorRGBA WHITE = colorFactory(1.0, 1.0, 1.0); - const std_msgs::msg::ColorRGBA YELLOW = colorFactory(1.0, 1.0, 0.0); - - private: - rclcpp::Node::SharedPtr node_; - - walking::Params::Node::Tf tf_config_; - - rclcpp::Publisher::SharedPtr pub_debug_; - rclcpp::Publisher::SharedPtr pub_engine_debug_; - rclcpp::Publisher::SharedPtr pub_debug_marker_; - - moveit::core::RobotModelPtr kinematic_model_; -}; -} // namespace bitbots_quintic_walk - -#endif // BITBOTS_QUINTIC_WALK_INCLUDE_BITBOTS_QUINTIC_WALK_WALK_VISUALIZER_H_ diff --git a/src/bitbots_motion/bitbots_quintic_walk/launch/quintic_walk.launch b/src/bitbots_motion/bitbots_quintic_walk/launch/quintic_walk.launch deleted file mode 100644 index 967fc87fae..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/launch/quintic_walk.launch +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_motion/bitbots_quintic_walk/launch/test.launch b/src/bitbots_motion/bitbots_quintic_walk/launch/test.launch deleted file mode 100644 index 85b2ff9355..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/launch/test.launch +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_motion/bitbots_quintic_walk/msg/WalkDebug.msg b/src/bitbots_motion/bitbots_quintic_walk/msg/WalkDebug.msg deleted file mode 100644 index f814cd4099..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/msg/WalkDebug.msg +++ /dev/null @@ -1,34 +0,0 @@ -# -# This message is only for debugging / visualizing the walking -# - -std_msgs/Header header - -# the following is computed to trunk frame -# position of the goals, the resulting positions computed by running FK on the IK results and the actual position from joint states -geometry_msgs/Pose left_foot_goal -geometry_msgs/Pose left_foot_ik_result -geometry_msgs/Pose left_foot_position -geometry_msgs/Pose right_foot_goal -geometry_msgs/Pose right_foot_ik_result -geometry_msgs/Pose right_foot_position - -# same values as above but grouped for fly and support foot -geometry_msgs/Pose fly_foot_goal -geometry_msgs/Pose fly_foot_ik_result -geometry_msgs/Pose fly_foot_position -geometry_msgs/Pose support_foot_goal -geometry_msgs/Pose support_foot_ik_result -geometry_msgs/Pose support_foot_position - -# offset between goal and computed position -geometry_msgs/Vector3 left_foot_ik_offset -geometry_msgs/Vector3 right_foot_ik_offset -geometry_msgs/Vector3 fly_foot_ik_offset -geometry_msgs/Vector3 support_foot_ik_offset - -# offset between goal and actual position taken from joint states -geometry_msgs/Vector3 left_foot_actual_offset -geometry_msgs/Vector3 right_foot_actual_offset -geometry_msgs/Vector3 fly_foot_actual_offset -geometry_msgs/Vector3 support_foot_actual_offset \ No newline at end of file diff --git a/src/bitbots_motion/bitbots_quintic_walk/msg/WalkEngineDebug.msg b/src/bitbots_motion/bitbots_quintic_walk/msg/WalkEngineDebug.msg deleted file mode 100644 index b350021c9b..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/msg/WalkEngineDebug.msg +++ /dev/null @@ -1,29 +0,0 @@ -# -# This message is only for debugging / visualizing the walking (use PlotJuggler) -# - -std_msgs/Header header - -# times of the walk engine -float64 phase_time -float64 traj_time - -# int instead of bool for easy plotting -uint8 is_left_support -uint8 is_double_support -std_msgs/String state -int32 state_number # same as engine_state only as number to use it in plottjuggler - - -# point where the foot make contact the ground -geometry_msgs/Vector3 footstep_last -geometry_msgs/Vector3 footstep_next - - -# output of the walk engine, in frame of the support foot -geometry_msgs/Pose trunk_goal -geometry_msgs/Pose trunk_goal_abs -geometry_msgs/Vector3 trunk_euler - -geometry_msgs/Pose fly_goal -geometry_msgs/Vector3 fly_euler diff --git a/src/bitbots_motion/bitbots_quintic_walk/package.xml b/src/bitbots_motion/bitbots_quintic_walk/package.xml deleted file mode 100644 index 0ea8607421..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/package.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - bitbots_quintic_walk - 1.6.4 - This is a simple open-loop walking engine which uses quintic splines to define the trajectories of both - feet in cartesian space. An inverse kinematic is used to translate these into joint space. The parameters of the - walking can be adjusted using dynamic_reconfigure. - - - Timon Engelke - Finn-Thorben Sell - Hamburg Bit-Bots - - MIT - - Marc Bestmann - Hamburg Bit-Bots - Rhoban FC (original version of engine) - - ament_cmake - rosidl_default_generators - - biped_interfaces - builtin_interfaces - - bio_ik - bitbots_docs - bitbots_msgs - bitbots_robot_description - bitbots_splines - bitbots_utils - control_toolbox - generate_parameter_library - geometry_msgs - moveit_core - moveit_ros_move_group - moveit_ros_planning_interface - moveit_ros_robot_interaction - rclcpp - ros2_python_extension - rot_conv - std_msgs - tf2_eigen - tf2_geometry_msgs - tf2_ros - tf2 - - bitbots_moveit_bindings - bitbots_teleop - plotjuggler - bitbots_odometry - ros2launch - rosidl_default_runtime - - rosidl_interface_packages - - - - tested_integration - c++ - - ament_cmake - - diff --git a/src/bitbots_motion/bitbots_quintic_walk/scripts/test_solvable_speeds.py b/src/bitbots_motion/bitbots_quintic_walk/scripts/test_solvable_speeds.py deleted file mode 100644 index 0e104e9903..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/scripts/test_solvable_speeds.py +++ /dev/null @@ -1,64 +0,0 @@ -#!/usr/bin/env python3 - -from ament_index_python import get_package_share_directory -from bitbots_utils.utils import get_parameters_from_ros_yaml, load_moveit_parameter -from deep_quintic.engine import WalkEngine -from geometry_msgs.msg import Twist -from numpy import random - - -def cmd_vel_to_twist(cmd_vel, stop=False): - cmd_vel_msg = Twist() - cmd_vel_msg.linear.x = float(cmd_vel[0]) - cmd_vel_msg.linear.y = float(cmd_vel[1]) - cmd_vel_msg.linear.z = 0.0 - cmd_vel_msg.angular.x = 0.0 - cmd_vel_msg.angular.y = 0.0 - cmd_vel_msg.angular.z = float(cmd_vel[2]) - if stop: - cmd_vel_msg.angular.x = -1.0 - return cmd_vel_msg - - -sim_name = "webots" -robot_type = "wolfgang" -cmd_vel_current_bounds = [(-0.5, 0.5), (-0.2, 0.2), (-2, 2)] -experiment_number = 1000 -threshold = 0.0001 - -walk_parameters = get_parameters_from_ros_yaml( - "walking", - f"{get_package_share_directory('bitbots_quintic_walk')}/config/deep_quintic_{sim_name}_{robot_type}.yaml", - use_wildcard=True, -) -moveit_parameters = load_moveit_parameter(robot_type) -engine = WalkEngine("", walk_parameters + moveit_parameters) - -okay = 0 -not_okay = 0 -print(f"\nRandom sampling {experiment_number} velocities for robot {robot_type} for {sim_name} parameters.") -print(f"Velocity space is {cmd_vel_current_bounds}") -print(f"Threshold is {threshold}") -try: - while True: - current_command_speed = [ - random.uniform(*cmd_vel_current_bounds[0]), - random.uniform(*cmd_vel_current_bounds[1]), - random.uniform(*cmd_vel_current_bounds[2]), - ] - - if engine.reset_and_test_if_speed_possible(cmd_vel_to_twist(current_command_speed), threshold): - # print(f"{current_command_speed} SOLVED") - okay += 1 - else: - # print(f"{current_command_speed}") - not_okay += 1 - - if okay + not_okay > experiment_number: - fraction = okay / (okay + not_okay) - print(f"Solvable {fraction}") - break - -except KeyboardInterrupt: - fraction = okay / (okay + not_okay) - print(f"Solvable {fraction}") diff --git a/src/bitbots_motion/bitbots_quintic_walk/setup.py b/src/bitbots_motion/bitbots_quintic_walk/setup.py deleted file mode 100644 index f17ea387f6..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/setup.py +++ /dev/null @@ -1,7 +0,0 @@ -from distutils.core import setup - -from catkin_pkg.python_setup import generate_distutils_setup - -d = generate_distutils_setup(packages=["bitbots_quintic_walk"], scripts=["scripts"], package_dir={"": "src"}) - -setup(**d) diff --git a/src/bitbots_motion/bitbots_quintic_walk/src/parameters.yaml b/src/bitbots_motion/bitbots_quintic_walk/src/parameters.yaml deleted file mode 100644 index fd124c79f8..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/src/parameters.yaml +++ /dev/null @@ -1,372 +0,0 @@ -walking: - engine: - freq: - type: double - description: "Full walking cycle frequency in Hz" - validation: - bounds<>: [0.0, 5.0] - double_support_ratio: - type: double - description: "Length of double support phase in half cycle" - validation: - bounds<>: [0.0, 1.0] - first_step_swing_factor: - type: double - description: "Swing factor for the first step" - validation: - bounds<>: [0.0, 10.0] - first_step_trunk_phase: - type: double - description: "Trunk phase for the first step" - validation: - bounds<>: [-1.0, 1.0] - foot_distance: - type: double - description: "Lateral distance between the feet center (in meters)" - validation: - bounds<>: [0.0, 1.0] - foot_rise: - type: double - description: "Maximum flying foot height (in meters)" - validation: - bounds<>: [0.0, 1.0] - trunk_swing: - type: double - description: "Trunk lateral oscillation amplitude ratio" - validation: - bounds<>: [0.0, 2.0] - trunk_height: - type: double - description: "Height of the trunk from ground (in meters)" - validation: - bounds<>: [0.0, 1.0] - trunk_pitch: - type: double - description: "Trunk pitch angle (in radians)" - validation: - bounds<>: [-1.57, 1.57] - trunk_pitch_p_coef_forward: - type: double - description: "Trunk pitch orientation proportional to forward/backward step (in rad/m)" - validation: - bounds<>: [-1.0, 1.0] - trunk_pitch_p_coef_turn: - type: double - description: "Trunk pitch orientation proportional to turn step (in rad/rad)" - validation: - bounds<>: [-1.0, 1.0] - trunk_phase: - type: double - description: "Phase offset of trunk oscillation (half cycle phase, [-1:1])" - validation: - bounds<>: [-1.0, 1.0] - foot_z_pause: - type: double - description: "Pause of Z movement on highest point (single support cycle ratio)" - validation: - bounds<>: [0.0, 1.0] - foot_put_down_z_offset: - type: double - description: "Let the foot's downward trajectory end above the ground this is helpful if the support leg bends, (in meters)" - validation: - bounds<>: [0.0, 1.0] - foot_put_down_phase: - type: double - description: "Phase time for moving the foot from Z offset to ground (phase between apex and single support end)" - validation: - bounds<>: [0.0, 1.0] - foot_apex_phase: - type: double - description: "Phase of flying foot apex(single support cycle phase)" - validation: - bounds<>: [0.0, 1.0] - foot_apex_pitch: - type: double - description: "Pitch angle of flying foot at its apex (in radians). This is used to level the foot even if the some motors are not able to reach the desired position." - default_value: 0.0 - validation: - bounds<>: [-0.5, 0.5] - foot_overshoot_ratio: - type: double - description: "Foot X/Y overshoot in ratio of step length(ratio)" - validation: - bounds<>: [0.0, 1.0] - foot_overshoot_phase: - type: double - description: "Foot X/Y overshoot phase (single support cycle phase, [foot_apex_phase:1])" - validation: - bounds<>: [0.0, 1.0] - trunk_x_offset: - type: double - description: "Trunk X offset (in meters)" - validation: - bounds<>: [-0.2, 0.2] - trunk_y_offset: - type: double - description: "Trunk Y offset (in meters)" - validation: - bounds<>: [-0.2, 0.2] - trunk_z_movement: - type: double - description: "Trunk Z movement (in meters)" - validation: - bounds<>: [-0.2, 0.2] - trunk_pause: - type: double - description: "Trunk swing pause length in phase at apex (half cycle ratio)" - validation: - bounds<>: [0.0, 1.0] - trunk_x_offset_p_coef_forward: - type: double - description: "Trunk forward offset proportional to forward step (in m/m)" - validation: - bounds<>: [0.0, 1.0] - trunk_x_offset_p_coef_turn: - type: double - description: "Trunk forward offset proportional to rotation step (in meters/rad)" - validation: - bounds<>: [0.0, 1.0] - kick_length: - type: double - description: "Length of kick movement (in meters)" - validation: - bounds<>: [0.0, 1.0] - kick_vel: - type: double - description: "Velocity of kick movement (in meters/s)" - validation: - bounds<>: [0.0, 100.0] - kick_phase: - type: double - description: "Time of kick apex (in single support cycle phase)" - validation: - bounds<>: [0.0, 1.0] - kick_put_down_phase: - type: double - description: "Time at which the foot is moved back from the kick apex to it's resting position, but still in the air (in single support cycle phase)" - validation: - bounds<>: [0.0, 1.0] - kick_rise_factor: - type: double - description: "Scales the step rise parameter, as the kick is a special case, where the foot is moved higher of the ground than in normal walking (ratio)" - validation: - bounds<>: [0.0, 5.0] - node: - engine_freq: - type: double - description: "Control loop frequency in Hz" - validation: - bounds<>: [0.0, 1000.0] - tf: - odom_frame: - type: string - description: "The frame in which the odometry is published" - read_only: true - default_value: "odom" - base_link_frame: - type: string - description: "The robots base link frame name" - read_only: true - default_value: "base_link" - r_sole_frame: - type: string - description: "The robot right sole frame name" - read_only: true - default_value: "r_sole" - l_sole_frame: - type: string - description: "The robot left sole frame name" - read_only: true - default_value: "l_sole" - ik: - timeout: - type: double - description: "Inverse kinematics timeout in seconds" - validation: - bounds<>: [0.0, 10.0] - reset: - type: bool - read_only: true - description: "bioIK parameter" - debug_active: - type: bool - description: "Activate debug output" - max_step_x: - type: double - description: "Maximum step length in X direction (in meters)" - validation: - bounds<>: [0.0, 100000.0] - max_step_y: - type: double - description: "Maximum step length in Y direction (in meters)" - validation: - bounds<>: [0.0, 100000.0] - max_step_xy: - type: double - description: "Maximum step length in XY direction (in meters)" - validation: - bounds<>: [0.0, 100000.0] - max_step_z: - type: double - description: "Maximum step length in Z direction (in meters)" - validation: - bounds<>: [0.0, 100000.0] - max_step_angular: - type: double - description: "Maximum step length angular (in radians)" - validation: - bounds<>: [0.0, 100000.0] - x_speed_multiplier: - type: double - description: "Speed multiplier for X direction to calibrate the cmd_vel input" - validation: - bounds<>: [0.0, 5.0] - y_speed_multiplier: - type: double - description: "Speed multiplier for Y direction to calibrate the cmd_vel input" - validation: - bounds<>: [0.0, 5.0] - yaw_speed_multiplier: - type: double - description: "Speed multiplier for yaw direction to calibrate the cmd_vel input" - validation: - bounds<>: [0.0, 5.0] - x_bias: - type: double - description: "X bias for the command velocity which is received by the walk node. " - default_value: 0.0 - validation: - bounds<>: [-0.1, 0.1] - y_bias: - type: double - description: "Y bias for the command velocity which is received by the walk node. " - default_value: 0.0 - validation: - bounds<>: [-0.1, 0.1] - yaw_bias: - type: double - description: "Yaw bias for the command velocity which is received by the walk node. " - default_value: 0.0 - validation: - bounds<>: [-0.4, 0.4] - stability_stop: - imu: - active: - type: bool - description: "Activate IMU" - pitch: - threshold: - type: double - description: "Pitch threshold used for IMU stability stop (in radians)" - validation: - bounds<>: [0.0, 2.0] - vel_threshold: - type: double - description: "Pitch velocity threshold used for IMU stability stop (in radians/s)" - validation: - bounds<>: [0.0, 10.0] - roll: - threshold: - type: double - description: "Roll threshold used for IMU stability stop (in radians)" - validation: - bounds<>: [0.0, 2.0] - vel_threshold: - type: double - description: "Roll velocity threshold used for IMU stability stop (in radians/s)" - validation: - bounds<>: [0.0, 10.0] - pause_duration: - type: double - description: "Pause duration for the stability stop (in seconds)" - validation: - bounds<>: [0.0, 5.0] - imu_y_acc_tau: - type: double - description: "Time constant for the low pass filter of the IMU y acceleration (in seconds). It defines the time it takes for a unit step input to reach 63.2% of its final value." - validation: - bounds<>: [0.0, 1.0] - phase_reset: - min_phase: - type: double - description: "Phase reset phase start (in single support cycle phase)" - validation: - bounds<>: [0.0, 1.0] - foot_pressure: - active: - type: bool - description: "Activate foot pressure based phase reset" - ground_min_pressure: - type: double - description: "Minimum pressure value for the ground contact detection" - validation: - bounds<>: [0.0, 100.0] - effort: - active: - type: bool - description: "Activate joint effort based phase reset" - joint_min_effort: - type: double - description: "Minimum effort value for the joint effort based phase reset" - validation: - bounds<>: [0.0, 100.0] - imu: - active: - type: bool - description: "Activate IMU linear acceleration based phase reset" - y_acceleration_threshold: - type: double - description: "Threshold for the y acceleration of the IMU under which the phase reset is triggered (if we are in the correct phase of the walking cycle)" - validation: - bounds<>: [0.0, 10.0] - trunk_pid: - pitch: - p: - type: double - description: "Proportional gain for the trunk pitch PID controller" - default_value: 0.0 - i: - type: double - description: "Integral gain for the trunk pitch PID controller" - default_value: 0.0 - d: - type: double - description: "Derivative gain for the trunk pitch PID controller" - default_value: 0.0 - i_clamp_max: - type: double - description: "Integral clamp maximum for the trunk pitch PID controller" - default_value: 0.0 - i_clamp_min: - type: double - description: "Integral clamp minimum for the trunk pitch PID controller" - default_value: 0.0 - antiwindup: - type: bool - description: "Activate antiwindup for the trunk pitch PID controller" - default_value: false - roll: - p: - type: double - description: "Proportional gain for the trunk roll PID controller" - default_value: 0.0 - i: - type: double - description: "Integral gain for the trunk roll PID controller" - default_value: 0.0 - d: - type: double - description: "Derivative gain for the trunk roll PID controller" - default_value: 0.0 - i_clamp_max: - type: double - description: "Integral clamp maximum for the trunk roll PID controller" - default_value: 0.0 - i_clamp_min: - type: double - description: "Integral clamp minimum for the trunk roll PID controller" - default_value: 0.0 - antiwindup: - type: bool - description: "Activate antiwindup for the trunk roll PID controller" - default_value: false diff --git a/src/bitbots_motion/bitbots_quintic_walk/src/walk_engine.cpp b/src/bitbots_motion/bitbots_quintic_walk/src/walk_engine.cpp deleted file mode 100644 index bfa04c2825..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/src/walk_engine.cpp +++ /dev/null @@ -1,907 +0,0 @@ -/* -This code is partly based on the original code by Quentin "Leph" Rouxel and Team Rhoban. -The original files can be found at: -https://github.com/Rhoban/model/ -*/ -#include - -namespace bitbots_quintic_walk { - -WalkEngine::WalkEngine(rclcpp::Node::SharedPtr node, walking::Params::Engine config) : config_(config), node_(node) { - left_in_world_.setIdentity(); - right_in_world_.setIdentity(); - reset(); - - // move left and right in world by foot distance for correct initialization - left_in_world_.setOrigin(tf2::Vector3{0, config_.foot_distance / 2, 0}); - right_in_world_.setOrigin(tf2::Vector3{0, -config_.foot_distance / 2, 0}); - // create splines one time to have no empty splines during first idle phase - buildTrajectories(TrajectoryType::START_MOVEMENT); - - if (config_.foot_distance == 0) { - RCLCPP_WARN(node_->get_logger(), - "Parameters are probably not loaded correctly (unless you are running optimization)"); - } -} - -void WalkEngine::setGoals(const WalkRequest& goals) { request_ = goals; } - -WalkResponse WalkEngine::update(double dt) { - // First check cases where we do not want to update the phase: pausing, idle and phase rest - if (engine_state_ == WalkState::PAUSED) { - if (time_paused_ > pause_duration_) { - // our pause is finished, see if we can continue walking - if (pause_requested_) { - // not yet, wait another pause duration - pause_requested_ = false; - time_paused_ = 0.0; - return createResponse(); - } else { - // we can continue - engine_state_ = WalkState::WALKING; - time_paused_ = 0.0; - } - } else { - time_paused_ += dt; - return createResponse(); - } - // we don't have to update anything more - } else if (engine_state_ == WalkState::IDLE) { - if ((request_.stop_walk && !request_.single_step) || !request_.walkable_state) { - // we are in idle and are not supposed to walk. current state is fine, just do nothing - return createResponse(); - } - } else if (engine_state_ == WalkState::WALKING) { - // check if the step would finish with this update of the phase - bool step_will_finish = (phase_ < 0.5 && phase_ + dt * config_.freq > 0.5) || phase_ + dt * config_.freq > 1.0; - // check if we should rest the phase because the flying foot didn't make contact to the ground during step - if (step_will_finish && phase_rest_active_) { - // don't update the phase (do a phase rest) till it gets updated by a phase reset - RCLCPP_DEBUG_THROTTLE(node_->get_logger(), *node_->get_clock(), 200, "PHASE REST"); - return createResponse(); - } - } - - if (engine_state_ == WalkState::IDLE && request_.single_step) { - float start_phase; - if (request_.linear_orders[1] < 0) { - start_phase = 0.5; - } else { - start_phase = 0.0; - } - // when we want to perform a single step to the right, we need to force using the correct leg - reset(WalkState::IDLE, start_phase, - {request_.linear_orders[0], request_.linear_orders[1], request_.linear_orders[2], request_.angular_z}, false, - true, false); - request_.stop_walk = true; - } - - // update the current phase - updatePhase(dt); - - // check if we will finish a half step with this update - bool half_step_finished = (last_phase_ < 0.5 && phase_ >= 0.5) || (last_phase_ > 0.5 && phase_ < 0.5); - - // small state machine - if (engine_state_ == WalkState::IDLE) { - // state is idle and orders are not zero, we can start walking - buildTrajectories(TrajectoryType::START_MOVEMENT); - engine_state_ = WalkState::START_MOVEMENT; - } else if (engine_state_ == WalkState::START_MOVEMENT) { - // in this state we do a single "step" where we only move the trunk - if (half_step_finished) { - if (request_.stop_walk && !request_.single_step) { - buildTrajectories(TrajectoryType::STOP_MOVEMENT); - engine_state_ = WalkState::STOP_MOVEMENT; - } else { - // start movement is finished, go to next state - buildTrajectories(TrajectoryType::START_STEP); - engine_state_ = WalkState::START_STEP; - } - } - } else if (engine_state_ == WalkState::START_STEP) { - if (half_step_finished) { - if (request_.single_step) { - request_.single_step = false; - buildTrajectories(TrajectoryType::STOP_STEP); - engine_state_ = WalkState::STOP_STEP; - } else if (request_.stop_walk) { - // we have zero command vel -> we should stop - buildTrajectories(TrajectoryType::STOP_STEP); - engine_state_ = WalkState::STOP_STEP; - // phase_ = 0.0; - } else { - // start step is finished, go to next state - buildTrajectories(TrajectoryType::NORMAL); - engine_state_ = WalkState::WALKING; - } - } - } else if (engine_state_ == WalkState::WALKING) { - // check if a half step was finished and we are unstable - if (half_step_finished && pause_requested_) { - // go into pause - engine_state_ = WalkState::PAUSED; - pause_requested_ = false; - return createResponse(); - } else if (half_step_finished && - ((left_kick_requested_ && !is_left_support_foot_) || (right_kick_requested_ && is_left_support_foot_))) { - // lets do a kick - buildTrajectories(TrajectoryType::KICK); - engine_state_ = WalkState::KICK; - left_kick_requested_ = false; - right_kick_requested_ = false; - } else if (half_step_finished) { - // current step is finished, lets see if we have to change state - if (request_.single_step) { - request_.single_step = false; - buildTrajectories(TrajectoryType::STOP_STEP); - engine_state_ = WalkState::STOP_STEP; - } else if (request_.stop_walk) { - // we have zero command vel -> we should stop - buildTrajectories(TrajectoryType::STOP_STEP); - engine_state_ = WalkState::STOP_STEP; - // phase_ = 0.0; - } else { - // we can keep on walking - buildTrajectories(TrajectoryType::NORMAL); - } - } - } else if (engine_state_ == WalkState::KICK) { - // in this state we do a kick while doing a step - if (half_step_finished) { - // kick step is finished, go on walking - buildTrajectories(TrajectoryType::NORMAL); - engine_state_ = WalkState::WALKING; - } - } else if (engine_state_ == WalkState::STOP_STEP) { - // in this state we do a step back to get feet into idle pose - if (half_step_finished) { - // stop step is finished, go to stop movement state - buildTrajectories(TrajectoryType::STOP_MOVEMENT); - engine_state_ = WalkState::STOP_MOVEMENT; - } - } else if (engine_state_ == WalkState::STOP_MOVEMENT) { - // in this state we do a "step" where we move the trunk back to idle position - if (half_step_finished) { - // stop movement is finished, go to idle state - engine_state_ = WalkState::IDLE; - return createResponse(); - } - } else { - RCLCPP_ERROR(node_->get_logger(), "Something is wrong with the walking engine state"); - } - - // Sanity check support foot state - if ((phase_ < 0.5 && !is_left_support_foot_) || (phase_ >= 0.5 && is_left_support_foot_)) { - RCLCPP_ERROR_THROTTLE(node_->get_logger(), *node_->get_clock(), 1, - "WalkEngine exception invalid state phase= %f support= %d dt= %f", phase_, - is_left_support_foot_, dt); - return createResponse(); - } - last_phase_ = phase_; - - return createResponse(); -} - -void WalkEngine::updatePhase(double dt) { - // Check for negative time step - if (dt <= 0.0) { - if (dt == 0.0) { // sometimes happens due to rounding - dt = 0.0001; - } else { - RCLCPP_ERROR_THROTTLE(node_->get_logger(), *node_->get_clock(), 1, - "WalkEngine exception negative dt phase= %f dt= %f", phase_, dt); - return; - } - } - // Check for too long dt - if (dt > 0.5001 / config_.freq) { - RCLCPP_ERROR_THROTTLE(node_->get_logger(), *node_->get_clock(), 1, "WalkEngine error too long dt phase= %f dt= %f", - phase_, dt); - return; - } - - // Update the phase - phase_ += dt * config_.freq; - - // reset if step complete - if (phase_ > 1.0) { - phase_ = phase_ - 1; - } -} - -void WalkEngine::endStep() { - // ends the step earlier, e.g. when foot has already contact to ground - // last_phase will still held the information about the time point where the reset occurred - if (phase_ < 0.5) { - phase_ = 0.5; - } else { - phase_ = 0.0; - } -} - -void WalkEngine::setConfig(walking::Params::Engine config) { config_ = config; } - -void WalkEngine::setPhaseRest(bool active) { phase_rest_active_ = active; } - -void WalkEngine::reset() { reset(WalkState::IDLE, 0.0, {0, 0, 0, 0}, true, false, false); } - -void WalkEngine::reset(WalkState state, double phase, std::array step, bool stop_walk, bool walkable_state, - bool reset_odometry) { - auto [step_x, step_y, step_z, step_angular] = step; - request_.linear_orders[0] = step_x; - request_.linear_orders[1] = step_y; - request_.linear_orders[2] = step_z; - request_.angular_z = step_angular; - request_.stop_walk = stop_walk; - request_.walkable_state = walkable_state; - engine_state_ = state; - time_paused_ = 0.0; - pause_requested_ = false; - - if (state == WalkState::IDLE) { - // we don't need to build trajectories in idle, just reset everything - if (phase < 0.5) { - is_left_support_foot_ = false; - last_phase_ = 0.49999; - } else { - is_left_support_foot_ = true; - last_phase_ = 1.0; - } - phase_ = phase; - - support_to_last_.setIdentity(); - support_to_next_.setIdentity(); - if (is_left_support_foot_) { - support_to_next_.getOrigin()[1] = -config_.foot_distance; - } else { - support_to_next_.getOrigin()[1] = config_.foot_distance; - } - - // Reset the trunk saved state - if (is_left_support_foot_) { - trunk_pos_at_foot_change_ = tf2::Vector3( - config_.trunk_x_offset, -config_.foot_distance / 2.0 + config_.trunk_y_offset, config_.trunk_height); - } else { - trunk_pos_at_foot_change_ = tf2::Vector3( - config_.trunk_x_offset, config_.foot_distance / 2.0 + config_.trunk_y_offset, config_.trunk_height); - } - - trunk_pos_vel_at_foot_change_.setZero(); - trunk_pos_acc_at_foot_change_.setZero(); - trunk_orientation_pos_at_last_foot_change_ = tf2::Vector3(0.0, config_.trunk_pitch, 0.0); - trunk_orientation_vel_at_last_foot_change_.setZero(); - trunk_orientation_acc_at_foot_change_.setZero(); - } else { - if (phase >= 0.5) { - is_left_support_foot_ = false; - last_phase_ = 0.49999; - } else { - is_left_support_foot_ = true; - last_phase_ = 1.0; - } - phase_ = phase; - - // build trajectories for this state once to get correct start point for new trajectory - std::map trajectory_type_mapping = { - {WalkState::WALKING, TrajectoryType::NORMAL}, - {WalkState::START_MOVEMENT, TrajectoryType::START_MOVEMENT}, - {WalkState::START_STEP, TrajectoryType::START_STEP}, - {WalkState::STOP_MOVEMENT, TrajectoryType::STOP_MOVEMENT}, - {WalkState::STOP_STEP, TrajectoryType::STOP_STEP}, - {WalkState::KICK, TrajectoryType::KICK}}; - buildTrajectories(trajectory_type_mapping.at(state)); - - // now switch them again - if (phase >= 0.5) { - is_left_support_foot_ = true; - last_phase_ = 1.0; - } else { - is_left_support_foot_ = false; - last_phase_ = 0.49999; - } - - if (reset_odometry) { - // move left and right in world by foot distance for correct initialization - left_in_world_.setIdentity(); - right_in_world_.setIdentity(); - left_in_world_.setOrigin(tf2::Vector3{0, config_.foot_distance / 2, 0}); - right_in_world_.setOrigin(tf2::Vector3{0, -1 * config_.foot_distance / 2, 0}); - } - - // build trajectories one more time with end state of previously build trajectories as a start - buildTrajectories(trajectory_type_mapping.at(state)); - } - last_phase_ = phase_; -} - -void WalkEngine::saveCurrentRobotState() { - // Evaluate current trunk state (position, velocity, acceleration) in next support foot frame - - // compute current point in time to save state - // by multiplying the half_period time with the advancement of period time - double half_period = 1.0 / (2.0 * config_.freq); - double factor; - if (last_phase_ < 0.5) { - factor = last_phase_ / 0.5; - } else { - factor = last_phase_; - } - if (force_smooth_step_transition_) { - // special case where we want a smooth transition while having a very low sampling rate - // for example as reference for a RL walking policy during training - factor = 1.0; - } - double period_time = half_period * factor; - - // get the current transform to the next foot instead of the planned one (in case of phase reset) - tf2::Transform current_support_to_next_ = foot_spline_.getTfTransform(period_time); - // we use a transformation with a 0 origin, since we only want to do rotation - tf2::Transform rotation_to_next(current_support_to_next_); - rotation_to_next.setOrigin({0, 0, 0}); - - // get last values of trunk pose and its velocities and accelerations - tf2::Transform trunk_pose = trunk_spline_.getTfTransform(period_time); - tf2::Vector3 trunk_pos_vel = trunk_spline_.getPositionVel(period_time); - tf2::Vector3 trunk_pos_acc = trunk_spline_.getPositionAcc(period_time); - tf2::Vector3 trunk_axis_vel = trunk_spline_.getEulerVel(period_time); - tf2::Vector3 trunk_axis_acc = trunk_spline_.getEulerAcc(period_time); - - // Convert the pose in next support foot frame and save - tf2::Transform trunk_pose_at_last = current_support_to_next_.inverse() * trunk_pose; - trunk_pos_at_foot_change_ = trunk_pose_at_last.getOrigin(); - double roll, pitch, yaw; - tf2::Matrix3x3(trunk_pose_at_last.getRotation()).getRPY(roll, pitch, yaw); - trunk_orientation_pos_at_last_foot_change_ = tf2::Vector3(roll, pitch, yaw); - - // convert the velocities and accelerations in next support foot frame and save - trunk_pos_vel_at_foot_change_ = rotation_to_next.inverse() * trunk_pos_vel; - trunk_pos_acc_at_foot_change_ = rotation_to_next.inverse() * trunk_pos_acc; - trunk_orientation_vel_at_last_foot_change_ = rotation_to_next.inverse() * trunk_axis_vel; - trunk_orientation_acc_at_foot_change_ = rotation_to_next.inverse() * trunk_axis_acc; - - // get last values of foot pose and velocities and accelerations - tf2::Transform foot_pose = foot_spline_.getTfTransform(period_time); - tf2::Vector3 foot_pos_vel = foot_spline_.getPositionVel(period_time); - tf2::Vector3 foot_pos_acc = foot_spline_.getPositionAcc(period_time); - tf2::Vector3 foot_axis_vel = foot_spline_.getEulerVel(period_time); - tf2::Vector3 foot_axis_acc = foot_spline_.getEulerAcc(period_time); - - // Convert the pose in next support foot frame and save - tf2::Transform foot_pose_at_last = current_support_to_next_.inverse(); - foot_pos_at_foot_change_ = foot_pose_at_last.getOrigin(); - tf2::Matrix3x3(foot_pose_at_last.getRotation()).getRPY(roll, pitch, yaw); - foot_orientation_pos_at_last_foot_change_ = tf2::Vector3(roll, pitch, yaw); - - // convert the velocities and accelerations in next support foot frame and save - foot_pos_vel_at_foot_change_ = rotation_to_next.inverse() * foot_pos_vel; - foot_pos_acc_at_foot_change_ = rotation_to_next.inverse() * foot_pos_acc; - foot_orientation_vel_at_last_foot_change_ = rotation_to_next.inverse() * foot_axis_vel; - foot_orientation_acc_at_foot_change_ = rotation_to_next.inverse() * foot_axis_acc; -} - -void WalkEngine::buildTrajectories(WalkEngine::TrajectoryType type) { - bool start_movement = type == TrajectoryType::START_MOVEMENT; - bool start_step = type == TrajectoryType::START_STEP; - bool kick_step = type == TrajectoryType::KICK; - bool stop_step = type == TrajectoryType::STOP_STEP; - // TODO handle this nicer - if (type == TrajectoryType::STOP_MOVEMENT) { - buildWalkDisableTrajectories(true); - return; - } - - // save the current trunk state to use it later and compute the next step position - if (!start_movement) { - saveCurrentRobotState(); - if (!stop_step) { - stepFromOrders(request_.linear_orders, request_.angular_z); - } else { - stepFromOrders({0, 0, 0}, 0); - } - } else { - // reset all foot change parameters - // when we do start step, only transform the y coordinate since we stand still and only move trunk sideward - trunk_pos_at_foot_change_ = {0.0, trunk_pos_at_foot_change_.y() - support_to_next_.getOrigin().y(), - config_.trunk_height}; - trunk_pos_vel_at_foot_change_.setZero(); - trunk_pos_acc_at_foot_change_.setZero(); - trunk_orientation_pos_at_last_foot_change_ = {0.0, config_.trunk_pitch, 0.0}; - trunk_orientation_vel_at_last_foot_change_.setZero(); - trunk_orientation_acc_at_foot_change_.setZero(); - foot_pos_at_foot_change_ = {0.0, support_to_next_.getOrigin().y() * -1, 0.0}; - foot_pos_vel_at_foot_change_.setZero(); - foot_pos_acc_at_foot_change_.setZero(); - foot_orientation_pos_at_last_foot_change_.setZero(); - foot_orientation_vel_at_last_foot_change_.setZero(); - foot_orientation_acc_at_foot_change_.setZero(); - support_to_last_.setIdentity(); - support_to_next_.setIdentity(); - if (is_left_support_foot_) { - support_to_next_.getOrigin()[1] = -config_.foot_distance; - } else { - support_to_next_.getOrigin()[1] = config_.foot_distance; - } - stepFromOrders({0, 0, 0}, 0); - } - - // Reset the trajectories - is_double_support_spline_ = bitbots_splines::SmoothSpline(); - is_left_support_foot_spline_ = bitbots_splines::SmoothSpline(); - trunk_spline_ = bitbots_splines::PoseSpline(); - foot_spline_ = bitbots_splines::PoseSpline(); - - // Set up the trajectories for the half cycle (single step) - double half_period = 1.0 / (2.0 * config_.freq); - // full period (double step) is needed for trunk splines - double period = 2.0 * half_period; - - // Time length of double and single support phase during the half cycle - double double_support_length = config_.double_support_ratio * half_period; - double single_support_length = half_period - double_support_length; - - // The trunk trajectory is defined for a complete cycle to handle trunk phase shift Trunk phase shift is done due to - // the length of the double support phase and can be adjusted optionally by a parameter 0.5 * half_period to be - // acyclic to the feet, 0.5 * double_support_length to keep the double support phase centered between feet - double trunk_phase; - if (start_movement || start_step) { - trunk_phase = config_.first_step_trunk_phase; - } else { - trunk_phase = config_.trunk_phase; - } - - double time_shift = -0.5 * half_period + 0.5 * double_support_length + trunk_phase * half_period; - - // Only move the trunk on the first half cycle after a walk enable - if (start_movement) { - double_support_length = half_period; - single_support_length = 0.0; - } - // Set double support phase - is_double_support_spline_.addPoint(0.0, 1.0); - is_double_support_spline_.addPoint(double_support_length, 1.0); - is_double_support_spline_.addPoint(double_support_length, 0.0); - is_double_support_spline_.addPoint(half_period, 0.0); - - // Set support foot - is_left_support_foot_spline_.addPoint(0.0, is_left_support_foot_); - is_left_support_foot_spline_.addPoint(half_period, is_left_support_foot_); - - // Flying foot position - foot_spline_.x()->addPoint(0.0, foot_pos_at_foot_change_.x(), foot_pos_vel_at_foot_change_.x(), - foot_pos_acc_at_foot_change_.x()); - foot_spline_.x()->addPoint(double_support_length, foot_pos_at_foot_change_.x()); - if (kick_step) { - foot_spline_.x()->addPoint(double_support_length + single_support_length * config_.kick_phase, - support_to_next_.getOrigin().x() + config_.kick_length, config_.kick_vel); - foot_spline_.x()->addPoint(double_support_length + single_support_length * config_.kick_put_down_phase, - support_to_next_.getOrigin().x()); - } else { - foot_spline_.x()->addPoint( - double_support_length + single_support_length * config_.foot_put_down_phase * config_.foot_overshoot_phase, - support_to_next_.getOrigin().x() + support_to_next_.getOrigin().x() * config_.foot_overshoot_ratio); - } - foot_spline_.x()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, - support_to_next_.getOrigin().x()); - foot_spline_.x()->addPoint(half_period, support_to_next_.getOrigin().x()); - - foot_spline_.y()->addPoint(0.0, foot_pos_at_foot_change_.y(), foot_pos_vel_at_foot_change_.y(), - foot_pos_acc_at_foot_change_.y()); - foot_spline_.y()->addPoint(double_support_length, foot_pos_at_foot_change_.y()); - foot_spline_.y()->addPoint( - double_support_length + single_support_length * config_.foot_put_down_phase * config_.foot_overshoot_phase, - support_to_next_.getOrigin().y() + - (support_to_next_.getOrigin().y() - support_to_last_.getOrigin().y()) * config_.foot_overshoot_ratio); - foot_spline_.y()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, - support_to_next_.getOrigin().y()); - foot_spline_.y()->addPoint(half_period, support_to_next_.getOrigin().y()); - - foot_spline_.z()->addPoint(0.0, foot_pos_at_foot_change_.z(), foot_pos_vel_at_foot_change_.z(), - foot_pos_acc_at_foot_change_.z()); - foot_spline_.z()->addPoint(double_support_length, foot_pos_at_foot_change_.z()); - foot_spline_.z()->addPoint(double_support_length + single_support_length * config_.foot_apex_phase - - 0.5 * config_.foot_z_pause * single_support_length, - kick_step ? config_.foot_rise * config_.kick_rise_factor : config_.foot_rise); - foot_spline_.z()->addPoint(double_support_length + single_support_length * config_.foot_apex_phase + - 0.5 * config_.foot_z_pause * single_support_length, - kick_step ? config_.foot_rise * config_.kick_rise_factor : config_.foot_rise); - foot_spline_.z()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, - config_.foot_put_down_z_offset + support_to_next_.getOrigin().z()); - foot_spline_.z()->addPoint(half_period, support_to_next_.getOrigin().z()); - - // Flying foot orientation - foot_spline_.roll()->addPoint(0.0, foot_orientation_pos_at_last_foot_change_.x(), - foot_orientation_vel_at_last_foot_change_.x(), - foot_orientation_acc_at_foot_change_.x()); - foot_spline_.roll()->addPoint(double_support_length + 0.1 * single_support_length, 0.0); - foot_spline_.roll()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, 0.0); - foot_spline_.roll()->addPoint(half_period, 0.0); - - foot_spline_.pitch()->addPoint(0.0, foot_orientation_pos_at_last_foot_change_.y(), - foot_orientation_vel_at_last_foot_change_.y(), - foot_orientation_acc_at_foot_change_.y()); - if (!start_movement) { - foot_spline_.pitch()->addPoint(double_support_length + single_support_length * config_.foot_apex_phase, - config_.foot_apex_pitch); - } - foot_spline_.pitch()->addPoint(half_period, 0.0); - - foot_spline_.yaw()->addPoint(0.0, foot_orientation_pos_at_last_foot_change_.z(), - foot_orientation_vel_at_last_foot_change_.z(), foot_orientation_acc_at_foot_change_.z()); - foot_spline_.yaw()->addPoint(double_support_length, getLastEuler().z()); - foot_spline_.yaw()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, - getNextEuler().z()); - foot_spline_.yaw()->addPoint(half_period, getNextEuler().z()); - - // Half pause length of trunk swing - // lateral oscillation - double pause_length = 0.5 * config_.trunk_pause * half_period; - - // Trunk support foot and next - // support foot external - // oscillating position - tf2::Vector3 trunk_point_support(config_.trunk_x_offset + - config_.trunk_x_offset_p_coef_forward * support_to_next_.getOrigin().x() + - config_.trunk_x_offset_p_coef_turn * fabs(support_to_next_.getOrigin().z()), - config_.trunk_y_offset, 0); - tf2::Vector3 trunk_point_next(support_to_next_.getOrigin().x() + config_.trunk_x_offset + - config_.trunk_x_offset_p_coef_forward * support_to_next_.getOrigin().x() + - config_.trunk_x_offset_p_coef_turn * fabs(getNextEuler().z()), - support_to_next_.getOrigin().y() + config_.trunk_y_offset, 0); - // Trunk middle neutral (no swing) position - tf2::Vector3 trunk_point_middle = 0.5 * trunk_point_support + 0.5 * trunk_point_next; - // Trunk vector from middle to support apex - tf2::Vector3 trunk_vector = trunk_point_support - trunk_point_middle; - // Apply swing amplitude ratio - trunk_vector[1] *= config_.trunk_swing; - // Trunk support and next apex position - tf2::Vector3 trunk_apex_support = trunk_point_middle + trunk_vector; - tf2::Vector3 trunk_apex_next = trunk_point_middle - trunk_vector; - // Trunk forward velocity - double trunk_vel_support = (support_to_next_.getOrigin().x() - support_to_last_.getOrigin().x()) / period; - double trunk_vel_next = support_to_next_.getOrigin().x() / half_period; - - // Trunk position - if (start_movement || start_step) { - trunk_spline_.x()->addPoint(0.0, 0.0, 0.0, 0.0); - } else { - trunk_spline_.x()->addPoint(0.0, trunk_pos_at_foot_change_.x(), trunk_pos_vel_at_foot_change_.x(), - trunk_pos_acc_at_foot_change_.x()); - trunk_spline_.x()->addPoint(half_period + time_shift, trunk_apex_support.x(), trunk_vel_support); - } - trunk_spline_.x()->addPoint(period + time_shift, trunk_apex_next.x(), trunk_vel_next); - - if (start_movement) { - trunk_spline_.y()->addPoint(0.0, trunk_point_middle.y(), 0.0, 0.0); - } else { - trunk_spline_.y()->addPoint(0.0, trunk_pos_at_foot_change_.y(), trunk_pos_vel_at_foot_change_.y(), - trunk_pos_acc_at_foot_change_.y()); - } - if (start_step || start_movement) { - trunk_spline_.y()->addPoint(half_period + time_shift - pause_length, - trunk_point_middle.y() + trunk_vector.y() * config_.first_step_swing_factor); - trunk_spline_.y()->addPoint(half_period + time_shift + pause_length, - trunk_point_middle.y() + trunk_vector.y() * config_.first_step_swing_factor); - trunk_spline_.y()->addPoint(period + time_shift - pause_length, - trunk_point_middle.y() - trunk_vector.y() * config_.first_step_swing_factor); - trunk_spline_.y()->addPoint(period + time_shift + pause_length, - trunk_point_middle.y() - trunk_vector.y() * config_.first_step_swing_factor); - } else { - trunk_spline_.y()->addPoint(half_period + time_shift - pause_length, trunk_apex_support.y()); - trunk_spline_.y()->addPoint(half_period + time_shift + pause_length, trunk_apex_support.y()); - trunk_spline_.y()->addPoint(period + time_shift - pause_length, trunk_apex_next.y()); - trunk_spline_.y()->addPoint(period + time_shift + pause_length, trunk_apex_next.y()); - } - - // When walking downwards, the correct trunk height is the one relative to the flying - // foot goal position, this results in lowering the trunk correctly during the step - double trunk_height_including_foot_z_movement = - config_.trunk_height + std::min(0.0, support_to_next_.getOrigin().z()); - // Periodic z movement of trunk is at lowest point at double support center, highest at single support center - trunk_spline_.z()->addPoint(0.0, trunk_pos_at_foot_change_.z(), trunk_pos_vel_at_foot_change_.z(), - trunk_pos_acc_at_foot_change_.z()); - trunk_spline_.z()->addPoint(double_support_length / 2, trunk_height_including_foot_z_movement); - if (!start_movement) { - trunk_spline_.z()->addPoint(double_support_length + single_support_length / 2, - trunk_height_including_foot_z_movement + config_.trunk_z_movement); - trunk_spline_.z()->addPoint(half_period + double_support_length / 2, trunk_height_including_foot_z_movement); - trunk_spline_.z()->addPoint(half_period + double_support_length + single_support_length / 2, - trunk_height_including_foot_z_movement + config_.trunk_z_movement); - } - trunk_spline_.z()->addPoint(period + double_support_length / 2, trunk_height_including_foot_z_movement); - - // Define trunk rotation as roll pitch yaw - tf2::Vector3 euler_at_support = - tf2::Vector3(0.0, - config_.trunk_pitch + config_.trunk_pitch_p_coef_forward * support_to_next_.getOrigin().x() + - config_.trunk_pitch_p_coef_turn * fabs(getNextEuler().z()), - 0.5 * getLastEuler().z() + 0.5 * getNextEuler().z()); - tf2::Vector3 euler_at_next = - tf2::Vector3(0.0, - config_.trunk_pitch + config_.trunk_pitch_p_coef_forward * support_to_next_.getOrigin().x() + - config_.trunk_pitch_p_coef_turn * fabs(getNextEuler().z()), - getNextEuler().z()); - - // we set a velocity for the points in yaw since we want to keep the speed in turning direction for next step - // in roll and pitch, no velocity is set since changes are only minor when speed changes - tf2::Vector3 axis_vel(0.0, 0.0, bitbots_quintic_walk::angleDistance(getLastEuler().z(), getNextEuler().z()) / period); - - // Trunk orientation - trunk_spline_.roll()->addPoint(0.0, trunk_orientation_pos_at_last_foot_change_.x(), - trunk_orientation_vel_at_last_foot_change_.x(), - trunk_orientation_acc_at_foot_change_.x()); - trunk_spline_.roll()->addPoint(half_period + time_shift, euler_at_support.x(), axis_vel.x()); - trunk_spline_.roll()->addPoint(period + time_shift, euler_at_next.x(), axis_vel.x()); - - trunk_spline_.pitch()->addPoint(0.0, trunk_orientation_pos_at_last_foot_change_.y(), - trunk_orientation_vel_at_last_foot_change_.y(), - trunk_orientation_acc_at_foot_change_.y()); - trunk_spline_.pitch()->addPoint(half_period + time_shift, euler_at_support.y(), axis_vel.y()); - trunk_spline_.pitch()->addPoint(period + time_shift, euler_at_next.y(), axis_vel.y()); - - trunk_spline_.yaw()->addPoint(0.0, trunk_orientation_pos_at_last_foot_change_.z(), - trunk_orientation_vel_at_last_foot_change_.z(), - trunk_orientation_acc_at_foot_change_.z()); - trunk_spline_.yaw()->addPoint(half_period + time_shift, euler_at_support.z(), axis_vel.z()); - trunk_spline_.yaw()->addPoint(period + time_shift, euler_at_next.z(), axis_vel.z()); -} - -void WalkEngine::buildWalkDisableTrajectories(bool foot_in_idle_position) { - // save the current trunk state to use it later - saveCurrentRobotState(); - // update support foot and compute odometry - stepFromOrders(request_.linear_orders, request_.angular_z); - - // Reset the trajectories - is_double_support_spline_ = bitbots_splines::SmoothSpline(); - is_left_support_foot_spline_ = bitbots_splines::SmoothSpline(); - trunk_spline_ = bitbots_splines::PoseSpline(); - foot_spline_ = bitbots_splines::PoseSpline(); - - // Set up the trajectories - // for the half cycle - double half_period = 1.0 / (2.0 * config_.freq); - - // Time length of double and single - // support phase during the half cycle - double double_support_length = config_.double_support_ratio * half_period; - double single_support_length = half_period - double_support_length; - - // Sign of support foot with - // respect to lateral - double support_sign = (is_left_support_foot_ ? 1.0 : -1.0); - - // Set double support phase - is_double_support_spline_.addPoint(0.0, 1.0); - if (foot_in_idle_position) { - is_double_support_spline_.addPoint(half_period, 1.0); - } else { - is_double_support_spline_.addPoint(double_support_length, 1.0); - is_double_support_spline_.addPoint(double_support_length, 0.0); - is_double_support_spline_.addPoint(half_period, 0.0); - } - - // Set support foot - is_left_support_foot_spline_.addPoint(0.0, is_left_support_foot_); - is_left_support_foot_spline_.addPoint(half_period, is_left_support_foot_); - - // Flying foot position - foot_spline_.x()->addPoint(0.0, foot_pos_at_foot_change_.x(), foot_pos_vel_at_foot_change_.x(), - foot_pos_acc_at_foot_change_.x()); - foot_spline_.x()->addPoint(double_support_length, foot_pos_at_foot_change_.x()); - foot_spline_.x()->addPoint( - double_support_length + single_support_length * config_.foot_put_down_phase * config_.foot_overshoot_phase, - 0.0 + (0.0 - support_to_last_.getOrigin().x()) * config_.foot_overshoot_ratio); - foot_spline_.x()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, 0.0); - foot_spline_.x()->addPoint(half_period, 0.0); - - foot_spline_.y()->addPoint(0.0, foot_pos_at_foot_change_.y(), foot_pos_vel_at_foot_change_.y(), - foot_pos_acc_at_foot_change_.y()); - foot_spline_.y()->addPoint(double_support_length, foot_pos_at_foot_change_.y()); - foot_spline_.y()->addPoint( - double_support_length + single_support_length * config_.foot_put_down_phase * config_.foot_overshoot_phase, - -support_sign * config_.foot_distance + - (-support_sign * config_.foot_distance - support_to_last_.getOrigin().y()) * config_.foot_overshoot_ratio); - foot_spline_.y()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, - -support_sign * config_.foot_distance); - foot_spline_.y()->addPoint(half_period, -support_sign * config_.foot_distance); - - // If the walk has just been disabled, - // make one single step to neutral pose - if (!foot_in_idle_position) { - foot_spline_.z()->addPoint(0.0, 0.0); - foot_spline_.z()->addPoint(double_support_length, 0.0); - foot_spline_.z()->addPoint(double_support_length + single_support_length * config_.foot_apex_phase - - 0.5 * config_.foot_z_pause * single_support_length, - config_.foot_rise); - foot_spline_.z()->addPoint(double_support_length + single_support_length * config_.foot_apex_phase + - 0.5 * config_.foot_z_pause * single_support_length, - config_.foot_rise); - foot_spline_.z()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, - config_.foot_put_down_z_offset); - foot_spline_.z()->addPoint(half_period, 0.0); - } else { - // don't move the foot in last single step before stop since we only move the trunk back to the center - foot_spline_.z()->addPoint(0.0, foot_pos_at_foot_change_.z()); - foot_spline_.z()->addPoint(half_period, 0.0); - } - // Flying foot orientation - foot_spline_.roll()->addPoint(0.0, foot_orientation_pos_at_last_foot_change_.x(), - foot_orientation_vel_at_last_foot_change_.x(), - foot_orientation_acc_at_foot_change_.x()); - foot_spline_.roll()->addPoint(half_period, 0.0); - - foot_spline_.pitch()->addPoint(0.0, foot_orientation_pos_at_last_foot_change_.y(), - foot_orientation_vel_at_last_foot_change_.y(), - foot_orientation_acc_at_foot_change_.y()); - foot_spline_.pitch()->addPoint(half_period, 0.0); - - foot_spline_.yaw()->addPoint(0.0, foot_orientation_pos_at_last_foot_change_.z(), - foot_orientation_vel_at_last_foot_change_.z(), foot_orientation_acc_at_foot_change_.z()); - foot_spline_.yaw()->addPoint(double_support_length, getLastEuler().z()); - foot_spline_.yaw()->addPoint(double_support_length + single_support_length * config_.foot_put_down_phase, 0.0); - foot_spline_.yaw()->addPoint(half_period, 0.0); - - // Trunk position - trunk_spline_.x()->addPoint(0.0, trunk_pos_at_foot_change_.x(), trunk_pos_vel_at_foot_change_.x(), - trunk_pos_acc_at_foot_change_.x()); - trunk_spline_.x()->addPoint(half_period, config_.trunk_x_offset); - - trunk_spline_.y()->addPoint(0.0, trunk_pos_at_foot_change_.y(), trunk_pos_vel_at_foot_change_.y(), - trunk_pos_acc_at_foot_change_.y()); - // move trunk in the center - trunk_spline_.y()->addPoint(half_period, -support_sign * 0.5 * config_.foot_distance + config_.trunk_y_offset); - - trunk_spline_.z()->addPoint(0.0, trunk_pos_at_foot_change_.z(), trunk_pos_vel_at_foot_change_.z(), - trunk_pos_acc_at_foot_change_.z()); - trunk_spline_.z()->addPoint(half_period, config_.trunk_height); - - // Trunk orientation - trunk_spline_.roll()->addPoint(0.0, trunk_orientation_pos_at_last_foot_change_.x(), - trunk_orientation_vel_at_last_foot_change_.x(), - trunk_orientation_acc_at_foot_change_.x()); - trunk_spline_.roll()->addPoint(half_period, 0.0); - trunk_spline_.pitch()->addPoint(0.0, trunk_orientation_pos_at_last_foot_change_.y(), - trunk_orientation_vel_at_last_foot_change_.y(), - trunk_orientation_acc_at_foot_change_.y()); - trunk_spline_.pitch()->addPoint(half_period, config_.trunk_pitch); - trunk_spline_.yaw()->addPoint(0.0, trunk_orientation_pos_at_last_foot_change_.z(), - trunk_orientation_vel_at_last_foot_change_.z(), - trunk_orientation_acc_at_foot_change_.z()); - trunk_spline_.yaw()->addPoint(half_period, 0.0); -} - -WalkResponse WalkEngine::createResponse() { - // Evaluate target cartesian state from trajectories at current trajectory time - double time = getTrajsTime(); - WalkResponse response; - response.is_double_support = is_double_support_spline_.pos(time) >= 0.5; - response.is_left_support_foot = is_left_support_foot_spline_.pos(time) >= 0.5; - response.support_foot_to_flying_foot = foot_spline_.getTfTransform(time); - response.support_foot_to_trunk = trunk_spline_.getTfTransform(time); - - // add additional information to response, mainly for debug purposes - response.phase = phase_; - response.traj_time = getTrajsTime(); - response.foot_distance = config_.foot_distance; - response.state = engine_state_; - response.support_to_last = support_to_last_; - response.support_to_next = support_to_next_; - - return response; -} - -double WalkEngine::getPhase() const { return phase_; } - -double WalkEngine::getTrajsTime() const { - double t; - if (phase_ < 0.5) { - t = phase_ / config_.freq; - } else { - t = (phase_ - 0.5) / config_.freq; - } - - return t; -} - -bool WalkEngine::isLeftSupport() const { return is_left_support_foot_; } - -bool WalkEngine::isDoubleSupport() { - // returns true if the value of the "is_double_support" spline is currently higher than 0.5 - // the spline should only have values of 0 or 1 - return is_double_support_spline_.pos(getTrajsTime()) >= 0.5; -} - -void WalkEngine::requestKick(bool left) { - if (left) { - left_kick_requested_ = true; - } else { - right_kick_requested_ = true; - } -} - -void WalkEngine::requestPause() { pause_requested_ = true; } - -WalkState WalkEngine::getState() { return engine_state_; } - -int WalkEngine::getPercentDone() const { return (int)(getTrajsTime() * 100); } - -void WalkEngine::setPauseDuration(double duration) { pause_duration_ = duration; } - -void WalkEngine::setForceSmoothStepTransition(bool force) { force_smooth_step_transition_ = force; } - -double WalkEngine::getFreq() const { return config_.freq; } - -double WalkEngine::getWantedTrunkPitch() { - return config_.trunk_pitch + config_.trunk_pitch_p_coef_forward * support_to_next_.getOrigin().x() + - config_.trunk_pitch_p_coef_turn * fabs(support_to_next_.getOrigin().z()); -} - -void WalkEngine::stepFromSupport(const tf2::Transform& diff) { - // Update relative diff from support foot - support_to_last_ = support_to_next_.inverse(); - support_to_next_ = diff; - // Update world integrated position - if (is_left_support_foot_) { - left_in_world_ = right_in_world_ * diff; - } else { - right_in_world_ = left_in_world_ * diff; - } - // Update current support foot - is_left_support_foot_ = !is_left_support_foot_; -} - -void WalkEngine::stepFromOrders(const std::vector& linear_orders, double angular_z) { - // Compute step diff in next support foot frame - tf2::Transform tmp_diff = tf2::Transform(); - tmp_diff.setIdentity(); - // No change in forward step and upward step - tmp_diff.getOrigin()[0] = linear_orders[0]; - tmp_diff.getOrigin()[2] = linear_orders[2]; - - // Add lateral foot offset - // This is normally just the foot distance, but if we turn we need to also move the foot forward/backward - geometry_msgs::msg::Vector3 foot_offset; - foot_offset.x = -sin(angular_z / 2) * config_.foot_distance; - foot_offset.y = cos(angular_z / 2) * config_.foot_distance; - - // Invert lateral offset for right foot - if (!is_left_support_foot_) { - foot_offset.x *= -1; - foot_offset.y *= -1; - } - - // Add foot offset to step diff - tmp_diff.getOrigin()[0] += foot_offset.x; - tmp_diff.getOrigin()[1] += foot_offset.y; - - // Allow lateral step only on external foot - //(internal foot will return to zero pose) - if ((is_left_support_foot_ && linear_orders[1] > 0.0) || (!is_left_support_foot_ && linear_orders[1] < 0.0)) { - tmp_diff.getOrigin()[1] += linear_orders[1]; - } - // No change in turn (in order to rotate around trunk center) - tf2::Quaternion quat; - quat.setRPY(0, 0, angular_z); - tmp_diff.setRotation(quat); - - // Make the step - stepFromSupport(tmp_diff); -} - -tf2::Vector3 WalkEngine::getNextEuler() { - double roll, pitch, yaw; - tf2::Matrix3x3(support_to_next_.getRotation()).getRPY(roll, pitch, yaw); - return {roll, pitch, yaw}; -} - -tf2::Vector3 WalkEngine::getLastEuler() { - double roll, pitch, yaw; - tf2::Matrix3x3(support_to_last_.getRotation()).getRPY(roll, pitch, yaw); - return {roll, pitch, yaw}; -} - -tf2::Transform WalkEngine::getLeft() { return left_in_world_; } - -tf2::Transform WalkEngine::getRight() { return right_in_world_; } -} // namespace bitbots_quintic_walk diff --git a/src/bitbots_motion/bitbots_quintic_walk/src/walk_ik.cpp b/src/bitbots_motion/bitbots_quintic_walk/src/walk_ik.cpp deleted file mode 100644 index d4e8fa1d35..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/src/walk_ik.cpp +++ /dev/null @@ -1,87 +0,0 @@ -#include - -namespace bitbots_quintic_walk { - -WalkIK::WalkIK(rclcpp::Node::SharedPtr node, walking::Params::Node::Ik config) : node_(node), config_(config) {} - -void WalkIK::init(moveit::core::RobotModelPtr kinematic_model) { - legs_joints_group_ = kinematic_model->getJointModelGroup("Legs"); - left_leg_joints_group_ = kinematic_model->getJointModelGroup("LeftLeg"); - right_leg_joints_group_ = kinematic_model->getJointModelGroup("RightLeg"); - - goal_state_.reset(new moveit::core::RobotState(kinematic_model)); - goal_state_->setToDefaultValues(); - - if (config_.reset) { - reset(); - } -} - -bitbots_splines::JointGoals WalkIK::calculate(const WalkResponse& ik_goals) { - // change goals from support foot based coordinate system to trunk based coordinate system - tf2::Transform trunk_to_support_foot_goal = ik_goals.support_foot_to_trunk.inverse(); - tf2::Transform trunk_to_flying_foot_goal = trunk_to_support_foot_goal * ik_goals.support_foot_to_flying_foot; - - // make pose msg for calling IK - geometry_msgs::msg::Pose left_foot_goal_msg; - geometry_msgs::msg::Pose right_foot_goal_msg; - - // decide which foot is which - if (ik_goals.is_left_support_foot) { - tf2::toMsg(trunk_to_support_foot_goal, left_foot_goal_msg); - tf2::toMsg(trunk_to_flying_foot_goal, right_foot_goal_msg); - } else { - tf2::toMsg(trunk_to_support_foot_goal, right_foot_goal_msg); - tf2::toMsg(trunk_to_flying_foot_goal, left_foot_goal_msg); - } - - // call IK two times, since we have two legs - bool success; - - // we have to do this otherwise there is an error - goal_state_->updateLinkTransforms(); - - success = goal_state_->setFromIK(left_leg_joints_group_, left_foot_goal_msg, config_.timeout, - moveit::core::GroupStateValidityCallbackFn()); - goal_state_->updateLinkTransforms(); - - success &= goal_state_->setFromIK(right_leg_joints_group_, right_foot_goal_msg, config_.timeout, - moveit::core::GroupStateValidityCallbackFn()); - - if (!success) { - RCLCPP_ERROR(node_->get_logger(), "IK failed with no solution found"); - } - - std::vector joint_names = legs_joints_group_->getActiveJointModelNames(); - std::vector joint_goals; - goal_state_->copyJointGroupPositions(legs_joints_group_, joint_goals); - - /* construct result object */ - bitbots_splines::JointGoals result; - result.first = joint_names; - result.second = joint_goals; - return result; -} - -void WalkIK::reset() { - // we have to set some good initial position in the goal state, since we are using a gradient - // based method. Otherwise, the first step will be not correct - std::vector names_vec = {"LHipPitch", "LKnee", "LAnklePitch", "RHipPitch", "RKnee", "RAnklePitch"}; - std::vector pos_vec = {0.7, 1.0, -0.4, -0.7, -1.0, 0.4}; - for (size_t i = 0; i < names_vec.size(); i++) { - // besides its name, this method only changes a single joint position... - goal_state_->setJointPositions(names_vec[i], &pos_vec[i]); - } -} - -void WalkIK::setConfig(walking::Params::Node::Ik config) { config_ = config; } - -const std::vector& WalkIK::getLeftLegJointNames() { return left_leg_joints_group_->getJointModelNames(); } - -const std::vector& WalkIK::getRightLegJointNames() { - return right_leg_joints_group_->getJointModelNames(); -} - -moveit::core::RobotStatePtr WalkIK::get_goal_state() { return goal_state_; } - -} // namespace bitbots_quintic_walk diff --git a/src/bitbots_motion/bitbots_quintic_walk/src/walk_node.cpp b/src/bitbots_motion/bitbots_quintic_walk/src/walk_node.cpp deleted file mode 100644 index 46f775fd20..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/src/walk_node.cpp +++ /dev/null @@ -1,595 +0,0 @@ -#define M_TAU M_PI * 2 - -#include -#include -#include -using std::placeholders::_1; -using namespace std::chrono_literals; - -namespace bitbots_quintic_walk { - -WalkNode::WalkNode(rclcpp::Node::SharedPtr node, const std::string& ns, - const std::vector& moveit_parameters) - : node_(node), - param_listener_(node_), - config_(param_listener_.get_params()), - walk_engine_(node_, config_.engine), - stabilizer_(node_), - ik_(node_, config_.node.ik), - visualizer_(node_, config_.node.tf) { - // Create dummy node for moveit. This is necessary for dynamic reconfigure to work (moveit does some bullshit with - // parameter declarations, so we need to isolate the walking parameters from the moveit parameters). - // If the walking is instantiated using the python wrapper, moveit parameters are passed because no moveit config - // is loaded in the conventional way. Normally the moveit config is loaded via launch file and the passed vector is - // empty. - auto moveit_node = std::make_shared( - "walking_moveit_node", ns, - rclcpp::NodeOptions().automatically_declare_parameters_from_overrides(true).parameter_overrides( - moveit_parameters)); - // get all kinematics parameters from the move_group node if they are not set manually via constructor - std::string check_kinematic_parameters; - if (!moveit_node->get_parameter("robot_description_kinematics.LeftLeg.kinematics_solver", - check_kinematic_parameters)) { - auto parameters_client = std::make_shared(node_, "/move_group"); - while (!parameters_client->wait_for_service(1s)) { - if (!rclcpp::ok()) { - RCLCPP_ERROR(node_->get_logger(), "Interrupted while waiting for the service. Exiting."); - break; - } - RCLCPP_INFO_THROTTLE(node_->get_logger(), *node_->get_clock(), 10 * 1e9, - "Can't copy parameters from move_group node. Service not available, waiting again..."); - } - rcl_interfaces::msg::ListParametersResult parameter_list = - parameters_client->list_parameters({"robot_description_kinematics"}, 10); - auto copied_parameters = parameters_client->get_parameters(parameter_list.names); - for (auto& parameter : copied_parameters) { - moveit_node->declare_parameter(parameter.get_name(), parameter.get_type()); - moveit_node->set_parameter(parameter); - } - } - - // Load MoveIt! model - robot_model_loader_ = std::make_shared(moveit_node, "robot_description"); - - kinematic_model_ = robot_model_loader_->getModel(); - - if (!kinematic_model_) { - RCLCPP_FATAL(node_->get_logger(), "No robot model loaded, killing quintic walk."); - exit(1); - } - - // Process the parameters - updateParams(); - - /* init publisher and subscriber */ - pub_controller_command_ = node_->create_publisher("walking_motor_goals", 1); - pub_odometry_ = node_->create_publisher("walk_engine_odometry", 1); - pub_support_ = node_->create_publisher("walk_support_state", 1); - step_sub_ = node_->create_subscription("step", 1, std::bind(&WalkNode::stepCb, this, _1)); - cmd_vel_sub_ = - node_->create_subscription("cmd_vel", 1, std::bind(&WalkNode::cmdVelCb, this, _1)); - robot_state_sub_ = node_->create_subscription( - "robot_state", 1, std::bind(&WalkNode::robotStateCb, this, _1)); - joint_state_sub_ = node_->create_subscription( - "joint_states", 1, std::bind(&WalkNode::jointStateCb, this, _1)); - kick_sub_ = node_->create_subscription("kick", 1, std::bind(&WalkNode::kickCb, this, _1)); - imu_sub_ = node_->create_subscription("imu/data", 1, std::bind(&WalkNode::imuCb, this, _1)); - pressure_sub_left_ = node_->create_subscription( - "foot_pressure_left/filtered", 1, std::bind(&WalkNode::pressureLeftCb, this, _1)); - pressure_sub_right_ = node_->create_subscription( - "foot_pressure_right/filtered", 1, std::bind(&WalkNode::pressureRightCb, this, _1)); - - ik_.init(kinematic_model_); - visualizer_.init(kinematic_model_); - - current_state_.reset(new moveit::core::RobotState(kinematic_model_)); - current_state_->setToDefaultValues(); - - walk_engine_.reset(); - - // Publish the starting support state once, especially for odometry. - // We always start with the same foot - biped_interfaces::msg::Phase sup_state; - sup_state.phase = biped_interfaces::msg::Phase::LEFT_STANCE; - sup_state.header.stamp = node_->get_clock()->now(); - pub_support_->publish(sup_state); -} - -void WalkNode::updateParams() { - config_ = param_listener_.get_params(); - // Pass params to other components - ik_.setConfig(config_.node.ik); - walk_engine_.setConfig(config_.engine); - // Phase reset can only work if one phase resetting method is active and this might have changed due to parameter - // changes, but they are in a separate struct, so we have to check them manually - walk_engine_.setPhaseRest(config_.node.phase_reset.effort.active || config_.node.phase_reset.foot_pressure.active || - config_.node.phase_reset.imu.active); - walk_engine_.setPauseDuration(config_.node.stability_stop.pause_duration); -} - -void WalkNode::run() { - // Get up to date parameters - updateParams(); - - double dt = getTimeDelta(); - // necessary as timer in simulation does not work correctly https://github.com/ros2/rclcpp/issues/465 - if (dt != 0.0) { - if (robot_state_ == bitbots_msgs::msg::RobotControlState::FALLING || - robot_state_ == bitbots_msgs::msg::RobotControlState::GETTING_UP || - robot_state_ == bitbots_msgs::msg::RobotControlState::PENALTY) { - // The robot fell or the penalty button was pressed. - // We have to reset everything and do nothing else to ensure a stable restart afterwards. - walk_engine_.reset(); - stabilizer_.reset(); - } else { - // we don't want to walk, even if we have orders, if we are not in the right state - current_request_.walkable_state = robot_state_ == bitbots_msgs::msg::RobotControlState::CONTROLLABLE || - robot_state_ == bitbots_msgs::msg::RobotControlState::WALKING || - robot_state_ == bitbots_msgs::msg::RobotControlState::MOTOR_OFF; - - // reset when we start walking, otherwise PID controller will use old I value - if ((last_request_.linear_orders[0] == 0 && last_request_.linear_orders[1] == 0 && - last_request_.angular_z == 0) && - (current_request_.linear_orders[0] != 0 || current_request_.linear_orders[1] != 0 || - current_request_.angular_z != 0)) { - stabilizer_.reset(); - } - last_request_ = current_request_; - - // perform all the actual calculations - bitbots_msgs::msg::JointCommand joint_goals = step(dt); - - // only publish goals if we are not idle - if (walk_engine_.getState() != WalkState::IDLE) { - pub_controller_command_->publish(joint_goals); - - // publish current support state - biped_interfaces::msg::Phase support_state; - if (walk_engine_.isDoubleSupport()) { - support_state.phase = biped_interfaces::msg::Phase::DOUBLE_STANCE; - } else if (walk_engine_.isLeftSupport()) { - support_state.phase = biped_interfaces::msg::Phase::LEFT_STANCE; - } else { - support_state.phase = biped_interfaces::msg::Phase::RIGHT_STANCE; - } - // publish if foot changed - if (current_support_foot_ != support_state.phase) { - support_state.header.stamp = node_->get_clock()->now(); - pub_support_->publish(support_state); - current_support_foot_ = support_state.phase; - } - } - } - - // publish debug information - if (config_.node.debug_active) { - publish_debug(); - } - // always publish odometry to not confuse odometry fuser - pub_odometry_->publish(getOdometry()); - } -} - -void WalkNode::publish_debug() { visualizer_.publishDebug(current_stabilized_response_, current_state_, motor_goals_); } - -bitbots_msgs::msg::JointCommand WalkNode::step(double dt) { - WalkRequest request(current_request_); - - // update walk engine response - if (got_new_goals_) { - got_new_goals_ = false; - walk_engine_.setGoals(request); - } - checkPhaseRestAndReset(); - current_response_ = walk_engine_.update(dt); - - // only calculate joint goals from this if the engine is not idle - current_response_.current_fused_roll = current_trunk_fused_roll_; - current_response_.current_fused_pitch = current_trunk_fused_pitch_; - - bitbots_msgs::msg::JointCommand command; - if (walk_engine_.getState() != WalkState::IDLE) { - // get stabilized goals from stabilizer - current_stabilized_response_ = - stabilizer_.stabilize(current_response_, rclcpp::Duration::from_nanoseconds(1e9 * dt)); - - // compute motor goals from IK - motor_goals_ = ik_.calculate(current_stabilized_response_); - - command.header.stamp = node_->get_clock()->now(); - /* - * Since our JointGoals type is a vector of strings - * combined with a vector of numbers (motor name -> target position) - * and bitbots_msgs::msg::JointCommand needs both vectors as well, - * we can just assign them - */ - command.joint_names = motor_goals_.first; - command.positions = motor_goals_.second; - - /* And because we are setting position goals and not movement goals, these vectors are set to -1.0*/ - std::vector vels(motor_goals_.first.size(), -1.0); - std::vector accs(motor_goals_.first.size(), -1.0); - std::vector pwms(motor_goals_.first.size(), -1.0); - command.velocities = vels; - command.accelerations = accs; - command.max_currents = pwms; - } - - return command; -} - -double WalkNode::getTimeDelta() { - // compute time delta depended if we are currently in simulation or reality - double dt; - double current_ros_time = node_->get_clock()->now().seconds(); - dt = current_ros_time - last_ros_update_time_; - last_ros_update_time_ = current_ros_time; - - // time is wrong when we run it for the first time - if (first_run_) { - first_run_ = false; - dt = 0.0001; - } - return dt; -} - -void WalkNode::reset() { - walk_engine_.reset(); - stabilizer_.reset(); -} - -void WalkNode::reset(WalkState state, double phase, geometry_msgs::msg::Twist::SharedPtr cmd_vel, bool reset_odometry) { - auto step = get_step_from_vel(cmd_vel); - bool stop_walk = cmd_vel->angular.x < 0; - walk_engine_.reset(state, phase, step, stop_walk, true, reset_odometry); - stabilizer_.reset(); - cmdVelCb(cmd_vel); -} - -bitbots_msgs::msg::JointCommand WalkNode::step(double dt, const geometry_msgs::msg::Twist::SharedPtr cmdvel_msg, - const sensor_msgs::msg::Imu::SharedPtr imu_msg, - const sensor_msgs::msg::JointState::SharedPtr jointstate_msg, - const bitbots_msgs::msg::FootPressure::SharedPtr pressure_left, - const bitbots_msgs::msg::FootPressure::SharedPtr pressure_right) { - // method for python interface. take all messages as parameters instead of using ROS - cmdVelCb(cmdvel_msg); - imuCb(imu_msg); - jointStateCb(jointstate_msg); - pressureLeftCb(pressure_left); - pressureRightCb(pressure_right); - // we don't use external robot state - current_request_.walkable_state = true; - // update walk engine response - bitbots_msgs::msg::JointCommand joint_goals = step(dt); - return joint_goals; -} - -bitbots_msgs::msg::JointCommand WalkNode::step_relative( - double dt, const geometry_msgs::msg::Twist::SharedPtr step_msg, const sensor_msgs::msg::Imu::SharedPtr imu_msg, - const sensor_msgs::msg::JointState::SharedPtr jointstate_msg, - const bitbots_msgs::msg::FootPressure::SharedPtr pressure_left, - const bitbots_msgs::msg::FootPressure::SharedPtr pressure_right) { - // method for python interface. take all messages as parameters instead of using ROS - // use length of next step instead of cmd_vel - got_new_goals_ = true; - current_request_.single_step = false; - - current_request_.linear_orders = {step_msg->linear.x, step_msg->linear.y, step_msg->linear.z}; - current_request_.angular_z = step_msg->angular.z; - - // special command to completely stop the walking - current_request_.stop_walk = step_msg->angular.x != 0; - - imuCb(imu_msg); - jointStateCb(jointstate_msg); - pressureLeftCb(pressure_left); - pressureRightCb(pressure_right); - // we don't use external robot state - current_request_.walkable_state = true; - // update walk engine response - bitbots_msgs::msg::JointCommand joint_goals = step(dt); - return joint_goals; -} - -geometry_msgs::msg::PoseArray WalkNode::step_open_loop(double dt, - const geometry_msgs::msg::Twist::SharedPtr cmdvel_msg) { - cmdVelCb(cmdvel_msg); - // get cartesian goals from open loop engine - WalkRequest request(current_request_); - walk_engine_.setGoals(request); - current_response_ = walk_engine_.update(dt); - - // change goals from support foot based coordinate system to trunk based coordinate system - tf2::Transform trunk_to_support_foot_goal = current_response_.support_foot_to_trunk.inverse(); - tf2::Transform trunk_to_flying_foot_goal = trunk_to_support_foot_goal * current_response_.support_foot_to_flying_foot; - geometry_msgs::msg::Pose left_foot_goal_msg; - geometry_msgs::msg::Pose right_foot_goal_msg; - // decide which foot is which - if (current_response_.is_left_support_foot) { - bitbots_quintic_walk::tf_pose_to_msg(trunk_to_support_foot_goal, left_foot_goal_msg); - bitbots_quintic_walk::tf_pose_to_msg(trunk_to_flying_foot_goal, right_foot_goal_msg); - } else { - bitbots_quintic_walk::tf_pose_to_msg(trunk_to_support_foot_goal, right_foot_goal_msg); - bitbots_quintic_walk::tf_pose_to_msg(trunk_to_flying_foot_goal, left_foot_goal_msg); - } - geometry_msgs::msg::PoseArray pose_array; - pose_array.poses = {left_foot_goal_msg, right_foot_goal_msg}; - return pose_array; -} - -geometry_msgs::msg::Pose WalkNode::get_left_foot_pose() { - moveit::core::RobotStatePtr goal_state = ik_.get_goal_state(); - geometry_msgs::msg::Pose pose; - tf2::convert(goal_state->getGlobalLinkTransform("l_sole"), pose); - return pose; -} - -geometry_msgs::msg::Pose WalkNode::get_right_foot_pose() { - moveit::core::RobotStatePtr goal_state = ik_.get_goal_state(); - geometry_msgs::msg::Pose pose; - tf2::convert(goal_state->getGlobalLinkTransform("r_sole"), pose); - return pose; -} - -std::array WalkNode::get_step_from_vel(const geometry_msgs::msg::Twist::SharedPtr msg) { - // We have to compute by dividing by step frequency which is a double step - // factor 2 since the order distance is only for a single step, not double step - double factor = (1.0 / (walk_engine_.getFreq())) / 2.0; - // the sidewards movement only does one step per double step, since the second foot only goes back to the initial - // pose therefore we need to multiply it by 2 furthermore, the engine does not really reach the correct goal - // speed, dependent on the parameters - std::array step = {msg->linear.x * factor * config_.node.x_speed_multiplier + config_.node.x_bias, - msg->linear.y * factor * 2 * config_.node.y_speed_multiplier + config_.node.y_bias, - msg->linear.z * factor, - msg->angular.z * factor * config_.node.yaw_speed_multiplier + config_.node.yaw_bias}; - - std::array clamped_step = { - // the orders should not extend beyond a maximal step size - std::clamp(step[0], -config_.node.max_step_x, config_.node.max_step_x), - std::clamp(step[1], -config_.node.max_step_y, config_.node.max_step_y), - std::clamp(step[2], -config_.node.max_step_z, config_.node.max_step_z), - std::max(std::min(step[3], config_.node.max_step_angular), config_.node.max_step_angular * -1)}; - - // translational orders (x+y) should not exceed combined limit. scale if necessary - if (config_.node.max_step_xy != 0) { - double scaling_factor = sqrt(pow(clamped_step[0], 2) + pow(clamped_step[1], 2)) / config_.node.max_step_xy; - for (int i = 0; i < 2; i++) { - clamped_step[i] = clamped_step[i] / std::max(scaling_factor, 1.0); - } - } - - // warn user that speed was limited - if (step != clamped_step) { - RCLCPP_WARN( - node_->get_logger(), - "Commanded step 'x: %.2f y: %.2f z: %.2f angular: %.2f' exceeded limits, clamped to 'x: %.2f y: %.2f z: " - "%.2f angular: %.2f'", - step[0], step[1], step[2], step[3], clamped_step[0], clamped_step[1], clamped_step[2], clamped_step[3]); - } - - return clamped_step; -} -void WalkNode::stepCb(const geometry_msgs::msg::Twist::SharedPtr msg) { - current_request_.linear_orders = {msg->linear.x, msg->linear.y, msg->linear.z}; - current_request_.angular_z = msg->angular.z; - current_request_.single_step = true; - current_request_.stop_walk = true; - got_new_goals_ = true; -} - -void WalkNode::cmdVelCb(const geometry_msgs::msg::Twist::SharedPtr msg) { - got_new_goals_ = true; - current_request_.single_step = false; - - // we use only 3 values from the twist messages, as the robot is not capable of jumping or spinning around its - // other axis. - - // the engine expects orders in [m] not [m/s] - auto step = get_step_from_vel(msg); - current_request_.linear_orders = {step[0], step[1], step[2]}; - current_request_.angular_z = step[3]; - - // special command to completely stop the walking - current_request_.stop_walk = msg->angular.x != 0; -} - -void WalkNode::imuCb(const sensor_msgs::msg::Imu::SharedPtr msg) { - // the incoming geometry_msgs::msg::Quaternion is transformed to a tf2::Quaternion - tf2::Quaternion quat; - tf2::convert(msg->orientation, quat); - // the tf2::Quaternion has a method to access roll pitch and yaw - double roll, pitch, yaw; - tf2::Matrix3x3(quat).getRPY(roll, pitch, yaw); - - Eigen::Quaterniond imu_orientation_eigen = Eigen::Quaterniond(quat.w(), quat.x(), quat.y(), quat.z()); - rot_conv::FusedAngles imu_fused = rot_conv::FusedFromQuat(imu_orientation_eigen); - - current_trunk_fused_pitch_ = imu_fused.fusedPitch; - current_trunk_fused_roll_ = imu_fused.fusedRoll; - - // Calculate ema (exponential moving average) of y (sideways) acceleration in a time-independet manner - if (last_imu_measurement_time_) { - auto time_delta = rclcpp::Time(msg->header.stamp) - last_imu_measurement_time_.value(); - double exponent_in_s = -time_delta.nanoseconds() / (config_.node.imu_y_acc_tau * 1e9); - double alpha = 1 - std::exp(exponent_in_s); - - imu_y_acc = msg->linear_acceleration.y * alpha + imu_y_acc * (1 - alpha); - } else { - imu_y_acc = msg->linear_acceleration.y; - } - - if (config_.node.stability_stop.imu.active) { - // compute the pitch offset to the currently wanted pitch of the engine - double wanted_pitch = walk_engine_.getWantedTrunkPitch(); - - // Get the sub struct of the imu stability stop config - auto params = config_.node.stability_stop.imu; - - // Get angular velocities - double roll_vel = msg->angular_velocity.x; - double pitch_vel = msg->angular_velocity.y; - - // Check if we have to stop the walk - double pitch_delta = pitch - wanted_pitch; - if (abs(roll) > params.roll.threshold or abs(pitch_delta) > params.pitch.threshold or - abs(pitch_vel) > params.pitch.vel_threshold or abs(roll_vel) > params.roll.vel_threshold) { - walk_engine_.requestPause(); - if (abs(roll) > params.roll.threshold) { - RCLCPP_WARN(node_->get_logger(), "imu roll angle stop"); - } else if (abs(pitch_delta) > params.pitch.threshold) { - RCLCPP_WARN(node_->get_logger(), "imu pitch angle stop"); - } else if (abs(pitch_vel) > params.pitch.vel_threshold) { - RCLCPP_WARN(node_->get_logger(), "imu roll vel stop"); - } else { - RCLCPP_WARN(node_->get_logger(), "imu pitch vel stop"); - } - } - } - // Store the timestamp - last_imu_measurement_time_ = msg->header.stamp; -} - -void WalkNode::pressureLeftCb(const bitbots_msgs::msg::FootPressure::SharedPtr msg) { - // only check if this foot is not the current support foot - if (!walk_engine_.isLeftSupport()) { - current_fly_pressure_ = msg->left_back + msg->left_front + msg->right_back + msg->right_front; - } -} - -void WalkNode::pressureRightCb(const bitbots_msgs::msg::FootPressure::SharedPtr msg) { - // only check if this foot is not the current support foot - if (walk_engine_.isLeftSupport()) { - current_fly_pressure_ = msg->left_back + msg->left_front + msg->right_back + msg->right_front; - } -} - -void WalkNode::checkPhaseRestAndReset() { - /** - * This method checks if the foot made contact to the ground and ends the step earlier by resetting the phase - ("phase reset") or lets the robot rest until it makes ground contact ("phase rest"). - */ - double phase = walk_engine_.getPhase(); - // Check if we are in the correct point of the phase to do a phase reset - // Phase has to be far enough (almost at end of step) so that the foot has already lifted from the ground - // otherwise we will always do phase reset in the beginning of the step - double min_phase_single_step = config_.node.phase_reset.min_phase / 2; - if ((phase > min_phase_single_step and phase < 0.5) or (phase > 0.5 + min_phase_single_step)) { - // Check if one of our phase reset conditions is met - if ((config_.node.phase_reset.foot_pressure.active and - current_fly_pressure_ > config_.node.phase_reset.foot_pressure.ground_min_pressure) or - (config_.node.phase_reset.effort.active and - current_fly_effort_ > config_.node.phase_reset.effort.joint_min_effort) or - (config_.node.phase_reset.imu.active and - std::abs(imu_y_acc) < config_.node.phase_reset.imu.y_acceleration_threshold)) { - // Manually end the step - // This may and a step earlier than the engine would do it - // But it can also lengthen the step, as the engine will not end the step by itself if a phase reset is active - walk_engine_.endStep(); - } - } -} - -void WalkNode::robotStateCb(const bitbots_msgs::msg::RobotControlState::SharedPtr msg) { robot_state_ = msg->state; } - -void WalkNode::jointStateCb(const sensor_msgs::msg::JointState::SharedPtr msg) { - std::vector names = msg->name; - std::vector goals = msg->position; - for (size_t i = 0; i < names.size(); i++) { - // besides its name, this method only changes a single joint position... - current_state_->setJointPositions(names[i], &goals[i]); - } - - // compute the effort that is currently on the flying leg to check if it has ground contact - // only if we have the necessary data - if (msg->effort.size() == msg->name.size()) { - double effort_sum = 0; - const std::vector& fly_joint_names = - (walk_engine_.isLeftSupport()) ? ik_.getRightLegJointNames() : ik_.getLeftLegJointNames(); - for (size_t i = 0; i < names.size(); i++) { - // add effort on this joint to sum, if it is part of the flying leg - if (std::find(fly_joint_names.begin(), fly_joint_names.end(), names[i]) != fly_joint_names.end()) { - effort_sum = effort_sum + abs(msg->effort[i]); - } - } - current_fly_effort_ = effort_sum; - } else { - RCLCPP_WARN_ONCE(node_->get_logger(), - "Joint states have no effort information. Phase reset based on this will not work."); - } -} - -void WalkNode::kickCb(const std_msgs::msg::Bool::SharedPtr msg) { walk_engine_.requestKick(msg->data); } - -nav_msgs::msg::Odometry WalkNode::getOdometry() { - // odometry to trunk is transform to support foot * transform from support to trunk - tf2::Transform support_foot_tf; - if (walk_engine_.isLeftSupport()) { - support_foot_tf = walk_engine_.getLeft(); - } else { - support_foot_tf = walk_engine_.getRight(); - } - - tf2::Transform odom_to_trunk = support_foot_tf * current_response_.support_foot_to_trunk; - tf2::Vector3 pos = odom_to_trunk.getOrigin(); - geometry_msgs::msg::Quaternion quat_msg; - tf2::Quaternion quat_normalized = odom_to_trunk.getRotation().normalize(); - quat_msg.x = quat_normalized.x(); - quat_msg.y = quat_normalized.y(); - quat_msg.z = quat_normalized.z(); - quat_msg.w = quat_normalized.w(); - - rclcpp::Time current_time = node_->get_clock()->now(); - - // send the odometry as message - odom_msg_.header.stamp = current_time; - odom_msg_.header.frame_id = config_.node.tf.odom_frame; - odom_msg_.child_frame_id = config_.node.tf.base_link_frame; - odom_msg_.pose.pose.position.x = pos[0]; - odom_msg_.pose.pose.position.y = pos[1]; - odom_msg_.pose.pose.position.z = pos[2]; - odom_msg_.pose.pose.orientation = quat_msg; - - geometry_msgs::msg::Twist twist; - twist.linear.x = current_request_.linear_orders[0] * walk_engine_.getFreq() * 2 / config_.node.x_speed_multiplier; - twist.linear.y = current_request_.linear_orders[1] * walk_engine_.getFreq() / config_.node.y_speed_multiplier; - twist.linear.z = current_request_.linear_orders[2] * walk_engine_.getFreq() * 2; - twist.angular.z = current_request_.angular_z * walk_engine_.getFreq() * 2 / config_.node.yaw_speed_multiplier; - - odom_msg_.twist.twist = twist; - return odom_msg_; -} - -void WalkNode::initializeEngine() { walk_engine_.reset(); } - -WalkEngine* WalkNode::getEngine() { return &walk_engine_; } - -WalkIK* WalkNode::getIk() { return &ik_; } - -moveit::core::RobotModelPtr* WalkNode::get_kinematic_model() { return &kinematic_model_; } - -double WalkNode::getTimerFreq() { return config_.node.engine_freq; } - -} // namespace bitbots_quintic_walk - -int main(int argc, char** argv) { - rclcpp::init(argc, argv); - // init node - auto node = std::make_shared("walking"); - - // Create an executor that will be used to execute callbacks for our node. - rclcpp::experimental::executors::EventsExecutor exec; - - // Init node part of the walking - bitbots_quintic_walk::WalkNode walk_node(node); - walk_node.initializeEngine(); - - // Create timer that calls the run method of the walking regularly - rclcpp::Duration timer_duration = rclcpp::Duration::from_seconds(1.0 / walk_node.getTimerFreq()); - rclcpp::TimerBase::SharedPtr timer = - rclcpp::create_timer(node, node->get_clock(), timer_duration, [&walk_node]() -> void { walk_node.run(); }); - - // Run the executor so everything is executed - exec.add_node(node); - exec.spin(); - rclcpp::shutdown(); -} diff --git a/src/bitbots_motion/bitbots_quintic_walk/src/walk_pywrapper.cpp b/src/bitbots_motion/bitbots_quintic_walk/src/walk_pywrapper.cpp deleted file mode 100644 index 0fb1da82b3..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/src/walk_pywrapper.cpp +++ /dev/null @@ -1,234 +0,0 @@ -#include - -void PyWalkWrapper::spin_some() { rclcpp::spin_some(node_); } - -PyWalkWrapper::PyWalkWrapper(const std::string& ns, const std::vector& walk_parameter_msgs, - const std::vector& moveit_parameter_msgs, bool force_smooth_step_transition) { - // initialize rclcpp if not already done - if (!rclcpp::contexts::get_global_default_context()->is_valid()) { - rclcpp::init(0, nullptr); - } - - // internal function to deserialize the parameter messages - auto deserialize_parameters = [](std::vector parameter_msgs) { - std::vector cpp_parameters = {}; - for (auto& parameter_msg : parameter_msgs) { - cpp_parameters.push_back( - rclcpp::Parameter::from_parameter_msg(fromPython(parameter_msg))); - } - return cpp_parameters; - }; - - // Create a node object - // Even tho we use python bindings instead of ros's dds, we still need a node object for logging and parameter - // handling Because the walking is not started using the launch infrastructure and an appropriate parameter file, we - // need to manually set the parameters - node_ = rclcpp::Node::make_shared( - "walking", ns, rclcpp::NodeOptions().parameter_overrides(deserialize_parameters(walk_parameter_msgs))); - - // Create the walking object - // We pass it the node we created. But the walking also creates a helper node for moveit (otherwise dynamic - // reconfigure does not work, because moveit does some bullshit with their parameter declarations leading dynamic - // reconfigure not working). This way the walking parameters are isolated from the moveit parameters, allowing dynamic - // reconfigure to work. Therefore we need to pass the moveit parameters to the walking. - walk_node_ = - std::make_shared(node_, ns, deserialize_parameters(moveit_parameter_msgs)); - set_robot_state(0); - walk_node_->initializeEngine(); - walk_node_->getEngine()->setForceSmoothStepTransition(force_smooth_step_transition); -} - -py::bytes PyWalkWrapper::step(double dt, py::bytes& cmdvel_msg, py::bytes& imu_msg, py::bytes& jointstate_msg, - py::bytes& pressure_left, py::bytes& pressure_right) { - bitbots_msgs::msg::JointCommand result = walk_node_->step( - dt, std::make_shared(fromPython(cmdvel_msg)), - std::make_shared(fromPython(imu_msg)), - std::make_shared(fromPython(jointstate_msg)), - std::make_shared(fromPython(pressure_left)), - std::make_shared(fromPython(pressure_right))); - return toPython(result); -} - -py::bytes PyWalkWrapper::step_relative(double dt, py::bytes& step_msg, py::bytes& imu_msg, py::bytes& jointstate_msg, - py::bytes& pressure_left, py::bytes& pressure_right) { - bitbots_msgs::msg::JointCommand result = walk_node_->step_relative( - dt, std::make_shared(fromPython(step_msg)), - std::make_shared(fromPython(imu_msg)), - std::make_shared(fromPython(jointstate_msg)), - std::make_shared(fromPython(pressure_left)), - std::make_shared(fromPython(pressure_right))); - return toPython(result); -} - -py::bytes PyWalkWrapper::step_open_loop(double dt, py::bytes& cmdvel_msg) { - geometry_msgs::msg::PoseArray result = walk_node_->step_open_loop( - dt, std::make_shared(fromPython(cmdvel_msg))); - return toPython(result); -} - -py::bytes PyWalkWrapper::get_left_foot_pose() { - geometry_msgs::msg::Pose result = walk_node_->get_left_foot_pose(); - return toPython(result); -} -py::bytes PyWalkWrapper::get_right_foot_pose() { - geometry_msgs::msg::Pose result = walk_node_->get_right_foot_pose(); - return toPython(result); -} - -py::bytes PyWalkWrapper::get_odom() { - nav_msgs::msg::Odometry result = walk_node_->getOdometry(); - return toPython(result); -} - -void PyWalkWrapper::reset() { walk_node_->reset(); } - -void PyWalkWrapper::special_reset(int state, double phase, py::bytes cmd_vel, bool reset_odometry) { - bitbots_quintic_walk::WalkState walk_state; - if (state == 0) { - walk_state = bitbots_quintic_walk::WalkState::PAUSED; - } else if (state == 1) { - walk_state = bitbots_quintic_walk::WalkState::WALKING; - } else if (state == 2) { - walk_state = bitbots_quintic_walk::WalkState::IDLE; - } else if (state == 3) { - walk_state = bitbots_quintic_walk::WalkState::START_MOVEMENT; - } else if (state == 4) { - walk_state = bitbots_quintic_walk::WalkState::STOP_MOVEMENT; - } else if (state == 5) { - walk_state = bitbots_quintic_walk::WalkState::START_STEP; - } else if (state == 6) { - walk_state = bitbots_quintic_walk::WalkState::STOP_STEP; - } else if (state == 7) { - walk_state = bitbots_quintic_walk::WalkState::KICK; - } else { - RCLCPP_WARN(node_->get_logger(), "state in special reset not clear"); - return; - } - walk_node_->reset(walk_state, phase, - std::make_shared(fromPython(cmd_vel)), - reset_odometry); -} - -double PyWalkWrapper::get_phase() { return walk_node_->getEngine()->getPhase(); } - -double PyWalkWrapper::get_freq() { return walk_node_->getEngine()->getFreq(); } - -py::bytes PyWalkWrapper::get_support_state() { - biped_interfaces::msg::Phase support_state; - if (walk_node_->getEngine()->isDoubleSupport()) { - support_state.phase = biped_interfaces::msg::Phase::DOUBLE_STANCE; - } else if (walk_node_->getEngine()->isLeftSupport()) { - support_state.phase = biped_interfaces::msg::Phase::LEFT_STANCE; - } else { - support_state.phase = biped_interfaces::msg::Phase::RIGHT_STANCE; - } - return toPython(support_state); -} - -bool PyWalkWrapper::is_left_support() { return walk_node_->getEngine()->isLeftSupport(); } - -void PyWalkWrapper::set_robot_state(int state) { - bitbots_msgs::msg::RobotControlState state_msg; - state_msg.state = state; - walk_node_->robotStateCb(std::make_shared(state_msg)); -} - -void PyWalkWrapper::set_parameter(py::bytes parameter_msg) { - // convert serialized parameter msg to parameter object - rclcpp::Parameter parameter = - rclcpp::Parameter::from_parameter_msg(fromPython(parameter_msg)); - - node_->set_parameter(parameter); - walk_node_->updateParams(); -} - -void PyWalkWrapper::publish_debug() { walk_node_->publish_debug(); } - -bool PyWalkWrapper::reset_and_test_if_speed_possible(py::bytes cmd_vel, double pos_threshold) { - walk_node_->reset(bitbots_quintic_walk::WalkState::WALKING, 0.0, - std::make_shared(fromPython(cmd_vel)), true); - bitbots_quintic_walk::WalkEngine* engine = walk_node_->getEngine(); - bitbots_quintic_walk::WalkIK* ik = walk_node_->getIk(); - bitbots_quintic_walk::WalkResponse current_response; - bitbots_splines::JointGoals joint_goals; - moveit::core::RobotStatePtr goal_state; - goal_state.reset(new moveit::core::RobotState(*walk_node_->get_kinematic_model())); - tf2::Vector3 support_off; - tf2::Vector3 fly_off; - tf2::Vector3 tf_vec_left; - tf2::Vector3 tf_vec_right; - Eigen::Vector3d l_transform; - Eigen::Vector3d r_transform; - int support_foot_changes = 0; - bool last_support_foot = engine->isLeftSupport(); - - while (support_foot_changes < 2) { - current_response = engine->update(0.01); - joint_goals = ik->calculate(current_response); - - // count finished half steps for stop condition - if (engine->isLeftSupport() != last_support_foot) { - last_support_foot = engine->isLeftSupport(); - support_foot_changes++; - } - - tf2::Transform trunk_to_support_foot = current_response.support_foot_to_trunk.inverse(); - tf2::Transform trunk_to_flying_foot = trunk_to_support_foot * current_response.support_foot_to_flying_foot; - - // set joints in the state to compute forward kinematics - std::vector names = joint_goals.first; - std::vector goals = joint_goals.second; - for (size_t i = 0; i < names.size(); i++) { - // besides its name, this method only changes a single joint position... - goal_state->setJointPositions(names[i], &goals[i]); - } - goal_state->updateLinkTransforms(); - - // read out forward kinematics and compare - l_transform = goal_state->getGlobalLinkTransform("l_sole").translation(); - r_transform = goal_state->getGlobalLinkTransform("r_sole").translation(); - tf2::convert(l_transform, tf_vec_left); - tf2::convert(r_transform, tf_vec_right); - if (current_response.is_left_support_foot) { - support_off = trunk_to_support_foot.getOrigin() - tf_vec_left; - fly_off = trunk_to_flying_foot.getOrigin() - tf_vec_right; - } else { - support_off = trunk_to_support_foot.getOrigin() - tf_vec_right; - fly_off = trunk_to_flying_foot.getOrigin() - tf_vec_left; - } - - double pos_offset = std::abs(support_off.x()) + std::abs(support_off.y()) + std::abs(support_off.z()) + - std::abs(fly_off.x()) + std::abs(fly_off.y()) + std::abs(fly_off.z()); - // RCLCPP_WARN(walk_node_->get_logger(), "%f", pos_offset); - // todo orientation offset not so simple due to quaternions but could be checked too. typically the position is - // enough to see that the IK solution is wrong - if (pos_offset > pos_threshold) { - return false; - } - } - return true; -} - -PYBIND11_MODULE(libpy_quintic_walk, m) { - using namespace bitbots_quintic_walk; - - py::class_>(m, "PyWalkWrapper") - .def(py::init, std::vector, bool>()) - .def("step", &PyWalkWrapper::step) - .def("step_relative", &PyWalkWrapper::step_relative) - .def("step_open_loop", &PyWalkWrapper::step_open_loop) - .def("get_left_foot_pose", &PyWalkWrapper::get_left_foot_pose) - .def("get_right_foot_pose", &PyWalkWrapper::get_right_foot_pose) - .def("set_robot_state", &PyWalkWrapper::set_robot_state) - .def("reset", &PyWalkWrapper::reset) - .def("special_reset", &PyWalkWrapper::special_reset) - .def("set_parameter", &PyWalkWrapper::set_parameter) - .def("get_phase", &PyWalkWrapper::get_phase) - .def("get_freq", &PyWalkWrapper::get_freq) - .def("get_odom", &PyWalkWrapper::get_odom) - .def("spin_some", &PyWalkWrapper::spin_some) - .def("publish_debug", &PyWalkWrapper::publish_debug) - .def("get_support_state", &PyWalkWrapper::get_support_state) - .def("is_left_support", &PyWalkWrapper::is_left_support) - .def("reset_and_test_if_speed_possible", &PyWalkWrapper::reset_and_test_if_speed_possible); -} diff --git a/src/bitbots_motion/bitbots_quintic_walk/src/walk_stabilizer.cpp b/src/bitbots_motion/bitbots_quintic_walk/src/walk_stabilizer.cpp deleted file mode 100644 index 987a83c9f6..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/src/walk_stabilizer.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include - -namespace bitbots_quintic_walk { - -WalkStabilizer::WalkStabilizer(rclcpp::Node::SharedPtr node) - : pid_trunk_fused_pitch_(node, "node.trunk_pid.pitch", "", false), - pid_trunk_fused_roll_(node, "node.trunk_pid.roll", "", false) { - pid_trunk_fused_pitch_.initialize_from_ros_parameters(); - pid_trunk_fused_roll_.initialize_from_ros_parameters(); - - reset(); -} - -void WalkStabilizer::reset() { - pid_trunk_fused_pitch_.reset(); - pid_trunk_fused_roll_.reset(); -} - -WalkResponse WalkStabilizer::stabilize(const WalkResponse& response, const rclcpp::Duration& dt) { - // compute orientation with PID control - double goal_pitch, goal_roll, goal_yaw; - tf2::Matrix3x3(response.support_foot_to_trunk.getRotation()).getRPY(goal_roll, goal_pitch, goal_yaw); - - tf2::Quaternion quat_msg = response.support_foot_to_trunk.getRotation(); - Eigen::Quaterniond goal_orientation_eigen = - Eigen::Quaterniond(quat_msg.getW(), quat_msg.getX(), quat_msg.getY(), quat_msg.getZ()); - - // compute orientation with fused angles for PID control - rot_conv::FusedAngles goal_fused = rot_conv::FusedFromQuat(goal_orientation_eigen); - - // adapt trunk values based on PID controllers - double fused_roll_correction = - pid_trunk_fused_roll_.compute_command(goal_fused.fusedRoll - response.current_fused_roll, dt); - double fused_pitch_correction = - pid_trunk_fused_pitch_.compute_command(goal_fused.fusedPitch - response.current_fused_pitch, dt); - - // Change trunk x offset (in the trunks frame of reference) based on the PID controllers - WalkResponse stabilized_response{response}; - - tf2::Transform trunk_offset; - trunk_offset.setOrigin(tf2::Vector3(fused_pitch_correction, fused_roll_correction, 0.0)); - trunk_offset.setRotation(tf2::Quaternion::getIdentity()); - - // apply the trunk offset to the trunk pose - stabilized_response.support_foot_to_trunk = trunk_offset * response.support_foot_to_trunk; - - return stabilized_response; -} -} // namespace bitbots_quintic_walk diff --git a/src/bitbots_motion/bitbots_quintic_walk/src/walk_visualizer.cpp b/src/bitbots_motion/bitbots_quintic_walk/src/walk_visualizer.cpp deleted file mode 100644 index d1a117aba1..0000000000 --- a/src/bitbots_motion/bitbots_quintic_walk/src/walk_visualizer.cpp +++ /dev/null @@ -1,327 +0,0 @@ -#include - -namespace bitbots_quintic_walk { -WalkVisualizer::WalkVisualizer(rclcpp::Node::SharedPtr node, walking::Params::Node::Tf tf_config) - : node_(node), - tf_config_(tf_config), - pub_debug_(node_->create_publisher("walk_debug", 1)), - pub_engine_debug_(node_->create_publisher("walk_engine_debug", 1)), - pub_debug_marker_(node_->create_publisher("walk_debug_marker", 1)) {} - -void WalkVisualizer::init(moveit::core::RobotModelPtr kinematic_model) { kinematic_model_ = kinematic_model; } - -void WalkVisualizer::publishDebug(const WalkResponse& current_response, - const moveit::core::RobotStatePtr& current_state, - const bitbots_splines::JointGoals& motor_goals) { - visualization_msgs::msg::MarkerArray marker_array; - - auto [engine_debug, engine_markers] = buildEngineDebugMsgs(current_response); - marker_array.markers.insert(marker_array.markers.end(), engine_markers.markers.begin(), engine_markers.markers.end()); - pub_engine_debug_->publish(engine_debug); - - auto [ik_debug, ik_markers] = buildIKDebugMsgs(current_response, current_state, motor_goals); - marker_array.markers.insert(marker_array.markers.end(), ik_markers.markers.begin(), ik_markers.markers.end()); - pub_debug_->publish(ik_debug); - - auto walk_markers = buildWalkMarkers(current_response); - marker_array.markers.insert(marker_array.markers.end(), walk_markers.markers.begin(), walk_markers.markers.end()); - - pub_debug_marker_->publish(marker_array); -} - -std::pair -WalkVisualizer::buildEngineDebugMsgs(WalkResponse response) { - // Here we will convert the walk engine response to a various debug messages and RViz markers - // Initialize output containers - bitbots_quintic_walk::msg::WalkEngineDebug msg; - visualization_msgs::msg::MarkerArray marker_array; - - // Copy some data into the debug message - msg.is_left_support = response.is_left_support_foot; - msg.is_double_support = response.is_double_support; - msg.header.stamp = node_->now(); - msg.phase_time = response.phase; - msg.traj_time = response.traj_time; - // Copy walk engine state - static const std::unordered_map state_string_mapping = { - {WalkState::IDLE, "idle"}, - {WalkState::START_MOVEMENT, "start_movement"}, - {WalkState::START_STEP, "start_step"}, - {WalkState::WALKING, "walking"}, - {WalkState::PAUSED, "paused"}, - {WalkState::KICK, "kick"}, - {WalkState::STOP_STEP, "stop_step"}, - {WalkState::STOP_MOVEMENT, "stop_movement"}}; - msg.state.data = state_string_mapping.at(response.state); - msg.state_number = static_cast(response.state); - - // Define current support foot frame - std::string current_support_frame; - if (response.is_left_support_foot) { - current_support_frame = tf_config_.l_sole_frame; - } else { - current_support_frame = tf_config_.r_sole_frame; - } - - // Create placeholder floats - double _1, _2; - // Copy transform of the last footstep position (and orientation) to the debug message - msg.footstep_last.x = response.support_to_last.getOrigin()[0]; - msg.footstep_last.y = response.support_to_last.getOrigin()[1]; - tf2::Matrix3x3(response.support_to_last.getRotation()).getRPY(_1, _2, msg.footstep_last.z); - - // Copy transform of the next footstep position (and orientation) to the debug message - msg.footstep_next.x = response.support_to_next.getOrigin()[0]; - msg.footstep_next.y = response.support_to_next.getOrigin()[1]; - tf2::Matrix3x3(response.support_to_next.getRotation()).getRPY(_1, _2, msg.footstep_next.z); - - // Copy cartesian coordinates of the currently flying foot relative to the support foot to the debug message - tf2::toMsg(response.support_foot_to_flying_foot, msg.fly_goal); - // Create an additional marker for the flying foot goal - marker_array.markers.push_back(createArrowMarker("engine_fly_goal", current_support_frame, msg.fly_goal, BLUE)); - RCLCPP_INFO_ONCE(node_->get_logger(), - "Color for the Engine Debug marker, showing where the flying foot and trunk should be, is blue!"); - - // Copy the rotation of the flying foot relative to the support foot to the debug message - tf2::Matrix3x3(response.support_foot_to_flying_foot.getRotation()) - .getRPY(msg.fly_euler.x, msg.fly_euler.y, msg.fly_euler.z); - - // Copy cartesian coordinates of the trunk goal relative to the support foot to the debug message - tf2::toMsg(response.support_foot_to_trunk, msg.trunk_goal); - // Create an additional marker for the trunk goal - marker_array.markers.push_back(createArrowMarker("engine_trunk_goal", current_support_frame, msg.trunk_goal, BLUE)); - - // TODO check this!!! - msg.trunk_goal_abs = msg.trunk_goal; - if (msg.trunk_goal_abs.position.y > 0) { - msg.trunk_goal_abs.position.y -= response.foot_distance / 2; - } else { - msg.trunk_goal_abs.position.y += response.foot_distance / 2; - } - - tf2::Matrix3x3(response.support_foot_to_flying_foot.getRotation()) - .getRPY(msg.trunk_euler.x, msg.trunk_euler.y, msg.trunk_euler.z); - - // resulting trunk pose - geometry_msgs::msg::Pose pose; - pose.orientation.w = 1; - marker_array.markers.push_back(createArrowMarker("trunk_result", tf_config_.base_link_frame, pose, GREEN)); - RCLCPP_INFO_ONCE(node_->get_logger(), "Color for the Engine Debug marker, showing where the trunk is, is green!"); - - return {msg, marker_array}; -} - -std::pair WalkVisualizer::buildIKDebugMsgs( - WalkResponse response, moveit::core::RobotStatePtr current_state, bitbots_splines::JointGoals joint_goals) { - bitbots_quintic_walk::msg::WalkDebug msg; - visualization_msgs::msg::MarkerArray marker_array; - - tf2::Transform trunk_to_support_foot = response.support_foot_to_trunk.inverse(); - tf2::Transform trunk_to_flying_foot = trunk_to_support_foot * response.support_foot_to_flying_foot; - - // Copy goals into the message - tf2::toMsg(trunk_to_support_foot, msg.support_foot_goal); - tf2::toMsg(trunk_to_flying_foot, msg.fly_foot_goal); - // Set left and right foot goals based on the support foot - if (response.is_left_support_foot) { - msg.left_foot_goal = msg.support_foot_goal; - msg.right_foot_goal = msg.fly_foot_goal; - } else { - msg.left_foot_goal = msg.fly_foot_goal; - msg.right_foot_goal = msg.support_foot_goal; - } - // Create additional markers for the foot goals - marker_array.markers.push_back( - createArrowMarker("engine_left_goal", tf_config_.base_link_frame, msg.left_foot_goal, ORANGE)); - marker_array.markers.push_back( - createArrowMarker("engine_right_goal", tf_config_.base_link_frame, msg.right_foot_goal, ORANGE)); - RCLCPP_INFO_ONCE(node_->get_logger(), "Color for the IK marker, showing where the feet should be, is orange!"); - - // IK results - moveit::core::RobotStatePtr goal_state; - goal_state.reset(new moveit::core::RobotState(kinematic_model_)); - auto& [names, goals] = joint_goals; - for (size_t i = 0; i < names.size(); i++) { - // besides its name, this method only changes a single joint position... - goal_state->setJointPositions(names[i], &goals[i]); - } - goal_state->updateLinkTransforms(); - tf2::convert(goal_state->getFrameTransform("l_sole"), msg.left_foot_ik_result); - tf2::convert(goal_state->getFrameTransform("r_sole"), msg.right_foot_ik_result); - if (response.is_left_support_foot) { - msg.support_foot_ik_result = msg.left_foot_ik_result; - msg.fly_foot_ik_result = msg.right_foot_ik_result; - } else { - msg.support_foot_ik_result = msg.right_foot_ik_result; - msg.fly_foot_ik_result = msg.left_foot_ik_result; - } - marker_array.markers.push_back( - createArrowMarker("ik_left", tf_config_.base_link_frame, msg.left_foot_ik_result, GREEN)); - marker_array.markers.push_back( - createArrowMarker("ik_right", tf_config_.base_link_frame, msg.right_foot_ik_result, GREEN)); - RCLCPP_INFO_ONCE(node_->get_logger(), "Color for the IK marker, showing the ik result, is green!"); - - // IK offsets - tf2::Vector3 support_off; - tf2::Vector3 fly_off; - tf2::Vector3 tf_vec_left; - tf2::Vector3 tf_vec_right; - Eigen::Vector3d l_transform = goal_state->getGlobalLinkTransform("l_sole").translation(); - Eigen::Vector3d r_transform = goal_state->getGlobalLinkTransform("r_sole").translation(); - tf2::convert(l_transform, tf_vec_left); - tf2::convert(r_transform, tf_vec_right); - geometry_msgs::msg::Vector3 vect_msg; - if (response.is_left_support_foot) { - support_off = trunk_to_support_foot.getOrigin() - tf_vec_left; - fly_off = trunk_to_flying_foot.getOrigin() - tf_vec_right; - vect_msg.x = support_off.x(); - vect_msg.y = support_off.y(); - vect_msg.z = support_off.z(); - msg.left_foot_ik_offset = vect_msg; - vect_msg.x = fly_off.x(); - vect_msg.y = fly_off.y(); - vect_msg.z = fly_off.z(); - msg.right_foot_ik_offset = vect_msg; - } else { - support_off = trunk_to_support_foot.getOrigin() - tf_vec_right; - fly_off = trunk_to_flying_foot.getOrigin() - tf_vec_left; - vect_msg.x = fly_off.x(); - vect_msg.y = fly_off.y(); - vect_msg.z = fly_off.z(); - msg.left_foot_ik_offset = vect_msg; - vect_msg.x = support_off.x(); - vect_msg.y = support_off.y(); - vect_msg.z = support_off.z(); - msg.right_foot_ik_offset = vect_msg; - } - vect_msg.x = support_off.x(); - vect_msg.y = support_off.y(); - vect_msg.z = support_off.z(); - msg.support_foot_ik_offset = vect_msg; - vect_msg.x = fly_off.x(); - vect_msg.y = fly_off.y(); - vect_msg.z = fly_off.z(); - msg.fly_foot_ik_offset = vect_msg; - - // Actual foot positions determined by the IK solver (not strictly equal to the goals) - tf2::convert(current_state->getGlobalLinkTransform("l_sole"), msg.left_foot_position); - tf2::convert(current_state->getGlobalLinkTransform("r_sole"), msg.right_foot_position); - if (response.is_left_support_foot) { - msg.support_foot_position = msg.left_foot_position; - msg.fly_foot_position = msg.right_foot_position; - } else { - msg.support_foot_position = msg.right_foot_position; - msg.fly_foot_position = msg.left_foot_position; - } - - // Calculate offsets between the actual foot positions and the goals (meaning the IK solver error) - l_transform = current_state->getGlobalLinkTransform("l_sole").translation(); - r_transform = current_state->getGlobalLinkTransform("r_sole").translation(); - tf2::convert(l_transform, tf_vec_left); - tf2::convert(r_transform, tf_vec_right); - if (response.is_left_support_foot) { - support_off = trunk_to_support_foot.getOrigin() - tf_vec_left; - fly_off = trunk_to_flying_foot.getOrigin() - tf_vec_right; - vect_msg.x = support_off.x(); - vect_msg.y = support_off.y(); - vect_msg.z = support_off.z(); - msg.left_foot_actual_offset = vect_msg; - vect_msg.x = fly_off.x(); - vect_msg.y = fly_off.y(); - vect_msg.z = fly_off.z(); - msg.right_foot_actual_offset = vect_msg; - } else { - support_off = trunk_to_support_foot.getOrigin() - tf_vec_right; - fly_off = trunk_to_flying_foot.getOrigin() - tf_vec_left; - vect_msg.x = fly_off.x(); - vect_msg.y = fly_off.y(); - vect_msg.z = fly_off.z(); - msg.left_foot_actual_offset = vect_msg; - vect_msg.x = support_off.x(); - vect_msg.y = support_off.y(); - vect_msg.z = support_off.z(); - msg.right_foot_actual_offset = vect_msg; - } - vect_msg.x = support_off.x(); - vect_msg.y = support_off.y(); - vect_msg.z = support_off.z(); - msg.support_foot_actual_offset = vect_msg; - vect_msg.x = fly_off.x(); - vect_msg.y = fly_off.y(); - vect_msg.z = fly_off.z(); - msg.fly_foot_actual_offset = vect_msg; - - return {msg, marker_array}; -} - -visualization_msgs::msg::Marker WalkVisualizer::createArrowMarker(const std::string& name_space, - const std::string& frame, - const geometry_msgs::msg::Pose& pose, - const std_msgs::msg::ColorRGBA& color) { - visualization_msgs::msg::Marker marker_msg; - marker_msg.header.frame_id = frame; - - marker_msg.type = marker_msg.ARROW; - marker_msg.ns = name_space; - marker_msg.action = marker_msg.ADD; - marker_msg.pose = pose; - marker_msg.color = color; - - geometry_msgs::msg::Vector3 scale; - scale.x = 0.01; - scale.y = 0.003; - scale.z = 0.003; - marker_msg.scale = scale; - marker_msg.id = 0; - - return marker_msg; -} - -visualization_msgs::msg::MarkerArray WalkVisualizer::buildWalkMarkers(WalkResponse response) { - visualization_msgs::msg::MarkerArray marker_array; - - // Create a marker for the last step - visualization_msgs::msg::Marker support_foot_marker_msg; - if (response.is_left_support_foot) { - support_foot_marker_msg.header.frame_id = tf_config_.l_sole_frame; - } else { - support_foot_marker_msg.header.frame_id = tf_config_.r_sole_frame; - } - support_foot_marker_msg.type = support_foot_marker_msg.CUBE; - support_foot_marker_msg.action = 0; - support_foot_marker_msg.lifetime = rclcpp::Duration::from_nanoseconds(0.0); - support_foot_marker_msg.scale.x = 0.2; - support_foot_marker_msg.scale.y = 0.1; - support_foot_marker_msg.scale.z = 0.01; - support_foot_marker_msg.ns = "last_step"; - support_foot_marker_msg.id = 1; - support_foot_marker_msg.color = BLACK; - support_foot_marker_msg.color.a = 0.5; - tf2::toMsg(response.support_to_last, support_foot_marker_msg.pose); - marker_array.markers.push_back(support_foot_marker_msg); - - // This step center - auto step_center_marker_msg(support_foot_marker_msg); - step_center_marker_msg.ns = "step_center"; - step_center_marker_msg.id = 2; - step_center_marker_msg.scale.x = 0.01; - step_center_marker_msg.scale.y = 0.01; - step_center_marker_msg.scale.z = 0.01; - marker_array.markers.push_back(step_center_marker_msg); - - // Next step - auto next_step_marker_msg(support_foot_marker_msg); - next_step_marker_msg.id = 3; - next_step_marker_msg.ns = "next_step"; - next_step_marker_msg.scale.x = 0.20; - next_step_marker_msg.scale.y = 0.10; - next_step_marker_msg.scale.z = 0.01; - next_step_marker_msg.color = WHITE; - next_step_marker_msg.color.a = 0.5; - tf2::toMsg(response.support_to_next, next_step_marker_msg.pose); - marker_array.markers.push_back(next_step_marker_msg); - - return marker_array; -} - -} // namespace bitbots_quintic_walk diff --git a/src/bitbots_motion/bitbots_rl_motion/launch/test.launch b/src/bitbots_motion/bitbots_rl_motion/launch/test.launch index 638d8babd2..cea5fd2bfa 100644 --- a/src/bitbots_motion/bitbots_rl_motion/launch/test.launch +++ b/src/bitbots_motion/bitbots_rl_motion/launch/test.launch @@ -27,7 +27,7 @@ - + diff --git a/src/bitbots_motion/bitbots_splines/CMakeLists.txt b/src/bitbots_motion/bitbots_splines/CMakeLists.txt index ae1098145a..2c6b1acecc 100644 --- a/src/bitbots_motion/bitbots_splines/CMakeLists.txt +++ b/src/bitbots_motion/bitbots_splines/CMakeLists.txt @@ -17,7 +17,6 @@ find_package(bitbots_docs REQUIRED) find_package(Eigen3 REQUIRED) find_package(geometry_msgs REQUIRED) find_package(moveit_core REQUIRED) -find_package(moveit_ros_planning REQUIRED) find_package(PkgConfig REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) @@ -51,7 +50,6 @@ ament_target_dependencies( geometry_msgs tf2_geometry_msgs moveit_core - moveit_ros_planning Eigen3 PkgConfig) ament_python_install_package(bitbots_splines) diff --git a/src/bitbots_motion/bitbots_splines/package.xml b/src/bitbots_motion/bitbots_splines/package.xml index 3d0966b989..d7f2921946 100644 --- a/src/bitbots_motion/bitbots_splines/package.xml +++ b/src/bitbots_motion/bitbots_splines/package.xml @@ -21,7 +21,6 @@ eigen geometry_msgs moveit_core - moveit_ros_planning python3-matplotlib rclcpp std_msgs diff --git a/src/bitbots_msgs/CMakeLists.txt b/src/bitbots_msgs/CMakeLists.txt index 90ec230d9a..dad3a07ffb 100644 --- a/src/bitbots_msgs/CMakeLists.txt +++ b/src/bitbots_msgs/CMakeLists.txt @@ -35,6 +35,7 @@ rosidl_generate_interfaces( "msg/HeadMode.msg" "msg/JointCommand.msg" "msg/JointTorque.msg" + "msg/ModelStates.msg" "msg/NetworkInterface.msg" "msg/PoseWithCertainty.msg" "msg/PoseWithCertaintyArray.msg" diff --git a/src/bitbots_msgs/msg/JointCommand.msg b/src/bitbots_msgs/msg/JointCommand.msg index c86b230dc2..3ea276f831 100644 --- a/src/bitbots_msgs/msg/JointCommand.msg +++ b/src/bitbots_msgs/msg/JointCommand.msg @@ -9,4 +9,4 @@ float64[] positions # set to -1.0 for maximum float64[] velocities float64[] accelerations -float64[] max_currents +float64[] max_torques diff --git a/src/bitbots_msgs/msg/ModelStates.msg b/src/bitbots_msgs/msg/ModelStates.msg new file mode 100644 index 0000000000..bf9b8315bc --- /dev/null +++ b/src/bitbots_msgs/msg/ModelStates.msg @@ -0,0 +1,5 @@ +# Originally from the now deprecated gazebo msgs (we used it for webots and do not really care abot gazebo) + +string[] name # model names +geometry_msgs/Pose[] pose # desired pose in world frame +geometry_msgs/Twist[] twist # desired twist in world frame diff --git a/src/bitbots_robot/README.md b/src/bitbots_robot/README.md deleted file mode 100644 index 3dd661984d..0000000000 --- a/src/bitbots_robot/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# Wolfgang-OP - -This folder contains all software and files directly related to the Wolfgang-OP robot. -If you are interested in this robot, please also look at the following links. - -* Video of the platform: https://youtu.be/UsH6QIKzr7Q -* CAD model, 3D Printing parts and more: https://github.com/bit-bots/bitbots_hardware -* CORE electronics: https://github.com/bit-bots/wolfgang_core -* IMU hardware and firmware: https://github.com/bit-bots/bitbots_imu_dxl -* BitFoot hardware and firmware: https://github.com/bit-bots/bit_foot diff --git a/src/bitbots_robot/piplus_animations/CMakeLists.txt b/src/bitbots_robot/piplus_animations/CMakeLists.txt new file mode 100644 index 0000000000..3bdae34e09 --- /dev/null +++ b/src/bitbots_robot/piplus_animations/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.5) +project(piplus_animations) + +find_package(ament_cmake REQUIRED) +find_package(bitbots_docs REQUIRED) + +enable_bitbots_docs() + +install(DIRECTORY animations DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/src/bitbots_robot/piplus_animations/animations/misc/init.json b/src/bitbots_robot/piplus_animations/animations/misc/init.json new file mode 100644 index 0000000000..4b86810a5d --- /dev/null +++ b/src/bitbots_robot/piplus_animations/animations/misc/init.json @@ -0,0 +1,34 @@ +{ + "default_interpolator": "CatmullRomInterpolator", + "name": "init", + "keyframes": [ + { + "duration": 2.0, + "pause": 0.0, + "goals": { + "l_shoulder_pitch_joint": 0.0, + "l_shoulder_roll_joint": 0.0, + "l_upper_arm_joint": 0.0, + "l_elbow_joint": 0.0, + "r_shoulder_pitch_joint": 0.0, + "r_shoulder_roll_joint": 0.0, + "r_upper_arm_joint": 0.0, + "r_elbow_joint": 0.0, + "l_hip_pitch_joint": 0.0, + "l_hip_roll_joint": 0.0, + "l_thigh_joint": 0.0, + "l_calf_joint": 0.0, + "l_ankle_pitch_joint": 0.0, + "l_ankle_roll_joint": 0.0, + "r_hip_pitch_joint": 0.0, + "r_hip_roll_joint": 0.0, + "r_thigh_joint": 0.0, + "r_calf_joint": 0.0, + "r_ankle_pitch_joint": 0.0, + "r_ankle_roll_joint": 0.0, + "head_yaw_joint": 0.0, + "head_pitch_joint": 0.0 + } + } + ] +} diff --git a/src/bitbots_robot/piplus_animations/animations/misc/walkready_arms_only.json b/src/bitbots_robot/piplus_animations/animations/misc/walkready_arms_only.json new file mode 100644 index 0000000000..7f9120c4f7 --- /dev/null +++ b/src/bitbots_robot/piplus_animations/animations/misc/walkready_arms_only.json @@ -0,0 +1,25 @@ +{ + "author": "", + "description": "", + "keyframes": [ + { + "duration": 2.0, + "goals": { + "l_elbow_joint": 0.0, + "l_shoulder_pitch_joint": 90.0, + "l_shoulder_roll_joint": 70.0, + "l_upper_arm_joint": 0.0, + "r_elbow_joint": 0.0, + "r_shoulder_pitch_joint": -90.0, + "r_shoulder_roll_joint": -70.0, + "r_upper_arm_joint": 0.0 + }, + "name": "start frame", + "pause": 0.0, + "torque": {} + } + ], + "last_edited": "2026-04-19 19:51:50.655755", + "name": "walkready_arms_only", + "version": "" +} \ No newline at end of file diff --git a/src/bitbots_lowlevel/bitbots_buttons/docs/_static/logo.png b/src/bitbots_robot/piplus_animations/docs/_static/logo.png similarity index 100% rename from src/bitbots_lowlevel/bitbots_buttons/docs/_static/logo.png rename to src/bitbots_robot/piplus_animations/docs/_static/logo.png diff --git a/src/bitbots_misc/bitbots_basler_camera/docs/conf.py b/src/bitbots_robot/piplus_animations/docs/conf.py similarity index 100% rename from src/bitbots_misc/bitbots_basler_camera/docs/conf.py rename to src/bitbots_robot/piplus_animations/docs/conf.py diff --git a/src/bitbots_lowlevel/bitbots_ros_control/docs/index.rst b/src/bitbots_robot/piplus_animations/docs/index.rst similarity index 100% rename from src/bitbots_lowlevel/bitbots_ros_control/docs/index.rst rename to src/bitbots_robot/piplus_animations/docs/index.rst diff --git a/src/bitbots_robot/piplus_animations/package.xml b/src/bitbots_robot/piplus_animations/package.xml new file mode 100644 index 0000000000..ac377fdb80 --- /dev/null +++ b/src/bitbots_robot/piplus_animations/package.xml @@ -0,0 +1,25 @@ + + + + piplus_animations + 1.0.3 + Animation files for the wolfgang robot + + Sebastian Stelter + Hamburg Bit-Bots + + MIT + + Sebastian Stelter + + + ament_cmake + bitbots_docs + + + + starts + + ament_cmake + + diff --git a/src/bitbots_robot/wolfgang_animations/rosdoc.yaml b/src/bitbots_robot/piplus_animations/rosdoc.yaml similarity index 100% rename from src/bitbots_robot/wolfgang_animations/rosdoc.yaml rename to src/bitbots_robot/piplus_animations/rosdoc.yaml diff --git a/src/bitbots_robot/piplus_description/CMakeLists.txt b/src/bitbots_robot/piplus_description/CMakeLists.txt new file mode 100644 index 0000000000..5cddd16386 --- /dev/null +++ b/src/bitbots_robot/piplus_description/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.5) +project(piplus_description) + +find_package(bitbots_docs REQUIRED) +find_package(ament_cmake REQUIRED) + +enable_bitbots_docs() + +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) +install(DIRECTORY urdf DESTINATION share/${PROJECT_NAME}) +install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/src/bitbots_robot/wolfgang_description/README.md b/src/bitbots_robot/piplus_description/README.md similarity index 100% rename from src/bitbots_robot/wolfgang_description/README.md rename to src/bitbots_robot/piplus_description/README.md diff --git a/src/bitbots_robot/wolfgang_description/config/wolfgang.rviz b/src/bitbots_robot/piplus_description/config/piplus.rviz similarity index 100% rename from src/bitbots_robot/wolfgang_description/config/wolfgang.rviz rename to src/bitbots_robot/piplus_description/config/piplus.rviz diff --git a/src/bitbots_lowlevel/bitbots_ros_control/docs/_static/logo.png b/src/bitbots_robot/piplus_description/docs/_static/logo.png similarity index 100% rename from src/bitbots_lowlevel/bitbots_ros_control/docs/_static/logo.png rename to src/bitbots_robot/piplus_description/docs/_static/logo.png diff --git a/src/bitbots_motion/bitbots_dynamic_kick/docs/conf.py b/src/bitbots_robot/piplus_description/docs/conf.py similarity index 100% rename from src/bitbots_motion/bitbots_dynamic_kick/docs/conf.py rename to src/bitbots_robot/piplus_description/docs/conf.py diff --git a/src/bitbots_robot/piplus_description/docs/index.rst b/src/bitbots_robot/piplus_description/docs/index.rst new file mode 100644 index 0000000000..d92372fd52 --- /dev/null +++ b/src/bitbots_robot/piplus_description/docs/index.rst @@ -0,0 +1,34 @@ +Welcome to |project|'s documentation! +================================================ + +Description +----------- +This robot model is exported from onshape by using onshape-to-robot. +See their `documentation `_ on how this works. + +We do not want to use the exact model as a collision model, since this would make the simulation run slowly. +Therefore, we first need to simplify the model by using the following. + +.. code-block:: bash + + roscd piplus_description + cd urdf + rosrun simplify_urdf_collision simplify.py robot.urdf robot.urdf -r -s + +The script will ask you which links should be excluded for the simplification. Normally, you don't need to exclude any links, since the important collision models (arms or feet) already have manually created collision models which are not shown in this list. + +|description| + +.. toctree:: + :maxdepth: 2 + + cppapi/library_root + pyapi/modules + + +Indices and tables +================== + +* :ref:`genindex` +* |modindex| +* :ref:`search` diff --git a/src/bitbots_robot/piplus_description/launch/rviz.launch b/src/bitbots_robot/piplus_description/launch/rviz.launch new file mode 100644 index 0000000000..191ab9624c --- /dev/null +++ b/src/bitbots_robot/piplus_description/launch/rviz.launch @@ -0,0 +1,6 @@ + + + + + diff --git a/src/bitbots_robot/piplus_description/launch/standalone.launch b/src/bitbots_robot/piplus_description/launch/standalone.launch new file mode 100644 index 0000000000..daa4ff2a62 --- /dev/null +++ b/src/bitbots_robot/piplus_description/launch/standalone.launch @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/bitbots_robot/piplus_description/package.xml b/src/bitbots_robot/piplus_description/package.xml new file mode 100644 index 0000000000..444559f861 --- /dev/null +++ b/src/bitbots_robot/piplus_description/package.xml @@ -0,0 +1,36 @@ + + + + piplus_description + 2.1.2 + URDF description of the wolfgang robot. + + Jasper Güldenstein + Hamburg Bit-Bots + + MIT + + Jasper Güldenstein + Hamburg Bit-Bots + + + ament_cmake + + bitbots_docs + bitbots_robot_description + bitbots_parameter_blackboard + bitbots_utils + joint_state_publisher_gui + sensor_msgs + tf2 + urdf + xacro + + + + stable + xacro + + ament_cmake + + diff --git a/src/bitbots_robot/wolfgang_description/rosdoc.yaml b/src/bitbots_robot/piplus_description/rosdoc.yaml similarity index 100% rename from src/bitbots_robot/wolfgang_description/rosdoc.yaml rename to src/bitbots_robot/piplus_description/rosdoc.yaml diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/base_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/base_link.STL new file mode 100644 index 0000000000..b70ec28f94 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/base_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/camera_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/camera_link.STL new file mode 100644 index 0000000000..c51a9bfffb Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/camera_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/head_pitch_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/head_pitch_link.STL new file mode 100644 index 0000000000..9db3da6dd5 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/head_pitch_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/head_yaw_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/head_yaw_link.STL new file mode 100644 index 0000000000..cbe30fde25 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/head_yaw_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/head_yaw_link_simplify.STL b/src/bitbots_robot/piplus_description/urdf/meshes/head_yaw_link_simplify.STL new file mode 100644 index 0000000000..c8a8e27125 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/head_yaw_link_simplify.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_pitch_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_pitch_link.STL new file mode 100644 index 0000000000..4ccf2c4067 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_pitch_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_roll_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_roll_link.STL new file mode 100644 index 0000000000..25c65daa18 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_roll_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_roll_link_simplify.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_roll_link_simplify.STL new file mode 100644 index 0000000000..25be7a942f Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_ankle_roll_link_simplify.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_calf_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_calf_link.STL new file mode 100644 index 0000000000..fdfa0e0de4 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_calf_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_calf_link_simplify.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_calf_link_simplify.STL new file mode 100644 index 0000000000..b00e5a0f25 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_calf_link_simplify.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_elbow_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_elbow_link.STL new file mode 100644 index 0000000000..39f549609a Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_elbow_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_hip_pitch_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_hip_pitch_link.STL new file mode 100644 index 0000000000..c33ae23cf9 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_hip_pitch_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_hip_roll_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_hip_roll_link.STL new file mode 100644 index 0000000000..7eecafd03d Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_hip_roll_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_pitch_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_pitch_link.STL new file mode 100644 index 0000000000..3fa832f00d Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_pitch_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_pitch_link_simplify.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_pitch_link_simplify.STL new file mode 100644 index 0000000000..5bc87812f9 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_pitch_link_simplify.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_roll_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_roll_link.STL new file mode 100644 index 0000000000..b4e52073b3 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_shoulder_roll_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_thigh_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_thigh_link.STL new file mode 100644 index 0000000000..f2a602cfa3 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_thigh_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_upper_arm_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_upper_arm_link.STL new file mode 100644 index 0000000000..0ba10de457 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_upper_arm_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/l_wrist_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/l_wrist_link.STL new file mode 100644 index 0000000000..02d77247df Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/l_wrist_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_pitch_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_pitch_link.STL new file mode 100644 index 0000000000..2de876243d Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_pitch_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_roll_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_roll_link.STL new file mode 100644 index 0000000000..9c75adda1e Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_roll_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_roll_link_simplify.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_roll_link_simplify.STL new file mode 100644 index 0000000000..c8d986ef05 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_ankle_roll_link_simplify.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_calf_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_calf_link.STL new file mode 100644 index 0000000000..b4e8159d71 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_calf_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_calf_link_simplify.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_calf_link_simplify.STL new file mode 100644 index 0000000000..176d9403b7 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_calf_link_simplify.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_elbow_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_elbow_link.STL new file mode 100644 index 0000000000..351cf69bb4 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_elbow_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_hip_pitch_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_hip_pitch_link.STL new file mode 100644 index 0000000000..17a8a0e889 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_hip_pitch_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_hip_roll_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_hip_roll_link.STL new file mode 100644 index 0000000000..88f1efe204 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_hip_roll_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_pitch_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_pitch_link.STL new file mode 100644 index 0000000000..47efc0dd26 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_pitch_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_pitch_link_simplify.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_pitch_link_simplify.STL new file mode 100644 index 0000000000..51a3b3dc66 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_pitch_link_simplify.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_roll_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_roll_link.STL new file mode 100644 index 0000000000..ed23ed69e0 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_shoulder_roll_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_thigh_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_thigh_link.STL new file mode 100644 index 0000000000..5033ee4b7d Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_thigh_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_upper_arm_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_upper_arm_link.STL new file mode 100644 index 0000000000..683d01ce50 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_upper_arm_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/r_wrist_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/r_wrist_link.STL new file mode 100644 index 0000000000..dcad18721b Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/r_wrist_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/torso_link.STL b/src/bitbots_robot/piplus_description/urdf/meshes/torso_link.STL new file mode 100644 index 0000000000..0fe795844e Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/torso_link.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/meshes/torso_link_simplify.STL b/src/bitbots_robot/piplus_description/urdf/meshes/torso_link_simplify.STL new file mode 100644 index 0000000000..471eff6999 Binary files /dev/null and b/src/bitbots_robot/piplus_description/urdf/meshes/torso_link_simplify.STL differ diff --git a/src/bitbots_robot/piplus_description/urdf/pi_plus_22dof.urdf.xacro b/src/bitbots_robot/piplus_description/urdf/pi_plus_22dof.urdf.xacro new file mode 100644 index 0000000000..e571f0147e --- /dev/null +++ b/src/bitbots_robot/piplus_description/urdf/pi_plus_22dof.urdf.xacro @@ -0,0 +1,863 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/bitbots_robot/wolfgang_animations/CMakeLists.txt b/src/bitbots_robot/wolfgang_animations/CMakeLists.txt deleted file mode 100644 index 79500c36a7..0000000000 --- a/src/bitbots_robot/wolfgang_animations/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(wolfgang_animations) - -find_package(ament_cmake REQUIRED) -find_package(bitbots_docs REQUIRED) - -enable_bitbots_docs() - -install(DIRECTORY animations DESTINATION share/${PROJECT_NAME}) - -ament_package() diff --git a/src/bitbots_robot/wolfgang_animations/animations/falling/falling_back.json b/src/bitbots_robot/wolfgang_animations/animations/falling/falling_back.json deleted file mode 100644 index c4be749472..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/falling/falling_back.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "Tanja", - "description": "", - "keyframes": [ - { - "duration": 0.01, - "goals": { - "HeadPan": 0.0, - "HeadTilt": -45.0, - "LAnklePitch": -29.0, - "LAnkleRoll": 0.0, - "LElbow": 47.0, - "LHipPitch": 51.0, - "LHipRoll": 0.0, - "LHipYaw": 0.0, - "LKnee": 64.0, - "LShoulderPitch": 1.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 28.0, - "RAnkleRoll": -4.0, - "RElbow": -45.0, - "RHipPitch": -50.0, - "RHipRoll": -1.0, - "RHipYaw": 1.0, - "RKnee": -61.0, - "RShoulderPitch": 0.0, - "RShoulderRoll": 0.0 - }, - "name": "keyframe_1", - "pause": 0.2 - } - ], - "last_edited": "2018-06-08 14:35:29.436275", - "name": "falling_back", - "version": "1.0" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/falling/falling_front.json b/src/bitbots_robot/wolfgang_animations/animations/falling/falling_front.json deleted file mode 100644 index 1c1d517643..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/falling/falling_front.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "Unknown", - "description": "An animation that mitigates the damage of a fall on the front, by pulling the arms in.", - "keyframes": [ - { - "duration": 0.01, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 45.0, - "LAnklePitch": -36.0, - "LAnkleRoll": 4.0, - "LElbow": 45.0, - "LHipPitch": -11.0, - "LHipRoll": 4.0, - "LHipYaw": 6.0, - "LKnee": 13.0, - "LShoulderPitch": 90.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 36.0, - "RAnkleRoll": -4.0, - "RElbow": -45.0, - "RHipPitch": 11.0, - "RHipRoll": -4.0, - "RHipYaw": 6.0, - "RKnee": -13.0, - "RShoulderPitch": -90.0, - "RShoulderRoll": 0.0 - }, - "name": "frame0", - "pause": 0.2 - } - ], - "last_edited": "2019-05-02 10:20:24.230135", - "name": "falling_front", - "version": "0" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/falling/falling_left.json b/src/bitbots_robot/wolfgang_animations/animations/falling/falling_left.json deleted file mode 100644 index c6aa3292db..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/falling/falling_left.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": "Unknown", - "description": "An animation that mitigates the damage of a fall on the left side.", - "keyframes": [ - { - "duration": 0.05, - "goals": { - "HeadPan": 90.0, - "HeadTilt": 0.0, - "LAnklePitch": -26.0, - "LAnkleRoll": 4.0, - "LHipPitch": 27.0, - "LHipRoll": 4.0, - "LHipYaw": -1.0, - "LKnee": 58.0, - "RAnklePitch": 26.0, - "RAnkleRoll": -4.0, - "RHipPitch": -27.0, - "RHipRoll": -4.0, - "RHipYaw": 1.0, - "RKnee": -58.0 - }, - "name": "arm side turn", - "pause": 0.2 - } - ], - "last_edited": "2019-10-04 16:50:40.114590", - "name": "None yet", - "version": 0 -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/falling/falling_right.json b/src/bitbots_robot/wolfgang_animations/animations/falling/falling_right.json deleted file mode 100644 index 517586212d..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/falling/falling_right.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": "Unknown", - "description": "An animation that mitigates the damage of a fall on the right side.", - "keyframes": [ - { - "duration": 0.05, - "goals": { - "HeadPan": -90.0, - "HeadTilt": 0.0, - "LAnklePitch": -26.0, - "LAnkleRoll": 4.0, - "LHipPitch": 27.0, - "LHipRoll": 4.0, - "LHipYaw": -1.0, - "LKnee": 58.0, - "RAnklePitch": 26.0, - "RAnkleRoll": -4.0, - "RHipPitch": -27.0, - "RHipRoll": -4.0, - "RHipYaw": 1.0, - "RKnee": -58.0 - }, - "name": "generated frame", - "pause": 0.2 - } - ], - "last_edited": "2019-10-04 16:50:40.114590", - "name": "None yet", - "version": 0 -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_center.json b/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_center.json deleted file mode 100644 index c36ce813ab..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_center.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "author": "Unknown", - "description": "Results in the goalie splitting its legs, so it blocks the goal. DO NOT RUN THIS ON THE ACTUAL ROBOT (sim only).", - "keyframes": [ - { - "duration": 0.1, - "goals": { - "HeadPan" : 0.0, - "HeadTilt" : 0.0, - "LHipYaw" : -0.0001433543230624459, - "LHipRoll" : 90, - "LHipPitch" : 16.921277208612718, - "LKnee" : 63.77975049759934, - "LAnklePitch" : -31.858161403848833, - "LAnkleRoll" : 5.844267603866625, - "RHipYaw" : 0.00030892597992210064, - "RHipRoll" : -90, - "RHipPitch" : -16.84536738587815, - "RKnee" : -63.811765865506786, - "RAnklePitch" : 31.966018266021766, - "RAnkleRoll" : -6.850881009954105, - - "LShoulderPitch" : -179, - "LShoulderRoll" : 0, - "LElbow" : -90, - "RShoulderPitch" : 179, - "RShoulderRoll" : 0.0, - "RElbow" : 90 - }, - "name": "generated frame", - "pause": 0.0 - } - ], - "last_edited": "2021-05-06 10:29:41.094173", - "name": "Goalie falling center", - "version": 0 -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_left.json b/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_left.json deleted file mode 100644 index d39c04c99b..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_left.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "Unknown", - "description": "Results in the goalie falling to the left with an extended left arm. DO NOT RUN THIS ON THE ACTUAL ROBOT (sim only).", - "keyframes": [ - { - "duration": 0.1, - "goals": { - "HeadPan" : 0.0, - "HeadTilt" : 0.0, - "LHipYaw" : -0.0006957411352730921, - "LHipRoll" : 2.4179578166451106, - "LHipPitch" : 30.62366580150313, - "LKnee" : 120.27586447607317, - "LAnklePitch" : -32.65200910867831, - "LAnkleRoll" : 2.6736751638781087, - "LShoulderPitch" : -179, - "LShoulderRoll" : 0, - "LElbow" : -90, - "RHipYaw" : 0.00077231963918347, - "RHipRoll" : -5.162227874600987, - "RHipPitch" : 6.875494, - "RKnee" : 0.0, - "RAnklePitch" : -6.875494, - "RAnkleRoll" : -6.850795653242464, - "RShoulderPitch" : 179, - "RShoulderRoll" : 0.0, - "RElbow" : 90 - }, - "name": "generated frame", - "pause": 0.0 - } - ], - "last_edited": "2021-05-06 10:29:41.094173", - "name": "Goalie Falling Left", - "version": 0 -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_right.json b/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_right.json deleted file mode 100644 index 6206ae282e..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_falling_right.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "author": "Unknown", - "description": "Results in the goalie falling to the right with an extended right arm. DO NOT RUN THIS ON THE ACTUAL ROBOT (sim only).", - "keyframes": [ - { - "duration": 0.1, - "goals": { - "HeadPan" : 0.0, - "HeadTilt" : 0.0, - "LHipYaw" : -0.0006957411352730921, - "LHipRoll" : 2.4179578166451106, - "LHipPitch" : 6.875494, - "LKnee" : 0.0, - "LAnklePitch" : 6.875494, - "LAnkleRoll" : 2.6736751638781087, - "LShoulderPitch" : -179, - "LShoulderRoll" : 0.0, - "LElbow" : -90, - "RHipYaw" : 0.00077231963918347, - "RHipRoll" : -5.162227874600987, - "RHipPitch" : -30.848050774485884, - "RKnee" : -120.81746642070242, - "RAnklePitch" : 51.9689807724419, - "RAnkleRoll" : -6.850795653242464, - "RShoulderPitch" : 179, - "RShoulderRoll" : 0.0, - "RElbow" : 90 - }, - "name": "generated frame", - "pause": 0.0 - } - ], - "last_edited": "2021-05-06 10:29:41.094173", - "name": "Goalie Falling Right", - "version": 0 -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_prepare_arms.json b/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_prepare_arms.json deleted file mode 100644 index 00739a5a6f..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/goalie/goalie_prepare_arms.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "author": "Unknown", - "description": "Puts up the arms of the robot so it can throw itself on the ground to block the goal faster. (For simulation penalty shootouts)", - "keyframes": [ - { - "duration": 1.0, - "goals": { - "HeadPan" : 0.0, - "HeadTilt" : 0.0, - "LHipYaw" : -0.0001433543230624459, - "LHipRoll" : 5.844351607961048, - "LHipPitch" : 16.921277208612718, - "LKnee" : 63.77975049759934, - "LAnklePitch" : -31.858161403848833, - "LAnkleRoll" : 5.844267603866625, - "RHipYaw" : 0.00030892597992210064, - "RHipRoll" : -5.56323110835991, - "RHipPitch" : -16.84536738587815, - "RKnee" : -63.811765865506786, - "RAnklePitch" : 31.966018266021766, - "RAnkleRoll" : -6.850881009954105, - - "LShoulderPitch" : -179, - "LShoulderRoll" : 0, - "LElbow" : -90, - "RShoulderPitch" : 179, - "RShoulderRoll" : 0.0, - "RElbow" : 90 - }, - "name": "generated frame", - "pause": 0.0 - } - ], - "last_edited": "2021-05-06 10:29:41.094173", - "name": "Goalie Prepare Arms", - "version": 0 -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/kick/kick_left.json b/src/bitbots_robot/wolfgang_animations/animations/kick/kick_left.json deleted file mode 100644 index d07e14e2b7..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/kick/kick_left.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "author": "Lea und Flo", - "description": "Kicks a ball with the left foot", - "keyframes": [ - { - "duration": 1.0, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": -35.44, - "LAnkleRoll": 7.12, - "LHipPitch": 34.54, - "LHipRoll": 5.19, - "LHipYaw": -1.06, - "LKnee": 75.94, - "RAnklePitch": 35.86, - "RAnkleRoll": -5.36, - "RHipPitch": -36.14, - "RHipRoll": -6.42, - "RHipYaw": 1.23, - "RKnee": -76.77 - }, - "name": "start frame", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.35, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": -25.5, - "LAnkleRoll": 11.95, - "LHipPitch": 25.22, - "LHipRoll": 1.49, - "LHipYaw": -1.14, - "LKnee": 56.51, - "RAnklePitch": 35.86, - "RAnkleRoll": -5.36, - "RHipPitch": -36.14, - "RHipRoll": -6.42, - "RHipYaw": 1.23, - "RKnee": -76.77 - }, - "name": "kick_ground", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.2, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": -26.56, - "LAnkleRoll": 5.27, - "LHipPitch": 39.29, - "LHipRoll": -1.93, - "LHipYaw": -0.79, - "LKnee": 107.31, - "RAnklePitch": 35.86, - "RAnkleRoll": -5.36, - "RHipPitch": -36.14, - "RHipRoll": -6.42, - "RHipYaw": 1.23, - "RKnee": -76.77 - }, - "name": "kick_ground_copy_1", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.2, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": 18.28, - "LAnkleRoll": 5.27, - "LHipPitch": 76.03, - "LHipRoll": -1.93, - "LHipYaw": -0.79, - "LKnee": 99.58, - "RAnklePitch": 35.86, - "RAnkleRoll": -5.36, - "RHipPitch": -36.14, - "RHipRoll": -6.42, - "RHipYaw": 1.23, - "RKnee": -76.77 - }, - "name": "kick_ground_copy_2", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.5, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": -35.44, - "LAnkleRoll": 7.12, - "LHipPitch": 34.54, - "LHipRoll": 5.19, - "LHipYaw": -1.06, - "LKnee": 75.94, - "RAnklePitch": 35.86, - "RAnkleRoll": -5.36, - "RHipPitch": -36.14, - "RHipRoll": -6.42, - "RHipYaw": 1.23, - "RKnee": -76.77 - }, - "name": "start frame_copy_1", - "pause": 0.0, - "torque": {} - } - ], - "last_edited": "2024-04-02 18:48:13.661163", - "name": "kick_left", - "version": "" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/kick/kick_right.json b/src/bitbots_robot/wolfgang_animations/animations/kick/kick_right.json deleted file mode 100644 index 3b9f95ace3..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/kick/kick_right.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "author": "Timon und Pär", - "description": "Kicks with the right foot.", - "keyframes": [ - { - "duration": 1.0, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": -35.86, - "LAnkleRoll": -5.01, - "LHipPitch": 36.14, - "LHipRoll": 6.42, - "LHipYaw": -1.23, - "LKnee": 76.77, - "RAnklePitch": 25.5, - "RAnkleRoll": -7.29, - "RHipPitch": -25.22, - "RHipRoll": -1.49, - "RHipYaw": 1.14, - "RKnee": -56.51 - }, - "name": "lift_foot", - "pause": 0.5, - "torque": {} - }, - { - "duration": 0.5, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": -35.86, - "LAnkleRoll": -11.95, - "LHipPitch": 36.14, - "LHipRoll": 6.42, - "LHipYaw": -1.23, - "LKnee": 76.77, - "RAnklePitch": 35.44, - "RAnkleRoll": -14.06, - "RHipPitch": -39.29, - "RHipRoll": -6.5, - "RHipYaw": 0.79, - "RKnee": -141.86 - }, - "name": "lift_foot_2", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.05, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": -35.86, - "LAnkleRoll": -9.23, - "LHipPitch": 36.14, - "LHipRoll": 6.42, - "LHipYaw": -1.23, - "LKnee": 76.77, - "RAnklePitch": 18.47, - "RAnkleRoll": -2.9, - "RHipPitch": -81.47, - "RHipRoll": -1.58, - "RHipYaw": -1.93, - "RKnee": -88.07 - }, - "name": "kick_end", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.5, - "goals": { - "HeadPan": -0.09, - "HeadTilt": -0.09, - "LAnklePitch": -34.72, - "LAnkleRoll": 4.22, - "LHipPitch": 31.39, - "LHipRoll": 5.19, - "LHipYaw": -0.88, - "LKnee": 72.02, - "RAnklePitch": 29.720000000000002, - "RAnkleRoll": -12.92, - "RHipPitch": -31.990000000000002, - "RHipRoll": -8.53, - "RHipYaw": 1.32, - "RKnee": -69.08 - }, - "name": "end", - "pause": 0.0, - "torque": {} - } - ], - "last_edited": "2024-07-19 16:26:33.206490", - "name": "kick_right", - "version": "" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/misc/cheering.json b/src/bitbots_robot/wolfgang_animations/animations/misc/cheering.json deleted file mode 100644 index 7379b48d8a..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/misc/cheering.json +++ /dev/null @@ -1,171 +0,0 @@ -{ - "author": "Jan-Niklas Feldhusen", - "description": "Cheers with the arms up.", - "keyframes": [ - { - "duration": 2.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LAnklePitch": -27.86, - "LAnkleRoll": 5.84, - "LElbow": 2.0, - "LHipPitch": 25.11, - "LHipRoll": 5.84, - "LHipYaw": -0.0, - "LKnee": 63.78, - "LShoulderPitch": -103.0, - "LShoulderRoll": -28.0, - "RAnklePitch": 27.97, - "RAnkleRoll": -6.85, - "RElbow": 4.0, - "RHipPitch": -25.11, - "RHipRoll": -5.56, - "RHipYaw": 0.0, - "RKnee": -63.81, - "RShoulderPitch": 99.0, - "RShoulderRoll": 46.0 - }, - "name": "arms up", - "pause": 0.5 - }, - { - "duration": 1.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LAnklePitch": -27.86, - "LAnkleRoll": 5.84, - "LElbow": -66.0, - "LHipPitch": 23.11, - "LHipRoll": 5.84, - "LHipYaw": -0.0, - "LKnee": 63.78, - "LShoulderPitch": -170.0, - "LShoulderRoll": -18.0, - "RAnklePitch": 27.97, - "RAnkleRoll": -6.85, - "RElbow": 73.0, - "RHipPitch": -23.11, - "RHipRoll": -5.56, - "RHipYaw": 0.0, - "RKnee": -63.81, - "RShoulderPitch": 174.0, - "RShoulderRoll": 14.0 - }, - "name": "arms over head", - "pause": 0.5 - }, - { - "duration": 1.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LAnklePitch": -27.86, - "LAnkleRoll": 5.84, - "LElbow": -58.00000000000001, - "LHipPitch": 23.11, - "LHipRoll": 5.84, - "LHipYaw": -0.0, - "LKnee": 63.78, - "LShoulderPitch": -166.0, - "LShoulderRoll": -37.0, - "RAnklePitch": 27.97, - "RAnkleRoll": -6.85, - "RElbow": 74.0, - "RHipPitch": -23.11, - "RHipRoll": -5.56, - "RHipYaw": 0.0, - "RKnee": -63.81, - "RShoulderPitch": 175.0, - "RShoulderRoll": 0.0 - }, - "name": "arms up left", - "pause": 0.5 - }, - { - "duration": 1.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LAnklePitch": -27.86, - "LAnkleRoll": 5.84, - "LElbow": -54.0, - "LHipPitch": 23.11, - "LHipRoll": 5.84, - "LHipYaw": -0.0, - "LKnee": 63.78, - "LShoulderPitch": -165.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 27.97, - "RAnkleRoll": -6.85, - "RElbow": 71.0, - "RHipPitch": -23.11, - "RHipRoll": -5.56, - "RHipYaw": 0.0, - "RKnee": -63.81, - "RShoulderPitch": 174.0, - "RShoulderRoll": 23.0 - }, - "name": "arms up middle", - "pause": 0.5 - }, - { - "duration": 2.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LAnklePitch": -27.86, - "LAnkleRoll": 5.84, - "LElbow": -54.0, - "LHipPitch": 25.11, - "LHipRoll": 5.84, - "LHipYaw": -0.0, - "LKnee": 63.78, - "LShoulderPitch": -165.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 27.97, - "RAnkleRoll": -6.85, - "RElbow": 71.0, - "RHipPitch": -25.11, - "RHipRoll": -5.56, - "RHipYaw": 0.0, - "RKnee": -63.81, - "RShoulderPitch": 174.0, - "RShoulderRoll": 23.0 - }, - "name": "arms up right", - "pause": 0.5 - }, - { - "duration": 2.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LAnklePitch": -31.860000000000003, - "LAnkleRoll": 5.84, - "LElbow": 35.86, - "LHipPitch": 27.11, - "LHipRoll": 5.84, - "LHipYaw": -0.0, - "LKnee": 63.78, - "LShoulderPitch": 75.28, - "LShoulderRoll": -0.02, - "RAnklePitch": 31.970000000000002, - "RAnkleRoll": -6.8500000000000005, - "RElbow": -36.1, - "RHipPitch": -27.11, - "RHipRoll": -5.56, - "RHipYaw": 0.0, - "RKnee": -63.81, - "RShoulderPitch": -75.59, - "RShoulderRoll": 0.02 - }, - "name": "walkready", - "pause": 0.5 - } - ], - "last_edited": "2024-03-13 21:02:47.391643", - "name": "cheering", - "version": "0" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/misc/init.json b/src/bitbots_robot/wolfgang_animations/animations/misc/init.json deleted file mode 100644 index c2c9702b03..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/misc/init.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "default_interpolator": "CatmullRomInterpolator", - "name": "init", - "keyframes": [ - { - "duration": 1.0, - "pause": 0.0, - "goals": { - "LShoulderPitch": 0.0, - "LShoulderRoll": 0.0, - "RShoulderRoll": 0.0, - "HeadTilt": 0.0, - "LKnee": 0.0, - "RHipYaw": 0.0, - "LAnklePitch": 0.0, - "RKnee": 0.0, - "RAnkleRoll": 0.0, - "RAnklePitch": 0.0, - "LHipPitch": 0.0, - "LHipYaw": 0.0, - "LHipRoll": 0.0, - "RHipRoll": 0.0, - "LAnkleRoll": 0.0, - "LElbow": 0.0, - "RElbow": 0.0, - "RHipPitch": 0.0, - "HeadPan": 0.0, - "RShoulderPitch": 0.0 - } - } - ] -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/misc/init_sim.json b/src/bitbots_robot/wolfgang_animations/animations/misc/init_sim.json deleted file mode 100644 index 5173e07bb7..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/misc/init_sim.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "author": "jasper", - "description": "Initializes the robot in a standing position", - "keyframes": [ - { - "duration": 1.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LHipYaw": 0.0, - "LHipRoll": 0.0, - "LHipPitch": -6.875494, - "LKnee": 0.0, - "LAnklePitch": 6.875494, - "LAnkleRoll": 0.0, - "LShoulderPitch": 0.0, - "LShoulderRoll": 0.0, - "LElbow": 0.0, - "RHipYaw": 0.0, - "RHipRoll": 0.0, - "RHipPitch": 6.875494, - "RKnee": 0.0, - "RAnklePitch": -6.875494, - "RAnkleRoll": 0.0, - "RShoulderPitch": 0.0, - "RShoulderRoll": 0.0, - "RElbow": 0.0 - }, - "name": "generated frame", - "pause": 0.5 - } - ], - "name": "init_sim", - "version": 0 -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/misc/startup.json b/src/bitbots_robot/wolfgang_animations/animations/misc/startup.json deleted file mode 100644 index dd33f83f0d..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/misc/startup.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "default_interpolator": "CatmullRomInterpolator", - "name": "startup", - "keyframes": [ - { - "duration": 1.0, - "pause": 0.0, - "goals": { - "LShoulderPitch": 0.0, - "LShoulderRoll": 0.0, - "RShoulderRoll": 0.0, - "HeadTilt": 0.0, - "LKnee": 20, - "RHipYaw": 0.0, - "LAnklePitch": -10.0, - "RKnee": -20, - "RAnkleRoll": 0.0, - "RAnklePitch": 10.0, - "LHipPitch": 0.0, - "LHipYaw": 0.0, - "LHipRoll": 0.0, - "RHipRoll": 0.0, - "LAnkleRoll": 0.0, - "LElbow": 0.0, - "RElbow": 0.0, - "RHipPitch": 0.0, - "HeadPan": 0.0, - "RShoulderPitch": 0.0 - } - } - ] -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/misc/verbeugen.json b/src/bitbots_robot/wolfgang_animations/animations/misc/verbeugen.json deleted file mode 100644 index cf4597d060..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/misc/verbeugen.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "author": "Timon", - "description": "Verbeugen", - "keyframes": [ - { - "duration": 1.0, - "goals": { - "HeadPan": 0, - "HeadTilt": 0, - "LAnklePitch": -29, - "LAnkleRoll": 0, - "LElbow": 47, - "LHipPitch": 51, - "LHipRoll": 0, - "LHipYaw": 0, - "LKnee": 64, - "LShoulderPitch": 1, - "LShoulderRoll": 0, - "RAnklePitch": 28, - "RAnkleRoll": -4, - "RElbow": -45, - "RHipPitch": -50, - "RHipRoll": -1, - "RHipYaw": 1, - "RKnee": -61, - "RShoulderPitch": 0, - "RShoulderRoll": 0 - }, - "name": "new frame", - "pause": 0.5 - }, - { - "duration": 1.0, - "goals": { - "HeadPan": 0, - "HeadTilt": 0, - "LAnklePitch": -29, - "LAnkleRoll": 0, - "LElbow": -100, - "LHipPitch": 51, - "LHipRoll": 0, - "LHipYaw": 0, - "LKnee": 64, - "LShoulderPitch": 16, - "LShoulderRoll": -33, - "RAnklePitch": 28, - "RAnkleRoll": -4, - "RElbow": -39, - "RHipPitch": -50, - "RHipRoll": -1, - "RHipYaw": 1, - "RKnee": -61, - "RShoulderPitch": -87, - "RShoulderRoll": 90 - }, - "name": "new framed", - "pause": 0.5 - }, - { - "duration": 2.0, - "goals": { - "HeadPan": 0, - "HeadTilt": 0, - "LAnklePitch": -29, - "LAnkleRoll": 0, - "LElbow": -100, - "LHipPitch": 87, - "LHipRoll": 0, - "LHipYaw": 0, - "LKnee": 76, - "LShoulderPitch": 16, - "LShoulderRoll": -33, - "RAnklePitch": 28, - "RAnkleRoll": -4, - "RElbow": -39, - "RHipPitch": -85, - "RHipRoll": -1, - "RHipYaw": 1, - "RKnee": -74, - "RShoulderPitch": -87, - "RShoulderRoll": 90 - }, - "name": "new framedd", - "pause": 0.5 - }, - { - "duration": 2.0, - "goals": { - "HeadPan": 0, - "HeadTilt": 0, - "LAnklePitch": -29, - "LAnkleRoll": 0, - "LElbow": 47, - "LHipPitch": 51, - "LHipRoll": 0, - "LHipYaw": 0, - "LKnee": 64, - "LShoulderPitch": 1, - "LShoulderRoll": 0, - "RAnklePitch": 28, - "RAnkleRoll": -4, - "RElbow": -45, - "RHipPitch": -50, - "RHipRoll": -1, - "RHipYaw": 1, - "RKnee": -61, - "RShoulderPitch": 0, - "RShoulderRoll": 0 - }, - "name": "new framed0", - "pause": 0.5 - } - ], - "last_edited": "2018-09-22 16:10:37.158384", - "name": "verbeugen", - "version": "0" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/standup/stand_up_back.json b/src/bitbots_robot/wolfgang_animations/animations/standup/stand_up_back.json deleted file mode 100644 index ff710056de..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/standup/stand_up_back.json +++ /dev/null @@ -1,121 +0,0 @@ -{ - "author": "Flo", - "description": "", - "keyframes": [ - { - "duration": 1.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": -45.0, - "LAnklePitch": -81.47, - "LAnkleRoll": -2.0, - "LElbow": 27.0, - "LHipPitch": -38.85, - "LHipRoll": -2.2, - "LHipYaw": 0.0, - "LKnee": 124.0, - "LShoulderPitch": 170.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 78.7, - "RAnkleRoll": 2.0, - "RElbow": -27.0, - "RHipPitch": 36.84, - "RHipRoll": -2.2, - "RHipYaw": 0.0, - "RKnee": -124.0, - "RShoulderPitch": -170.0, - "RShoulderRoll": -0.26 - }, - "name": "bridge", - "pause": 0.5, - "torque": {} - }, - { - "duration": 0.9, - "goals": { - "HeadPan": 0.0, - "HeadTilt": -45.0, - "LAnklePitch": -81.47, - "LAnkleRoll": -2.0, - "LElbow": -16.17, - "LHipPitch": -38.85, - "LHipRoll": -2.2, - "LHipYaw": 0.0, - "LKnee": 124.0, - "LShoulderPitch": 137.0, - "LShoulderRoll": -1.67, - "RAnklePitch": 78.7, - "RAnkleRoll": 2.0, - "RElbow": 13.37, - "RHipPitch": 36.84, - "RHipRoll": -2.2, - "RHipYaw": 0.0, - "RKnee": -124.0, - "RShoulderPitch": -139.57, - "RShoulderRoll": 0.79 - }, - "name": "bridge_shift", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.2, - "goals": { - "HeadPan": 0.0, - "HeadTilt": -45.0, - "LAnklePitch": -80.0, - "LAnkleRoll": -2.0, - "LElbow": -90.0, - "LHipPitch": 51.0, - "LHipRoll": -2.2, - "LHipYaw": 0.0, - "LKnee": 143.0, - "LShoulderPitch": 54.56, - "LShoulderRoll": 0.0, - "RAnklePitch": 80.0, - "RAnkleRoll": 2.0, - "RElbow": 90.0, - "RHipPitch": -51.0, - "RHipRoll": 2.2, - "RHipYaw": 0.0, - "RKnee": -143.0, - "RShoulderPitch": -54.84, - "RShoulderRoll": -0.0 - }, - "name": "push", - "pause": 0.2, - "torque": {} - }, - { - "duration": 0.5, - "goals": { - "HeadPan": 0.0, - "HeadTilt": -45.0, - "LAnklePitch": -80.0, - "LAnkleRoll": -2.0, - "LElbow": -90.0, - "LHipPitch": 51.0, - "LHipRoll": -2.2, - "LHipYaw": 0.0, - "LKnee": 144.0, - "LShoulderPitch": -9.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 80.0, - "RAnkleRoll": 2.0, - "RElbow": 90.0, - "RHipPitch": -51.0, - "RHipRoll": 2.2, - "RHipYaw": 0.0, - "RKnee": -144.0, - "RShoulderPitch": 9.0, - "RShoulderRoll": 0.0 - }, - "name": "squat", - "pause": 0.0, - "torque": {} - } - ], - "last_edited": "2024-07-17 11:41:14.004363", - "name": "stand_up_back", - "version": "1.0" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/standup/stand_up_front.json b/src/bitbots_robot/wolfgang_animations/animations/standup/stand_up_front.json deleted file mode 100644 index 5d0776e4d3..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/standup/stand_up_front.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "author": "Unknown", - "description": "Standup animation from the front", - "keyframes": [ - { - "duration": 0.3, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 45.0, - "LAnklePitch": -80.0, - "LAnkleRoll": 4.0, - "LElbow": 45.0, - "LHipPitch": 115.0, - "LHipRoll": 0.0, - "LHipYaw": 0.0, - "LKnee": 160.0, - "LShoulderPitch": -45.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 80.0, - "RAnkleRoll": -4.0, - "RElbow": -45.0, - "RHipPitch": -115.0, - "RHipRoll": 0.0, - "RHipYaw": 0.0, - "RKnee": -160.0, - "RShoulderPitch": 45.0, - "RShoulderRoll": 0.0 - }, - "name": "arms_down", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.3, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 45.0, - "LAnklePitch": -77.0, - "LAnkleRoll": 4.0, - "LElbow": -70.0, - "LHipPitch": 112.0, - "LHipRoll": 4.0, - "LHipYaw": 0.0, - "LKnee": 154.0, - "LShoulderPitch": -50.0, - "LShoulderRoll": -7.9, - "RAnklePitch": 77.0, - "RAnkleRoll": -4.0, - "RElbow": 70.0, - "RHipPitch": -112.0, - "RHipRoll": -4.0, - "RHipYaw": 0.0, - "RKnee": -154.0, - "RShoulderPitch": 50.0, - "RShoulderRoll": 7.9 - }, - "name": "extend_arms", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.5, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LAnklePitch": -80.0, - "LAnkleRoll": 4.0, - "LElbow": -70.0, - "LHipPitch": 70.0, - "LHipRoll": 4.0, - "LHipYaw": 0.0, - "LKnee": 155.0, - "LShoulderPitch": 10.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 80.0, - "RAnkleRoll": -4.0, - "RElbow": 70.0, - "RHipPitch": -70.0, - "RHipRoll": -4.0, - "RHipYaw": 0.0, - "RKnee": -155.0, - "RShoulderPitch": -10.0, - "RShoulderRoll": 0.0 - }, - "name": "goto_squat", - "pause": 0.0, - "torque": {} - } - ], - "last_edited": "2024-07-01 16:55:15.339098", - "name": "Standup Front", - "version": "0" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/standup/turning_front_left.json b/src/bitbots_robot/wolfgang_animations/animations/standup/turning_front_left.json deleted file mode 100755 index e9d21c7edc..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/standup/turning_front_left.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "author": "Unknown", - "description": "Turns the robot to the front, when it lies on its left side.", - "keyframes": [ - { - "duration": 0.5, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 45.0, - "LAnklePitch": -26.0, - "LAnkleRoll": 4.0, - "LElbow": 24.27, - "LHipPitch": 23.13, - "LHipRoll": 4.0, - "LHipYaw": 20.22, - "LKnee": 58.00000000000001, - "LShoulderPitch": 54.78, - "LShoulderRoll": -32.43, - "RAnklePitch": 26.0, - "RAnkleRoll": -4.0, - "RElbow": -43.15, - "RHipPitch": -27.0, - "RHipRoll": -4.0, - "RHipYaw": 1.0, - "RKnee": -58.00000000000001 - }, - "name": "push arm", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.5, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 45.0, - "LAnklePitch": -26.0, - "LAnkleRoll": 4.0, - "LElbow": 45.0, - "LHipPitch": 27.13, - "LHipRoll": 4.0, - "LHipYaw": 20.22, - "LKnee": 58.00000000000001, - "LShoulderPitch": 90.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 26.0, - "RAnkleRoll": -4.0, - "RElbow": -45.0, - "RHipPitch": -27.0, - "RHipRoll": -4.0, - "RHipYaw": 1.0, - "RKnee": -58.00000000000001, - "RShoulderPitch": -90.0, - "RShoulderRoll": 0.0 - }, - "name": "generated frame 1", - "pause": 0.0, - "torque": {} - } - ], - "last_edited": "2024-07-05 13:42:00.308632", - "name": "turning_front_left", - "version": "0" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/standup/turning_front_right.json b/src/bitbots_robot/wolfgang_animations/animations/standup/turning_front_right.json deleted file mode 100644 index 9227e85231..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/standup/turning_front_right.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "author": "Unknown", - "description": "Turns the robot to the front, when it lies on its right side.", - "keyframes": [ - { - "duration": 0.5, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 45.0, - "LAnklePitch": -26.0, - "LAnkleRoll": 4.0, - "LHipPitch": 27.13, - "LHipRoll": 4.0, - "LHipYaw": -1.0, - "LKnee": 58.00000000000001, - "RAnklePitch": 26.0, - "RAnkleRoll": -4.0, - "RElbow": -24.27, - "RHipPitch": -23.0, - "RHipRoll": -4.0, - "RHipYaw": -22.0, - "RKnee": -58.00000000000001, - "RShoulderPitch": -54.78, - "RShoulderRoll": 32.43 - }, - "name": "push arm", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.5, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 45.0, - "LAnklePitch": -26.0, - "LAnkleRoll": 4.0, - "LElbow": 45.0, - "LHipPitch": 27.13, - "LHipRoll": 4.0, - "LHipYaw": 20.22, - "LKnee": 58.00000000000001, - "LShoulderPitch": 90.0, - "LShoulderRoll": 0.0, - "RAnklePitch": 26.0, - "RAnkleRoll": -4.0, - "RElbow": -45.0, - "RHipPitch": -27.0, - "RHipRoll": -4.0, - "RHipYaw": 1.0, - "RKnee": -58.00000000000001, - "RShoulderPitch": -90.0, - "RShoulderRoll": 0.0 - }, - "name": "generated frame 1", - "pause": 0.0, - "torque": {} - } - ], - "last_edited": "2019-05-03 12:22:52.948391", - "name": "turning_front_right", - "version": "0" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/throw_in/grab_ball.json b/src/bitbots_robot/wolfgang_animations/animations/throw_in/grab_ball.json deleted file mode 100644 index af1a995d2e..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/throw_in/grab_ball.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "author": "Maxim, David, Okan", - "description": "Play grab ball animation", - "keyframes": [ - { - "duration": 3.0, - "goals": { - "LAnklePitch": -55.99, - "LAnkleRoll": 2.99, - "LElbow": -86.22, - "LHipPitch": 71.75, - "LHipRoll": 6.86, - "LHipYaw": -2.72, - "LKnee": 139.37, - "LShoulderPitch": -173.58, - "LShoulderRoll": -56.43, - "RAnklePitch": 55.99, - "RAnkleRoll": -2.99, - "RElbow": 86.22, - "RHipPitch": -71.75, - "RHipRoll": -6.86, - "RHipYaw": 2.72, - "RKnee": -139.37, - "RShoulderPitch": 173.58, - "RShoulderRoll": 56.43 - }, - "name": "praise_the_sun", - "pause": 0.0, - "torque": {} - }, - { - "duration": 3.0, - "goals": { - "LElbow": -86.22, - "LShoulderPitch": -58.89, - "LShoulderRoll": -56.43, - "RElbow": 86.22, - "RShoulderPitch": 58.89, - "RShoulderRoll": 56.43, - "LAnklePitch": -57.48, - "LAnkleRoll": 11.96, - "LHipPitch": 121.61, - "LHipRoll": 14.250000000000002, - "LHipYaw": -3.08, - "LKnee": 160.21, - "RAnklePitch": 57.48, - "RAnkleRoll": -11.96, - "RHipPitch": -121.61, - "RHipRoll": -14.250000000000002, - "RHipYaw": 3.08, - "RKnee": -160.21 - }, - "name": "osu", - "pause": 0.0, - "torque": {} - }, - { - "duration": 2.2, - "goals": { - "LAnklePitch": -57.48, - "LAnkleRoll": 11.96, - "LElbow": -86.22, - "LHipPitch": 121.61, - "LHipRoll": 14.250000000000002, - "LHipYaw": -3.08, - "LKnee": 160.21, - "LShoulderPitch": -64.89, - "LShoulderRoll": 19.35, - "RAnklePitch": 57.48, - "RAnkleRoll": -11.96, - "RElbow": 86.22, - "RHipPitch": -121.61, - "RHipRoll": -14.250000000000002, - "RHipYaw": 3.08, - "RKnee": -160.21, - "RShoulderPitch": 64.89, - "RShoulderRoll": -19.35 - }, - "name": "scoop", - "pause": 0.0, - "torque": {} - }, - { - "duration": 1.8, - "goals": { - "LAnklePitch": -62.4, - "LAnkleRoll": 10.11, - "LElbow": -86.22, - "LHipPitch": 71.05, - "LHipRoll": 13.37, - "LHipYaw": 1.23, - "LKnee": 142.19, - "LShoulderPitch": -164.79, - "LShoulderRoll": 19.35, - "RAnklePitch": 62.4, - "RAnkleRoll": -10.11, - "RElbow": 86.22, - "RHipPitch": -71.05, - "RHipRoll": -13.37, - "RHipYaw": -1.23, - "RKnee": -142.19, - "RShoulderPitch": 164.79, - "RShoulderRoll": -19.35 - }, - "name": "pick_up_ball", - "pause": 0.0, - "torque": {} - } - ], - "last_edited": "2024-12-18 16:01:10.522911", - "name": "grab_ball", - "version": "" -} diff --git a/src/bitbots_robot/wolfgang_animations/animations/throw_in/throw.json b/src/bitbots_robot/wolfgang_animations/animations/throw_in/throw.json deleted file mode 100644 index c471e24e4e..0000000000 --- a/src/bitbots_robot/wolfgang_animations/animations/throw_in/throw.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "author": "", - "description": "", - "keyframes": [ - { - "duration": 1.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LElbow": -73.74, - "LShoulderPitch": -179.38, - "LShoulderRoll": 17.15, - "RElbow": 73.74, - "RShoulderPitch": 179.38, - "RShoulderRoll": -17.15 - }, - "name": "unus", - "pause": 0.0, - "torque": {} - }, - { - "duration": 1.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LElbow": -62.49000000000001, - "LShoulderPitch": -179.38, - "LShoulderRoll": 17.41, - "RElbow": 62.49000000000001, - "RShoulderPitch": 179.38, - "RShoulderRoll": -17.41 - }, - "name": "duo", - "pause": 0.0, - "torque": {} - }, - { - "duration": 0.3, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LElbow": -94.66, - "LShoulderPitch": -147.13, - "LShoulderRoll": 11.17, - "RElbow": 94.66, - "RShoulderPitch": 147.13, - "RShoulderRoll": -11.17 - }, - "name": "tres", - "pause": 0.5, - "torque": {} - }, - { - "duration": 1.0, - "goals": { - "HeadPan": 0.0, - "HeadTilt": 0.0, - "LElbow": 8.35, - "LShoulderPitch": 37.81, - "LShoulderRoll": -1.93, - "RElbow": -8.35, - "RShoulderPitch": -37.81, - "RShoulderRoll": 1.93 - }, - "name": "quattuor", - "pause": 0.0, - "torque": {} - } - ], - "last_edited": "2024-12-18 16:10:48.875357", - "name": "throw", - "version": "" -} diff --git a/src/bitbots_robot/wolfgang_animations/docs/_static/logo.png b/src/bitbots_robot/wolfgang_animations/docs/_static/logo.png deleted file mode 100644 index f8afdd5d06..0000000000 Binary files a/src/bitbots_robot/wolfgang_animations/docs/_static/logo.png and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_animations/docs/conf.py b/src/bitbots_robot/wolfgang_animations/docs/conf.py deleted file mode 100644 index 0b6342a9ce..0000000000 --- a/src/bitbots_robot/wolfgang_animations/docs/conf.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Full list of options at http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import catkin_pkg.package -from exhale import utils - -package_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -catkin_package = catkin_pkg.package.parse_package( - os.path.join(package_dir, catkin_pkg.package.PACKAGE_MANIFEST_FILENAME) -) -sys.path.insert(0, os.path.abspath(os.path.join(package_dir, "src"))) - - -# -- Helper functions -------------------------------------------------------- - - -def count_files(): - """:returns tuple of (num_py, num_cpp)""" - num_py = 0 - num_cpp = 0 - - for _, _, files in os.walk(os.path.join(package_dir, "src")): - for f in files: - if f.endswith(".py"): - num_py += 1 - for _, _, files in os.walk(os.path.join(package_dir, "include")): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - num_cpp += 1 - - return num_py, num_cpp - - -# -- Project information ----------------------------------------------------- - -project = catkin_package.name -copyright = "2019, Bit-Bots" -author = ", ".join([a.name for a in catkin_package.authors]) - -# The short X.Y version -version = str(catkin_package.version) -# The full version, including alpha/beta/rc tags -release = str(catkin_package.version) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.doctest", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.coverage", - "sphinx.ext.imgmath", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# -- Exhale and Breath setup ------------------------------------------------- - -# Tell sphinx what the primary language being documented is. -num_files_py, num_files_cpp = count_files() -primary_domain = "py" if num_files_py >= num_files_cpp else "cpp" - -# Tell sphinx what the pygments highlight language should be. -highlight_language = primary_domain - -if num_files_cpp > 0: - extensions += [ - "breathe", - "exhale", - ] - - breathe_projects = {project: os.path.join("_build", "doxyoutput", "xml")} - breathe_default_project = project - - def specifications_for_kind(kind): - # Show all members for classes and structs - if kind == "class" or kind == "struct": - return [":members:", ":protected-members:", ":private-members:", ":undoc-members:"] - # An empty list signals to Exhale to use the defaults - else: - return [] - - exhale_args = { - # These arguments are required - "containmentFolder": "cppapi", - "rootFileName": "library_root.rst", - "rootFileTitle": "C++ Library API", - "doxygenStripFromPath": "..", - "customSpecificationsMapping": utils.makeCustomSpecificationsMapping(specifications_for_kind), - # Suggested optional arguments - "createTreeView": True, - "exhaleExecutesDoxygen": True, - "exhaleDoxygenStdin": "INPUT = {}".format(os.path.join(package_dir, "include")), - } - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = os.path.join("_static", "logo.png") -html_favicon = os.path.join("_static", "logo.png") - - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# -- RST Standard variables --------------------------------------------------- -rst_prolog = f".. |project| replace:: {project}\n" -rst_prolog += ".. |description| replace:: {}\n".format(catkin_package.description.replace("\n\n", "\n")) -rst_prolog += ".. |modindex| replace:: {}\n".format( - ":ref:`modindex`" if num_files_py > 0 else "Python module index is not available" -) diff --git a/src/bitbots_robot/wolfgang_animations/docs/index.rst b/src/bitbots_robot/wolfgang_animations/docs/index.rst deleted file mode 100644 index e76aa433a2..0000000000 --- a/src/bitbots_robot/wolfgang_animations/docs/index.rst +++ /dev/null @@ -1,21 +0,0 @@ -Welcome to |project|'s documentation! -================================================ - -Description ------------ - -|description| - -.. toctree:: - :maxdepth: 2 - - cppapi/library_root - pyapi/modules - - -Indices and tables -================== - -* :ref:`genindex` -* |modindex| -* :ref:`search` diff --git a/src/bitbots_robot/wolfgang_animations/package.xml b/src/bitbots_robot/wolfgang_animations/package.xml deleted file mode 100644 index 4bf48f97ce..0000000000 --- a/src/bitbots_robot/wolfgang_animations/package.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - wolfgang_animations - 1.0.3 - Animation files for the wolfgang robot - - Sebastian Stelter - Hamburg Bit-Bots - - MIT - - Sebastian Stelter - - - ament_cmake - bitbots_docs - - - - starts - - ament_cmake - - diff --git a/src/bitbots_robot/wolfgang_description/CMakeLists.txt b/src/bitbots_robot/wolfgang_description/CMakeLists.txt deleted file mode 100644 index 499116a429..0000000000 --- a/src/bitbots_robot/wolfgang_description/CMakeLists.txt +++ /dev/null @@ -1,13 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(wolfgang_description) - -find_package(bitbots_docs REQUIRED) -find_package(ament_cmake REQUIRED) - -enable_bitbots_docs() - -install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) -install(DIRECTORY urdf DESTINATION share/${PROJECT_NAME}) -install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) - -ament_package() diff --git a/src/bitbots_robot/wolfgang_description/config/fake_controllers.yaml b/src/bitbots_robot/wolfgang_description/config/fake_controllers.yaml deleted file mode 100644 index 7251677d48..0000000000 --- a/src/bitbots_robot/wolfgang_description/config/fake_controllers.yaml +++ /dev/null @@ -1,24 +0,0 @@ -controller_list: - - name: fake_minibot_controller - joints: - - HeadPan - - HeadTilt - - RShoulderPitch - - RShoulderRoll - - RElbow - - RHipYaw - - RHipRoll - - RHipPitch - - RKnee - - RAnklePitch - - RAnkleRoll - - LShoulderPitch - - LShoulderRoll - - LElbow - - LHipYaw - - LHipRoll - - LHipPitch - - LKnee - - LAnklePitch - - LAnkleRoll - diff --git a/src/bitbots_robot/wolfgang_description/config/wolfgang_control.yaml b/src/bitbots_robot/wolfgang_description/config/wolfgang_control.yaml deleted file mode 100644 index 8847d986e9..0000000000 --- a/src/bitbots_robot/wolfgang_description/config/wolfgang_control.yaml +++ /dev/null @@ -1,214 +0,0 @@ -# Publish all joint states ----------------------------------- -# 100Hz is a compromise between fast reaction and CPU load -joint_state_controller: - type: joint_state_controller/JointStateController - publish_rate: 100 - - -# TrajectoryActoin Controllers ------------------------------ -# FNH: this is a single controller for all joints; of course, -# we could also set up controllers for the individual 'chains', -# e.g. head, left_arm, right_arm, left_leg, right_leg. -# -trajcontroller: - type: effort_controllers/JointTrajectoryController - joints: - - HeadPan - - HeadTilt - - LShoulderPitch - - LShoulderRoll - - LElbow - - RShoulderPitch - - RShoulderRoll - - RElbow - - LHipYaw - - LHipRoll - - LHipPitch - - LKnee - - LAnklePitch - - LAnkleRoll - - RHipYaw - - RHipRoll - - RHipPitch - - RKnee - - RAnklePitch - - RAnkleRoll - gains: - HeadPan: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - HeadTilt: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LShoulderPitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LShoulderRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LElbow: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RShoulderPitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RShoulderRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RElbow: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LHipYaw: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LHipRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LHipPitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LKnee: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LAnklePitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LAnkleRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RHipYaw: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RHipRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RHipPitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RKnee: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RAnklePitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RAnkleRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - allow_partial_joints_goal: true - constraints: - goal_time: 10 - -JointGroupController: - type: effort_controllers/JointGroupPositionController - joints: - - HeadPan - - HeadTilt - - LShoulderPitch - - LShoulderRoll - - LElbow - - RShoulderPitch - - RShoulderRoll - - RElbow - - LHipYaw - - LHipRoll - - LHipPitch - - LKnee - - LAnklePitch - - LAnkleRoll - - RHipYaw - - RHipRoll - - RHipPitch - - RKnee - - RAnklePitch - - RAnkleRoll - HeadPan/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - HeadTilt/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - LShoulderPitch/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - LShoulderRoll/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - LElbow/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - RShoulderPitch/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - RShoulderRoll/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - RElbow/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - LHipYaw/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - LHipRoll/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - LHipPitch/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - LKnee/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - LAnklePitch/pid: { p: 50.0, i: 0.00, d: 0.2, i_clamp: 0.5 } - LAnkleRoll/pid: { p: 50.0, i: 0.00, d: 0.2, i_clamp: 0.5 } - RHipYaw/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - RHipRoll/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - RHipPitch/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - RKnee/pid: { p: 50.0, i: 0.00, d: 1.0, i_clamp: 4.0 } - RAnklePitch/pid: { p: 50.0, i: 0.00, d: 0.2, i_clamp: 0.5 } - RAnkleRoll/pid: { p: 50.0, i: 0.00, d: 0.2, i_clamp: 0.5 } - -# Individual Joint Position Controllers --------------------------------------- - -# HEAD -HeadPanPositionController: - type: effort_controllers/JointPositionController - joint: HeadPan - pid: {p: 50.0, i: 0.00, d: 0.4} - -HeadTiltPositionController: - type: effort_controllers/JointPositionController - joint: HeadTilt - pid: {p: 50.0, i: 0.00, d: 0.4} - -# ARMS - -LShoulderPitchPositionController: - type: effort_controllers/JointPositionController - joint: LShoulderPitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -LShoulderRollPositionController: - type: effort_controllers/JointPositionController - joint: LShoulderRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -LElbowPositionController: - type: effort_controllers/JointPositionController - joint: LElbow - pid: {p: 50.0, i: 0.00, d: 0.4} - -RShoulderPitchPositionController: - type: effort_controllers/JointPositionController - joint: RShoulderPitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -RShoulderRollPositionController: - type: effort_controllers/JointPositionController - joint: RShoulderRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -RElbowPositionController: - type: effort_controllers/JointPositionController - joint: RElbow - pid: {p: 50.0, i: 0.00, d: 0.4} - -# Left leg - -LHipYawPositionController: - type: effort_controllers/JointPositionController - joint: LHipYaw - pid: {p: 50.0, i: 0.00, d: 0.4} - -LHipRollPositionController: - type: effort_controllers/JointPositionController - joint: LHipRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -LHipPitchPositionController: - type: effort_controllers/JointPositionController - joint: LHipPitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -LKneePositionController: - type: effort_controllers/JointPositionController - joint: LKnee - pid: {p: 50.0, i: 0.00, d: 0.4} - -LAnklePitchPositionController: - type: effort_controllers/JointPositionController - joint: LAnklePitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -LAnkleRollPositionController: - type: effort_controllers/JointPositionController - joint: LAnkleRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -# Right leg - -RHipYawPositionController: - type: effort_controllers/JointPositionController - joint: RHipYaw - pid: {p: 50.0, i: 0.00, d: 0.4} - -RHipRollPositionController: - type: effort_controllers/JointPositionController - joint: RHipRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -RHipPitchPositionController: - type: effort_controllers/JointPositionController - joint: RHipPitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -RKneePositionController: - type: effort_controllers/JointPositionController - joint: RKnee - pid: {p: 50.0, i: 0.00, d: 0.4} - -RAnklePitchPositionController: - type: effort_controllers/JointPositionController - joint: RAnklePitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -RAnkleRollPositionController: - type: effort_controllers/JointPositionController - joint: RAnkleRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -# end of file diff --git a/src/bitbots_robot/wolfgang_description/config/wolfgang_control_simple_physics.yaml b/src/bitbots_robot/wolfgang_description/config/wolfgang_control_simple_physics.yaml deleted file mode 100644 index 64d5432568..0000000000 --- a/src/bitbots_robot/wolfgang_description/config/wolfgang_control_simple_physics.yaml +++ /dev/null @@ -1,214 +0,0 @@ -# Publish all joint states ----------------------------------- -# 100Hz is a compromise between fast reaction and CPU load -joint_state_controller: - type: joint_state_controller/JointStateController - publish_rate: 100 - - -# TrajectoryActoin Controllers ------------------------------ -# FNH: this is a single controller for all joints; of course, -# we could also set up controllers for the individual 'chains', -# e.g. head, left_arm, right_arm, left_leg, right_leg. -# -trajcontroller: - type: effort_controllers/JointTrajectoryController - joints: - - HeadPan - - HeadTilt - - LShoulderPitch - - LShoulderRoll - - LElbow - - RShoulderPitch - - RShoulderRoll - - RElbow - - LHipYaw - - LHipRoll - - LHipPitch - - LKnee - - LAnklePitch - - LAnkleRoll - - RHipYaw - - RHipRoll - - RHipPitch - - RKnee - - RAnklePitch - - RAnkleRoll - gains: - HeadPan: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - HeadTilt: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LShoulderPitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LShoulderRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LElbow: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RShoulderPitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RShoulderRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RElbow: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LHipYaw: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LHipRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LHipPitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LKnee: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LAnklePitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - LAnkleRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RHipYaw: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RHipRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RHipPitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RKnee: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RAnklePitch: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - RAnkleRoll: { p: 50.0, i: 0.00, d: 0.1, i_clamp: 4.0 } - allow_partial_joints_goal: true - constraints: - goal_time: 10 - -JointGroupController: - type: effort_controllers/JointGroupPositionController - joints: - - HeadPan - - HeadTilt - - LShoulderPitch - - LShoulderRoll - - LElbow - - RShoulderPitch - - RShoulderRoll - - RElbow - - LHipYaw - - LHipRoll - - LHipPitch - - LKnee - - LAnklePitch - - LAnkleRoll - - RHipYaw - - RHipRoll - - RHipPitch - - RKnee - - RAnklePitch - - RAnkleRoll - HeadPan/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - HeadTilt/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - LShoulderPitch/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - LShoulderRoll/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - LElbow/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - RShoulderPitch/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - RShoulderRoll/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - RElbow/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - LHipYaw/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - LHipRoll/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - LHipPitch/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - LKnee/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - LAnklePitch/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 0.5 } - LAnkleRoll/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 0.5 } - RHipYaw/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - RHipRoll/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - RHipPitch/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - RKnee/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 4.0 } - RAnklePitch/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 0.5 } - RAnkleRoll/pid: { p: 50.0, i: 0.00, d: 0.0, i_clamp: 0.5 } - -# Individual Joint Position Controllers --------------------------------------- - -# HEAD -HeadPanPositionController: - type: effort_controllers/JointPositionController - joint: HeadPan - pid: {p: 50.0, i: 0.00, d: 0.4} - -HeadTiltPositionController: - type: effort_controllers/JointPositionController - joint: HeadTilt - pid: {p: 50.0, i: 0.00, d: 0.4} - -# ARMS - -LShoulderPitchPositionController: - type: effort_controllers/JointPositionController - joint: LShoulderPitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -LShoulderRollPositionController: - type: effort_controllers/JointPositionController - joint: LShoulderRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -LElbowPositionController: - type: effort_controllers/JointPositionController - joint: LElbow - pid: {p: 50.0, i: 0.00, d: 0.4} - -RShoulderPitchPositionController: - type: effort_controllers/JointPositionController - joint: RShoulderPitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -RShoulderRollPositionController: - type: effort_controllers/JointPositionController - joint: RShoulderRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -RElbowPositionController: - type: effort_controllers/JointPositionController - joint: RElbow - pid: {p: 50.0, i: 0.00, d: 0.4} - -# Left leg - -LHipYawPositionController: - type: effort_controllers/JointPositionController - joint: LHipYaw - pid: {p: 50.0, i: 0.00, d: 0.4} - -LHipRollPositionController: - type: effort_controllers/JointPositionController - joint: LHipRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -LHipPitchPositionController: - type: effort_controllers/JointPositionController - joint: LHipPitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -LKneePositionController: - type: effort_controllers/JointPositionController - joint: LKnee - pid: {p: 50.0, i: 0.00, d: 0.4} - -LAnklePitchPositionController: - type: effort_controllers/JointPositionController - joint: LAnklePitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -LAnkleRollPositionController: - type: effort_controllers/JointPositionController - joint: LAnkleRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -# Right leg - -RHipYawPositionController: - type: effort_controllers/JointPositionController - joint: RHipYaw - pid: {p: 50.0, i: 0.00, d: 0.4} - -RHipRollPositionController: - type: effort_controllers/JointPositionController - joint: RHipRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -RHipPitchPositionController: - type: effort_controllers/JointPositionController - joint: RHipPitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -RKneePositionController: - type: effort_controllers/JointPositionController - joint: RKnee - pid: {p: 50.0, i: 0.00, d: 0.4} - -RAnklePitchPositionController: - type: effort_controllers/JointPositionController - joint: RAnklePitch - pid: {p: 50.0, i: 0.00, d: 0.4} - -RAnkleRollPositionController: - type: effort_controllers/JointPositionController - joint: RAnkleRoll - pid: {p: 50.0, i: 0.00, d: 0.4} - -# end of file diff --git a/src/bitbots_robot/wolfgang_description/docs/_static/logo.png b/src/bitbots_robot/wolfgang_description/docs/_static/logo.png deleted file mode 100644 index f8afdd5d06..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/docs/_static/logo.png and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/docs/conf.py b/src/bitbots_robot/wolfgang_description/docs/conf.py deleted file mode 100644 index 0b6342a9ce..0000000000 --- a/src/bitbots_robot/wolfgang_description/docs/conf.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Full list of options at http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import catkin_pkg.package -from exhale import utils - -package_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -catkin_package = catkin_pkg.package.parse_package( - os.path.join(package_dir, catkin_pkg.package.PACKAGE_MANIFEST_FILENAME) -) -sys.path.insert(0, os.path.abspath(os.path.join(package_dir, "src"))) - - -# -- Helper functions -------------------------------------------------------- - - -def count_files(): - """:returns tuple of (num_py, num_cpp)""" - num_py = 0 - num_cpp = 0 - - for _, _, files in os.walk(os.path.join(package_dir, "src")): - for f in files: - if f.endswith(".py"): - num_py += 1 - for _, _, files in os.walk(os.path.join(package_dir, "include")): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - num_cpp += 1 - - return num_py, num_cpp - - -# -- Project information ----------------------------------------------------- - -project = catkin_package.name -copyright = "2019, Bit-Bots" -author = ", ".join([a.name for a in catkin_package.authors]) - -# The short X.Y version -version = str(catkin_package.version) -# The full version, including alpha/beta/rc tags -release = str(catkin_package.version) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.doctest", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.coverage", - "sphinx.ext.imgmath", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# -- Exhale and Breath setup ------------------------------------------------- - -# Tell sphinx what the primary language being documented is. -num_files_py, num_files_cpp = count_files() -primary_domain = "py" if num_files_py >= num_files_cpp else "cpp" - -# Tell sphinx what the pygments highlight language should be. -highlight_language = primary_domain - -if num_files_cpp > 0: - extensions += [ - "breathe", - "exhale", - ] - - breathe_projects = {project: os.path.join("_build", "doxyoutput", "xml")} - breathe_default_project = project - - def specifications_for_kind(kind): - # Show all members for classes and structs - if kind == "class" or kind == "struct": - return [":members:", ":protected-members:", ":private-members:", ":undoc-members:"] - # An empty list signals to Exhale to use the defaults - else: - return [] - - exhale_args = { - # These arguments are required - "containmentFolder": "cppapi", - "rootFileName": "library_root.rst", - "rootFileTitle": "C++ Library API", - "doxygenStripFromPath": "..", - "customSpecificationsMapping": utils.makeCustomSpecificationsMapping(specifications_for_kind), - # Suggested optional arguments - "createTreeView": True, - "exhaleExecutesDoxygen": True, - "exhaleDoxygenStdin": "INPUT = {}".format(os.path.join(package_dir, "include")), - } - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = os.path.join("_static", "logo.png") -html_favicon = os.path.join("_static", "logo.png") - - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# -- RST Standard variables --------------------------------------------------- -rst_prolog = f".. |project| replace:: {project}\n" -rst_prolog += ".. |description| replace:: {}\n".format(catkin_package.description.replace("\n\n", "\n")) -rst_prolog += ".. |modindex| replace:: {}\n".format( - ":ref:`modindex`" if num_files_py > 0 else "Python module index is not available" -) diff --git a/src/bitbots_robot/wolfgang_description/docs/index.rst b/src/bitbots_robot/wolfgang_description/docs/index.rst deleted file mode 100644 index 31d5c85dce..0000000000 --- a/src/bitbots_robot/wolfgang_description/docs/index.rst +++ /dev/null @@ -1,34 +0,0 @@ -Welcome to |project|'s documentation! -================================================ - -Description ------------ -This robot model is exported from onshape by using onshape-to-robot. -See their `documentation `_ on how this works. - -We do not want to use the exact model as a collision model, since this would make the simulation run slowly. -Therefore, we first need to simplify the model by using the following. - -.. code-block:: bash - - roscd wolfgang_description - cd urdf - rosrun simplify_urdf_collision simplify.py robot.urdf robot.urdf -r -s - -The script will ask you which links should be excluded for the simplification. Normally, you don't need to exclude any links, since the important collision models (arms or feet) already have manually created collision models which are not shown in this list. - -|description| - -.. toctree:: - :maxdepth: 2 - - cppapi/library_root - pyapi/modules - - -Indices and tables -================== - -* :ref:`genindex` -* |modindex| -* :ref:`search` diff --git a/src/bitbots_robot/wolfgang_description/launch/rviz.launch b/src/bitbots_robot/wolfgang_description/launch/rviz.launch deleted file mode 100644 index de4a3d4ece..0000000000 --- a/src/bitbots_robot/wolfgang_description/launch/rviz.launch +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/src/bitbots_robot/wolfgang_description/launch/standalone.launch b/src/bitbots_robot/wolfgang_description/launch/standalone.launch deleted file mode 100644 index 87b63fad31..0000000000 --- a/src/bitbots_robot/wolfgang_description/launch/standalone.launch +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_robot/wolfgang_description/package.xml b/src/bitbots_robot/wolfgang_description/package.xml deleted file mode 100644 index 8acfee9612..0000000000 --- a/src/bitbots_robot/wolfgang_description/package.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - wolfgang_description - 2.1.2 - URDF description of the wolfgang robot. - - Jasper Güldenstein - Hamburg Bit-Bots - - MIT - - Marc Bestmann - Jasper Güldenstein - Hamburg Bit-Bots - - - ament_cmake - - bitbots_docs - bitbots_robot_description - bitbots_utils - joint_state_publisher_gui - sensor_msgs - tf2 - urdf - xacro - - - - stable - xacro - - ament_cmake - - diff --git a/src/bitbots_robot/wolfgang_description/urdf/additionalURDF.txt b/src/bitbots_robot/wolfgang_description/urdf/additionalURDF.txt deleted file mode 100644 index 3007382612..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/additionalURDF.txt +++ /dev/null @@ -1,389 +0,0 @@ - - - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - hardware_interface/EffortJointInterface - 1 - - - -Gazebo/FlatBlack -1000000.0 -100.0 -1.0 -1.0 -1 0 0 -1.0 -0.00 - - -Gazebo/FlatBlack -1000000.0 -100.0 -1.0 -1.0 -1 0 0 -1.0 -0.00 - - - - - - $(arg sim_ns) - - - - - - - -0.050000 -0.010000 0.000000 -1.5708 0.000000 -3.141592 - - 0.57 - - 620 - 480 - - - 0.001000 - 100.000000 - - - 1 - 30.000000 - 1 - - true - 30 - camera - camera/image_proc - camera_info - camera_optical_frame - 0.07 - 0.0 - 0.0 - 0.0 - 0.0 - 0.0 - - - - - - - - true - - true - 100 - true - __default_topic__ - - imu - imu_frame - 100.0 - 0.0 - 0 0 0 - 0 0 0 - imu_frame - - 0 0 0 0 0 0 - - - - true - - true - 100 - true - __default_topic__ - - imu_head - head - 100.0 - 0.0 - 0 0 0 - 0 0 0 - head - - 0 0 0 0 0 0 - - - - - - true - 100.0 - llb - sim_strain_gauges/llb - $(arg sim_ns) - - - - true - 100.0 - llf - sim_strain_gauges/llf - $(arg sim_ns) - - - - true - 100.0 - lrf - sim_strain_gauges/lrf - $(arg sim_ns) - - - - true - 100.0 - lrb - sim_strain_gauges/lrb - $(arg sim_ns) - - - - true - 100.0 - rlb - sim_strain_gauges/rlb - $(arg sim_ns) - - - - true - 100.0 - rlf - sim_strain_gauges/rlf - $(arg sim_ns) - - - - true - 100.0 - rrf - sim_strain_gauges/rrf - $(arg sim_ns) - - - - true - 100.0 - rrb - sim_strain_gauges/rrb - $(arg sim_ns) - - - - - - - - - - / - cmd_vel - odom - odom - 100.0 - base_link - - - diff --git a/src/bitbots_robot/wolfgang_description/urdf/ankle.scad b/src/bitbots_robot/wolfgang_description/urdf/ankle.scad deleted file mode 100644 index f1fdde06df..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/ankle.scad +++ /dev/null @@ -1,45 +0,0 @@ -% scale(1000) import("ankle.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([0,0,2]){ -cube([48,100,4], center=true); -} - -translate([0,50-2,50/2]){ -cube([21,4,50], center=true); -} -translate([0,-(50-2),50/2]){ -cube([21,4,50], center=true); -} -translate([0,-(50-2),8/2]){ -cube([48,4,8], center=true); -} - -translate([-10.4,-(50-2),26.7]){ - rotate([0,18.373539,0]){ -cube([14,4,(50-8)/cos(18.373539)], center=true); -} -} - -translate([10.4,-(50-2),26.7]){ - rotate([0,-18.373539,0]){ -cube([14,4,(50-8)/cos(18.373539)], center=true); -} -} -translate([-10.4,(50-2),26.7]){ - rotate([0,18.373539,0]){ -cube([14,4,(50-8)/cos(18.373539)], center=true); -} -} - -translate([10.4,(50-2),26.7]){ - rotate([0,-18.373539,0]){ -cube([14,4,(50-8)/cos(18.373539)], center=true); -} -} -translate([0,(50-2),8/2]){ -cube([48,4,8], center=true); -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/ankle.stl b/src/bitbots_robot/wolfgang_description/urdf/ankle.stl deleted file mode 100644 index 7ea29289a9..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/ankle.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/baseplate_odroid_xu4_core.scad b/src/bitbots_robot/wolfgang_description/urdf/baseplate_odroid_xu4_core.scad deleted file mode 100644 index e3ea42788c..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/baseplate_odroid_xu4_core.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("baseplate_odroid_xu4_core.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/baseplate_odroid_xu4_core.stl b/src/bitbots_robot/wolfgang_description/urdf/baseplate_odroid_xu4_core.stl deleted file mode 100644 index 4660be2d7b..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/baseplate_odroid_xu4_core.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/basler_ace_gige_c-mount_v01.scad b/src/bitbots_robot/wolfgang_description/urdf/basler_ace_gige_c-mount_v01.scad deleted file mode 100644 index 18162d73bc..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/basler_ace_gige_c-mount_v01.scad +++ /dev/null @@ -1,12 +0,0 @@ -% scale(1000) import("basler_ace_gige_c-mount_v01.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0,-(42/2+12),0]){ -cube([29, 42, 29], center=true); -} -translate([0,-6,0]){ -rotate([90,0,0]){ -cylinder(r=14, h=12, center=true); -} -} -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/basler_ace_gige_c-mount_v01.stl b/src/bitbots_robot/wolfgang_description/urdf/basler_ace_gige_c-mount_v01.stl deleted file mode 100644 index 01531abb9f..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/basler_ace_gige_c-mount_v01.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/battery.scad b/src/bitbots_robot/wolfgang_description/urdf/battery.scad deleted file mode 100644 index 052c23e6ee..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/battery.scad +++ /dev/null @@ -1,9 +0,0 @@ -% scale(1000) import("battery.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0,-20,0]) -{ -cube([140, 40, 44], center=true); -} -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/battery.stl b/src/bitbots_robot/wolfgang_description/urdf/battery.stl deleted file mode 100644 index 9cfcaab814..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/battery.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/battery_cage.scad b/src/bitbots_robot/wolfgang_description/urdf/battery_cage.scad deleted file mode 100644 index b580a84965..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/battery_cage.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("battery_cage.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/battery_cage.stl b/src/bitbots_robot/wolfgang_description/urdf/battery_cage.stl deleted file mode 100644 index 6bfb9bbdd3..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/battery_cage.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/battery_clip.scad b/src/bitbots_robot/wolfgang_description/urdf/battery_clip.scad deleted file mode 100644 index 1444fa7b8f..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/battery_clip.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("battery_clip.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/battery_clip.stl b/src/bitbots_robot/wolfgang_description/urdf/battery_clip.stl deleted file mode 100644 index 6c97c8b9b6..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/battery_clip.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/camera_lower_basler_wolfgang_imu_v2.2.scad b/src/bitbots_robot/wolfgang_description/urdf/camera_lower_basler_wolfgang_imu_v2.2.scad deleted file mode 100644 index b3244cf341..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/camera_lower_basler_wolfgang_imu_v2.2.scad +++ /dev/null @@ -1,19 +0,0 @@ -% scale(1000) import("camera_lower_basler_wolfgang_imu_v2.2.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: - -translate([-15.55499+3,-72/2,18-30/2]){ - cube([6, 72, 30], center=true); - - translate([67,0,0]){ - cube([6, 72, 30], center=true); - } -} -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([73/2 - 15.55499,-3.5,18-30/2]){ -cube([73, 7, 30], center=true); -} -translate([45/2-8.05499,22/2-7,55/2-12]){ -cube([45, 22, 55], center=true); -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/camera_lower_basler_wolfgang_imu_v2.2.stl b/src/bitbots_robot/wolfgang_description/urdf/camera_lower_basler_wolfgang_imu_v2.2.stl deleted file mode 100644 index b2a928ecc6..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/camera_lower_basler_wolfgang_imu_v2.2.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_left.scad b/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_left.scad deleted file mode 100644 index cfa2e1fbad..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_left.scad +++ /dev/null @@ -1,7 +0,0 @@ -% scale(1000) import("camera_side_basler_wolfgang_v2.2_left.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([-72.71864,-15,-2.10102]){ -cube([127, 55, 7.10102]); -}// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_left.stl b/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_left.stl deleted file mode 100644 index 74f0de193e..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_left.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_right.scad b/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_right.scad deleted file mode 100644 index f8f305eacc..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_right.scad +++ /dev/null @@ -1,9 +0,0 @@ -% scale(1000) import("camera_side_basler_wolfgang_v2.2_right.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([-72.71864,-15,-25.0]){ -cube([127, 55, 7.10102]); -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_right.stl b/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_right.stl deleted file mode 100644 index 9e3476d5fb..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/camera_side_basler_wolfgang_v2.2_right.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/config.json b/src/bitbots_robot/wolfgang_description/urdf/config.json deleted file mode 100644 index ad007c995b..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/config.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "documentId": "8c6aa9a8917f764cb7039c2d", - "assemblyName": "WolfgangV3", - "outputFormat": "urdf", - "drawFrames": false, - "drawCollisions": false, - "useScads": true, - "simplifySTLs": false, - "mergeSTLs": false, - "maxSTLSize": 1, - "addDummyBaseLink": true, - "packageName": "wolfgang_description/urdf/", - "robotName": "wolfgang", - "additionalUrdfFile": "/additionalURDF.txt", - - // in Nm - // 3/4 of the stall torque from robotis emanual at 14.8V - // original values - // XH540-W270: 11.7nm - // MX-106: 10 Nm - // MX-64: 7.3 Nm - "jointMaxEffort": { - "default": 0.0, - "RShoulderRoll": 5.475, - "LShoulderRoll": 5.475, - "RShoulderPitch": 5.475, - "LShoulderPitch": 5.475, - "RElbow": 5.475, - "LElbow": 5.475, - "RHipYaw": 7.5, - "LHipYaw": 7.5, - "RHipRoll": 7.5, - "LHipRoll": 7.5, - "RHipPitch": 7.5, - "LHipPitch": 7.5, - "RKnee": 8.775, - "LKnee": 8.775, - "RAnklePitch": 7.5, - "LAnklePitch": 7.5, - "RAnkleRoll": 7.5, - "LAnkleRoll": 7.5, - "HeadPan": 5.475, - "HeadTilt": 5.475 - }, - // in rad/sec - // from datasheet at 14.8 V - // XH540-W270: 46 [rev/min] -> 4.82 - // MX-106: 55 [rev/min] -> 5.76 - // MX-64: 78 [rev/min] -> 8.17 - "jointMaxVelocity": { - "default": 0.0, - "RShoulderRoll": 8.17, - "LShoulderRoll": 8.17, - "RShoulderPitch": 8.17, - "LShoulderPitch": 8.17, - "RElbow": 8.17, - "LElbow": 8.17, - "RHipYaw": 5.76, - "LHipYaw": 5.76, - "RHipRoll": 5.76, - "LHipRoll": 5.76, - "RHipPitch": 5.76, - "LHipPitch": 5.76, - "RKnee": 4.82, - "LKnee": 4.82, - "RAnklePitch": 5.76, - "LAnklePitch": 5.76, - "RAnkleRoll": 5.76, - "LAnkleRoll": 5.76, - "HeadPan": 8.17, - "HeadTilt": 8.17 - }, - "jointDamping": { - // max force is only achived at 0 speed. max speed is only achieved with zero load - // damping = maxTorue / maxSpeed - "default": 0.0, - "RShoulderRoll": 0.67, - "LShoulderRoll": 0.67, - "RShoulderPitch": 0.67, - "LShoulderPitch": 0.67, - "RElbow": 0.67, - "LElbow": 0.67, - "RHipYaw": 1.3, - "LHipYaw": 1.3, - "RHipRoll": 1.3, - "LHipRoll": 1.3, - "RHipPitch": 1.3, - "LHipPitch": 1.3, - "RKnee": 1.82, - "LKnee": 1.82, - "RAnklePitch": 1.3, - "LAnklePitch": 1.3, - "RAnkleRoll": 1.3, - "LAnkleRoll": 1.3, - "HeadPan": 0.67, - "HeadTilt": 0.67 - }, - "ignore": [ - // ignore smaller standard parts - "hex_socket_head_cap_screw_m3x0.50_x_8", - "rx64-cap", - "mf128zz", - "hn05-n101", - "hn05-i101", - "hn07-i101", - "nuc_usb", - "nuc_button", - "nuc_usb", - "nuc_top", - "torsion_spring_assembly_helper", - "hip_z_spacer", - "torsion_spring_sodemann_t105-180-813r", - "torsion_spring_sodemann_t105-180-813l" - ], - "additionalURDF": "additionalURDF.txt" -} diff --git a/src/bitbots_robot/wolfgang_description/urdf/connector_shoulder.scad b/src/bitbots_robot/wolfgang_description/urdf/connector_shoulder.scad deleted file mode 100644 index 689e55cebb..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/connector_shoulder.scad +++ /dev/null @@ -1,7 +0,0 @@ -% scale(1000) import("connector_shoulder.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0,0,9.3/2]){ -cube([36, 40, 9.3], center=true); -}// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/connector_shoulder.stl b/src/bitbots_robot/wolfgang_description/urdf/connector_shoulder.stl deleted file mode 100644 index 5d9ceaf2ee..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/connector_shoulder.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/core.scad b/src/bitbots_robot/wolfgang_description/urdf/core.scad deleted file mode 100644 index 779ca5cb7a..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/core.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("core.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/core.stl b/src/bitbots_robot/wolfgang_description/urdf/core.stl deleted file mode 100644 index e778fb9beb..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/core.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/dummy_speaker.scad b/src/bitbots_robot/wolfgang_description/urdf/dummy_speaker.scad deleted file mode 100644 index 85b5f384d1..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/dummy_speaker.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("dummy_speaker.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/dummy_speaker.stl b/src/bitbots_robot/wolfgang_description/urdf/dummy_speaker.stl deleted file mode 100644 index 4c9f147f49..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/dummy_speaker.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/flex_stollen.scad b/src/bitbots_robot/wolfgang_description/urdf/flex_stollen.scad deleted file mode 100644 index b8876f7161..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/flex_stollen.scad +++ /dev/null @@ -1,8 +0,0 @@ -% scale(1000) import("flex_stollen.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -translate([0,0,5]){ - cylinder(r=6, h=10, center=true); -} -sphere(6); diff --git a/src/bitbots_robot/wolfgang_description/urdf/flex_stollen.stl b/src/bitbots_robot/wolfgang_description/urdf/flex_stollen.stl deleted file mode 100644 index 21c0952af0..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/flex_stollen.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/foot_cover.scad b/src/bitbots_robot/wolfgang_description/urdf/foot_cover.scad deleted file mode 100644 index 1f48477bc9..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/foot_cover.scad +++ /dev/null @@ -1,14 +0,0 @@ -% scale(1000) import("foot_cover.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([-38.391-20, -8.457, 38.166-11]){ - cube([40, 106, 19], center=true); -} -translate([-123.166+(45/2) , -8.457, 38.166-15]){ - rotate([0, 151.928,0]){ - cube([51, 74, 2], center=true); - } -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/foot_cover.stl b/src/bitbots_robot/wolfgang_description/urdf/foot_cover.stl deleted file mode 100644 index d59c6418a3..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/foot_cover.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/foot_printed_left.scad b/src/bitbots_robot/wolfgang_description/urdf/foot_printed_left.scad deleted file mode 100644 index 8d54a2b7a7..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/foot_printed_left.scad +++ /dev/null @@ -1,31 +0,0 @@ -% scale(1000) import("foot_printed_left.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: - -translate([154/2-84,0,3.5/2]){ -cube([154, 106, 3.5], center=true); -} -translate([89-19/2,0,3.5/2]){ -cube([19, 78, 3.5], center=true); -} - -translate([-(100-16/2),0,3.5/2]){ -cube([16, 78, 3.5], center=true); -} - -translate([0,106/2-16/2,3.5+7/2]){ -cube([140,16,7], center=true); -} - -translate([-(70-79/2),-106/2+16/2,3.5+7/2]){ -cube([79,16,7], center=true); -} - -translate([70-20/2,-106/2+44/2,3.5+7/2]){ -cube([20,44,7], center=true); -} -translate([20/2-11,-106/2+44/2,3.5+7/2]){ -cube([20,44,7], center=true); -} -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/foot_printed_left.stl b/src/bitbots_robot/wolfgang_description/urdf/foot_printed_left.stl deleted file mode 100644 index f6d0adddc8..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/foot_printed_left.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/foot_printed_right.scad b/src/bitbots_robot/wolfgang_description/urdf/foot_printed_right.scad deleted file mode 100644 index 3d55535b5e..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/foot_printed_right.scad +++ /dev/null @@ -1,35 +0,0 @@ -% scale(1000) import("foot_printed_right.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([0,160,0]){ -mirror([0,1,0]){ -translate([154/2-84,0,3.5/2]){ -cube([154, 106, 3.5], center=true); -} -translate([89-19/2,0,3.5/2]){ -cube([19, 78, 3.5], center=true); -} - -translate([-(100-16/2),0,3.5/2]){ -cube([16, 78, 3.5], center=true); -} - -translate([0,106/2-16/2,3.5+7/2]){ -cube([140,16,7], center=true); -} - -translate([-(70-79/2),-106/2+16/2,3.5+7/2]){ -cube([79,16,7], center=true); -} - -translate([70-20/2,-106/2+44/2,3.5+7/2]){ -cube([20,44,7], center=true); -} -translate([20/2-11,-106/2+44/2,3.5+7/2]){ -cube([20,44,7], center=true); -} -} -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/foot_printed_right.stl b/src/bitbots_robot/wolfgang_description/urdf/foot_printed_right.stl deleted file mode 100644 index 8826d1214f..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/foot_printed_right.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/hand.scad b/src/bitbots_robot/wolfgang_description/urdf/hand.scad deleted file mode 100644 index d7c840044b..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/hand.scad +++ /dev/null @@ -1,32 +0,0 @@ -% scale(1000) import("hand.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -rotate([90,0,0]){ - translate([0,0,17]){ - cylinder(r=40, h=34, center=true); - } -} - -// sphere(10); -translate([0,-17,30]){ -rotate([90,0,0]){ - cylinder(r=32, h=34, center=true); -} -} - -translate([35-6.8,-17,24]){ - rotate([0, 165.522,0]){ - cube([12,34,29], center=true); - } -} -translate([-35+6.8,-17,24]){ - rotate([0, -165.522,0]){ - cube([12,34,29], center=true); - } -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/hand.stl b/src/bitbots_robot/wolfgang_description/urdf/hand.stl deleted file mode 100644 index c8ea9fdb49..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/hand.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/hip_u_connector.scad b/src/bitbots_robot/wolfgang_description/urdf/hip_u_connector.scad deleted file mode 100644 index d832e5bce2..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/hip_u_connector.scad +++ /dev/null @@ -1,23 +0,0 @@ -% scale(1000) import("hip_u_connector.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - -translate([0,0,18]){ -rotate([0,90,90]){ - - translate([0,0,2]){ - cube([36,100,4], center=true); - } - - translate([0,50-2,53/2]){ - cube([26.02287,4,53], center=true); - } - translate([0,-(50-2),53/2]){ - cube([26.02287,4,53], center=true); - } - cylinder(r=25, h=4); -} -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/hip_u_connector.stl b/src/bitbots_robot/wolfgang_description/urdf/hip_u_connector.stl deleted file mode 100644 index 561db981e7..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/hip_u_connector.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/imu_holder.scad b/src/bitbots_robot/wolfgang_description/urdf/imu_holder.scad deleted file mode 100644 index 82e9b13036..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/imu_holder.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("imu_holder.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/imu_holder.stl b/src/bitbots_robot/wolfgang_description/urdf/imu_holder.stl deleted file mode 100644 index c04c67f345..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/imu_holder.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/knee_connector.scad b/src/bitbots_robot/wolfgang_description/urdf/knee_connector.scad deleted file mode 100644 index 9f7308799c..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/knee_connector.scad +++ /dev/null @@ -1,12 +0,0 @@ -% scale(1000) import("knee_connector.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0,17.98262/2-4,-(24.5/2-30.34724)]){ -cube([42, 17.98262, 24.5], center=true); -} - -translate([0,24.81250/2-4,-(4/2-30.34724)]){ -cube([34, 24.81250, 4], center=true); -} -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/knee_connector.stl b/src/bitbots_robot/wolfgang_description/urdf/knee_connector.stl deleted file mode 100644 index 1217932612..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/knee_connector.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/knee_spacer.scad b/src/bitbots_robot/wolfgang_description/urdf/knee_spacer.scad deleted file mode 100644 index 93a185c8ad..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/knee_spacer.scad +++ /dev/null @@ -1,10 +0,0 @@ -% scale(1000) import("knee_spacer.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -translate([-27.97000, -19.019, 154.130]){ - rotate([90,0,0]){ - cylinder(r=18, h=1.5, center=true); - } -} -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/knee_spacer.stl b/src/bitbots_robot/wolfgang_description/urdf/knee_spacer.stl deleted file mode 100644 index 247ca07fe6..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/knee_spacer.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/lense.scad b/src/bitbots_robot/wolfgang_description/urdf/lense.scad deleted file mode 100644 index 4da3680d22..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/lense.scad +++ /dev/null @@ -1,13 +0,0 @@ -% scale(1000) import("lense.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// sphere(10); -rotate([90, 0, 0]){ - translate([0,0,16.2/2]){ - cylinder(r=43/2, h=16.2, center=true); - } - translate([0,0,16.2+12/2]){ - cylinder(r=33.5/2, h=12, center=true); - } -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/lense.stl b/src/bitbots_robot/wolfgang_description/urdf/lense.stl deleted file mode 100644 index 40d74deaa0..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/lense.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/load_cell.scad b/src/bitbots_robot/wolfgang_description/urdf/load_cell.scad deleted file mode 100644 index d37f217807..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/load_cell.scad +++ /dev/null @@ -1,8 +0,0 @@ -% scale(1000) import("load_cell.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0,0,2]){ - cube([8, 40, 4], center=true); -} -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/load_cell.stl b/src/bitbots_robot/wolfgang_description/urdf/load_cell.stl deleted file mode 100644 index 10a6ded358..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/load_cell.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/lower_arm.scad b/src/bitbots_robot/wolfgang_description/urdf/lower_arm.scad deleted file mode 100644 index d611c89c0f..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/lower_arm.scad +++ /dev/null @@ -1,32 +0,0 @@ -% scale(1000) import("lower_arm.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -rotate([90,0,0]){ - translate([0,0,1]){ - cylinder(r=40, h=2, center=true); - } -} -forearm_len = 145; -forearm_start = 28; -translate([-1.5,-1,-(28+145/2)]){ - cube([44,2,145], center=true); -} - -// sphere(10); -translate([0,-1,30]){ -rotate([90,0,0]){ - cylinder(r=32, h=2, center=true); -} -} - -translate([35-6.8,-1,24]){ - rotate([0, 165.522,0]){ - cube([12,2,29], center=true); - } -} -translate([-35+6.8,-1,24]){ - rotate([0, -165.522,0]){ - cube([12,2,29], center=true); - } -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/lower_arm.stl b/src/bitbots_robot/wolfgang_description/urdf/lower_arm.stl deleted file mode 100644 index a6ff1783b6..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/lower_arm.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/lower_leg.scad b/src/bitbots_robot/wolfgang_description/urdf/lower_leg.scad deleted file mode 100644 index 5541b823bf..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/lower_leg.scad +++ /dev/null @@ -1,37 +0,0 @@ -% scale(1000) import("lower_leg.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -translate([0,-1,0]){ -rotate([90,0,0]){ - cylinder(r=18, h=2, center=true); -} -} -translate([0,-1,170]){ - rotate([90,0,0]){ - cylinder(r=18, h=2, center=true); - } -} - -translate([-4,-1,5]){ -rotate([90,0,0]){ - cylinder(r=20, h=2, center=true); -} -} - -translate([4,-1,165]){ -rotate([90,0,0]){ - cylinder(r=20, h=2, center=true); -} -} - -translate([-24,-2,6]){ - rotate([0,5,0]){ - translate([34/2,2/2,160/2]) { - cube([34, 2, 160], center=true); - } - } -} - -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/lower_leg.stl b/src/bitbots_robot/wolfgang_description/urdf/lower_leg.stl deleted file mode 100644 index f251cda1ce..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/lower_leg.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/lower_leg_spacer.scad b/src/bitbots_robot/wolfgang_description/urdf/lower_leg_spacer.scad deleted file mode 100644 index 8636cc8c3d..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/lower_leg_spacer.scad +++ /dev/null @@ -1,8 +0,0 @@ -% scale(1000) import("lower_leg_spacer.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([54-64.485/2,-30.75000+33.5/2,51/2]){ - cube([64.48500, 33.50000, 51], center=true); -} -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/lower_leg_spacer.stl b/src/bitbots_robot/wolfgang_description/urdf/lower_leg_spacer.stl deleted file mode 100644 index 6bda6802ff..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/lower_leg_spacer.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/motor_connector.scad b/src/bitbots_robot/wolfgang_description/urdf/motor_connector.scad deleted file mode 100644 index 479e0e80de..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/motor_connector.scad +++ /dev/null @@ -1,11 +0,0 @@ -% scale(1000) import("motor_connector.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0,-6,0]){ -cube([28, 6, 5.7]); -} -translate([0,-6,5.7]){ -cube([28, 3.5, 5.9]); -} -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/motor_connector.stl b/src/bitbots_robot/wolfgang_description/urdf/motor_connector.stl deleted file mode 100644 index 11930f1602..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/motor_connector.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/mx-106_body.scad b/src/bitbots_robot/wolfgang_description/urdf/mx-106_body.scad deleted file mode 100644 index 2f6f1ba760..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/mx-106_body.scad +++ /dev/null @@ -1,7 +0,0 @@ -% scale(1000) import("mx-106_body.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0,0, -(65.1/2)+14.5]){ -cube([40.2, 46, 65.10000], center=true);} -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/mx-106_body.stl b/src/bitbots_robot/wolfgang_description/urdf/mx-106_body.stl deleted file mode 100644 index d52c169f7a..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/mx-106_body.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/mx-64-body.scad b/src/bitbots_robot/wolfgang_description/urdf/mx-64-body.scad deleted file mode 100644 index 96af2bdf6e..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/mx-64-body.scad +++ /dev/null @@ -1,9 +0,0 @@ -% scale(1000) import("mx-64-body.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0, 0, -(61.1/2)+13]){ -cube([40.2, 41, 61.1], center=true); -} - -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/mx-64-body.stl b/src/bitbots_robot/wolfgang_description/urdf/mx-64-body.stl deleted file mode 100644 index bc27727c19..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/mx-64-body.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_back.scad b/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_back.scad deleted file mode 100644 index 5905e20aad..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_back.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("nuc_holder_left_back.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_back.stl b/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_back.stl deleted file mode 100644 index 19d998c096..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_back.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_front.scad b/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_front.scad deleted file mode 100644 index 3a8bc63284..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_front.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("nuc_holder_left_front.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_front.stl b/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_front.stl deleted file mode 100644 index ae2851d5b2..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_left_front.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_back.scad b/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_back.scad deleted file mode 100644 index b6c21e0462..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_back.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("nuc_holder_right_back.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_back.stl b/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_back.stl deleted file mode 100644 index b127ccabd1..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_back.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_front.scad b/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_front.scad deleted file mode 100644 index 5d87db767d..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_front.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("nuc_holder_right_front.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_front.stl b/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_front.stl deleted file mode 100644 index 2911ed8556..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/nuc_holder_right_front.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_main.scad b/src/bitbots_robot/wolfgang_description/urdf/nuc_main.scad deleted file mode 100644 index b49aa0a669..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/nuc_main.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("nuc_main.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/nuc_main.stl b/src/bitbots_robot/wolfgang_description/urdf/nuc_main.stl deleted file mode 100644 index 773dc5a2dd..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/nuc_main.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/robot.urdf b/src/bitbots_robot/wolfgang_description/urdf/robot.urdf deleted file mode 100644 index 49fdd84a5a..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/robot.urdf +++ /dev/null @@ -1,3970 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - transmission_interface/SimpleTransmission - - hardware_interface/EffortJointInterface - - - 1.0 - - - - Gazebo/FlatBlack - 1000000.0 - 100.0 - 1.0 - 1.0 - 1 0 0 - 1.0 - 0.00 - - - Gazebo/FlatBlack - 1000000.0 - 100.0 - 1.0 - 1.0 - 1 0 0 - 1.0 - 0.00 - - - - $(arg sim_ns) - - - - - -0.050000 -0.010000 0.000000 -1.5708 0.000000 -3.141592 - - 0.57 - - 620 - 480 - - - 0.001000 - 100.000000 - - - 1 - 30.000000 - 1 - - true - 30 - camera - camera/image_proc - camera_info - camera_optical_frame - 0.07 - 0.0 - 0.0 - 0.0 - 0.0 - 0.0 - - - - - true - - true - 100 - true - __default_topic__ - - imu - imu_frame_uncalibrated - 100.0 - 0.0 - 0 0 0 - 0 0 0 - imu_frame_uncalibrated - - 0 0 0 0 0 0 - - - - true - - true - 100 - true - __default_topic__ - - imu_head - head - 100.0 - 0.0 - 0 0 0 - 0 0 0 - head - - 0 0 0 0 0 0 - - - - - true - 100.0 - llb - sim_strain_gauges/llb - $(arg sim_ns) - - - true - 100.0 - llf - sim_strain_gauges/llf - $(arg sim_ns) - - - true - 100.0 - lrf - sim_strain_gauges/lrf - $(arg sim_ns) - - - true - 100.0 - lrb - sim_strain_gauges/lrb - $(arg sim_ns) - - - true - 100.0 - rlb - sim_strain_gauges/rlb - $(arg sim_ns) - - - true - 100.0 - rlf - sim_strain_gauges/rlf - $(arg sim_ns) - - - true - 100.0 - rrf - sim_strain_gauges/rrf - $(arg sim_ns) - - - true - 100.0 - rrb - sim_strain_gauges/rrb - $(arg sim_ns) - - - diff --git a/src/bitbots_robot/wolfgang_description/urdf/sea_connector.scad b/src/bitbots_robot/wolfgang_description/urdf/sea_connector.scad deleted file mode 100644 index e0b9bf95af..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/sea_connector.scad +++ /dev/null @@ -1,8 +0,0 @@ -% scale(1000) import("sea_connector.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -translate([0,0,2.5]){ - cylinder(r=25, h=5, center=true); -} -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/sea_connector.stl b/src/bitbots_robot/wolfgang_description/urdf/sea_connector.stl deleted file mode 100644 index 6330b82153..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/sea_connector.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/sea_ninjaflex.scad b/src/bitbots_robot/wolfgang_description/urdf/sea_ninjaflex.scad deleted file mode 100644 index 359cd9352b..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/sea_ninjaflex.scad +++ /dev/null @@ -1,8 +0,0 @@ -% scale(1000) import("sea_ninjaflex.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -translate([0,0,4.5]){ - cylinder(r=25, h=9, center=true); -} -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/sea_ninjaflex.stl b/src/bitbots_robot/wolfgang_description/urdf/sea_ninjaflex.stl deleted file mode 100644 index f133c5361b..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/sea_ninjaflex.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/shoulder_connector.scad b/src/bitbots_robot/wolfgang_description/urdf/shoulder_connector.scad deleted file mode 100644 index 05a5ca03cd..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/shoulder_connector.scad +++ /dev/null @@ -1,17 +0,0 @@ -% scale(1000) import("shoulder_connector.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - -translate([0,1.5/2,0]) { - cube([63.90000, 1.5, 34], center=true); -} - -translate([63.9/2-1.5/2,45/2,0]) { - cube([1.5, 45, 28], center=true); -} -translate([-(63.9/2-1.5/2),45/2,0]) { - cube([1.5, 45, 28], center=true); -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/shoulder_connector.stl b/src/bitbots_robot/wolfgang_description/urdf/shoulder_connector.stl deleted file mode 100644 index a40dfeeed3..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/shoulder_connector.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/speaker_holder.scad b/src/bitbots_robot/wolfgang_description/urdf/speaker_holder.scad deleted file mode 100644 index 1d5fc4e712..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/speaker_holder.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("speaker_holder.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/speaker_holder.stl b/src/bitbots_robot/wolfgang_description/urdf/speaker_holder.stl deleted file mode 100644 index 047963389c..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/speaker_holder.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/spring_holder_lower.scad b/src/bitbots_robot/wolfgang_description/urdf/spring_holder_lower.scad deleted file mode 100644 index 0862dc9bc1..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/spring_holder_lower.scad +++ /dev/null @@ -1,13 +0,0 @@ -% scale(1000) import("spring_holder_lower.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - - -translate([-17.3,-6.80000-9.1,89.92880-3]){ -rotate([0,-5,0]){ - cube([14, 9.1, 31]); -} -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/spring_holder_lower.stl b/src/bitbots_robot/wolfgang_description/urdf/spring_holder_lower.stl deleted file mode 100644 index 799e36c116..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/spring_holder_lower.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/spring_holder_upper.scad b/src/bitbots_robot/wolfgang_description/urdf/spring_holder_upper.scad deleted file mode 100644 index ddfad13cff..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/spring_holder_upper.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("spring_holder_upper.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -cylinder(r=14, h=22); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/spring_holder_upper.stl b/src/bitbots_robot/wolfgang_description/urdf/spring_holder_upper.stl deleted file mode 100644 index dfd73887a3..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/spring_holder_upper.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/springholder_bottom.scad b/src/bitbots_robot/wolfgang_description/urdf/springholder_bottom.scad deleted file mode 100644 index 7788ad920c..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/springholder_bottom.scad +++ /dev/null @@ -1,10 +0,0 @@ -% scale(1000) import("springholder_bottom.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - -rotate([90,0,0]){ - cylinder(r=15, h=2.7); -} diff --git a/src/bitbots_robot/wolfgang_description/urdf/springholder_bottom.stl b/src/bitbots_robot/wolfgang_description/urdf/springholder_bottom.stl deleted file mode 100644 index 058d88c8ea..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/springholder_bottom.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/springholder_new.scad b/src/bitbots_robot/wolfgang_description/urdf/springholder_new.scad deleted file mode 100644 index 56e6d97eb4..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/springholder_new.scad +++ /dev/null @@ -1,18 +0,0 @@ -% scale(1000) import("springholder_new.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - -translate([0,-22+3/2,170]){ - rotate([90,0,0]){ - cylinder(r=33/2, h=3, center=true); - } -} - -translate([0,-22+16.3/2+3,170]){ - rotate([90,0,0]){ - cylinder(r=21/2, h=16.3, center=true); - } -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/springholder_new.stl b/src/bitbots_robot/wolfgang_description/urdf/springholder_new.stl deleted file mode 100644 index ba6d42cba2..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/springholder_new.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/thrustbearingholder.scad b/src/bitbots_robot/wolfgang_description/urdf/thrustbearingholder.scad deleted file mode 100644 index 7287ac044f..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/thrustbearingholder.scad +++ /dev/null @@ -1,6 +0,0 @@ -% scale(1000) import("thrustbearingholder.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/thrustbearingholder.stl b/src/bitbots_robot/wolfgang_description/urdf/thrustbearingholder.stl deleted file mode 100644 index 37c728c3c4..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/thrustbearingholder.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/torso_bottom.scad b/src/bitbots_robot/wolfgang_description/urdf/torso_bottom.scad deleted file mode 100644 index 795e336496..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/torso_bottom.scad +++ /dev/null @@ -1,8 +0,0 @@ -% scale(1000) import("torso_bottom.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -translate([0,-150,0]){ -cube([120, 150, 80]); -} -// cylinder(r=10, h=10, center=true); -// sphere(10); diff --git a/src/bitbots_robot/wolfgang_description/urdf/torso_bottom.stl b/src/bitbots_robot/wolfgang_description/urdf/torso_bottom.stl deleted file mode 100644 index 229d6e0f68..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/torso_bottom.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_left.scad b/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_left.scad deleted file mode 100644 index 581e011813..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_left.scad +++ /dev/null @@ -1,27 +0,0 @@ -% scale(1000) import("torso_bumper_left.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: - -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([19/2, 73/2, 13/2]) cube([19, 73, 13], center=true); - -translate([0,36.50000,40+3]){ - rotate([180,0,0]){ - rotate([180-140.582606, 0, 0]){ - translate([19/2, 46.87946/2, 5/2]) cube([19, 46.87946, 5], center=true); - } -} -} - - - -translate([0,-sin(140.582606)*5,cos(140.582606)*5]){ - translate([0,36.50000,40+3]){ - rotate([180,0,0]){ - rotate([140.582606, 0, 0]){ - translate([19/2, 46.87946/2, 5/2]) cube([19, 46.87946, 5], center=true); - } -} -} -} diff --git a/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_left.stl b/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_left.stl deleted file mode 100644 index 1abead395c..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_left.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_right.scad b/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_right.scad deleted file mode 100644 index 9756a451f2..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_right.scad +++ /dev/null @@ -1,30 +0,0 @@ -% scale(1000) import("torso_bumper_right.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([-19,0,0]){ -translate([19/2, 73/2, 13/2]) cube([19, 73, 13], center=true); - -translate([0,36.50000,40+3]){ - rotate([180,0,0]){ - rotate([180-140.582606, 0, 0]){ - translate([19/2, 46.87946/2, 5/2]) cube([19, 46.87946, 5], center=true); - } -} -} - - - -translate([0,-sin(140.582606)*5,cos(140.582606)*5]){ - translate([0,36.50000,40+3]){ - rotate([180,0,0]){ - rotate([140.582606, 0, 0]){ - translate([19/2, 46.87946/2, 5/2]) cube([19, 46.87946, 5], center=true); - } -} -} -} - -} diff --git a/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_right.stl b/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_right.stl deleted file mode 100644 index 96328fe4d0..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/torso_bumper_right.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/torso_top.scad b/src/bitbots_robot/wolfgang_description/urdf/torso_top.scad deleted file mode 100644 index 6ffba44a60..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/torso_top.scad +++ /dev/null @@ -1,23 +0,0 @@ -% scale(1000) import("torso_top.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - -translate([0,-135,0]){ - cube([150, 125, 115]); -} -translate([0,-135,5]){ - rotate([180-174.709919,0,0]) { - cube([150, 10, cos(180-174.709919)*(60-5)]); - } -} - -translate([0,-135-5,60]){ - cube([150, 10, 65.45031]); -} - -translate([0,-135-5,115]){ - cube([150, 136, 150-115]); -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/torso_top.stl b/src/bitbots_robot/wolfgang_description/urdf/torso_top.stl deleted file mode 100644 index 6813943177..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/torso_top.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/upper_arm.scad b/src/bitbots_robot/wolfgang_description/urdf/upper_arm.scad deleted file mode 100644 index 520a07bf93..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/upper_arm.scad +++ /dev/null @@ -1,22 +0,0 @@ -% scale(1000) import("upper_arm.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([0,-2.25/2-0.25000,0]){ -rotate([90,0,0]){ - cylinder(r=20, h=2.25, center=true); -} -} - - -translate([0,-2.25/2-0.25000,130]){ -rotate([90,0,0]){ - cylinder(r=20, h=2.25, center=true); -} -} - -translate([0,-2.25/2-0.25000,130/2]){ - cube([40, 2.25, 130], center=true); -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/upper_arm.stl b/src/bitbots_robot/wolfgang_description/urdf/upper_arm.stl deleted file mode 100644 index 6c42126dd4..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/upper_arm.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/upper_arm_spacer.scad b/src/bitbots_robot/wolfgang_description/urdf/upper_arm_spacer.scad deleted file mode 100644 index 73600c1f3f..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/upper_arm_spacer.scad +++ /dev/null @@ -1,10 +0,0 @@ -% scale(1000) import("upper_arm_spacer.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - -translate([-4,-23+4,0]){ - cube([37.60000, 23, 46]); -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/upper_arm_spacer.stl b/src/bitbots_robot/wolfgang_description/urdf/upper_arm_spacer.stl deleted file mode 100644 index ee3be5ab48..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/upper_arm_spacer.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/upper_leg.scad b/src/bitbots_robot/wolfgang_description/urdf/upper_leg.scad deleted file mode 100644 index ff0964de08..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/upper_leg.scad +++ /dev/null @@ -1,107 +0,0 @@ -% scale(1000) import("upper_leg.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([0,-1,0]){ -rotate([90,0,0]){ - cylinder(r=18, h=2, center=true); -} -} - -/*translate([19.32474,0,-25.75647]){ - rotate([90,0,0]){ - cylinder(r=50, h=2, center=true); - } -}*/ - -translate([9.329,-1,-143]){ - rotate([90,0,0]){ - cylinder(r=10, h=2, center=true); - } -} -translate([14.84033,-1,-132.65892]){ - rotate([90,0,0]){ - cylinder(r=20, h=2, center=true); - } -} -//38, 2,sqrt(pow(108.94147,2)-pow(38,2)) -translate([34.15884-cos(-15)*38,-2,-127.48254+sin(-15)*38]){ - rotate([0,-15,0]){ - translate([38/2, 1, sqrt(pow(108.94147,2)-pow(38,2))/2]) { - cube([38, 2,sqrt(pow(108.94147,2)-pow(38,2))], center=true); - } - } -} - -translate([5.15043,-2,-19.22168]){ - rotate([0,-15+180,0]){ - translate([10/2,2/2,10/2]){ - cube([10,2,10], center=true); - } - } -} - -translate([9.329,-1,-143]){ - rotate([90,0,0]){ - cylinder(r=10, h=2, center=true); - } -} - -num_circ = 10; -r1 = 50; -r2 = 17; -step = 3; -initial_angle = 45; - -translate([19.32474-cos(initial_angle)*(r1-r2), - -1, - -25.75647+sin(initial_angle)*(r1-r2)]){ - rotate([90,0,0]){ - cylinder(r=r2, h=2, center=true); - } -} -translate([19.32474-cos(initial_angle-10)*(r1-r2), - -1, - -25.75647+sin(initial_angle-10)*(r1-r2)]){ - rotate([90,0,0]){ - cylinder(r=r2, h=2, center=true); - } -} -translate([19.32474-cos(initial_angle-20)*(r1-r2), - -1, - -25.75647+sin(initial_angle-20)*(r1-r2)]){ - rotate([90,0,0]){ - cylinder(r=r2, h=2, center=true); - } -} -translate([19.32474-cos(initial_angle-30)*(r1-r2), - -1, - -25.75647+sin(initial_angle-30)*(r1-r2)]){ - rotate([90,0,0]){ - cylinder(r=r2, h=2, center=true); - } -} -translate([19.32474-cos(initial_angle-40)*(r1-r2), - -1, - -25.75647+sin(initial_angle-40)*(r1-r2)]){ - rotate([90,0,0]){ - cylinder(r=r2, h=2, center=true); - } -} -translate([19.32474-cos(initial_angle-50)*(r1-r2), - -1, - -25.75647+sin(initial_angle-50)*(r1-r2)]){ - rotate([90,0,0]){ - cylinder(r=r2, h=2, center=true); - } -} -translate([19.32474-cos(initial_angle-60)*(r1-r2), - -1, - -25.75647+sin(initial_angle-60)*(r1-r2)]){ - rotate([90,0,0]){ - cylinder(r=r2, h=2, center=true); - } -} - diff --git a/src/bitbots_robot/wolfgang_description/urdf/upper_leg.stl b/src/bitbots_robot/wolfgang_description/urdf/upper_leg.stl deleted file mode 100644 index 93698c335c..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/upper_leg.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/upper_leg_spacer.scad b/src/bitbots_robot/wolfgang_description/urdf/upper_leg_spacer.scad deleted file mode 100644 index 133087e5f4..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/upper_leg_spacer.scad +++ /dev/null @@ -1,10 +0,0 @@ -% scale(1000) import("upper_leg_spacer.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); - -translate([-1.65,-4,0]){ -cube([35.15, 38, 53]); -} \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_description/urdf/upper_leg_spacer.stl b/src/bitbots_robot/wolfgang_description/urdf/upper_leg_spacer.stl deleted file mode 100644 index 8472919b77..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/upper_leg_spacer.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_description/urdf/xh-540.scad b/src/bitbots_robot/wolfgang_description/urdf/xh-540.scad deleted file mode 100644 index 3bc0498c96..0000000000 --- a/src/bitbots_robot/wolfgang_description/urdf/xh-540.scad +++ /dev/null @@ -1,9 +0,0 @@ -% scale(1000) import("xh-540.stl"); - -// Append pure shapes (cube, cylinder and sphere), e.g: -// cube([10, 10, 10], center=true); -// cylinder(r=10, h=10, center=true); -// sphere(10); -translate([0,-58.5/2+13.75,0]){ -cube([34, 58.5, 44], center=true); -} diff --git a/src/bitbots_robot/wolfgang_description/urdf/xh-540.stl b/src/bitbots_robot/wolfgang_description/urdf/xh-540.stl deleted file mode 100644 index 5e6fb87b64..0000000000 Binary files a/src/bitbots_robot/wolfgang_description/urdf/xh-540.stl and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_moveit_config/.setup_assistant b/src/bitbots_robot/wolfgang_moveit_config/.setup_assistant deleted file mode 100644 index d41831337b..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/.setup_assistant +++ /dev/null @@ -1,11 +0,0 @@ -moveit_setup_assistant_config: - URDF: - package: wolfgang_description - relative_path: urdf/robot.urdf - xacro_args: "" - SRDF: - relative_path: config/wolfgang.srdf - CONFIG: - author_name: Marc Bestmann - author_email: bestmann@informatik.uni-hamburg.de - generated_timestamp: 1601969583 \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_moveit_config/CMakeLists.txt b/src/bitbots_robot/wolfgang_moveit_config/CMakeLists.txt deleted file mode 100644 index 335eb9db80..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(wolfgang_moveit_config) - -find_package(ament_cmake REQUIRED) -find_package(bitbots_docs REQUIRED) - -enable_bitbots_docs() - -install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) - -ament_package() diff --git a/src/bitbots_robot/wolfgang_moveit_config/config/fake_controllers.yaml b/src/bitbots_robot/wolfgang_moveit_config/config/fake_controllers.yaml deleted file mode 100644 index 47b9083c5a..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/config/fake_controllers.yaml +++ /dev/null @@ -1,115 +0,0 @@ -trajectory_execution: - allowed_execution_duration_scaling: 1.2 - allowed_goal_duration_margin: 0.5 - allowed_start_tolerance: 0.01 - -moveit_controller_manager: moveit_simple_controller_manager/MoveItSimpleControllerManager - -controller_names: - - fake_LeftLeg_controller - - fake_RightLeg_controller - - fake_Legs_controller - - fake_RightArm_controller - - fake_LeftArm_controller - - fake_Arms_controller - - fake_Head_controller - - fake_All_controller - -fake_LeftLeg_controller: - action_ns: fake_LeftLeg_controller - type: FollowJointTrajectory - default: true - joints: - - LHipYaw - - LHipRoll - - LHipPitch - - LKnee - - LAnklePitch - - LAnkleRoll -fake_RightLeg_controller: - action_ns: fake_RightLeg_controller - type: FollowJointTrajectory - default: true - joints: - - RHipYaw - - RHipRoll - - RHipPitch - - RKnee - - RAnklePitch - - RAnkleRoll -fake_Legs_controller: - action_ns: fake_Legs_controller - type: FollowJointTrajectory - default: false - joints: - - LHipYaw - - LHipRoll - - LHipPitch - - LKnee - - LAnklePitch - - LAnkleRoll - - RHipYaw - - RHipRoll - - RHipPitch - - RKnee - - RAnklePitch - - RAnkleRoll -fake_RightArm_controller: - action_ns: fake_RightArm_controller - type: FollowJointTrajectory - default: true - joints: - - RShoulderPitch - - RShoulderRoll - - RElbow -fake_LeftArm_controller: - action_ns: fake_LeftArm_controller - type: FollowJointTrajectory - default: true - joints: - - LShoulderPitch - - LShoulderRoll - - LElbow -fake_Arms_controller: - action_ns: fake_Arms_controller - type: FollowJointTrajectory - default: false - joints: - - LShoulderPitch - - LShoulderRoll - - LElbow - - RShoulderPitch - - RShoulderRoll - - RElbow -fake_Head_controller: - action_ns: fake_Head_controller - type: FollowJointTrajectory - default: true - joints: - - HeadPan - - HeadTilt -fake_All_controller: - action_ns: fake_All_controller - type: FollowJointTrajectory - default: false - joints: - - HeadPan - - HeadTilt - - LHipYaw - - LHipRoll - - LHipPitch - - LKnee - - LAnklePitch - - LAnkleRoll - - LShoulderPitch - - LShoulderRoll - - LElbow - - RHipYaw - - RHipRoll - - RHipPitch - - RKnee - - RAnklePitch - - RAnkleRoll - - RShoulderPitch - - RShoulderRoll - - RElbow diff --git a/src/bitbots_robot/wolfgang_moveit_config/config/joint_limits.yaml b/src/bitbots_robot/wolfgang_moveit_config/config/joint_limits.yaml deleted file mode 100644 index 391cc61dbb..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/config/joint_limits.yaml +++ /dev/null @@ -1,105 +0,0 @@ -# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed -# Specific joint properties can be changed with the keys [max_position, min_position, max_velocity, max_acceleration] -# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits] -robot_description_planning: - joint_limits: - HeadPan: - has_velocity_limits: true - max_velocity: 10.33 - has_acceleration_limits: false - max_acceleration: 0 - HeadTilt: - has_velocity_limits: true - max_velocity: 10.33 - has_acceleration_limits: false - max_acceleration: 0 - LAnklePitch: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - LAnkleRoll: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - LElbow: - has_velocity_limits: true - max_velocity: 10.33 - has_acceleration_limits: false - max_acceleration: 0 - LHipPitch: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - LHipRoll: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - LHipYaw: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - LKnee: - has_velocity_limits: true - max_velocity: 10 - has_acceleration_limits: false - max_acceleration: 0 - LShoulderPitch: - has_velocity_limits: true - max_velocity: 10.33 - has_acceleration_limits: false - max_acceleration: 0 - LShoulderRoll: - has_velocity_limits: true - max_velocity: 10.33 - has_acceleration_limits: false - max_acceleration: 0 - RAnklePitch: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - RAnkleRoll: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - RElbow: - has_velocity_limits: true - max_velocity: 10.33 - has_acceleration_limits: false - max_acceleration: 0 - RHipPitch: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - RHipRoll: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - RHipYaw: - has_velocity_limits: true - max_velocity: 8.220000000000001 - has_acceleration_limits: false - max_acceleration: 0 - RKnee: - has_velocity_limits: true - max_velocity: 10 - has_acceleration_limits: false - max_acceleration: 0 - RShoulderPitch: - has_velocity_limits: true - max_velocity: 10.33 - has_acceleration_limits: false - max_acceleration: 0 - RShoulderRoll: - has_velocity_limits: true - max_velocity: 10.33 - has_acceleration_limits: false - max_acceleration: 0 \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_moveit_config/config/kinematics.yaml b/src/bitbots_robot/wolfgang_moveit_config/config/kinematics.yaml deleted file mode 100644 index c595bf4e4f..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/config/kinematics.yaml +++ /dev/null @@ -1,29 +0,0 @@ -LeftLeg: - kinematics_solver: bio_ik/BioIKKinematicsPlugin # kdl_kinematics_plugin/KDLKinematicsPlugin - kinematics_solver_search_resolution: 0.00001 - kinematics_solver_timeout: 0.01 -RightLeg: - kinematics_solver: bio_ik/BioIKKinematicsPlugin # kdl_kinematics_plugin/KDLKinematicsPlugin - kinematics_solver_search_resolution: 0.00001 - kinematics_solver_timeout: 0.01 -Legs: - kinematics_solver_search_resolution: 0.0001 - kinematics_solver_timeout: 0.005 -RightArm: - kinematics_solver: bio_ik/BioIKKinematicsPlugin - kinematics_solver_search_resolution: 0.00001 - kinematics_solver_timeout: 0.01 -LeftArm: - kinematics_solver: bio_ik/BioIKKinematicsPlugin - kinematics_solver_search_resolution: 0.00001 - kinematics_solver_timeout: 0.01 -Arms: - kinematics_solver_search_resolution: 0.00001 - kinematics_solver_timeout: 0.01 -Head: - kinematics_solver: bio_ik/BioIKKinematicsPlugin - kinematics_solver_search_resolution: 0.001 - kinematics_solver_timeout: 0.001 -All: - kinematics_solver_search_resolution: 0.005 - kinematics_solver_timeout: 0.005 diff --git a/src/bitbots_robot/wolfgang_moveit_config/config/ompl_planning.yaml b/src/bitbots_robot/wolfgang_moveit_config/config/ompl_planning.yaml deleted file mode 100644 index cb6714b7ad..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/config/ompl_planning.yaml +++ /dev/null @@ -1,346 +0,0 @@ -planner_configs: - SBL: - type: geometric::SBL - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - EST: - type: geometric::EST - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0 setup() - goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 - LBKPIECE: - type: geometric::LBKPIECE - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 - min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 - BKPIECE: - type: geometric::BKPIECE - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 - failed_expansion_score_factor: 0.5 # When extending motion fails, scale score by factor. default: 0.5 - min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 - KPIECE: - type: geometric::KPIECE - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 - border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 (0.0,1.] - failed_expansion_score_factor: 0.5 # When extending motion fails, scale score by factor. default: 0.5 - min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5 - RRT: - type: geometric::RRT - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 - RRTConnect: - type: geometric::RRTConnect - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - RRTstar: - type: geometric::RRTstar - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 - delay_collision_checking: 1 # Stop collision checking as soon as C-free parent found. default 1 - TRRT: - type: geometric::TRRT - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05 - max_states_failed: 10 # when to start increasing temp. default: 10 - temp_change_factor: 2.0 # how much to increase or decrease temp. default: 2.0 - min_temperature: 10e-10 # lower limit of temp change. default: 10e-10 - init_temperature: 10e-6 # initial temperature. default: 10e-6 - frountier_threshold: 0.0 # dist new state to nearest neighbor to disqualify as frontier. default: 0.0 set in setup() - frountierNodeRatio: 0.1 # 1/10, or 1 nonfrontier for every 10 frontier. default: 0.1 - k_constant: 0.0 # value used to normalize expresssion. default: 0.0 set in setup() - PRM: - type: geometric::PRM - max_nearest_neighbors: 10 # use k nearest neighbors. default: 10 - PRMstar: - type: geometric::PRMstar - FMT: - type: geometric::FMT - num_samples: 1000 # number of states that the planner should sample. default: 1000 - radius_multiplier: 1.1 # multiplier used for the nearest neighbors search radius. default: 1.1 - nearest_k: 1 # use Knearest strategy. default: 1 - cache_cc: 1 # use collision checking cache. default: 1 - heuristics: 0 # activate cost to go heuristics. default: 0 - extended_fmt: 1 # activate the extended FMT*: adding new samples if planner does not finish successfully. default: 1 - BFMT: - type: geometric::BFMT - num_samples: 1000 # number of states that the planner should sample. default: 1000 - radius_multiplier: 1.0 # multiplier used for the nearest neighbors search radius. default: 1.0 - nearest_k: 1 # use the Knearest strategy. default: 1 - balanced: 0 # exploration strategy: balanced true expands one tree every iteration. False will select the tree with lowest maximum cost to go. default: 1 - optimality: 1 # termination strategy: optimality true finishes when the best possible path is found. Otherwise, the algorithm will finish when the first feasible path is found. default: 1 - heuristics: 1 # activates cost to go heuristics. default: 1 - cache_cc: 1 # use the collision checking cache. default: 1 - extended_fmt: 1 # Activates the extended FMT*: adding new samples if planner does not finish successfully. default: 1 - PDST: - type: geometric::PDST - STRIDE: - type: geometric::STRIDE - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 - use_projected_distance: 0 # whether nearest neighbors are computed based on distances in a projection of the state rather distances in the state space itself. default: 0 - degree: 16 # desired degree of a node in the Geometric Near-neightbor Access Tree (GNAT). default: 16 - max_degree: 18 # max degree of a node in the GNAT. default: 12 - min_degree: 12 # min degree of a node in the GNAT. default: 12 - max_pts_per_leaf: 6 # max points per leaf in the GNAT. default: 6 - estimated_dimension: 0.0 # estimated dimension of the free space. default: 0.0 - min_valid_path_fraction: 0.2 # Accept partially valid moves above fraction. default: 0.2 - BiTRRT: - type: geometric::BiTRRT - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - temp_change_factor: 0.1 # how much to increase or decrease temp. default: 0.1 - init_temperature: 100 # initial temperature. default: 100 - frountier_threshold: 0.0 # dist new state to nearest neighbor to disqualify as frontier. default: 0.0 set in setup() - frountier_node_ratio: 0.1 # 1/10, or 1 nonfrontier for every 10 frontier. default: 0.1 - cost_threshold: 1e300 # the cost threshold. Any motion cost that is not better will not be expanded. default: inf - LBTRRT: - type: geometric::LBTRRT - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 - epsilon: 0.4 # optimality approximation factor. default: 0.4 - BiEST: - type: geometric::BiEST - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - ProjEST: - type: geometric::ProjEST - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05 - LazyPRM: - type: geometric::LazyPRM - range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup() - LazyPRMstar: - type: geometric::LazyPRMstar - SPARS: - type: geometric::SPARS - stretch_factor: 3.0 # roadmap spanner stretch factor. multiplicative upper bound on path quality. It does not make sense to make this parameter more than 3. default: 3.0 - sparse_delta_fraction: 0.25 # delta fraction for connection distance. This value represents the visibility range of sparse samples. default: 0.25 - dense_delta_fraction: 0.001 # delta fraction for interface detection. default: 0.001 - max_failures: 1000 # maximum consecutive failure limit. default: 1000 - SPARStwo: - type: geometric::SPARStwo - stretch_factor: 3.0 # roadmap spanner stretch factor. multiplicative upper bound on path quality. It does not make sense to make this parameter more than 3. default: 3.0 - sparse_delta_fraction: 0.25 # delta fraction for connection distance. This value represents the visibility range of sparse samples. default: 0.25 - dense_delta_fraction: 0.001 # delta fraction for interface detection. default: 0.001 - max_failures: 5000 # maximum consecutive failure limit. default: 5000 - LeftLeg: - default_planner_config: "" - planner_configs: - - SBL - - EST - - LBKPIECE - - BKPIECE - - KPIECE - - RRT - - RRTConnect - - RRTstar - - TRRT - - PRM - - PRMstar - - FMT - - BFMT - - PDST - - STRIDE - - BiTRRT - - LBTRRT - - BiEST - - ProjEST - - LazyPRM - - LazyPRMstar - - SPARS - - SPARStwo - projection_evaluator: joints(LHipYaw,LHipRoll) - longest_valid_segment_fraction: 0.005 - RightLeg: - default_planner_config: "" - planner_configs: - - SBL - - EST - - LBKPIECE - - BKPIECE - - KPIECE - - RRT - - RRTConnect - - RRTstar - - TRRT - - PRM - - PRMstar - - FMT - - BFMT - - PDST - - STRIDE - - BiTRRT - - LBTRRT - - BiEST - - ProjEST - - LazyPRM - - LazyPRMstar - - SPARS - - SPARStwo - projection_evaluator: joints(RHipYaw,RHipRoll) - longest_valid_segment_fraction: 0.005 - Legs: - default_planner_config: "" - planner_configs: - - SBL - - EST - - LBKPIECE - - BKPIECE - - KPIECE - - RRT - - RRTConnect - - RRTstar - - TRRT - - PRM - - PRMstar - - FMT - - BFMT - - PDST - - STRIDE - - BiTRRT - - LBTRRT - - BiEST - - ProjEST - - LazyPRM - - LazyPRMstar - - SPARS - - SPARStwo - projection_evaluator: joints(LHipYaw,LHipRoll) - longest_valid_segment_fraction: 0.005 - RightArm: - default_planner_config: "" - planner_configs: - - SBL - - EST - - LBKPIECE - - BKPIECE - - KPIECE - - RRT - - RRTConnect - - RRTstar - - TRRT - - PRM - - PRMstar - - FMT - - BFMT - - PDST - - STRIDE - - BiTRRT - - LBTRRT - - BiEST - - ProjEST - - LazyPRM - - LazyPRMstar - - SPARS - - SPARStwo - projection_evaluator: joints(RShoulderPitch,RShoulderRoll) - longest_valid_segment_fraction: 0.005 - LeftArm: - default_planner_config: "" - planner_configs: - - SBL - - EST - - LBKPIECE - - BKPIECE - - KPIECE - - RRT - - RRTConnect - - RRTstar - - TRRT - - PRM - - PRMstar - - FMT - - BFMT - - PDST - - STRIDE - - BiTRRT - - LBTRRT - - BiEST - - ProjEST - - LazyPRM - - LazyPRMstar - - SPARS - - SPARStwo - projection_evaluator: joints(LShoulderPitch,LShoulderRoll) - longest_valid_segment_fraction: 0.005 - Arms: - default_planner_config: "" - planner_configs: - - SBL - - EST - - LBKPIECE - - BKPIECE - - KPIECE - - RRT - - RRTConnect - - RRTstar - - TRRT - - PRM - - PRMstar - - FMT - - BFMT - - PDST - - STRIDE - - BiTRRT - - LBTRRT - - BiEST - - ProjEST - - LazyPRM - - LazyPRMstar - - SPARS - - SPARStwo - projection_evaluator: joints(LShoulderPitch,LShoulderRoll) - longest_valid_segment_fraction: 0.005 - Head: - default_planner_config: "" - planner_configs: - - SBL - - EST - - LBKPIECE - - BKPIECE - - KPIECE - - RRT - - RRTConnect - - RRTstar - - TRRT - - PRM - - PRMstar - - FMT - - BFMT - - PDST - - STRIDE - - BiTRRT - - LBTRRT - - BiEST - - ProjEST - - LazyPRM - - LazyPRMstar - - SPARS - - SPARStwo - projection_evaluator: joints(HeadPan,HeadTilt) - longest_valid_segment_fraction: 0.005 - All: - default_planner_config: "" - planner_configs: - - SBL - - EST - - LBKPIECE - - BKPIECE - - KPIECE - - RRT - - RRTConnect - - RRTstar - - TRRT - - PRM - - PRMstar - - FMT - - BFMT - - PDST - - STRIDE - - BiTRRT - - LBTRRT - - BiEST - - ProjEST - - LazyPRM - - LazyPRMstar - - SPARS - - SPARStwo - projection_evaluator: joints(HeadPan,HeadTilt) - longest_valid_segment_fraction: 0.005 \ No newline at end of file diff --git a/src/bitbots_robot/wolfgang_moveit_config/config/sensors_3d.yaml b/src/bitbots_robot/wolfgang_moveit_config/config/sensors_3d.yaml deleted file mode 100644 index a53cf6c398..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/config/sensors_3d.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# The name of this file shouldn't be changed, or else the Setup Assistant won't detect it -sensors: - - "dummy" - -# This is needed to suppress an error message during every launch -dummy: - sensor_plugin: "~" diff --git a/src/bitbots_robot/wolfgang_moveit_config/config/wolfgang.srdf b/src/bitbots_robot/wolfgang_moveit_config/config/wolfgang.srdf deleted file mode 100644 index 2ac9977126..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/config/wolfgang.srdf +++ /dev/null @@ -1,327 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bitbots_robot/wolfgang_moveit_config/docs/_static/logo.png b/src/bitbots_robot/wolfgang_moveit_config/docs/_static/logo.png deleted file mode 100644 index f8afdd5d06..0000000000 Binary files a/src/bitbots_robot/wolfgang_moveit_config/docs/_static/logo.png and /dev/null differ diff --git a/src/bitbots_robot/wolfgang_moveit_config/docs/conf.py b/src/bitbots_robot/wolfgang_moveit_config/docs/conf.py deleted file mode 100644 index 0b6342a9ce..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/docs/conf.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Full list of options at http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -import catkin_pkg.package -from exhale import utils - -package_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -catkin_package = catkin_pkg.package.parse_package( - os.path.join(package_dir, catkin_pkg.package.PACKAGE_MANIFEST_FILENAME) -) -sys.path.insert(0, os.path.abspath(os.path.join(package_dir, "src"))) - - -# -- Helper functions -------------------------------------------------------- - - -def count_files(): - """:returns tuple of (num_py, num_cpp)""" - num_py = 0 - num_cpp = 0 - - for _, _, files in os.walk(os.path.join(package_dir, "src")): - for f in files: - if f.endswith(".py"): - num_py += 1 - for _, _, files in os.walk(os.path.join(package_dir, "include")): - for f in files: - if f.endswith(".h") or f.endswith(".hpp"): - num_cpp += 1 - - return num_py, num_cpp - - -# -- Project information ----------------------------------------------------- - -project = catkin_package.name -copyright = "2019, Bit-Bots" -author = ", ".join([a.name for a in catkin_package.authors]) - -# The short X.Y version -version = str(catkin_package.version) -# The full version, including alpha/beta/rc tags -release = str(catkin_package.version) - -# -- General configuration --------------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "sphinx.ext.autodoc", - "sphinx.ext.doctest", - "sphinx.ext.intersphinx", - "sphinx.ext.todo", - "sphinx.ext.coverage", - "sphinx.ext.imgmath", - "sphinx.ext.viewcode", - "sphinx_rtd_theme", -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = None - -# -- Exhale and Breath setup ------------------------------------------------- - -# Tell sphinx what the primary language being documented is. -num_files_py, num_files_cpp = count_files() -primary_domain = "py" if num_files_py >= num_files_cpp else "cpp" - -# Tell sphinx what the pygments highlight language should be. -highlight_language = primary_domain - -if num_files_cpp > 0: - extensions += [ - "breathe", - "exhale", - ] - - breathe_projects = {project: os.path.join("_build", "doxyoutput", "xml")} - breathe_default_project = project - - def specifications_for_kind(kind): - # Show all members for classes and structs - if kind == "class" or kind == "struct": - return [":members:", ":protected-members:", ":private-members:", ":undoc-members:"] - # An empty list signals to Exhale to use the defaults - else: - return [] - - exhale_args = { - # These arguments are required - "containmentFolder": "cppapi", - "rootFileName": "library_root.rst", - "rootFileTitle": "C++ Library API", - "doxygenStripFromPath": "..", - "customSpecificationsMapping": utils.makeCustomSpecificationsMapping(specifications_for_kind), - # Suggested optional arguments - "createTreeView": True, - "exhaleExecutesDoxygen": True, - "exhaleDoxygenStdin": "INPUT = {}".format(os.path.join(package_dir, "include")), - } - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# The default sidebars (for documents that don't match any pattern) are -# defined by theme itself. Builtin themes are using these templates by -# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', -# 'searchbox.html']``. -# -# html_sidebars = {} - -html_logo = os.path.join("_static", "logo.png") -html_favicon = os.path.join("_static", "logo.png") - - -# -- Options for intersphinx extension --------------------------------------- - -# Example configuration for intersphinx: refer to the Python standard library. -intersphinx_mapping = {"https://docs.python.org/": None} - -# -- Options for todo extension ---------------------------------------------- - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - -# -- RST Standard variables --------------------------------------------------- -rst_prolog = f".. |project| replace:: {project}\n" -rst_prolog += ".. |description| replace:: {}\n".format(catkin_package.description.replace("\n\n", "\n")) -rst_prolog += ".. |modindex| replace:: {}\n".format( - ":ref:`modindex`" if num_files_py > 0 else "Python module index is not available" -) diff --git a/src/bitbots_robot/wolfgang_moveit_config/docs/index.rst b/src/bitbots_robot/wolfgang_moveit_config/docs/index.rst deleted file mode 100644 index e76aa433a2..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/docs/index.rst +++ /dev/null @@ -1,21 +0,0 @@ -Welcome to |project|'s documentation! -================================================ - -Description ------------ - -|description| - -.. toctree:: - :maxdepth: 2 - - cppapi/library_root - pyapi/modules - - -Indices and tables -================== - -* :ref:`genindex` -* |modindex| -* :ref:`search` diff --git a/src/bitbots_robot/wolfgang_moveit_config/package.xml b/src/bitbots_robot/wolfgang_moveit_config/package.xml deleted file mode 100644 index a1a33f9a1a..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/package.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - wolfgang_moveit_config - 0.3.0 - - An automatically generated package with all the configuration and launch files for using the wolfgang with the MoveIt! Motion Planning Framework - - Marc Bestmann - - BSD - - Marc Bestmann - - - ament_cmake - - moveit_ros_move_group - moveit_simple_controller_manager - moveit_kinematics - moveit_planners_ompl - moveit_ros_visualization - moveit_setup_assistant - joint_state_publisher - robot_state_publisher - tf2_ros - xacro - - - wolfgang_description - wolfgang_description - - - ament_cmake - - diff --git a/src/bitbots_robot/wolfgang_moveit_config/rosdoc.yaml b/src/bitbots_robot/wolfgang_moveit_config/rosdoc.yaml deleted file mode 100644 index 78feffe5e1..0000000000 --- a/src/bitbots_robot/wolfgang_moveit_config/rosdoc.yaml +++ /dev/null @@ -1,3 +0,0 @@ ---- -- builder: sphinx - sphinx_root_dir: doc \ No newline at end of file diff --git a/src/bitbots_simulation/bitbots_pybullet_sim/bitbots_pybullet_sim/ros_interface.py b/src/bitbots_simulation/bitbots_pybullet_sim/bitbots_pybullet_sim/ros_interface.py index e2339d6ad2..a084ad02a1 100644 --- a/src/bitbots_simulation/bitbots_pybullet_sim/bitbots_pybullet_sim/ros_interface.py +++ b/src/bitbots_simulation/bitbots_pybullet_sim/bitbots_pybullet_sim/ros_interface.py @@ -90,7 +90,7 @@ def __init__(self, node: Node, simulation, namespace="", declare_parameters=True # subscriber self.joint_goal_subscriber = self.node.create_subscription( - JointCommand, self.namespace + "DynamixelController/command", self.joint_goal_cb, 1 + JointCommand, self.namespace + "joint_command", self.joint_goal_cb, 1 ) self.reset_subscriber = self.node.create_subscription(Bool, self.namespace + "reset", self.reset_cb, 1) diff --git a/src/bitbots_simulation/bitbots_pybullet_sim/bitbots_pybullet_sim/simulation.py b/src/bitbots_simulation/bitbots_pybullet_sim/bitbots_pybullet_sim/simulation.py index 8c79474f65..50bbf3f4a7 100644 --- a/src/bitbots_simulation/bitbots_pybullet_sim/bitbots_pybullet_sim/simulation.py +++ b/src/bitbots_simulation/bitbots_pybullet_sim/bitbots_pybullet_sim/simulation.py @@ -203,7 +203,7 @@ def add_robot(self, physics_active=True): elif self.robot_type == "sigmaban": self.urdf_path = get_package_share_directory("sigmaban_description") + "/urdf/robot.urdf" else: - self.urdf_path = get_package_share_directory("wolfgang_description") + "/urdf/robot.urdf" + self.urdf_path = get_package_share_directory("piplus_description") + "/urdf/robot.urdf" robot_index = p.loadURDF( self.urdf_path, self.start_position, self.start_orientation, flags=flags, useFixedBase=not physics_active ) diff --git a/src/bitbots_simulation/bitbots_robocup_api/bitbots_robocup_api/command_proxy.py b/src/bitbots_simulation/bitbots_robocup_api/bitbots_robocup_api/command_proxy.py index f21aac47d2..db66080c63 100755 --- a/src/bitbots_simulation/bitbots_robocup_api/bitbots_robocup_api/command_proxy.py +++ b/src/bitbots_simulation/bitbots_robocup_api/bitbots_robocup_api/command_proxy.py @@ -15,7 +15,7 @@ def __init__(self): super().__init__("joint_command_proxy") # Get joints max velocities from URDF - urdf_path = os.path.join(get_package_share_directory("wolfgang_description"), "urdf", "robot.urdf") + urdf_path = os.path.join(get_package_share_directory("piplus_description"), "urdf", "robot.urdf") urdf = URDF.from_xml_file(urdf_path) self.joints_max_velocities = { joint.name: joint.limit.velocity for joint in urdf.joints if joint.type == "revolute" diff --git a/src/bitbots_simulation/bitbots_webots_sim/bitbots_webots_sim/webots_robot_controller.py b/src/bitbots_simulation/bitbots_webots_sim/bitbots_webots_sim/webots_robot_controller.py index c158cb9403..c7c4e25318 100644 --- a/src/bitbots_simulation/bitbots_webots_sim/bitbots_webots_sim/webots_robot_controller.py +++ b/src/bitbots_simulation/bitbots_webots_sim/bitbots_webots_sim/webots_robot_controller.py @@ -657,7 +657,7 @@ def __init__( ) self.cop_l_pub_ = self.ros_node.create_publisher(PointStamped, base_ns + "cop_l", 1) self.cop_r_pub_ = self.ros_node.create_publisher(PointStamped, base_ns + "cop_r", 1) - self.ros_node.create_subscription(JointCommand, base_ns + "DynamixelController/command", self.command_cb, 1) + self.ros_node.create_subscription(JointCommand, base_ns + "joint_command", self.command_cb, 1) else: self.l_sole_frame = "l_sole" self.r_sole_frame = "r_sole" diff --git a/src/bitbots_simulation/bitbots_webots_sim/bitbots_webots_sim/webots_supervisor_controller.py b/src/bitbots_simulation/bitbots_webots_sim/bitbots_webots_sim/webots_supervisor_controller.py index 8ab69da260..744a184937 100644 --- a/src/bitbots_simulation/bitbots_webots_sim/bitbots_webots_sim/webots_supervisor_controller.py +++ b/src/bitbots_simulation/bitbots_webots_sim/bitbots_webots_sim/webots_supervisor_controller.py @@ -3,13 +3,13 @@ import numpy as np import transforms3d from controller import Keyboard, Node, Supervisor -from gazebo_msgs.msg import ModelStates from geometry_msgs.msg import Point, Pose, Quaternion, Twist from rclpy.node import Node as RclpyNode from rclpy.time import Time from rosgraph_msgs.msg import Clock from std_srvs.srv import Empty +from bitbots_msgs.msg import ModelStates from bitbots_msgs.srv import SetObjectPose, SetObjectPosition, SimulatorPush G = 9.81 diff --git a/src/bitbots_simulation/bitbots_webots_sim/docs/index.rst b/src/bitbots_simulation/bitbots_webots_sim/docs/index.rst index f7ce365dc5..1b2b0be1a5 100644 --- a/src/bitbots_simulation/bitbots_webots_sim/docs/index.rst +++ b/src/bitbots_simulation/bitbots_webots_sim/docs/index.rst @@ -15,7 +15,7 @@ To remove these inertial components for webots2urdf there is a script which is l Instructions ------------ -First we need to have the current simplified URDF model. To get this look at the documentation of the wolfang_description package :doc:`../wolfgang_description/index`. +First we need to have the current simplified URDF model. To get this look at the documentation of the wolfang_description package :doc:`../piplus_description/index`. To use the URDF in webots we need to create a .proto file from the URDF. To do this clone the urdf2robot repository @@ -29,7 +29,7 @@ Run the script to adapt the urdf to be usable by webots2urdf .. code-block:: bash roscd bitbots_webots_sim - python scripts/fix_urdf_for_webots.py ../wolfgang_description/urdf/robot.urdf webots_robot.urdf + python scripts/fix_urdf_for_webots.py ../piplus_description/urdf/robot.urdf webots_robot.urdf Run the conversion script from urdf to proto file diff --git a/src/bitbots_simulation/bitbots_webots_sim/package.xml b/src/bitbots_simulation/bitbots_webots_sim/package.xml index 5c01aae189..5d6bac6167 100644 --- a/src/bitbots_simulation/bitbots_webots_sim/package.xml +++ b/src/bitbots_simulation/bitbots_webots_sim/package.xml @@ -21,7 +21,6 @@ rosgraph_msgs std_msgs bitbots_docs - gazebo_msgs geometry_msgs python3-transforms3d python3-numpy diff --git a/src/bitbots_simulation/bitbots_webots_sim/scripts/localization_faker.py b/src/bitbots_simulation/bitbots_webots_sim/scripts/localization_faker.py index 7832e25367..39b262edaa 100755 --- a/src/bitbots_simulation/bitbots_webots_sim/scripts/localization_faker.py +++ b/src/bitbots_simulation/bitbots_webots_sim/scripts/localization_faker.py @@ -4,11 +4,12 @@ import rclpy import tf2_ros import transforms3d -from gazebo_msgs.msg import ModelStates from geometry_msgs.msg import TransformStamped from rclpy.duration import Duration from rclpy.node import Node +from bitbots_msgs.msg import ModelStates + class LocalizationFaker(Node): def __init__(self): diff --git a/src/bitbots_vision/CMakeLists.txt b/src/bitbots_vision/CMakeLists.txt new file mode 100644 index 0000000000..59eb334d5f --- /dev/null +++ b/src/bitbots_vision/CMakeLists.txt @@ -0,0 +1,160 @@ +cmake_minimum_required(VERSION 3.8) +project(bitbots_vision) + +if(NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo) +endif() + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(ament_cmake REQUIRED) +find_package(backward_ros REQUIRED) +find_package(cv_bridge REQUIRED) +find_package(generate_parameter_library REQUIRED) +find_package(OpenCV REQUIRED) +find_package(rclcpp REQUIRED) +find_package(sensor_msgs REQUIRED) +find_package(soccer_vision_2d_msgs REQUIRED) +find_package(soccer_vision_attribute_msgs REQUIRED) +find_package(std_msgs REQUIRED) +find_package(vision_msgs REQUIRED) +find_package(yaml-cpp REQUIRED) + +# ---------- ONNX Runtime ---------- +#find_package(onnxruntime CONFIG QUIET) +if(NOT onnxruntime_FOUND) + message(STATUS "onnxruntime CMake config not found, searching manually...") + # Search for the directory that contains onnxruntime/core/session/onnxruntime_cxx_api.h + # so that #include works correctly and + # relative includes inside the header chain resolve properly. + find_path(ONNXRUNTIME_INCLUDE_DIR + NAMES onnxruntime/core/session/onnxruntime_cxx_api.h + HINTS + ENV CONDA_PREFIX + ENV PIXI_PREFIX + PATH_SUFFIXES include + ) + find_library(ONNXRUNTIME_LIBRARY + NAMES onnxruntime + HINTS + ENV CONDA_PREFIX + ENV PIXI_PREFIX + PATH_SUFFIXES lib lib64 + ) + if(ONNXRUNTIME_INCLUDE_DIR AND ONNXRUNTIME_LIBRARY) + message(STATUS "Found ONNX Runtime: ${ONNXRUNTIME_LIBRARY}") + add_library(onnxruntime::onnxruntime IMPORTED SHARED) + set_target_properties(onnxruntime::onnxruntime PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${ONNXRUNTIME_INCLUDE_DIR}" + IMPORTED_LOCATION "${ONNXRUNTIME_LIBRARY}" + ) + else() + message(FATAL_ERROR + "Could not find ONNX Runtime.\n" + " Include dir: ${ONNXRUNTIME_INCLUDE_DIR}\n" + " Library: ${ONNXRUNTIME_LIBRARY}\n" + "Install onnxruntime or make sure CONDA_PREFIX / PIXI_PREFIX is set correctly." + ) + endif() +endif() +# ---------------------------------- + +generate_parameter_library( + vision_parameters + config/vision_parameters.yaml +) + +# --------------------------------------------------------------------------- +# Processing library (no ONNX dependency) – used by tests and the handler +# --------------------------------------------------------------------------- +add_library(bitbots_vision_processing SHARED + src/yoeo_processing.cpp + src/debug_image.cpp + src/model_config.cpp +) + +target_include_directories(bitbots_vision_processing PUBLIC + $ + $ +) + +target_link_libraries(bitbots_vision_processing PUBLIC + yaml-cpp + ${OpenCV_LIBS} +) + +# --------------------------------------------------------------------------- +# Full vision library (includes ONNX handler) – used by the node and handler tests +# --------------------------------------------------------------------------- +add_library(bitbots_vision_lib SHARED + src/yoeo_handler.cpp +) + +target_include_directories(bitbots_vision_lib PUBLIC + $ + $ +) + +target_link_libraries(bitbots_vision_lib PUBLIC + bitbots_vision_processing + vision_parameters + onnxruntime::onnxruntime +) + +ament_target_dependencies(bitbots_vision_lib PUBLIC + rclcpp +) + +# --------------------------------------------------------------------------- +# vision node executable +# --------------------------------------------------------------------------- +add_executable(vision src/vision_node.cpp) + +target_link_libraries(vision + bitbots_vision_lib +) + +ament_target_dependencies(vision + backward_ros + cv_bridge + rclcpp + sensor_msgs + soccer_vision_2d_msgs + soccer_vision_attribute_msgs + std_msgs + vision_msgs +) + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- +if(BUILD_TESTING) + find_package(ament_cmake_gtest REQUIRED) + + ament_add_gtest(test_candidate test/test_candidate.cpp) + target_link_libraries(test_candidate bitbots_vision_processing) + + ament_add_gtest(test_model_config test/test_model_config.cpp) + target_link_libraries(test_model_config bitbots_vision_processing) + + ament_add_gtest(test_debug_image test/test_debug_image.cpp) + target_link_libraries(test_debug_image bitbots_vision_processing) + + ament_add_gtest(test_processing test/test_processing.cpp) + target_link_libraries(test_processing bitbots_vision_processing) + + ament_add_gtest(test_yoeo_handler test/test_yoeo_handler.cpp) + target_link_libraries(test_yoeo_handler bitbots_vision_lib) +endif() + +install(TARGETS vision bitbots_vision_lib bitbots_vision_processing DESTINATION lib/${PROJECT_NAME}) +install(DIRECTORY include/ DESTINATION include) +install(DIRECTORY config DESTINATION share/${PROJECT_NAME}) +install(DIRECTORY launch DESTINATION share/${PROJECT_NAME}) + +ament_package() diff --git a/src/bitbots_vision/bitbots_vision/__init__.py b/src/bitbots_vision/bitbots_vision/__init__.py deleted file mode 100644 index 4d2e150079..0000000000 --- a/src/bitbots_vision/bitbots_vision/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Setting up runtime type checking for this package -from beartype.claw import beartype_this_package - -beartype_this_package() diff --git a/src/bitbots_vision/bitbots_vision/params.py b/src/bitbots_vision/bitbots_vision/params.py deleted file mode 100755 index 3fc3860115..0000000000 --- a/src/bitbots_vision/bitbots_vision/params.py +++ /dev/null @@ -1,111 +0,0 @@ -from rcl_interfaces.msg import FloatingPointRange, IntegerRange, ParameterDescriptor, ParameterType - - -class ParameterGenerator: # TODO own file - def __init__(self): - self.param_cache = [] - - def declare_params(self, node): - for param in self.param_cache: - node.declare_parameter(*param) - - def add(self, param_name, param_type=None, default=None, description=None, min=None, max=None, step=None): - describtor = ParameterDescriptor() - describtor.name = param_name - if description is None: - describtor.description = param_name - else: - describtor.description = description - - if param_type is None and default is not None: - param_type = type(default) - - py2ros_param_type = { - None: ParameterType.PARAMETER_NOT_SET, - bool: ParameterType.PARAMETER_BOOL, - int: ParameterType.PARAMETER_INTEGER, - float: ParameterType.PARAMETER_DOUBLE, - str: ParameterType.PARAMETER_STRING, - } - - param_type = py2ros_param_type.get(param_type, param_type) - - describtor.type = param_type - - if param_type == ParameterType.PARAMETER_INTEGER: - if step is None: - step = 1 - if all(x is not None or isinstance(x, int) for x in [min, max, step]): - param_range = IntegerRange() - param_range.from_value = min - param_range.to_value = max - param_range.step = step - describtor.integer_range = [param_range] - - if param_type == ParameterType.PARAMETER_DOUBLE: - if step is None: - step = 0.01 - if all(x is not None for x in [min, max]): - param_range = FloatingPointRange() - param_range.from_value = float(min) - param_range.to_value = float(max) - param_range.step = float(step) - describtor.floating_point_range = [param_range] - - type2default_default = { - ParameterType.PARAMETER_NOT_SET: 0, - ParameterType.PARAMETER_BOOL: False, - ParameterType.PARAMETER_INTEGER: 0, - ParameterType.PARAMETER_DOUBLE: 0.0, - ParameterType.PARAMETER_STRING: "", - } - - if default is None: - default = type2default_default[param_type] - - self.param_cache.append((param_name, default, describtor)) - - -gen = ParameterGenerator() - -########## -# Params # -########## - -gen.add("component_ball_detection_active", bool, description="Activate/Deactivate the ball detection component") -gen.add("component_debug_image_active", bool, description="Activate/Deactivate the debug image component") -gen.add("component_field_detection_active", bool, description="Activate/Deactivate the field detection component") -gen.add("component_goalpost_detection_active", bool, description="Activate/Deactivate the goalpost detection component") -gen.add("component_line_detection_active", bool, description="Activate/Deactivate the line detection component") -gen.add("component_robot_detection_active", bool, description="Activate/Deactivate the robot detection component") - -gen.add("ROS_img_msg_topic", str, description="ROS topic of the image message") -gen.add("ROS_ball_msg_topic", str, description="ROS topic of the ball message") -gen.add("ROS_goal_posts_msg_topic", str, description="ROS topic of the goal posts message") -gen.add("ROS_robot_msg_topic", str, description="ROS topic of the robots message") -gen.add("ROS_line_msg_topic", str, description="ROS topic of the line message") -gen.add("ROS_line_mask_msg_topic", str, description="ROS topic of the line mask message") -gen.add("ROS_debug_image_msg_topic", str, description="ROS topic of the debug image message") -gen.add("ROS_field_mask_image_msg_topic", str, description="ROS topic of the field mask debug image message") - -gen.add("yoeo_model_path", str, description="Name of YOEO model") -gen.add("yoeo_nms_threshold", float, description="YOEO Non-maximum suppression threshold", min=0.0, max=1.0) -gen.add("yoeo_conf_threshold", float, description="YOEO confidence threshold", min=0.0, max=1.0) -gen.add( - "yoeo_framework", - str, - description="The neural network framework that should be used ['pytorch', 'openvino', 'onnx', 'tvm']", -) - -gen.add( - "ball_candidate_rating_threshold", - float, - description="A threshold for the minimum candidate rating", - min=0.0, - max=1.0, -) -gen.add( - "ball_candidate_max_count", int, description="The maximum number of balls that should be published", min=0, max=50 -) - -gen.add("caching", bool, description="Used to deactivate caching for profiling reasons") diff --git a/src/bitbots_vision/bitbots_vision/vision.py b/src/bitbots_vision/bitbots_vision/vision.py deleted file mode 100755 index 74dc60b4fb..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision.py +++ /dev/null @@ -1,148 +0,0 @@ -#! /usr/bin/env python3 -from copy import deepcopy -from typing import Optional - -import rclpy -from cv_bridge import CvBridge -from rcl_interfaces.msg import SetParametersResult -from rclpy.experimental.events_executor import EventsExecutor -from rclpy.node import Node -from sensor_msgs.msg import Image - -from bitbots_vision.vision_modules import debug, ros_utils, yoeo - -from .params import gen - -logger = rclpy.logging.get_logger("bitbots_vision") - -try: - from profilehooks import profile -except ImportError: - - def profile(func): - return func - - logger.info("No Profiling available") - - -class YOEOVision(Node): - """ - The Vision is the main ROS-node for handling all tasks related to image processing. - - This class defines the whole YOEO image processing pipeline, which uses the modules from the `vision_modules`. - It also handles the dynamic reconfiguration of the bitbots_vision. - """ - - def __init__(self) -> None: - super().__init__("bitbots_vision") - - logger.debug(f"Entering {self.__class__.__name__} constructor") - - self._config: dict = {} - self._cv_bridge = CvBridge() - - self._sub_image = None - - self._vision_components: list[yoeo.AbstractVisionComponent] = [] - self._debug_image: Optional[debug.DebugImage] = None - - # Setup reconfiguration - gen.declare_params(self) - self.add_on_set_parameters_callback(self._dynamic_reconfigure_callback) - - # Add general params - ros_utils.set_general_parameters(["caching"]) - - # Update team color - ros_utils.update_own_team_color(self) - - self._dynamic_reconfigure_callback(self.get_parameters_by_prefix("").values()) - - logger.debug(f"Leaving {self.__class__.__name__} constructor") - - def _dynamic_reconfigure_callback(self, params) -> SetParametersResult: - """ - Callback for the dynamic reconfigure configuration. - - :param dict params: new config - """ - new_config = self._get_updated_config_with(params) - self._configure_vision(new_config) - self._config = new_config - - return SetParametersResult(successful=True) - - def _get_updated_config_with(self, params) -> dict: - new_config = deepcopy(self._config) - for param in params: - new_config[param.name] = param.value - return new_config - - def _configure_vision(self, new_config: dict) -> None: - yoeo.YOEOObjectManager.configure(new_config) - - debug_image = debug.DebugImage(new_config["component_debug_image_active"]) - self._debug_image = debug_image - - def make_vision_component( - component_class: type[yoeo.AbstractVisionComponent], **kwargs - ) -> yoeo.AbstractVisionComponent: - return component_class( - node=self, - yoeo_handler=yoeo.YOEOObjectManager.get(), - debug_image=debug_image, - config=new_config, - **kwargs, - ) - - self._vision_components = [make_vision_component(yoeo.YOEOComponent)] - - if new_config["component_ball_detection_active"]: - self._vision_components.append(make_vision_component(yoeo.BallDetectionComponent)) - if new_config["component_robot_detection_active"]: - self._vision_components.append( - make_vision_component( - yoeo.RobotDetectionComponent, - team_color_detection_supported=yoeo.YOEOObjectManager.is_team_color_detection_supported(), - ) - ) - if new_config["component_goalpost_detection_active"]: - self._vision_components.append(make_vision_component(yoeo.GoalpostDetectionComponent)) - if new_config["component_line_detection_active"]: - self._vision_components.append(make_vision_component(yoeo.LineDetectionComponent)) - if new_config["component_field_detection_active"]: - self._vision_components.append(make_vision_component(yoeo.FieldDetectionComponent)) - if new_config["component_debug_image_active"]: - self._vision_components.append(make_vision_component(yoeo.DebugImageComponent)) - - self._sub_image = ros_utils.create_or_update_subscriber( - self, - self._config, - new_config, - self._sub_image, - "ROS_img_msg_topic", - Image, - callback=self._run_vision_pipeline, - ) - - @profile - def _run_vision_pipeline(self, image_msg: Image) -> None: - image = self._cv_bridge.imgmsg_to_cv2(image_msg, "bgr8") - - assert self._debug_image is not None, "Debug image not initialized" - self._debug_image.set_image(image) - - for vision_component in self._vision_components: - vision_component.run(image, image_msg.header) - - -def main(args=None): - rclpy.init(args=args) - node = YOEOVision() - executor = EventsExecutor() - executor.add_node(node) - try: - executor.spin() - except KeyboardInterrupt: - pass - node.destroy_node() diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/candidate.py b/src/bitbots_vision/bitbots_vision/vision_modules/candidate.py deleted file mode 100644 index 81bcee5f2a..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/candidate.py +++ /dev/null @@ -1,230 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - pass - - -from rclpy import logging - -logger = logging.get_logger("vision_candidate") - - -class Candidate: - """ - A :class:`.Candidate` is a representation of an arbitrary object in an image. - It is very similar to bounding boxes but with an additional rating. - - This class provides several getters for different properties of the candidate. - """ - - def __init__(self, x1=0, y1=0, width=0, height=0, rating=None): - """ - Initialization of :class:`.Candidate`. - - :param int x1: Horizontal part of the coordinate of the top left corner of the candidate - :param int y1: Vertical part of the coordinate of the top left corner of the candidate - :param int width: Horizontal size - :param int height: Vertical size - :param float rating: Confidence of the candidate - """ - self._x1 = x1 - self._y1 = y1 - self._width = width - self._height = height - self._rating = rating - - def get_width(self): - # type: () -> int - """ - :return int: Width of the candidate bounding box. - """ - return self._width - - def get_height(self): - # type: () -> int - """ - :return int: Height of the candidate bounding box. - """ - return self._height - - def get_center_x(self): - # type: () -> int - """ - :return int: Center x coordinate of the candidate bounding box. - """ - return self._x1 + int(self._width // 2) - - def get_center_y(self): - # type: () -> int - """ - :return int: Center y coordinate of the candidate bounding box. - """ - return self._y1 + int(self._height // 2) - - def get_center_point(self): - # type: () -> tuple[int, int] - """ - :return tuple[int,int]: Center point of the bounding box. - """ - return self.get_center_x(), self.get_center_y() - - def get_diameter(self): - # type: () -> int - """ - :return int: Mean diameter of the candidate. - """ - return int((self._height + self._width) // 2) - - def get_radius(self): - # type: () -> int - """ - :return int: Mean radius of the candidate. - """ - return int(self.get_diameter() // 2) - - def get_upper_left_point(self): - # type: () -> tuple[int, int] - """ - :return tuple[int,int]: Upper left point of the candidate. - """ - return self._x1, self._y1 - - def get_upper_left_x(self): - # type: () -> int - """ - :return int: Upper left x coordinate of the candidate. - """ - return self._x1 - - def get_upper_left_y(self): - # type: () -> int - """ - :return int: Upper left y coordinate of the candidate. - """ - return self._y1 - - def get_lower_right_point(self): - # type: () -> tuple[int, int] - """ - :return tuple[int,int]: Lower right point of the candidate. - """ - return self._x1 + self._width, self._y1 + self._height - - def get_lower_right_x(self): - # type: () -> int - """ - :return int: Lower right x coordinate of the candidate. - """ - return self._x1 + self._width - - def get_lower_right_y(self): - # type: () -> int - """ - :return int: Lower right y coordinate of the candidate. - """ - return self._y1 + self._height - - def get_lower_center_point(self) -> tuple[int, int]: - """ - :return tuple: Returns the lowest point of the candidate. The point is horizontally centered inside the candidate. - """ - return (self.get_center_x(), self.get_lower_right_y()) - - def set_rating(self, rating): - # type: (float) -> None - """ - :param float rating: Rating to set. - """ - if self._rating is not None: - logger.warning("Candidate rating has already been set.") - return - self._rating = rating - - def get_rating(self): - # type: () -> float - """ - - :return float: Rating of the candidate - """ - return self._rating - - def point_in_candidate(self, point): - # type: (tuple) -> bool - """ - Returns whether the point is in the candidate or not. - In the process, the candidate gets treated as a rectangle. - - :param point: An x-y-int-tuple defining the point to inspect. - :return bool: Whether the point is in the candidate or not. - """ - return (self.get_upper_left_x() <= point[0] <= self.get_upper_left_x() + self.get_width()) and ( - self.get_upper_left_y() <= point[1] <= self.get_upper_left_y() + self.get_height() - ) - - def set_in_mask(self, mask, value=0, grow=1): - """ - Sets the bounding box of this candidate in the given mask to the given value. - - :param mask: Binary mask with the shape of the input image - :param value: The value of the bounding box region - :param grow: A scalar which defines how much arround the box is also removed - :returns mask: The input mask without this candidate - """ - width = int(self.get_width() * grow * 0.5) - height = int(self.get_height() * grow * 0.5) - mask[ - max(self.get_center_y() - height, 0) : min(self.get_center_y() + height, mask.shape[0]), - max(self.get_center_x() - width, 0) : min(self.get_center_x() + width, mask.shape[1]), - ] = value - return mask - - @staticmethod - def sort_candidates(candidatelist): - """ - Returns a sorted list of the candidates. - The first list element is the highest rated candidate. - - :param [Candidate] candidatelist: List of candidates - :return: List of candidates sorted by rating, in descending order - """ - return sorted(candidatelist, key=lambda candidate: candidate.get_rating(), reverse=True) - - @staticmethod - def select_top_candidate(candidatelist): - """ - Returns the highest rated candidate. - - :param candidatelist: List of candidates - :return Candidate: Top candidate - """ - if candidatelist: - return Candidate.sort_candidates(candidatelist)[0] - else: - return None - - @staticmethod - def rating_threshold(candidatelist, threshold): - """ - Returns list of all candidates with rating above given threshold. - - :param [Candidate] candidatelist: List of candidates to filter - :param float threshold: Filter threshold - :return [Candidate]: Filtered list of candidates - """ - return [candidate for candidate in candidatelist if candidate.get_rating() > threshold] - - def __str__(self): - """ - Returns string representation of candidate. - - :return str: String representation of candidate - """ - return f"x1,y1: {self.get_upper_left_x()},{self.get_upper_left_y()} | width,height: {self.get_width()},{self.get_height()} | rating: {self._rating}" - - @classmethod - def from_x1y1x2y2(cls, x1, y1, x2, y2, rating=None): - width = abs(x1 - x2) - height = abs(y1 - y2) - return cls(min(x1, x2), min(y1, y2), width, height, rating) diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/debug.py b/src/bitbots_vision/bitbots_vision/vision_modules/debug.py deleted file mode 100644 index 5028e70c00..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/debug.py +++ /dev/null @@ -1,147 +0,0 @@ -from collections.abc import Sequence -from typing import Optional - -import cv2 -import numpy as np -from jaxtyping import UInt8 - -from bitbots_vision.vision_modules.candidate import Candidate - - -class DebugImage: - """ - :class:`.DebugImage` draws the images with information of the vision pipeline for debug purposes. - - It is capable of displaying the detected and convex field boundary (red and yellow lines respectively), - the best and discarded ball candidates (green and red circles respectively), - the goalposts (white bounding boxes) and - different obstacles (black: unknown, red: red robot, blue: blue robot). - """ - - def __init__(self, active: bool = True): - """ - Initialization of :class:`.DebugImage`. - """ - self._debug_image: Optional[UInt8[np.ndarray, "h w 3"]] = None - self.active = active - - def set_image(self, image: UInt8[np.ndarray, "h w 3"]) -> None: - """ - Sets a new image on which the debug image is mapped. - - :param image: image the vision is currently processing - """ - self._debug_image = image.copy() - - def draw_field_boundary( - self, field_boundary_points: Sequence[int], color: tuple[int, int, int], thickness: int = 1 - ): - """ - Draws a line a line that represents the given field_boundary. - - :param field_boundary_points: list of coordinates of the field_boundary - :param color: color of the line - :param thickness: thickness of the line - """ - if not self.active: - return - assert self._debug_image is not None, "No image set" - for i in range(len(field_boundary_points) - 1): - cv2.line(self._debug_image, field_boundary_points[i], field_boundary_points[i + 1], color, thickness=1) # type: ignore[call-overload] - - def draw_ball_candidates( - self, ball_candidates: Sequence[Candidate], color: tuple[int, int, int], thickness: int = 1 - ): - """ - Draws a circle around every coordinate where a ball candidate was found. - - :param ball_candidates: list of ball candidates with the type Candidate - :param color: color of the circle to draw - :param thickness: thickness of the outline - """ - if not self.active: - return - assert self._debug_image is not None, "No image set" - for candidate in ball_candidates: - if candidate: - cv2.circle( - self._debug_image, - (candidate.get_center_x(), candidate.get_center_y()), - candidate.get_radius(), - color, - thickness=thickness, - ) - - def draw_robot_candidates( - self, robot_candidates: Sequence[Candidate], color: tuple[int, int, int], thickness: int = 1 - ): - """ - Draws a bounding box for every given robot. - - :param robot_candidates: list of list of robot candidates with the type Candidate - :param color: color of the outline - :param thickness: thickness of the outline - """ - if not self.active: - return - assert self._debug_image is not None, "No image set" - for candidate in robot_candidates: - cv2.rectangle( - self._debug_image, - candidate.get_upper_left_point(), - candidate.get_lower_right_point(), - color, - thickness=thickness, - ) - - def draw_points(self, points: tuple[int, int], color: tuple[int, int, int], thickness: int = -1, rad: int = 2): - """ - Draws a (line)point for every given point. - - :param points: list points - :param color: color of the point - :param thickness: thickness of the outline - :param rad: radius of the point - """ - if not self.active: - return - assert self._debug_image is not None, "No image set" - for point in points: - cv2.circle(self._debug_image, point, rad, color, thickness=thickness) # type: ignore[call-overload] - - def draw_line_segments( - self, segments: Sequence[tuple[int, int, int, int]], color: tuple[int, int, int], thickness: int = 2 - ): - """ - Draws a line segment. - - :param segments: list line segments in the form (x1,y1,x2,y2) - :param color: color of the line - :param thickness: thickness of the line - """ - if not self.active: - return - assert self._debug_image is not None, "No image set" - for segment in segments: - cv2.line(self._debug_image, (segment[0], segment[1]), (segment[2], segment[3]), color, thickness=2) - - def draw_mask(self, mask, color, opacity=0.5): - if not self.active: - return - assert self._debug_image is not None, "No image set" - - # Bring mask into canonical form - mask_bool = mask.astype(bool).squeeze() - - # Blend color directly where mask is true - self._debug_image[mask_bool, :] = ( - self._debug_image[mask_bool, :] * (1.0 - opacity) + np.array(color, dtype=np.float32) * opacity - ).astype(np.uint8) - - def get_image(self): - """ - Get the image with the debug drawing in it. - - :return: image with debug stuff - """ - return self._debug_image diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/ros_utils.py b/src/bitbots_vision/bitbots_vision/vision_modules/ros_utils.py deleted file mode 100644 index 53a41fcade..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/ros_utils.py +++ /dev/null @@ -1,324 +0,0 @@ -import re -from enum import Enum -from typing import Optional, TypeAlias - -from bitbots_utils.utils import get_parameters_from_other_node -from cv_bridge import CvBridge -from rclpy import logging -from rclpy.node import Node -from soccer_vision_2d_msgs.msg import ( - Ball, - BallArray, - Goalpost, - GoalpostArray, - MarkingArray, - MarkingSegment, - Robot, - RobotArray, -) -from soccer_vision_attribute_msgs.msg import Robot as RobotAttributes -from vision_msgs.msg import BoundingBox2D, Pose2D - -from bitbots_vision.vision_modules import candidate - -""" -This module provides some methods needed for the ros environment, -e.g. methods to convert candidates to ROS messages or methods to modify the dynamic reconfigure objects. -""" - -_cv_bridge = CvBridge() - -logger = logging.get_logger("bitbots_vision") - -general_parameters = [] - -T_RobotAttributes_Team: TypeAlias = int # Type for RobotAttributes.team - - -# These values are taken from the game settings -class RobotColor(Enum): - BLUE = 0 - RED = 1 - UNKNOWN = None - - -global own_team_color -own_team_color: RobotColor = RobotColor.UNKNOWN - - -def create_or_update_subscriber( - node, old_config, new_config, subscriber_object, topic_key, data_class, callback, qos_profile=1, callback_group=None -): - """ - Creates or updates a subscriber - - :param node: ROS node to which the publisher is bound - :param old_config: Previous config dict - :param new_config: Current config dict - :param subscriber_object: The python object, that represents the subscriber - :param topic_key: The name of the topic variable in the config dict - :param data_class: Data type class for ROS messages of the topic we want to subscribe - :param callback: The subscriber callback function - :param qos_profile: A QoSProfile or a history depth to apply to the subscription. - In the case that a history depth is provided, the QoS history is set to - KEEP_LAST, the QoS history depth is set to the value - of the parameter, and all other QoS settings are set to their default values. - Reference: https://github.com/ros2/rclpy/blob/6f7cfd0c73bda1afefba36b6785516f343d6b634/rclpy/rclpy/node.py#L1335 - :param callback_group: The callback group for the subscription. If ``None``, then the - nodes default callback group is used. - Reference: https://github.com/ros2/rclpy/blob/6f7cfd0c73bda1afefba36b6785516f343d6b634/rclpy/rclpy/node.py#L1339 - :return: adjusted subscriber object - """ - # Check if topic parameter has changed - if config_param_change(old_config, new_config, topic_key): - # Create the new subscriber - subscriber_object = node.create_subscription( - data_class, new_config[topic_key], callback, qos_profile, callback_group=callback_group - ) - logger.debug("Registered new subscriber at " + str(new_config[topic_key])) - return subscriber_object - - -def build_bounding_box_2d(candidate): - """ - Builds a BoundingBox2D message out of a vision Candidate - - :param candidate: A vision Candidate - :return: BoundingBox2D message - """ - center = Pose2D() - center.position.x = float(candidate.get_center_x()) - center.position.y = float(candidate.get_center_y()) - - bb_msg = BoundingBox2D() - bb_msg.size_x = float(candidate.get_width()) - bb_msg.size_y = float(candidate.get_height()) - bb_msg.center = center - return bb_msg - - -def build_goal_post_array_msg(header, goal_post_msgs): - """ - Builds a GoalpostArray message out of a list of Goalpost messages - - :param header: ros header of the new message. Mostly the header of the image - :param goal_post_msgs: List of goal post messages - :return: GoalpostArray message - """ - # Create goalposts msg - goal_posts_msg = GoalpostArray() - # Add header - goal_posts_msg.header = header - # Add detected goal posts to the message - goal_posts_msg.posts = goal_post_msgs - return goal_posts_msg - - -def build_goal_post_msg(goalpost): - """ - Builds a Goalpost message - - :param goalpost: goalpost candidate - :return: Goalpost message - """ - # Create a empty post message - post_msg = Goalpost() - post_msg.bb = build_bounding_box_2d(goalpost) - if goalpost.get_rating() is not None: - post_msg.confidence.confidence = float(goalpost.get_rating()) - return post_msg - - -def build_ball_array_msg(header, balls): - """ - Builds a BallArray message out of a list of ball messages - - :param header: ros header of the new message. Mostly the header of the image - :param balls: A list of Ball messages - :return: BallArray msg - """ - # create ball msg - balls_msg = BallArray() - # Set header - balls_msg.header = header - # Add balls - balls_msg.balls = balls - return balls_msg - - -def build_ball_msg(ball_candidate): - """ - Builds a Ball message - - :param ball_candidate: ball Candidate - :return: Ball msg - """ - # Create a empty ball message - ball_msg = Ball() - ball_msg.bb = build_bounding_box_2d(ball_candidate) - ball_msg.center.x = float(ball_candidate.get_center_x()) - ball_msg.center.y = float(ball_candidate.get_center_y()) - if ball_candidate.get_rating() is not None: - ball_msg.confidence.confidence = float(ball_candidate.get_rating()) - return ball_msg - - -def build_robot_array_msg(header, robots): - """ - Builds a RobotArray message containing a list of Robot messages - - :param header: ros header of the new message. Mostly the header of the image - :param robots: a list of Robot messages - :return: RobotArray message - """ - # Create obstacle msg - robots_msg = RobotArray() - # Add header - robots_msg.header = header - # Add obstacles - robots_msg.robots = robots - return robots_msg - - -def build_robot_msg(robot: candidate.Candidate, team: Optional[T_RobotAttributes_Team] = None) -> Robot: - """ - Builds a Robot msg of a detected robot of a certain color - - :param robot: Robot candidate - :param team: Team of the robot, defaults to None - :return: Robot message - """ - robot_msg = Robot() - robot_msg.bb = build_bounding_box_2d(robot) - robot_msg.attributes.team = team or RobotAttributes.TEAM_UNKNOWN - if robot.get_rating() is not None: - robot_msg.confidence.confidence = float(robot.get_rating()) - return robot_msg - - -def build_marking_array_msg(header, marking_segments): - """ - Builds a MarkingArray message that consists of marking segments. - - :param header: ros header of the new message. Mostly the header of the image - :param marking_segments: A list of MarkingSegment messages - :return: Final MarkingArray message - """ - # Create message - marking_array_msg = MarkingArray() - # Set header values - marking_array_msg.header = header - # Set line segments - marking_array_msg.segments = marking_segments - return marking_array_msg - - -def build_image_msg(header, image, desired_encoding="passthrough"): - """ - Builds a Image message - - :param header: ROS header of the new message. Mostly the header of the incoming image. - :param image: A 2d NumPy UInt8 array - :param desired_encoding: The Image type. E.g. 8UC[1-4], 8SC[1-4], 16UC[1-4], 16SC[1-4], 32SC[1-4], 32FC[1-4], 64FC[1-4] - :return: The Image message - """ - image_msg = _cv_bridge.cv2_to_imgmsg(image, desired_encoding) - image_msg.header = header - return image_msg - - -def convert_line_points_to_marking_segment_msgs(line_points): - """ - Converts a list of linepoints in the form [(x,y), ...] into a list of MarkingSegmentInImage messages. - - :param line_points: A list of linepoints in the form [(x,y), ...] - :return: A list of MarkingSegment messages - """ - marking_segments = [] - for line_point in line_points: - # Create MarkingSegment message - marking_segment = MarkingSegment() - marking_segment.start.x = float(line_point[0]) - marking_segment.start.y = float(line_point[1]) - marking_segment.end = marking_segment.start - marking_segments.append(marking_segment) - return marking_segments - - -def set_general_parameters(params): - """ - Sets params, that should trigger every `config_param_change` call. - - :params list of global params - """ - general_parameters.extend(params) - - -def config_param_change(old_config, new_config, params_expressions, check_generals=True): - """ - Checks whether some of the specified config params have changed. - - :param dict old_config: old config dict - :param dict new_config: new config dict - :param list of str or str params_expressions: regex describing parameter name or list of parameter names - :param bool check_generals: Also check for general params (Default True) - :return bool: True if parameter has changed - """ - # Make regex instead of list possible - if not isinstance(params_expressions, list): - params_expressions = [params_expressions] - - # Matching parameters - params = [] - # Iterate over expressions - for param in params_expressions: - # Build regex - regex = re.compile(param) - # Filter parameter names by regex - params.extend(list(filter(regex.search, list(new_config.keys())))) - - # Check if parameters matching this regex exist - if len(params) == 0: - raise KeyError(f"Regex '{params}' has no matches in dict.") - - # Add general params to parameters - if check_generals: - params.extend(general_parameters) - - # Iterate over params - for param in params: - # Check if param exists in new config - if param not in new_config: - raise KeyError(f"Parameter '{param}' is not in dict.") - # Check if param is new or if param has changed - elif param not in old_config or old_config[param] != new_config[param]: - logger.debug(f"Parameter '{param}' has changed to '{new_config[param]}'") - return True - return False - - -def update_own_team_color(vision_node: Node): - global own_team_color - params = get_parameters_from_other_node( - vision_node, "parameter_blackboard", ["team_color"], service_timeout_sec=2.0 - ) - own_team_color = RobotColor(params["team_color"]) - vision_node._logger.debug(f"Own team color is: {own_team_color}") - - -def get_robot_color_for_team(team: T_RobotAttributes_Team) -> RobotColor: - """ - Maps team (own, opponent, unknown) to the current robot color. - """ - global own_team_color - - if team == RobotAttributes.TEAM_OWN: - return own_team_color - elif team == RobotAttributes.TEAM_OPPONENT: - return { - RobotColor.RED: RobotColor.BLUE, - RobotColor.BLUE: RobotColor.RED, - RobotColor.UNKNOWN: RobotColor.UNKNOWN, - }[own_team_color] - else: - raise ValueError(f"Unknown team value: {team}") diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/__init__.py b/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/__init__.py deleted file mode 100644 index b3d471fa77..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -from .object_manager import YOEOObjectManager -from .vision_components import ( - AbstractVisionComponent, - BallDetectionComponent, - DebugImageComponent, - FieldDetectionComponent, - GoalpostDetectionComponent, - LineDetectionComponent, - RobotDetectionComponent, - YOEOComponent, -) - -__all__ = [ - "BallDetectionComponent", - "DebugImageComponent", - "FieldDetectionComponent", - "GoalpostDetectionComponent", - "AbstractVisionComponent", - "LineDetectionComponent", - "RobotDetectionComponent", - "YOEOComponent", - "YOEOObjectManager", -] diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/model_config.py b/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/model_config.py deleted file mode 100644 index 8088bb8961..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/model_config.py +++ /dev/null @@ -1,32 +0,0 @@ -from os.path import join -from typing import Optional - -import yaml # type: ignore[import-untyped] - - -class ModelConfig: - def __init__(self, config: Optional[dict] = None): - self._config: dict = config if config else {} - - def get_detection_classes(self) -> list[str]: - return self._config["detection"]["classes"] - - def get_segmentation_classes(self) -> list[str]: - return self._config["segmentation"]["classes"] - - def team_colors_are_provided(self) -> bool: - return self._config["detection"].get("team_colors", False) - - def get_robot_class_ids(self) -> list[int]: - ids = [] - for i, c in enumerate(self.get_detection_classes()): - if "robot" in c: - ids.append(i) - return ids - - -class ModelConfigLoader: - @staticmethod - def load_from(model_path: str) -> ModelConfig: - with open(join(model_path, "model_config.yaml")) as f: - return ModelConfig(yaml.safe_load(f)) diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/object_manager.py b/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/object_manager.py deleted file mode 100644 index caacbd1fff..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/object_manager.py +++ /dev/null @@ -1,130 +0,0 @@ -import os -from typing import Optional - -import rclpy - -from bitbots_vision.vision_modules import ros_utils - -from . import yoeo_handlers -from .model_config import ModelConfig, ModelConfigLoader - -logger = rclpy.logging.get_logger("bitbots_vision") - - -class YOEOObjectManager: - """ - This class manages the creation and update of the YOEO handler instance. - """ - - _HANDLERS_BY_NAME: dict[str, type[yoeo_handlers.YOEOHandlerTemplate]] = { - "openvino": yoeo_handlers.YOEOHandlerOpenVino, - "onnx": yoeo_handlers.YOEOHandlerONNX, - "pytorch": yoeo_handlers.YOEOHandlerPytorch, - "tvm": yoeo_handlers.YOEOHandlerTVM, - } - - _config: dict = {} - _framework: str = "" - _model_config: ModelConfig = ModelConfig() - _model_path: str = "" - _yoeo_instance: Optional[yoeo_handlers.IYOEOHandler] = None - - @classmethod - def get(cls) -> yoeo_handlers.IYOEOHandler: - """ - Get the current YOEO handler instance. - - :return: the current YOEO handler instance - :rtype: IYOEOHandler - """ - assert cls._yoeo_instance is not None, "YOEO handler instance not set!" - return cls._yoeo_instance - - @classmethod - def get_id(cls) -> int: - """ - Get the (Python) ID of the current YOEO handler instance. - - :return: the ID of the current YOEO handler instance - :rtype: int - """ - assert cls._yoeo_instance is not None, "YOEO handler instance not set!" - return id(cls._yoeo_instance) - - @classmethod - def is_team_color_detection_supported(cls) -> bool: - """ - Whether the current YOEO object provides team color detection. - - :return: true if team color detection is provided, false otherwise - :rtype: bool - """ - return cls._model_config.team_colors_are_provided() - - @classmethod - def configure(cls, config: dict) -> None: - framework = config["yoeo_framework"] - cls._verify_framework_parameter(framework) - - conda_prefix = os.environ.get("CONDA_PREFIX", "") - if not conda_prefix: - raise ValueError( - "CONDA_PREFIX environment variable not set! We now expect YOEO models to be shared as conda packages." - ) - - # Assemble model package name and look at its share directory - model_path = os.path.join(conda_prefix, "share", "bitbots_model_" + config["yoeo_model_path"]) - - cls._verify_required_neural_network_files_exist(framework, model_path) - - cls._configure_yoeo_instance(config, framework, model_path) - - cls._config = config - cls._framework = framework - cls._model_path = model_path - - @staticmethod - def _verify_framework_parameter(framework: str) -> None: - if framework not in {"openvino", "onnx", "pytorch", "tvm"}: - logger.error(f"Unknown neural network framework '{framework}'") - - @classmethod - def _verify_required_neural_network_files_exist(cls, framework: str, model_path: str) -> None: - if not cls._model_files_exist(framework, model_path): - logger.error("No matching model file(s) found!") - - @classmethod - def _model_files_exist(cls, framework: str, model_path: str) -> bool: - return cls._HANDLERS_BY_NAME[framework].model_files_exist(model_path) - - @classmethod - def _configure_yoeo_instance(cls, config: dict, framework: str, model_path: str) -> None: - if cls._new_yoeo_handler_is_needed(framework, model_path): - cls._load_model_config(model_path) - cls._instantiate_new_yoeo_handler(config, framework, model_path) - elif cls._yoeo_parameters_have_changed(config): - assert cls._yoeo_instance is not None, "YOEO handler instance not set!" - cls._yoeo_instance.configure(config) - - @classmethod - def _new_yoeo_handler_is_needed(cls, framework: str, model_path: str) -> bool: - return cls._yoeo_instance is None or cls._framework != framework or cls._model_path != model_path - - @classmethod - def _load_model_config(cls, model_path: str) -> None: - cls._model_config = ModelConfigLoader.load_from(model_path) - - @classmethod - def _instantiate_new_yoeo_handler(cls, config: dict, framework: str, model_path: str) -> None: - cls._yoeo_instance = cls._HANDLERS_BY_NAME[framework]( - config, - model_path, - cls._model_config.get_detection_classes(), - cls._model_config.get_robot_class_ids(), - cls._model_config.get_segmentation_classes(), - ) - logger.info(f"Using {cls._yoeo_instance.__class__.__name__}") - - @classmethod - def _yoeo_parameters_have_changed(cls, new_config: dict) -> bool: - return ros_utils.config_param_change(cls._config, new_config, r"yoeo_") diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/utils.py b/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/utils.py deleted file mode 100644 index 22c8ae311b..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/utils.py +++ /dev/null @@ -1,425 +0,0 @@ -from abc import ABC, abstractmethod -from dataclasses import dataclass -from typing import Optional - -import cv2 -import numpy as np -import rclpy -from jaxtyping import Float64, UInt8 - -logger = rclpy.logging.get_logger("yoeo_handler_utils") - - -@dataclass -class ImagePreProcessorData: - """ - This dataclass is used to exchange relevant parameters of the applied image preprocessing between instances of type - IImagePreProcessor and instances of type ISegmentationPostProcessor and IDetectionPostProcessor, respectively. - :param padding_top: applied padding (number of pixels) at the top of the image - :param padding_bottom: applied padding (number of pixels) at the bottom of the image - :param padding_left: applied padding (number of pixels) at the left-hand side of the image - :param padding_right: applied padding (number of pixels) at the right-hand side of the image - :param max_dim: the larger of the two dimensions of the original unprocessed image (number of pixels) - """ - - padding_top: int - padding_bottom: int - padding_left: int - padding_right: int - max_dim: int - - -class IImagePreProcessor(ABC): - """ - Interface for YOEO image pre-processors. Implementing classes should take an ordinary image as input and output it - in such a way that it can be input into the YOEO network. - """ - - @abstractmethod - def configure(self, network_input_shape: tuple[int, int]) -> None: - """ - Allows to (re-) configure the current instance. - - :param network_input_shape: input shape of the YOEO network (height, width) - """ - ... - - @abstractmethod - def get_info(self) -> ImagePreProcessorData: - """ - Returns relevant image pre-processing parameters that are needed by the respective image post-processors. - - Invoking this method before an image has been pre-processed returns an ImagePreProcessorData object with - default values. - """ - ... - - @abstractmethod - def process(self, image: np.ndarray) -> np.ndarray: - """ - Run the image pre-processing on the method's argument. - - :param image: the image to pre-process (axis order: height, width, channels) - :return: the pre-processed image (axis order: channels, height, width) - """ - ... - - @abstractmethod - def reset(self) -> None: - """ - Resets the instance into a state as if no image has been processed yet. - """ - ... - - -class ISegmentationPostProcessor: - """ - Interface for YOEO segmentation post-processors. Implementing classes should take a YOEO segmentation network - output as input and output a segmentation with size equal to the original image. - """ - - @abstractmethod - def configure(self, image_preprocessor: IImagePreProcessor) -> None: - """ - Allows to (re-) configure the current instance. - - :param image_preprocessor: instance of IImagePreProcessor that handles the image pre-processing - """ - ... - - @abstractmethod - def process(self, segmentation: np.ndarray) -> np.ndarray: - """ - Run the segmentation post-processing on the method's argument. - - :param segmentation: YOEO segmentation network output (axis order: channels, height, width) - :return: the post-processed segmentation output (axis order: height, width) - """ - ... - - -class IDetectionPostProcessor: - """ - Interface for YOEO detection post-processors. Implementing classes should take a YOEO detection network - output as input, perform non-maximum suppression on it and rescale the bounding boxes to the original image size. - """ - - @abstractmethod - def configure( - self, - image_preprocessor: IImagePreProcessor, - output_img_size: int, - conf_thresh: float, - nms_thresh: float, - robot_class_ids: list[int], - ) -> None: - """ - Allows to (re-) configure the current instance. - - :param image_preprocessor: instance of IImagePreProcessor that handles the image pre-processing - :param output_img_size: image size (1D) for which the detections are calculated by the YOEO network - :param conf_thresh: class confidence threshold used in non-maximum suppression - :param nms_thresh: threshold used in non-maximum suppression - :param robot_class_ids: class ids of robot classes (required for nms across all robot classes) - """ - ... - - @abstractmethod - def process(self, detections: np.ndarray) -> np.ndarray: - """ - Run the detection post-processing on the method's argument. - - :param detections: YOEO detection network output (axis layout: 1, number of boxes, boxes), - (boxes layout: x, y, w, h, obj_conf, cond_class_conf_1, cond_class_conf_2, ...) - :return: the post-processed detection output - """ - ... - - -class DefaultImagePreProcessor(IImagePreProcessor): - def __init__(self, network_input_shape): - self._network_input_shape_WH: Optional[tuple[int, int]] = None # (width, height) - self.configure(network_input_shape) - - # these attributes change for every image! - self._image_dimensions_HW: tuple[int, int] = (0, 0) # (height, width) - self._padding_top: int = 0 - self._padding_bottom: int = 0 - self._padding_left: int = 0 - self._padding_right: int = 0 - - def configure(self, network_input_shape: tuple[int, int]) -> None: - # change layout from (height, width) to (width, height) - self._network_input_shape_WH = network_input_shape[::-1] - - def get_info(self) -> ImagePreProcessorData: - return ImagePreProcessorData( - padding_top=self._padding_top, - padding_bottom=self._padding_bottom, - padding_left=self._padding_left, - padding_right=self._padding_right, - max_dim=int(np.max(self._image_dimensions_HW)), - ) - - def process(self, image: UInt8[np.ndarray, "h w 3"]) -> Float64[np.ndarray, "3 network_input_h network_input_w"]: - self._image_dimensions_HW = image.shape[:2] # type: ignore[assignment] - self._calculate_paddings() - - image = self._normalize_image_to_range_0_1(image) - image = self._pad_to_square(image) - image = self._resize_to_network_input_shape(image) - image = self._rearrange_axes_from_hwc_to_chw(image) - - return image - - def _calculate_paddings(self) -> None: - height, width = self._image_dimensions_HW - - total_vertical_padding = max(0, width - height) - total_horizontal_padding = max(0, height - width) - - self._padding_top = total_vertical_padding // 2 - self._padding_bottom = total_vertical_padding - self._padding_top - self._padding_left = total_horizontal_padding // 2 - self._padding_right = total_horizontal_padding - self._padding_left - - @staticmethod - def _normalize_image_to_range_0_1(image: np.ndarray) -> np.ndarray: - return image / 255 - - def _pad_to_square(self, image: np.ndarray) -> np.ndarray: - return cv2.copyMakeBorder( - src=image, - top=self._padding_top, - bottom=self._padding_bottom, - left=self._padding_left, - right=self._padding_right, - borderType=cv2.BORDER_CONSTANT, - value=0, - ) # type: ignore[call-overload] - - def _resize_to_network_input_shape(self, image: np.ndarray) -> np.ndarray: - return cv2.resize(src=image, dsize=self._network_input_shape_WH) - - @staticmethod - def _rearrange_axes_from_hwc_to_chw(image: np.ndarray) -> np.ndarray: - # Change data layout from HWC to CHW - return np.moveaxis(image, 2, 0) - - def reset(self) -> None: - self._image_dimensions_HW = (0, 0) - self._padding_top = 0 - self._padding_bottom = 0 - self._padding_left = 0 - self._padding_right = 0 - - -class DefaultSegmentationPostProcessor(ISegmentationPostProcessor): - def __init__(self, image_preprocessor: IImagePreProcessor): - self._image_preprocessor = image_preprocessor - - # these attributes change for every segmentation! - self._max_dim: int = 0 - self._padding_top: int = 0 - self._padding_bottom: int = 0 - self._padding_left: int = 0 - self._padding_right: int = 0 - - def configure(self, image_preprocessor: IImagePreProcessor) -> None: - self._image_preprocessor = image_preprocessor - - def process(self, segmentation: np.ndarray) -> np.ndarray: - self._get_preprocessor_info() - segmentation = self._rearrange_axes_from_chw_to_hwc(segmentation) - segmentation = self._resize_to_original_padded_size(segmentation) - segmentation = self._unpad(segmentation) - - return segmentation - - def _get_preprocessor_info(self) -> None: - preprocessor_info = self._image_preprocessor.get_info() - self._max_dim = preprocessor_info.max_dim - self._padding_top = preprocessor_info.padding_top - self._padding_bottom = preprocessor_info.padding_bottom - self._padding_left = preprocessor_info.padding_left - self._padding_right = preprocessor_info.padding_right - - @staticmethod - def _rearrange_axes_from_chw_to_hwc(segmentation: np.ndarray) -> np.ndarray: - # Change data layout from CHW to HWC - return np.moveaxis(segmentation, 0, -1) - - def _resize_to_original_padded_size(self, segmentation: np.ndarray) -> np.ndarray: - return cv2.resize(src=segmentation, dsize=(self._max_dim, self._max_dim), interpolation=cv2.INTER_NEAREST_EXACT) - - def _unpad(self, segmentation: np.ndarray) -> np.ndarray: - return segmentation[ - self._padding_top : self._max_dim - self._padding_bottom, - self._padding_left : self._max_dim - self._padding_right, - ..., - ] - - -class DefaultDetectionPostProcessor(IDetectionPostProcessor): - def __init__( - self, - image_preprocessor: IImagePreProcessor, - output_img_size: int, - conf_thresh: float, - nms_thresh: float, - robot_class_ids: list[int], - ): - self._image_preprocessor: IImagePreProcessor = image_preprocessor - self._output_img_size: int = output_img_size - self._conf_thresh: float = conf_thresh - self._nms_thresh: float = nms_thresh - - # These values are needed in order to perform a proper nms if multiple robot classes exist, - # i. e. if nms shall be performed across all robot classes and not per robot class - self._robot_class_ids = robot_class_ids - - self._nms_max_number_of_boxes = 30000 - self._nms_max_number_of_detections_per_image = 30 - self._nms_max_width_height_in_pixels = 4096 - - # these attributes change for every segmentation! - self._max_dim: int = 0 - self._padding_top: int = 0 - self._padding_bottom: int = 0 - self._padding_left: int = 0 - self._padding_right: int = 0 - - def configure( - self, - image_preprocessor: IImagePreProcessor, - output_img_size: int, - conf_thresh: float, - nms_thresh: float, - robot_class_ids: list[int], - ) -> None: - self._image_preprocessor = image_preprocessor - self._output_img_size = output_img_size - self._conf_thresh = conf_thresh - self._nms_thresh = nms_thresh - self._robot_class_ids = robot_class_ids - - def process(self, detections: np.ndarray) -> np.ndarray: - self._get_preprocessor_info() - detections = self._perform_nms(detections[0, ...]) - detections = self._rescale_boxes(detections) - - return detections - - def _get_preprocessor_info(self) -> None: - preprocessor_info = self._image_preprocessor.get_info() - self._max_dim = preprocessor_info.max_dim - self._padding_top = preprocessor_info.padding_top - self._padding_bottom = preprocessor_info.padding_bottom - self._padding_left = preprocessor_info.padding_left - self._padding_right = preprocessor_info.padding_right - - def _perform_nms(self, detections: np.ndarray) -> np.ndarray: - detections = self._preprocess_detections_for_nms(detections) - - boxes, scores = self._get_boxes_and_scores_for_nms(detections) - indices = cv2.dnn.NMSBoxes( - bboxes=boxes, - scores=scores, - score_threshold=0, - nms_threshold=self._nms_thresh, - top_k=self._nms_max_number_of_detections_per_image, - ) - - output = self._postprocess_nms_output(detections, indices) - - return output - - def _preprocess_detections_for_nms(self, detections: np.ndarray) -> np.ndarray: - detections = self._filter_by_objectness_confidence(detections) - detections = self._calculate_class_confidence_scores(detections) - detections = self._pin_down_last_dimension_to_6(detections) - - return detections - - def _filter_by_objectness_confidence(self, detections: np.ndarray) -> np.ndarray: - return detections[detections[:, 4] > self._conf_thresh] - - @staticmethod - def _calculate_class_confidence_scores(detections: np.ndarray) -> np.ndarray: - # class_confidence_score = conditional_class_probability * box_confidence_score (objectness) - # p(class, object) = p(class | object) * p(object) - detections[:, 5:] *= detections[:, 4:5] - - return detections - - def _pin_down_last_dimension_to_6(self, detections: np.ndarray) -> np.ndarray: - box_coordinates = detections[:, :4] - class_confidence_scores = detections[:, 5:] - - i, j = (class_confidence_scores > self._conf_thresh).nonzero() - x = np.concatenate((box_coordinates[i], class_confidence_scores[i, j, None], j[:, None]), axis=1) - - return x - - def _get_boxes_and_scores_for_nms(self, detections: np.ndarray) -> tuple: - if self._robot_class_ids: - class_offsets = np.where( - self._is_robot_class(detections[:, 5:6]), self._robot_class_ids[0], detections[:, 5:6] - ) - else: - class_offsets = detections[:, 5:6].copy() - - class_offsets *= self._nms_max_width_height_in_pixels - - box_coords = detections[:, :4].copy() - box_coords[:, :2] += class_offsets - - return box_coords, detections[:, 4] - - def _is_robot_class(self, detections: np.ndarray) -> np.ndarray: - return np.isin(detections, self._robot_class_ids) - - def _postprocess_nms_output(self, detections: np.ndarray, nms_indices) -> np.ndarray: - detections = detections[nms_indices] - detections = self._convert_box_coordinates(detections) - - return detections - - @staticmethod - def _convert_box_coordinates(boxes: np.ndarray) -> np.ndarray: - """ - Transform bounding box coordinates from xywh format (centroid coordinates, width, height) to xyxy format (upper - left coordinates, lower right coordinates) - :param boxes: boxes with coordinates in xywh format (axis layout: number of boxes, boxes) - :type boxes: np.ndarray - :return: boxes with coordinates in xyxy format (axis layout: number of boxes, boxes) - :rtype: np.ndarray - """ - coordinates_xyxy = np.zeros_like(boxes[:, :4]) - coordinates_xyxy[..., 0] = boxes[..., 0] - boxes[..., 2] / 2 - coordinates_xyxy[..., 1] = boxes[..., 1] - boxes[..., 3] / 2 - coordinates_xyxy[..., 2] = boxes[..., 0] + boxes[..., 2] / 2 - coordinates_xyxy[..., 3] = boxes[..., 1] + boxes[..., 3] / 2 - boxes[:, :4] = coordinates_xyxy - - return boxes - - def _rescale_boxes(self, boxes): - rescaled_boxes = self._rescale_boxes_to_original_padded_img_size(boxes) - rescaled_boxes = self._unpad_box_coordinates(rescaled_boxes) - - return rescaled_boxes - - def _rescale_boxes_to_original_padded_img_size(self, boxes): - scale_factor = self._max_dim / self._output_img_size - boxes[:, 0:4] = boxes[:, 0:4] * scale_factor - - return boxes - - def _unpad_box_coordinates(self, boxes): - boxes[:, 0] = boxes[:, 0] - self._padding_left - boxes[:, 1] = boxes[:, 1] - self._padding_top - boxes[:, 2] = boxes[:, 2] - self._padding_left - boxes[:, 3] = boxes[:, 3] - self._padding_top - - return boxes diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/vision_components.py b/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/vision_components.py deleted file mode 100644 index 2fd5d0a1ff..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/vision_components.py +++ /dev/null @@ -1,289 +0,0 @@ -from __future__ import annotations - -from abc import ABC, abstractmethod - -import numpy as np -import rclpy -from rclpy.node import Node -from sensor_msgs.msg import Image -from soccer_vision_2d_msgs.msg import BallArray, GoalpostArray, Robot, RobotArray -from std_msgs.msg import Header - -from bitbots_vision.vision_modules import candidate, debug, ros_utils - -from . import yoeo_handlers - -logger = rclpy.logging.get_logger("yoeo_vision_components") - - -class AbstractVisionComponent(ABC): - """ - Abstract class for the YOEO vision components. - """ - - def __init__( - self, node: Node, yoeo_handler: yoeo_handlers.IYOEOHandler, debug_image: debug.DebugImage, config: dict - ): - self._node = node - self._yoeo_handler = yoeo_handler - self._debug_image = debug_image - self._config = config - - @abstractmethod - def run(self, image: np.ndarray, header: Header) -> None: - """ - This method runs the vision component. - """ - ... - - -class YOEOComponent(AbstractVisionComponent): - """ - This component runs the YOEO network. It is MANDATORY and must be run BEFORE any of the other components. - """ - - def run(self, image: np.ndarray, header: Header) -> None: - self._yoeo_handler.set_image(image) - self._yoeo_handler.predict() - - -class BallDetectionComponent(AbstractVisionComponent): - """ - This component carries out the ball detection using YOEO. - """ - - def __init__( - self, node: Node, yoeo_handler: yoeo_handlers.IYOEOHandler, debug_image: debug.DebugImage, config: dict - ): - super().__init__(node, yoeo_handler, debug_image, config) - - self._publisher = self._node.create_publisher(BallArray, self._config["ROS_ball_msg_topic"], qos_profile=1) - - def run(self, image: np.ndarray, header: Header) -> None: - # Get all ball candidates from YOEO - candidates = self._yoeo_handler.get_detection_candidates_for("ball") - - # Filter candidates by rating and count - candidates = candidate.Candidate.sort_candidates(candidates) - top_candidates = candidates[: self._config["ball_candidate_max_count"]] - final_candidates = candidate.Candidate.rating_threshold( - top_candidates, self._config["ball_candidate_rating_threshold"] - ) - - # Publish ball candidates - self._publish_balls_message(header, final_candidates) - - # Draw candidates on debug image - self._debug_image.draw_ball_candidates(candidates, DebugImageComponent.Colors.ball, thickness=1) - self._debug_image.draw_ball_candidates(final_candidates, DebugImageComponent.Colors.ball, thickness=3) - - def _publish_balls_message(self, header: Header, candidates: list[candidate.Candidate]) -> None: - ball_messages = list(map(ros_utils.build_ball_msg, candidates)) - balls_message = ros_utils.build_ball_array_msg(header, ball_messages) - assert self._publisher is not None, "Publisher not set!" - self._publisher.publish(balls_message) - - -class GoalpostDetectionComponent(AbstractVisionComponent): - """ - This component carries out the goalpost detection using YOEO. - """ - - def __init__( - self, node: Node, yoeo_handler: yoeo_handlers.IYOEOHandler, debug_image: debug.DebugImage, config: dict - ): - super().__init__(node, yoeo_handler, debug_image, config) - - self._publisher = self._node.create_publisher( - GoalpostArray, self._config["ROS_goal_posts_msg_topic"], qos_profile=1 - ) - - def run(self, image: np.ndarray, header: Header) -> None: - # Get all goalpost candidates from YOEO - candidates = self._yoeo_handler.get_detection_candidates_for("goalpost") - - # Publish goalpost candidates - self._publish_goalposts_message(header, candidates) - - # Draw candidates on debug image - self._debug_image.draw_robot_candidates(candidates, DebugImageComponent.Colors.goalposts, thickness=1) - self._debug_image.draw_robot_candidates(candidates, DebugImageComponent.Colors.goalposts, thickness=3) - - def _publish_goalposts_message(self, header: Header, candidates: list[candidate.Candidate]) -> None: - goalpost_messages = [ros_utils.build_goal_post_msg(candidate) for candidate in candidates] - goalposts_message = ros_utils.build_goal_post_array_msg(header, goalpost_messages) - assert self._publisher is not None, "Publisher not set!" - self._publisher.publish(goalposts_message) - - -class LineDetectionComponent(AbstractVisionComponent): - """ - This component carries out the line detection using YOEO. - """ - - def __init__( - self, node: Node, yoeo_handler: yoeo_handlers.IYOEOHandler, debug_image: debug.DebugImage, config: dict - ): - super().__init__(node, yoeo_handler, debug_image, config) - self._publisher = self._node.create_publisher(Image, self._config["ROS_line_mask_msg_topic"], qos_profile=1) - - def run(self, image: np.ndarray, header: Header) -> None: - # Get line mask from YOEO - line_mask = (self._yoeo_handler.get_segmentation_mask_for("lines")) * 255 - - # Publish line mask - self._publish_line_mask_msg(header, line_mask) - - # Draw line mask on debug image - self._debug_image.draw_mask(line_mask, color=DebugImageComponent.Colors.lines) - - def _publish_line_mask_msg(self, header: Header, line_mask: np.ndarray) -> None: - line_mask_msg = ros_utils.build_image_msg(header, line_mask, "8UC1") - assert self._publisher is not None, "Publisher not set!" - self._publisher.publish(line_mask_msg) - - -class FieldDetectionComponent(AbstractVisionComponent): - """ - This component carries out the field detection using YOEO. - """ - - def __init__( - self, node: Node, yoeo_handler: yoeo_handlers.IYOEOHandler, debug_image: debug.DebugImage, config: dict - ): - super().__init__(node, yoeo_handler, debug_image, config) - self._publisher = self._node.create_publisher( - Image, self._config["ROS_field_mask_image_msg_topic"], qos_profile=1 - ) - - def run(self, image: np.ndarray, header: Header) -> None: - # Get field mask from YOEO - field_mask = (self._yoeo_handler.get_segmentation_mask_for("field")) * 255 - - # Publish field mask - self._publish_field_mask_msg(header, field_mask) - - def _publish_field_mask_msg(self, header: Header, field_mask: np.ndarray) -> None: - field_mask_msg = ros_utils.build_image_msg(header, field_mask, "8UC1") - assert self._publisher is not None, "Publisher not set!" - self._publisher.publish(field_mask_msg) - - -class RobotDetectionComponent(AbstractVisionComponent): - """ - This component carries out the robot detection using YOEO with team color detection done by YOEO. - """ - - def __init__( - self, - node: Node, - yoeo_handler: yoeo_handlers.IYOEOHandler, - debug_image: debug.DebugImage, - config: dict, - team_color_detection_supported: bool, - ): - super().__init__(node, yoeo_handler, debug_image, config) - - self._team_color_detection_supported = team_color_detection_supported - self._publisher = self._node.create_publisher(RobotArray, self._config["ROS_robot_msg_topic"], qos_profile=1) - - def run(self, image: np.ndarray, header: Header) -> None: - robot_msgs: list[Robot] = [] - own_color = ros_utils.get_robot_color_for_team(Robot().attributes.TEAM_OWN) - assert own_color != ros_utils.RobotColor.UNKNOWN - opponent_color = ros_utils.get_robot_color_for_team(Robot().attributes.TEAM_OPPONENT) - - if self._team_color_detection_supported: - # add team mates to robots_msgs - team_mate_candidates = self.get_candidates(own_color) - team_mate_candidate_messages = self._create_robots_messages( - Robot().attributes.TEAM_OWN, team_mate_candidates - ) - robot_msgs.extend(team_mate_candidate_messages) - - # add opponents to robots_msgs - opponent_candidates = self.get_candidates(opponent_color) - opponent_candidate_messages = self._create_robots_messages( - Robot().attributes.TEAM_OPPONENT, opponent_candidates - ) - robot_msgs.extend(opponent_candidate_messages) - - # add remaining robots to robots_msgs - remaining_candidates = self.get_candidates(ros_utils.RobotColor.UNKNOWN) - remaining_candidate_messages = self._create_robots_messages( - Robot().attributes.TEAM_UNKNOWN, remaining_candidates - ) - robot_msgs.extend(remaining_candidate_messages) - else: - robot_candidates = self._yoeo_handler.get_detection_candidates_for("robot") - robot_candidate_messages = [ - ros_utils.build_robot_msg(robot_candidate) for robot_candidate in robot_candidates - ] - robot_msgs.extend(robot_candidate_messages) - - self._publish_robots_message(header, robot_msgs) - - if self._team_color_detection_supported: - self._debug_image.draw_robot_candidates( - team_mate_candidates, DebugImageComponent.Colors.robot_team_mates, thickness=3 - ) - self._debug_image.draw_robot_candidates( - opponent_candidates, DebugImageComponent.Colors.robot_opponents, thickness=3 - ) - self._debug_image.draw_robot_candidates( - remaining_candidates, DebugImageComponent.Colors.robot_unknown, thickness=3 - ) - else: - self._debug_image.draw_robot_candidates( - robot_candidates, DebugImageComponent.Colors.robot_unknown, thickness=3 - ) - - def get_candidates(self, team_color: ros_utils.RobotColor) -> list[candidate.Candidate]: - candidates: list[candidate.Candidate] = [] - if team_color == ros_utils.RobotColor.BLUE: - candidates = self._yoeo_handler.get_detection_candidates_for("robot_blue") - elif team_color == ros_utils.RobotColor.RED: - candidates = self._yoeo_handler.get_detection_candidates_for("robot_red") - else: - candidates = self._yoeo_handler.get_detection_candidates_for("robot_unknown") - return candidates - - @staticmethod - def _create_robots_messages( - team: ros_utils.T_RobotAttributes_Team, candidates: list[candidate.Candidate] - ) -> list[Robot]: - return [ros_utils.build_robot_msg(robot_candidate, team) for robot_candidate in candidates] - - def _publish_robots_message(self, header: Header, robot_msgs: list[Robot]) -> None: - robots_msg = ros_utils.build_robot_array_msg(header, robot_msgs) - assert self._publisher is not None, "Publisher not set!" - self._publisher.publish(robots_msg) - - -class DebugImageComponent(AbstractVisionComponent): - """ - This component handles and publishes the debug image. - """ - - class Colors: - # BGR - ball = (0, 255, 0) # green - robot_team_mates = (255, 255, 102) # cyan - robot_opponents = (153, 51, 255) # magenta - robot_unknown = (160, 160, 160) # grey - team_mates = (153, 51, 255) # magenta - opponents = (255, 255, 102) # cyan - unknown_obstacles = (160, 160, 160) # grey - goalposts = (255, 255, 255) # white - lines = (255, 0, 0) # blue - - def __init__( - self, node: Node, yoeo_handler: yoeo_handlers.IYOEOHandler, debug_image: debug.DebugImage, config: dict - ): - super().__init__(node, yoeo_handler, debug_image, config) - - self._publisher = self._node.create_publisher(Image, self._config["ROS_debug_image_msg_topic"], qos_profile=1) - - def run(self, image: np.ndarray, header: Header) -> None: - debug_image_msg = ros_utils.build_image_msg(header, self._debug_image.get_image(), "bgr8") - self._publisher.publish(debug_image_msg) diff --git a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/yoeo_handlers.py b/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/yoeo_handlers.py deleted file mode 100644 index 5e0b90c92a..0000000000 --- a/src/bitbots_vision/bitbots_vision/vision_modules/yoeo/yoeo_handlers.py +++ /dev/null @@ -1,577 +0,0 @@ -from __future__ import annotations - -import os -from abc import ABC, abstractmethod -from collections import defaultdict -from typing import Optional - -import cv2 -import numpy as np -import rclpy - -from bitbots_vision.vision_modules.candidate import Candidate - -from . import utils - -logger = rclpy.logging.get_logger("vision_yoeo") - - -class IYOEOHandler(ABC): - """ - Interface of the YOEO handlers. - """ - - @abstractmethod - def configure(self, config: dict) -> None: - """ - Allows to (re-) configure the YOEO handler. - """ - ... - - @abstractmethod - def get_available_detection_class_names(self) -> list[str]: - """ - Returns the names of the classes that are part of the YOEO detection. - """ - ... - - @abstractmethod - def get_detection_candidates_for(self, class_name: str) -> list[Candidate]: - """ - Returns the detection candidates for a given class. - """ - ... - - @abstractmethod - def get_available_segmentation_class_names(self) -> list[str]: - """ - Returns the names of the classes that are part of the YOEO segmentation. - """ - ... - - @abstractmethod - def get_segmentation_mask_for(self, class_name: str) -> np.ndarray: - """ - Returns the segmentation mask for a given class. - - :return: the segmentation mask for class_name - :rtype: numpy.ndarray(shape=(height, width, 1)) - """ - ... - - @staticmethod - @abstractmethod - def model_files_exist(model_directory: str) -> bool: - """ - Checks whether the necessary model files exists in the model directory. - - :return: true if files exist, false if at least one file ist missing - :rtype: bool - """ - ... - - @abstractmethod - def predict(self) -> None: - """ - Runs the YOEO network (if necessary) on the current input image. - """ - ... - - @abstractmethod - def set_image(self, image: np.ndarray) -> None: - """ - A subsequent call to predict() will run the YOEO network on this image. - - :param image: the image to run the YOEO network on - :type image: np.ndarray - """ - ... - - -class YOEOHandlerTemplate(IYOEOHandler): - """ - Abstract base implementation of the IYOEOHandler interface. Actual YOEO handlers need to only implement the - following two hook methods if they inherit from this template: - - model_files_exist(model_directory: str) -> bool: - - _compute_new_prediction_for(self, image) -> tuple: - """ - - def __init__( - self, - config: dict, - model_directory: str, - det_class_names: list[str], - det_robot_class_ids: list[int], - seg_class_names: list[str], - ): - logger.debug("Entering YOEOHandlerTemplate constructor") - - self._det_candidates: dict = defaultdict(list) - self._det_class_names: list[str] = det_class_names - self._det_robot_class_ids: list[int] = det_robot_class_ids - - self._image: Optional[np.ndarray] = None - - self._prediction_is_up_to_date: bool = True - - self._seg_class_names: list[str] = seg_class_names - self._seg_masks: dict = dict() - - self._use_caching: bool = config["caching"] - - logger.debug("Leaving YOEOHandlerTemplate constructor") - - def configure(self, config: dict) -> None: - self._use_caching = config["caching"] - - def get_available_detection_class_names(self) -> list[str]: - return self._det_class_names - - def get_available_segmentation_class_names(self) -> list[str]: - return self._seg_class_names - - def get_detection_candidates_for(self, class_name: str) -> list[Candidate]: - assert class_name in self._det_class_names, ( - f"Class '{class_name}' is not available for the current YOEO model (detection)" - ) - - self.predict() - - return self._det_candidates[class_name] - - def get_robot_class_ids(self) -> list[int]: - return self._det_robot_class_ids - - def get_segmentation_mask_for(self, class_name: str): - assert class_name in self._seg_class_names, ( - f"Class '{class_name}' ist not available for the current YOEO model (segmentation)" - ) - - self.predict() - - return self._seg_masks[class_name] - - def predict(self) -> None: - if self._prediction_has_to_be_updated(): - logger.debug("Computing new prediction...") - assert self._image is not None, "No image set" - detections, segmentation = self._compute_new_prediction_for(self._image) - self._create_detection_candidate_lists_from(detections) - self._create_segmentation_masks_based_on(segmentation) - - self._prediction_is_up_to_date = True - - def _prediction_has_to_be_updated(self) -> bool: - return not self._use_caching or not self._prediction_is_up_to_date - - def _create_detection_candidate_lists_from(self, detections: np.ndarray) -> None: - for detection in detections: - c = Candidate.from_x1y1x2y2(*detection[0:4].astype(int), detection[4].astype(float)) # type: ignore[call-arg] - self._det_candidates[self._det_class_names[int(detection[5])]].append(c) - - def _create_segmentation_masks_based_on(self, segmentation) -> None: - for i, class_name in enumerate(self._seg_class_names): - seg_mask = (segmentation == i).astype(np.uint8) - self._seg_masks[class_name] = seg_mask - - def set_image(self, image: np.ndarray) -> None: - self._reset() - self._update_image(image) - - def _reset(self) -> None: - self._det_candidates = defaultdict(list) - self._seg_masks = dict() - - def _update_image(self, img: np.ndarray) -> None: - self._image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) - self._prediction_is_up_to_date = False - - @staticmethod - @abstractmethod - def model_files_exist(model_directory: str) -> bool: ... - - @abstractmethod - def _compute_new_prediction_for(self, image: np.ndarray) -> tuple[np.ndarray, np.ndarray]: - """ - Hook method to be implemented by actual YOEO handlers. - - :param image: the image that should be input into the network - :return: post-processed YOEO detections and segmentations (in this order) - """ - ... - - -class YOEOHandlerONNX(YOEOHandlerTemplate): - """ - YOEO handler for the ONNX framework. - - Framework version: 1.12.0 - see https://onnxruntime.ai/docs/get-started/with-python.html for ONNX documentation - """ - - def __init__( - self, - config: dict, - model_directory: str, - det_class_names: list[str], - det_robot_class_ids: list[int], - seg_class_names: list[str], - ): - super().__init__(config, model_directory, det_class_names, det_robot_class_ids, seg_class_names) - - logger.debug(f"Entering {self.__class__.__name__} constructor") - - onnx_path = YOEOPathGetter.get_onnx_onnx_file_path(model_directory) - - try: - import onnxruntime - except ImportError as e: - raise ImportError("Could not import onnxruntime. The selected handler requires this package.") from e - - logger.debug(f"Loading file...\n\t{onnx_path}") - self._inference_session = onnxruntime.InferenceSession(onnx_path, providers=["WebGpuExecutionProvider"]) - self._input_layer = self._inference_session.get_inputs()[0] - - self._img_preprocessor: utils.IImagePreProcessor = utils.DefaultImagePreProcessor( - tuple(self._input_layer.shape[2:]) - ) - self._det_postprocessor: utils.IDetectionPostProcessor = utils.DefaultDetectionPostProcessor( - image_preprocessor=self._img_preprocessor, - output_img_size=self._input_layer.shape[2], - conf_thresh=config["yoeo_conf_threshold"], - nms_thresh=config["yoeo_nms_threshold"], - robot_class_ids=self.get_robot_class_ids(), - ) - self._seg_postprocessor: utils.ISegmentationPostProcessor = utils.DefaultSegmentationPostProcessor( - self._img_preprocessor - ) - - logger.debug(f"Leaving {self.__class__.__name__} constructor") - - def configure(self, config: dict) -> None: - super().configure(config) - self._det_postprocessor.configure( - image_preprocessor=self._img_preprocessor, - output_img_size=self._input_layer.shape[2], - conf_thresh=config["yoeo_conf_threshold"], - nms_thresh=config["yoeo_nms_threshold"], - robot_class_ids=self.get_robot_class_ids(), - ) - - @staticmethod - def model_files_exist(model_directory: str) -> bool: - return os.path.exists(YOEOPathGetter.get_onnx_onnx_file_path(model_directory)) - - def _compute_new_prediction_for(self, image: np.ndarray) -> tuple[np.ndarray, np.ndarray]: - preproccessed_image = self._img_preprocessor.process(image) - - network_input = preproccessed_image.reshape(self._input_layer.shape) - outputs = self._inference_session.run(None, {"InputLayer": network_input.astype(np.float32)}) - - detections = self._det_postprocessor.process(outputs[0]) - segmentation = self._seg_postprocessor.process(outputs[1]) - - return detections, segmentation - - -class YOEOHandlerOpenVino(YOEOHandlerTemplate): - """ - YOEO handler for the OpenVino framework. - - Framework version: OpenVINO 2022.1 - Code is based on https://docs.openvino.ai/latest/notebooks/002-openvino-api-with-output.html (April 9, 2022) - """ - - def __init__( - self, - config: dict, - model_directory: str, - det_class_names: list[str], - det_robot_class_ids: list[int], - seg_class_names: list[str], - ): - super().__init__(config, model_directory, det_class_names, det_robot_class_ids, seg_class_names) - - logger.debug(f"Entering {self.__class__.__name__} constructor") - - xml_path = YOEOPathGetter.get_openvino_xml_file_path(model_directory) - bin_path = YOEOPathGetter.get_openvino_bin_file_path(model_directory) - - try: - from openvino.runtime import Core as openvino_runtime_Core - except ImportError as e: - raise ImportError("Could not import openvino. The selected handler requires this package.") from e - - self._inference_engine = openvino_runtime_Core() - - logger.debug(f"Loading files...\n\t{xml_path}\n\t{bin_path}") - model = self._inference_engine.read_model(model=xml_path, weights=bin_path) - device = self._select_device() - - logger.debug(f"Compiling network on device '{device}'...") - self._compiled_model = self._inference_engine.compile_model(model=model, device_name=device) - - self._input_layer = self._compiled_model.inputs[0] - self._output_layer_detections = self._compiled_model.outputs[0] - self._output_layer_segmentations = self._compiled_model.outputs[1] - - _, _, height, width = self._input_layer.shape - self._img_preprocessor: utils.IImagePreProcessor = utils.DefaultImagePreProcessor((height, width)) - self._det_postprocessor: utils.IDetectionPostProcessor = utils.DefaultDetectionPostProcessor( - image_preprocessor=self._img_preprocessor, - output_img_size=self._input_layer.shape[2], - conf_thresh=config["yoeo_conf_threshold"], - nms_thresh=config["yoeo_nms_threshold"], - robot_class_ids=self.get_robot_class_ids(), - ) - self._seg_postprocessor: utils.ISegmentationPostProcessor = utils.DefaultSegmentationPostProcessor( - self._img_preprocessor - ) - - logger.debug(f"Leaving {self.__class__.__name__} constructor") - - def _select_device(self) -> str: - if "MYRIAD" in self._inference_engine.available_devices: # NCS2 stick - device = "MYRIAD" - else: - device = "CPU" - return device - - def configure(self, config: dict) -> None: - super().configure(config) - self._det_postprocessor.configure( - image_preprocessor=self._img_preprocessor, - output_img_size=self._input_layer.shape[2], - conf_thresh=config["yoeo_conf_threshold"], - nms_thresh=config["yoeo_nms_threshold"], - robot_class_ids=self.get_robot_class_ids(), - ) - - @staticmethod - def model_files_exist(model_directory: str) -> bool: - return os.path.exists(YOEOPathGetter.get_openvino_bin_file_path(model_directory)) and os.path.exists( - YOEOPathGetter.get_openvino_xml_file_path(model_directory) - ) - - def _compute_new_prediction_for(self, image: np.ndarray) -> tuple[np.ndarray, np.ndarray]: - preproccessed_image = self._img_preprocessor.process(image) - - network_input = preproccessed_image.reshape(self._input_layer.shape) - network_output = self._compiled_model(inputs=[network_input]) - - detections = self._det_postprocessor.process(network_output[self._output_layer_detections]) - segmentation = self._seg_postprocessor.process(network_output[self._output_layer_segmentations]) - - return detections, segmentation - - -class YOEOHandlerPytorch(YOEOHandlerTemplate): - """ - YOEO handler for the PyTorch framework - """ - - def __init__( - self, - config: dict, - model_directory: str, - det_class_names: list[str], - det_robot_class_ids: list[int], - seg_class_names: list[str], - ): - super().__init__(config, model_directory, det_class_names, det_robot_class_ids, seg_class_names) - - logger.debug(f"Entering {self.__class__.__name__} constructor") - - config_path = YOEOPathGetter.get_pytorch_cfg_file_path(model_directory) - weights_path = YOEOPathGetter.get_pytorch_pth_file_path(model_directory) - - try: - from yoeo import detect as torch_detect - from yoeo import models as torch_models - from yoeo.utils.dataclasses import GroupConfig as torch_GroupConfig - - self.torch_detect = torch_detect - self.torch_group_config = torch_GroupConfig - except ImportError as e: - raise ImportError("Could not import yoeo. The selected handler requires this package.") from e - - logger.debug(f"Loading files...\n\t{config_path}\n\t{weights_path}") - self._model = torch_models.load_model(config_path, weights_path) - - self._conf_thresh: float = config["yoeo_conf_threshold"] - self._nms_thresh: float = config["yoeo_nms_threshold"] - self._group_config: torch_GroupConfig = self._update_group_config() - - logger.debug(f"Leaving {self.__class__.__name__} constructor") - - def _update_group_config(self): - robot_class_ids = self.get_robot_class_ids() - - return self.torch_group_config(group_ids=robot_class_ids, surrogate_id=robot_class_ids[0]) - - def configure(self, config: dict) -> None: - super().configure(config) - self._conf_thresh = config["yoeo_conf_threshold"] - self._nms_thresh = config["yoeo_nms_threshold"] - self._group_config = self._update_group_config() - - @staticmethod - def model_files_exist(model_directory: str) -> bool: - return os.path.exists(YOEOPathGetter.get_pytorch_cfg_file_path(model_directory)) and os.path.exists( - YOEOPathGetter.get_pytorch_pth_file_path(model_directory) - ) - - def _compute_new_prediction_for(self, image: np.ndarray) -> tuple[np.ndarray, np.ndarray]: - detections, segmentation = self.torch_detect.detect_image( - self._model, - image, - conf_thres=self._conf_thresh, - nms_thres=self._nms_thresh, - group_config=self._group_config, - ) - - segmentation = self._postprocess_segmentation(segmentation) - - return detections, segmentation - - @staticmethod - def _postprocess_segmentation(segmentations: np.ndarray) -> np.ndarray: - return np.moveaxis(segmentations, 0, -1) - - -class YOEOHandlerTVM(YOEOHandlerTemplate): - """ - YOEO handler for the TVM framework. - """ - - def __init__( - self, - config: dict, - model_directory: str, - det_class_names: list[str], - det_robot_class_ids: list[int], - seg_class_names: list[str], - ): - super().__init__(config, model_directory, det_class_names, det_robot_class_ids, seg_class_names) - - logger.debug(f"Entering {self.__class__.__name__} constructor") - - json_path = YOEOPathGetter.get_tvm_json_file_path(model_directory) - params_path = YOEOPathGetter.get_tvm_params_file_path(model_directory) - binary_path = YOEOPathGetter.get_tvm_so_file_path(model_directory) - - try: - import tvm - from tvm.contrib import graph_executor - except ImportError as e: - raise ImportError("Unable to import tvm. The selected handler requires this package.") from e - - logger.debug(f"Loading files...\n\t{binary_path}\n\t{params_path}\n\t{json_path}") - binary_lib = tvm.runtime.load_module(binary_path) - loaded_params = bytearray(open(params_path, "rb").read()) - loaded_json = open(json_path).read() - - device = tvm.vulkan() if tvm.vulkan().exist else tvm.cpu() - - logger.debug(f"Creating network on device '{device}'...") - self._model = graph_executor.create(loaded_json, binary_lib, device) - self._model.load_params(loaded_params) - - input_shape_dict, _ = self._model.get_input_info() - self._input_layer_shape = input_shape_dict.get("InputLayer") - - height, width = self._input_layer_shape[2], self._input_layer_shape[3] - self._img_preprocessor: utils.IImagePreProcessor = utils.DefaultImagePreProcessor((height, width)) - self._det_postprocessor: utils.IDetectionPostProcessor = utils.DefaultDetectionPostProcessor( - image_preprocessor=self._img_preprocessor, - output_img_size=self._input_layer_shape[2], - conf_thresh=config["yoeo_conf_threshold"], - nms_thresh=config["yoeo_nms_threshold"], - robot_class_ids=self.get_robot_class_ids(), - ) - self._seg_postprocessor: utils.ISegmentationPostProcessor = utils.DefaultSegmentationPostProcessor( - self._img_preprocessor - ) - - logger.debug(f"Leaving {self.__class__.__name__} constructor") - - def configure(self, config: dict) -> None: - super().configure(config) - self._det_postprocessor.configure( - image_preprocessor=self._img_preprocessor, - output_img_size=self._input_layer_shape[2], - conf_thresh=config["yoeo_conf_threshold"], - nms_thresh=config["yoeo_nms_threshold"], - robot_class_ids=self.get_robot_class_ids(), - ) - - @staticmethod - def model_files_exist(model_directory: str) -> bool: - return ( - os.path.exists(YOEOPathGetter.get_tvm_json_file_path(model_directory)) - and os.path.exists(YOEOPathGetter.get_tvm_params_file_path(model_directory)) - and os.path.exists(YOEOPathGetter.get_tvm_so_file_path(model_directory)) - ) - - def _compute_new_prediction_for(self, image: np.ndarray) -> tuple[np.ndarray, np.ndarray]: - preproccessed_image = self._img_preprocessor.process(image) - network_input = preproccessed_image.reshape(self._input_layer_shape) - - self._model.set_input(InputLayer=network_input) - self._model.run() - - detections = self._det_postprocessor.process(self._model.get_output(0).numpy()) - segmentation = self._seg_postprocessor.process(self._model.get_output(1).numpy()) - - return detections, segmentation - - -class YOEOPathGetter: - """ - PathGetter class for all YOEO handlers. They idea behind this class is to have all path information in one place so - that it is easier to change this information if changes to the directory structure should become necessary. - Depending on the actual YOEO handler, certain framework specific methods provide the paths to the necessary files. - To make it more clear which methods to use, the framework specific methods follow the following naming scheme: - "get_'FRAMEWORK-NAME'_'FILE-EXTENSION'_file_path" - """ - - @classmethod - def _assemble_full_path(cls, model_directory: str, subdir: Optional[str], filename: str) -> str: - if subdir is None: - path = os.path.join(model_directory, filename) - else: - path = os.path.join(model_directory, subdir, filename) - - return path - - @classmethod - def get_onnx_onnx_file_path(cls, model_directory) -> str: - return cls._assemble_full_path(model_directory, "onnx", "yoeo.onnx") - - @classmethod - def get_openvino_bin_file_path(cls, model_directory: str) -> str: - return cls._assemble_full_path(model_directory, "openvino", "yoeo.bin") - - @classmethod - def get_openvino_xml_file_path(cls, model_directory) -> str: - return cls._assemble_full_path(model_directory, "openvino", "yoeo.xml") - - @classmethod - def get_pytorch_cfg_file_path(cls, model_directory: str) -> str: - return cls._assemble_full_path(model_directory, "pytorch", "yoeo.cfg") - - @classmethod - def get_pytorch_pth_file_path(cls, model_directory: str) -> str: - return cls._assemble_full_path(model_directory, "pytorch", "yoeo.pth") - - @classmethod - def get_tvm_json_file_path(cls, model_directory: str) -> str: - return cls._assemble_full_path(model_directory, "tvm", "yoeo.json") - - @classmethod - def get_tvm_params_file_path(cls, model_directory: str) -> str: - return cls._assemble_full_path(model_directory, "tvm", "yoeo.params") - - @classmethod - def get_tvm_so_file_path(cls, model_directory: str) -> str: - return cls._assemble_full_path(model_directory, "tvm", "yoeo.so") diff --git a/src/bitbots_vision/config/vision_parameters.yaml b/src/bitbots_vision/config/vision_parameters.yaml new file mode 100644 index 0000000000..a9c51c1ec1 --- /dev/null +++ b/src/bitbots_vision/config/vision_parameters.yaml @@ -0,0 +1,90 @@ +bitbots_vision: + topics: + image: + type: string + description: "ROS topic of the input image" + read_only: true + balls: + type: string + description: "ROS topic to publish detected balls" + read_only: true + robots: + type: string + description: "ROS topic to publish detected robots" + read_only: true + goalposts: + type: string + description: "ROS topic to publish detected goal posts" + read_only: true + line_mask: + type: string + description: "ROS topic to publish the line segmentation mask" + read_only: true + field_mask: + type: string + description: "ROS topic to publish the field segmentation mask" + read_only: true + debug_image: + type: string + description: "ROS topic to publish the debug image" + read_only: true + + model: + path: + type: string + description: > + Path to the YOEO model directory. + Must contain 'onnx/yoeo.onnx' and 'model_config.yaml'. + If the path does not exist, we try to resolve it as + '$CONDA_PREFIX/share/bitbots_model_', resolving it as a conda package name instead. + + yoeo: + conf_threshold: + type: double + description: "Objectness confidence threshold; detections below this value are discarded" + validation: + bounds<>: [0.0, 1.0] + + nms_threshold: + type: double + description: "Non-maximum suppression IoU threshold" + validation: + bounds<>: [0.0, 1.0] + + components: + ball_active: + type: bool + description: "Enable ball detection and publishing" + + robot_active: + type: bool + description: "Enable robot detection and publishing" + + goalpost_active: + type: bool + description: "Enable goal post detection and publishing" + + line_active: + type: bool + description: "Enable line segmentation mask publishing" + + field_active: + type: bool + description: "Enable field segmentation mask publishing" + + debug_active: + type: bool + description: "Enable debug image publishing" + + ball: + rating_threshold: + type: double + description: "Minimum confidence score to publish a ball candidate" + validation: + bounds<>: [0.0, 1.0] + + max_count: + type: int + description: "Maximum number of ball candidates to publish (sorted by confidence)" + validation: + bounds<>: [0, 50] diff --git a/src/bitbots_vision/config/visionparams.yaml b/src/bitbots_vision/config/visionparams.yaml index bca73cb0ae..ce1f33328e 100644 --- a/src/bitbots_vision/config/visionparams.yaml +++ b/src/bitbots_vision/config/visionparams.yaml @@ -1,28 +1,31 @@ bitbots_vision: ros__parameters: - # Defining the default vision parameters - component_ball_detection_active: true # activate the ball detection - component_debug_image_active: false # activate the debug image - component_field_detection_active: true # activate the field detection - component_goalpost_detection_active: false # activate the goalpost detection - component_line_detection_active: true # activate the line detection - component_robot_detection_active: true # activate the robot detection + topics: + image: "zed/zed_node/left/image_rect_color" + balls: "balls_in_image" + robots: "robots_in_image" + goalposts: "goal_posts_in_image" + line_mask: "line_mask_in_image" + field_mask: "field_mask" + debug_image: "debug_image" - ROS_img_msg_topic: "camera/image_proc" # ROS topic of the image message - ROS_ball_msg_topic: "balls_in_image" # ROS topic of the ball message - ROS_goal_posts_msg_topic: "goal_posts_in_image" # ROS topic of the goal posts message - ROS_robot_msg_topic: "robots_in_image" # ROS topic of the robots message - ROS_line_msg_topic: "line_in_image" # ROS topic of the line message - ROS_line_mask_msg_topic: "line_mask_in_image" # ROS topic of the line mask message - ROS_debug_image_msg_topic: "debug_image" # ROS topic of the debug image message - ROS_field_mask_image_msg_topic: "field_mask" # ROS topic of the field mask debug image message + model: + # Model directory name, resolved as $CONDA_PREFIX/share/bitbots_model_, + # or a direct absolute path if it already exists on the filesystem. + path: "2022_10_07_flo_torso21_yoeox" - yoeo_model_path: '2022_10_07_flo_torso21_yoeox' - yoeo_nms_threshold: 0.4 # Non-maximum suppression threshold - yoeo_conf_threshold: 0.5 # YOEO confidence threshold - yoeo_framework: 'tvm' # The neural network framework that should be used ['openvino', 'onnx', 'pytorch', 'tvm'] + yoeo: + conf_threshold: 0.5 + nms_threshold: 0.4 - ball_candidate_rating_threshold: 0.5 # A threshold for the minimum candidate rating - ball_candidate_max_count: 1 # The maximum number of balls that should be published + components: + ball_active: true + robot_active: true + goalpost_active: false + line_active: true + field_active: true + debug_active: false - caching: true # Used to deactivate caching for profiling reasons + ball: + rating_threshold: 0.5 + max_count: 1 diff --git a/src/bitbots_vision/config/visionparams_sim.yaml b/src/bitbots_vision/config/visionparams_sim.yaml index 9fefa9f331..2ee62067d7 100644 --- a/src/bitbots_vision/config/visionparams_sim.yaml +++ b/src/bitbots_vision/config/visionparams_sim.yaml @@ -1,28 +1,29 @@ bitbots_vision: ros__parameters: - # Defining the simulation parameters for YOEO vision - component_ball_detection_active: true # activate the ball detection - component_debug_image_active: false # activate the debug image - component_field_detection_active: true # activate the field detection - component_goalpost_detection_active: false # activate the goalpost detection - component_line_detection_active: true # activate the line detection - component_robot_detection_active: true # activate the robot detection + topics: + image: "camera/image_proc" + balls: "balls_in_image" + robots: "robots_in_image" + goalposts: "goal_posts_in_image" + line_mask: "line_mask_in_image" + field_mask: "field_mask" + debug_image: "debug_image" - ROS_img_msg_topic: "camera/image_proc" # ROS topic of the image message - ROS_ball_msg_topic: "balls_in_image" # ROS topic of the ball message - ROS_goal_posts_msg_topic: "goal_posts_in_image" # ROS topic of the goal posts message - ROS_robot_msg_topic: "robots_in_image" # ROS topic of the robots message - ROS_line_msg_topic: "line_in_image" # ROS topic of the line message - ROS_line_mask_msg_topic: "line_mask_in_image" # ROS topic of the line mask message - ROS_debug_image_msg_topic: "debug_image" # ROS topic of the debug image message - ROS_field_mask_image_msg_topic: "field_mask" # ROS topic of the field mask debug image message + model: + path: "2022_10_07_flo_torso21_yoeox" - yoeo_model_path: '2022_10_07_flo_torso21_yoeox' - yoeo_nms_threshold: 0.4 # Non-maximum suppression threshold - yoeo_conf_threshold: 0.5 # YOEO confidence threshold - yoeo_framework: 'onnx' # The neural network framework that should be used ['openvino', 'onnx', 'pytorch', 'tvm'] + yoeo: + conf_threshold: 0.5 + nms_threshold: 0.4 - ball_candidate_rating_threshold: 0.5 # A threshold for the minimum candidate rating - ball_candidate_max_count: 1 # The maximum number of balls that should be published + components: + ball_active: true + robot_active: true + goalpost_active: false + line_active: true + field_active: true + debug_active: false - caching: true # Used to deactivate caching for profiling reasons + ball: + rating_threshold: 0.5 + max_count: 1 diff --git a/src/bitbots_vision/docs/manual/yoeo_vision.rst b/src/bitbots_vision/docs/manual/yoeo_vision.rst index 191066d29b..8364b81176 100644 --- a/src/bitbots_vision/docs/manual/yoeo_vision.rst +++ b/src/bitbots_vision/docs/manual/yoeo_vision.rst @@ -10,7 +10,7 @@ segmentations for field lines, the field itself and the background. Furthermore, Supported Neural Network Frameworks ----------------------------------- -YOEOs can be run with the following frameworks: PyTorch, Onnx, OpenVino and TVM. +YOEOs can be run with the following frameworks: Onnx How to Add a New YOEO Variant to the Vision? -------------------------------------------- diff --git a/src/bitbots_vision/include/bitbots_vision/candidate.hpp b/src/bitbots_vision/include/bitbots_vision/candidate.hpp new file mode 100644 index 0000000000..c30fffb8dd --- /dev/null +++ b/src/bitbots_vision/include/bitbots_vision/candidate.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include +#include + +namespace bitbots_vision { + +/// Axis-aligned bounding box with a confidence rating, in pixel coordinates. +struct Candidate { + int x1{0}; ///< Upper-left x + int y1{0}; ///< Upper-left y + int width{0}; ///< Box width + int height{0}; ///< Box height + float rating{0.f}; + + static Candidate from_x1y1x2y2(int x1, int y1, int x2, int y2, float rating) { + return {std::min(x1, x2), std::min(y1, y2), std::abs(x2 - x1), std::abs(y2 - y1), rating}; + } + + int center_x() const { return x1 + width / 2; } + int center_y() const { return y1 + height / 2; } + int x2() const { return x1 + width; } + int y2() const { return y1 + height; } + int radius() const { return (width + height) / 4; } + + static std::vector sort_by_rating(std::vector candidates) { + std::sort(candidates.begin(), candidates.end(), + [](const Candidate& a, const Candidate& b) { return a.rating > b.rating; }); + return candidates; + } + + static std::vector filter_by_rating(const std::vector& candidates, float threshold) { + std::vector result; + for (const auto& c : candidates) { + if (c.rating > threshold) { + result.push_back(c); + } + } + return result; + } +}; + +} // namespace bitbots_vision diff --git a/src/bitbots_vision/include/bitbots_vision/debug_image.hpp b/src/bitbots_vision/include/bitbots_vision/debug_image.hpp new file mode 100644 index 0000000000..5ff03ca7b5 --- /dev/null +++ b/src/bitbots_vision/include/bitbots_vision/debug_image.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include "bitbots_vision/candidate.hpp" + +namespace bitbots_vision { + +/// Draws detection and segmentation results on a copy of the input image. +class DebugImage { + public: + // BGR color constants (cv::Scalar is not a literal type, so inline static const) + inline static const cv::Scalar kBall{0, 255, 0}; // green + inline static const cv::Scalar kRobotTeamMates{255, 255, 102}; // cyan + inline static const cv::Scalar kRobotOpponents{153, 51, 255}; // magenta + inline static const cv::Scalar kRobotUnknown{160, 160, 160}; // grey + inline static const cv::Scalar kGoalposts{255, 255, 255}; // white + inline static const cv::Scalar kLines{255, 0, 0}; // blue + + explicit DebugImage(bool active = false) : active_(active) {} + + void set_image(const cv::Mat& image); + + /// Draw a circle around each candidate (suitable for ball-shaped objects). + void draw_ball_candidates(const std::vector& candidates, const cv::Scalar& color, int thickness = 1); + + /// Draw a bounding rectangle for each candidate (suitable for robots, goalposts). + void draw_box_candidates(const std::vector& candidates, const cv::Scalar& color, int thickness = 1); + + /// Blend a segmentation mask over the debug image. + /// @param mask CV_8UC1 binary mask (non-zero = active) + void draw_mask(const cv::Mat& mask, const cv::Scalar& color, double opacity = 0.5); + + const cv::Mat& get_image() const { return image_; } + + private: + bool active_{false}; + cv::Mat image_; +}; + +} // namespace bitbots_vision diff --git a/src/bitbots_vision/include/bitbots_vision/model_config.hpp b/src/bitbots_vision/include/bitbots_vision/model_config.hpp new file mode 100644 index 0000000000..79451c2f1b --- /dev/null +++ b/src/bitbots_vision/include/bitbots_vision/model_config.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +namespace bitbots_vision { + +/// Configuration loaded from the model's `model_config.yaml`. +class ModelConfig { + public: + ModelConfig() = default; + + /// Load from `/model_config.yaml`. Throws on error. + static ModelConfig load_from(const std::string& model_dir); + + const std::vector& detection_classes() const { return detection_classes_; } + const std::vector& segmentation_classes() const { return segmentation_classes_; } + bool team_colors_provided() const { return team_colors_provided_; } + + /// Indices of all classes whose name contains "robot". + std::vector robot_class_ids() const; + + private: + std::vector detection_classes_; + std::vector segmentation_classes_; + bool team_colors_provided_{false}; +}; + +} // namespace bitbots_vision diff --git a/src/bitbots_vision/include/bitbots_vision/yoeo_handler.hpp b/src/bitbots_vision/include/bitbots_vision/yoeo_handler.hpp new file mode 100644 index 0000000000..b7750f02a2 --- /dev/null +++ b/src/bitbots_vision/include/bitbots_vision/yoeo_handler.hpp @@ -0,0 +1,93 @@ +#pragma once + +#include + +#include +#include +#include +#include +#include +#include + +#include "bitbots_vision/candidate.hpp" +#include "bitbots_vision/model_config.hpp" +#include "bitbots_vision/yoeo_processing.hpp" + +namespace bitbots_vision { + +/// ONNX-Runtime-based YOEO inference handler. +/// +/// Execution providers are tried in priority order: +/// TensorRT → CUDA → WebGPU → CPU (always available as fallback) +/// +/// The model must expose: +/// - one input named "InputLayer" shape [1, 3, H, W] +/// - two outputs: +/// [0] detections shape [1, N, 5+num_classes] (x_c, y_c, w, h, obj_conf, class_probs…) +/// [1] segmentation shape [1, H_seg, W_seg] (argmax class index per pixel) +class YoeoHandler { + public: + struct Config { + float conf_threshold{0.5f}; + float nms_threshold{0.4f}; + }; + + YoeoHandler(const std::string& model_path, const ModelConfig& model_config, const Config& cfg, + const rclcpp::Logger& logger); + + /// Update thresholds without reloading the model. + void reconfigure(const Config& cfg); + + /// Set the image to be processed by the next call to predict(). + /// The image must be in BGR8 format (as delivered by cv_bridge). + void set_image(const cv::Mat& bgr_image); + + /// Run the network on the current image (no-op if already up to date). + void predict(); + + std::vector get_detection_candidates_for(const std::string& class_name); + cv::Mat get_segmentation_mask_for(const std::string& class_name); + + const std::vector& detection_class_names() const; + const std::vector& segmentation_class_names() const; + + private: + // ----- ONNX Runtime objects ----- + Ort::Env env_; + Ort::SessionOptions session_options_; + std::unique_ptr session_; + + // ----- Model metadata ----- + std::vector input_shape_; // [1, 3, H_net, W_net] + std::string input_name_; + std::vector output_names_; + int num_det_classes_{0}; + std::vector robot_class_ids_; + std::vector det_class_names_; + std::vector seg_class_names_; + + // ----- Runtime state ----- + Config cfg_; + rclcpp::Logger logger_; + + cv::Mat current_image_rgb_; // float32, CHW layout, stored as [C, H, W] in flat vector + std::vector input_data_; + + bool prediction_is_fresh_{true}; + + // Preprocessing metadata for postprocessing + processing::PreprocessInfo preprocess_info_; + + // Cached results + std::unordered_map> det_results_; + std::unordered_map seg_results_; // CV_8UC1 binary masks + + // ----- Helpers ----- + void init_session(const std::string& model_path); + void preprocess(const cv::Mat& bgr_image); + void run_inference(); + void postprocess_detections(const float* det_data, const std::vector& shape); + void postprocess_segmentation(const uint8_t* seg_data, const std::vector& shape); +}; + +} // namespace bitbots_vision diff --git a/src/bitbots_vision/include/bitbots_vision/yoeo_processing.hpp b/src/bitbots_vision/include/bitbots_vision/yoeo_processing.hpp new file mode 100644 index 0000000000..a493b633ad --- /dev/null +++ b/src/bitbots_vision/include/bitbots_vision/yoeo_processing.hpp @@ -0,0 +1,117 @@ +#pragma once + +#include +#include +#include +#include + +#include "bitbots_vision/candidate.hpp" + +/// Pure preprocessing / postprocessing functions for YOEO inference. +/// +/// Extracted as standalone free functions so they can be unit-tested +/// without an ONNX session. +namespace bitbots_vision::processing { + +// --------------------------------------------------------------------------- +// Preprocessing +// --------------------------------------------------------------------------- + +/// Metadata produced by preprocess_image() that is needed to invert the +/// padding / scaling transforms in the postprocessors. +struct PreprocessInfo { + int orig_h{0}; + int orig_w{0}; + int max_dim{0}; ///< max(orig_h, orig_w) == side length of the padded square + int pad_top{0}; + int pad_bottom{0}; + int pad_left{0}; + int pad_right{0}; + int net_h{0}; + int net_w{0}; +}; + +/// Convert a BGR uint8 image to a normalised float32 CHW tensor suitable for +/// YOEO inference. +/// +/// Steps: +/// 1. BGR → RGB, normalise to [0, 1] +/// 2. Pad shorter axis with zeros to make the image square (max_dim × max_dim) +/// 3. Resize to (net_h, net_w) +/// 4. Rearrange axes HWC → CHW +/// +/// @param bgr Input image (CV_8UC3, BGR colour order) +/// @param net_h Network input height +/// @param net_w Network input width +/// @param info [out] Padding / sizing metadata for use in postprocessors +/// @return Flattened CHW float32 tensor of size 3 * net_h * net_w +std::vector preprocess_image(const cv::Mat& bgr, int net_h, int net_w, PreprocessInfo& info); + +// --------------------------------------------------------------------------- +// Non-maximum suppression +// --------------------------------------------------------------------------- + +/// NMS with cross-class suppression for robot classes. +/// +/// All robot class IDs share the same class-offset so they are suppressed +/// against each other (treating them as a single super-class). Non-robot +/// classes are suppressed independently. +/// +/// @param boxes Boxes in xywh format (center x, center y, w, h) +/// @param scores Confidence score per box +/// @param class_ids Class id per box +/// @param robot_class_ids IDs of all "robot" classes that share suppression +/// @param nms_threshold IoU threshold for suppression +/// @param max_detections Upper limit on kept boxes +/// @return Indices of kept boxes +std::vector nms_boxes(const std::vector& boxes, const std::vector& scores, + const std::vector& class_ids, const std::vector& robot_class_ids, + float nms_threshold, int max_detections = 30); + +// --------------------------------------------------------------------------- +// Detection postprocessing +// --------------------------------------------------------------------------- + +/// Postprocess raw YOEO detection output. +/// +/// Raw output layout: [1, N, 5 + num_classes] +/// per box: [x_c, y_c, w, h, obj_conf, class_prob_0, …] +/// all coordinates are in network-input-image space +/// +/// @param data Pointer to the first element of the output tensor +/// @param num_boxes N (number of raw anchor boxes) +/// @param stride 5 + num_classes +/// @param class_names Detection class names (index == class id) +/// @param robot_class_ids IDs of robot classes (for cross-class NMS) +/// @param conf_thresh Objectness × class-prob threshold +/// @param nms_thresh NMS IoU threshold +/// @param info Preprocessing metadata for coordinate rescaling +/// @return Map of class_name → kept Candidates +std::unordered_map> postprocess_detections( + const float* data, int64_t num_boxes, int64_t stride, const std::vector& class_names, + const std::vector& robot_class_ids, float conf_thresh, float nms_thresh, const PreprocessInfo& info); + +// --------------------------------------------------------------------------- +// Segmentation postprocessing +// --------------------------------------------------------------------------- + +/// Postprocess raw YOEO segmentation output. +/// +/// Raw output layout: [1, H_seg, W_seg] (argmax class-index map, float) +/// +/// Steps: +/// 1. Resize to the padded original image size (max_dim × max_dim) +/// 2. Unpad to original image size +/// 3. For each class index i build a binary CV_8UC1 mask (255 = active) +/// +/// @param data Pointer to the first element of the output tensor +/// @param seg_h H_seg +/// @param seg_w W_seg +/// @param class_names Segmentation class names (index == class id) +/// @param info Preprocessing metadata for unpadding +/// @return Map of class_name → CV_8UC1 binary mask +std::unordered_map postprocess_segmentation(const uint8_t* data, int seg_h, int seg_w, + const std::vector& class_names, + const PreprocessInfo& info); + +} // namespace bitbots_vision::processing diff --git a/src/bitbots_vision/launch/vision.launch b/src/bitbots_vision/launch/vision.launch index 21ab8e42c3..601e72aafa 100644 --- a/src/bitbots_vision/launch/vision.launch +++ b/src/bitbots_vision/launch/vision.launch @@ -1,32 +1,27 @@ - - - + + - - + - - - + - - - - - - - - - - + + + + + diff --git a/src/bitbots_vision/package.xml b/src/bitbots_vision/package.xml index ef99db0232..7a13ab01cf 100644 --- a/src/bitbots_vision/package.xml +++ b/src/bitbots_vision/package.xml @@ -2,52 +2,41 @@ bitbots_vision - - 1.4.1 + 2.0.0 - This is the vision ROS package of the Hamburg Bit-Bots. - - The vision is able to detect balls, lines, the field itself, the field boundary, goal posts, teammates, enemies and other obstacles. - - For further information and getting started, see the documentation of this package at our website: http://doku.bit-bots.de/package/bitbots_vision/latest/index.html + YOEO-based vision for the Hamburg Bit-Bots. + Detects balls, goal posts, robots, and segments field/lines using an ONNX model. + Runs inference via ONNX Runtime with TensorRT, CUDA, WebGPU, or CPU execution providers. Florian Vahl - Jan Gutsche Hamburg Bit-Bots MIT Florian Vahl Jan Gutsche - Hendrik Brandt - Niklas Fiedler Hamburg Bit-Bots - rosidl_default_generators - rosidl_default_runtime - bitbots_utils - game_controller_hsl_interfaces - geometry_msgs - image_transport - python3-numpy - python3-opencv - python3-yaml - rclpy + ament_cmake + + cv_bridge + generate_parameter_library + rclcpp sensor_msgs soccer_vision_2d_msgs + soccer_vision_attribute_msgs std_msgs - vision_opencv - ament_mypy + vision_msgs + + backward_ros - python3-pytest + ament_cmake_gtest + ament_lint_auto + ament_lint_common - - python3 - unknown - - ament_python + ament_cmake diff --git a/src/bitbots_vision/setup.cfg b/src/bitbots_vision/setup.cfg deleted file mode 100755 index c632d9b46e..0000000000 --- a/src/bitbots_vision/setup.cfg +++ /dev/null @@ -1,4 +0,0 @@ -[develop] -script_dir=$base/lib/bitbots_vision -[install] -install_scripts=$base/lib/bitbots_vision diff --git a/src/bitbots_vision/setup.py b/src/bitbots_vision/setup.py deleted file mode 100755 index 96b053d045..0000000000 --- a/src/bitbots_vision/setup.py +++ /dev/null @@ -1,35 +0,0 @@ -import glob -import os - -from setuptools import find_packages, setup - -package_name = "bitbots_vision" - - -setup( - name=package_name, - packages=find_packages(exclude=["test"]), - data_files=[ - ("share/ament_index/resource_index/packages", ["resource/" + package_name]), - ("share/" + package_name, ["package.xml"]), - ("share/" + package_name + "/config", glob.glob("config/*.yaml")), - ("share/" + package_name + "/launch", glob.glob("launch/*.launch")), - *[ - ("share/" + package_name + "/" + os.path.dirname(file), [file]) - for file in glob.glob("models/**/**/*.*", recursive=True) - ], - ], - install_requires=[ - "launch", - "setuptools", - ], - tests_require=["pytest"], - zip_safe=True, - keywords=["ROS"], - license="MIT", - entry_points={ - "console_scripts": [ - "vision = bitbots_vision.vision:main", - ], - }, -) diff --git a/src/bitbots_vision/src/debug_image.cpp b/src/bitbots_vision/src/debug_image.cpp new file mode 100644 index 0000000000..e7f26e1230 --- /dev/null +++ b/src/bitbots_vision/src/debug_image.cpp @@ -0,0 +1,44 @@ +#include "bitbots_vision/debug_image.hpp" + +#include + +namespace bitbots_vision { + +void DebugImage::set_image(const cv::Mat& image) { image_ = image.clone(); } + +void DebugImage::draw_ball_candidates(const std::vector& candidates, const cv::Scalar& color, + int thickness) { + if (!active_) { + return; + } + for (const auto& c : candidates) { + cv::circle(image_, {c.center_x(), c.center_y()}, c.radius(), color, thickness); + } +} + +void DebugImage::draw_box_candidates(const std::vector& candidates, const cv::Scalar& color, int thickness) { + if (!active_) { + return; + } + for (const auto& c : candidates) { + cv::rectangle(image_, {c.x1, c.y1}, {c.x2(), c.y2()}, color, thickness); + } +} + +void DebugImage::draw_mask(const cv::Mat& mask, const cv::Scalar& color, double opacity) { + if (!active_ || mask.empty()) { + return; + } + + cv::Mat color_layer(image_.size(), image_.type(), color); + cv::Mat blend; + cv::addWeighted(image_, 1.0 - opacity, color_layer, opacity, 0.0, blend); + + // Only apply blend where mask is non-zero + cv::Mat mask_bool; + cv::compare(mask, 0, mask_bool, cv::CMP_NE); + + blend.copyTo(image_, mask_bool); +} + +} // namespace bitbots_vision diff --git a/src/bitbots_vision/src/model_config.cpp b/src/bitbots_vision/src/model_config.cpp new file mode 100644 index 0000000000..d728c61a6b --- /dev/null +++ b/src/bitbots_vision/src/model_config.cpp @@ -0,0 +1,45 @@ +#include "bitbots_vision/model_config.hpp" + +#include + +#include +#include + +namespace bitbots_vision { + +ModelConfig ModelConfig::load_from(const std::string& model_dir) { + const std::string path = model_dir + "/model_config.yaml"; + if (!std::filesystem::exists(path)) { + throw std::runtime_error("model_config.yaml not found at: " + path); + } + + YAML::Node root = YAML::LoadFile(path); + + ModelConfig cfg; + + for (const auto& name : root["detection"]["classes"]) { + cfg.detection_classes_.push_back(name.as()); + } + + for (const auto& name : root["segmentation"]["classes"]) { + cfg.segmentation_classes_.push_back(name.as()); + } + + if (root["detection"]["team_colors"]) { + cfg.team_colors_provided_ = root["detection"]["team_colors"].as(); + } + + return cfg; +} + +std::vector ModelConfig::robot_class_ids() const { + std::vector ids; + for (int i = 0; i < static_cast(detection_classes_.size()); ++i) { + if (detection_classes_[i].find("robot") != std::string::npos) { + ids.push_back(i); + } + } + return ids; +} + +} // namespace bitbots_vision diff --git a/src/bitbots_vision/src/vision_node.cpp b/src/bitbots_vision/src/vision_node.cpp new file mode 100644 index 0000000000..dfe1ee2d99 --- /dev/null +++ b/src/bitbots_vision/src/vision_node.cpp @@ -0,0 +1,400 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bitbots_vision/candidate.hpp" +#include "bitbots_vision/debug_image.hpp" +#include "bitbots_vision/model_config.hpp" +#include "bitbots_vision/vision_parameters.hpp" // generated by generate_parameter_library +#include "bitbots_vision/yoeo_handler.hpp" + +namespace bitbots_vision { + +// --------------------------------------------------------------------------- +// Helpers for building ROS messages from Candidates +// --------------------------------------------------------------------------- + +static vision_msgs::msg::BoundingBox2D make_bbox(const Candidate& c) { + vision_msgs::msg::BoundingBox2D bb; + bb.center.position.x = static_cast(c.center_x()); + bb.center.position.y = static_cast(c.center_y()); + bb.size_x = static_cast(c.width); + bb.size_y = static_cast(c.height); + return bb; +} + +static soccer_vision_2d_msgs::msg::Ball make_ball_msg(const Candidate& c) { + soccer_vision_2d_msgs::msg::Ball msg; + msg.bb = make_bbox(c); + msg.center.x = static_cast(c.center_x()); + msg.center.y = static_cast(c.center_y()); + msg.confidence.confidence = c.rating; + return msg; +} + +static soccer_vision_2d_msgs::msg::Goalpost make_goalpost_msg(const Candidate& c) { + soccer_vision_2d_msgs::msg::Goalpost msg; + msg.bb = make_bbox(c); + msg.confidence.confidence = c.rating; + return msg; +} + +static soccer_vision_2d_msgs::msg::Robot make_robot_msg(const Candidate& c, uint8_t team) { + soccer_vision_2d_msgs::msg::Robot msg; + msg.bb = make_bbox(c); + msg.attributes.team = team; + msg.confidence.confidence = c.rating; + return msg; +} + +// --------------------------------------------------------------------------- +// VisionNode +// --------------------------------------------------------------------------- + +class VisionNode : public rclcpp::Node { + public: + explicit VisionNode(const rclcpp::NodeOptions& opts = rclcpp::NodeOptions{}) : Node("bitbots_vision", opts) { + // ---------- Parameters ---------- + param_listener_ = std::make_shared(get_node_parameters_interface()); + params_ = param_listener_->get_params(); + + // ---------- Team color ---------- + team_color_ = fetch_team_color(); + + // ---------- Model ---------- + load_model(resolve_model_path(params_.model.path)); + + // ---------- Publishers ---------- + // Ball + ball_pub_ = create_publisher(params_.topics.balls, rclcpp::QoS(1)); + // Robots + robot_pub_ = create_publisher(params_.topics.robots, rclcpp::QoS(1)); + // Goalposts + goalpost_pub_ = + create_publisher(params_.topics.goalposts, rclcpp::QoS(1)); + // Line mask + line_mask_pub_ = create_publisher(params_.topics.line_mask, rclcpp::QoS(1)); + // Field mask + field_mask_pub_ = create_publisher(params_.topics.field_mask, rclcpp::QoS(1)); + // Debug image + debug_image_pub_ = create_publisher(params_.topics.debug_image, rclcpp::QoS(1)); + + // ---------- Image subscriber ---------- + image_sub_ = create_subscription( + params_.topics.image, rclcpp::QoS(1), std::bind(&VisionNode::image_callback, this, std::placeholders::_1)); + + RCLCPP_INFO(get_logger(), "bitbots_vision ready"); + } + + private: + // ---- Parameters ---- + std::shared_ptr param_listener_; + bitbots_vision::Params params_; + + // ---- Model ---- + std::unique_ptr handler_; + ModelConfig model_config_; + std::string loaded_model_path_; + + // ---- Team color ---- + // 0 = UNKNOWN, 1 = BLUE, 2 = RED (from soccer_vision_attribute_msgs/Robot constants) + int team_color_{0}; + + // ---- Publishers ---- + rclcpp::Publisher::SharedPtr ball_pub_; + rclcpp::Publisher::SharedPtr robot_pub_; + rclcpp::Publisher::SharedPtr goalpost_pub_; + rclcpp::Publisher::SharedPtr line_mask_pub_; + rclcpp::Publisher::SharedPtr field_mask_pub_; + rclcpp::Publisher::SharedPtr debug_image_pub_; + + // ---- Subscriber ---- + rclcpp::Subscription::SharedPtr image_sub_; + + // ---- Debug image ---- + DebugImage debug_image_; + + // --------------------------------------------------------------------------- + // Model path resolution + // --------------------------------------------------------------------------- + + std::string resolve_model_path(const std::string& path) { + if (std::filesystem::exists(path)) { + return path; + } + // Try backward-compatible conda convention: $CONDA_PREFIX/share/bitbots_model_ + const char* prefix = std::getenv("CONDA_PREFIX"); + if (!prefix) { + prefix = std::getenv("PIXI_PREFIX"); + } + if (prefix) { + const std::string resolved = std::string(prefix) + "/share/bitbots_model_" + path; + if (std::filesystem::exists(resolved)) { + RCLCPP_INFO(get_logger(), "Resolved model path: %s", resolved.c_str()); + return resolved; + } + } + RCLCPP_WARN(get_logger(), "Model path '%s' does not exist and could not be resolved via CONDA_PREFIX / PIXI_PREFIX", + path.c_str()); + return path; + } + + // --------------------------------------------------------------------------- + // Model loading + // --------------------------------------------------------------------------- + + void load_model(const std::string& model_path) { + RCLCPP_INFO(get_logger(), "Loading model from: %s", model_path.c_str()); + model_config_ = ModelConfig::load_from(model_path); + + YoeoHandler::Config cfg; + cfg.conf_threshold = static_cast(params_.yoeo.conf_threshold); + cfg.nms_threshold = static_cast(params_.yoeo.nms_threshold); + + handler_ = std::make_unique(model_path, model_config_, cfg, get_logger()); + loaded_model_path_ = model_path; + } + + // --------------------------------------------------------------------------- + // Team color (non-fatal – defaults to UNKNOWN if blackboard not available) + // --------------------------------------------------------------------------- + + int fetch_team_color() { + using namespace std::chrono_literals; + try { + auto client = std::make_shared(this, "parameter_blackboard"); + if (!client->wait_for_service(2s)) { + RCLCPP_WARN(get_logger(), "parameter_blackboard not available; using TEAM_UNKNOWN"); + return 0; + } + // Spin a temporary executor to resolve the async call without blocking the node executor. + rclcpp::executors::SingleThreadedExecutor tmp_exec; + tmp_exec.add_node(this->get_node_base_interface()); + auto future = client->get_parameters({"team_color"}); + if (tmp_exec.spin_until_future_complete(future, 2s) == rclcpp::FutureReturnCode::SUCCESS) { + auto values = future.get(); + if (!values.empty()) { + return values[0].as_int(); + } + } + } catch (const std::exception& e) { + RCLCPP_WARN(get_logger(), "Could not fetch team_color: %s", e.what()); + } + return 0; // TEAM_UNKNOWN + } + + // --------------------------------------------------------------------------- + // Image callback – main processing pipeline + // --------------------------------------------------------------------------- + + void image_callback(const sensor_msgs::msg::Image::SharedPtr image_msg) { + // Pick up any parameter changes + if (param_listener_->is_old(params_)) { + params_ = param_listener_->get_params(); + reconfigure(); + } + + if (!handler_) { + return; + } + + cv::Mat bgr_image; + try { + bgr_image = cv_bridge::toCvCopy(image_msg, "bgr8")->image; + } catch (const cv_bridge::Exception& e) { + RCLCPP_ERROR(get_logger(), "cv_bridge exception: %s", e.what()); + return; + } + + const auto& header = image_msg->header; + + debug_image_ = DebugImage(params_.components.debug_active); + debug_image_.set_image(bgr_image); + + // Run the network once + handler_->set_image(bgr_image); + handler_->predict(); + + if (params_.components.ball_active) { + publish_balls(header); + } + if (params_.components.robot_active) { + publish_robots(header); + } + if (params_.components.goalpost_active) { + publish_goalposts(header); + } + if (params_.components.line_active) { + publish_line_mask(header); + } + if (params_.components.field_active) { + publish_field_mask(header); + } + if (params_.components.debug_active) { + publish_debug_image(header); + } + } + + // --------------------------------------------------------------------------- + // Reconfiguration on parameter changes + // --------------------------------------------------------------------------- + + void reconfigure() { + const std::string new_path = resolve_model_path(params_.model.path); + if (new_path != loaded_model_path_) { + load_model(new_path); + return; // handler was recreated, thresholds already applied + } + + if (handler_) { + YoeoHandler::Config cfg; + cfg.conf_threshold = static_cast(params_.yoeo.conf_threshold); + cfg.nms_threshold = static_cast(params_.yoeo.nms_threshold); + handler_->reconfigure(cfg); + } + } + + // --------------------------------------------------------------------------- + // Per-component publish methods + // --------------------------------------------------------------------------- + + void publish_balls(const std_msgs::msg::Header& header) { + auto candidates = handler_->get_detection_candidates_for("ball"); + candidates = Candidate::sort_by_rating(candidates); + if (params_.ball.max_count > 0 && static_cast(candidates.size()) > params_.ball.max_count) { + candidates.resize(static_cast(params_.ball.max_count)); + } + candidates = Candidate::filter_by_rating(candidates, static_cast(params_.ball.rating_threshold)); + + // Debug – draw all candidates with thin line, selected with thick line + { + auto all_cands = handler_->get_detection_candidates_for("ball"); + debug_image_.draw_ball_candidates(all_cands, DebugImage::kBall, 1); + debug_image_.draw_ball_candidates(candidates, DebugImage::kBall, 3); + } + + soccer_vision_2d_msgs::msg::BallArray msg; + msg.header = header; + for (const auto& c : candidates) { + msg.balls.push_back(make_ball_msg(c)); + } + ball_pub_->publish(msg); + } + + void publish_robots(const std_msgs::msg::Header& header) { + using RobotAttr = soccer_vision_attribute_msgs::msg::Robot; + + soccer_vision_2d_msgs::msg::RobotArray msg; + msg.header = header; + + if (model_config_.team_colors_provided()) { + // own_class / opponent_class based on our team color + const std::string own_class = (team_color_ == 1) ? "robot_blue" + : (team_color_ == 2) ? "robot_red" + : "robot_unknown"; + const std::string opp_class = (team_color_ == 1) ? "robot_red" + : (team_color_ == 2) ? "robot_blue" + : "robot_unknown"; + + for (const auto& c : handler_->get_detection_candidates_for(own_class)) { + msg.robots.push_back(make_robot_msg(c, RobotAttr::TEAM_OWN)); + debug_image_.draw_box_candidates({c}, DebugImage::kRobotTeamMates, 3); + } + for (const auto& c : handler_->get_detection_candidates_for(opp_class)) { + msg.robots.push_back(make_robot_msg(c, RobotAttr::TEAM_OPPONENT)); + debug_image_.draw_box_candidates({c}, DebugImage::kRobotOpponents, 3); + } + // unknown robots (if the model has this class) + for (const auto& c : handler_->get_detection_candidates_for("robot_unknown")) { + msg.robots.push_back(make_robot_msg(c, RobotAttr::TEAM_UNKNOWN)); + debug_image_.draw_box_candidates({c}, DebugImage::kRobotUnknown, 3); + } + } else { + for (const auto& c : handler_->get_detection_candidates_for("robot")) { + msg.robots.push_back(make_robot_msg(c, RobotAttr::TEAM_UNKNOWN)); + debug_image_.draw_box_candidates({c}, DebugImage::kRobotUnknown, 3); + } + } + + robot_pub_->publish(msg); + } + + void publish_goalposts(const std_msgs::msg::Header& header) { + auto candidates = handler_->get_detection_candidates_for("goalpost"); + + debug_image_.draw_box_candidates(candidates, DebugImage::kGoalposts, 3); + + soccer_vision_2d_msgs::msg::GoalpostArray msg; + msg.header = header; + for (const auto& c : candidates) { + msg.posts.push_back(make_goalpost_msg(c)); + } + goalpost_pub_->publish(msg); + } + + void publish_line_mask(const std_msgs::msg::Header& header) { + cv::Mat mask = handler_->get_segmentation_mask_for("lines"); + if (mask.empty()) { + return; + } + debug_image_.draw_mask(mask, DebugImage::kLines); + + auto img_msg = cv_bridge::CvImage(header, "8UC1", mask).toImageMsg(); + line_mask_pub_->publish(*img_msg); + } + + void publish_field_mask(const std_msgs::msg::Header& header) { + cv::Mat mask = handler_->get_segmentation_mask_for("field"); + if (mask.empty()) { + return; + } + + auto img_msg = cv_bridge::CvImage(header, "8UC1", mask).toImageMsg(); + field_mask_pub_->publish(*img_msg); + } + + void publish_debug_image(const std_msgs::msg::Header& header) { + auto img_msg = cv_bridge::CvImage(header, "bgr8", debug_image_.get_image()).toImageMsg(); + debug_image_pub_->publish(*img_msg); + } +}; + +} // namespace bitbots_vision + +// --------------------------------------------------------------------------- +// main +// --------------------------------------------------------------------------- + +int main(int argc, char** argv) { + // OpenCV's OpenMP thread pool spin-waits between frames and consumes multiple + // CPU cores even when idle. For the small network-input images (~416×416) + // single-threaded OpenCV is faster due to lower synchronisation overhead. + cv::setNumThreads(1); + + rclcpp::init(argc, argv); + auto node = std::make_shared(); + rclcpp::experimental::executors::EventsExecutor executor; + executor.add_node(node); + executor.spin(); + rclcpp::shutdown(); + return 0; +} diff --git a/src/bitbots_vision/src/yoeo_handler.cpp b/src/bitbots_vision/src/yoeo_handler.cpp new file mode 100644 index 0000000000..3f5e81b7b0 --- /dev/null +++ b/src/bitbots_vision/src/yoeo_handler.cpp @@ -0,0 +1,227 @@ +#include "bitbots_vision/yoeo_handler.hpp" + +#include +#include +#include + +#include "bitbots_vision/yoeo_processing.hpp" + +namespace bitbots_vision { + +// --------------------------------------------------------------------------- +// Construction +// --------------------------------------------------------------------------- + +YoeoHandler::YoeoHandler(const std::string& model_path, const ModelConfig& model_config, const Config& cfg, + const rclcpp::Logger& logger) + : env_(ORT_LOGGING_LEVEL_WARNING, "bitbots_vision"), cfg_(cfg), logger_(logger) { + det_class_names_ = model_config.detection_classes(); + seg_class_names_ = model_config.segmentation_classes(); + robot_class_ids_ = model_config.robot_class_ids(); + num_det_classes_ = static_cast(det_class_names_.size()); + + init_session(model_path); +} + +// --------------------------------------------------------------------------- +// init_session – builds the ONNX session with provider fallback chain +// --------------------------------------------------------------------------- + +void YoeoHandler::init_session(const std::string& model_path) { + const std::string onnx_file = model_path + "/onnx/yoeo.onnx"; + if (!std::filesystem::exists(onnx_file)) { + throw std::runtime_error("ONNX model file not found: " + onnx_file); + } + + session_options_.SetIntraOpNumThreads(1); + session_options_.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); + + // Register execution providers in priority order. + // Ort::GetAvailableProviders() returns providers compiled into this ORT build. + // CUDA and TensorRT require typed registration APIs; other providers use the generic API. + const auto available = Ort::GetAvailableProviders(); + auto has_ep = [&](const std::string& name) { + return std::find(available.begin(), available.end(), name) != available.end(); + }; + + // TRT and CUDA use typed registration APIs and dynamically load their provider shared + // libraries at registration time. Wrap in try/catch so a missing system library + // (e.g. libcublasLt.so) causes graceful fallback rather than a crash. + if (has_ep("TensorrtExecutionProvider")) { + try { + OrtTensorRTProviderOptions trt_opts{}; + session_options_.AppendExecutionProvider_TensorRT(trt_opts); + RCLCPP_INFO(logger_, "ONNX Runtime: registered TensorrtExecutionProvider"); + } catch (const Ort::Exception& e) { + RCLCPP_WARN(logger_, "TensorrtExecutionProvider unavailable: %s", e.what()); + } + } + + if (has_ep("CUDAExecutionProvider")) { + try { + OrtCUDAProviderOptions cuda_opts{}; + session_options_.AppendExecutionProvider_CUDA(cuda_opts); + RCLCPP_INFO(logger_, "ONNX Runtime: registered CUDAExecutionProvider"); + } catch (const Ort::Exception& e) { + RCLCPP_WARN(logger_, "CUDAExecutionProvider unavailable: %s", e.what()); + } + } + + if (has_ep("WebGpuExecutionProvider")) { + try { + session_options_.AppendExecutionProvider("WebGPU", {}); + RCLCPP_INFO(logger_, "ONNX Runtime: registered WebGpuExecutionProvider"); + } catch (const Ort::Exception& e) { + RCLCPP_WARN(logger_, "WebGpuExecutionProvider unavailable: %s", e.what()); + } + } + + // List available providers for debugging + RCLCPP_INFO(logger_, "Available ONNX Runtime execution providers:"); + for (const auto& ep : available) { + RCLCPP_INFO(logger_, " %s", ep.c_str()); + } + + // CPU is always the implicit fallback — no explicit registration needed. + + RCLCPP_INFO(logger_, "Loading ONNX model: %s", onnx_file.c_str()); + session_ = std::make_unique(env_, onnx_file.c_str(), session_options_); + + // ---- Introspect model I/O ---- + Ort::AllocatorWithDefaultOptions allocator; + + // Input + auto in_name_ptr = session_->GetInputNameAllocated(0, allocator); + input_name_ = std::string(in_name_ptr.get()); + input_shape_ = session_->GetInputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape(); + // Expected shape: [1, 3, H_net, W_net] + // Fix dynamic batch dim; spatial dims must be positive for YOEO models. + if (input_shape_.size() == 4) { + if (input_shape_[0] < 0) { + input_shape_[0] = 1; + } + if (input_shape_[2] <= 0 || input_shape_[3] <= 0) { + RCLCPP_WARN(logger_, "Dynamic spatial dims in ONNX model – falling back to 416×416"); + input_shape_[2] = 416; + input_shape_[3] = 416; + } + } + + // Outputs + const size_t num_outputs = session_->GetOutputCount(); + for (size_t i = 0; i < num_outputs; ++i) { + auto out_name_ptr = session_->GetOutputNameAllocated(i, allocator); + output_names_.emplace_back(out_name_ptr.get()); + } + + RCLCPP_INFO(logger_, "Model loaded – input '%s' [1, 3, %lld, %lld], %zu outputs", input_name_.c_str(), + static_cast(input_shape_[2]), static_cast(input_shape_[3]), num_outputs); +} + +// --------------------------------------------------------------------------- +// Public interface +// --------------------------------------------------------------------------- + +void YoeoHandler::reconfigure(const Config& cfg) { cfg_ = cfg; } + +void YoeoHandler::set_image(const cv::Mat& bgr_image) { + det_results_.clear(); + seg_results_.clear(); + preprocess(bgr_image); + prediction_is_fresh_ = false; +} + +void YoeoHandler::predict() { + if (prediction_is_fresh_) { + return; + } + run_inference(); + prediction_is_fresh_ = true; +} + +std::vector YoeoHandler::get_detection_candidates_for(const std::string& class_name) { + predict(); + auto it = det_results_.find(class_name); + return (it != det_results_.end()) ? it->second : std::vector{}; +} + +cv::Mat YoeoHandler::get_segmentation_mask_for(const std::string& class_name) { + predict(); + auto it = seg_results_.find(class_name); + return (it != seg_results_.end()) ? it->second : cv::Mat{}; +} + +const std::vector& YoeoHandler::detection_class_names() const { return det_class_names_; } + +const std::vector& YoeoHandler::segmentation_class_names() const { return seg_class_names_; } + +// --------------------------------------------------------------------------- +// Preprocessing (BGR uint8 → RGB float32, padded to square, CHW) +// --------------------------------------------------------------------------- + +void YoeoHandler::preprocess(const cv::Mat& bgr_image) { + const int net_h = static_cast(input_shape_[2]); + const int net_w = static_cast(input_shape_[3]); + input_data_ = processing::preprocess_image(bgr_image, net_h, net_w, preprocess_info_); + input_shape_[0] = 1; // batch dimension is always 1 +} + +// --------------------------------------------------------------------------- +// Inference +// --------------------------------------------------------------------------- + +void YoeoHandler::run_inference() { + auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault); + + Ort::Value input_tensor = Ort::Value::CreateTensor(memory_info, input_data_.data(), input_data_.size(), + input_shape_.data(), input_shape_.size()); + + const char* input_name_cstr = input_name_.c_str(); + std::vector out_name_cstrs; + for (const auto& n : output_names_) { + out_name_cstrs.push_back(n.c_str()); + } + + auto outputs = session_->Run(Ort::RunOptions{nullptr}, &input_name_cstr, &input_tensor, 1, out_name_cstrs.data(), + out_name_cstrs.size()); + + if (outputs.size() < 2) { + RCLCPP_ERROR(logger_, "Expected at least 2 outputs from YOEO model, got %zu", outputs.size()); + return; + } + + { + auto shape = outputs[0].GetTensorTypeAndShapeInfo().GetShape(); + postprocess_detections(outputs[0].GetTensorMutableData(), shape); + } + { + auto shape = outputs[1].GetTensorTypeAndShapeInfo().GetShape(); + postprocess_segmentation(outputs[1].GetTensorMutableData(), shape); + } +} + +// --------------------------------------------------------------------------- +// Detection post-processing +// --------------------------------------------------------------------------- + +void YoeoHandler::postprocess_detections(const float* det_data, const std::vector& shape) { + if (shape.size() < 3) { + return; + } + det_results_ = processing::postprocess_detections(det_data, shape[1], shape[2], det_class_names_, robot_class_ids_, + cfg_.conf_threshold, cfg_.nms_threshold, preprocess_info_); +} + +// --------------------------------------------------------------------------- +// Segmentation post-processing +// --------------------------------------------------------------------------- + +void YoeoHandler::postprocess_segmentation(const uint8_t* seg_data, const std::vector& shape) { + if (shape.size() < 3) { + return; + } + seg_results_ = processing::postprocess_segmentation(seg_data, static_cast(shape[1]), static_cast(shape[2]), + seg_class_names_, preprocess_info_); +} + +} // namespace bitbots_vision diff --git a/src/bitbots_vision/src/yoeo_processing.cpp b/src/bitbots_vision/src/yoeo_processing.cpp new file mode 100644 index 0000000000..b36567d07e --- /dev/null +++ b/src/bitbots_vision/src/yoeo_processing.cpp @@ -0,0 +1,157 @@ +#include "bitbots_vision/yoeo_processing.hpp" + +#include +#include +#include +#include + +namespace bitbots_vision::processing { + +// --------------------------------------------------------------------------- +// preprocess_image +// --------------------------------------------------------------------------- + +std::vector preprocess_image(const cv::Mat& bgr, int net_h, int net_w, PreprocessInfo& info) { + info.orig_h = bgr.rows; + info.orig_w = bgr.cols; + info.max_dim = std::max(info.orig_h, info.orig_w); + info.net_h = net_h; + info.net_w = net_w; + + info.pad_top = (info.orig_w > info.orig_h) ? (info.orig_w - info.orig_h) / 2 : 0; + info.pad_bottom = (info.orig_w > info.orig_h) ? (info.orig_w - info.orig_h) - info.pad_top : 0; + info.pad_left = (info.orig_h > info.orig_w) ? (info.orig_h - info.orig_w) / 2 : 0; + info.pad_right = (info.orig_h > info.orig_w) ? (info.orig_h - info.orig_w) - info.pad_left : 0; + + cv::Mat rgb_float; + cv::cvtColor(bgr, rgb_float, cv::COLOR_BGR2RGB); + rgb_float.convertTo(rgb_float, CV_32FC3, 1.0 / 255.0); + + cv::Mat padded; + cv::copyMakeBorder(rgb_float, padded, info.pad_top, info.pad_bottom, info.pad_left, info.pad_right, + cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0)); + + cv::Mat resized; + cv::resize(padded, resized, cv::Size(net_w, net_h)); + + std::vector tensor(3 * net_h * net_w); + std::vector channels(3); + cv::split(resized, channels); + for (int c = 0; c < 3; ++c) { + std::memcpy(tensor.data() + c * net_h * net_w, channels[c].data, + static_cast(net_h * net_w) * sizeof(float)); + } + return tensor; +} + +// --------------------------------------------------------------------------- +// nms_boxes +// --------------------------------------------------------------------------- + +std::vector nms_boxes(const std::vector& boxes, const std::vector& scores, + const std::vector& class_ids, const std::vector& robot_class_ids, + float nms_threshold, int max_detections) { + constexpr int kMaxWH = 4096; + + std::vector shifted(boxes); + for (size_t i = 0; i < boxes.size(); ++i) { + int eff = class_ids[i]; + if (!robot_class_ids.empty()) { + bool is_robot = std::find(robot_class_ids.begin(), robot_class_ids.end(), eff) != robot_class_ids.end(); + if (is_robot) { + eff = robot_class_ids[0]; + } + } + const double offset = static_cast(eff) * kMaxWH; + shifted[i].x += offset; + shifted[i].y += offset; + } + + std::vector indices; + cv::dnn::NMSBoxes(shifted, scores, 0.0f, nms_threshold, indices, 1.0f, max_detections); + return indices; +} + +// --------------------------------------------------------------------------- +// postprocess_detections +// --------------------------------------------------------------------------- + +std::unordered_map> postprocess_detections( + const float* data, int64_t num_boxes, int64_t stride, const std::vector& class_names, + const std::vector& robot_class_ids, float conf_thresh, float nms_thresh, const PreprocessInfo& info) { + const int num_classes = static_cast(class_names.size()); + const float scale = static_cast(info.max_dim) / static_cast(info.net_h); + + std::vector boxes; + std::vector scores; + std::vector class_ids; + + for (int64_t i = 0; i < num_boxes; ++i) { + const float* row = data + i * stride; + const float obj_conf = row[4]; + if (obj_conf < conf_thresh) { + continue; + } + + int best_class = 0; + float best_score = 0.f; + for (int c = 0; c < num_classes; ++c) { + const float s = obj_conf * row[5 + c]; + if (s > best_score) { + best_score = s; + best_class = c; + } + } + + if (best_score < conf_thresh) { + continue; + } + + boxes.push_back({row[0], row[1], row[2], row[3]}); + scores.push_back(best_score); + class_ids.push_back(best_class); + } + + std::unordered_map> result; + if (boxes.empty()) { + return result; + } + + const auto keep = nms_boxes(boxes, scores, class_ids, robot_class_ids, nms_thresh); + + for (int idx : keep) { + const auto& b = boxes[idx]; + const float x1 = (b.x - b.width / 2.f) * scale - static_cast(info.pad_left); + const float y1 = (b.y - b.height / 2.f) * scale - static_cast(info.pad_top); + const float x2 = (b.x + b.width / 2.f) * scale - static_cast(info.pad_left); + const float y2 = (b.y + b.height / 2.f) * scale - static_cast(info.pad_top); + + result[class_names[class_ids[idx]]].push_back(Candidate::from_x1y1x2y2( + static_cast(x1), static_cast(y1), static_cast(x2), static_cast(y2), scores[idx])); + } + return result; +} + +// --------------------------------------------------------------------------- +// postprocess_segmentation +// --------------------------------------------------------------------------- + +std::unordered_map postprocess_segmentation(const uint8_t* data, int seg_h, int seg_w, + const std::vector& class_names, + const PreprocessInfo& info) { + cv::Mat seg_float(seg_h, seg_w, CV_8UC1, const_cast(data)); + + cv::Mat seg_padded; + cv::resize(seg_float, seg_padded, cv::Size(info.max_dim, info.max_dim), 0, 0, cv::INTER_NEAREST); + + cv::Mat seg_cropped = seg_padded(cv::Range(info.pad_top, info.max_dim - info.pad_bottom), + cv::Range(info.pad_left, info.max_dim - info.pad_right)); + + std::unordered_map result; + for (int i = 0; i < static_cast(class_names.size()); ++i) { + result[class_names[i]] = (seg_cropped == i); + } + return result; +} + +} // namespace bitbots_vision::processing diff --git a/src/bitbots_vision/test/mypy.ini b/src/bitbots_vision/test/mypy.ini deleted file mode 100644 index 6b19e8374f..0000000000 --- a/src/bitbots_vision/test/mypy.ini +++ /dev/null @@ -1,5 +0,0 @@ -# Global options: - -[mypy] -check_untyped_defs = True -ignore_missing_imports = True diff --git a/src/bitbots_vision/test/test_candidate.cpp b/src/bitbots_vision/test/test_candidate.cpp new file mode 100644 index 0000000000..bedf719b80 --- /dev/null +++ b/src/bitbots_vision/test/test_candidate.cpp @@ -0,0 +1,138 @@ +#include + +#include "bitbots_vision/candidate.hpp" + +using bitbots_vision::Candidate; + +// --------------------------------------------------------------------------- +// Construction helpers +// --------------------------------------------------------------------------- + +TEST(Candidate, FromX1Y1X2Y2_PositiveOrder) { + auto c = Candidate::from_x1y1x2y2(10, 20, 50, 70, 0.8f); + EXPECT_EQ(c.x1, 10); + EXPECT_EQ(c.y1, 20); + EXPECT_EQ(c.width, 40); + EXPECT_EQ(c.height, 50); + EXPECT_FLOAT_EQ(c.rating, 0.8f); +} + +TEST(Candidate, FromX1Y1X2Y2_ReversedOrder) { + // x2 < x1 and y2 < y1 — should still produce a valid box + auto c = Candidate::from_x1y1x2y2(50, 70, 10, 20, 0.5f); + EXPECT_EQ(c.x1, 10); + EXPECT_EQ(c.y1, 20); + EXPECT_EQ(c.width, 40); + EXPECT_EQ(c.height, 50); +} + +TEST(Candidate, FromX1Y1X2Y2_Degenerate) { + // Point box + auto c = Candidate::from_x1y1x2y2(5, 5, 5, 5, 1.0f); + EXPECT_EQ(c.width, 0); + EXPECT_EQ(c.height, 0); +} + +// --------------------------------------------------------------------------- +// Derived accessors +// --------------------------------------------------------------------------- + +TEST(Candidate, CenterXY) { + auto c = Candidate::from_x1y1x2y2(10, 20, 50, 60, 1.0f); + // x1=10, width=40 → center_x = 10 + 20 = 30 + // y1=20, height=40 → center_y = 20 + 20 = 40 + EXPECT_EQ(c.center_x(), 30); + EXPECT_EQ(c.center_y(), 40); +} + +TEST(Candidate, X2Y2) { + auto c = Candidate::from_x1y1x2y2(10, 20, 50, 70, 1.0f); + EXPECT_EQ(c.x2(), 50); + EXPECT_EQ(c.y2(), 70); +} + +TEST(Candidate, Radius_SquareBox) { + auto c = Candidate::from_x1y1x2y2(0, 0, 40, 40, 1.0f); + // (width + height) / 4 = (40 + 40) / 4 = 20 + EXPECT_EQ(c.radius(), 20); +} + +TEST(Candidate, Radius_RectBox) { + auto c = Candidate::from_x1y1x2y2(0, 0, 20, 60, 1.0f); + // (20 + 60) / 4 = 20 + EXPECT_EQ(c.radius(), 20); +} + +// --------------------------------------------------------------------------- +// sort_by_rating +// --------------------------------------------------------------------------- + +TEST(Candidate, SortByRating_OrderedDescending) { + std::vector v = { + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.3f), + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.9f), + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.6f), + }; + auto sorted = Candidate::sort_by_rating(v); + ASSERT_EQ(sorted.size(), 3u); + EXPECT_FLOAT_EQ(sorted[0].rating, 0.9f); + EXPECT_FLOAT_EQ(sorted[1].rating, 0.6f); + EXPECT_FLOAT_EQ(sorted[2].rating, 0.3f); +} + +TEST(Candidate, SortByRating_DoesNotModifyOriginal) { + std::vector v = { + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.1f), + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.9f), + }; + auto sorted = Candidate::sort_by_rating(v); + // Original is unchanged (sort is by value) + EXPECT_FLOAT_EQ(v[0].rating, 0.1f); + EXPECT_FLOAT_EQ(v[1].rating, 0.9f); + EXPECT_FLOAT_EQ(sorted[0].rating, 0.9f); +} + +TEST(Candidate, SortByRating_Empty) { + std::vector v; + auto sorted = Candidate::sort_by_rating(v); + EXPECT_TRUE(sorted.empty()); +} + +// --------------------------------------------------------------------------- +// filter_by_rating +// --------------------------------------------------------------------------- + +TEST(Candidate, FilterByRating_KeepsAboveThreshold) { + std::vector v = { + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.3f), + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.5f), // exactly at threshold — excluded (strict >) + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.9f), + }; + auto filtered = Candidate::filter_by_rating(v, 0.5f); + ASSERT_EQ(filtered.size(), 1u); + EXPECT_FLOAT_EQ(filtered[0].rating, 0.9f); +} + +TEST(Candidate, FilterByRating_AllBelowThreshold) { + std::vector v = { + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.1f), + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.2f), + }; + auto filtered = Candidate::filter_by_rating(v, 0.5f); + EXPECT_TRUE(filtered.empty()); +} + +TEST(Candidate, FilterByRating_Empty) { + std::vector v; + auto filtered = Candidate::filter_by_rating(v, 0.5f); + EXPECT_TRUE(filtered.empty()); +} + +TEST(Candidate, FilterByRating_AllAboveThreshold) { + std::vector v = { + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.8f), + Candidate::from_x1y1x2y2(0, 0, 1, 1, 0.9f), + }; + auto filtered = Candidate::filter_by_rating(v, 0.0f); + EXPECT_EQ(filtered.size(), 2u); +} diff --git a/src/bitbots_vision/test/test_debug_image.cpp b/src/bitbots_vision/test/test_debug_image.cpp new file mode 100644 index 0000000000..904daff0b4 --- /dev/null +++ b/src/bitbots_vision/test/test_debug_image.cpp @@ -0,0 +1,205 @@ +#include + +#include +#include + +#include "bitbots_vision/candidate.hpp" +#include "bitbots_vision/debug_image.hpp" + +using bitbots_vision::Candidate; +using bitbots_vision::DebugImage; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +static cv::Mat make_image(int h = 100, int w = 100) { + cv::Mat img(h, w, CV_8UC3, cv::Scalar(128, 128, 128)); + return img; +} + +static Candidate make_candidate(int x1, int y1, int x2, int y2, float rating = 0.9f) { + return Candidate::from_x1y1x2y2(x1, y1, x2, y2, rating); +} + +// --------------------------------------------------------------------------- +// Inactive DebugImage – all draw methods are no-ops +// --------------------------------------------------------------------------- + +TEST(DebugImage, Inactive_GetImageIsEmpty) { + DebugImage di(false); + EXPECT_TRUE(di.get_image().empty()); +} + +TEST(DebugImage, Inactive_DrawBallCandidates_NoOp) { + DebugImage di(false); + // Should not crash even without set_image() + EXPECT_NO_THROW(di.draw_ball_candidates({make_candidate(10, 10, 30, 30)}, DebugImage::kBall)); +} + +TEST(DebugImage, Inactive_DrawBoxCandidates_NoOp) { + DebugImage di(false); + EXPECT_NO_THROW(di.draw_box_candidates({make_candidate(10, 10, 30, 30)}, DebugImage::kGoalposts)); +} + +TEST(DebugImage, Inactive_DrawMask_NoOp) { + DebugImage di(false); + cv::Mat mask(100, 100, CV_8UC1, cv::Scalar(255)); + EXPECT_NO_THROW(di.draw_mask(mask, DebugImage::kLines)); +} + +// --------------------------------------------------------------------------- +// set_image – copies the input +// --------------------------------------------------------------------------- + +TEST(DebugImage, SetImage_PreservesSize) { + DebugImage di(true); + cv::Mat src = make_image(200, 300); + di.set_image(src); + EXPECT_EQ(di.get_image().rows, 200); + EXPECT_EQ(di.get_image().cols, 300); +} + +TEST(DebugImage, SetImage_IsCopy) { + DebugImage di(true); + cv::Mat src = make_image(50, 50); + di.set_image(src); + // Mutating src afterwards should not affect debug image + src.setTo(cv::Scalar(0, 0, 0)); + EXPECT_NE(cv::sum(di.get_image())[0], 0.0); +} + +// --------------------------------------------------------------------------- +// draw_ball_candidates +// --------------------------------------------------------------------------- + +TEST(DebugImage, DrawBallCandidates_Empty_NoChange) { + DebugImage di(true); + cv::Mat src = make_image(); + di.set_image(src); + + cv::Mat before = di.get_image().clone(); + di.draw_ball_candidates({}, DebugImage::kBall, 2); + + // Pixel-wise unchanged + cv::Mat diff; + cv::absdiff(di.get_image(), before, diff); + EXPECT_EQ(cv::countNonZero(diff.reshape(1)), 0); +} + +TEST(DebugImage, DrawBallCandidates_ModifiesImage) { + DebugImage di(true); + di.set_image(make_image(200, 200)); + + cv::Mat before = di.get_image().clone(); + di.draw_ball_candidates({make_candidate(50, 50, 100, 100)}, DebugImage::kBall, 2); + + cv::Mat diff; + cv::absdiff(di.get_image(), before, diff); + EXPECT_GT(cv::countNonZero(diff.reshape(1)), 0); +} + +TEST(DebugImage, DrawBallCandidates_MultipleNoThrow) { + DebugImage di(true); + di.set_image(make_image(300, 400)); + + std::vector cands = { + make_candidate(10, 10, 40, 40), + make_candidate(100, 100, 150, 150), + make_candidate(200, 50, 250, 100), + }; + EXPECT_NO_THROW(di.draw_ball_candidates(cands, DebugImage::kBall, 1)); +} + +// --------------------------------------------------------------------------- +// draw_box_candidates +// --------------------------------------------------------------------------- + +TEST(DebugImage, DrawBoxCandidates_ModifiesImage) { + DebugImage di(true); + di.set_image(make_image(200, 200)); + + cv::Mat before = di.get_image().clone(); + di.draw_box_candidates({make_candidate(20, 20, 80, 80)}, DebugImage::kGoalposts, 2); + + cv::Mat diff; + cv::absdiff(di.get_image(), before, diff); + EXPECT_GT(cv::countNonZero(diff.reshape(1)), 0); +} + +TEST(DebugImage, DrawBoxCandidates_Empty_NoChange) { + DebugImage di(true); + cv::Mat src = make_image(); + di.set_image(src); + cv::Mat before = di.get_image().clone(); + + di.draw_box_candidates({}, DebugImage::kRobotUnknown, 1); + + cv::Mat diff; + cv::absdiff(di.get_image(), before, diff); + EXPECT_EQ(cv::countNonZero(diff.reshape(1)), 0); +} + +// --------------------------------------------------------------------------- +// draw_mask +// --------------------------------------------------------------------------- + +TEST(DebugImage, DrawMask_AllActive_BlendChangesPixels) { + DebugImage di(true); + // Use a uniform dark image so the green overlay is clearly visible + di.set_image(cv::Mat(100, 100, CV_8UC3, cv::Scalar(0, 0, 0))); + + cv::Mat before = di.get_image().clone(); + + cv::Mat mask(100, 100, CV_8UC1, cv::Scalar(255)); // fully active + di.draw_mask(mask, DebugImage::kLines); // blue overlay + + cv::Mat diff; + cv::absdiff(di.get_image(), before, diff); + EXPECT_GT(cv::countNonZero(diff.reshape(1)), 0); +} + +TEST(DebugImage, DrawMask_AllZero_NoChange) { + DebugImage di(true); + di.set_image(make_image()); + cv::Mat before = di.get_image().clone(); + + cv::Mat mask(100, 100, CV_8UC1, cv::Scalar(0)); // nothing active + di.draw_mask(mask, DebugImage::kLines); + + cv::Mat diff; + cv::absdiff(di.get_image(), before, diff); + EXPECT_EQ(cv::countNonZero(diff.reshape(1)), 0); +} + +TEST(DebugImage, DrawMask_PartialMask_OnlyActiveRegionChanged) { + DebugImage di(true); + di.set_image(cv::Mat(100, 100, CV_8UC3, cv::Scalar(50, 50, 50))); + + cv::Mat mask(100, 100, CV_8UC1, cv::Scalar(0)); + // Only top-left quadrant is active + mask(cv::Rect(0, 0, 50, 50)).setTo(255); + + cv::Mat before = di.get_image().clone(); + di.draw_mask(mask, DebugImage::kBall); + + // Count changed pixels inside the active region + cv::Mat diff; + cv::absdiff(di.get_image(), before, diff); + cv::Mat active_diff = diff(cv::Rect(0, 0, 50, 50)); + cv::Mat inactive_diff = diff(cv::Rect(50, 50, 50, 50)); + + EXPECT_GT(cv::countNonZero(active_diff.reshape(1)), 0); + EXPECT_EQ(cv::countNonZero(inactive_diff.reshape(1)), 0); +} + +// --------------------------------------------------------------------------- +// Color constants sanity +// --------------------------------------------------------------------------- + +TEST(DebugImage, ColorConstants_AreDistinct) { + // Just verify the constants are accessible and differ from each other + EXPECT_NE(DebugImage::kBall, DebugImage::kGoalposts); + EXPECT_NE(DebugImage::kRobotTeamMates, DebugImage::kRobotOpponents); + EXPECT_NE(DebugImage::kLines, DebugImage::kBall); +} diff --git a/src/bitbots_vision/test/test_model_config.cpp b/src/bitbots_vision/test/test_model_config.cpp new file mode 100644 index 0000000000..473b952e99 --- /dev/null +++ b/src/bitbots_vision/test/test_model_config.cpp @@ -0,0 +1,188 @@ +#include + +#include +#include +#include +#include + +#include "bitbots_vision/model_config.hpp" + +using bitbots_vision::ModelConfig; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/// Write a minimal model_config.yaml to a temp directory and return the dir. +static std::string make_temp_model_dir(const std::string& yaml_content) { + // Use /tmp/-bitbots_vision_test as temp dir so we don't collide. + const std::string dir = "/tmp/bitbots_vision_test_" + std::to_string(getpid()); + std::filesystem::create_directories(dir); + + std::ofstream f(dir + "/model_config.yaml"); + f << yaml_content; + return dir; +} + +// --------------------------------------------------------------------------- +// Basic loading +// --------------------------------------------------------------------------- + +TEST(ModelConfig, DetectionClasses) { + const std::string yaml = R"( +detection: + classes: + - ball + - goalpost + - robot +segmentation: + classes: + - background + - field + - lines +)"; + auto dir = make_temp_model_dir(yaml); + auto cfg = ModelConfig::load_from(dir); + + ASSERT_EQ(cfg.detection_classes().size(), 3u); + EXPECT_EQ(cfg.detection_classes()[0], "ball"); + EXPECT_EQ(cfg.detection_classes()[1], "goalpost"); + EXPECT_EQ(cfg.detection_classes()[2], "robot"); +} + +TEST(ModelConfig, SegmentationClasses) { + const std::string yaml = R"( +detection: + classes: + - ball +segmentation: + classes: + - background + - field + - lines +)"; + auto dir = make_temp_model_dir(yaml); + auto cfg = ModelConfig::load_from(dir); + + ASSERT_EQ(cfg.segmentation_classes().size(), 3u); + EXPECT_EQ(cfg.segmentation_classes()[0], "background"); + EXPECT_EQ(cfg.segmentation_classes()[1], "field"); + EXPECT_EQ(cfg.segmentation_classes()[2], "lines"); +} + +// --------------------------------------------------------------------------- +// team_colors_provided +// --------------------------------------------------------------------------- + +TEST(ModelConfig, TeamColorsProvidedFalse_WhenKeyAbsent) { + const std::string yaml = R"( +detection: + classes: + - ball +segmentation: + classes: + - background +)"; + auto dir = make_temp_model_dir(yaml); + auto cfg = ModelConfig::load_from(dir); + EXPECT_FALSE(cfg.team_colors_provided()); +} + +TEST(ModelConfig, TeamColorsProvidedTrue) { + const std::string yaml = R"( +detection: + classes: + - robot_blue + - robot_red + team_colors: true +segmentation: + classes: + - background +)"; + auto dir = make_temp_model_dir(yaml); + auto cfg = ModelConfig::load_from(dir); + EXPECT_TRUE(cfg.team_colors_provided()); +} + +TEST(ModelConfig, TeamColorsProvidedFalse_WhenExplicitFalse) { + const std::string yaml = R"( +detection: + classes: + - robot + team_colors: false +segmentation: + classes: + - background +)"; + auto dir = make_temp_model_dir(yaml); + auto cfg = ModelConfig::load_from(dir); + EXPECT_FALSE(cfg.team_colors_provided()); +} + +// --------------------------------------------------------------------------- +// robot_class_ids +// --------------------------------------------------------------------------- + +TEST(ModelConfig, RobotClassIds_SingleRobotClass) { + const std::string yaml = R"( +detection: + classes: + - ball + - goalpost + - robot +segmentation: + classes: + - background +)"; + auto dir = make_temp_model_dir(yaml); + auto cfg = ModelConfig::load_from(dir); + auto ids = cfg.robot_class_ids(); + + ASSERT_EQ(ids.size(), 1u); + EXPECT_EQ(ids[0], 2); // "robot" is at index 2 +} + +TEST(ModelConfig, RobotClassIds_MultipleRobotClasses) { + const std::string yaml = R"( +detection: + classes: + - ball + - robot_blue + - robot_red + - robot_unknown +segmentation: + classes: + - background +)"; + auto dir = make_temp_model_dir(yaml); + auto cfg = ModelConfig::load_from(dir); + auto ids = cfg.robot_class_ids(); + + ASSERT_EQ(ids.size(), 3u); + EXPECT_EQ(ids[0], 1); + EXPECT_EQ(ids[1], 2); + EXPECT_EQ(ids[2], 3); +} + +TEST(ModelConfig, RobotClassIds_NoRobotClass) { + const std::string yaml = R"( +detection: + classes: + - ball + - goalpost +segmentation: + classes: + - background +)"; + auto dir = make_temp_model_dir(yaml); + auto cfg = ModelConfig::load_from(dir); + EXPECT_TRUE(cfg.robot_class_ids().empty()); +} + +// --------------------------------------------------------------------------- +// Error handling +// --------------------------------------------------------------------------- + +TEST(ModelConfig, ThrowsOnMissingFile) { + EXPECT_THROW(ModelConfig::load_from("/nonexistent/path"), std::runtime_error); +} diff --git a/src/bitbots_vision/test/test_mypy.py b/src/bitbots_vision/test/test_mypy.py deleted file mode 100644 index 3dacd60403..0000000000 --- a/src/bitbots_vision/test/test_mypy.py +++ /dev/null @@ -1,10 +0,0 @@ -from pathlib import Path - -import pytest -from ament_mypy.main import main - - -@pytest.mark.mypy -def test_mypy(): - rc = main(argv=["--config", str((Path(__file__).parent / "mypy.ini").resolve())]) - assert rc == 0, "Found code style errors / warnings" diff --git a/src/bitbots_vision/test/test_processing.cpp b/src/bitbots_vision/test/test_processing.cpp new file mode 100644 index 0000000000..e2db149e6b --- /dev/null +++ b/src/bitbots_vision/test/test_processing.cpp @@ -0,0 +1,499 @@ +#include + +#include +#include +#include + +#include "bitbots_vision/candidate.hpp" +#include "bitbots_vision/yoeo_processing.hpp" + +using namespace bitbots_vision::processing; +using bitbots_vision::Candidate; + +// =========================================================================== +// preprocess_image +// =========================================================================== + +TEST(PreprocessImage, OutputSizeIsNetHxNetW) { + cv::Mat bgr(100, 100, CV_8UC3, cv::Scalar(128, 64, 32)); + PreprocessInfo info; + auto tensor = preprocess_image(bgr, 416, 416, info); + EXPECT_EQ(static_cast(tensor.size()), 3 * 416 * 416); +} + +TEST(PreprocessImage, InfoFields_SquareImage) { + cv::Mat bgr(100, 100, CV_8UC3, cv::Scalar(0, 0, 0)); + PreprocessInfo info; + preprocess_image(bgr, 416, 416, info); + + EXPECT_EQ(info.orig_h, 100); + EXPECT_EQ(info.orig_w, 100); + EXPECT_EQ(info.max_dim, 100); + EXPECT_EQ(info.pad_top, 0); + EXPECT_EQ(info.pad_bottom, 0); + EXPECT_EQ(info.pad_left, 0); + EXPECT_EQ(info.pad_right, 0); + EXPECT_EQ(info.net_h, 416); + EXPECT_EQ(info.net_w, 416); +} + +TEST(PreprocessImage, InfoFields_WideImage_PadsTopBottom) { + // 100 tall × 200 wide → pad top and bottom + cv::Mat bgr(100, 200, CV_8UC3, cv::Scalar(0, 0, 0)); + PreprocessInfo info; + preprocess_image(bgr, 416, 416, info); + + EXPECT_EQ(info.orig_h, 100); + EXPECT_EQ(info.orig_w, 200); + EXPECT_EQ(info.max_dim, 200); + EXPECT_EQ(info.pad_top, 50); + EXPECT_EQ(info.pad_bottom, 50); + EXPECT_EQ(info.pad_left, 0); + EXPECT_EQ(info.pad_right, 0); +} + +TEST(PreprocessImage, InfoFields_TallImage_PadsLeftRight) { + // 200 tall × 100 wide → pad left and right + cv::Mat bgr(200, 100, CV_8UC3, cv::Scalar(0, 0, 0)); + PreprocessInfo info; + preprocess_image(bgr, 416, 416, info); + + EXPECT_EQ(info.pad_top, 0); + EXPECT_EQ(info.pad_bottom, 0); + EXPECT_EQ(info.pad_left, 50); + EXPECT_EQ(info.pad_right, 50); +} + +TEST(PreprocessImage, InfoFields_OddDifference_PaddingSumIsCorrect) { + // 100 tall × 101 wide → difference 1, top=0, bottom=1 + cv::Mat bgr(100, 101, CV_8UC3, cv::Scalar(0, 0, 0)); + PreprocessInfo info; + preprocess_image(bgr, 416, 416, info); + + EXPECT_EQ(info.pad_top + info.pad_bottom, 1); + EXPECT_EQ(info.pad_left, 0); + EXPECT_EQ(info.pad_right, 0); +} + +TEST(PreprocessImage, Normalization_WhiteImage) { + cv::Mat bgr(4, 4, CV_8UC3, cv::Scalar(255, 255, 255)); + PreprocessInfo info; + auto tensor = preprocess_image(bgr, 4, 4, info); + + for (float v : tensor) { + EXPECT_NEAR(v, 1.0f, 1e-4f); + } +} + +TEST(PreprocessImage, Normalization_BlackImage) { + cv::Mat bgr(4, 4, CV_8UC3, cv::Scalar(0, 0, 0)); + PreprocessInfo info; + auto tensor = preprocess_image(bgr, 4, 4, info); + + for (float v : tensor) { + EXPECT_NEAR(v, 0.0f, 1e-4f); + } +} + +TEST(PreprocessImage, Normalization_ValuesInRange) { + cv::Mat bgr(50, 50, CV_8UC3); + cv::randu(bgr, cv::Scalar(0, 0, 0), cv::Scalar(255, 255, 255)); + PreprocessInfo info; + auto tensor = preprocess_image(bgr, 32, 32, info); + + for (float v : tensor) { + EXPECT_GE(v, 0.0f); + EXPECT_LE(v, 1.0f); + } +} + +TEST(PreprocessImage, CHW_Layout) { + // Create a BGR image where channel B=0 G=128 R=255 for all pixels + cv::Mat bgr(2, 2, CV_8UC3, cv::Scalar(0, 128, 255)); // B=0, G=128, R=255 + PreprocessInfo info; + auto tensor = preprocess_image(bgr, 2, 2, info); + // After BGR→RGB: R(255)→first channel, G(128)→second, B(0)→third + // tensor layout: [C0(R), C1(G), C2(B)] + // C0 should be ~1.0, C1 ~0.5, C2 ~0.0 + ASSERT_EQ(static_cast(tensor.size()), 3 * 4); + for (int px = 0; px < 4; ++px) { + EXPECT_NEAR(tensor[0 * 4 + px], 1.0f, 0.01f); // R channel + EXPECT_NEAR(tensor[1 * 4 + px], 128.f / 255.f, 0.01f); // G channel + EXPECT_NEAR(tensor[2 * 4 + px], 0.0f, 0.01f); // B channel + } +} + +// =========================================================================== +// nms_boxes +// =========================================================================== + +TEST(NmsBoxes, SingleBox_AlwaysKept) { + std::vector boxes = {{10, 10, 20, 20}}; + std::vector scores = {0.9f}; + std::vector class_ids = {0}; + + auto keep = nms_boxes(boxes, scores, class_ids, {}, 0.5f); + EXPECT_EQ(keep.size(), 1u); +} + +TEST(NmsBoxes, NonOverlapping_BothKept) { + // Two boxes far apart + std::vector boxes = {{0, 0, 10, 10}, {500, 500, 10, 10}}; + std::vector scores = {0.9f, 0.8f}; + std::vector class_ids = {0, 0}; + + auto keep = nms_boxes(boxes, scores, class_ids, {}, 0.5f); + EXPECT_EQ(keep.size(), 2u); +} + +TEST(NmsBoxes, IdenticalBoxes_SameClass_KeepsHighestScore) { + std::vector boxes = {{0, 0, 50, 50}, {0, 0, 50, 50}}; + std::vector scores = {0.9f, 0.5f}; + std::vector class_ids = {0, 0}; + + auto keep = nms_boxes(boxes, scores, class_ids, {}, 0.5f); + + ASSERT_EQ(keep.size(), 1u); + EXPECT_EQ(keep[0], 0); // index 0 has the higher score +} + +TEST(NmsBoxes, IdenticalBoxes_DifferentClasses_BothKept) { + // Same position, different class — should not suppress each other + std::vector boxes = {{0, 0, 50, 50}, {0, 0, 50, 50}}; + std::vector scores = {0.9f, 0.8f}; + std::vector class_ids = {0, 1}; // different classes + + auto keep = nms_boxes(boxes, scores, class_ids, {}, 0.5f); + EXPECT_EQ(keep.size(), 2u); +} + +TEST(NmsBoxes, RobotClasses_CrossClassSuppression) { + // Two robot classes at identical position — cross-suppressed to one + std::vector boxes = {{0, 0, 50, 50}, {0, 0, 50, 50}}; + std::vector scores = {0.9f, 0.8f}; + std::vector class_ids = {1, 2}; // both are robot classes + std::vector robot_class_ids = {1, 2}; + + auto keep = nms_boxes(boxes, scores, class_ids, robot_class_ids, 0.5f); + EXPECT_EQ(keep.size(), 1u); +} + +TEST(NmsBoxes, RobotClasses_NonRobotNotAffected) { + // One robot and one non-robot at identical position — only robot class is merged + std::vector boxes = { + {0, 0, 50, 50}, // ball (class 0) + {0, 0, 50, 50}, // robot_blue (class 1) + {0, 0, 50, 50}, // robot_red (class 2) + }; + std::vector scores = {0.9f, 0.8f, 0.7f}; + std::vector class_ids = {0, 1, 2}; + std::vector robot_class_ids = {1, 2}; + + auto keep = nms_boxes(boxes, scores, class_ids, robot_class_ids, 0.5f); + // ball and one robot (highest score) should be kept — the other robot suppressed + EXPECT_EQ(keep.size(), 2u); +} + +TEST(NmsBoxes, MaxDetections_Respected) { + // 20 non-overlapping boxes, max_detections=5 + std::vector boxes; + std::vector scores; + std::vector class_ids; + + for (int i = 0; i < 20; ++i) { + boxes.push_back({static_cast(i * 100), 0, 10, 10}); + scores.push_back(0.5f + i * 0.01f); + class_ids.push_back(0); + } + + auto keep = nms_boxes(boxes, scores, class_ids, {}, 0.5f, 5); + EXPECT_LE(static_cast(keep.size()), 5); +} + +// =========================================================================== +// postprocess_detections +// =========================================================================== + +// Helper: build raw detection output [num_boxes, 5 + num_classes] +// Each box row: [x_c, y_c, w, h, obj_conf, class_prob_0, class_prob_1, ...] +static std::vector make_det_row(float xc, float yc, float w, float h, float obj_conf, + std::initializer_list class_probs) { + std::vector row = {xc, yc, w, h, obj_conf}; + for (float p : class_probs) { + row.push_back(p); + } + return row; +} + +TEST(PostprocessDetections, Empty_ReturnsEmptyMap) { + PreprocessInfo info{100, 100, 100, 0, 0, 0, 0, 416, 416}; + auto result = postprocess_detections(nullptr, 0, 7, {"ball", "robot"}, {1}, 0.5f, 0.4f, info); + EXPECT_TRUE(result.empty()); +} + +TEST(PostprocessDetections, BelowObjConfThreshold_Filtered) { + auto row = make_det_row(208, 208, 50, 50, 0.1f, {1.0f, 0.0f}); // obj_conf=0.1 + PreprocessInfo info{416, 416, 416, 0, 0, 0, 0, 416, 416}; + + auto result = + postprocess_detections(row.data(), 1, static_cast(row.size()), {"ball", "robot"}, {1}, 0.5f, 0.4f, info); + EXPECT_TRUE(result.empty()); +} + +TEST(PostprocessDetections, BelowCombinedScoreThreshold_Filtered) { + // obj_conf=0.8, class_prob=0.3 → combined=0.24 < 0.5 + auto row = make_det_row(208, 208, 50, 50, 0.8f, {0.3f, 0.0f}); + PreprocessInfo info{416, 416, 416, 0, 0, 0, 0, 416, 416}; + + auto result = + postprocess_detections(row.data(), 1, static_cast(row.size()), {"ball", "robot"}, {1}, 0.5f, 0.4f, info); + EXPECT_TRUE(result.empty()); +} + +TEST(PostprocessDetections, SingleDetection_CorrectClass) { + // Ball detection: obj_conf=1.0, class_prob ball=1.0 + auto row = make_det_row(208, 208, 50, 50, 1.0f, {1.0f, 0.0f}); + PreprocessInfo info{416, 416, 416, 0, 0, 0, 0, 416, 416}; + + auto result = + postprocess_detections(row.data(), 1, static_cast(row.size()), {"ball", "robot"}, {1}, 0.5f, 0.4f, info); + + ASSERT_TRUE(result.count("ball") > 0); + EXPECT_EQ(result.at("ball").size(), 1u); + EXPECT_TRUE(result.count("robot") == 0 || result.at("robot").empty()); +} + +TEST(PostprocessDetections, SingleDetection_RobotClass) { + // Robot detection: class index 1 (robot) + auto row = make_det_row(100, 100, 40, 80, 1.0f, {0.0f, 1.0f}); + PreprocessInfo info{416, 416, 416, 0, 0, 0, 0, 416, 416}; + + auto result = + postprocess_detections(row.data(), 1, static_cast(row.size()), {"ball", "robot"}, {1}, 0.5f, 0.4f, info); + + ASSERT_TRUE(result.count("robot") > 0); + EXPECT_EQ(result.at("robot").size(), 1u); +} + +TEST(PostprocessDetections, CoordinateRescaling_SquareImage) { + // 832x832 original, 416x416 network → scale = 2.0 + // Ball at x_c=208, y_c=208, w=50, h=50 in network space + // → x1=(208-25)*2=366, y1=366, x2=(208+25)*2=466, y2=466 + // → center_x = 366 + 50 = 416, center_y = 416 + auto row = make_det_row(208.f, 208.f, 50.f, 50.f, 1.0f, {1.0f, 0.0f}); + PreprocessInfo info{832, 832, 832, 0, 0, 0, 0, 416, 416}; + + auto result = + postprocess_detections(row.data(), 1, static_cast(row.size()), {"ball", "robot"}, {1}, 0.5f, 0.4f, info); + + ASSERT_TRUE(result.count("ball") > 0); + const auto& c = result.at("ball")[0]; + EXPECT_NEAR(c.center_x(), 416, 5); + EXPECT_NEAR(c.center_y(), 416, 5); + EXPECT_NEAR(c.width, 100, 5); + EXPECT_NEAR(c.height, 100, 5); +} + +TEST(PostprocessDetections, CoordinateRescaling_WithPadding) { + // 100x200 original (wide), padded → max_dim=200, pad_top=50, pad_bottom=50 + // Network 416x416. Ball centered at (208, 208) in network space. + // scale = 200 / 416 ≈ 0.481 + // y1 = (208 - 25) * scale - pad_top = 183 * 0.481 - 50 ≈ 88 - 50 = 38 + // y2 = (208 + 25) * scale - pad_top = 233 * 0.481 - 50 ≈ 112 - 50 = 62 + // center_y ≈ (38 + 62) / 2 = 50 = orig_h / 2 ✓ + auto row = make_det_row(208.f, 208.f, 20.f, 20.f, 1.0f, {1.0f, 0.0f}); + PreprocessInfo info{100, 200, 200, 50, 50, 0, 0, 416, 416}; + + auto result = + postprocess_detections(row.data(), 1, static_cast(row.size()), {"ball", "robot"}, {1}, 0.5f, 0.4f, info); + + ASSERT_TRUE(result.count("ball") > 0); + const auto& c = result.at("ball")[0]; + // Center should be approximately at the middle of the original image + EXPECT_NEAR(c.center_x(), 100, 10); // orig_w center + EXPECT_NEAR(c.center_y(), 50, 10); // orig_h center +} + +TEST(PostprocessDetections, NMS_SuppressesOverlappingBoxes) { + // Two nearly identical ball detections → NMS keeps only one + std::vector data; + auto row1 = make_det_row(200.f, 200.f, 50.f, 50.f, 1.0f, {1.0f, 0.0f}); + auto row2 = make_det_row(201.f, 201.f, 50.f, 50.f, 0.9f, {1.0f, 0.0f}); + data.insert(data.end(), row1.begin(), row1.end()); + data.insert(data.end(), row2.begin(), row2.end()); + + PreprocessInfo info{416, 416, 416, 0, 0, 0, 0, 416, 416}; + auto result = postprocess_detections(data.data(), 2, static_cast(row1.size()), {"ball", "robot"}, {1}, 0.5f, + 0.4f, info); + + ASSERT_TRUE(result.count("ball") > 0); + EXPECT_EQ(result.at("ball").size(), 1u); +} + +TEST(PostprocessDetections, NMS_KeepsSeparateClasses) { + // A ball and a robot at identical position → different classes, both kept + std::vector data; + auto row1 = make_det_row(200.f, 200.f, 50.f, 50.f, 1.0f, {1.0f, 0.0f}); // ball + auto row2 = make_det_row(200.f, 200.f, 50.f, 50.f, 0.9f, {0.0f, 1.0f}); // robot + data.insert(data.end(), row1.begin(), row1.end()); + data.insert(data.end(), row2.begin(), row2.end()); + + PreprocessInfo info{416, 416, 416, 0, 0, 0, 0, 416, 416}; + auto result = postprocess_detections(data.data(), 2, static_cast(row1.size()), {"ball", "robot"}, {1}, 0.5f, + 0.4f, info); + + EXPECT_EQ(result["ball"].size(), 1u); + EXPECT_EQ(result["robot"].size(), 1u); +} + +TEST(PostprocessDetections, ConfidenceStoredInCandidate) { + auto row = make_det_row(208.f, 208.f, 50.f, 50.f, 1.0f, {0.8f, 0.0f}); + PreprocessInfo info{416, 416, 416, 0, 0, 0, 0, 416, 416}; + + auto result = + postprocess_detections(row.data(), 1, static_cast(row.size()), {"ball", "robot"}, {1}, 0.5f, 0.4f, info); + + ASSERT_FALSE(result["ball"].empty()); + EXPECT_NEAR(result.at("ball")[0].rating, 0.8f, 0.01f); +} + +// =========================================================================== +// postprocess_segmentation +// =========================================================================== + +TEST(PostprocessSegmentation, MaskCountMatchesClassCount) { + std::vector data(16 * 16, 0.f); + PreprocessInfo info{16, 16, 16, 0, 0, 0, 0, 16, 16}; + + auto result = postprocess_segmentation(data.data(), 16, 16, {"background", "field", "lines"}, info); + + EXPECT_EQ(result.size(), 3u); + EXPECT_TRUE(result.count("background") > 0); + EXPECT_TRUE(result.count("field") > 0); + EXPECT_TRUE(result.count("lines") > 0); +} + +TEST(PostprocessSegmentation, MaskSizeMatchesOriginal) { + // 150-tall × 100-wide image (tall): pad_left=25, pad_right=25 + std::vector data(8 * 8, 0.f); + PreprocessInfo info{150, 100, 150, 0, 0, 25, 25, 8, 8}; + + auto result = postprocess_segmentation(data.data(), 8, 8, {"background", "field"}, info); + + ASSERT_TRUE(result.count("background") > 0); + EXPECT_EQ(result.at("background").rows, 150); + EXPECT_EQ(result.at("background").cols, 100); +} + +TEST(PostprocessSegmentation, AllClass0_Class0MaskAllActive) { + // All pixels → class 0 (background) + const int H = 8, W = 8; + std::vector data(H * W, 0.f); + PreprocessInfo info{H, W, W, 0, 0, 0, 0, H, W}; + + auto result = postprocess_segmentation(data.data(), H, W, {"background", "field"}, info); + + ASSERT_TRUE(result.count("background") > 0); + ASSERT_TRUE(result.count("field") > 0); + + // background mask should be non-zero + double min_bg, max_bg; + cv::minMaxLoc(result.at("background"), &min_bg, &max_bg); + EXPECT_GT(max_bg, 0.0); + + // field mask should be all zero + double max_field; + cv::minMaxLoc(result.at("field"), nullptr, &max_field); + EXPECT_EQ(max_field, 0.0); +} + +TEST(PostprocessSegmentation, AllClass1_Class1MaskAllActive) { + const int H = 8, W = 8; + std::vector data(H * W, 1.f); // all pixels → class 1 + PreprocessInfo info{H, W, W, 0, 0, 0, 0, H, W}; + + auto result = postprocess_segmentation(data.data(), H, W, {"background", "field"}, info); + + // field (class 1) should be all active + double max_field; + cv::minMaxLoc(result.at("field"), nullptr, &max_field); + EXPECT_GT(max_field, 0.0); + + // background (class 0) should be all zero + double max_bg; + cv::minMaxLoc(result.at("background"), nullptr, &max_bg); + EXPECT_EQ(max_bg, 0.0); +} + +TEST(PostprocessSegmentation, UnpaddingSquareOriginal_NoChange) { + // Square original → no padding, crop is identity + const int H = 4, W = 4; + std::vector data(H * W, 0.f); + PreprocessInfo info{H, W, W, 0, 0, 0, 0, H, W}; + + auto result = postprocess_segmentation(data.data(), H, W, {"bg"}, info); + ASSERT_TRUE(result.count("bg") > 0); + EXPECT_EQ(result.at("bg").rows, H); + EXPECT_EQ(result.at("bg").cols, W); +} + +TEST(PostprocessSegmentation, UnpaddingWideOriginal_OutputHeightReduced) { + // 200×100 original (wide): max_dim=200, pad_top=50, pad_bottom=50 + // Result should be cropped to 100×200 + const int H = 8, W = 8; + std::vector data(H * W, 0.f); + PreprocessInfo info{100, 200, 200, 50, 50, 0, 0, H, W}; + + auto result = postprocess_segmentation(data.data(), H, W, {"bg"}, info); + ASSERT_TRUE(result.count("bg") > 0); + EXPECT_EQ(result.at("bg").rows, 100); + EXPECT_EQ(result.at("bg").cols, 200); +} + +TEST(PostprocessSegmentation, UnpaddingTallOriginal_OutputWidthReduced) { + // 100×200 original (tall): max_dim=200, pad_left=50, pad_right=50 + const int H = 8, W = 8; + std::vector data(H * W, 0.f); + PreprocessInfo info{200, 100, 200, 0, 0, 50, 50, H, W}; + + auto result = postprocess_segmentation(data.data(), H, W, {"bg"}, info); + ASSERT_TRUE(result.count("bg") > 0); + EXPECT_EQ(result.at("bg").rows, 200); + EXPECT_EQ(result.at("bg").cols, 100); +} + +TEST(PostprocessSegmentation, MaskTypeIsCV_8UC1) { + const int H = 4, W = 4; + std::vector data(H * W, 0.f); + PreprocessInfo info{H, W, W, 0, 0, 0, 0, H, W}; + + auto result = postprocess_segmentation(data.data(), H, W, {"bg"}, info); + EXPECT_EQ(result.at("bg").type(), CV_8UC1); +} + +TEST(PostprocessSegmentation, MixedClasses_MutuallyExclusiveMasks) { + // 4x4 map: left half class 0, right half class 1 + const int H = 4, W = 4; + std::vector data(H * W); + for (int r = 0; r < H; ++r) { + for (int c = 0; c < W; ++c) { + data[r * W + c] = (c < W / 2) ? 0.f : 1.f; + } + } + PreprocessInfo info{H, W, W, 0, 0, 0, 0, H, W}; + + auto result = postprocess_segmentation(data.data(), H, W, {"bg", "field"}, info); + + // bg active only in left half + for (int r = 0; r < H; ++r) { + for (int c = 0; c < W; ++c) { + if (c < W / 2) { + EXPECT_GT(result.at("bg").at(r, c), 0u) << "bg should be active at (" << r << "," << c << ")"; + EXPECT_EQ(result.at("field").at(r, c), 0u) << "field should be inactive at (" << r << "," << c << ")"; + } else { + EXPECT_EQ(result.at("bg").at(r, c), 0u) << "bg should be inactive at (" << r << "," << c << ")"; + EXPECT_GT(result.at("field").at(r, c), 0u) << "field should be active at (" << r << "," << c << ")"; + } + } + } +} diff --git a/src/bitbots_vision/test/test_yoeo_handler.cpp b/src/bitbots_vision/test/test_yoeo_handler.cpp new file mode 100644 index 0000000000..071fb54ef1 --- /dev/null +++ b/src/bitbots_vision/test/test_yoeo_handler.cpp @@ -0,0 +1,126 @@ +#include +#include + +#include +#include +#include + +// --------------------------------------------------------------------------- +// Execution provider availability tests +// --------------------------------------------------------------------------- + +// These tests verify that the ONNX Runtime built-in provider list API works +// correctly and that our priority-based registration logic is sound — without +// actually loading a model. + +TEST(GetAvailableProviders, ReturnsList) { + const auto providers = Ort::GetAvailableProviders(); + EXPECT_FALSE(providers.empty()) << "ONNX Runtime must always have at least CPUExecutionProvider"; +} + +TEST(GetAvailableProviders, AlwaysHasCPU) { + const auto providers = Ort::GetAvailableProviders(); + bool has_cpu = std::find(providers.begin(), providers.end(), "CPUExecutionProvider") != providers.end(); + EXPECT_TRUE(has_cpu) << "CPUExecutionProvider must always be available"; +} + +TEST(GetAvailableProviders, KnownProviderNames) { + // Providers must use the canonical ORT names, not shortened versions. + // This test documents the expected names so any future rename is caught early. + const auto providers = Ort::GetAvailableProviders(); + + // Every name in the list must be non-empty + for (const auto& ep : providers) { + EXPECT_FALSE(ep.empty()); + } + + // If CUDA is present it must use the canonical full name + bool has_cuda = std::find(providers.begin(), providers.end(), "CUDAExecutionProvider") != providers.end(); + bool has_cuda_short = std::find(providers.begin(), providers.end(), "CUDA") != providers.end(); + EXPECT_FALSE(has_cuda_short) << "ORT should report 'CUDAExecutionProvider', not 'CUDA'"; + (void)has_cuda; // presence is optional — just validate the name if present +} + +// --------------------------------------------------------------------------- +// Provider priority selection helper (mirrors yoeo_handler.cpp logic) +// --------------------------------------------------------------------------- + +static std::vector select_providers(const std::vector& available, + const std::vector& priority) { + std::vector selected; + for (const auto& ep : priority) { + if (std::find(available.begin(), available.end(), ep) != available.end()) { + selected.push_back(ep); + } + } + return selected; +} + +TEST(ProviderPrioritySelection, OrderPreserved) { + const std::vector available = {"CUDAExecutionProvider", "CPUExecutionProvider", + "TensorrtExecutionProvider"}; + const std::vector priority = {"TensorrtExecutionProvider", "CUDAExecutionProvider", + "CPUExecutionProvider"}; + + auto selected = select_providers(available, priority); + + ASSERT_EQ(selected.size(), 3u); + EXPECT_EQ(selected[0], "TensorrtExecutionProvider"); + EXPECT_EQ(selected[1], "CUDAExecutionProvider"); + EXPECT_EQ(selected[2], "CPUExecutionProvider"); +} + +TEST(ProviderPrioritySelection, UnavailableProviderSkipped) { + const std::vector available = {"CPUExecutionProvider"}; + const std::vector priority = {"TensorrtExecutionProvider", "CUDAExecutionProvider", + "CPUExecutionProvider"}; + + auto selected = select_providers(available, priority); + + ASSERT_EQ(selected.size(), 1u); + EXPECT_EQ(selected[0], "CPUExecutionProvider"); +} + +TEST(ProviderPrioritySelection, AllAvailable) { + const std::vector available = { + "TensorrtExecutionProvider", + "CUDAExecutionProvider", + "WebGPUExecutionProvider", + "CPUExecutionProvider", + }; + const std::vector priority = { + "TensorrtExecutionProvider", + "CUDAExecutionProvider", + "WebGPUExecutionProvider", + "CPUExecutionProvider", + }; + + auto selected = select_providers(available, priority); + + EXPECT_EQ(selected, priority); +} + +TEST(ProviderPrioritySelection, NoneAvailableFromPriority) { + // ORT build has only CPU, but priority asks for GPU providers that don't exist here + const std::vector available = {"CPUExecutionProvider"}; + const std::vector priority = {"TensorrtExecutionProvider", "CUDAExecutionProvider"}; + + auto selected = select_providers(available, priority); + EXPECT_TRUE(selected.empty()); +} + +TEST(ProviderPrioritySelection, RealOrtBuildAlwaysSelectsCPU) { + // Integration check: running against the actual ORT build + const auto available = Ort::GetAvailableProviders(); + const std::vector priority = { + "TensorrtExecutionProvider", + "CUDAExecutionProvider", + "WebGPUExecutionProvider", + "CPUExecutionProvider", + }; + + auto selected = select_providers(available, priority); + + EXPECT_FALSE(selected.empty()) << "At least CPUExecutionProvider should be selected"; + EXPECT_EQ(selected.back(), "CPUExecutionProvider"); +} diff --git a/src/lib/bio_ik/.gitrepo b/src/lib/bio_ik/.gitrepo deleted file mode 100644 index 628b092298..0000000000 --- a/src/lib/bio_ik/.gitrepo +++ /dev/null @@ -1,12 +0,0 @@ -; DO NOT EDIT (unless you know what you are doing) -; -; This subdirectory is a git "subrepo", and this file is maintained by the -; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme -; -[subrepo] - remote = git@github.com:bit-bots/bio_ik.git - branch = ros2 - commit = ffec29f7aebb16a9ae67667db4a29d375046c23b - parent = af4b87fd8f3ddc0b65ed9f588c6647a344fdcff0 - method = merge - cmdver = 0.4.9 diff --git a/src/lib/bio_ik/CMakeLists.txt b/src/lib/bio_ik/CMakeLists.txt deleted file mode 100644 index d0ec352855..0000000000 --- a/src/lib/bio_ik/CMakeLists.txt +++ /dev/null @@ -1,182 +0,0 @@ -cmake_minimum_required(VERSION 3.15) -project(bio_ik) - -set(CMAKE_BUILD_TYPE Release) - -find_package(ament_cmake REQUIRED) -find_package(ament_cmake_ros REQUIRED) - -set(THIS_PACKAGE_INCLUDE_DEPENDS - Eigen3 - moveit_core - moveit_ros_planning - pluginlib - rclcpp - tf2_eigen - tf2_ros - tf2_kdl - tf2_geometry_msgs -) - -foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS}) - find_package(${Dependency} REQUIRED) -endforeach() - -find_package(OpenMP) -# the specific flag is not yet present in cmake 2.8.12 -if(OpenMP_CXX_FOUND OR OPENMP_FOUND) - message(STATUS "OPENMP FOUND") - add_compile_options(${OpenMP_CXX_FLAGS}) - if(NOT OpenMP_CXX_LIBRARIES) - # cmake 2.8.12 does not yet specify the library - assume we might need libgomp - set(OpenMP_LIBS gomp) - else() - set(OpenMP_LIBS ${OpenMP_CXX_LIBRARIES}) - endif() -else() - message(WARNING "OPENMP NOT FOUND. You will suffer performance loss.") - set(OpenMP_LIBS) -endif() - -option(USE_FANN "build the neural-network-based IK solver (experimental)" OFF) -if(USE_FANN) - find_library(FANN_LIBRARIES NAMES fann) - find_path(FANN_INCLUDE_DIRS NAMES fann.h) - if(NOT FANN_INCLUDE_DIRS OR NOT FANN_LIBRARIES) - message(FATAL_ERROR "Neural network solver requested, but libfann was not found.") - else() - message("Found libfann: ${FANN_LIBRARIES} / ${FANN_INCLUDE_DIRS}") - endif() -else() - set(FANN_LIBRARIES) - set(FANN_INCLUDE_DIRS) -endif() - -option(USE_CPPOPTLIB "Include gradient-based solvers from CppNumericalSolvers (bio_ik also provides its own solver)" OFF) -if(USE_CPPOPTLIB) - find_path(CPPOPTLIB_INCLUDE_DIRS - NAMES cppoptlib/solver/bfgssolver.h - HINTS ../../CppNumericalSolvers/include) - if(NOT CPPOPTLIB_INCLUDE_DIRS) - message(FATAL_ERROR "cppoptlib support requested, but the headers could not be found.") - else() - message("Found cppoptlib: ${CPPOPTLIB_INCLUDE_DIRS}") - endif() - add_definitions(-DENABLE_CPP_OPTLIB) -else() - set(CPPOPTLIB_INCLUDE_DIRS) -endif() - -if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - add_compile_options(-frecord-gcc-switches) -endif() - -add_compile_options($<$:-O3>) -add_compile_options($<$:-ftree-vectorize>) -add_compile_options($<$:-ffast-math>) - -include_directories( - include - ${FANN_INCLUDE_DIRS} - ${CPPOPTLIB_INCLUDE_DIRS} -) - -set(SOURCES - src/goal_types.cpp - src/problem.cpp - src/ik_test.cpp - src/ik_gradient.cpp - src/ik_evolution_1.cpp - src/ik_evolution_2.cpp -) - -if(USE_FANN) - list(APPEND SOURCES src/ik_neural.cpp) -endif() - -if(USE_CPPOPTLIB) - list(APPEND SOURCES src/ik_cppoptlib.cpp) -endif() - -add_library(${PROJECT_NAME} ${SOURCES}) - -target_include_directories(${PROJECT_NAME} PUBLIC - $ - $ -) - -ament_target_dependencies( - ${PROJECT_NAME} - PUBLIC - ${THIS_PACKAGE_INCLUDE_DEPENDS} -) - -target_link_libraries( - ${PROJECT_NAME} - PUBLIC - ${FANN_LIBRARIES} - ${OpenMP_LIBS} -) - -add_library(${PROJECT_NAME}_plugin SHARED - ${SOURCES} - src/kinematics_plugin.cpp -) - -target_include_directories(${PROJECT_NAME}_plugin PUBLIC - $ - $ -) - -target_link_libraries( - ${PROJECT_NAME}_plugin - PRIVATE - ${PROJECT_NAME} -) - - -install( - DIRECTORY include/ - DESTINATION include -) -install( - TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_plugin - EXPORT export_${PROJECT_NAME} - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib - RUNTIME DESTINATION bin - INCLUDES DESTINATION include -) - - -pluginlib_export_plugin_description_file( - moveit_core - bio_ik_kinematics_description.xml -) - -ament_export_include_directories( - include -) -ament_export_libraries( - ${PROJECT_NAME}_plugin -) -ament_export_targets( - export_${PROJECT_NAME} -) - -ament_export_dependencies(${THIS_PACKAGE_INCLUDE_DEPENDS}) - -if(BUILD_TESTING) - find_package(ament_cmake_gtest REQUIRED) - - ament_add_gtest(bio_ik_test test/utest.cpp) - target_link_libraries(bio_ik_test - bio_ik - ) - target_include_directories(bio_ik_test - PUBLIC $ - PUBLIC $) - -endif() - -ament_package() diff --git a/src/lib/bio_ik/Doxyfile b/src/lib/bio_ik/Doxyfile deleted file mode 100644 index 82db879ad8..0000000000 --- a/src/lib/bio_ik/Doxyfile +++ /dev/null @@ -1,2427 +0,0 @@ -# Doxyfile 1.8.11 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed in -# front of the TAG it is preceding. -# -# All text after a single hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists, items can also be appended using: -# TAG += value [value, ...] -# Values that contain spaces should be placed between quotes (\" \"). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv -# for the list of possible encodings. -# The default value is: UTF-8. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by -# double-quotes, unless you are using Doxywizard) that should identify the -# project for which the documentation is generated. This name is used in the -# title of most generated pages and in a few other places. -# The default value is: My Project. - -PROJECT_NAME = "bio_ik" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. This -# could be handy for archiving the generated documentation or if some version -# control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a -# quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = "MoveIt kinematics_base plugin based on particle optimization & GA" - -# With the PROJECT_LOGO tag one can specify a logo or an icon that is included -# in the documentation. The maximum height of the logo should not exceed 55 -# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy -# the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path -# into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If -# left blank the current directory will be used. - -OUTPUT_DIRECTORY = docs - -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. -# The default value is: NO. - -CREATE_SUBDIRS = NO - -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII -# characters to appear in the names of generated files. If set to NO, non-ASCII -# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode -# U+3044. -# The default value is: NO. - -ALLOW_UNICODE_NAMES = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. -# The default value is: English. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member -# descriptions after the members that are listed in the file and class -# documentation (similar to Javadoc). Set to NO to disable this. -# The default value is: YES. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief -# description of a member or function before the detailed description -# -# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. -# The default value is: YES. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator that is -# used to form the text in various listings. Each string in this list, if found -# as the leading text of the brief description, will be stripped from the text -# and the result, after processing the whole list, is used as the annotated -# text. Otherwise, the brief description is used as-is. If left blank, the -# following values are used ($name is automatically replaced with the name of -# the entity):The $name class, The $name widget, The $name file, is, provides, -# specifies, contains, represents, a, an and the. - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief -# description. -# The default value is: NO. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. -# The default value is: NO. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path -# before files name in the file list and in the header files. If set to NO the -# shortest path that makes the file name unique will be used -# The default value is: YES. - -FULL_PATH_NAMES = YES - -# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. -# Stripping is only done if one of the specified strings matches the left-hand -# part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to -# strip. -# -# Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. -# This tag requires that the tag FULL_PATH_NAMES is set to YES. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the -# path mentioned in the documentation of a class, which tells the reader which -# header file to include in order to use a class. If left blank only the name of -# the header file containing the class definition is used. Otherwise one should -# specify the list of include paths that are normally passed to the compiler -# using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't -# support long names like on DOS, Mac, or CD-ROM. -# The default value is: NO. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) -# The default value is: NO. - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) -# The default value is: NO. - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a -# multi-line C++ special comment block (i.e. a block of //! or /// comments) as -# a brief description. This used to be the default behavior. The new default is -# to treat a multi-line C++ comment block as a detailed description. Set this -# tag to YES if you prefer the old behavior instead. -# -# Note that setting this tag to YES also means that rational rose comments are -# not recognized any more. -# The default value is: NO. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the -# documentation from any documented member that it re-implements. -# The default value is: YES. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new -# page for each member. If set to NO, the documentation of a member will be part -# of the file/class/namespace that contains it. -# The default value is: NO. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen -# uses this value to replace tabs by spaces in code fragments. -# Minimum value: 1, maximum value: 16, default value: 4. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that act as commands in -# the documentation. An alias has the form: -# name=value -# For example adding -# "sideeffect=@par Side Effects:\n" -# will allow you to put the command \sideeffect (or @sideeffect) in the -# documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources -# only. Doxygen will then generate output that is more tailored for C. For -# instance, some of the names that are used will be different. The list of all -# members will be omitted, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or -# Python sources only. Doxygen will then generate output that is more tailored -# for that language. For instance, namespaces will be presented as packages, -# qualified scopes will look different, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources. Doxygen will then generate output that is tailored for Fortran. -# The default value is: NO. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for VHDL. -# The default value is: NO. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. -# -# Note: For files without extension you can use no_extension as a placeholder. -# -# Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. - -EXTENSION_MAPPING = - -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments -# according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in -# case of backward compatibilities issues. -# The default value is: YES. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. -# The default value is: YES. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. -# The default value is: NO. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. -# The default value is: NO. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. -# The default value is: NO. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. -# This will only work if the methods are indeed getting or setting a simple -# type. If this is not the case, or you want to show the methods anyway, you -# should set this option to NO. -# The default value is: YES. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. -# The default value is: NO. - -DISTRIBUTE_GROUP_DOC = NO - -# If one adds a struct or class to a group and this option is enabled, then also -# any nested class or struct is added to the same group. By default this option -# is disabled and one has to add nested compounds explicitly via \ingroup. -# The default value is: NO. - -GROUP_NESTED_COMPOUNDS = NO - -# Set the SUBGROUPING tag to YES to allow class member groups of the same type -# (for instance a group of public functions) to be put as a subgroup of that -# type (e.g. under the Public Functions section). Set it to NO to prevent -# subgrouping. Alternatively, this can be done per class using the -# \nosubgrouping command. -# The default value is: YES. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions -# are shown inside the group in which they are included (e.g. using \ingroup) -# instead of on a separate page (for HTML and Man pages) or section (for LaTeX -# and RTF). -# -# Note that this feature does not work in combination with -# SEPARATE_MEMBER_PAGES. -# The default value is: NO. - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions -# with only public data fields or simple typedef fields will be shown inline in -# the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO, structs, classes, and unions are shown on a separate page (for HTML and -# Man pages) or section (for LaTeX and RTF). -# The default value is: NO. - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or -# enum is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically be -# useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. -# The default value is: NO. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can be -# an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The -# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range -# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest -# the optimal cache size from a speed point of view. -# Minimum value: 0, maximum value: 9, default value: 0. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in -# documentation are documented, even if no documentation was available. Private -# class members and static file members will be hidden unless the -# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. -# Note: This will also disable the warnings about undocumented members that are -# normally produced when WARNINGS is set to YES. -# The default value is: NO. - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will -# be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal -# scope will be included in the documentation. -# The default value is: NO. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be -# included in the documentation. -# The default value is: NO. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined -# locally in source files will be included in the documentation. If set to NO, -# only classes defined in header files are included. Does not have any effect -# for Java sources. -# The default value is: YES. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. If set to YES, local methods, -# which are defined in the implementation section but not in the interface are -# included in the documentation. If set to NO, only methods in the interface are -# included. -# The default value is: NO. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base name of -# the file that contains the anonymous namespace. By default anonymous namespace -# are hidden. -# The default value is: NO. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all -# undocumented members inside documented classes or files. If set to NO these -# members will be included in the various overviews, but no documentation -# section is generated. This option has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. If set -# to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. -# The default value is: NO. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. -# The default value is: NO. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any -# documentation blocks found inside the body of a function. If set to NO, these -# blocks will be appended to the function's detailed documentation block. -# The default value is: NO. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation that is typed after a -# \internal command is included. If the tag is set to NO then the documentation -# will be excluded. Set it to YES to include the internal documentation. -# The default value is: NO. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with -# their full class and namespace scopes in the documentation. If set to YES, the -# scope will be hidden. -# The default value is: NO. - -HIDE_SCOPE_NAMES = NO - -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will -# append additional text to a page's title, such as Class Reference. If set to -# YES the compound reference will be hidden. -# The default value is: NO. - -HIDE_COMPOUND_REFERENCE= NO - -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of -# the files that are included by a file in the documentation of that file. -# The default value is: YES. - -SHOW_INCLUDE_FILES = YES - -# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each -# grouped member an include statement to the documentation, telling the reader -# which file to include in order to use the member. -# The default value is: NO. - -SHOW_GROUPED_MEMB_INC = NO - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include -# files with double quotes in the documentation rather than with sharp brackets. -# The default value is: NO. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the -# documentation for inline members. -# The default value is: YES. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the -# (detailed) documentation of file and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. -# The default value is: YES. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief -# descriptions of file, namespace and class members alphabetically by member -# name. If set to NO, the members will appear in declaration order. Note that -# this will also influence the order of the classes in the class list. -# The default value is: NO. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the -# (brief and detailed) documentation of class members so that constructors and -# destructors are listed first. If set to NO the constructors will appear in the -# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. -# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief -# member documentation. -# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting -# detailed member documentation. -# The default value is: NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy -# of group names into alphabetical order. If set to NO the group names will -# appear in their defined order. -# The default value is: NO. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by -# fully-qualified names, including namespaces. If set to NO, the class list will -# be sorted only by class name, not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the alphabetical -# list. -# The default value is: NO. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper -# type resolution of all parameters of a function it will reject a match between -# the prototype and the implementation of a member function even if there is -# only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still -# accept a match between prototype and implementation in such cases. -# The default value is: NO. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo -# list. This list is created by putting \todo commands in the documentation. -# The default value is: YES. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test -# list. This list is created by putting \test commands in the documentation. -# The default value is: YES. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug -# list. This list is created by putting \bug commands in the documentation. -# The default value is: YES. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) -# the deprecated list. This list is created by putting \deprecated commands in -# the documentation. -# The default value is: YES. - -GENERATE_DEPRECATEDLIST= YES - -# The ENABLED_SECTIONS tag can be used to enable conditional documentation -# sections, marked by \if ... \endif and \cond -# ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the -# initial value of a variable or macro / define can have for it to appear in the -# documentation. If the initializer consists of more lines than specified here -# it will be hidden. Use a value of 0 to hide initializers completely. The -# appearance of the value of individual variables and macros / defines can be -# controlled using \showinitializer or \hideinitializer command in the -# documentation regardless of this setting. -# Minimum value: 0, maximum value: 10000, default value: 30. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at -# the bottom of the documentation of classes and structs. If set to YES, the -# list will mention the files that were used to generate the documentation. -# The default value is: YES. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This -# will remove the Files entry from the Quick Index and from the Folder Tree View -# (if specified). -# The default value is: YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces -# page. This will remove the Namespaces entry from the Quick Index and from the -# Folder Tree View (if specified). -# The default value is: YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command command input-file, where command is the value of the -# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file -# version. For an example see the documentation. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can -# optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. -# -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE -# tag is left empty. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files containing -# the reference definitions. This must be a list of .bib files. The .bib -# extension is automatically appended if omitted. This requires the bibtex tool -# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. -# For LaTeX the style of the bibliography can be controlled using -# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the -# search path. See also \cite for info how to create references. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the -# messages are off. -# The default value is: NO. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES -# this implies that the warnings are on. -# -# Tip: Turn warnings on while writing the documentation. -# The default value is: YES. - -WARNINGS = YES - -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate -# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: YES. - -WARN_IF_UNDOCUMENTED = YES - -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. -# The default value is: YES. - -WARN_IF_DOC_ERROR = YES - -# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that -# are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. -# The default value is: NO. - -WARN_NO_PARAMDOC = NO - -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. -# The default value is: NO. - -WARN_AS_ERROR = NO - -# The WARN_FORMAT tag determines the format of the warning messages that doxygen -# can produce. The string should contain the $file, $line, and $text tags, which -# will be replaced by the file and line number from which the warning originated -# and the warning text. Optionally the format may contain $version, which will -# be replaced by the version of the file (if it could be obtained via -# FILE_VERSION_FILTER) -# The default value is: $file:$line: $text. - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning and error -# messages should be written. If left blank the output is written to standard -# error (stderr). - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag is used to specify the files and/or directories that contain -# documented source files. You may enter file names like myfile.cpp or -# directories like /usr/src/myproject. Separate the files or directories with -# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING -# Note: If this tag is empty the current directory is searched. - -INPUT = src README.md - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses -# libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: http://www.gnu.org/software/libiconv) for the list of -# possible encodings. -# The default value is: UTF-8. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and -# *.h) to filter out the source-files in the directories. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. -# -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, -# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to specify whether or not subdirectories should -# be searched for input files as well. -# The default value is: NO. - -RECURSIVE = YES - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. -# The default value is: NO. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories for example use the pattern */test/* - -EXCLUDE_PATTERNS = - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* - -EXCLUDE_SYMBOLS = - -# The EXAMPLE_PATH tag can be used to specify one or more files or directories -# that contain example code fragments that are included (see the \include -# command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and -# *.h) to filter out the source-files in the directories. If left blank all -# files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude commands -# irrespective of the value of the RECURSIVE tag. -# The default value is: NO. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or directories -# that contain images that are to be included in the documentation (see the -# \image command). - -IMAGE_PATH = doc - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command: -# -# -# -# where is the value of the INPUT_FILTER tag, and is the -# name of an input file. Doxygen will then use the output that the filter -# program writes to standard output. If FILTER_PATTERNS is specified, this tag -# will be ignored. -# -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. The filters are a list of the form: pattern=filter -# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how -# filters are used. If the FILTER_PATTERNS tag is empty or if none of the -# patterns match the file name, INPUT_FILTER is applied. -# -# Note that for custom extensions or not directly supported extensions you also -# need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will also be used to filter the input files that are used for -# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). -# The default value is: NO. - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and -# it is also possible to disable source filtering for a specific pattern using -# *.ext= (so without naming a filter). -# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = README.md - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will be -# generated. Documented entities will be cross-referenced with these sources. -# -# Note: To get rid of all source code in the generated output, make sure that -# also VERBATIM_HEADERS is set to NO. -# The default value is: NO. - -SOURCE_BROWSER = YES - -# Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. -# The default value is: NO. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any -# special comment blocks from generated source code fragments. Normal C, C++ and -# Fortran comments will always remain visible. -# The default value is: YES. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. -# The default value is: NO. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES then for each documented function -# all documented entities called/used by that function will be listed. -# The default value is: NO. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set -# to YES then the hyperlinks from functions in REFERENCES_RELATION and -# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will -# link to the documentation. -# The default value is: YES. - -REFERENCES_LINK_SOURCE = YES - -# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the -# source code will show a tooltip with additional information such as prototype, -# brief description and links to the definition and documentation. Since this -# will make the HTML file larger and loading of large files a bit slower, you -# can opt to disable this feature. -# The default value is: YES. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -SOURCE_TOOLTIPS = YES - -# If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in -# source browser. The htags tool is part of GNU's global source tagging system -# (see http://www.gnu.org/software/global/global.html). You will need version -# 4.8.6 or higher. -# -# To use it do the following: -# - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file -# - Make sure the INPUT points to the root of the source tree -# - Run doxygen as normal -# -# Doxygen will invoke htags (and that will in turn invoke gtags), so these -# tools must be available from the command line (i.e. in the search path). -# -# The result: instead of the source browser generated by doxygen, the links to -# source code will now point to the output of htags. -# The default value is: NO. -# This tag requires that the tag SOURCE_BROWSER is set to YES. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a -# verbatim copy of the header file for each class for which an include is -# specified. Set to NO to disable this. -# See also: Section \class. -# The default value is: YES. - -VERBATIM_HEADERS = YES - -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all -# compounds will be generated. Enable this if the project contains a lot of -# classes, structs, unions or interfaces. -# The default value is: YES. - -ALPHABETICAL_INDEX = YES - -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output -# The default value is: YES. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a -# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of -# it. -# The default directory is: html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_OUTPUT = "../docs" - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each -# generated HTML page (for example: .htm, .php, .asp). -# The default value is: .html. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a -# standard header. -# -# To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. -# the setting GENERATE_TREEVIEW). It is highly recommended to start with a -# default header using -# doxygen -w html new_header.html new_footer.html new_stylesheet.css -# YourConfigFile -# and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally -# uses. -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description -# of the possible markers and block names see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard -# footer. See HTML_HEADER for more information on how to generate a default -# footer and what special commands can be used inside the footer. See also -# section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style -# sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. -# See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. -# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as -# it is more robust and this tag (HTML_STYLESHEET) will in the future become -# obsolete. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined -# cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. -# This is preferred over using HTML_STYLESHEET since it does not replace the -# standard style sheet and is therefore more robust against future updates. -# Doxygen will copy the style sheet files to the output directory. -# Note: The order of the extra style sheet files is of importance (e.g. the last -# style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that the -# files will be copied as-is; there are no commands or markers available. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen -# will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see -# http://en.wikipedia.org/wiki/Hue for more information. For instance the value -# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 -# purple, and 360 is red again. -# Minimum value: 0, maximum value: 359, default value: 220. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A -# value of 255 will produce the most vivid colors. -# Minimum value: 0, maximum value: 255, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the -# luminance component of the colors in the HTML output. Values below 100 -# gradually make the output lighter, whereas values above 100 make the output -# darker. The value divided by 100 is the actual gamma applied, so 80 represents -# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not -# change the gamma. -# Minimum value: 40, maximum value: 240, default value: 80. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_TIMESTAMP = NO - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries -# shown in the various tree structured indices initially; the user can expand -# and collapse entries dynamically later on. Doxygen will expand the tree to -# such a level that at most the specified number of entries are visible (unless -# a fully collapsed tree already exceeds this amount). So setting the number of -# entries 1 will produce a full collapsed tree by default. 0 is a special value -# representing an infinite number of entries and will result in a full expanded -# tree by default. -# Minimum value: 0, maximum value: 9999, default value: 100. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files will be -# generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: http://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_DOCSET = NO - -# This tag determines the name of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# The default value is: Doxygen generated docs. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# This tag specifies a string that should uniquely identify the documentation -# set bundle. This should be a reverse domain-name style string, e.g. -# com.mycompany.MyDocSet. Doxygen will append .docset to the name. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify -# the documentation publisher. This should be a reverse domain-name style -# string, e.g. com.mycompany.MyDocSet.documentation. -# The default value is: org.doxygen.Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. -# The default value is: Publisher. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three -# additional HTML index files: index.hhp, index.hhc, and index.hhk. The -# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. -# -# The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML -# files are now used as the Windows 98 help format, and will replace the old -# Windows help format (.hlp) on all Windows platforms in the future. Compressed -# HTML files also contain an index, a table of contents, and you can search for -# words in the documentation. The HTML workshop also contains a viewer for -# compressed HTML files. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_HTMLHELP = NO - -# The CHM_FILE tag can be used to specify the file name of the resulting .chm -# file. You can add a path in front of the file if the result should not be -# written to the html output directory. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_FILE = - -# The HHC_LOCATION tag can be used to specify the location (absolute path -# including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. -# The file has to be specified with full path. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -HHC_LOCATION = - -# The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -GENERATE_CHI = NO - -# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) -# and project file content. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -CHM_INDEX_ENCODING = - -# The BINARY_TOC flag controls whether a binary table of contents is generated -# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it -# enables the Previous and Next buttons. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members to -# the table of contents of the HTML help documentation and to the tree view. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTMLHELP is set to YES. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that -# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help -# (.qch) of the generated HTML documentation. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify -# the file name of the resulting .qch file. The path specified is relative to -# the HTML output folder. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help -# Project output. For more information please see Qt Help Project / Namespace -# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt -# Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- -# folders). -# The default value is: doc. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_VIRTUAL_FOLDER = doc - -# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom -# filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- -# filters). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHP_SECT_FILTER_ATTRS = - -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. -# This tag requires that the tag GENERATE_QHP is set to YES. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be -# generated, together with the HTML files, they form an Eclipse help plugin. To -# install this plugin and make it available under the help contents menu in -# Eclipse, the contents of the directory containing the HTML and XML files needs -# to be copied into the plugins directory of eclipse. The name of the directory -# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. -# After copying Eclipse needs to be restarted before the help appears. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the Eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have this -# name. Each documentation set should have its own identifier. -# The default value is: org.doxygen.Project. -# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# If you want full control over the layout of the generated HTML pages it might -# be necessary to disable the index and replace it with your own. The -# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top -# of each HTML page. A value of NO enables the index and the value YES disables -# it. Since the tabs in the index contain the same information as the navigation -# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. If the tag -# value is set to YES, a side panel will be generated containing a tree-like -# index structure (just like the one that is generated for HTML Help). For this -# to work a browser that supports JavaScript, DHTML, CSS and frames is required -# (i.e. any modern browser). Windows users are probably better off using the -# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. -# -# Note that a value of 0 will completely suppress the enum values from appearing -# in the overview section. -# Minimum value: 0, maximum value: 20, default value: 4. -# This tag requires that the tag GENERATE_HTML is set to YES. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used -# to set the initial width (in pixels) of the frame in which the tree is shown. -# Minimum value: 0, maximum value: 1500, default value: 250. -# This tag requires that the tag GENERATE_HTML is set to YES. - -TREEVIEW_WIDTH = 250 - -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to -# external symbols imported via tag files in a separate window. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of LaTeX formulas included as images in -# the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML -# output directory to force them to be regenerated. -# Minimum value: 8, maximum value: 50, default value: 10. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# http://www.mathjax.org) which uses client side Javascript for the rendering -# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX -# installed or if you want to formulas look prettier in the HTML output. When -# enabled you may also need to install MathJax separately and configure the path -# to it using the MATHJAX_RELPATH option. -# The default value is: NO. -# This tag requires that the tag GENERATE_HTML is set to YES. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. -# Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. -# The default value is: HTML-CSS. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the HTML -# output directory using the MATHJAX_RELPATH option. The destination directory -# should contain the MathJax.js script. For instance, if the mathjax directory -# is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax -# Content Delivery Network so you can quickly see the result without installing -# MathJax. However, it is strongly recommended to install a local copy of -# MathJax from http://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax -# extension names that should be enabled during MathJax rendering. For example -# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces -# of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an -# example see the documentation. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and -# should work on any modern browser. Note that when using HTML help -# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) -# there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then -# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to -# search using the keyboard; to jump to the search box use + S -# (what the is depends on the OS and browser, but it is typically -# , /