def METHOD_NAME(self, dt: float) -> None:
    """
    Update the simulation forward by the specified time delta.
    A new odometry will be published after the model is updated.
    """
    if (
        self.last_wrench_time is None
        or rospy.Time.now() - self.last_wrench_time > rospy.Duration(1)
    ):
        self.set_wrench(np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0]))
    # Calculate rotation from body to global and global to body for later calculations
    body_to_world = quaternion_matrix(self.pose[3:])
    world_to_body = np.linalg.inv(body_to_world)
    # Perform inverse dynamics to get current acceleration in body frame
    accel = self.dynamics.inverse_dynamics(
        self.pose[2], self.twist, world_to_body, wrench=self.wrench
    )
    # Increment velocity by current acceleration by the time delta
    self.twist += accel * dt
    # Rotate twist to global frame so pose can be computed
    twist_linear_world = body_to_world.dot(self.twist[0:3])
    twist_angular_world = body_to_world.dot(self.twist[3:])
    # Update orientation if it has changed enough for the math to be stable
    norm = np.linalg.norm(twist_angular_world)
    if not np.isclose(norm, 0.0):
        quat_diff = trans.quaternion_about_axis(
            norm * dt, twist_angular_world / norm
        )
        self.pose[3:] = trans.quaternion_multiply(self.pose[3:], quat_diff)
    # Update position
    self.pose[0:3] += twist_linear_world * dt
    # Publish odometry after this update
    self.publish_odom()