Skip to content

Commit 4e8069a

Browse files
authored
change to semi-implicit euler integration
1 parent 1b75fa8 commit 4e8069a

1 file changed

Lines changed: 6 additions & 5 deletions

File tree

  • crazyflie_sim/crazyflie_sim/backend

crazyflie_sim/crazyflie_sim/backend/np.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)