in differentiable_robot_model/se3_so3_util.py [0:0]
def convertAxisAngleToQuaternion(axis_angle, epsilon=1.0e-5):
if not torch.is_tensor(axis_angle):
axis_angle = torch.Tensor(axis_angle)
assert axis_angle.shape[0] == 3
angle = torch.norm(axis_angle)
if angle > epsilon:
axis = axis_angle / angle
quat = axis_angle.new_zeros(4)
quat[:3] = axis * torch.sin(angle / 2.0)
quat[3] = torch.cos(angle / 2.0)
else:
quat = torch.tensor(
[0.0, 0.0, 0.0, 1.0], device=axis_angle.device, dtype=axis_angle.dtype
)
quat = quat / torch.norm(quat)
return quat