def random_pose_simulation(
    world_gen, vehicle,
    random_pose_gen, num_iterations,
    processing_class, previous_result=None):
    """
    world
    vehicle
    num_iterations
    random_pose_gen:  XXX lambda -> RigidBodyState
    processing_class
    """
    
    # Use random seed
    numpy.random.seed()     
        
    if previous_result is not None:
        state = previous_result
        # if we are called again, it means we need more iteration
        if state.current_iteration == state.total_iterations:   
            state.total_iterations += num_iterations     
    else:
        state = OpenStruct()
        state.current_iteration = 0
        state.total_iterations = num_iterations
        state.result = processing_class(vehicle.config)
        state.vehicle = vehicle

    
    save_every = 50
    generate_world_every = 50
    
    world = None
    
    while state.current_iteration < state.total_iterations:
        # sample a random world
        if world is None or  \
            state.current_iteration % generate_world_every == 0:
            world = world_gen()
            # give the map to the pose generator
            random_pose_gen.set_map(world)
            # sets the map for all sensors
            vehicle.set_map(world)
        
        state1 = random_pose_gen.generate_pose()
        
        data = vehicle.compute_observations(state1)
        assert_reasonable_value(data.sensels)
        
        state.result.process_data(data)

        if state.current_iteration % save_every == 0:
            yield state, state.current_iteration, state.total_iterations
        state.current_iteration += 1
        
        

    yield state, state.current_iteration, state.total_iterations
def random_motion_simulation(
    world_gen, vehicle,
    random_pose_gen, num_iterations, random_commands_gen, dt,
    processing_class, previous_result=None):
    """
    
    world
    vehicle
    random_pose_gen:  lambda iteration -> RigidBodyState
    random_commands_gen:  lambda iteration, vehicle -> castable to float list
    processing_class
    """
    
    # Use random seed
    numpy.random.seed()
         
    if previous_result is not None:
        state = previous_result
        # if we are called again, it means we need more iteration
        if state.current_iteration == state.total_iterations:
            state.total_iterations += num_iterations
            print "Increasing to %d iterations" % state.total_iterations
    else:
        state = OpenStruct()
        state.current_iteration = 0
        state.total_iterations = num_iterations
        state.result = processing_class(vehicle.config)
        state.vehicle = vehicle
        
    save_every = 50
    generate_world_every = 5
    world = None
    while state.current_iteration < state.total_iterations:
        # sample a random world
        if world is None or  \
            state.current_iteration % generate_world_every == 0:
            world = world_gen()
            # give the map to the pose generator
            random_pose_gen.set_map(world)
            # sets the map for all sensors
            vehicle.set_map(world)
    
        state1 = random_pose_gen.generate_pose()
        if state1 is None:
            raise BVException('Could not generate a random pose.')

        # generate random commands
        commands = random_commands_gen(state.current_iteration, vehicle)
        # get next state
        state2 = vehicle.dynamics.evolve_state(state1, commands, dt)
        
        data = vehicle.compute_observations_and_derivatives(state1, state2, dt)
        data.commands = array(commands)
 
 
        assert_reasonable_value(data.sensels)
        assert_reasonable_value(data.sensels_dot)
        
        #
#        for i, v in enumerate(data.sensels):
#            if v < 0.5:
#                print "Found sensel %d: range %f surf %s valid %s" % \
#                    (i, v, data.rangefinder[0].surface[i], \
#                      data.rangefinder[0].valid[i], \
#                     ) # data.surface[i])
#                #print data.rangefinder[0].__dict__.keys() 
#                print world
#                break
#                    
        state.result.process_data(data)
        
        # housekeeping
        if state.current_iteration % save_every == 0:
            yield state, state.current_iteration, state.total_iterations
        state.current_iteration += 1

    yield state, state.current_iteration, state.total_iterations