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