[3D CV] se3, SE3, so3, SO3
[Blog]
๋ณธ ํฌ์คํธ๋ ์ ๋ธ๋ก๊ทธ ๋ด์ฉ์ ์ฐธ์กฐํ์ฌ ์ ๋ฆฌํ ๋ด์ฉ์์ ๋ฐํ๋๋ค.
Lie Group SO(3), SE(3)
Lie Algebra so(3), se(3)
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด SE3์์ ํ์ ๋ฐ ์ด๋๋ณํ์ ๊ตฌํ ๋ ํ๋๋ฒ ๊ณ์ฐํ ๋๋ ํฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ์ง๋ง SLAM์์์ ๊ฐ์ด ๋งค์ฐ ๋น ๋ฅธ์๊ฐ์ ์ฐ์์ ์ผ๋ก R|T๋ฅผ ๋ณ์๋ก ํ์ฌ pose๋ฅผ ์ต์ ํ๋ฅผ ํตํด ๊ตฌํ๋ ๊ฒฝ์ฐ์, SE3์์์๋ constraints๋ก ์ธํด ์ต์ ํ ํ ๋๋ง๋ค ์ด ์กฐ๊ฑด๋ค์ด ๋ง๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ํ์ง๋ง se3์์๋ ์ด๋ฐ constraints๊ฐ ์๊ณ linear space์ด๊ธฐ ๋๋ฌธ์ ๋ถ๋ด์์ด ๋ฏธ๋ถ์ ์ ์ฉํ์ฌ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ์ฆ, ์ต์ ํ ๋ณ์๋ฅผ se3(w,v)๋ก ๋๊ณ ๊ณ์ฐ๋ ์ฆ๋ถ๋์ exp(zeta)๋ฅผ ํตํด SE3๋ก ๋ณํํ๋ฉด ๋ฉ๋๋ค. constrained optimization์ด unconstrained optimization์ผ๋ก ๋ณํ๋๋๊ฑฐ์ฃ . ๋ํ ์ต๊ทผ์ learning based SLAM๊ฐ์ ๊ฒฝ์ฐ ๋ด๋ด๋ท์์ R|T๋ฅผ ํธ๋ฏธ๋ถํด์ผํ๋ Lie pytorch๋ฅผ ์ด์ฉํ์ฌ Lie group์ ํ์ฉํฉ๋๋ค.
SE(3)๋ SO(3)๋ฅผ ํฌํจํ๋ ๊ด๊ณ์ ๋๋ค.
SO(3)๋ ์์ํ ํ์ ๋ง์ ๋ํ๋ด๊ณ , SE(3)๋ SO(3)์ ํ์ ๊ณผ ์ถ๊ฐ์ ์ธ ์ด๋ ๋ฒกํฐ๋ฅผ ํฌํจํฉ๋๋ค.
์ฆ, SE(3)๋ ๊ฐ์ฒด์ ํ์ ๊ณผ ์ด๋์ ๋ชจ๋ ํํํ ์ ์์ต๋๋ค. (Rigid-body transform)
SE(3)์ SO(3)๋ ๊ฐ๊ฐ ๊ณต๊ฐ์์์ ์ด๋์ ์ค๋ช ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ํ์ ๊ทธ๋ฃน์ ๋๋ค. ์ด ๋ ๊ทธ๋ฃน์ ๋ก๋ด๊ณตํ, ์ปดํจํฐ ๋น์ , ๊ทธ๋ฆฌ๊ณ ์ธ๊ณต์ง๋ฅ ๋ถ์ผ์์ ํนํ ์ค์ํฉ๋๋ค.
SO(3)๋ 3์ฐจ์ ๊ณต๊ฐ์์์ ํ์ ์ ํํํ๋ ๊ทธ๋ฃน์ผ๋ก, โSpecial Orthogonal Group of degree 3โ์ ์ฝ์ด์ ๋๋ค. ์ด ๊ทธ๋ฃน์ ์์๋ 3x3 ์ง๊ต ํ๋ ฌ๋ก, ํ๋ ฌ์์ด 1์ธ ํ๋ ฌ์ ๋งํฉ๋๋ค. ์ด๋ ์์ํ ํ์ ์ ๋ํ๋ ๋๋ค.
SE(3)๋ 3์ฐจ์ ๊ณต๊ฐ์์์ ํ์ ๊ณผ ์ด๋์ ํจ๊ป ํํํ ์ ์๋ ๊ทธ๋ฃน์ผ๋ก, โSpecial Euclidean Group of degree 3โ์ ์ฝ์ด์ ๋๋ค. SE(3)๋ SO(3)์ ํ์ ๊ณผ ์ถ๊ฐ์ ์ธ ์ด๋ ๋ฒกํฐ๋ฅผ ํฌํจํฉ๋๋ค. ์ฆ, SE(3)๋ ๊ฐ์ฒด์ ํ์ ๊ณผ ์ด๋์ ๋ชจ๋ ํํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, SE(3)๋ SO(3)๋ฅผ ํฌํจํ๋ ๊ฐ๋ ์ด๋ฉฐ, ์ด๋(translations)์ ์ถ๊ฐ๋ก ๋ค๋ฃน๋๋ค. SO(3)๋ SE(3) ๋ด์์ ํ์ ๋ถ๋ถ์ ํด๋นํฉ๋๋ค.
์ ๋ฆฌํ๋ฉด se(3)๋ ํ์ ์ธ so(3)๋ฅผ ํฌํจํ๋ ๊ด๊ณ์ด๊ณ , SE(3)๋ ํ์ ์ธ SO(3)๋ฅผ ํฌํจํ๋ ๊ด๊ณ์ด๋ฏ๋ก, se(3) to SE(3) ๋ณํ ๊ด๊ณ์์ ์์ํ ํ์ ์ธ so(3), SO(3)์ ์ถ๊ฐ์ ์ผ๋ก ์ด๋ ๋ฒกํฐ๋ฅผ ํํํ ์ ์์ต๋๋ค.
์ฝ๋: Lie Algebra์ธ se(3)๋ linear space ์ฌ์ Lie Group์ธ SE(3)์ ์กด์ฌํ๋ constraints๊ฐ ์๊ธฐ ๋๋ฌธ์, Lie Algebra์ธ se(3)์ ๋ํด์ ๋ฏธ๋ถ์ ๊ณ์ฐํ๊ณ Lie Group์ธ SE(3)๋ก ๋ณํํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ๊ฐ์ฒด์ ํ์ ๊ณผ ์ด๋์ ๋ชจ๋ ํํํ ์ ์์ต๋๋ค.
3DGS์์ ์ฝ๋๋ก se(3)์ ๋ํ ํ๋ผ๋ฏธํฐ๋ก ์ต์ ํํ๋ ๊ณผ์ ์ w, v ๋ก nn.Parameter๋ก ์ ์ํ๊ณ , ์ด๋ฅผ se3_to_SE3 ํจ์๋ก w,v์ ๋ณ์๋ก SE(3)๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ ์ฌ์ฉํจ์ ํ์ธํ ์ ์์ต๋๋ค.
# gaussian_splatting/scene/cameras.py
import torch
from torch import nn
import numpy as np
from utils.graphics_utils import getWorld2View2, getProjectionMatrix, se3_to_SE3
# Define a class named Camera_Pose. The code is based on the camera_transf class in iNeRF. You can refer to iNeRF at https://github.com/salykovaa/inerf.
class Camera_Pose(nn.Module):
def __init__(self,start_pose_w2c, FoVx, FoVy, image_width, image_height,
trans=torch.tensor([0.0, 0.0, 0.0]), scale=1.0,
):
super(Camera_Pose, self).__init__()
self.FoVx = FoVx
self.FoVy = FoVy
self.image_width = image_width
self.image_height = image_height
self.zfar = 100.0
self.znear = 0.01
self.trans = trans
self.scale = scale
self.cov_offset = 0
self.w = nn.Parameter(torch.normal(0., 1e-6, size=(3,)).to(start_pose_w2c.device))
self.v = nn.Parameter(torch.normal(0., 1e-6, size=(3,)).to(start_pose_w2c.device))
self.forward(start_pose_w2c)
def forward(self, start_pose_w2c):
deltaT=se3_to_SE3(self.w,self.v)
self.pose_w2c = torch.matmul(deltaT, start_pose_w2c.inverse()).inverse()
self.update()
def current_campose_c2w(self):
return self.pose_w2c.inverse().clone().cpu().detach().numpy()
def update(self):
self.world_view_transform = self.pose_w2c.transpose(0, 1).cuda()
self.projection_matrix = getProjectionMatrix(znear=self.znear, zfar=self.zfar, fovX=self.FoVx, fovY=self.FoVy).transpose(0,1).cuda()
self.full_proj_transform = (self.world_view_transform.unsqueeze(0).bmm(self.projection_matrix.unsqueeze(0))).squeeze(0)
self.camera_center = self.world_view_transform.inverse()[3, :3]
# gaussian_splatting/utils/graphics_utils.py
def se3_to_SE3(w,v): # [...,3]
deltaT = torch.zeros((4,4)).cuda()
wx = skew_symmetric(w)
theta = w.norm(dim=-1)
I = torch.eye(3,device=w.device,dtype=torch.float32)
A = taylor_A(theta)
B = taylor_B(theta)
C = taylor_C(theta)
deltaT[:3, :3] = I+A*wx+B*wx@wx
V = I+B*wx+C*wx@wx
deltaT[:3, 3] = V@v
deltaT[3, 3] = 1.
return deltaT
๋ฐ๋ผ์ 3DGS์์๋ se(3)์์ ๋ฏธ๋ถ๊ฐ์ ๊ณ์ฐํ๊ณ se3_to_SE3 ํจ์๋ก ์ต์ข ์ ์ผ๋ก๋ SE(3)๋ก ๋ฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
SO(3)
\[SO(3) = \{ R \in \mathbb{R}^{3 \times 3} | R^T R = I, \text{det}(R) = 1 \}\]์ฌ๊ธฐ์ $R$์ 3x3 ์ง๊ต ํ๋ ฌ์ด๋ฉฐ, $R^T$๋ $R$์ ์ ์น ํ๋ ฌ์ ๋ํ๋ ๋๋ค. ์ด ๊ทธ๋ฃน์ ํ์ ์ ๋ํ๋ด๋ฉฐ, ํ์ ํ๋ ฌ์ ์ง๊ต ํ๋ ฌ์ด๋ฉฐ ํ๋ ฌ์์ด 1์ ๋๋ค.
so(3)
\[so(3) = \{ \omega \in \mathbb{R}^{3 \times 3} | \omega^T = -\omega \}\]์ฌ๊ธฐ์ $\omega$๋ 3x3 ๋ฐ๋์นญ ํ๋ ฌ์ ๋ํ๋ด๋ฉฐ, ์ด๋ so(3)์ ์์๋ค์ ๋๋ค. so(3)๋ ํ์ ์ ๋ฏธ์ ๋ณํ๋ฅผ ๋ํ๋ด๋ ๋์์ ๊ตฌ์กฐ๋ก์, $\mathbb{R}^3$์ ๋ฒกํฐ๋ฅผ 3x3 ๋ฐ๋์นญ ํ๋ ฌ๋ก ๋ณํํจ์ผ๋ก์จ SO(3) ๊ทธ๋ฃน์ ์ ๊ณต๊ฐ์ ํ์ฑํฉ๋๋ค. ์ด ๋์ ๊ตฌ์กฐ๋ 3์ฐจ์ ๊ณต๊ฐ์์์ ๋ฌดํ์ ํ์ ์ ๋ํ๋ด๋ฉฐ, ์ด๋ SO(3)์ ์ฐ์์ ์ธ ํ์ ์ด๋์ ์ ํ ๊ทผ์ฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
SE(3)
\[SE(3) = \{ T \in \mathbb{R}^{4 \times 4} | T = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}, R \in SO(3), t \in \mathbb{R}^3 \}\]์ฌ๊ธฐ์ $T$๋ 4x4 ๋ณํ ํ๋ ฌ์ ๋ํ๋ด๋ฉฐ, $R$์ ํ์ ํ๋ ฌ, $t$์ ์ด๋ ๋ฒกํฐ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๊ทธ๋ฃน์ ์ด๋๊ณผ ํ์ ์ ๊ฒฐํฉํ ๋ณํ์ ๋ํ๋ด๋ฉฐ, ๋ณํ ํ๋ ฌ์ ์ง๊ต ํ๋ ฌ๊ณผ ์ด๋ ๋ฒกํฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
se(3)
\[se(3) = \{ \xi \in \mathbb{R}^6 | \xi = \begin{bmatrix} \omega \\ v \end{bmatrix}, \omega, v \in \mathbb{R}^3 \}\]์ฌ๊ธฐ์ $\xi$๋ 6์ฐจ์ ๋ฒกํฐ์ด๋ฉฐ, $\omega$๋ ํ์ ์๋ ๋ฒกํฐ, $v$๋ ์ด๋ ์๋ ๋ฒกํฐ๋ฅผ ๋ํ๋ ๋๋ค. ์ด ๊ทธ๋ฃน์ ์์ ํ์ ๊ณผ ์์ ์ด๋์ ๋ํ๋ด๋ ๋ฒกํฐ ๊ณต๊ฐ์ผ๋ก, SE(3) ๊ทธ๋ฃน์์์ ์์ ๋ณํ์ ๋ํ๋ ๋๋ค.
se3์์ SE3๋ก์ ๋ณํ ํจ์ ์ค๋ช
ํจ์ skew_symmetric(w)
- ์
๋ ฅ: ๊ฐ์๋ ๋ฒกํฐ
w
- ์ถ๋ ฅ:
w
์ ์คํ ๋์นญ ํ๋ ฌ(skew-symmetric matrix) - ์ค๋ช : ๊ฐ์๋ ๋ฒกํฐ๋ฅผ ์ ๋ ฅ๋ฐ์ ํด๋น ๋ฒกํฐ์ ์คํ ๋์นญ ํ๋ ฌ์ ์์ฑํฉ๋๋ค. ์ด ํ๋ ฌ์ ๋ฒกํฐ์ ์ธ์ ์ ํ๋ ฌ ๊ณฑ์ ์ผ๋ก ํํํ ์ ์๊ฒ ํด ์ค๋๋ค.
ํจ์ taylor_A(x, nth=10)
, taylor_B(x, nth=10)
, taylor_C(x, nth=10)
- ์
๋ ฅ: ์ค์นผ๋ผ ๋๋ ๋ฒกํฐ
x
, ๊ธ์์ ํญ์nth
- ์ถ๋ ฅ: ํ ์ผ๋ฌ ๊ธ์๋ก ๊ทผ์ฌ๋ ๊ฐ๊ฐ์ ํจ์ ๊ฐ
- ์ค๋ช : ๊ฐ ํจ์๋ ๋ก๋๋ฆฌ๊ฒ์ค ํ์ ๊ณต์(Rodriguesโ rotation formula)์์ ์ฌ์ฉ๋๋ sin(x)/x, (1-cos(x))/x^2, (x-sin(x))/x^3 ๋ฑ์ ๊ทผ์ฌํฉ๋๋ค. ์ด๋ฌํ ๊ทผ์ฌ๋ ํ์ ์ ํฌ๊ธฐ๊ฐ ์์ ๋ ๋์ฑ ์ ํํ๊ฒ ๋์ํฉ๋๋ค.
ํจ์ se3_to_SE3(w, v)
- ์
๋ ฅ: ๊ฐ์๋ ๋ฒกํฐ
w
, ์ ์๋ ๋ฒกํฐv
- ์ถ๋ ฅ: 4x4 ๋ณํ ํ๋ ฌ
SE3
- ์ค๋ช
: ์
๋ ฅ๋
w
์v
๋ก๋ถํฐ SE3 ๋ณํ ํ๋ ฌ์ ๊ณ์ฐํฉ๋๋ค. ์ด ํ๋ ฌ์ 3D ๊ณต๊ฐ์์์ ๋ฆฌ์ง๋ ๋ฐ๋ ๋ณํ(rigid body transformation)์ ํํํ๋ฉฐ, ํ์ ๊ณผ ์ด๋์ ๋ชจ๋ ํฌํจํฉ๋๋ค.- ์์ 3x3 ๋ถ๋ถ์ ํ์ ์ ๋ํ๋ด๋ฉฐ, ๋ก๋๋ฆฌ๊ฒ์ค ๊ณต์๊ณผ ํ ์ผ๋ฌ ๊ธ์ ๊ทผ์ฌ๋ฅผ ํตํด ๊ณ์ฐ๋ฉ๋๋ค.
- ๋ง์ง๋ง ์ด์ ์์ 3๊ฐ ์์๋ ์ด๋์ ๋ํ๋ด๋ฉฐ, ํ์ ์ ๊ณ ๋ คํ ํ ์ผ๋ฌ ๊ธ์ ๊ทผ์ฌ๋ฅผ ํตํด ๊ณ์ฐ๋ฉ๋๋ค.
- ๋งคํธ๋ฆญ์ค(matrix)์ ์ค๋ฅธ์ชฝ ์๋ ์์๋ ํญ์ 1์ ๋๋ค.
import torch
def skew_symmetric(w):
# ์
๋ ฅ๋ ๊ฐ์๋ ๋ฒกํฐ w์ ๋ํ ์คํ ๋์นญ ํ๋ ฌ ๋ฐํ
w0, w1, w2 = w.unbind(dim=-1)
O = torch.zeros_like(w0)
wx = torch.stack([torch.stack([O, -w2, w1], dim=-1),
torch.stack([w2, O, -w0], dim=-1),
torch.stack([-w1, w0, O], dim=-1)], dim=-2)
return wx
def taylor_A(x, nth=10):
# sin(x)/x์ ํ
์ผ๋ฌ ๊ธ์ ๊ทผ์ฌ, nth๋ ๋คํญ์์ ์ต๋ ์ฐจ์
ans = torch.zeros_like(x)
denom = 1.
for i in range(nth+1):
if i > 0: denom *= (2*i)*(2*i+1)
ans += (-1)**i * x**(2*i) / denom
return ans
def taylor_B(x, nth=10):
# (1-cos(x))/x^2์ ํ
์ผ๋ฌ ๊ธ์ ๊ทผ์ฌ, nth๋ ๋คํญ์์ ์ต๋ ์ฐจ์
ans = torch.zeros_like(x)
denom = 1.
for i in range(nth+1):
denom *= (2*i+1)*(2*i+2)
ans += (-1)**i * x**(2*i) / denom
return ans
def taylor_C(x, nth=10):
# (x-sin(x))/x^3์ ํ
์ผ๋ฌ ๊ธ์ ๊ทผ์ฌ, nth๋ ๋คํญ์์ ์ต๋ ์ฐจ์
ans = torch.zeros_like(x)
denom = 1.
for i in range(nth+1):
denom *= (2*i+2)*(2*i+3)
ans += (-1)**i * x**(2*i) / denom
return ans
def se3_to_SE3(w, v):
# ๊ฐ์๋ w์ ์ ์๋ v๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ 4x4 ๋ณํ ํ๋ ฌ SE3 ๊ณ์ฐ
deltaT = torch.zeros((4,4)).cuda()
wx = skew_symmetric(w)
theta = w.norm(dim=-1)
I = torch.eye(3, device=w.device, dtype=torch.float32)
A = taylor_A(theta, nth=10) # nth ์ค์ ์ ๋ฐ๋ผ ๊ทผ์ฌ ์ ํ๋ ๊ฒฐ์
B = taylor_B(theta, nth=10)
C = taylor_C(theta, nth=10)
deltaT[:3, :3] = I + A*wx + B*wx@wx # ํ์ ํ๋ ฌ ๊ณ์ฐ
V = I + B*wx + C*wx@wx # ์ด๋ ๋ฒกํฐ ๊ณ์ฐ์ ์ํ ํ๋ ฌ V ๊ณ์ฐ
deltaT[:3, 3] = V@v # ์ด๋ ๋ฒกํฐ ์ค์
deltaT[3, 3] = 1. # ๋์ฐจ ์ขํ ์ค์
return deltaT
deltaT์ ๋ํ ์ค๋ช
deltaT
๋ SE(3) ๊ทธ๋ฃน์ ์ํ๋ 4x4 ๋ณํ ํ๋ ฌ๋ก, ํ์ ๊ณผ ์ด๋์ ๊ฒฐํฉํ rigid body transform์ ๋ํ๋
๋๋ค. ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
์ฌ๊ธฐ์ $R$์ 3x3์ ํ์ ํ๋ ฌ๋ก, SO(3) ๊ทธ๋ฃน์ ์ํฉ๋๋ค. ์ด ํ๋ ฌ์ ์์ํ ํ์ ๋ง์ ๋ํ๋ด๋ฉฐ, ์ง๊ต์ฑ๊ณผ ํ๋ ฌ์์ด 1์ด๋ผ๋ ํน์ฑ์ ๊ฐ์ง๋๋ค. $t$๋ 3x1์ ์ด๋ ๋ฒกํฐ๋ก, SE(3) ๊ทธ๋ฃน์ ์ํฉ๋๋ค. ์ด ๋ฒกํฐ๋ ๊ณต๊ฐ์์์ ๊ฐ์ฒด ์์น ๋ณํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ด๋ ์์๋ฅผ ํฌํจํฉ๋๋ค.
์ด ๋ณํ ํ๋ ฌ deltaT
๋ ๊ฐ์๋์ ์ ์๋๋ฅผ ์ด์ฉํ์ฌ ๊ณ์ฐ๋๋ฉฐ, 3D ๊ณต๊ฐ์์ ๊ฐ์ฒด์ ์์น์ ๋ฐฉํฅ์ ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์๋๋ ํ์ ์, ์ ์๋๋ ์ด๋์ ๊ฒฐ์ ํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
Lie Group: Rotation SO(3), Rigid-body SE(3)
Leave a comment