Skip to main content

Code corresponding to the paper 'From Correspondences to Pose: Non-minimal Certifiably Optimal Relative Pose without Disambiguation'

Project description

From Correspondences to Pose:
Non-minimal Certifiably Optimal Relative Pose
without Disambiguation

Javier Tirado-Garín    Javier Civera
I3A, University of Zaragoza

Relative pose directly from matches, without additional steps for disambiguation and pure rotation checks.

arXiv

Installation

For ease of installation, we recommend installing the package via PyPi. We provide wheels for Linux, MacOS, and Windows, which also install the necessary Python bindings for the Semidefinite Programming (SDP) solver SDPA. The project can be installed by executing:

pip install nonmin-pose

Usage

C2P and C2P-fast

Instances of C2P and C2P-fast can be created as follows:

from nonmin_pose import C2P, C2PFast

configuration = {
    # threshold for the singular values of X to check if rank(X)\in[1,3] (condition for tightness),
    # where X is the SDP-solution submatrix corresponding to E, t, q and h.
    "th_rank_optimality": 1e-5,  # default
    # threshold for the slack variable "st" for detecting (near-)pure rotations.
    "th_pure_rot_sdp": 1e-3,  # default
    # threshold for "st" used for detecting noise-free pure rotations
    # and improving the numerical accuracy.
    "th_pure_rot_noisefree_sdp": 1e-4,  # default
}

solver = C2P(cfg=configuration)
solver_fast = C2PFast(cfg=configuration)

Given a set of n correspondences (pairs of unit bearing vectors), represented as two numpy ndarrays, f0 and f1, each of shape (3, n), all solvers can be called and the solution estimates can be recovered as follows:

solution = solver(f0, f1)

# essential matrix
E01 = solution["E01"]
# relative rotation and translation
R01 = solution["R01"]
t01 = solution["t01"]
# certificate
is_optimal = solution["is_optimal"]
# pure rotation check
is_pure_rot = solution["is_pure_rot"]
[Click to see docstring and optional arguments]
"""Non-minimal relative pose estimation.

Args:
    f0: (3, n) bearing vectors in camera 0.
    f1: (3, n) bearing vectors in camera 1.
    w: (n,) array of weights for each residual. (default: None).
    already_unitary: True if the input coordinates are already unitary
        (default: False).
    do_disambiguation: True to decompose the essential matrix into relative
        rotation and translation. This argument is ignored when using C2P and is
        only used for the essential matrix solvers of Zhao and Garcia-Salguero.
        (default: True).

Returns:
    sol: dict of solution parameters, with keys and values:
        - E01: (3, 3) essential matrix.
        - R01: (3, 3) rotation matrix. It is not returned for the methods of
            Zhao and G.Salguero et al. if do_disambiguation is False.
        - t01: (3, 1) translation vector. It is not returned for the methods of
            Zhao and G.Salguero et al. if do_disambiguation is False.
        - is_optimal: True if the solution is optimal.
        - is_pure_rot: True if a (near-)pure rotation is detected. It is not
            returned for the methods of Zhao and G.Salguero et al. if
            do_disambiguation is False.
"""

Notation used in the code

Notation
  • (Algebraic) Epipolar errors are defined as
\mathbf{f}_{0}^{\top} \mathbf{E}_{01} \mathbf{f}_1
  • The relative rotation and translation, $\mathbf{R} _{01}$ and $\mathbf{t} _{01}$, map a 3D point expressed in cam {1} to cam {0} as
\lambda_0 \mathbf{f}_0 = \lambda_1 \mathbf{R}_{01} \mathbf{f}_1 + \mathbf{t}_{01}

where $\lambda_0,\lambda_1\in\mathbb{R}$ represent the norm of the 3D point when expressed in cam {1} and cam {0}, respectively.

Zhao's [2] and García-Salguero et al.'s [3] methods

We also provide Python classes for the methods of J. Zhao [2] and M. García-Salguero et al. [3], which can be instantiated as follows:

from nonmin_pose import EssentialZhao, EssentialGSalguero

configuration = {
    # threshold on the singular values of of the diagonal blocks of X, with X the SDP-solution, to check if they are rank-1 (condition for tightness).
    "th_rank_optimality": 1e-5,  # default
    # threshold for the posterior step used for detecting (near-)pure rotations.
    "th_pure_rot_post": 1 - 1e-8,  # default
}

solver = EssentialZhao(cfg=configuration)
solver = EssentialGSalguero(cfg=configuration)

Evaluation

To reproduce the experiments reported in the paper, please first clone the repository

git clone https://github.com/javrtg/C2P.git
cd C2P/experiments

and then install the dependencies, e.g. using conda:

conda env create -f env_experiments.yml
conda activate c2p_exp

Finally, run the following commands depending on the experiment to be reproduced. All results will be automatically stored under a subfolder named results.

Accuracy vs number of correspondences

python accuracy_vs_npoints.py

Accuracy vs noise levels

python accuracy_vs_noise.py

Accuracy vs translation magnitude

python accuracy_vs_translation_length.py

Runtimes

python runtimes.py

Real-data experiment

For running this experiment, the official Python bindings of OpenGV are needed. Please follow the installation guide to install the library. Please place the resulting .so or .pyd under the Lib/site-packages/pyopengv folder of your python distribution along an __init__.py file similar to

# __init__.py under Lib/site-packages/pyopengv
from . import pyopengv

This way, pyopengv can be imported from anywhere as

from pyopengv import pyopengv
[Installation details if using Windows]

On Windows, installing the library with Visual Studio may be very slow. In case this becomes a problem, below we describe a potentially faster alternative by using the MinGW64 toolchain.

MinGW64 provides gcc, making the compilation process akin to a Linux environment. We detail below the steps to install the toolchain and build (py)opengv from source.

:warning: Warning
There is a specific issue that needs to be solved first. OpenGV defines struct timeval and gettimeofday for Windows systems since they are native only to UNIX-like systems. Since MinGW already provides these, conflicts can occur during the build process. To prevent this, we need to modify L33 in test/time_measurement.cpp and L37 in test/time_measurement.hpp to change in both:

#ifdef WIN32

to

#if defined(WIN32) && !defined(__MINGW32__)

Setting up MinGW64 toolchain via MSYS2

To install the MinGW64 toolchain, a recommended approach is to first install MSYS2. MSYS2 comes with a package manager, pacman, useful for installing and managing additional dependencies like cmake and eigen. Alternatively, we can install these dependencies using other methods, such as within a conda or mamba environment.

following MSYS2 docs, after installing MSYS2, we need to launch the MSYS2 MSYS shell and update the package database by running:

pacman -Suy

As the docs say, we may be prompted to close all terminals if core packages are updated:

:: To complete this update all MSYS2 processes including this terminal will be closed.
   Confirm to proceed [Y/n]

If prompted, we need to close the terminal, reopen it, and run pacman -Suy again to update remaining packages.

Next, we need to install the gcc and g++ compilers using:

pacman -S --needed base-devel mingw-w64-x86_64-toolchain

Installing dependencies

Just as an example, below it is explained how to install the dependencies on a conda/mamba environment, but there are other alternatives, such as installing them in the MSYS2 MSYS shell.

Open a conda prompt and run the following commands:

# create fresh environment to build opengv (replace 3.10 to the desired python version).
(base) C:\random\path> mamba create -n opengv python=3.10 cmake ninja eigen -y

# activate the new environment
(base) C:\random\path> mamba activate opengv
(opengv) C:\random\path> 

Building OpenGV

First, to have access to the compilers, we need to add the MINGW64 binaries directory to the the PATH environment variable. If MSYS2 was installed using default options, this directory is typically C:\msys64\mingw64\bin. We can temporarily modify the PATH variable as follows:

(opengv) C:\random\path> set PATH=%PATH%;C:\msys64\mingw64\bin

Finally, to build OpenGV:

# navigate to the cloned opengv repository.
(opengv) C:\random\path> cd  \path\to\opengv

# create build directory.
(opengv) \path\to\opengv> mkdir build && cd build

# Build using cmake and ninja (adjust flags as needed):
(opengv) \path\to\opengv> cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF -DBUILD_PYTHON=ON && ninja

The build process should take ~3 mins and the resulting compiled libraries will be stored in the folder \path\to\opengv\build\lib.

:warning: Warning
Since the Python extension isn't statically compiled, the compiled .pyd module (e.g. pyopengv.cp310-win_amd64.pyd) will rely on several MinGW .dll files at runtime. Thus, before importing pyopengv, we need to add the MinGW binaries directory to the DLL search path in Python. This can be done for for Python >= 3.8 as follows:

import os
with os.add_dll_directory("C:\\msys64\\mingw64\\bin"):
    import pyopengv

Alternatively, and as mentioned earlier, to automate this, we can move the .pyd module to a manually created pyopengv folder within the Lib/site-packages directory of our Python interpreter. Inside this pyopengv folder, besides having the .pyd file, we need to create a __init__.py file that contains something like:

import os
from pathlib import Path

# constant for MinGW64 directory path.
MINGW64_PATH = Path("C:\\msys64\\mingw64\\bin")


def import_pyopengv():
    """Import pyopengv, with optional modification to DLL search path."""
    try:
        # check if the MinGW64 directory exists
        if MINGW64_PATH.is_dir():
            # augment .dll search path to include MinGW64's bin directory.
            with os.add_dll_directory(str(MINGW64_PATH)):
                from . import pyopengv
        else:
            from . import pyopengv
        return pyopengv
    except ImportError as e:
        raise ImportError(f"Failed to import pyopengv: {e}")


import_pyopengv()

# clean up the namespace.
del os, Path, import_pyopengv, MINGW64_PATH

After this, pyopengv can be imported, from any directory, as follows:

from pyopengv import pyopengv

Finally, by executing the following command, the experiment will be run and when using the flag --download, the necessary data will be automatically downloaded and placed under the folder experiments/data.

python experiments/real_data_strecha.py --download

Build from source

SDPA is necessary to solve the SDP relaxation. We recommend following the SDPA for Python installation guide (without multiprecision requirements) which provides specific instructions for Linux | Windows | MacOS. Please note that instead of using SDPA-python, we have created thin bindings to the base SDPA's C++ library to gain more control over the solver's parameters. As such, the steps related to sdpa-python in the guide, can be safely skipped.

After installing SDPA, we need to compile the bindings. Please modify the global variables in setup.py to match the library paths of your operating system. Then, the project can be installed in development mode by executing:

cd <path/to/C2P_repo>
pip install -e .

Acknowledgements and license

This work is inspired by the following works:

[1] A certifiably globally optimal solution to the non-minimal relative pose problem, J. Briales, L. Kneip, J. Gonzalez-Jimenez, 2018 (link).

[2] An Efficient Solution to Non-Minimal Case Essential Matrix Estimation, J. Zhao, 2022 (link).

[3] A tighter relaxation for the relative pose problem between cameras, M. García-Salguero, J. Briales, J. Gonzalez-Jimenez, 2022 (link).

This work provides and uses python bindings to SDPA:

[4] Implementation and evaluation of SDPA 6.0 (SemiDefinite Programming Algorithm 6.0), M. Yamashita, K. Fujisawa, and M. Kojima, Optimization Methods and Software 18, 491-505, 2003.

[5] A high-performance software package for semidefinite programs: SDPA 7, M. Yamashita, K. Fujisawa, K. Nakata, M. Nakata, M. Fukuda, K. Kobayashi, and K. Goto, Research Report B-460 Dept. of Mathematical and Computing Science, Tokyo Institute of Technology, Tokyo, Japan, September, 2010.

SDPA is licensed under the GNU Lesser General Public License v2.0. As such this project is licensed under the GNU Lesser General Public License v3.0.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nonmin_pose-0.0.1.tar.gz (76.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

nonmin_pose-0.0.1-pp310-pypy310_pp73-win_amd64.whl (19.9 MB view details)

Uploaded PyPyWindows x86-64

nonmin_pose-0.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.5 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

nonmin_pose-0.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded PyPymacOS 10.9+ x86-64

nonmin_pose-0.0.1-pp39-pypy39_pp73-win_amd64.whl (19.9 MB view details)

Uploaded PyPyWindows x86-64

nonmin_pose-0.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.5 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

nonmin_pose-0.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded PyPymacOS 10.9+ x86-64

nonmin_pose-0.0.1-pp38-pypy38_pp73-win_amd64.whl (19.9 MB view details)

Uploaded PyPyWindows x86-64

nonmin_pose-0.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.5 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

nonmin_pose-0.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded PyPymacOS 10.9+ x86-64

nonmin_pose-0.0.1-pp37-pypy37_pp73-win_amd64.whl (19.9 MB view details)

Uploaded PyPyWindows x86-64

nonmin_pose-0.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.6 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

nonmin_pose-0.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded PyPymacOS 10.9+ x86-64

nonmin_pose-0.0.1-cp312-cp312-win_amd64.whl (19.9 MB view details)

Uploaded CPython 3.12Windows x86-64

nonmin_pose-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

nonmin_pose-0.0.1-cp312-cp312-macosx_11_0_arm64.whl (212.1 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

nonmin_pose-0.0.1-cp312-cp312-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.12macOS 10.9+ x86-64

nonmin_pose-0.0.1-cp311-cp311-win_amd64.whl (19.9 MB view details)

Uploaded CPython 3.11Windows x86-64

nonmin_pose-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

nonmin_pose-0.0.1-cp311-cp311-macosx_11_0_arm64.whl (215.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

nonmin_pose-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

nonmin_pose-0.0.1-cp310-cp310-win_amd64.whl (19.9 MB view details)

Uploaded CPython 3.10Windows x86-64

nonmin_pose-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

nonmin_pose-0.0.1-cp310-cp310-macosx_11_0_arm64.whl (213.5 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

nonmin_pose-0.0.1-cp310-cp310-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

nonmin_pose-0.0.1-cp39-cp39-win_amd64.whl (19.9 MB view details)

Uploaded CPython 3.9Windows x86-64

nonmin_pose-0.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (19.7 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

nonmin_pose-0.0.1-cp39-cp39-macosx_11_0_arm64.whl (213.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

nonmin_pose-0.0.1-cp39-cp39-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

nonmin_pose-0.0.1-cp38-cp38-win_amd64.whl (19.9 MB view details)

Uploaded CPython 3.8Windows x86-64

nonmin_pose-0.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (19.7 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

nonmin_pose-0.0.1-cp38-cp38-macosx_11_0_arm64.whl (213.3 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

nonmin_pose-0.0.1-cp38-cp38-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

nonmin_pose-0.0.1-cp37-cp37m-win_amd64.whl (19.9 MB view details)

Uploaded CPython 3.7mWindows x86-64

nonmin_pose-0.0.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (19.7 MB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

nonmin_pose-0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl (4.4 MB view details)

Uploaded CPython 3.7mmacOS 10.9+ x86-64

File details

Details for the file nonmin_pose-0.0.1.tar.gz.

File metadata

  • Download URL: nonmin_pose-0.0.1.tar.gz
  • Upload date:
  • Size: 76.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for nonmin_pose-0.0.1.tar.gz
Algorithm Hash digest
SHA256 1f3e8caef03c566a7596c7ca3b66dcbef16b89a437e0ca40f424a6379a0b2aa9
MD5 226a03dba6c9128fc58f3f7d9782a053
BLAKE2b-256 22b35ecacec519d6420d13cb516197b1d61c8c8388f477166e93c2f5de80f467

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp310-pypy310_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp310-pypy310_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 e60eba3f1042887acaa1618708cb0c2ecb8ac72c66a4e4a62975204dba34dc9b
MD5 a306c253fabfafc9f1a747268eec0280
BLAKE2b-256 689f38fa93127aff059b9e11d54ed730aaa2d451fa454885bb46521308909252

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ce22b4368894e4f8dc14da8b17755c7d98686821937537dc1877f1034e7460ec
MD5 88d8d6cc2e2f9ccc1fa9e3b65d08b43d
BLAKE2b-256 1959cd62490901d8458ce5476dd54ea2049692dd8d69cb26aecc0c7e4aaeb45e

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4be91cecd38d87c756d81edf35598281c1174ad7b70880ae7d2ea21ca672dde6
MD5 cf795e23073ede63c66eb59d9a5e1e64
BLAKE2b-256 f00a6f5381874f65b5ff0a1cb83b376792bef67885c8e5447aa1e44365db67d1

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp39-pypy39_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp39-pypy39_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 8e8bbe1b706750e2104c57aeb3098f30629ef92313e23fc70598de6defefd6a2
MD5 e5b6c4b3f42c8b25723c9643a178090b
BLAKE2b-256 5f7e5a6894dc2a557289d06889e8d67412eed677009fd9edf6903fedabf7cf2c

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 05d392523b10a9a44e8a14985ef6871d156095513b20e861e5fd12de9b6ba777
MD5 e5446858b4ce91ab1520005d6cc2cddc
BLAKE2b-256 f7796d4a98dc8a702880e4f11006c22d046023569d4ae7b22620cf9d16fe7545

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d7a7e9a53a7ead3cccd4805480a1c4414532a4e26be04f6d07f330d4581b09a2
MD5 b847329958450e679df737f94319bbb5
BLAKE2b-256 9cc9795af4b3903b172ef300737542ca9bb80e88c00377d8b426cafec54dc254

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp38-pypy38_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp38-pypy38_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 b272400a680149b7231676b1985d648b83a2b51f3dab498bda0307d5599dea4b
MD5 e130fd233fc928c6530de8988ee54577
BLAKE2b-256 43a33005931400606bccde383bd02902398d1de50c992ff1c1f8c8c521ac7be4

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aafc6634fccbe4229871d92a732915899283fcbd97e4b0aedf337370fc07fc49
MD5 bab017c71de2815f7e4e8ce98953d5e4
BLAKE2b-256 7e10763b58f324f4373f098770e2bdbfcb0135b6f6ae00c98530c1b27cc19994

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 b7d650fba4ec09af6888d898022d3768fb0fcf88f763a4358567e0c8a63adac3
MD5 7d82bab14138fcccb543a741b8e6aa35
BLAKE2b-256 2f9dfd286a46085687527f62fa3907ab652e5ba755dab80f96eda9e5fa880e7d

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp37-pypy37_pp73-win_amd64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp37-pypy37_pp73-win_amd64.whl
Algorithm Hash digest
SHA256 278fb73b5c9a6ad807801d02acb843f6f14bf7d982b2c373df8db915656684cf
MD5 8c397fa14e5d59e680ac8dd001520b90
BLAKE2b-256 92058d5f624996b0fce876626caaaed892aad17f81e33d6cc9aabdf93b8134af

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 82f3740188dbd56a5cd78079b44ccf16e8bdff4cb04faa2968b586fe0338b33a
MD5 d7eecf198c024ed47d6c6f36c381a7d5
BLAKE2b-256 a069c0355c1f96ed91e3a7977f8e20588eaf87f5949a048328b4841afbe5d4ac

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 21c19a2f1d79f5175382e898c4f4006684e8d228cbe8a4bd1dee6d40cc627d73
MD5 1108193545b2d6a2961ebf2a829cc1a3
BLAKE2b-256 2d107903866af73e28ad20a731332b199f89a2af34e7f3206f0cc5a55ffc7684

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 ee814c995d321a5b9db6ee90dccaa495fbefeccf1ef0d3a64c009673658af871
MD5 2650d6945593f5749c32c3f3dfdfcd38
BLAKE2b-256 cb4c5d4f826949bc38c4736b29d14c19cd9f6a495634eca36c0341a533861789

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9afd67b4b1486b769902e9791a111fb29586466526a7c1e567199a9b25cbd12c
MD5 75215fb991d711191c5c48ab368760b0
BLAKE2b-256 6277a61468069ffe0a87d07b60bec216b1d1d6d9991aa4756826bbc4a715b5f6

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 eb7e6033987a7483e849a4547c0f2b577c059274c7fee0f8404d3748378b3d44
MD5 d80340bd4890e56570030ef8614e6d2e
BLAKE2b-256 f8d010607968cd942aae683cb005de8aa5c4ceaedb50426ecb59922b146333b9

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f440d7857723a7fd391b781ad2c3029b4da81d1a80e1eec7650494f4c7723b5b
MD5 1b7448efaa704ed45a9369392af4e794
BLAKE2b-256 c8cfcc03bb0dd2c8d17298c8659ea05b45003d751d91892a20398f6ef47eb906

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 76ec2cb930e4de63955f91e666e1d47a1cac29e419351bb7d12265ae382c68ab
MD5 575b7acaa43ce4d4798f0ffc3e42df7d
BLAKE2b-256 463b881d07e99ba9c1aae38943cfdd2abd56e63a15fce72bd558eb8631060a0d

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3c37c5bef3f9a3d82c88bfc4f5462e4166706ce16b5360a5ad284c09aa1a6dcc
MD5 487cade659eea9a101ea76eaf5f91f35
BLAKE2b-256 fdbbf642b56e0d4f5bf981d59f4ada3bd126c0775bd05f32bd80e144dd36a526

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0b3e644c261f19d18533c92d2722deab5dfe547530e54d161b48996b7f560c5d
MD5 84c33fee5c05a0515aa3a0eac5e76175
BLAKE2b-256 187a434af41d46284dda0f4bc93abe5d2187be0f5283fb5ba8de577108431678

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3838f1e4fac9a5f2092a513e0c04b642a6b2d02f08e82cba6bdf99cc3f3eae44
MD5 be46eb8830da7c3d5feb90beeb3eac0e
BLAKE2b-256 5691cf081936be45602a14cb4dd43fba5f9131ddd015dd7c04ffa1a9b81e8d8c

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 89eac13a4d87c964a690cc8783803962b187edc60a960c1b493f8bdd2ab71844
MD5 1d829f631720b37865d34587c8da9cb3
BLAKE2b-256 2282be0f32a139b650a6aed18de63f6c3e66e9552a0fa5d82bcbf51736fbe768

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 640e0a05092946efe8d1bdfc0594a3aa42a02566217e03f579ab196e4b5ca635
MD5 ada722ed71c2f967ee0c1e4e05d99961
BLAKE2b-256 13c646393a83c4a28c697127d65fe07c5278d28f81286120fcf009f233ff785d

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6b3e90d260043f0817a94a452173e7d6956ed8cf99a6a47663a85f71c15d46e0
MD5 c9770f1f84d23ad05796cf91fcdcde8e
BLAKE2b-256 7cd5ebdcd52b823ca70e1cdb105a21bf49cd87af8249dc5ea416e7ea3920224a

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 000f645141bc440ac610d969d6f7828ea06470a6041d3e753a2ef638a60ecfe8
MD5 57181f8502d2d2d0ce50dab97ef2806c
BLAKE2b-256 e9b5d0a1954de3dece8dfe9fe935459b17737485e944e0737b51d60861ef5ab2

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: nonmin_pose-0.0.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 19.9 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for nonmin_pose-0.0.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 77d5eaebc07cadd1a4dd4cdbecf9831429d7832f4b07a36b9584084e560d0e48
MD5 2c0e25d9f5f13e99d70b7a58da4d488e
BLAKE2b-256 79fa37a40d069a0ab4a107e765e332442e517d45bb344ec22571440f8544ed6d

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 d4c9c4153eb11ed7f1e05ae3e248d90aff05063d9f6b165a7cf67974c75726f0
MD5 9d2812747a3d0ed3afaae5b2303c9005
BLAKE2b-256 b544de16c7e7dd686fffad17723b84501ce6a86edfaded628108feeba15040e6

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 45a5b9d422da3cac523a6ed079e451da207b49ac393c0e78cbe07814a1871780
MD5 2bcb287175c3f88a089090b0602533cb
BLAKE2b-256 bf17dfbe4362cc53d3054a5ee9e30302e6b93973b66f5d5994e49efe2fc29fcc

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d507b9bad03f96aa2c56f40d04301e2366cd951a22122b17dc9ae72125d75199
MD5 64a693574bfa452878d5a755965a2eb4
BLAKE2b-256 f0a8829bc8e06b3b2ddc9aac55edaff965c6d32538aba987328a2f4a3f57cafd

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: nonmin_pose-0.0.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 19.9 MB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for nonmin_pose-0.0.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 92db4be206438214703de8c854f92a5bdea4c435df409d5fdc2bed2f2ef94440
MD5 cf67cb58de0a91c241ead8182648bbc4
BLAKE2b-256 05f48a7190b076558aa4a9db450c32c6d89e9f0baf407580b4aea3edb746f285

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 fb43bee3cb9cf2cffc7b15104970b49aee4d941d3146bebbef83e03aae9e25b8
MD5 838ee98b63c6a030ab0d7611cb8b149d
BLAKE2b-256 f0d4bff6d3e91b513ffe1d09db8111637340cf935e8515ee63a2fc0120182176

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 68014ad6ac1bc05a5eb5dc001c344ea8ce21bf4b8977b7bd9913913cb0ea5197
MD5 60f048d6235be66873643f2d5f9cb67b
BLAKE2b-256 246f704103ae75648053310cb7109cdafaec8eeb51794b10979f306f2fb46853

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2870a5a8742b76930df97d7d4eec14184a378ac3cfe3cb0060a9ec8bdfc8db1a
MD5 b398b46bd8643ba9ee68890cc304f859
BLAKE2b-256 3afe331ce912b358ad5d20ff197101f33ebe52bd6126de8e096959b80d1498a1

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp37-cp37m-win_amd64.whl.

File metadata

  • Download URL: nonmin_pose-0.0.1-cp37-cp37m-win_amd64.whl
  • Upload date:
  • Size: 19.9 MB
  • Tags: CPython 3.7m, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.7

File hashes

Hashes for nonmin_pose-0.0.1-cp37-cp37m-win_amd64.whl
Algorithm Hash digest
SHA256 7d181ac170fe373addd5e946e6fbfff51b08a048d4aabfa34d912fcdb596809b
MD5 0fe1d52120c6a528bade3b5390d7ac5c
BLAKE2b-256 9e248d68647ef646cb34e8305c90e036718b930e788bb801f5a460cf022bb8b1

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e98c02274e9fcdb91d9a80eeba6f04ad928541e50fee6e96802e4a036b96c563
MD5 a7212a188e44223f17aa7befb48ac099
BLAKE2b-256 3efe182283fbcde9b24401db2496b143ae2307c83641296a43702f64e6104e8a

See more details on using hashes here.

File details

Details for the file nonmin_pose-0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for nonmin_pose-0.0.1-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e2b27b8e395be98f5e306a24c1561d5fb7d46124fd6563ae4c1ebcc58c881f2d
MD5 d73f9812a29d8783d5fcac34ba801cb1
BLAKE2b-256 801b597de5ed3433d9c63f7723ffe1cd4a2537de2229408549cb4fec497a996b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page