rational-linkages 2.1.0__cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl → 2.2.3__cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.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.
- rational_linkages/CollisionAnalyser.py +12 -7
- rational_linkages/CollisionFreeOptimization.py +4 -1
- rational_linkages/DualQuaternion.py +5 -2
- rational_linkages/FactorizationProvider.py +6 -5
- rational_linkages/MiniBall.py +8 -1
- rational_linkages/MotionApproximation.py +5 -1
- rational_linkages/MotionDesigner.py +549 -541
- rational_linkages/MotionFactorization.py +6 -5
- rational_linkages/MotionInterpolation.py +1 -1
- rational_linkages/PlotterMatplotlib.py +16 -4
- rational_linkages/PlotterPyqtgraph.py +552 -532
- rational_linkages/RationalBezier.py +2 -3
- rational_linkages/RationalCurve.py +12 -3
- rational_linkages/RationalDualQuaternion.py +5 -4
- rational_linkages/RationalMechanism.py +4 -4
- rational_linkages/SingularityAnalysis.py +2 -3
- rational_linkages/utils.py +60 -3
- rational_linkages/utils_rust.cpython-313-aarch64-linux-gnu.so +0 -0
- {rational_linkages-2.1.0.dist-info → rational_linkages-2.2.3.dist-info}/METADATA +31 -18
- rational_linkages-2.2.3.dist-info/RECORD +40 -0
- rational_linkages-2.1.0.dist-info/RECORD +0 -40
- {rational_linkages-2.1.0.dist-info → rational_linkages-2.2.3.dist-info}/WHEEL +0 -0
- {rational_linkages-2.1.0.dist-info → rational_linkages-2.2.3.dist-info}/licenses/LICENSE +0 -0
- {rational_linkages-2.1.0.dist-info → rational_linkages-2.2.3.dist-info}/top_level.txt +0 -0
@@ -1,8 +1,8 @@
|
|
1
1
|
import numpy
|
2
|
-
import sympy
|
3
|
-
from scipy.optimize import minimize
|
4
2
|
|
5
|
-
from
|
3
|
+
from sympy import symbols, Poly
|
4
|
+
|
5
|
+
from .Linkage import LineSegment
|
6
6
|
from .DualQuaternion import DualQuaternion
|
7
7
|
from .NormalizedLine import NormalizedLine
|
8
8
|
from .PointHomogeneous import PointHomogeneous, PointOrbit
|
@@ -47,11 +47,11 @@ class CollisionAnalyser:
|
|
47
47
|
|
48
48
|
relative_motions = branch0 + branch1[::-1]
|
49
49
|
|
50
|
-
t =
|
50
|
+
t = symbols('t')
|
51
51
|
|
52
52
|
motions = []
|
53
53
|
for motion in relative_motions:
|
54
|
-
motions.append(RationalCurve([
|
54
|
+
motions.append(RationalCurve([Poly(c, t, greedy=False)
|
55
55
|
for c in motion],
|
56
56
|
metric=self.metric))
|
57
57
|
return motions
|
@@ -296,6 +296,11 @@ class CollisionAnalyser:
|
|
296
296
|
"""
|
297
297
|
Optimize the link control points to avoid collisions with the bounding orbits.
|
298
298
|
"""
|
299
|
+
try:
|
300
|
+
from scipy.optimize import minimize # lazy import
|
301
|
+
except ImportError:
|
302
|
+
raise RuntimeError("Scipy import failed. Check its installation.")
|
303
|
+
|
299
304
|
def flatten_cps(cps):
|
300
305
|
return numpy.array([cp.normalized_in_3d() for cp in cps]).flatten()
|
301
306
|
|
@@ -348,11 +353,11 @@ class CollisionAnalyser:
|
|
348
353
|
:param min_splits: Minimum number of splits for the bezier curves.
|
349
354
|
"""
|
350
355
|
|
351
|
-
t =
|
356
|
+
t = symbols('t')
|
352
357
|
motions = []
|
353
358
|
for i, idx in enumerate(reduced_indices):
|
354
359
|
rel_motion = self.mechanism.relative_motion(segment_id_number, idx)
|
355
|
-
motions.append(RationalCurve([
|
360
|
+
motions.append(RationalCurve([Poly(c, t, greedy=False)
|
356
361
|
for c in rel_motion],
|
357
362
|
metric=self.metric))
|
358
363
|
|
@@ -30,7 +30,10 @@ class CollisionFreeOptimization:
|
|
30
30
|
parameters of the points, result of the optimization
|
31
31
|
:rtype: tuple
|
32
32
|
"""
|
33
|
-
|
33
|
+
try:
|
34
|
+
from scipy.optimize import minimize # lazy import
|
35
|
+
except ImportError:
|
36
|
+
raise RuntimeError("Scipy import failed. Check its installation.")
|
34
37
|
|
35
38
|
# get the axes represented as normalized lines
|
36
39
|
if len(self.mechanism.factorizations) == 1:
|
@@ -226,10 +226,13 @@ class DualQuaternion:
|
|
226
226
|
:return: DualQuaternion with rational elements
|
227
227
|
:rtype: DualQuaternion
|
228
228
|
"""
|
229
|
-
from sympy import Rational
|
229
|
+
from sympy import Rational
|
230
230
|
|
231
231
|
if study_parameters is not None:
|
232
|
-
rational_numbers = [
|
232
|
+
rational_numbers = [x if isinstance(x, Expr)
|
233
|
+
else Rational(*x) if isinstance(x, tuple)
|
234
|
+
else Rational(x)
|
235
|
+
for x in study_parameters]
|
233
236
|
else:
|
234
237
|
rational_numbers = [Rational(1), Rational(0), Rational(0), Rational(0),
|
235
238
|
Rational(0), Rational(0), Rational(0), Rational(0)]
|
@@ -3,7 +3,8 @@ from warnings import warn
|
|
3
3
|
|
4
4
|
import biquaternion_py
|
5
5
|
import numpy as np
|
6
|
-
|
6
|
+
|
7
|
+
from sympy import Symbol, Rational
|
7
8
|
|
8
9
|
from .DualQuaternion import DualQuaternion
|
9
10
|
from .MotionFactorization import MotionFactorization
|
@@ -45,7 +46,7 @@ class FactorizationProvider:
|
|
45
46
|
|
46
47
|
:warning: If the given curve has not only rational numbers as input.
|
47
48
|
"""
|
48
|
-
t =
|
49
|
+
t = Symbol("t")
|
49
50
|
|
50
51
|
if isinstance(curve, RationalCurve):
|
51
52
|
bi_quat = biquaternion_py.BiQuaternion(curve.extract_expressions())
|
@@ -58,7 +59,7 @@ class FactorizationProvider:
|
|
58
59
|
poly_coeffs = bi_poly.all_coeffs()
|
59
60
|
for i in range(len(poly_coeffs)):
|
60
61
|
for j in range(len(poly_coeffs[i].args)):
|
61
|
-
if not isinstance(poly_coeffs[i].args[j],
|
62
|
+
if not isinstance(poly_coeffs[i].args[j], Rational):
|
62
63
|
warn('The given curve has not only rational numbers as input. The factorization will be performed with floating point numbers, but may be instable.')
|
63
64
|
break
|
64
65
|
|
@@ -92,7 +93,7 @@ class FactorizationProvider:
|
|
92
93
|
'as input. The factorization will be performed with floating '
|
93
94
|
'point numbers, but may be instable.')
|
94
95
|
|
95
|
-
t =
|
96
|
+
t = Symbol("t")
|
96
97
|
|
97
98
|
bi_poly = t - biquaternion_py.BiQuaternion(factorization.dq_axes[0].array())
|
98
99
|
for i in range(1, factorization.number_of_factors):
|
@@ -147,7 +148,7 @@ class FactorizationProvider:
|
|
147
148
|
:return: The rotation axis of the factor.
|
148
149
|
:rtype: DualQuaternion
|
149
150
|
"""
|
150
|
-
t =
|
151
|
+
t = Symbol("t")
|
151
152
|
t_dq = DualQuaternion([t, 0, 0, 0, 0, 0, 0, 0])
|
152
153
|
|
153
154
|
factor_dq = DualQuaternion(factor.poly.coeffs)
|
rational_linkages/MiniBall.py
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
import numpy as np
|
2
|
-
from scipy.optimize import minimize
|
3
2
|
|
4
3
|
from .AffineMetric import AffineMetric
|
5
4
|
from .PointHomogeneous import PointHomogeneous
|
@@ -55,6 +54,14 @@ class MiniBall:
|
|
55
54
|
return PointHomogeneous(center), radius_squared
|
56
55
|
|
57
56
|
def get_ball_minimize(self):
|
57
|
+
"""
|
58
|
+
Find the smallest ball containing all given points using optimization
|
59
|
+
"""
|
60
|
+
try:
|
61
|
+
from scipy.optimize import minimize # lazy import
|
62
|
+
except ImportError:
|
63
|
+
raise RuntimeError("Scipy import failed. Check the package installation.")
|
64
|
+
|
58
65
|
def objective_function(x):
|
59
66
|
"""
|
60
67
|
Objective function to minimize the squared radius r^2 of the ball
|
@@ -1,13 +1,17 @@
|
|
1
1
|
from typing import Union
|
2
2
|
|
3
3
|
import numpy as np
|
4
|
-
from scipy.optimize import minimize
|
5
4
|
|
6
5
|
from .AffineMetric import AffineMetric
|
7
6
|
from .DualQuaternion import DualQuaternion
|
8
7
|
from .PointHomogeneous import PointHomogeneous
|
9
8
|
from .RationalCurve import RationalCurve
|
10
9
|
|
10
|
+
try:
|
11
|
+
from scipy.optimize import minimize # lazy import, optional dependency
|
12
|
+
except ImportError:
|
13
|
+
minimize = None
|
14
|
+
|
11
15
|
### NOT YET in the documentation ### TODO: add to docs
|
12
16
|
|
13
17
|
|