trlog2 loses the quadrant for valid SO(2) and SE(2) rotations
Maintainer antworten meist innerhalb von 1 Tag
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 72/100
Rechercherichtung
Der Fehler steckt in trlog2 in spatialmath/base/transforms2d.py, wo beide Zweige den Winkel mit atan(sin/cos) berechnen und dabei den Quadranten verlieren. Beginne dort und prüfe, ob atan2 auf denselben Sinus- und Kosinuswerten die Fälle 120° und 180° behebt. Führe das Reproduktionsskript aus dem Issue aus, das trlog2, SO2.log, SE2.log und Twist2(SE2).exp mit den exakten Logarithmen vergleicht. Fertig ist es, wenn alle fünf Hin-und-zurück-Tests bei 120° und 180° bestehen und der 30°-Kontrollfall weiterhin besteht.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
trlog2 returns logarithms that don't exponentiate to valid 120° and 180° inputs. SO2.log(), SE2.log() and Twist2(SE2(...)).exp() inherit this.
Version: spatialmath-python 1.1.18, 2de780137049040a665225b59d65d95ec93a9e13, Python 3.12.3, SymPy 1.14.0, mpmath 1.3.0, Linux x86_64, NumPy 1.26.4 / SciPy 1.15.3 and NumPy 2.5.4 / SciPy 1.18.1.
In an empty directory, use Python 3.12 and Bash:
git clone https://github.com/rai-opensource/spatialmath-python.git spatialmath-python
git -C spatialmath-python checkout --detach 2de780137049040a665225b59d65d95ec93a9e13
python3.12 -m venv .venv
.venv/bin/python -m pip install -e ./spatialmath-python numpy==1.26.4 scipy==1.15.3 sympy==1.14.0 mpmath==1.3.0
OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 .venv/bin/python - <<'PY'
"""Exact SO(2)/SE(2) log references, including a common 120-degree pose."""
import numpy as np
import sympy as sp
from scipy.linalg import expm
from spatialmath import SO2, SE2, Twist2
from spatialmath.base import trlog2
def numeric(m):
return np.array(sp.Matrix(m).evalf(60).tolist(), dtype=float)
failures = []
for degrees in (30, 120, 180):
theta = sp.pi * degrees / 180
c, s = sp.cos(theta), sp.sin(theta)
R = sp.Matrix([[c, -s], [s, c]])
T = sp.eye(3)
T[:2, :2], T[:2, 2] = R, sp.Matrix([1, 2])
# exp([v,theta]) translates by V(theta)*v.
V = sp.Matrix([[s, -(1-c)], [1-c, s]]) / theta
v = V.inv() * sp.Matrix([1, 2])
logR = sp.Matrix([[0, -theta], [theta, 0]])
logT = sp.Matrix([[0, -theta, v[0]], [theta, 0, v[1]], [0, 0, 0]])
np.testing.assert_allclose(expm(numeric(logT)), numeric(T), atol=1e-14)
for name, actual, expected in (
('trlog2(SO2)', trlog2(numeric(R)), numeric(logR)),
('SO2.log', SO2(numeric(R)).log(), numeric(logR)),
('trlog2(SE2)', trlog2(numeric(T)), numeric(logT)),
('SE2.log', SE2(numeric(T)).log(), numeric(logT)),
('Twist2(SE2).exp', Twist2(SE2(numeric(T))).exp().A, numeric(T)),
):
error = np.max(np.abs(actual - expected))
print(f'{degrees:3d} deg {name:17s} max error {error:.12g}')
# Any real logarithm branch is acceptable if its exponential is the
# specified input. This also accepts either sign at the half-turn.
target = numeric(R) if name in ('trlog2(SO2)', 'SO2.log') else numeric(T)
recovered = actual if name == 'Twist2(SE2).exp' else expm(actual)
if not np.allclose(recovered, target, atol=1e-12, rtol=0):
failures.append((degrees, name))
print('log rotation =', trlog2(numeric(R), twist=True))
assert not failures, f'Confirmed deviations: {failures}'
PY
The trlog2 contract defines SO(2)/SE(2) matrix logarithms, so exp(log(T)) should recover T. Inputs meet documented forms with default checks enabled and no documented angle bound.
At 120°, trlog2(R, twist=True) returns -pi/3 instead of 2*pi/3, and at 180°, zero. Both angles fail all five round trips. The 30° control passes.
Both branches lose the quadrant through atan(sin/cos). atan2 with the same sine and cosine entries would preserve it.
We tested singleton matrices at 30°, ±120° and 180°, without sequences or robot workflows.
The reproducer is provided under CC0-1.0. Happy to send a PR.
— ChipLab
- Vorherrschende Sprache
- Python
- Sterne
- 648
- Forks
- 108
- Ø Merge
- 9 T. 19 Std.
- Gemergte PRs (30 T.)
- 9
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus rai-opensource/spatialmath-python
-
documentation
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
rai-opensource/spatialmath-python#235 ·
Maintainer antworten meist innerhalb von 1 Tag
-
enhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
rai-opensource/spatialmath-python#32 · 4 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
enhancement
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 45/100
rai-opensource/spatialmath-python#268 ·
Maintainer antworten meist innerhalb von 1 Tag
-
expand_dims(None) raises TypeError although None is its documented defaultEvtl. vergeben @Doribelove hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 52/100
rai-opensource/spatialmath-python#261 ·
Maintainer antworten meist innerhalb von 1 Tag
-
documentation enhancement
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 15/100
rai-opensource/spatialmath-python#257 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in rai-opensource/spatialmath-python
Ähnliche Issues
-
bug good first issue
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
yunaremaia/proto-drift#22 ·
-
bug good first issue
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
yunaremaia/memwatch#96 ·
-
bug good first issue
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 91/100
yunaremaia/ci-gate-watch#34 ·
-
bug good first issue
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 85/100
yunaremaia/agent-capability-attestation#64 ·
Maintainer antworten meist innerhalb von 1 Tag
-
bug good first issue
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 86/100
yunaremaia/agent-call-graph#43 ·
Maintainer antworten meist innerhalb von 1 Tag