pub use crate::prelude::*;

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Pose {
    /// Geospatial location defined by this Pose.
    #[serde(skip_serializing_if = "Option::is_none")]
    pub pos: Option<Lla>,
    /// The quaternion to transform a point in the Pose frame to the ENU frame. The Pose frame could be Body, Turret,
    /// etc and is determined by the context in which this Pose is used.
    /// The normal convention for defining orientation is to list the frames of transformation, for example
    /// att_gimbal_to_enu is the quaternion which transforms a point in the gimbal frame to the body frame, but
    /// in this case we truncate to att_enu because the Pose frame isn't defined. A potentially better name for this
    /// field would have been att_pose_to_enu.
    ///
    /// Implementations of this quaternion should left multiply this quaternion to transform a point from the Pose frame
    /// to the enu frame.
    ///
    /// Point<Pose\> posePt{1,0,0};
    /// Rotation<Enu, Pose\> attPoseToEnu{};
    /// Point<Enu\> = attPoseToEnu*posePt;
    ///
    /// This transformed point represents some vector in ENU space that is aligned with the x axis of the attPoseToEnu
    /// matrix.
    ///
    /// An alternative matrix expression is as follows:
    /// ptEnu = M x ptPose
    #[serde(rename = "attEnu")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub att_enu: Option<Quaternion>,
}
