in differentiable_robot_model/se3_so3_util.py [0:0]
def convertQuaternionToAxisAngle(quat, alpha=0.05, epsilon=1.0e-15):
if not torch.is_tensor(quat):
quat = torch.Tensor(quat)
assert quat.shape[0] == 4
assert (torch.norm(quat) > 1.0 - alpha) and (torch.norm(quat) < 1.0 + alpha)
quat = quat / torch.norm(quat)
angle = 2.0 * torch.acos(quat[3])
axis = quat[:3] / (torch.sin(angle / 2.0) + epsilon)
axis_angle = axis * angle
return axis_angle