@@ -81,6 +81,34 @@ function rotation_matrix_to_quaternion(R)
8181 return [w, x, y, z]
8282end
8383
84+ """
85+ force_eqs!(s, system, eqs, defaults, guesses; kwargs...)
86+
87+ Generate the force equations for the kite system including spring forces, drag forces,
88+ pulley dynamics and winch forces.
89+
90+ # Arguments
91+ - `s::RamAirKite`: The kite system state
92+ - `system::PointMassSystem`: The point mass representation
93+ - `eqs`: Current system equations
94+ - `defaults`: Default values for variables
95+ - `guesses`: Initial guesses for variables
96+ - `R_b_w`: Body to world rotation matrix
97+ - `kite_pos`: Kite position vector
98+ - `kite_vel`: Kite velocity vector
99+ - `wind_vec_gnd`: Ground wind vector
100+ - `group_aero_moment`: Aerodynamic moments per group
101+ - `twist_angle`: Twist angles per group
102+ - `steady`: Whether in steady mode
103+
104+ # Returns
105+ Tuple containing:
106+ - Updated equations
107+ - Updated defaults
108+ - Updated guesses
109+ - Tether forces on kite
110+ - Tether moments on kite
111+ """
84112function force_eqs! (s, system, eqs, defaults, guesses;
85113 R_b_w, kite_pos, kite_vel, wind_vec_gnd, group_aero_moment, twist_angle, steady)
86114
@@ -488,6 +516,32 @@ function force_eqs!(s, system, eqs, defaults, guesses;
488516 return eqs, defaults, guesses, tether_kite_force, tether_kite_moment
489517end
490518
519+ """
520+ diff_eqs!(s, eqs, defaults; kwargs...)
521+
522+ Generate the differential equations for kite dynamics including quaternion kinematics,
523+ angular velocities and accelerations, and forces/moments.
524+
525+ # Arguments
526+ - `s::RamAirKite`: The kite system state
527+ - `eqs`: Current system equations
528+ - `defaults`: Default values for variables
529+ - `tether_kite_force`: Forces from tethers on kite
530+ - `tether_kite_moment`: Moments from tethers on kite
531+ - `aero_force_b`: Aerodynamic forces in body frame
532+ - `aero_moment_b`: Aerodynamic moments in body frame
533+ - `ω_b`: Angular velocity in body frame
534+ - `R_b_w`: Body to world rotation matrix
535+ - `kite_pos`: Kite position vector
536+ - `kite_vel`: Kite velocity vector
537+ - `kite_acc`: Kite acceleration vector
538+ - `init_Q_b_w`: Initial quaternion orientation
539+ - `init_kite_pos`: Initial kite position
540+ - `steady`: Whether in steady mode
541+
542+ # Returns
543+ Tuple of updated equations and defaults
544+ """
491545function diff_eqs! (s, eqs, defaults; tether_kite_force, tether_kite_moment, aero_force_b,
492546 aero_moment_b, ω_b, R_b_w, kite_pos, kite_vel, kite_acc, init_Q_b_w, init_kite_pos, steady
493547)
@@ -548,7 +602,30 @@ function diff_eqs!(s, eqs, defaults; tether_kite_force, tether_kite_moment, aero
548602 return eqs, defaults
549603end
550604
551-
605+ """
606+ scalar_eqs!(s, eqs, measure; R_b_w, wind_vec_gnd, va_kite_b, kite_pos, kite_vel, kite_acc)
607+
608+ Generate equations for scalar quantities like elevation, azimuth, heading and course angles.
609+
610+ # Arguments
611+ - `s::RamAirKite`: The kite system state
612+ - `eqs`: Current system equations
613+ - `measure::Measurement`: Current measurement data
614+ - `R_b_w`: Body to world rotation matrix
615+ - `wind_vec_gnd`: Ground wind vector
616+ - `va_kite_b`: Apparent wind velocity in body frame
617+ - `kite_pos`: Kite position vector
618+ - `kite_vel`: Kite velocity vector
619+ - `kite_acc`: Kite acceleration vector
620+
621+ # Returns
622+ - Updated system equations including:
623+ - Heading angle from x-axis
624+ - Elevation angle
625+ - Azimuth angle
626+ - Course angle
627+ - Angular velocities and accelerations
628+ """
552629function scalar_eqs! (s, eqs, measure; R_b_w, wind_vec_gnd, va_kite_b, kite_pos, kite_vel, kite_acc)
553630 @parameters wind_scale_gnd = s. set. v_wind
554631 @parameters measured_wind_dir_gnd = measure. wind_dir_gnd
@@ -610,11 +687,35 @@ function scalar_eqs!(s, eqs, measure; R_b_w, wind_vec_gnd, va_kite_b, kite_pos,
610687 return eqs
611688end
612689
613- function linear_vsm_eqs! (s, eqs; aero_force_b, aero_moment_b, group_aero_moment, init_va, twist_angle, va_kite_b, ω_b)
690+ """
691+ linear_vsm_eqs!(s, eqs; aero_force_b, aero_moment_b, group_aero_moment, init_va_b, twist_angle, va_kite_b, ω_b)
692+
693+ Generate linearized aerodynamic equations using the Vortex Step Method (VSM).
694+ Uses linearization around current operating point to approximate aerodynamic forces
695+ and moments. The Jacobian is computed using the VSM solver.
696+
697+ # Arguments
698+ - `s::RamAirKite`: The kite system state
699+ - `eqs`: Current system equations
700+ - `aero_force_b`: Aerodynamic forces in body frame
701+ - `aero_moment_b`: Aerodynamic moments in body frame
702+ - `group_aero_moment`: Aerodynamic moments per group
703+ - `init_va_b`: Initial apparent wind velocity
704+ - `twist_angle`: Twist angles per group
705+ - `va_kite_b`: Apparent wind velocity in body frame
706+ - `ω_b`: Angular velocity in body frame
707+
708+ # Returns
709+ - Updated system equations including linearized aerodynamics:
710+ - Force and moment calculations
711+ - Group moment distributions
712+ - Jacobian matrix for state derivatives
713+ """
714+ function linear_vsm_eqs! (s, eqs; aero_force_b, aero_moment_b, group_aero_moment, init_va_b, twist_angle, va_kite_b, ω_b)
614715 sol = s. vsm_solver. sol
615716 @assert length (s. point_system. groups) == length (sol. group_moment_dist)
616717
617- y_ = [zeros (4 ); init_va ; zeros (3 )]
718+ y_ = [zeros (4 ); init_va_b ; zeros (3 )]
618719 jac_, x_ = VortexStepMethod. linearize (
619720 s. vsm_solver,
620721 s. aero,
@@ -763,7 +864,35 @@ function get_nonstiff_unknowns(s, vec=Num[])
763864 return vec
764865end
765866
766- function create_sys! (s:: RamAirKite , system:: PointMassSystem , measure:: Measurement ; init_Q_b_w, init_kite_pos, init_va)
867+
868+ """
869+ create_sys!(s::RamAirKite, system::PointMassSystem, measure::Measurement;
870+ init_Q_b_w, init_kite_pos, init_va_b) -> Tuple
871+
872+ Create the complete ODE system for the ram air kite model by combining force equations,
873+ aerodynamic equations, differential equations and scalar equations.
874+
875+ The system is built up in stages:
876+ 1. Force equations for springs, drag and pulleys
877+ 2. Linearized aerodynamic equations using VSM
878+ 3. Differential equations for kinematics and dynamics
879+ 4. Scalar equations for angles and derived quantities
880+
881+ # Arguments
882+ - `s::RamAirKite`: The kite system state object
883+ - `system::PointMassSystem`: The point mass representation of the kite system
884+ - `measure::Measurement`: Initial measurement data
885+ - `init_Q_b_w`: Initial quaternion orientation of kite body frame relative to world frame
886+ - `init_kite_pos`: Initial kite position vector in world frame
887+ - `init_va_b`: Initial apparent wind velocity vector in body frame
888+
889+ # Returns
890+ Tuple containing:
891+ - `sys::ODESystem`: The complete ModelingToolkit ODE system
892+ - `defaults::Vector{Pair{Num,Real}}`: Default values for state variables
893+ - `guesses::Vector{Pair{Num,Real}}`: Initial guesses for solver
894+ """
895+ function create_sys! (s:: RamAirKite , system:: PointMassSystem , measure:: Measurement ; init_Q_b_w, init_kite_pos, init_va_b)
767896 eqs = []
768897 defaults = Pair{Num, Real}[]
769898 guesses = Pair{Num, Real}[]
@@ -799,7 +928,7 @@ function create_sys!(s::RamAirKite, system::PointMassSystem, measure::Measuremen
799928 eqs, defaults, guesses, tether_kite_force, tether_kite_moment =
800929 force_eqs! (s, system, eqs, defaults, guesses;
801930 R_b_w, kite_pos, kite_vel, wind_vec_gnd, group_aero_moment, twist_angle, steady)
802- eqs = linear_vsm_eqs! (s, eqs; aero_force_b, aero_moment_b, group_aero_moment, init_va , twist_angle, va_kite_b, ω_b)
931+ eqs = linear_vsm_eqs! (s, eqs; aero_force_b, aero_moment_b, group_aero_moment, init_va_b , twist_angle, va_kite_b, ω_b)
803932 eqs, defaults = diff_eqs! (s, eqs, defaults; tether_kite_force, tether_kite_moment, aero_force_b, aero_moment_b,
804933 ω_b, R_b_w, kite_pos, kite_vel, kite_acc, init_Q_b_w, init_kite_pos, steady)
805934 eqs = scalar_eqs! (s, eqs, measure; R_b_w, wind_vec_gnd, va_kite_b, kite_pos, kite_vel, kite_acc)
0 commit comments