From a563a00bc269f7cb4441aceb1c5cc5b9b41add6e Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Sat, 2 Apr 2016 22:46:29 +0800 Subject: [PATCH] examples: add remote exec demo --- .../master/repository/remote_exec_demo.py | 72 +++++++++++++++++++ .../repository/remote_exec_processing.py | 30 ++++++++ 2 files changed, 102 insertions(+) create mode 100644 examples/master/repository/remote_exec_demo.py create mode 100644 examples/master/repository/remote_exec_processing.py diff --git a/examples/master/repository/remote_exec_demo.py b/examples/master/repository/remote_exec_demo.py new file mode 100644 index 000000000..81a632e0a --- /dev/null +++ b/examples/master/repository/remote_exec_demo.py @@ -0,0 +1,72 @@ +import time +import inspect + +from artiq.experiment import * + +import remote_exec_processing + + +class RemoteExecDemo(EnvExperiment): + def build(self): + self.setattr_device("camera_sim") + self.setattr_device("scheduler") + self.setattr_argument("remote_exec", BooleanValue(False)) + self.setattr_argument("show_picture", BooleanValue(True), "Local options") + self.setattr_argument("enable_fit", BooleanValue(True), "Local options") + if self.remote_exec: + self.setattr_device("camera_sim_rexec") + + def prepare(self): + if self.remote_exec: + self.camera_sim_rexec.add_code( + inspect.getsource(remote_exec_processing)) + + def set_dataset(self, name, *args, **kwargs): + EnvExperiment.set_dataset(self, "rexec_demo." + name, + *args, **kwargs) + + def transfer_parameters(self, parameters): + w, h, cx, cy = parameters + self.set_dataset("gaussian_w", w, save=False, broadcast=True) + self.set_dataset("gaussian_h", h, save=False, broadcast=True) + self.set_dataset("gaussian_cx", cx, save=False, broadcast=True) + self.set_dataset("gaussian_cy", cy, save=False, broadcast=True) + + def fps_meter(self): + t = time.monotonic() + if hasattr(self, "last_pt_update"): + self.iter_count += 1 + dt = t - self.last_pt_update + if dt >= 5: + pt = dt/self.iter_count + self.set_dataset("picture_pt", pt, save=False, broadcast=True) + self.last_pt_update = t + self.iter_count = 0 + else: + self.last_pt_update = t + self.iter_count = 0 + + def run_local(self): + while True: + self.fps_meter() + data = self.camera_sim.get_picture() + if self.show_picture: + self.set_dataset("picture", data, save=False, broadcast=True) + if self.enable_fit: + self.transfer_parameters(remote_exec_processing.fit(data)) + self.scheduler.pause() + + def run_remote(self): + while True: + self.fps_meter() + self.transfer_parameters(self.camera_sim_rexec.call("get_and_fit")) + self.scheduler.pause() + + def run(self): + try: + if self.remote_exec: + self.run_remote() + else: + self.run_local() + except TerminationRequested: + pass diff --git a/examples/master/repository/remote_exec_processing.py b/examples/master/repository/remote_exec_processing.py new file mode 100644 index 000000000..6d02b14bf --- /dev/null +++ b/examples/master/repository/remote_exec_processing.py @@ -0,0 +1,30 @@ +import numpy as np +from numba import jit +from scipy.optimize import least_squares + + +@jit(nopython=True) +def compute_gaussian(r, img_w, img_h, + gaussian_w, gaussian_h, + gaussian_cx, gaussian_cy): + for y in range(img_h): + for x in range(img_w): + ds = ((gaussian_cx-x)/gaussian_w)**2 + ds += ((gaussian_cy-y)/gaussian_h)**2 + r[x, y] = np.exp(-ds/2) + + +def fit(data): + img_w, img_h = data.shape + def err(parameters): + r = np.empty((img_w, img_h)) + compute_gaussian(r, img_w, img_h, *parameters) + r -= data + return r.ravel() + guess = [12, 15, img_w/2, img_h/2] + res = least_squares(err, guess) + return res.x + + +def get_and_fit(): + return fit(controller_driver.get_picture())