docstr: Create a new Transform3d representing 3D rotation about an axis
  by an angle.
  
  Assuming a right-hand coordinate system, positive rotation angles result
  in a counter clockwise rotation.
  
  Args:
      angle:
          - A torch tensor of shape (N,)
          - A python scalar
          - A torch scalar
      axis:
          string: one of ["X", "Y", "Z"] indicating the axis about which
          to rotate.
          NOTE: All batch elements are rotated about the same axis.
docstr_tok: ["Create","a","new","Transform3d","representing","3D","rotation","about","an","axis","by","an","angle",".","Assuming","a","right-hand","coordinate","system",",","positive","rotation","angles","result","in","a","counter","clockwise","rotation",".","Args",":","angle",":","-","A","torch","tensor","of","shape","(","N",",",")","-","A","python","scalar","-","A","torch","scalar","axis",":","string",":","one","of","[","``","X","''",",","``","Y","''",",","``","Z","''","]","indicating","the","axis","about","which","to","rotate",".","NOTE",":","All","batch","elements","are","rotated","about","the","same","axis","."]
code: def __init__(
      self,
      angle,
      axis: str = "X",
      degrees: bool = True,
      dtype: torch.dtype = torch.float32,
      device: Optional[Device] = None,
  ) -> None:
      """
      Create a new Transform3d representing 3D rotation about an axis
      by an angle.
  
      Assuming a right-hand coordinate system, positive rotation angles result
      in a counter clockwise rotation.
  
      Args:
          angle:
              - A torch tensor of shape (N,)
              - A python scalar
              - A torch scalar
          axis:
              string: one of ["X", "Y", "Z"] indicating the axis about which
              to rotate.
              NOTE: All batch elements are rotated about the same axis.
      """
      axis = axis.upper()
      if axis not in ["X", "Y", "Z"]:
          msg = "Expected axis to be one of ['X', 'Y', 'Z']; got %s"
          raise ValueError(msg % axis)
      angle = _handle_angle_input(
          angle, dtype, device, "RotateAxisAngle"
      )
      angle = (angle / 180.0 * math.pi) if degrees else angle
      # We assume the points on which this transformation will be applied
      # are row vectors. The rotation matrix returned from _axis_angle_rotation
      # is for transforming column vectors. Therefore we transpose this matrix.
      # R will always be of shape (N, 3, 3)
      R = _axis_angle_rotation(axis, angle).transpose(1, 2)
      super().__init__(device=angle.device, R=R, dtype=dtype)
  
imports: import math
  import os
  import warnings
  from typing import List, Optional, Union
  import torch
  from ..common.datatypes import Device, get_device, make_device
  from ..common.workaround import _safe_det_3x3
  from .rotation_conversions import _axis_angle_rotation
  from .se3 import se3_log_map
label_desc: Use image node_id 1 to create a new RotateAxisAngle object from inherited base classes: Rotate with example: obj = RotateAxisAngle(angle, axis, degrees, dtype, device)