# SPDX-License-Identifier: Apache-2.0
# Copyright © 2025 Au-Zone Technologies. All Rights Reserved.

from dataclasses import dataclass
from enum import Enum

from pycdr2 import IdlStruct
from pycdr2.types import array, float64, sequence, uint8, uint32

from . import default_field
from .builtin_interfaces import Duration, Time
from .geometry_msgs import Point, Pose, Quaternion, Vector3


class FieldDatatype(Enum):
    UNKNOWN = 0
    UINT8 = 1
    INT8 = 2
    UINT16 = 3
    INT16 = 4
    UINT32 = 5
    INT32 = 6
    FLOAT32 = 7
    FLOAT64 = 8


@dataclass
class PackedElementField(IdlStruct, typename='foxglove_msgs/PackedElementField'):
    """
    foxglove_msgs/msg/PackedElementField
    A field present within each element in a byte array of packed elements.

    Generated by https://github.com/foxglove/schemas
    """
    name: str = ''
    """
    Name of the field
    """

    offset: uint32 = 0
    """
    Byte offset from start of data buffer
    """

    type: uint8 = 0
    """
    Type of data in the field. Integers are stored using little-endian byte order.
    """


@dataclass
class Vector2(IdlStruct, typename='foxglove_msgs/Vector2'):
    """
    foxglove_msgs/msg/Vector2
    A vector in 2D space that represents a direction only

    Generated by https://github.com/foxglove/schemas
    """
    x: float64 = 0
    """
    x coordinate length
    """

    y: float64 = 0
    """
    y coordinate length
    """


@dataclass
class Color(IdlStruct, typename='foxglove_msgs/Color'):
    """
    foxglove_msgs/msg/Color
    A color in RGBA format

    Generated by https://github.com/foxglove/schemas
    """
    r: float64 = 0
    """
    Red value between 0 and 1
    """
    g: float64 = 0
    """
    Green value between 0 and 1
    """
    b: float64 = 0
    """
    Blue value between 0 and 1
    """
    a: float64 = 0
    """
    Alpha value between 0 and 1
    """


@dataclass
class Point2(IdlStruct, typename='foxglove_msgs/Point2'):
    """
    foxglove_msgs/msg/Point2
    A point representing a position in 2D space

    Generated by https://github.com/foxglove/schemas
    """
    x: float64 = 0
    """
    x coordinate position
    """
    y: float64 = 0
    """
    y coordinate position
    """


@dataclass
class KeyValuePair(IdlStruct, typename='foxglove_msgs/KeyValuePair'):
    """
    foxglove_msgs/msg/KeyValuePair
    A key with its associated value

     Generated by https://github.com/foxglove/schemas"""
    key: str = ''
    """
    Key
    """
    value: str = ''
    """
    Value
    """


@dataclass
class ArrowMarker(IdlStruct, typename='foxglove_msgs/ArrowMarker'):
    """
    foxglove_msgs/msg/ArrowMarker
    A marker representing an arrow

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the arrow's tail and orientation of the arrow. Identity orientation means the arrow points in the +x direction.
    """

    length: float64 = 0
    """
    Length of the arrow
    """
    shaft_diameter: float64 = 0
    """
    Diameter of the arrow shaft
    """
    head_diameter: float64 = 0
    """
    Diameter of the arrow head
    """
    head_length: float64 = 0
    """
    Length of the arrow head
    """
    color: Color = default_field(Color)
    """
    Color of the arrow
    """


@dataclass
class ArrowPrimitive(IdlStruct, typename='foxglove_msgs/ArrowPrimitive'):
    """
    foxglove_msgs/msg/ArrowPrimitive
    A primitive representing an arrow

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the arrow's tail and orientation of the arrow. Identity orientation means the arrow points in the +x direction.
    """
    shaft_length: float64 = 0
    """
    Length of the arrow shaft
    """
    shaft_diameter: float64 = 0
    """
    Diameter of the arrow shaft
    """
    head_length: float64 = 0
    """
    Length of the arrow head
    """
    head_diameter: float64 = 0
    """
    Diameter of the arrow head
    """
    color: Color = default_field(Color)
    """
    Color of the arrow
    """


@dataclass
class CameraCalibration(IdlStruct, typename='foxglove_msgs/CameraCalibration'):
    """
    foxglove_msgs/msg/CameraCalibration
    Camera calibration parameters

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of calibration data
    """
    frame_id: str = ''
    """
    Frame of reference for the camera. The origin of the frame is the optical center of the camera. 
    +x points to the right in the image, +y points down, and +z points into the plane of the image.
    """
    width: uint32 = 0
    """
    Image width
    """
    height: uint32 = 0
    """
    Image height
    """

    distortion_model: str = ''
    """
    Name of distortion model
     
    Supported parameters: `plumb_bob` (k1, k2, p1, p2, k3) and `rational_polynomial` (k1, k2, p1, p2, k3, k4, k5, k6). 
    Distortion models are based on [OpenCV's](https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html) [pinhole camera model](https://en.wikipedia.org/wiki/Distortion_%28optics%29#Software_correction). 
    This is the same [implementation used by ROS](http://docs.ros.org/en/diamondback/api/image_geometry/html/c++/pinhole__camera__model_8cpp_source.html)
    """

    d: sequence[float64] = default_field([])
    """
    Distortion parameters
    """

    k: array[float64, 9] = default_field([0] * 9)
    """
    Intrinsic camera matrix (3x3 row-major matrix)
    
    A 3x3 row-major matrix for the raw (distorted) image.
    
    Projects 3D points in the camera coordinate frame to 2D pixel coordinates using the focal lengths (fx, fy) and principal point (cx, cy).
     
    ```
        [fx  0 cx]
    K = [ 0 fy cy]
        [ 0  0  1]
    ```
    """

    r: array[float64, 9] = default_field([0] * 9)
    """
    Rectification matrix (stereo cameras only, 3x3 row-major matrix)
     
    A rotation matrix aligning the camera coordinate system to the ideal stereo image plane so that epipolar lines in both stereo images are parallel.
    """

    p: array[float64, 12] = default_field([0] * 12)
    """
    Projection/camera matrix (3x4 row-major matrix)
    
    ```
        [fx'  0  cx' Tx]
    P = [ 0  fy' cy' Ty]
        [ 0   0   1   0]
    ```
    
    By convention, this matrix specifies the intrinsic (camera) matrix of the processed (rectified) image. That is, the left 3x3 portion is the normal camera intrinsic matrix for the rectified image.
     
    It projects 3D points in the camera coordinate frame to 2D pixel coordinates using the focal lengths (fx', fy') and principal point (cx', cy') - these may differ from the values in K.
     
    For monocular cameras, Tx = Ty = 0. Normally, monocular cameras will also have R = the identity and P[1:3,1:3] = K.
     
    For a stereo pair, the fourth column [Tx Ty 0]' is related to the position of the optical center of the second camera in the first camera's frame. We assume Tz = 0 so both cameras are in the same stereo image plane. The first camera always has Tx = Ty = 0. For the right (second) camera of a horizontal stereo pair, Ty = 0 and Tx = -fx' * B, where B is the baseline between the cameras.
    
    Given a 3D point [X Y Z]', the projection (x, y) of the point onto the rectified image is given by:
    
    ```
    [u v w]' = P * [X Y Z 1]'
           x = u / w
           y = v / w
    ```
    
    This holds for both images of a stereo pair.
    """


@dataclass
class CircleAnnotation(IdlStruct, typename='foxglove_msgs/CircleAnnotation'):
    """
    foxglove_msgs/msg/CircleAnnotation
    A circle annotation on a 2D image

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of circle
    """
    position: Point2 = default_field(Point2)
    """
    Center of the circle in 2D image coordinates (pixels)
    """

    diameter: float64 = 0
    """
    Circle diameter in pixels
    """
    thickness: float64 = 0
    """
    Line thickness in pixels
    """
    fill_color: Color = default_field(Color)
    """
    Fill color
    """
    outline_color: Color = default_field(Color)
    """
    Outline color
    """


@dataclass
class CompressedImage(IdlStruct, typename='foxglove_msgs/CompressedImage'):
    """
    foxglove_msgs/msg/CompressedImage
    A compressed image

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of image
    """
    frame_id: str = ''
    """
    Frame of reference for the image. The origin of the frame is the optical center of the camera. +x points to the right in the image, +y points down, and +z points into the plane of the image.
    """

    data: sequence[uint8] = default_field([])
    """
    Compressed image data
    """

    format: str = ''
    """
    Image format
    
    Supported values: image media types supported by Chrome, such as `webp`, `jpeg`, `png`
    """


@dataclass
class CompressedVideo(IdlStruct, typename='foxglove_msgs/CompressedVideo'):
    """
    foxglove_msgs/msg/CompressedVideo
    A single frame of a compressed video bitstream

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of video frame
    """

    frame_id: str = ''
    """
    Frame of reference for the video.
    
    The origin of the frame is the optical center of the camera. +x points to the right in the video, +y points down, and +z points into the plane of the video.
    """

    data: sequence[uint8] = default_field([])
    """
    Compressed video frame data.
    
    For packet-based video codecs this data must begin and end on packet boundaries (no partial packets), and must contain enough video packets to decode exactly one image (either a keyframe or delta frame). Note: Foxglove does not support video streams that include B frames because they require lookahead.
    """

    format: str = ''
    """
    Video format.
    
    Supported values: `h264` (Annex B formatted data only)
    """


@dataclass
class ConeAttributes(IdlStruct, typename='foxglove_msgs/ConeAttribute'):
    """
    foxglove_msgs/msg/ConeAttributes
    Data specifying the visual appearance of a possibly truncated, possibly elliptic cone or cylinder

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the cone and orientation of the cone. The flat face(s) are perpendicular to the z-axis.
    """
    size: Vector3 = default_field(Vector3)
    """
    Size of the cone's bounding box
    """
    bottom_scale: float64 = 0
    """
    0-1, size of the cone's bottom face (min z) relative to the bottom of the bounding box
    """
    top_scale: float64 = 0
    """
    0-1, size of the cone's top face (max z) relative to the top of the bounding box
    """
    color: Color = default_field(Color)
    """
    Color of the cone
    """


@dataclass
class ConeListMarker(IdlStruct, typename='foxglove_msgs/ConeListMarker'):
    """
    foxglove_msgs/msg/ConeListMarker
    A marker representing a list of possibly truncated, possibly elliptic cones or cylinders

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the marker
    """
    frame_id: str = ''
    """
    Frame of reference
    """
    id: str = ''
    """
    Identifier for the marker. A marker will replace any prior marker on the same topic with the same `id`.
    """
    lifetime: Duration = default_field(Duration)
    """
    Length of time (relative to `timestamp`) after which the marker should be automatically removed. Zero value indicates the marker should remain visible until it is replaced or deleted.
    """
    frame_locked: bool = False
    """
    Whether the marker should keep its location in the fixed frame (false) or follow the frame specified in `frame_id` as it moves relative to the fixed frame (true)
    """
    metadata: sequence[KeyValuePair] = default_field([])
    """
    Additional user-provided metadata associated with the marker. Keys must be unique.
    """
    attributes: sequence[ConeAttributes] = default_field([])
    """
    Attributes of each cone
    """


@dataclass
class ConeMarker(IdlStruct, typename='foxglove_msgs/ConeMarker'):
    """
    foxglove_msgs/msg/ConeMarker
    A marker representing a possibly truncated, possibly elliptic cone or cylinder

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the cone and orientation of the cone. The flat face(s) are perpendicular to the z-axis.
    """
    size: Vector3 = default_field(Vector3)
    """
    Size of the cone's bounding box
    """
    bottom_scale: float64 = 0
    """
    0-1, size of the cone's bottom face (min z) relative to the bottom of the bounding box
    """
    top_scale: float64 = 0
    """
    0-1, size of the cone's top face (max z) relative to the top of the bounding box
    """
    color: Color = default_field(Color)
    """
    Color of the cone
    """


@dataclass
class ConePrimitive(IdlStruct, typename='foxglove_msgs/ConePrimitive'):
    """
    foxglove_msgs/msg/ConePrimitive
    A primitive representing a possibly truncated, possibly elliptic cone or cylinder

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the cone and orientation of the cone. The flat face(s) are perpendicular to the z-axis.
    """
    size: Vector3 = default_field(Vector3)
    """
    Size of the cone's bounding box
    """
    bottom_scale: float64 = 0
    """
    0-1, size of the cone's bottom face (min z) relative to the bottom of the bounding box
    """
    top_scale: float64 = 0
    """
    0-1, size of the cone's top face (max z) relative to the top of the bounding box
    """
    color: Color = default_field(Color)
    """
    Color of the cone
    """


@dataclass
class CubeAttributes(IdlStruct, typename='foxglove_msgs/CubeAttributes'):
    """
    foxglove_msgs/msg/CubeAttributes
    Data specifying the visual appearance of a cube or rectangular prism

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the cube and orientation of the cube
    """
    size: Vector3 = default_field(Vector3)
    """
    Size of the cube along each axis
    """
    color: Color = default_field(Color)
    """
    Color of the arrow
    """


@dataclass
class CubeListMarker(IdlStruct, typename='foxglove_msgs/CubeListMarker'):
    """
    foxglove_msgs/msg/CubeListMarker
    A marker representing a list of cubes or rectangular prisms

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the marker
    """
    frame_id: str = ''
    """
    Frame of reference
    """
    id: str = ''
    """
    Identifier for the marker. A marker will replace any prior marker on the same topic with the same `id`.
    """
    lifetime: Duration = default_field(Duration)
    """
    Length of time (relative to `timestamp`) after which the marker should be automatically removed. Zero value indicates the marker should remain visible until it is replaced or deleted.
    """
    frame_locked: bool = False
    """
    Whether the marker should keep its location in the fixed frame (false) or follow the frame specified in `frame_id` as it moves relative to the fixed frame (true)
    """
    metadata: sequence[KeyValuePair] = default_field([])
    """
    Additional user-provided metadata associated with the marker. Keys must be unique.
    """
    attributes: sequence[CubeAttributes] = default_field([])
    """
    Attributes of each cube
    """


@dataclass
class CubeMarker(IdlStruct, typename='foxglove_msgs/CubeMarker'):
    """
    foxglove_msgs/msg/CubeMarker
    A marker representing a cube or rectangular prism

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the cube and orientation of the cube
    """
    size: Vector3 = default_field(Vector3)
    """
    Size of the cube along each axis
    """
    color: Color = default_field(Color)
    """
    Color of the arrow
    """


@dataclass
class CubePrimitive(IdlStruct, typename='foxglove_msgs/CubePrimitive'):
    """
    foxglove_msgs/msg/CubePrimitive
    A primitive representing a cube or rectangular prism

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the cube and orientation of the cube
    """
    size: Vector3 = default_field(Vector3)
    """
    Size of the cube along each axis
    """
    color: Color = default_field(Color)
    """
    Color of the cube
    """


@dataclass
class CylinderMarker(IdlStruct, typename='foxglove_msgs/CylinderMarker'):
    """
    foxglove_msgs/msg/CylinderMarker
    A marker representing a cylinder or elliptic cylinder

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the marker
    """

    frame_id: str = ''
    """
    Frame of reference
    """

    id: str = ''
    """
    Identifier for the marker. A marker will replace any prior marker on the same topic with the same `id`.
    """

    lifetime: Duration = default_field(Duration)
    """
    Length of time (relative to `timestamp`) after which the marker should be automatically removed. Zero value indicates the marker should remain visible until it is replaced or deleted.
    """

    frame_locked: bool = False
    """
    Whether the marker should keep its location in the fixed frame (false) or follow the frame specified in `frame_id` as it moves relative to the fixed frame (true)
    """

    metadata: sequence[KeyValuePair] = default_field([])
    """
    Additional user-provided metadata associated with the marker. Keys must be unique.
    """

    pose: Pose = default_field(Pose)
    """
    Position of the center of the cylinder and orientation of the cylinder. The cylinder's flat faces are perpendicular to the z-axis.
    """

    bottom_radius: float64 = 0
    """
    Radius of the cylinder at min z
    """

    top_radius: float64 = 0
    """
    Radius of the cylinder at max z
    """

    height: float64 = 0
    """
    Height of the cylinder along the z axis
    """

    color: Color = default_field(Color)
    """
    Color of the sphere
    """


@dataclass
class CylinderPrimitive(IdlStruct, typename='foxglove_msgs/CylinderPrimitive'):
    """
    foxglove_msgs/msg/CylinderPrimitive
    A primitive representing a cylinder, elliptic cylinder, or truncated cone

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the cylinder and orientation of the cylinder. The flat face(s) are perpendicular to the z-axis.
    """

    size: Vector3 = default_field(Vector3)
    """
    Size of the cylinder's bounding box
    """

    bottom_scale: float64 = 0
    """
    0-1, ratio of the diameter of the cylinder's bottom face (min z) to the bottom of the bounding box
    """

    top_scale: float64 = 0
    """
    0-1, ratio of the diameter of the cylinder's top face (max z) to the top of the bounding box
    """

    color: Color = default_field(Color)
    """
    Color of the cylinder
    """


@dataclass
class FrameTransform(IdlStruct, typename='foxglove_msgs/FrameTransform'):
    """
    foxglove_msgs/msg/FrameTransform
    A transform between two reference frames in 3D space

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of transform
    """

    parent_frame_id: str = ''
    """
    Name of the parent frame
    """

    child_frame_id: str = ''
    """
    Name of the child frame
    """

    translation: Vector3 = default_field(Vector3)
    """
    Translation component of the transform
    """

    rotation: Quaternion = default_field(Quaternion)
    """
    Rotation component of the transform
    """


@dataclass
class FrameTransformList(IdlStruct, typename='foxglove_msgs/FrameTransformList'):
    """
    foxglove_msgs/msg/FrameTransformList
    A list of transforms between reference frames in 3D space

    Generated by https://github.com/foxglove/schemas
    """
    transforms: sequence[FrameTransform] = default_field([])
    """
    List of transforms
    """


@dataclass
class FrameTransforms(IdlStruct, typename='foxglove_msgs/FrameTransforms'):
    """
    foxglove_msgs/msg/FrameTransforms
    An array of FrameTransform messages

    Generated by https://github.com/foxglove/schemas
    """
    transforms: sequence[FrameTransform] = default_field([])
    """
    Array of transforms
    """


@dataclass
class GeoJSON(IdlStruct, typename='foxglove_msgs/GeoJSON'):
    """
    foxglove_msgs/msg/GeoJSON
    GeoJSON data for annotating maps

    Generated by https://github.com/foxglove/schemas
    """
    geojson: str = ''
    """
    GeoJSON data encoded as a UTF-8 string
    """


@dataclass
class Grid(IdlStruct, typename='foxglove_msgs/Grid'):
    """
    foxglove_msgs/msg/Grid
    A 2D grid of data

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of grid
    """

    frame_id: str = ''
    """
    Frame of reference
    """

    pose: Pose = default_field(Pose)
    """
    Origin of grid's corner relative to frame of reference; grid is positioned in the x-y plane relative to this origin
    """

    column_count: uint32 = 0
    """
    Number of grid columns
    """

    cell_size: Vector2 = default_field(Vector2)
    """
    Size of single grid cell along x and y axes, relative to `pose`
    """

    row_stride: uint32 = 0
    """
    Number of bytes between rows in `data`
    """

    cell_stride: uint32 = 0
    """
    Number of bytes between cells within a row in `data`
    """

    fields: sequence[PackedElementField] = default_field([])
    """
    Fields in `data`. `red`, `green`, `blue`, and `alpha` are optional for customizing the grid's color.
    """

    data: uint8 = 0
    """
    Grid cell data, interpreted using `fields`, in row-major (y-major) order
    """


class PointType(Enum):
    UNKNOWN = 0
    POINTS = 1
    """
    Individual points: 0, 1, 2, ...
    """
    LINE_LOOP = 2
    """
    Closed polygon: 0-1, 1-2, ..., (n-1)-n, n-0
    """
    LINE_STRIP = 3
    """
    Connected line segments: 0-1, 1-2, ..., (n-1)-n
    """
    LINE_LIST = 4
    """
    Individual line segments: 0-1, 2-3, 4-5, ...
    """


@dataclass
class PointsAnnotation(IdlStruct, typename='foxglove_msgs/PointsAnnotation'):
    """
    foxglove_msgs/msg/PointsAnnotation
    An array of points on a 2D image

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of annotation
    """

    type: uint8 = 0
    """
    Type of points annotation to draw
    """

    points: sequence[Point2] = default_field([])
    """
    Points in 2D image coordinates (pixels)
    """

    outline_color: Color = default_field(Color)
    """
    Outline color
    """

    outline_colors: sequence[Color] = default_field([])
    """
    Per-point colors, if `type` is `POINTS`, or per-segment stroke colors, if `type` is `LINE_LIST`, `LINE_STRIP` or `LINE_LOOP`.
    """

    fill_color: Color = default_field(Color)
    """
    Fill color
    """

    thickness: float64 = 0
    """
    Stroke thickness in pixels
    """


@dataclass
class TextAnnotation(IdlStruct, typename='foxglove_msgs/TextAnnotation'):
    """
    foxglove_msgs/msg/TextAnnotation
    A text label on a 2D image

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of annotation
    """

    position: Point2 = default_field(Point2)
    """
    Bottom-left origin of the text label in 2D image coordinates (pixels)
    """

    text: str = ''
    """
    Text to display
    """

    font_size: float64 = 0
    """
    Font size in pixels
    """

    text_color: Color = default_field(Color)
    """
    Text color
    """

    background_color: Color = default_field(Color)
    """
    Background fill color
    """


@dataclass
class ImageAnnotations(IdlStruct, typename='foxglove_msgs/ImageAnnotations'):
    """
    foxglove_msgs/msg/ImageAnnotations
    Array of annotations for a 2D image

    Generated by https://github.com/foxglove/schemas
    """
    circles: sequence[CircleAnnotation] = default_field([])
    """
    Circle annotations
    """

    points: sequence[PointsAnnotation] = default_field([])
    """
    Points annotations
    """

    texts: sequence[TextAnnotation] = default_field([])
    """
    Text annotations
    """


@dataclass
class LaserScan(IdlStruct, typename='foxglove_msgs/LaserScan'):
    """
    foxglove_msgs/msg/LaserScan
    A single scan from a planar laser range-finder

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of scan
    """

    frame_id: str = ''
    """
    Frame of reference
    """

    pose: Pose = default_field(Pose)
    """
    Origin of scan relative to frame of reference; points are positioned in the x-y plane relative to this origin; angles are interpreted as counterclockwise rotations around the z axis with 0 rad being in the +x direction
    """

    start_angle: float64 = 0
    """
    Origin of scan relative to frame of reference; points are positioned in the x-y plane relative to this origin; angles are interpreted as counterclockwise rotations around the z axis with 0 rad being in the +x direction
    """

    end_angle: float64 = 0
    """
    Bearing of last point, in radians
    """

    ranges: sequence[float64] = default_field([])
    """
    Distance of detections from origin; assumed to be at equally-spaced angles between `start_angle` and `end_angle`
    """

    intensities: sequence[float64] = default_field([])
    """
    Intensity of detections
    """


class LinePrimitive(Enum):
    # 0-1, 1-2, ..., (n-1)-n
    LINE_STRIP = 0
    # 0-1, 1-2, ..., (n-1)-n, n-0
    LINE_LOOP = 1
    # 0-1, 2-3, 4-5, ...
    LINE_LIST = 2


@dataclass
class LineMarker(IdlStruct, typename='foxglove_msgs/LineMarker'):
    """
    foxglove_msgs/msg/LineMarker
    A marker representing a series of points connected by lines

    Generated by https://github.com/foxglove/schemas
    """
    type: uint8 = 0
    """
    Drawing primitive to use for lines
    """

    pose: Pose = default_field(Pose)
    """
    Origin of lines relative to reference frame
    """

    thickness: float64 = 0
    """
    Line thickness
    """

    scale_invariant: bool = False
    """
    Indicates whether `thickness` is a fixed size in screen pixels (true), or specified in world coordinates and scales with distance from the camera (false)
    """

    points: sequence[Point] = default_field([])
    """
    Points along the line
    """

    color: Color = default_field(Color)
    """
    Solid color to use for the whole line. One of `color` or `colors` must be provided.
    """

    colors: sequence[Color] = default_field([])
    """
    Per-point colors (if specified, must have the same length as `points`). One of `color` or `colors` must be provided.
    """

    indices: sequence[uint32] = default_field([])
    """
    Indices into the `points` and `colors` attribute arrays, which can be used to avoid duplicating attribute data.
     
    If omitted or empty, indexing will not be used. This default behavior is equivalent to specifying [0, 1, ..., N-1] for the indices (where N is the number of `points` provided).
    """


class LinePrimitiveType(Enum):
    LINE_STRIP = 0
    """
    Connected line segments: 0-1, 1-2, ..., (n-1)-n
    """
    LINE_LOOP = 1
    """
    Closed polygon: 0-1, 1-2, ..., (n-1)-n, n-0
    """
    LINE_LIST = 2
    """
    Individual line segments: 0-1, 2-3, 4-5, ...
    """


@dataclass
class LinePrimitive(IdlStruct, typename='foxglove_msgs/LinePrimitive'):
    """
    foxglove_msgs/msg/LinePrimitive
    A primitive representing a series of points connected by lines

    Generated by https://github.com/foxglove/schemas
    """
    type: uint8 = 0
    """
    Drawing primitive to use for lines
    """

    pose: Pose = default_field(Pose)
    """
    Origin of lines relative to reference frame
    """

    thickness: float64 = 0
    """
    Line thickness
    """

    scale_invariant: bool = False
    """
    Indicates whether `thickness` is a fixed size in screen pixels (true), or specified in world coordinates and scales with distance from the camera (false)
    """

    points: sequence[Point] = default_field([])
    """
    Points along the line
    """

    color: Color = default_field(Color)
    """
    Solid color to use for the whole line. One of `color` or `colors` must be provided.
    """

    colors: sequence[Color] = default_field([])
    """
    Per-point colors (if specified, must have the same length as `points`). One of `color` or `colors` must be provided.
    """

    indices: sequence[uint32] = default_field([])
    """
    Indices into the `points` and `colors` attribute arrays, which can be used to avoid duplicating attribute data.
    
    If omitted or empty, indexing will not be used. This default behavior is equivalent to specifying [0, 1, ..., N-1] for the indices (where N is the number of `points` provided).
    """


class PositionCovarianceType(Enum):
    UNKNOWN = 0
    APPROXIMATED = 1
    DIAGONAL_KNOWN = 2
    KNOWN = 3


@dataclass
class LocationFix(IdlStruct, typename='foxglove_msgs/LocationFix'):
    """
    foxglove_msgs/msg/LocationFix
    A navigation satellite fix for any Global Navigation Satellite System

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the message
    """

    frame_id: str = ''
    """
    Frame for the sensor. Latitude and longitude readings are at the origin of the frame.
    """

    latitude: float64 = 0
    """
    Latitude in degrees
    """

    longitude: float64 = 0
    """
    Longitude in degrees
    """

    altitude: float64 = 0
    """
    Altitude in meters
    """

    position_covariance: array[float64, 9] = default_field([0] * 9)
    """
    Position covariance (m^2) defined relative to a tangential plane through the reported position. The components are East, North, and Up (ENU), in row-major order.
    """

    position_covariance_type: uint8 = 0
    """
    If `position_covariance` is available, `position_covariance_type` must be set to indicate the type of covariance.
    """


class LogLevel(Enum):
    UNKNOWN = 0
    DEBUG = 1
    INFO = 2
    WARNING = 3
    ERROR = 4
    FATAL = 5


@dataclass
class Log(IdlStruct, typename='foxglove_msgs/Log'):
    """
    foxglove_msgs/msg/Log
    A log message

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of log message
    """

    level: uint8 = 0
    """
    Log level
    """

    message: str = ''
    """
    Log message
    """

    name: str = ''
    """
    Process or node name
    """

    file: str = ''
    """
    Filename
    """

    line: uint32 = 0
    """
    Line number in the file
    """


class DeleteType(Enum):
    MATCHING_ID = 0
    ALL = 1


@dataclass
class MarkerDeletion(IdlStruct, typename='foxglove_msgs/MarkerDeletion'):
    """
    foxglove_msgs/msg/MarkerDeletion
    Command to remove previously published markers

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the marker. Only matching markers earlier than this timestamp will be deleted.
    """

    type: uint8 = 0
    """
    Type of deletion action to perform
    """

    id: str = ''
    """
    Numeric identifier which must match if `kind` is `MATCHING_ID`.
    """


@dataclass
class ModelMarker(IdlStruct, typename='foxglove_msgs/ModelMarker'):
    """
    foxglove_msgs/msg/ModelMarker
    A marker representing a 3D model

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Origin of model relative to reference frame
    """

    scale: Vector3 = default_field(Vector3)
    """
    Scale factor to apply to the model along each axis
    """

    color: Color = default_field(Color)
    """
    Solid color to use for the whole model. If `use_embedded_materials` is true, this color is blended on top of the embedded material color.
    """

    use_embedded_materials: bool = False
    """
    Whether to use materials embedded in the model, or only the `color`
    """

    url: str = ''
    """
    URL pointing to model file. Either `url` or `mime_type` and `data` should be provided.
    """

    mime_type: str = ''
    """
    MIME type of embedded model (e.g. `model/gltf-binary`). Either `url` or `mime_type` and `data` should be provided.
    """

    data: sequence[uint8] = default_field([])
    """
    Embedded model. Either `url` or `mime_type` and `data` should be provided.
    """


@dataclass
class SphereAttributes(IdlStruct, typename='foxglove_msgs/SphereAttributes'):
    """
    foxglove_msgs/msg/SphereAttributes
    Data specifying the visual appearance of a sphere or ellipsoid

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the sphere and orientation of the sphere
    """

    size: Vector3 = default_field(Vector3)
    """
    Size (diameter) of the sphere along each axis
    """

    color: Color = default_field(Color)
    """
    Color of the sphere
    """


@dataclass
class SphereListMarker(IdlStruct, typename='foxglove_msgs/SphereListMarker'):
    """
    foxglove_msgs/msg/SphereListMarker
    A marker representing a list of spheres or ellipsoids

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the marker
    """

    frame_id: str = ''
    """
    Frame of reference
    """

    id: str = ''
    """
    Identifier for the marker. A marker will replace any prior marker on the same topic with the same `id`.
    """

    lifetime: Duration = default_field(Duration)
    """
    Length of time (relative to `timestamp`) after which the marker should be automatically removed. Zero value indicates the marker should remain visible until it is replaced or deleted.
    """

    frame_locked: bool = False
    """
    Whether the marker should keep its location in the fixed frame (false) or follow the frame specified in `frame_id` as it moves relative to the fixed frame (true)
    """

    metadata: sequence[KeyValuePair] = default_field([])
    """
    Additional user-provided metadata associated with the marker. Keys must be unique.
    """

    attributes: sequence[SphereAttributes] = default_field([])
    """
    Attributes of each sphere
    """


@dataclass
class TextMarker(IdlStruct, typename='foxglove_msgs/TextMarker'):
    """
    foxglove_msgs/msg/TextMarker
    A marker representing a text label

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the text box and orientation of the text. Identity orientation means the text is oriented in the xy-plane and flows from -x to +x.
    """

    billboard: bool = False
    """
    Whether the text should respect `pose.orientation` (false) or always face the camera (true)
    """

    font_size: float64 = 0
    """
    Font size (height of one line of text)
    """

    scale_invariant: bool = False
    """
    Indicates whether `font_size` is a fixed size in screen pixels (true), or specified in world coordinates and scales with distance from the camera (false)
    """

    color: Color = default_field(Color)
    """
    Color of the text
    """

    text: str = ''
    """
    Text
    """


@dataclass
class TriangleListMarker(IdlStruct, typename='foxglove_msgs/TriangleListMarker'):
    """
    foxglove_msgs/msg/TriangleListMarker
    A marker representing a set of triangles or a surface tiled by triangles

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Origin of triangles relative to reference frame
    """

    points: sequence[Point] = default_field([])
    """
    Vertices to use for triangles, interpreted as a list of triples (0-1-2, 3-4-5, ...)
    """

    color: Color = default_field(Color)
    """
    Solid color to use for the whole shape. One of `color` or `colors` must be provided.
    """

    colors: sequence[Color] = default_field([])
    """
    Per-vertex colors (if specified, must have the same length as `points`). One of `color` or `colors` must be provided.
    """

    indices: sequence[uint32] = default_field([])
    """
    Indices into the `points` and `colors` attribute arrays, which can be used to avoid duplicating attribute data.
    
    If omitted or empty, indexing will not be used. This default behavior is equivalent to specifying [0, 1, ..., N-1] for the indices (where N is the number of `points` provided).
    """


@dataclass
class Markers(IdlStruct, typename='foxglove_msgs/Markers'):
    """
    foxglove_msgs/msg/Markers
    A list of any number or type of markers

    Generated by https://github.com/foxglove/schemas
    """
    deletions: sequence[MarkerDeletion] = default_field([])
    """
    Marker deletion actions
    """

    arrows: sequence[ArrowMarker] = default_field([])
    """
    Arrow markers
    """

    cubes: sequence[CubeListMarker] = default_field([])
    """
    Cube list markers
    """

    spheres: sequence[SphereListMarker] = default_field([])
    """
    Sphere list markers
    """

    cones: sequence[ConeListMarker] = default_field([])
    """
    Cone list markers
    """

    lines: sequence[LineMarker] = default_field([])
    """
    Line markers
    """

    triangles: sequence[TriangleListMarker] = default_field([])
    """
    Triangle list markers
    """

    texts: sequence[TextMarker] = default_field([])
    """
    Text markers
    """

    models: sequence[ModelMarker] = default_field([])
    """
    Model markers
    """


@dataclass
class ModelPrimitive(IdlStruct, typename='foxglove_msgs/ModelPrimitive'):
    """
    foxglove_msgs/msg/ModelPrimitive
    A primitive representing a 3D model file loaded from an external URL or embedded data

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Origin of model relative to reference frame
    """

    scale: Vector3 = default_field(Vector3)
    """
    Scale factor to apply to the model along each axis
    """

    color: Color = default_field(Color)
    """
    Solid color to use for the whole model if `override_color` is true.
    """

    override_color: bool = False
    """
    Whether to use the color specified in `color` instead of any materials embedded in the original model.
    """

    url: str = ''
    """
    URL pointing to model file. One of `url` or `data` should be provided.
    """

    media_type: str = ''
    """
    [Media type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of embedded model (e.g. `model/gltf-binary`). Required if `data` is provided instead of `url`. Overrides the inferred media type if `url` is provided.
    """

    data: sequence[uint8] = default_field([])
    """
    Embedded model. One of `url` or `data` should be provided. If `data` is provided, `media_type` must be set to indicate the type of the data.
    """


@dataclass
class PointCloud(IdlStruct, typename='foxglove_msgs/PointCloud'):
    """
    foxglove_msgs/msg/PointCloud
    A collection of N-dimensional points, which may contain additional fields with information like normals, intensity, etc.

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of point cloud
    """

    frame_id: str = ''
    """
    Frame of reference
    """

    pose: Pose = default_field(Pose)
    """
    The origin of the point cloud relative to the frame of reference
    """

    point_stride: uint32 = 0
    """
    Number of bytes between points in the `data`
    """

    fields: sequence[PackedElementField] = default_field([])
    """
    Fields in `data`. At least 2 coordinate fields from `x`, `y`, and `z` are required for each point's position; `red`, `green`, `blue`, and `alpha` are optional for customizing each point's color.
    """

    data: sequence[uint8] = default_field([])
    """
    Point data, interpreted using `fields`
    """


@dataclass
class PoseInFrame(IdlStruct, typename='foxglove_msgs/PoseInFrame'):
    """
    foxglove_msgs/msg/PoseInFrame
    A timestamped pose for an object or reference frame in 3D space

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of pose
    """

    frame_id: str = ''
    """
    Frame of reference for pose position and orientation
    """

    pose: Pose = default_field(Pose)
    """
    Pose in 3D space
    """


@dataclass
class PosesInFrame(IdlStruct, typename='foxglove_msgs/PosesInFrame'):
    """
    foxglove_msgs/msg/PosesInFrame
    An array of timestamped poses for an object or reference frame in 3D space

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of pose
    """

    frame_id: str = ''
    """
    Frame of reference for pose position and orientation
    """

    poses: sequence[Pose] = default_field([])
    """
    Poses in 3D space
    """


class DeletionAction(Enum):
    MATCHING_ID = 0
    """
    Delete the existing entity on the same topic that has the provided `id`
    """
    ALL = 1
    """
    Delete all existing entities on the same topic
    """


@dataclass
class PrimitiveDeletion(IdlStruct, typename='foxglove_msgs/PrimitiveDeletion'):
    """
    foxglove_msgs/msg/PrimitiveDeletion
    Command to remove previously published markers

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the marker. Only matching markers earlier than this timestamp will be deleted.
    """

    type: uint8 = 0
    """
    Type of deletion action to perform
    """

    id: str = ''
    """
    Numeric identifier which must match if `kind` is `MATCHING_ID`.
    """


@dataclass
class SceneEntityDeletion(IdlStruct, typename='foxglove_msgs/SceneEntityDeletion'):
    """
    foxglove_msgs/msg/SceneEntityDeletion
    Command to remove previously published entities

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the deletion. Only matching entities earlier than this timestamp will be deleted.
    """

    type: uint8 = 0
    """
    Type of deletion action to perform
    """

    id: str = ''
    """
    Identifier which must match if `type` is `MATCHING_ID`.
    """


@dataclass
class RawImage(IdlStruct, typename='foxglove_msgs/RawImage'):
    """
    foxglove_msgs/msg/RawImage
    A raw image

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of image
    """

    frame_id: str = ''
    """
    Frame of reference for the image. The origin of the frame is the optical center of the camera. +x points to the right in the image, +y points down, and +z points into the plane of the image.
    """

    width: uint32 = 0
    """
    Image width
    """

    height: uint32 = 0
    """
    Image height
    """

    encoding: str = ''
    """
    Encoding of the raw image data
    
    Supported values: `8UC1`, `8UC3`, `16UC1`, `32FC1`, `bayer_bggr8`, `bayer_gbrg8`, `bayer_grbg8`, `bayer_rggb8`, `bgr8`, `bgra8`, `mono8`, `mono16`, `rgb8`, `rgba8`, `uyvy` or `yuv422`, `yuyv` or `yuv422_yuy2`
    """

    step: uint32 = 0
    """
    Byte length of a single row
    """

    data: sequence[uint8] = default_field([])
    """
    Raw image data
    """


@dataclass
class SpherePrimitive(IdlStruct, typename='foxglove_msgs/SpherePrimitive'):
    """
    foxglove_msgs/msg/SpherePrimitive
    A primitive representing a sphere or ellipsoid

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the sphere and orientation of the sphere
    """

    size: Vector3 = default_field(Vector3)
    """
    Size (diameter) of the sphere along each axis
    """

    color: Color = default_field(Color)
    """
    Color of the sphere
    """


@dataclass
class TriangleListPrimitive(IdlStruct, typename='foxglove_msgs/TriangleListPrimitive'):
    """
    foxglove_msgs/msg/TriangleListPrimitive
    A primitive representing a set of triangles or a surface tiled by triangles

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Origin of triangles relative to reference frame
    """

    points: sequence[Point] = default_field([])
    """
    Vertices to use for triangles, interpreted as a list of triples (0-1-2, 3-4-5, ...)
    """

    color: Color = default_field(Color)
    """
    Solid color to use for the whole shape. One of `color` or `colors` must be provided.
    """

    colors: sequence[Color] = default_field([])
    """
    Per-vertex colors (if specified, must have the same length as `points`). One of `color` or `colors` must be provided.
    """

    indices: sequence[uint32] = default_field([])
    """
    Indices into the `points` and `colors` attribute arrays, which can be used to avoid duplicating attribute data.
    
    If omitted or empty, indexing will not be used. This default behavior is equivalent to specifying [0, 1, ..., N-1] for the indices (where N is the number of `points` provided).
    """


@dataclass
class TextPrimitive(IdlStruct, typename='foxglove_msgs/TextPrimitive'):
    """
    foxglove_msgs/msg/TextPrimitive
    A primitive representing a text label

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the text box and orientation of the text. Identity orientation means the text is oriented in the xy-plane and flows from -x to +x.
    """

    billboard: bool = False
    """
    Whether the text should respect `pose.orientation` (false) or always face the camera (true)
    """

    font_size: float64 = 0
    """
    Font size (height of one line of text)
    """

    scale_invariant: bool = False
    """
    Indicates whether `font_size` is a fixed size in screen pixels (true), or specified in world coordinates and scales with distance from the camera (false)
    """

    color: Color = default_field(Color)
    """
    Color of the text
    """

    text: str = ''
    """
    Text
    """


@dataclass
class SceneEntity(IdlStruct, typename='foxglove_msgs/SceneEntity'):
    """
    foxglove_msgs/msg/SceneEntity
    A visual element in a 3D scene. An entity may be composed of multiple primitives which all share the same frame of reference.

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the entity
    """

    frame_id: str = ''
    """
    Frame of reference
    """

    id: str = ''
    """
    Identifier for the entity. A entity will replace any prior entity on the same topic with the same `id`.
    """

    lifetime: Duration = default_field(Duration)
    """
    Length of time (relative to `timestamp`) after which the entity should be automatically removed. Zero value indicates the entity should remain visible until it is replaced or deleted.
    """

    frame_locked: bool = False
    """
    Whether the entity should keep its location in the fixed frame (false) or follow the frame specified in `frame_id` as it moves relative to the fixed frame (true)
    """

    metadata: sequence[KeyValuePair] = default_field([])
    """
    Additional user-provided metadata associated with the entity. Keys must be unique.
    """

    arrows: sequence[ArrowPrimitive] = default_field([])
    """
    Arrow primitives
    """

    cubes: sequence[CubePrimitive] = default_field([])
    """
    Cube primitives
    """

    spheres: sequence[SpherePrimitive] = default_field([])
    """
    Sphere primitives
    """

    cylinders: sequence[CylinderPrimitive] = default_field([])
    """
    Cylinder primitives
    """

    lines: sequence[LinePrimitive] = default_field([])
    """
    Line primitives
    """

    triangles: sequence[TriangleListPrimitive] = default_field([])
    """
    Triangle list primitives
    """

    texts: sequence[TextPrimitive] = default_field([])
    """
    Text primitives
    """

    models: sequence[ModelPrimitive] = default_field([])
    """
    Model primitives
    """


@dataclass
class SceneEntities(IdlStruct, typename='foxglove_msgs/SceneEntities'):
    """
    foxglove_msgs/msg/SceneEntities
    An update to the entities displayed in a 3D scene

    Generated by https://github.com/foxglove/schemas
    """
    deletions: sequence[SceneEntityDeletion] = default_field([])
    """
    Scene entities to delete
    """

    entities: sequence[SceneEntity] = default_field([])
    """
    Scene entities to add or replace
    """


@dataclass
class SceneEntityUpdate(IdlStruct, typename='foxglove_msgs/SceneEntityUpdate'):
    """
    foxglove_msgs/msg/SceneEntityUpdate
    An update to the entities displayed in a 3D scene

    Generated by https://github.com/foxglove/schemas
    """
    deletions: sequence[SceneEntityDeletion] = default_field([])
    """
    Scene entities to delete
    """

    entities: sequence[SceneEntity] = default_field([])
    """
    Scene entities to add or replace
    """


@dataclass
class SceneUpdate(IdlStruct, typename='foxglove_msgs/SceneUpdate'):
    """
    foxglove_msgs/msg/SceneUpdate
    An update to the entities displayed in a 3D scene

    Generated by https://github.com/foxglove/schemas
    """
    deletions: sequence[SceneEntityDeletion] = default_field([])
    """
    Scene entities to delete
    """

    entities: sequence[SceneEntity] = default_field([])
    """
    Scene entities to add or replace
    """


@dataclass
class SphereMarker(IdlStruct, typename='foxglove_msgs/SphereMarker'):
    """
    foxglove_msgs/msg/SphereMarker
    A marker representing a sphere or ellipsoid

    Generated by https://github.com/foxglove/schemas
    """
    pose: Pose = default_field(Pose)
    """
    Position of the center of the sphere and orientation of the sphere
    """

    size: Vector3 = default_field(Vector3)
    """
    Size (diameter) of the sphere along each axis
    """

    color: Color = default_field(Color)
    """
    Color of the sphere
    """


@dataclass
class Transform(IdlStruct, typename='foxglove_msgs/Transform'):
    """
    Generated from Transform by @foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Transform time
    """

    translation: Vector3 = default_field(Vector3)
    """
    Translation component of the transform
    """

    rotation: Quaternion = default_field(Quaternion)
    """
    Rotation component of the transform
    """


@dataclass
class TrianglesMarker(IdlStruct, typename='foxglove_msgs/TrianglesMarker'):
    """
    foxglove_msgs/msg/TrianglesMarker
    A marker representing a set of triangles or a surface tiled by triangles

    Generated by https://github.com/foxglove/schemas
    """
    timestamp: Time = default_field(Time)
    """
    Timestamp of the marker
    """

    frame_id: str = ''
    """
    Frame of reference
    """

    id: str = ''
    """
    Identifier for the marker. A marker will replace any prior marker on the same topic with the same `id`.
    """

    lifetime: Duration = default_field(Duration)
    """
    Length of time (relative to `timestamp`) after which the marker should be automatically removed. Zero value indicates the marker should remain visible until it is replaced or deleted.
    """

    frame_locked: bool = False
    """
    Whether the marker should keep its location in the fixed frame (false) or follow the frame specified in `frame_id` as it moves relative to the fixed frame (true)
    """

    metadata: sequence[KeyValuePair] = default_field([])
    """
    Additional user-provided metadata associated with the marker. Keys must be unique.
    """

    pose: Pose = default_field(Pose)
    """
    Origin of triangles relative to reference frame
    """

    points: sequence[Point] = default_field([])
    """
    Vertices to use for triangles, interpreted as a list of triples (0-1-2, 3-4-5, ...)
    """

    color: Color = default_field(Color)
    """
    Solid color to use for the whole shape. One of `color` or `colors` must be provided.
    """

    colors: sequence[Color] = default_field([])
    """
    Per-vertex colors (if specified, must have the same length as `points`). One of `color` or `colors` should be provided.
    """

    indices: sequence[uint32] = default_field([])
    """
    Indices into the `points` and `colors` attribute arrays, which can be used to avoid duplicating attribute data.
    
    If omitted or empty, indexing will not be used. This default behavior is equivalent to specifying [0, 1, ..., N-1] for the indices (where N is the number of `points` provided).
    """


# Schema registry support
_TYPES = {
    "ArrowMarker": ArrowMarker,
    "CircleAnnotation": CircleAnnotation,
    "Color": Color,
    "CompressedVideo": CompressedVideo,
    "CubeMarker": CubeMarker,
    "CylinderMarker": CylinderMarker,
    "ImageAnnotations": ImageAnnotations,
    "KeyValuePair": KeyValuePair,
    "LineMarker": LineMarker,
    "ModelMarker": ModelMarker,
    "Point2": Point2,
    "PointsAnnotation": PointsAnnotation,
    "SceneEntity": SceneEntity,
    "SceneEntityDeletion": SceneEntityDeletion,
    "SceneUpdate": SceneUpdate,
    "SphereMarker": SphereMarker,
    "TextAnnotation": TextAnnotation,
    "TextMarker": TextMarker,
    "TriangleListMarker": TriangleListMarker,
}


def is_type_supported(type_name: str) -> bool:
    """Check if a type name is supported by this module."""
    return type_name in _TYPES


def list_types() -> list[str]:
    """List all type schema names in this module."""
    return [f"foxglove_msgs/msg/{name}" for name in sorted(_TYPES.keys())]


def get_type(type_name: str) -> type:
    """Get the type class by name. Returns None if not found."""
    return _TYPES.get(type_name)
