in differentiable_robot_model/se3_so3_util.py [0:0]
def logMapSO3(R, epsilon=1.0e-14):
assert R.shape[0] == 3
assert R.shape[1] == 3
assert (
torch.abs(torch.abs(torch.det(R)) - 1.0) < assert_epsilon
), "det(R) = %f" % torch.det(R)
half_traceR_minus_one = (torch.trace(R) - 1.0) / 2.0
if half_traceR_minus_one < -R.new_ones(1):
print("Warning: half_traceR_minus_one = %f < -1.0" % half_traceR_minus_one)
half_traceR_minus_one = -R.new_ones(1)
if half_traceR_minus_one > 1.0:
print("Warning: half_traceR_minus_one = %f > 1.0" % half_traceR_minus_one)
half_traceR_minus_one = R.new_ones(1)
theta = torch.acos(half_traceR_minus_one)
omegahat = (R - R.T) / ((2.0 * torch.sin(theta)) + epsilon)
return theta * omegahat