Skip to content

Commit 23d5b60

Browse files
committed
Add docstrings
1 parent 0a4d040 commit 23d5b60

File tree

2 files changed

+136
-7
lines changed

2 files changed

+136
-7
lines changed

src/mtk_model.jl

Lines changed: 134 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,34 @@ function rotation_matrix_to_quaternion(R)
8181
return [w, x, y, z]
8282
end
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+
"""
84112
function 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
489517
end
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+
"""
491545
function 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
549603
end
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+
"""
552629
function 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
611688
end
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
764865
end
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)

src/ram_air_kite.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,9 +386,9 @@ function init_sim!(s::RamAirKite, measure::Measurement; prn=true, precompile=fal
386386
init_Q_b_w, R_b_w = measure_to_q(measure)
387387
init_kite_pos = init!(s.point_system, s.set, R_b_w)
388388

389-
init_va = R_b_w' * [s.set.v_wind, 0., 0.]
389+
init_va_b = R_b_w' * [s.set.v_wind, 0., 0.]
390390

391-
sys, defaults, guesses = create_sys!(s, s.point_system, measure; init_Q_b_w, init_kite_pos, init_va)
391+
sys, defaults, guesses = create_sys!(s, s.point_system, measure; init_Q_b_w, init_kite_pos, init_va_b)
392392
prn && @info "Simplifying the system"
393393
prn && @time sys = structural_simplify(sys; additional_passes=[ModelingToolkit.IfLifting])
394394
!prn && (sys = structural_simplify(sys; additional_passes=[ModelingToolkit.IfLifting]))

0 commit comments

Comments
 (0)