def optimize(rate, samples, prefix, names, mse_indices): gates = generate_map('optimizer') opcd = OPCD_Interface(gates['opcd_ctrl']) bb = gates['blackbox'] vec_best = [ opcd.get(prefix + n) for n in names] vec = vec_best mse_min = sys.float_info.max best_log = [] try: for _ in range(5): vec = map(lambda x: x * uniform(1.0 - rate, 1.0 + rate), vec) # send new params to opcd: for i, n in zip(range(len(names)), names): opcd.set(prefix + n, vec[i]) # read data from autopilot and compute fitness: mse = 0.0 for _ in range(samples): array = loads(bb.recv()) for i in mse_indices: mse += array[i] ** 2 mse /= samples # evaluate mse: if mse < mse_min: best_log.append(mse) opcd.persist() mse_min = mse vec_best = copy(vec) else: # we did not improve; # use best vector as search starting point vec = copy(vec_best) except: for i, n in zip(range(len(names)), names): opcd.set(prefix + n, vec_best[i]) return best_log
def optimize(rate, samples, prefix, names, mse_indices): gates = generate_map('optimizer') opcd = OPCD_Interface(gates['opcd_ctrl']) bb = gates['blackbox'] vec_best = [opcd.get(prefix + n) for n in names] vec = vec_best mse_min = sys.float_info.max best_log = [] try: for _ in range(5): vec = map(lambda x: x * uniform(1.0 - rate, 1.0 + rate), vec) # send new params to opcd: for i, n in zip(range(len(names)), names): opcd.set(prefix + n, vec[i]) # read data from autopilot and compute fitness: mse = 0.0 for _ in range(samples): array = loads(bb.recv()) for i in mse_indices: mse += array[i]**2 mse /= samples # evaluate mse: if mse < mse_min: best_log.append(mse) opcd.persist() mse_min = mse vec_best = copy(vec) else: # we did not improve; # use best vector as search starting point vec = copy(vec_best) except: for i, n in zip(range(len(names)), names): opcd.set(prefix + n, vec_best[i]) return best_log
# apply mutation: new = map(lambda x: x * uniform(1.0 - MUTATION_RATE, 1.0 + MUTATION_RATE), vec) i = choice(range(4)) vec[i] = new[ i] #map(lambda x: x * uniform(1.0 - MUTATION_RATE, 1.0 + MUTATION_RATE), vec) # send new gains to opcd: for i, n in zip(range(4), param_names): opcd.set(prefix + n, vec[i]) # read data from autopilot and compute fitness: fit = 0.0 for _ in range(NUM_SAMPLES): array = loads(debug.recv()) gyro = float(array[3]) fit += (0.0 - gyro)**2 fit /= NUM_SAMPLES print 'computed fitness:', fit if fit < fit_best: # fitness has increased, print and commit to opcd print 'new best fitness:', vec, fit opcd.persist() fit_best = fit vec_best = vec else: # we did not improve; # use best vector as search starting point vec = copy(vec_best)
if not channels_valid: if rt.expired(): print 'please enable your remote control' else: result = detectors[state].run(channels, channels_prev) if result is not None: if result in channel_map: print 'channel already used, please try again' detectors[state].reset() else: channel_map[state] = result state += 1 if state == len(specs): print channel_map break channels_prev = copy(channels) sleep(0.3) if killed: raise Exception print 'writing to opcd' opcd = OPCD_Interface(socket_map['opcd_ctrl']) for name, index, max, min in channel_map: prefix = 'rc_cal.' + name + '.' opcd.set(prefix + 'index', index) opcd.set(prefix + 'max', max) opcd.set(prefix + 'min', min) opcd.persist() print 'done' except Exception: print 'canceled by user'