success = False
            break
        if (np.linalg.norm(dv[:6]) >= 1e3):
            print "Slipped and fell."
            success = False
            break

        SOL.append(sol_fullqp)
        data.q = q + noise_q
        data.v = v + noise_v
        data.noise_q = noise_q
        data.noise_v = noise_v

        data.tau_fullqp = tau
        data.dv_fullqp = dv
        data.activeset_fullqp = sol_fullqp.activeSet

        # Perform onboard computation around contact switches
        if LOCAL and step * STEP_DURATION - ONBOARD_WINDOW <= i < step * STEP_DURATION + ONBOARD_WINDOW:
            # when on-board, only compute full qp every ONBOARD_FREQ ms
            if i % ONBOARD_FREQ == 0:
                delay = 2 + int(1000 * data.fullqp_time)
                # 2 ms extra delay for local controller (<= 1ms)
                # and one-time pre-computation spread out over the whole window (possible with multithreading)
                for h in range(ONBOARD_FREQ):
                    # check if this delay < network delay
                    if h < delay:
                        delayed_ids[i + h] = np.maximum(
                            delayed_ids[i + h], i - ONBOARD_FREQ)
                    if h >= delay:
                        delayed_ids[i + h] = np.maximum(delayed_ids[i + h], i)