in differentiable_robot_model/se3_so3_util.py [0:0]
def logMapSE3(T, epsilon=1.0e-14):
assert T.shape[0] == 4
assert T.shape[1] == 4
assert torch.norm(T[3, :3]) < assert_epsilon
assert torch.abs(T[3, 3] - 1.0) < assert_epsilon
R = T[:3, :3]
omegahat = logMapSO3(R, epsilon)
omega = getVec3FromSkewSymMat(omegahat, epsilon)
norm_omega = torch.norm(omega)
Ainv = (
torch.eye(3, device=T.device, dtype=T.dtype)
- (0.5 * omegahat)
+ (
(
(
(2.0 * torch.sin(norm_omega))
- (norm_omega * (1.0 + torch.cos(norm_omega)))
)
/ ((2 * (norm_omega ** 2) * torch.sin(norm_omega)) + epsilon)
)
* torch.matmul(omegahat, omegahat)
)
)
p = T[:3, 3]
kseehat = T.new_zeros((4, 4))
kseehat[:3, :3] = omegahat
kseehat[:3, 3] = torch.matmul(Ainv, p)
return kseehat