> ## Documentation Index
> Fetch the complete documentation index at: https://docs.generalrobotics.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Utilities

## General

### get\_public\_fields

<ResponseField name="airgen.utils.general.get_public_fields(obj)">
  Get all public fields of an object (not starting with `_`).

  <ResponseField name="Arguments">
    <ResponseField name="obj" type="Object">
      The object to retrieve fields from.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="List[str]" type="List[str]">
      List\[str]
    </ResponseField>
  </ResponseField>
</ResponseField>

### list\_to\_2d\_float\_array

<ResponseField name="airgen.utils.general.list_to_2d_float_array(flst, width, height)">
  Convert a list of floats to a 2D array.

  <ResponseField name="Arguments">
    <ResponseField name="flst" type="List[float]">
      List of float values.
    </ResponseField>

    <ResponseField name="width" type="int">
      The width of the array.
    </ResponseField>

    <ResponseField name="height" type="int">
      The height of the array.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      A NumPy array with `dtype=np.float32` and shape `(height, width)`.
    </ResponseField>
  </ResponseField>
</ResponseField>

### string\_to\_float\_array

<ResponseField name="airgen.utils.general.string_to_float_array(bstr)">
  Convert a string to a float array.

  <ResponseField name="Arguments">
    <ResponseField name="bstr" type="str | bytes">
      The string or bytes to convert.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      np.ndarray
    </ResponseField>
  </ResponseField>
</ResponseField>

### string\_to\_uint8\_array

<ResponseField name="airgen.utils.general.string_to_uint8_array(bstr)">
  Convert a string to a `uint8` array.

  <ResponseField name="Arguments">
    <ResponseField name="bstr" type="str | bytes">
      The string or bytes to convert.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      A NumPy array with `dtype=uint8`.
    </ResponseField>
  </ResponseField>
</ResponseField>

### to\_dict

<ResponseField name="airgen.utils.general.to_dict(obj)">
  Convert an object to a dictionary of its public fields.

  <ResponseField name="Arguments">
    <ResponseField name="obj" type="Object">
      The object to convert.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Dict[str, Any]" type="Dict[str, Any]">
      Dict\[str, Any]
    </ResponseField>
  </ResponseField>
</ResponseField>

### to\_str

<ResponseField name="airgen.utils.general.to_str(obj)">
  Convert an object to a string of its public fields.

  <ResponseField name="Arguments">
    <ResponseField name="obj" type="Object">
      The object to convert.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="str" type="str">
      str
    </ResponseField>
  </ResponseField>
</ResponseField>

### vector3d2list

<ResponseField name="airgen.utils.general.vector3d2list(vector3d)">
  Turn an AirGen [Vector3r](/simulation/airgen/reference/datatypes#vector3r) into a list of three floats.

  <ResponseField name="Arguments">
    <ResponseField name="vector3d" type="Vector3r">
      The 3D vector to convert.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="List[float]" type="List[float]">
      List\[float]
    </ResponseField>
  </ResponseField>
</ResponseField>

### wait\_key

<ResponseField name="airgen.utils.general.wait_key(message=&#x22;&#x22;)">
  Wait for a key press on the console and return it.

  <ResponseField name="Arguments">
    <ResponseField name="message" type="str, optional">
      message to display while waiting.
    </ResponseField>
  </ResponseField>
</ResponseField>

### write\_file

<ResponseField name="airgen.utils.general.write_file(filename, bstr)">
  Write binary data to a file. Used for writing compressed PNG images.

  <ResponseField name="Arguments">
    <ResponseField name="filename" type="str">
      The name of the file.
    </ResponseField>

    <ResponseField name="bstr" type="bytes">
      The binary data to write.
    </ResponseField>
  </ResponseField>
</ResponseField>

## Sensor

### imagetype2request

<ResponseField name="airgen.utils.sensor.imagetype2request(camera_name, image_type)">
  Helper function to create an uncompressed AirGen [ImageRequest](/simulation/airgen/reference/datatypes#imagerequest) for a given image type.

  <ResponseField name="Arguments">
    <ResponseField name="camera_name" type="Literal[&#x22;front_center&#x22;, &#x22;bottom_center&#x22;]">
      The name of the camera.
    </ResponseField>

    <ResponseField name="image_type" type="ImageType">
      The type of image to capture.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    [ImageRequest](/simulation/airgen/reference/datatypes#imagerequest)
  </ResponseField>
</ResponseField>

### responses2images

<ResponseField name="airgen.utils.sensor.responses2images(responses, dtype=None)">
  Convert AirGen image responses to NumPy arrays.

  <ResponseField name="Arguments">
    <ResponseField name="responses" type="List[ImageResponse]">
      The image responses to convert.
    </ResponseField>

    <ResponseField name="dtype" type="Optional[Any]">
      The data type for the resulting NumPy arrays.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Dict[str, np.ndarray]" type="Dict[str, np.ndarray]">
      A dictionary with keys corresponding to camera names and values as the images.

      image:
      For ImageType.Scene, ImageType.DepthVis, ImageType.OpticalFlowVis, image data is RGB image, numpy array with dtype=np.uint8, shape=(height, width, 3)

      For ImageType.DepthPerspective, ImageType.DepthPlanar, ImageType.DisparityNormalized, image data is depth image in meters, numpy array with dtype=np.float32, shape=(height, width, 1)

      For ImageType.Segmentation, image data is array of objects' SegmentationIDs, numpy array with dtype=np.uint8, shape=(height, width, 1)

      For ImageType.SurfaceNormals, image data is array of unit vector (normalized length), numpy array with dtype=np.float32, shape=(height, width, 3)

      For ImageType.OpticalFlow, image data is array of displacements in x,y directions, numpy array with dtype=np.float32, shape=(height, width, 2)

      For ImageType.Infrared, image data is array of infrared values (object's SegmentationID for now), numpy array with dtype=np.uint8, shape=(height, width, 1)

      camera parameters:
      width (int): image width

      height (int): image height

      fov (float): camera field of view in degrees

      camera\_position (List\[float]): camera position (x,y,z) in airgen (NED frame)

      camera\_orientation\_euler\_pry (List\[float]): camera orientation (pitch, roll, yaw) in degrees

      camera\_orientation\_quat\_wxyz (List\[float]): camera orientation (w,x,y,z) in quaternion format
    </ResponseField>
  </ResponseField>
</ResponseField>

## Mechanics

### cameracoord2worldcoord

<ResponseField name="airgen.utils.mechanics.cameracoord2worldcoord(camera_coord, camera_params)">
  Given AirGen camera parameters, transform a camera coordinate back to AirGen world coordinates.

  <ResponseField name="Arguments">
    <ResponseField name="camera_coord" type="List[float]">
      A coordinate `(x, y, z)`.
    </ResponseField>

    <ResponseField name="camera_params" type="dict">
      Camera parameters.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      np.ndarray
    </ResponseField>
  </ResponseField>
</ResponseField>

### homo\_coord\_to\_nonhome\_coord

<ResponseField name="airgen.utils.mechanics.homo_coord_to_nonhome_coord(home_coord)">
  Turn homogeneous coordinates into non-homogeneous coordinates by factoring out the last dimension.

  <ResponseField name="Arguments">
    <ResponseField name="home_coord" type="ivy.Array">
      An array of shape `(..., n)`.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="ivy.Array" type="ivy.Array">
      An array of shape `(..., n-1)`.
    </ResponseField>
  </ResponseField>
</ResponseField>

### imagecoord2direction

<ResponseField name="airgen.utils.mechanics.imagecoord2direction(pixelcoord, camera_param)">
  Given camera parameters (position, pose, and FOV) and pixel coordinates, return the 3D direction of the pixel relative to the camera.

  <ResponseField name="Arguments">
    <ResponseField name="pixelcoord" type="Tuple[float, float]">
      Coordinate of the pixel in the image in `xy` format.
    </ResponseField>

    <ResponseField name="camera_param" type="Dict[str, Any]">
      Camera parameters.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Tuple[float, float, float]" type="Tuple[float, float, float]">
      Normalized unit directional vector `(x, y, z)`.
    </ResponseField>
  </ResponseField>
</ResponseField>

### imagecoord2orientation

<ResponseField name="airgen.utils.mechanics.imagecoord2orientation(pixelcoord, camera_param)">
  Given camera parameters (position, pose, and FOV) and pixel coordinates, return the 3D direction of the pixel relative to the camera, represented in yaw and pitch (absolute degrees).

  <ResponseField name="Arguments">
    <ResponseField name="pixelcoord" type="Tuple[float, float]">
      Coordinate of the pixel in the image in `xy` format.
    </ResponseField>

    <ResponseField name="camera_param" type="Dict[str, Any]">
      Camera parameters.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Tuple[float, float, float]" type="Tuple[float, float, float]">
      Target pitch, roll, yaw in radians.
    </ResponseField>
  </ResponseField>
</ResponseField>

### imagecoord2pose

<ResponseField name="airgen.utils.mechanics.imagecoord2pose(pixelcoord, point_depth, camera_param)">
  Convert pixel coordinates to 3D coordinates.

  <ResponseField name="Arguments">
    <ResponseField name="pixelcoord" type="Tuple[float, float]">
      Coordinate of the pixel in the image in `xy` format.
    </ResponseField>

    <ResponseField name="point_depth" type="float">
      Depth of the point.
    </ResponseField>

    <ResponseField name="camera_param" type="Dict[str, Any]">
      Camera parameters.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Tuple[float, float, float]" type="Tuple[float, float, float]">
      Target coordinate in `(x, y, z)` and orientation `(pitch, roll, yaw)` in radians.
    </ResponseField>
  </ResponseField>
</ResponseField>

### pose2vector

<ResponseField name="airgen.utils.mechanics.pose2vector(pitch, roll, yaw)">
  Transform a target direction represented in `(pitch, roll, yaw)` in radians into a directional vector.

  <ResponseField name="Arguments">
    <ResponseField name="pitch" type="float">
      Pitch angle in radians.
    </ResponseField>

    <ResponseField name="roll" type="float">
      Roll angle in radians.
    </ResponseField>

    <ResponseField name="yaw" type="float">
      Yaw angle in radians.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Tuple[float, float, float]" type="Tuple[float, float, float]">
      Unit directional vector `(x, y, z)`.
    </ResponseField>
  </ResponseField>
</ResponseField>

### quat\_wxyz\_to\_xyzw

<ResponseField name="airgen.utils.mechanics.quat_wxyz_to_xyzw(quat_wxyz)">
  Transform a quaternion (represented by a list of floats) from `wxyz` format to `xyzw` format.

  <ResponseField name="Arguments">
    <ResponseField name="quat_wxyz" type="List[float]">
      A quaternion in `wxyz` format.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      A quaternion in `xyzw` format.
    </ResponseField>
  </ResponseField>
</ResponseField>

### rotate\_xy

<ResponseField name="airgen.utils.mechanics.rotate_xy(vec, theta)">
  Rotate the `xy` component of a 3D vector by `theta` (in degrees) counterclockwise in the `xy` plane.

  Assume the orientation:

  ```
  ^ y
  |
  |
  |______> x
  ```

  <ResponseField name="Arguments">
    <ResponseField name="vec" type="np.ndarray">
      A vector of shape `(3,)`.
    </ResponseField>

    <ResponseField name="theta" type="float">
      Rotation angle in degrees.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      Rotated vector of shape `(3,)`.
    </ResponseField>
  </ResponseField>
</ResponseField>

### to\_eularian\_angles

<ResponseField name="airgen.utils.mechanics.to_eularian_angles(q)">
  Transform a quaternion into Euler angles.

  <ResponseField name="Arguments">
    <ResponseField name="q" type="Quaternionr">
      A quaternion in `wxyz` format.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Tuple[float, float, float]" type="Tuple[float, float, float]">
      Euler angles `(pitch, roll, yaw)` in radians.
    </ResponseField>
  </ResponseField>
</ResponseField>

### vec2eulerangles

<ResponseField name="airgen.utils.mechanics.vec2eulerangles(vec)">
  Transform an AirGen directional vector into Euler angles.

  <ResponseField name="Arguments">
    <ResponseField name="vec" type="np.ndarray">
      A directional vector of shape `(N, 3)`.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      np.ndarray: Euler angles of shape `(N, 3)` where each row is `(pitch, roll, yaw)` in degrees.
    </ResponseField>
  </ResponseField>
</ResponseField>

## Vision

The `vision` subsection of AirGen utilities provides essential functions for handling camera parameters and generating point clouds from depth images.

### build\_camera

<ResponseField name="airgen.utils.vision.build_camera(camera_params)">
  Given AirGen camera parameters, this function builds the inverse extrinsic matrix and the camera intrinsic matrix.

  <ResponseField name="Arguments">
    <ResponseField name="camera_params" type="dict">
      AirGen camera parameters.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="Tuple[ivy.Array, ivy.Array]" type="Tuple[ivy.Array, ivy.Array]">
      Tuple of: `Inverse Extrinsic Matrix`, `Intrinsic Matrix`
    </ResponseField>
  </ResponseField>
</ResponseField>

### build\_camera\_intrinsic

<ResponseField name="airgen.utils.vision.build_camera_intrinsic(camera_params)">
  Constructs the camera intrinsic matrix using AirGen camera parameters.

  <ResponseField name="Arguments">
    <ResponseField name="camera_params" type="dict">
      AirGen camera parameters.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="ivy.Array" type="ivy.Array">
      ivy.Array
    </ResponseField>
  </ResponseField>
</ResponseField>

### build\_camera\_inv\_extrinsic

<ResponseField name="airgen.utils.vision.build_camera_inv_extrinsic(camera_params)">
  Generates the inverse extrinsic matrix for the camera based on its parameters.

  <ResponseField name="Arguments">
    <ResponseField name="camera_params" type="dict">
      AirGen camera parameters.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="ivy.Array" type="ivy.Array">
      `Inverse Extrinsic Matrix`
    </ResponseField>
  </ResponseField>
</ResponseField>

### camera\_unproject\_depth

<ResponseField name="airgen.utils.vision.camera_unproject_depth(depth, cam_inv_ext_mat, cam_inv_calib_mat)">
  Generates a point cloud from a depth image (Depth Perspective).

  <ResponseField name="Arguments">
    <ResponseField name="depth" type="np.ndarray">
      Depth image of shape `(H, W, 1)`.
    </ResponseField>

    <ResponseField name="cam_inv_ext_mat" type="ivy.Array">
      Inverse of camera extrinsic matrix.
    </ResponseField>

    <ResponseField name="cam_inv_calib_mat" type="ivy.Array">
      Inverse of camera intrinsic matrix.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      Point cloud of shape `(N, 3)`.
    </ResponseField>
  </ResponseField>
</ResponseField>

### depth2pointcloud

<ResponseField name="airgen.utils.vision.depth2pointcloud(depth, camera_param, mask=None)">
  Generates a point cloud from a depth image.

  <ResponseField name="Arguments">
    <ResponseField name="depth" type="np.ndarray">
      Depth image of shape `(H, W, 1)`.
    </ResponseField>

    <ResponseField name="camera_param" type="dict">
      Camera parameters containing field of view, height, width, and pose.
    </ResponseField>

    <ResponseField name="mask" type="Optional[np.ndarray]">
      Boolean mask where 1 indicates the object of interest (`H, W, 1`). Defaults to `None`.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    <ResponseField name="np.ndarray" type="np.ndarray">
      Point cloud in AirGen world coordinates of shape `(N, 3)`.
    </ResponseField>
  </ResponseField>
</ResponseField>

## Trajectory

The `trajectory` subsection of AirGen utilities focuses on waypoint-based path planning and trajectory generation.

### Waypoint

<ResponseField name="airgen.utils.trajectory.Waypoint(x, y, z, yaw, time)">
  Stores a waypoint with positional and timing information.

  <ResponseField name="Arguments">
    <ResponseField name="x, y, z">
      Position in the world frame.
    </ResponseField>

    <ResponseField name="yaw">
      Euler angle of the waypoint.
    </ResponseField>

    <ResponseField name="time">
      Time at which the waypoint is to be reached.
    </ResponseField>
  </ResponseField>
</ResponseField>

### calc\_time

<ResponseField name="airgen.utils.trajectory.calc_time(start, end)">
  Calculates a fitting time for the trajectory between two waypoints.

  <ResponseField name="Arguments">
    <ResponseField name="start" type="Waypoint">
      Starting waypoint.
    </ResponseField>

    <ResponseField name="end" type="Waypoint">
      Ending waypoint.
    </ResponseField>
  </ResponseField>
</ResponseField>

### fit\_min\_snap\_trajectory

<ResponseField name="airgen.utils.trajectory.fit_min_snap_trajectory(waypoint_arr, isJoint=True)">
  Starting point for trajectory generation by transforming an array of arrays into an array of waypoints.

  <ResponseField name="Arguments">
    <ResponseField name="waypoint_arr" type="array of arrays">
      Input waypoints.
    </ResponseField>

    <ResponseField name="isJoint" type="bool">
      Indicates whether to calculate joint operations. Defaults to `True`.
    </ResponseField>
  </ResponseField>
</ResponseField>

### joint

<ResponseField name="airgen.utils.trajectory.joint(waypoints)">
  Calculates a trajectory using joint operations.

  <ResponseField name="Arguments">
    <ResponseField name="waypoints" type="array of Waypoints">
      Waypoints to be connected by joint operations.
    </ResponseField>
  </ResponseField>
</ResponseField>

### separate

<ResponseField name="airgen.utils.trajectory.separate(waypoints)">
  Calculates a trajectory using separate operations.

  <ResponseField name="Arguments">
    <ResponseField name="waypoints" type="array of Waypoints">
      Waypoints to be processed individually.
    </ResponseField>
  </ResponseField>

  ## Visualize

  The `visualize` subsection of AirGen utilities provides methods to log camera data and images from AirGen to Rerun for real-time visualization.
</ResponseField>

### rr\_camera\_capture\_logger

<ResponseField name="airgen.utils.visualize.rr_camera_capture_logger(rr_space_view_name)">
  Given a view space name (entity\_path in Rerun), returns a function that logs camera data (pose and capture in AirGen's 3D world coordinate) to that view space.

  <ResponseField name="Arguments">
    <ResponseField name="rr_space_view_name" type="str">
      Name of the view space (entity\_path) in Rerun.
    </ResponseField>
  </ResponseField>

  <ResponseField name="Returns">
    A callable function that logs camera data to the specified view space.
  </ResponseField>

  * Usage:

  ```python theme={null}
  trajectory_logger = rr_camera_capture_logger("airgen_world")
  trajectory_logger(image, camera_params, camera_name)
  ```
</ResponseField>

### rr\_log\_airgen\_image

<ResponseField name="airgen.utils.visualize.rr_log_airgen_image(entity_path, image_type, image, image_name=&#x22;&#x22;)">
  Logs images from AirGen to Rerun.

  <ResponseField name="Arguments">
    <ResponseField name="entity_path" type="str">
      Path to the entity in Rerun.
    </ResponseField>

    <ResponseField name="image_type" type="ImageType">
      Type of image to log.
    </ResponseField>

    <ResponseField name="image" type="np.ndarray">
      Image data.
    </ResponseField>

    <ResponseField name="image_name" type="str, optional">
      Name of the image (default is an empty string).
    </ResponseField>
  </ResponseField>

  <ResponseField name="Raises">
    <ResponseField name="ValueError">
      If `image_type` is not supported.
    </ResponseField>
  </ResponseField>
</ResponseField>
