Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

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

Aperta Adatta ai principianti
#252 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

@vera-rubin ci sta già lavorando.

Dal 14/10/2026.

  • #256 di @vera-rubin — aperta

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
72/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
numpy, python
Ambito
robotics

Direzione di ricerca

Il bug è in trlog2 in spatialmath/base/transforms2d.py, dove entrambi i rami recuperano l'angolo con atan(sin/cos) e perdono il quadrante. Inizia da lì e verifica se atan2 applicato alle stesse voci di seno e coseno corregge i casi a 120° e 180°. Esegui il riproduttore della issue, che confronta trlog2, SO2.log, SE2.log e Twist2(SE2).exp con i logaritmi esatti. È fatto quando tutti e cinque i round trip passano a 120° e 180° e il controllo a 30° continua a passare.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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

Lingua principale
Python
Stelle
648
Fork
108
Merge medio
9g 19h
PR unite (30g)
9

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di rai-opensource/spatialmath-python

Tutte le issue di rai-opensource/spatialmath-python

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.