@@ -100,25 +100,26 @@ def rpm_to_force(rpm):
100100
101101 # dynamics
102102 # dot{p} = v
103- pos_next = self .state .pos + self .state .vel * dt
104103 # mv = mg + R f_u + f_a
105104 vel_next = self .state .vel + (
106105 np .array ([0 , 0 , - self .g ]) +
107106 (rowan .rotate (self .state .quat , f_u ) + f_a ) / self .mass ) * dt
107+ pos_next = self .state .pos + vel_next * dt
108108
109109 # dot{R} = R S(w)
110110 # to integrate the dynamics, see
111111 # https://www.ashwinnarayan.com/post/how-to-integrate-quaternions/, and
112112 # https://arxiv.org/pdf/1604.08139.pdf
113113 # Sec 4.5, https://arxiv.org/pdf/1711.02508.pdf
114- omega_global = rowan .rotate (self .state .quat , self .state .omega )
114+ # mJ = Jw x w + tau_u
115+ omega_next = self .state .omega + (
116+ self .inv_J * (np .cross (self .J * self .state .omega , self .state .omega ) + tau_u )) * dt
117+
118+ omega_global = rowan .rotate (self .state .quat , omega_next )
115119 q_next = rowan .normalize (
116120 rowan .calculus .integrate (
117121 self .state .quat , omega_global , dt ))
118122
119- # mJ = Jw x w + tau_u
120- omega_next = self .state .omega + (
121- self .inv_J * (np .cross (self .J * self .state .omega , self .state .omega ) + tau_u )) * dt
122123
123124 self .state .pos = pos_next
124125 self .state .vel = vel_next
0 commit comments