Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

trlog2 loses the quadrant for valid SO(2) and SE(2) rotations

Offen Anfängerfreundlich
#252 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

@vera-rubin arbeitet bereits daran.

Seit 14.10.2026.

  • #256 von @vera-rubin — offen

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
72/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
numpy, python
Bereich
robotics

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

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus rai-opensource/spatialmath-python

Alle Issues in rai-opensource/spatialmath-python

Ähnliche Issues

Weitere Issues zu Python

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.