7#include <janus/janus.hpp>
20template <
typename Scalar>
22 const Scalar &elevation) {
25 Scalar cos_elev = janus::cos(elevation);
26 Scalar sin_elev = janus::sin(elevation);
27 Scalar cos_az = janus::cos(azimuth);
28 Scalar sin_az = janus::sin(azimuth);
59template <
typename Scalar>
60Scalar rail_acceleration(
const Scalar &s_dot,
const Scalar &force_along,
61 const Scalar &force_perp_mag,
const Scalar &
mass,
62 const Scalar &
gravity,
const Scalar &elevation,
63 const Scalar &friction_coeff) {
65 Scalar gravity_along =
gravity * janus::sin(elevation);
68 Scalar friction_sign =
69 janus::where(s_dot > Scalar(0), Scalar(1),
70 janus::where(s_dot < Scalar(0), Scalar(-1), Scalar(0)));
71 Scalar friction_force = friction_coeff * force_perp_mag * friction_sign;
74 return (force_along - friction_force) /
mass - gravity_along;
88template <
typename Scalar>
90rail_acceleration_body(
const Scalar &s_dot,
const Vec3<Scalar> &force_body,
91 const Scalar &mass,
const Scalar &gravity,
92 const Scalar &elevation,
const Scalar &friction_coeff) {
94 Scalar force_along = force_body(0);
97 Scalar force_perp_mag = janus::sqrt(force_body(1) * force_body(1) +
98 force_body(2) * force_body(2));
100 return rail_acceleration(s_dot, force_along, force_perp_mag, mass, gravity,
101 elevation, friction_coeff);
109template <
typename Scalar>
110Scalar on_rail(
const Scalar &s,
const Scalar &rail_length) {
111 return janus::where(s < rail_length,
112 janus::where(s >= Scalar(0), Scalar(1), Scalar(0)),
126template <
typename Scalar>
127Vec3<Scalar> rail_position(
const Scalar &s,
const Vec3<Scalar> &origin,
128 const Vec3<Scalar> &direction) {
129 return origin + s * direction;
137template <
typename Scalar>
138Vec3<Scalar> rail_velocity(
const Scalar &s_dot,
const Vec3<Scalar> &direction) {
139 return s_dot * direction;
154template <
typename Scalar>
155janus::Quaternion<Scalar> rail_aligned_attitude(
const Scalar &azimuth,
156 const Scalar &elevation) {
161 Scalar half_az = azimuth / Scalar(2);
162 janus::Quaternion<Scalar> q_yaw(janus::cos(half_az), Scalar(0), Scalar(0),
163 janus::sin(half_az));
167 Scalar half_pitch = elevation / Scalar(2);
168 janus::Quaternion<Scalar> q_pitch(janus::cos(half_pitch), Scalar(0),
169 janus::sin(half_pitch), Scalar(0));
172 return q_yaw * q_pitch;
179template <
typename Scalar>
180Vec3<Scalar> rail_reaction_force(
const Vec3<Scalar> &force_body) {
182 return Vec3<Scalar>{Scalar(0), -force_body(1), -force_body(2)};
Definition Guided5Dof.hpp:13
Vec3< Scalar > rail_direction_ned(const Scalar &azimuth, const Scalar &elevation)
Definition RailLaunch.hpp:21
Definition GravityTypes.hpp:7
Definition MassProperties.hpp:12