Skip to content

File VelocityNormalBinormal.hpp

File List > astrea > astro > astro > frames > instances > VelocityNormalBinormal.hpp

Go to the documentation of this file

#pragma once

#include <astro/astro.fwd.hpp>
#include <astro/frames/CartesianVector.hpp>
#include <astro/frames/instances/body_centered_inertial_frames.hpp>
#include <astro/frames/types/DirectionCosineMatrix.hpp>
#include <astro/frames/types/DynamicFrame.hpp>
#include <astro/time/Date.hpp>

namespace astrea {
namespace astro {
namespace frames {

class VelocityNormalBinormal : public DynamicFrame<VelocityNormalBinormal, FrameAxis::VNB> {

    friend DynamicFrame<VelocityNormalBinormal, FrameAxis::VNB>;

  public:
    VelocityNormalBinormal(const FrameReference* parent) :
        DynamicFrame<VelocityNormalBinormal, FrameAxis::VNB>(parent)
    {
    }

    ~VelocityNormalBinormal() = default;

    DirectionCosineMatrix<frames::earth::icrf, VelocityNormalBinormal> get_dcm(const Date& date) const
    {
        const auto r        = get_inertial_position(date).unit();
        const auto v        = get_inertial_velocity(date).unit();
        const auto h        = r.cross(v).unit();
        const auto binormal = (v.cross(h)).unit();
        return DirectionCosineMatrix<frames::earth::icrf, VelocityNormalBinormal>::from_vectors(v, h, binormal);
    }

  private:
    VelocityNormalBinormal(const RadiusVector<frames::earth::icrf>& position, const VelocityVector<frames::earth::icrf>& velocity) :
        DynamicFrame<VelocityNormalBinormal, FrameAxis::VNB>(position, velocity)
    {
    }
};

namespace dynamic {
using vnb = VelocityNormalBinormal;
} // namespace dynamic

} // namespace frames
} // namespace astro
} // namespace astrea