symforce icon indicating copy to clipboard operation
symforce copied to clipboard

Questions about `from_rotation_matrix()` for the `Rot2` class

Open zhanghua7099 opened this issue 1 year ago • 1 comments

Hi! I found that in Rot3 class, it has the method from_rotation_matrix(): https://github.com/symforce-org/symforce/blob/04ccac19aa25bf657c1f312539fc6964fd402128/symforce/geo/rot3.py#L190

This enables converting a $3\times 3$ numpy matrix to symforce.

However, for Rot2 class, it seems only support convert from_angle() or from_tangent().

Could you please give me some suggestions about how to convert a SO(2) matrix to symforce?

Thank you very much!

zhanghua7099 avatar Oct 17 '24 09:10 zhanghua7099

to_rotation_matrix for Rot2 is this: https://github.com/symforce-org/symforce/blob/04ccac19aa25bf657c1f312539fc6964fd402128/symforce/geo/rot2.py#L148-L152

So to invert this, you could do:

def to_rotation_matrix(m: sf.M22) -> sf.Rot2:
    return sf.Rot2(sf.Complex(real=M[0, 0], imag=M[1, 0]))

There's should be a way of looking at all of the elements to give a Rot2 that's optimal e.g. by Frobenius norm when m is not exactly a rotation matrix, but I don't know the solution for that off the top of my head

aaron-skydio avatar Oct 18 '24 19:10 aaron-skydio

Thanks for your help! I assume the input matrix $R\in SO(2)$. In this situation, I found the method from_storage() possible to convert an SO(2) matrix to symforce. https://github.com/symforce-org/symforce/blob/04ccac19aa25bf657c1f312539fc6964fd402128/symforce/geo/rot2.py#L50

This is a simple demo. The input matrix W_init must in SO(2).

import sym
import numpy as np

W_init = np.eye(2)
W_sym = sym.rot2.Rot2.from_storage(W_init[:,0])

The first column of W_init will be the input of sym.rot2.Rot2.from_storage().

zhanghua7099 avatar Oct 21 '24 06:10 zhanghua7099