@@ -199,9 +199,15 @@ def symbolic_dynamics(
199199 * ``U``: Input vector ``[roll_rad, pitch_rad, yaw_rad, thrust_N]``.
200200 * ``Y``: Output ``[pos(3), quat(4)]``.
201201 """
202- # We need to set the rpy and drpy symbols before building the euler model
203- symbols .rpy = rotation .cs_quat2euler (symbols .quat )
204- symbols .drpy = rotation .cs_ang_vel2rpy_rates (symbols .quat , symbols .ang_vel )
202+ # Temporarily override rpy/drpy so symbolic_dynamics_euler uses quaternion-derived
203+ # expressions for this call. Restore them afterwards so subsequent calls to
204+ # symbolic_dynamics_euler still get the original leaf symbolic variables.
205+ _saved_rpy = symbols .rpy
206+ _saved_drpy = symbols .drpy
207+ _rpy_quat = rotation .cs_quat2euler (symbols .quat )
208+ _drpy_quat = rotation .cs_ang_vel2rpy_rates (symbols .quat , symbols .ang_vel )
209+ symbols .rpy = _rpy_quat
210+ symbols .drpy = _drpy_quat
205211 X_dot_euler , X_euler , U_euler , Y_euler = symbolic_dynamics_euler (
206212 model_rotor_vel = model_rotor_vel ,
207213 mass = mass ,
@@ -216,6 +222,8 @@ def symbolic_dynamics(
216222 cmd_rpy_coef = cmd_rpy_coef ,
217223 drag_matrix = drag_matrix ,
218224 )
225+ symbols .rpy = _saved_rpy
226+ symbols .drpy = _saved_drpy
219227
220228 # States and Inputs
221229 X = cs .vertcat (symbols .pos , symbols .quat , symbols .vel , symbols .ang_vel )
@@ -240,7 +248,7 @@ def symbolic_dynamics(
240248 )
241249 quat_dot = 0.5 * (xi @ symbols .quat )
242250 ang_vel_dot = rotation .cs_rpy_rates_deriv2ang_vel_deriv (
243- symbols .quat , symbols . drpy , X_dot_euler [9 :12 ]
251+ symbols .quat , _drpy_quat , X_dot_euler [9 :12 ]
244252 )
245253 if model_dist_t :
246254 # adding torque disturbances to the state
0 commit comments