imt-ring 1.6.42__py3-none-any.whl → 1.6.45__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: imt-ring
3
- Version: 1.6.42
3
+ Version: 1.6.45
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/icon.svg" height="200" />
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. Afterwards, gpu-enabled version can be installed with
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://simipixel.github.io/ring/).
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 # sequence length [s]
68
- Ts : float = 0.01 # sampling interval [s]
69
- B : int = 1 # batch size
70
- lam: list[int] = [0, 1, 2] # parent array
71
- N : int = len(lam) # number of bodies
72
- T_i: int = int(T/Ts) # number of timesteps
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 following publications utilize this software library, and refer to it as the *Random Chain Motion Generator (RCMG)* (more specifically the function `ring.RCMG`):
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)
@@ -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=klWYt6TlMluLu0ihGzmmPXBm47DOTpjXJylZVNXHVEk,22419
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.42.dist-info/METADATA,sha256=xpcG74pMBIr3v0CQkG9zNZ0BCefDZAVhrOPu31Pb4Uk,4251
90
- imt_ring-1.6.42.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
91
- imt_ring-1.6.42.dist-info/top_level.txt,sha256=EiT790-lAyi8iwTzJArH3f2k77rwhDn00q-4PlmvDQo,5
92
- imt_ring-1.6.42.dist-info/RECORD,,
89
+ imt_ring-1.6.45.dist-info/METADATA,sha256=gjZdACsiCHmMA8kB0eRzjI2QIKoP6BgUVzYaVznaNTc,5708
90
+ imt_ring-1.6.45.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
91
+ imt_ring-1.6.45.dist-info/entry_points.txt,sha256=npNqSOvNiBR0BNa_GL3J66q8Gky3h0G_PHzHzk8oyE0,66
92
+ imt_ring-1.6.45.dist-info/top_level.txt,sha256=EiT790-lAyi8iwTzJArH3f2k77rwhDn00q-4PlmvDQo,5
93
+ imt_ring-1.6.45.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.0)
2
+ Generator: setuptools (75.8.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ ring-view = ring.extras.interactive_viewer:main
@@ -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 = []