def integrate(dt, phase, orientation):
    """ Integrate motion to produce new orientation """
    phase += 2*pi*dt*Omegaf
    omega = Omega*cos(phase)
    delta = (np.eye(3), rotations.hat_map(dt*omega))
    orientation = SO3.multiply(orientation, SO3.expmap(delta))
    return phase, omega, orientation
def accelerometer(orientation):
    """ Produce gravity vector from orientation matrix """
    acceleration = SO3.multiply(SO3.inverse(orientation), Gravity)
    return acceleration
def run(pause=False):
    """ Run clock and integrator and emit values.
    """
    imupub = rospy.Publisher('~imu', Imu, queue_size=1)
    gyropub = rospy.Publisher('~gyro', Imu, queue_size=1)
    truepose = rospy.Publisher('~pose', PoseStamped, queue_size=1)
    clockpub = rospy.Publisher('/clock', Clock, queue_size=1)

    loop_hz = 125.
    dt = 1./loop_hz

    now = 0.0
    phase = np.zeros((3,))
    orientation = SO3.identity()
    seq = 0
    factor = 1.
    singlestep = False
    state = "PAUSE" if pause else "RUN"

    try:
        saveattrs = setiraw(0)
        while not rospy.is_shutdown():
            if not singlestep:
                time.sleep(dt/factor)
            if not pause:
                (imu, gyro, pose), (now, phase, orientation, seq) = step(dt, now, phase, orientation, seq)
                imupub.publish(imu)
                gyropub.publish(gyro)
                truepose.publish(pose)
                clockpub.publish(Clock(rospy.Time(now)))
                if singlestep:
                    pause = True
                    singlestep = False
            if factor == 1:
                print("\33[2K\r<%s %1.3f>"%(state,now), end="")
            else:
                print("\33[2K\r<RATE %1.3f, %s %1.3f>"%(factor, state, now), end="")
            sys.stdout.flush()
            ready = select.select([0], [], [], 0)
            if len(ready)>0:
                c = os.read(0, 1)
                if c==' ':
                    pause^=True
                    if pause:
                        state="PAUSE"
                    else:
                        state="RUN"
                if pause and c=='s':
                    singlestep = True
                    pause = False
                    state="STEP"
                if c=='+':
                    factor *= 2
                if c=='-':
                    factor /= 2
                if c=='q':
                    print("\33[2K\r<QUIT>", end="")
                    break
    finally:
        termios.tcsetattr(0, termios.TCSANOW, saveattrs)
        print("\33[2K\r<DONE>")