imt-ring 1.6.42__py3-none-any.whl → 1.6.46__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {imt_ring-1.6.42.dist-info → imt_ring-1.6.46.dist-info}/METADATA +23 -14
- {imt_ring-1.6.42.dist-info → imt_ring-1.6.46.dist-info}/RECORD +6 -5
- {imt_ring-1.6.42.dist-info → imt_ring-1.6.46.dist-info}/WHEEL +1 -1
- imt_ring-1.6.46.dist-info/entry_points.txt +2 -0
- ring/algorithms/generator/base.py +8 -0
- {imt_ring-1.6.42.dist-info → imt_ring-1.6.46.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: imt-ring
|
3
|
-
Version: 1.6.
|
3
|
+
Version: 1.6.46
|
4
4
|
Summary: RING: Recurrent Inertial Graph-based Estimator
|
5
5
|
Author-email: Simon Bachhuber <simon.bachhuber@fau.de>
|
6
6
|
Project-URL: Homepage, https://github.com/SimiPixel/ring
|
@@ -32,12 +32,15 @@ Requires-Dist: pytest-xdist; extra == "dev"
|
|
32
32
|
Requires-Dist: nbmake; extra == "dev"
|
33
33
|
|
34
34
|
<p align="center">
|
35
|
-
<img src="https://raw.githubusercontent.com/simon-bachhuber/ring/main/docs/img/
|
35
|
+
<img src="https://raw.githubusercontent.com/simon-bachhuber/ring/main/docs/img/concept_v4.png" height="200" />
|
36
36
|
</p>
|
37
37
|
|
38
|
+
|
38
39
|
# Recurrent Inertial Graph-based Estimator (RING)
|
39
40
|
<img src="https://raw.githubusercontent.com/simon-bachhuber/ring/main/docs/img/coverage_badge.svg" height="20" />
|
40
41
|
|
42
|
+
RING provides a pluripotent, problem-unspecific plug-and-play IMT solution that, in contrast to conventional IMT solutions, eliminates the need for expert knowledge to identify, select, and parameterize the appropriate method. RING's pluripotency is enabled by a novel online-capable neural network architecture that uses a decentralized network of message-passing, parameter-sharing recurrent neural networks, which map local IMU measurements and nearest-neighbour messages to local orientations. This architecture enables RING to address a broad range of IMT problems that vary greatly in aspects such as the number of attached sensors, or the number of segments in the kinematic chain, and even generalize to previously unsolved IMT problems, including the challenging combination of magnetometer-free and sparse sensing with unknown sensor-to-segment parameters. Remarkably, RING is trained solely on simulated data, yet evaluated on experimental data, which indicates its exceptional ability to zero-shot generalize from simulation to experiment, while outperforming several state-of-the-art problem-specific solutions. For example, RING can, for the first time, accurately track a four-segment kinematic chain (which requires estimating four orientations) using only two magnetometer-free inertial measurement units.
|
43
|
+
|
41
44
|
> **ℹ️ Tip:**
|
42
45
|
>
|
43
46
|
> Check out my new plug-and-play interface for inertial motion tracking (RING included) [here](https://github.com/simon-bachhuber/imt.git).
|
@@ -50,26 +53,23 @@ Install with `pip` using
|
|
50
53
|
|
51
54
|
`pip install imt-ring`
|
52
55
|
|
53
|
-
Typically, this will install `jax` as cpu-only version.
|
54
|
-
```bash
|
55
|
-
pip install --upgrade "jax[cuda12_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html
|
56
|
-
```
|
56
|
+
Typically, this will install `jax` as cpu-only version. For GPU install instructions for `jax` see https://github.com/jax-ml/jax?tab=readme-ov-file#instructions.
|
57
57
|
|
58
58
|
## Documentation
|
59
59
|
|
60
|
-
Available [here](https://
|
60
|
+
Available [here](https://simon-bachhuber.github.io/ring/).
|
61
61
|
|
62
62
|
## Quickstart Example
|
63
63
|
```python
|
64
64
|
import ring
|
65
65
|
import numpy as np
|
66
66
|
|
67
|
-
T : int = 30
|
68
|
-
Ts : float = 0.01
|
69
|
-
B : int = 1
|
70
|
-
lam: list[int] = [0, 1
|
71
|
-
N : int = len(lam)
|
72
|
-
T_i: int = int(T/Ts)
|
67
|
+
T : int = 30 # sequence length [s]
|
68
|
+
Ts : float = 0.01 # sampling interval [s]
|
69
|
+
B : int = 1 # batch size
|
70
|
+
lam: list[int] = [-1, 0, 1] # parent array
|
71
|
+
N : int = len(lam) # number of bodies
|
72
|
+
T_i: int = int(T/Ts) # number of timesteps
|
73
73
|
|
74
74
|
X = np.zeros((B, T_i, N, 9))
|
75
75
|
# where X is structured as follows:
|
@@ -112,7 +112,11 @@ Solution:
|
|
112
112
|
|
113
113
|
## Publications
|
114
114
|
|
115
|
-
The
|
115
|
+
The main publication is:
|
116
|
+
|
117
|
+
- [*Recurrent Inertial Graph-Based Estimator (RING): A Single Pluripotent Inertial Motion Tracking Solution*](https://openreview.net/pdf?id=h2C3rkn0zR)
|
118
|
+
|
119
|
+
The following publications also utilize this software library, and refer to it as the *Random Chain Motion Generator (RCMG)* (more specifically the function `ring.RCMG`):
|
116
120
|
|
117
121
|
- [*RNN-based Observability Analysis for Magnetometer-Free Sparse Inertial Motion Tracking*](https://ieeexplore.ieee.org/document/9841375)
|
118
122
|
- [*Plug-and-Play Sparse Inertial Motion Tracking With Sim-to-Real Transfer*](https://ieeexplore.ieee.org/document/10225275)
|
@@ -126,3 +130,8 @@ Particularly useful is the following publication from *Roy Featherstone*
|
|
126
130
|
## Contact
|
127
131
|
|
128
132
|
Simon Bachhuber (simon.bachhuber@fau.de)
|
133
|
+
|
134
|
+
### How to bump verion in this python package
|
135
|
+
|
136
|
+
1) commit and *push* your code changes. Make sure to also update the version in `pyproject.toml`
|
137
|
+
2) create the tag and push the tag
|
@@ -15,7 +15,7 @@ ring/algorithms/custom_joints/rr_joint.py,sha256=jnRtjtOCALMaq2_0bcu2d7qgfQ6etXp
|
|
15
15
|
ring/algorithms/custom_joints/rsaddle_joint.py,sha256=QoMo6NXdYgA9JygSzBvr0eCdd3qKhUgCrGPNO2Qdxko,1200
|
16
16
|
ring/algorithms/custom_joints/suntay.py,sha256=TZG307NqdMiXnNY63xEx8AkAjbQBQ4eO6DQ7R4j4D08,16726
|
17
17
|
ring/algorithms/generator/__init__.py,sha256=bF-CW3x2x-o6KWESKy-DuxzZPh3UNSjJb_MaAcSHGsQ,277
|
18
|
-
ring/algorithms/generator/base.py,sha256=
|
18
|
+
ring/algorithms/generator/base.py,sha256=yPH_RIQPU_nlq58HyZ6T3RUm1S5chA3-Ro__-ArYTq0,22669
|
19
19
|
ring/algorithms/generator/batch.py,sha256=xp1X8oYtwI6l2cH4GRu9zw-P8dnh-X1FWTSyixEfgr8,2652
|
20
20
|
ring/algorithms/generator/finalize_fns.py,sha256=ty1NaU-Mghx1RL-voivDjS0TWSKNtjTmbdmBnShhn7k,10398
|
21
21
|
ring/algorithms/generator/motion_artifacts.py,sha256=2VJbldVDbI3PSyboshIbtYvSAKzBBwGV7cQfYjqvluM,9167
|
@@ -86,7 +86,8 @@ ring/utils/randomize_sys.py,sha256=G_vBIo0OwQkXL2u0djwbaoaeb02C4LQCTNNloOYIU2M,3
|
|
86
86
|
ring/utils/utils.py,sha256=gKwOXLxWraeZfX6EbBcg3hkq30DcXN0mcRUeOSTNiMo,7336
|
87
87
|
ring/utils/register_gym_envs/__init__.py,sha256=PtPIRBQJ16339xZ9G9VpvqrvcGbQ_Pk_SUz4tQPa9nQ,94
|
88
88
|
ring/utils/register_gym_envs/saddle.py,sha256=tA5CyW_akSXyDm0xJ83CtOrUMVElH0f9vZtEDDJQalI,4422
|
89
|
-
imt_ring-1.6.
|
90
|
-
imt_ring-1.6.
|
91
|
-
imt_ring-1.6.
|
92
|
-
imt_ring-1.6.
|
89
|
+
imt_ring-1.6.46.dist-info/METADATA,sha256=9NOkzI2PpdcJpw90_ZV0smHEWyhkrZyEF211Wy1gNpg,5888
|
90
|
+
imt_ring-1.6.46.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
|
91
|
+
imt_ring-1.6.46.dist-info/entry_points.txt,sha256=npNqSOvNiBR0BNa_GL3J66q8Gky3h0G_PHzHzk8oyE0,66
|
92
|
+
imt_ring-1.6.46.dist-info/top_level.txt,sha256=EiT790-lAyi8iwTzJArH3f2k77rwhDn00q-4PlmvDQo,5
|
93
|
+
imt_ring-1.6.46.dist-info/RECORD,,
|
@@ -1,5 +1,6 @@
|
|
1
1
|
from dataclasses import replace
|
2
2
|
from functools import partial
|
3
|
+
import logging
|
3
4
|
import random
|
4
5
|
from typing import Callable, Optional
|
5
6
|
import warnings
|
@@ -20,6 +21,8 @@ from ring.algorithms.generator import motion_artifacts
|
|
20
21
|
from ring.algorithms.generator import setup_fns
|
21
22
|
from ring.algorithms.generator import types
|
22
23
|
|
24
|
+
logger = logging.getLogger(__name__)
|
25
|
+
|
23
26
|
|
24
27
|
class RCMG:
|
25
28
|
def __init__(
|
@@ -237,7 +240,9 @@ class RCMG:
|
|
237
240
|
def _generators_ncalls(self, sizes: int | list[int] = 1):
|
238
241
|
"Returns list of unbatched sequences as numpy arrays."
|
239
242
|
repeats = self._compute_repeats(sizes)
|
243
|
+
logger.info(f"`repeats` = {repeats}")
|
240
244
|
sizes = list(jnp.array(repeats) * jnp.array(self._size_of_generators))
|
245
|
+
logger.info(f"`sizes` = {sizes}")
|
241
246
|
|
242
247
|
reduced_repeats = []
|
243
248
|
n_calls = []
|
@@ -246,6 +251,9 @@ class RCMG:
|
|
246
251
|
gcd = utils.gcd(n_call, repeat)
|
247
252
|
n_calls.append(gcd)
|
248
253
|
reduced_repeats.append(repeat // gcd)
|
254
|
+
logger.info(f"`reduced_repeats` = {reduced_repeats}")
|
255
|
+
logger.info(f"`n_calls` = {n_calls}")
|
256
|
+
|
249
257
|
jits = [N > 1 for N in n_calls]
|
250
258
|
|
251
259
|
gens = []
|
File without changes
|