Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
Transfer Functions Module

The vulcan::tf module provides stateless transfer function utilities for linear systems and nonlinear elements. All functions are symbolic-compatible for trajectory optimization.

Overview

Header Description
FirstOrder.hpp First-order lag filters
SecondOrder.hpp Second-order systems (ωn, ζ)
Discretize.hpp ZOH, Tustin, Euler discretization
Nonlinear.hpp Rate limiting, saturation, deadband, hysteresis

Design Philosophy

All functions are stateless. State management is the responsibility of the calling framework (e.g., Icarus for simulation). This keeps Vulcan focused on pure math utilities.

First-Order Systems

using namespace vulcan::tf;
// Compute discretized coefficients
auto c = first_order<double>(0.1, 1.0, 0.01); // tau, K, dt
// Stateless step (caller manages state)
double y = 0.0;
y = first_order_step(c, y, 1.0); // returns next y
// Analytical response
double y_at_t = first_order_response(0.1, 1.0, 0.3); // tau, K, t
Transfer function utilities for linear systems and nonlinear elements.
Definition Discretize.hpp:5
FirstOrderCoeffs< Scalar > first_order(double tau, double K, double dt)
Compute first-order discrete-time system coefficients.
Definition FirstOrder.hpp:37
Scalar first_order_response(double tau, double K, const Scalar &t)
Compute analytical step response at time t.
Definition FirstOrder.hpp:73
Scalar first_order_step(const FirstOrderCoeffs< Scalar > &coeffs, const Scalar &state, const Scalar &input)
Compute next state for first-order system (stateless).
Definition FirstOrder.hpp:56

Second-Order Systems

auto c = second_order<double>(25.0, 0.7, 1.0, 0.01); // ωn, ζ, K, dt
Eigen::Vector2d x = Eigen::Vector2d::Zero();
x = second_order_step(c, x, 1.0); // x = [y, ẏ]
double y = second_order_output(c, x, 1.0);
// Characteristics
auto [tr, ts, Mp] = second_order_characteristics(25.0, 0.7);
Eigen::Matrix< Scalar, 2, 1 > second_order_step(const SecondOrderCoeffs< Scalar > &coeffs, const Eigen::Matrix< Scalar, 2, 1 > &state, const Scalar &input)
Compute next state for second-order system (stateless).
Definition SecondOrder.hpp:126
SecondOrderCoeffs< Scalar > second_order(double omega_n, double zeta, double K, double dt)
Compute second-order discrete-time system coefficients.
Definition SecondOrder.hpp:40
std::tuple< double, double, double > second_order_characteristics(double omega_n, double zeta)
Compute theoretical system characteristics.
Definition SecondOrder.hpp:159
Scalar second_order_output(const SecondOrderCoeffs< Scalar > &coeffs, const Eigen::Matrix< Scalar, 2, 1 > &state, const Scalar &input)
Extract output from state (stateless).
Definition SecondOrder.hpp:144

Nonlinear Elements

// Rate limiting
double next = rate_limit(current, commanded, rate_max, dt);
// Saturation
double sat = saturate(value, min, max);
// Deadband
double db = deadband(input, width);
// Hysteresis
double hyst = hysteresis(input, last_output, width);
Scalar deadband(const Scalar &input, double deadband_width)
Apply deadband (stateless).
Definition Nonlinear.hpp:52
Scalar rate_limit(const Scalar &current, const Scalar &commanded, double rate_max, double dt)
Apply rate limiting to a value change (stateless).
Definition Nonlinear.hpp:20
Scalar saturate(const Scalar &value, const Scalar &min, const Scalar &max)
Apply saturation/clamping (stateless).
Definition Nonlinear.hpp:37
Scalar hysteresis(const Scalar &input, const Scalar &last_output, double hysteresis_width)
Apply hysteresis (stateless computation).
Definition Nonlinear.hpp:73

Discretization

Eigen::Matrix2d A_c, A_d;
Eigen::Vector2d B_c, B_d;
discretize_zoh<2>(A_c, B_c, dt, A_d, B_d); // Zero-order hold
discretize_tustin<2>(A_c, B_c, dt, A_d, B_d); // Bilinear
discretize_euler<2>(A_c, B_c, dt, A_d, B_d); // Forward Euler
void discretize_zoh(const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
Zero-order hold (ZOH) discretization.
Definition Discretize.hpp:80
void discretize_tustin(const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
Tustin (bilinear) discretization.
Definition Discretize.hpp:100
void discretize_euler(const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
Forward Euler discretization.
Definition Discretize.hpp:117

Symbolic Optimization

All functions work with casadi::MX:

auto c = first_order<casadi::MX>(0.1, 1.0, 0.01);
casadi::MX x = casadi::MX::sym("x");
casadi::MX u = casadi::MX::sym("u");
casadi::MX x_next = first_order_step(c, x, u);
// x_next is a symbolic expression for use in janus::Opti