def setup(self, win): win.setWindowTitle("Acconeer breathing example") win.resize(800, 600) self.env_plot = win.addPlot(title="Amplitude of IQ data and change") self.env_plot.setMenuEnabled(False) self.env_plot.setMouseEnabled(x=False, y=False) self.env_plot.hideButtons() self.env_plot.addLegend() self.env_plot.showGrid(x=True, y=True) self.env_curve = self.env_plot.plot( pen=utils.pg_pen_cycler(0), name="Amplitude of IQ data", ) self.delta_curve = self.env_plot.plot( pen=utils.pg_pen_cycler(1), name="Phase change between sweeps", ) self.peak_vline = pg.InfiniteLine( pen=pg.mkPen("k", width=2.5, style=QtCore.Qt.DashLine)) self.env_plot.addItem(self.peak_vline) self.peak_plot = win.addPlot(title="Phase of IQ at peak") self.peak_plot.setMenuEnabled(False) self.peak_plot.setMouseEnabled(x=False, y=False) self.peak_plot.hideButtons() utils.pg_setup_polar_plot(self.peak_plot, 1) self.peak_curve = self.peak_plot.plot(pen=utils.pg_pen_cycler(0)) self.peak_scatter = pg.ScatterPlotItem(brush=pg.mkBrush("k"), size=15) self.peak_plot.addItem(self.peak_scatter) self.peak_text_item = pg.TextItem(color=pg.mkColor("k"), anchor=(0, 1)) self.peak_plot.addItem(self.peak_text_item) self.peak_text_item.setPos(-1.15, -1.15) win.nextRow() self.zoom_plot = win.addPlot(title="Relative movement") self.zoom_plot.setMenuEnabled(False) self.zoom_plot.setMouseEnabled(x=False, y=False) self.zoom_plot.hideButtons() self.zoom_plot.showGrid(x=True, y=True) self.zoom_plot.setLabel("bottom", "Time (s)") self.zoom_plot.setLabel("left", "Movement (mm)") self.zoom_curve = self.zoom_plot.plot(pen=utils.pg_pen_cycler(0)) self.move_plot = win.addPlot(title="Breathing movement") self.move_plot.setMenuEnabled(False) self.move_plot.setMouseEnabled(x=False, y=False) self.move_plot.hideButtons() self.move_plot.showGrid(x=True, y=True) self.move_plot.setLabel("bottom", "Time (s)") self.move_plot.setLabel("left", "Movement (mm)") self.move_plot.setYRange(-2, 2) self.move_plot.setXRange(-self.hist_plot_len_s, 0) self.move_curve = self.move_plot.plot(pen=utils.pg_pen_cycler(0)) self.move_text_item = pg.TextItem(color=pg.mkColor("k"), anchor=(0, 1)) self.move_text_item.setPos(self.move_xs[0], -2) self.move_plot.addItem(self.move_text_item)
def setup(self, win): self.td_plot = win.addPlot(row=0, col=0, title="PSD input data") self.td_plot.setMenuEnabled(False) self.td_plot.setMouseEnabled(x=False, y=False) self.td_plot.hideButtons() self.td_plot.addLegend() self.td_curves = [] for i, depth in enumerate(self.depths): name = "{:.0f} cm".format(depth * 100) curve = self.td_plot.plot(pen=utils.pg_pen_cycler(i), name=name) self.td_curves.append(curve) self.collapsed_plot = win.addPlot( row=1, col=0, title="Collapsed sqrt(PSD)") self.collapsed_plot.setMenuEnabled(False) self.collapsed_plot.setMouseEnabled(x=False, y=False) self.collapsed_plot.hideButtons() self.collapsed_plot.setXRange(0, 1) self.collapsed_curve = self.collapsed_plot.plot(pen=utils.pg_pen_cycler()) self.collapsed_vline = pg.InfiniteLine(pen=utils.pg_pen_cycler()) self.collapsed_vline.hide() self.collapsed_plot.addItem(self.collapsed_vline) bg = pg.mkColor(0xFF, 0xFF, 0xFF, 150) self.collapsed_text = pg.TextItem(anchor=(0, 1), color="k", fill=bg) self.collapsed_text.setPos(0, 0) self.collapsed_text.setZValue(100) self.collapsed_plot.addItem(self.collapsed_text) self.collapsed_history_plot = win.addPlot( row=2, col=0, title="Collapsed sqrt(PSD) history") self.collapsed_history_plot.setMenuEnabled(False) self.collapsed_history_plot.setMouseEnabled(x=False, y=False) self.collapsed_history_plot.hideButtons() self.collapsed_history_im = pg.ImageItem() self.collapsed_history_im.setLookupTable(utils.pg_mpl_cmap("viridis")) self.collapsed_history_plot.addItem(self.collapsed_history_im) self.dw_plot = win.addPlot(row=3, col=0, title="Depthwise PSD") self.dw_plot.setMenuEnabled(False) self.dw_plot.setMouseEnabled(x=False, y=False) self.dw_plot.hideButtons() self.dw_im = pg.ImageItem() self.dw_im.setLookupTable(utils.pg_mpl_cmap("viridis")) self.dw_plot.addItem(self.dw_im) self.dw_plot.setLabel("bottom", "Depth (cm)") self.dw_plot.getAxis("bottom").setTickSpacing(6 * self.downsampling_factor, 6) self.setup_is_done = True self.update_processing_config()
def setup(self, win): num_sensors = len(self.sensor_config.sensor) self.ampl_plot = win.addPlot(row=0, col=0, colspan=num_sensors) self.ampl_plot.setMenuEnabled(False) self.ampl_plot.setMouseEnabled(x=False, y=False) self.ampl_plot.hideButtons() self.ampl_plot.showGrid(x=True, y=True) self.ampl_plot.setLabel("bottom", "Depth (m)") self.ampl_plot.setLabel("left", "Amplitude") self.ampl_plot.setXRange(*self.depths.take((0, -1))) self.ampl_plot.addLegend(offset=(-10, 10)) self.phase_plot = win.addPlot(row=1, col=0, colspan=num_sensors) self.phase_plot.setMenuEnabled(False) self.phase_plot.setMouseEnabled(x=False, y=False) self.phase_plot.hideButtons() self.phase_plot.showGrid(x=True, y=True) self.phase_plot.setLabel("bottom", "Depth (m)") self.phase_plot.setLabel("left", "Phase") self.phase_plot.setXRange(*self.depths.take((0, -1))) self.phase_plot.setYRange(-np.pi, np.pi) self.phase_plot.getAxis("left").setTicks(utils.pg_phase_ticks) self.ampl_curves = [] self.phase_curves = [] for i, sensor_id in enumerate(self.sensor_config.sensor): legend = "Sensor {}".format(sensor_id) pen = utils.pg_pen_cycler(i) ampl_curve = self.ampl_plot.plot(pen=pen, name=legend) phase_curve = self.phase_plot.plot(pen=pen) self.ampl_curves.append(ampl_curve) self.phase_curves.append(phase_curve) rate = self.sensor_config.update_rate xlabel = "Sweeps" if rate is None else "Time (s)" x_scale = 1.0 if rate is None else 1.0 / rate y_scale = self.depth_res x_offset = -self.processing_config.history_length * x_scale y_offset = self.depths[0] - 0.5 * self.depth_res is_single_sensor = len(self.sensor_config.sensor) == 1 self.history_plots = [] self.history_ims = [] for i, sensor_id in enumerate(self.sensor_config.sensor): title = None if is_single_sensor else "Sensor {}".format(sensor_id) plot = win.addPlot(row=2, col=i, title=title) plot.setMenuEnabled(False) plot.setMouseEnabled(x=False, y=False) plot.hideButtons() plot.setLabel("bottom", xlabel) plot.setLabel("left", "Depth (m)") im = pg.ImageItem(autoDownsample=True) im.setLookupTable(utils.pg_mpl_cmap("viridis")) im.resetTransform() im.translate(x_offset, y_offset) im.scale(x_scale, y_scale) plot.addItem(im) self.history_plots.append(plot) self.history_ims.append(im)
def setup(self, win): win.setWindowTitle("Acconeer IQ example") self.ampl_plot = win.addPlot() self.ampl_plot.setMenuEnabled(False) self.ampl_plot.showGrid(x=True, y=True) self.ampl_plot.setLabel("bottom", "Depth (m)") self.ampl_plot.setLabel("left", "Amplitude") win.nextRow() self.phase_plot = win.addPlot() self.phase_plot.setMenuEnabled(False) self.phase_plot.showGrid(x=True, y=True) self.phase_plot.setLabel("bottom", "Depth (m)") self.phase_plot.setLabel("left", "Phase") self.phase_plot.setYRange(-np.pi, np.pi) self.phase_plot.getAxis("left").setTicks(utils.pg_phase_ticks) self.ampl_curves = [] self.phase_curves = [] for i, _ in enumerate(self.sensor_config.sensor): pen = utils.pg_pen_cycler(i) self.ampl_curves.append(self.ampl_plot.plot(pen=pen)) self.phase_curves.append(self.phase_plot.plot(pen=pen)) self.smooth_max = utils.SmoothMax(self.sensor_config.update_rate)
def setup(self, win): self.plots = [] self.curves = [] for i in range(self.depths.size): title = "{:.0f} cm".format(100 * self.depths[i]) plot = win.addPlot(row=0, col=i, title=title) plot.setMenuEnabled(False) plot.setMouseEnabled(x=False, y=False) plot.hideButtons() plot.showGrid(x=True, y=True) plot.setYRange(0, 2**16) plot.hideAxis("left") plot.hideAxis("bottom") plot.plot(np.arange(self.sweeps_per_frame), 2**15 * np.ones(self.sweeps_per_frame)) curve = plot.plot(pen=utils.pg_pen_cycler()) self.plots.append(plot) self.curves.append(curve) self.ft_plot = win.addPlot(row=1, col=0, colspan=self.depths.size) self.ft_plot.setMenuEnabled(False) self.ft_plot.setMouseEnabled(x=False, y=False) self.ft_plot.hideButtons() self.ft_im = pg.ImageItem(autoDownsample=True) self.ft_im.setLookupTable(utils.pg_mpl_cmap("viridis")) self.ft_plot.addItem(self.ft_im) self.ft_plot.setLabel("bottom", "Depth (cm)") self.ft_plot.getAxis("bottom").setTickSpacing( 6 * self.downsampling_factor, 6) self.setup_is_done = True self.update_processing_config()
def setup(self, win): win.resize(800, 600) win.setWindowTitle("Acconeer sleep breathing estimation example") phi_title = "Breathing motion (detection range: {} m to {} m)" \ .format(*self.config.range_interval) self.phi_plot = win.addPlot(title=phi_title) self.phi_plot.setMenuEnabled(False) self.phi_plot.showGrid(x=True, y=True) self.phi_plot.setLabel("left", "Amplitude") self.phi_plot.setLabel("bottom", "Samples") self.phi_plot.addLegend() self.filt_phi_curve = self.phi_plot.plot( pen=utils.pg_pen_cycler(0), name="Filtered", ) self.raw_phi_curve = self.phi_plot.plot( pen=utils.pg_pen_cycler(1), name="Raw", ) win.nextRow() self.spect_plot = win.addPlot(title="Power spectrum") self.spect_plot.setMenuEnabled(False) self.spect_plot.showGrid(x=True, y=True) self.spect_plot.setLabel("left", "Power") self.spect_plot.setLabel("bottom", "Frequency (Hz)") self.spect_curve = self.spect_plot.plot(pen=utils.pg_pen_cycler(1)) self.spect_smax = utils.SmoothMax(self.config.update_rate / 15) self.spect_dft_inf_line = pg.InfiniteLine(pen=utils.pg_pen_cycler(1, "--")) self.spect_plot.addItem(self.spect_dft_inf_line) self.spect_est_inf_line = pg.InfiniteLine(pen=utils.pg_pen_cycler(0, "--")) self.spect_plot.addItem(self.spect_est_inf_line) self.spect_plot.setXRange(0, 1) self.spect_plot.setYRange(0, 1) self.spect_text_item = pg.TextItem("Initiating...", anchor=(0.5, 0.5), color="k") self.spect_text_item.setPos(0.5, 0.5) self.spect_plot.addItem(self.spect_text_item) win.nextRow() self.fest_plot = win.addPlot(title="Breathing estimation history") self.fest_plot.setMenuEnabled(False) self.fest_plot.showGrid(x=True, y=True) self.fest_plot.setLabel("left", "Frequency (Hz)") self.fest_plot.setLabel("bottom", "Samples") self.fest_plot.addLegend() self.fest_curve = self.fest_plot.plot( pen=utils.pg_pen_cycler(0), name="Breathing est.", ) self.fest_dft_curve = self.fest_plot.plot( pen=utils.pg_pen_cycler(1), name="DFT est.", ) self.fest_plot.setXRange(0, 1) self.fest_plot.setYRange(0, 0.5) self.fest_text_item = pg.TextItem(anchor=(0, 0), color="k") self.fest_text_item.setPos(0, 0.5) self.fest_plot.addItem(self.fest_text_item)
def generate_predciction_plots(self, labels, num): for label in labels: label_num = labels[label][1] if label_num < len(self.prediction_plots): continue else: pen = utils.pg_pen_cycler(label_num) self.prediction_plots.append( self.predictions_plot_window.plot(pen=pen, name=label))
def setup(self, win): win.setWindowTitle("Acconeer envelope example") self.plot = win.addPlot() self.plot.setMenuEnabled(False) self.plot.showGrid(x=True, y=True) self.plot.setLabel("bottom", "Depth (m)") self.plot.setLabel("left", "Amplitude") self.curves = [] for i, _ in enumerate(self.sensor_config.sensor): curve = self.plot.plot(pen=utils.pg_pen_cycler(i)) self.curves.append(curve) self.smooth_max = utils.SmoothMax(self.sensor_config.update_rate)
def setup(self, win): win.resize(800, 600) win.setWindowTitle("Acconeer phase tracking example") self.abs_plot = win.addPlot(row=0, col=0) self.abs_plot.setMenuEnabled(False) self.abs_plot.showGrid(x=True, y=True) self.abs_plot.setLabel("left", "Amplitude") self.abs_plot.setLabel("bottom", "Depth (m)") self.abs_curve = self.abs_plot.plot(pen=utils.pg_pen_cycler(0)) pen = utils.pg_pen_cycler(1) pen.setStyle(QtCore.Qt.DashLine) self.abs_inf_line = pg.InfiniteLine(pen=pen) self.abs_plot.addItem(self.abs_inf_line) self.arg_plot = win.addPlot(row=1, col=0) self.arg_plot.setMenuEnabled(False) self.arg_plot.showGrid(x=True, y=True) self.arg_plot.setLabel("bottom", "Depth (m)") self.arg_plot.setLabel("left", "Phase") self.arg_plot.setYRange(-np.pi, np.pi) self.arg_plot.getAxis("left").setTicks(utils.pg_phase_ticks) self.arg_curve = self.arg_plot.plot(pen=utils.pg_pen_cycler()) self.arg_inf_line = pg.InfiniteLine(pen=pen) self.arg_plot.addItem(self.arg_inf_line) self.iq_plot = win.addPlot(row=1, col=1, title="IQ at line") self.iq_plot.setMenuEnabled(False) utils.pg_setup_polar_plot(self.iq_plot, 1) self.iq_curve = self.iq_plot.plot(pen=utils.pg_pen_cycler()) self.iq_scatter = pg.ScatterPlotItem(brush=pg.mkBrush( utils.color_cycler()), size=15) self.iq_plot.addItem(self.iq_scatter) self.hist_plot = win.addPlot(row=0, col=1, colspan=2) self.hist_plot.setMenuEnabled(False) self.hist_plot.showGrid(x=True, y=True) self.hist_plot.setLabel("bottom", "Time (s)") self.hist_plot.setLabel("left", "Tracking (mm)") self.hist_curve = self.hist_plot.plot(pen=utils.pg_pen_cycler()) self.hist_plot.setYRange(-5, 5) self.hist_zoom_plot = win.addPlot(row=1, col=2) self.hist_zoom_plot.setMenuEnabled(False) self.hist_zoom_plot.showGrid(x=True, y=True) self.hist_zoom_plot.setLabel("bottom", "Time (s)") self.hist_zoom_plot.setLabel("left", "Tracking (mm)") self.hist_zoom_curve = self.hist_zoom_plot.plot( pen=utils.pg_pen_cycler()) self.hist_zoom_plot.setYRange(-0.5, 0.5) self.first = True
def setup(self, win): win.setWindowTitle("Acconeer power bins example") self.plot = win.addPlot() self.plot.setMenuEnabled(False) self.plot.showGrid(x=True, y=True) self.plot.setLabel("bottom", "Depth (m)") self.plot.setLabel("left", "Amplitude") self.curves = [] for i, _ in enumerate(self.sensor_config.sensor): curve = self.plot.plot( pen=utils.pg_pen_cycler(i), symbol="o", symbolPen="k", symbolBrush=pg.mkBrush(utils.color_cycler(i)), ) self.curves.append(curve) self.smooth_max = utils.SmoothMax(self.sensor_config.update_rate)
def setup(self, win): win.setWindowTitle("Acconeer presence detection example") self.limit_lines = [] dashed_pen = pg.mkPen("k", width=2.5, style=QtCore.Qt.DashLine) # Data plot self.data_plot = win.addPlot( row=0, col=0, title="Frame (blue), fast (orange), and slow (green)", ) self.data_plot.setMenuEnabled(False) self.data_plot.setMouseEnabled(x=False, y=False) self.data_plot.hideButtons() self.data_plot.showGrid(x=True, y=True) self.data_plot.setLabel("bottom", "Depth (m)") self.data_plot.setLabel("left", "Amplitude") self.data_plot.setYRange(0, 2**16) self.frame_scatter = pg.ScatterPlotItem( size=10, brush=utils.pg_brush_cycler(0), ) self.fast_scatter = pg.ScatterPlotItem( size=10, brush=utils.pg_brush_cycler(1), ) self.slow_scatter = pg.ScatterPlotItem( size=10, brush=utils.pg_brush_cycler(2), ) self.data_plot.addItem(self.frame_scatter) self.data_plot.addItem(self.fast_scatter) self.data_plot.addItem(self.slow_scatter) self.frame_smooth_limits = utils.SmoothLimits( self.sensor_config.update_rate) # Noise estimation plot self.noise_plot = win.addPlot( row=1, col=0, title="Noise", ) self.noise_plot.setMenuEnabled(False) self.noise_plot.setMouseEnabled(x=False, y=False) self.noise_plot.hideButtons() self.noise_plot.showGrid(x=True, y=True) self.noise_plot.setLabel("bottom", "Depth (m)") self.noise_plot.setLabel("left", "Amplitude") self.noise_curve = self.noise_plot.plot(pen=utils.pg_pen_cycler()) self.noise_smooth_max = utils.SmoothMax(self.sensor_config.update_rate) # Depthwise presence plot self.move_plot = win.addPlot( row=2, col=0, title="Depthwise presence", ) self.move_plot.setMenuEnabled(False) self.move_plot.setMouseEnabled(x=False, y=False) self.move_plot.hideButtons() self.move_plot.showGrid(x=True, y=True) self.move_plot.setLabel("bottom", "Depth (m)") self.move_plot.setLabel("left", "Norm. ampl.") zero_curve = self.move_plot.plot(self.depths, np.zeros_like(self.depths)) self.inter_curve = self.move_plot.plot() self.total_curve = self.move_plot.plot() self.move_smooth_max = utils.SmoothMax( self.sensor_config.update_rate, tau_decay=1.0, tau_grow=0.25, ) self.move_depth_line = pg.InfiniteLine(pen=pg.mkPen("k", width=1.5)) self.move_depth_line.hide() self.move_plot.addItem(self.move_depth_line) limit_line = pg.InfiniteLine(angle=0, pen=dashed_pen) self.move_plot.addItem(limit_line) self.limit_lines.append(limit_line) fbi = pg.FillBetweenItem( zero_curve, self.inter_curve, brush=utils.pg_brush_cycler(0), ) self.move_plot.addItem(fbi) fbi = pg.FillBetweenItem( self.inter_curve, self.total_curve, brush=utils.pg_brush_cycler(1), ) self.move_plot.addItem(fbi) # Presence history plot self.move_hist_plot = pg.PlotItem(title="Presence history") self.move_hist_plot.setMenuEnabled(False) self.move_hist_plot.setMouseEnabled(x=False, y=False) self.move_hist_plot.hideButtons() self.move_hist_plot.showGrid(x=True, y=True) self.move_hist_plot.setLabel("bottom", "Time (s)") self.move_hist_plot.setLabel( "left", "Score (limited to {})".format(OUTPUT_MAX)) self.move_hist_plot.setXRange(-self.history_length_s, 0) self.move_hist_plot.setYRange(0, OUTPUT_MAX) self.move_hist_curve = self.move_hist_plot.plot( pen=utils.pg_pen_cycler()) limit_line = pg.InfiniteLine(angle=0, pen=dashed_pen) self.move_hist_plot.addItem(limit_line) self.limit_lines.append(limit_line) self.present_html_format = '<div style="text-align: center">' \ '<span style="color: #FFFFFF;font-size:15pt;">' \ "{}</span></div>" not_present_html = '<div style="text-align: center">' \ '<span style="color: #FFFFFF;font-size:15pt;">' \ "{}</span></div>".format("No presence detected") self.present_text_item = pg.TextItem( fill=pg.mkColor(0xff, 0x7f, 0x0e, 200), anchor=(0.5, 0), ) self.not_present_text_item = pg.TextItem( html=not_present_html, fill=pg.mkColor(0x1f, 0x77, 0xb4, 180), anchor=(0.5, 0), ) pos = (-self.history_length_s / 2, 0.95 * OUTPUT_MAX) self.present_text_item.setPos(*pos) self.not_present_text_item.setPos(*pos) self.move_hist_plot.addItem(self.present_text_item) self.move_hist_plot.addItem(self.not_present_text_item) self.present_text_item.hide() # Sector plot self.sector_plot = pg.PlotItem() self.sector_plot.setAspectLocked() self.sector_plot.hideAxis("left") self.sector_plot.hideAxis("bottom") self.sectors = [] pen = pg.mkPen("k", width=1) span_deg = 25 for r in np.flip(np.arange(self.num_sectors) + 1): sector = pg.QtGui.QGraphicsEllipseItem(-r, -r, r * 2, r * 2) sector.setStartAngle(-16 * span_deg) sector.setSpanAngle(16 * span_deg * 2) sector.setPen(pen) self.sector_plot.addItem(sector) self.sectors.append(sector) self.sectors.reverse() sublayout = win.addLayout(row=3, col=0) sublayout.layout.setColumnStretchFactor(0, 2) sublayout.addItem(self.move_hist_plot, col=0) sublayout.addItem(self.sector_plot, col=1) self.setup_is_done = True self.update_processing_config()
def setup(self, win): win.setWindowTitle("Acconeer Button Press Example") self.limit_lines = [] dashed_pen = pg.mkPen("k", width=2.5, style=QtCore.Qt.DashLine) self.sign_hist_plot = win.addPlot(title="Signal history") self.sign_hist_plot.setMenuEnabled(False) self.sign_hist_plot.addLegend() self.sign_hist_plot.showGrid(x=True, y=True) self.sign_hist_plot.setLabel("bottom", "Time (s)") self.sign_hist_plot.setXRange(-HISTORY_LENGTH_S, 0) self.sign_hist_plot.setYRange(0, OUTPUT_MAX_SIGNAL) self.sign_hist_curve = self.sign_hist_plot.plot( pen=utils.pg_pen_cycler(0), name="Envelope signal", ) self.sign_lp_hist_curve = self.sign_hist_plot.plot( pen=utils.pg_pen_cycler(1), name="Filtered envelope signal", ) win.nextRow() self.rel_dev_hist_plot = win.addPlot(title="Relative deviation history") self.rel_dev_hist_plot.setMenuEnabled(False) self.rel_dev_hist_plot.showGrid(x=True, y=True) self.rel_dev_hist_plot.setLabel("bottom", "Time (s)") self.rel_dev_hist_plot.setXRange(-HISTORY_LENGTH_S, 0) self.rel_dev_hist_plot.setYRange(0, OUTPUT_MAX_REL_DEV) self.rel_dev_lp_hist_curve = self.rel_dev_hist_plot.plot( pen=utils.pg_pen_cycler(0), name="Relative deviation", ) self.detection_dots = self.rel_dev_hist_plot.plot( pen=None, symbol='o', symbolSize=20, symbolBrush=utils.color_cycler(1), name="Detections", ) self.rel_dev_hist_plot.addItem(self.detection_dots) limit_line = pg.InfiniteLine(angle=0, pen=dashed_pen) self.rel_dev_hist_plot.addItem(limit_line) self.limit_lines.append(limit_line) self.detection_html_format = '<div style="text-align: center">' \ '<span style="color: #FFFFFF;font-size:16pt;">' \ '{}</span></div>' detection_html = self.detection_html_format.format("Button press detected!") self.detection_text_item = pg.TextItem( html=detection_html, fill=pg.mkColor(255, 140, 0), anchor=(0.5, 0), ) self.detection_text_item.setPos(-HISTORY_LENGTH_S / 2, 0.95 * OUTPUT_MAX_REL_DEV) self.rel_dev_hist_plot.addItem(self.detection_text_item) self.detection_text_item.hide() self.smooth_max_signal = utils.SmoothMax( self.sensor_config.update_rate, hysteresis=0.6, tau_decay=3, ) self.smooth_max_rel_dev = utils.SmoothMax( self.sensor_config.update_rate, hysteresis=0.6, tau_decay=3, ) self.setup_is_done = True self.update_processing_config()
def setup(self, win): num_sensors = len(self.sensor_config.sensor) self.ampl_plot = win.addPlot(row=0, colspan=num_sensors) self.ampl_plot.setMenuEnabled(False) self.ampl_plot.setMouseEnabled(x=False, y=False) self.ampl_plot.hideButtons() self.ampl_plot.showGrid(x=True, y=True) self.ampl_plot.setLabel("bottom", "Depth (m)") self.ampl_plot.setLabel("left", "Amplitude") self.ampl_plot.setXRange(*self.depths.take((0, -1))) self.ampl_plot.setYRange(0, 1) # To avoid rendering bug self.ampl_plot.addLegend(offset=(-10, 10)) self.ampl_curves = [] self.bg_curves = [] self.peak_lines = [] for i, sensor_id in enumerate(self.sensor_config.sensor): legend = "Sensor {}".format(sensor_id) ampl_curve = self.ampl_plot.plot(pen=utils.pg_pen_cycler(i), name=legend) bg_curve = self.ampl_plot.plot(pen=utils.pg_pen_cycler(i, style="--")) color_tuple = utils.hex_to_rgb_tuple(utils.color_cycler(i)) peak_line = pg.InfiniteLine(pen=pg.mkPen(pg.mkColor(*color_tuple, 150), width=2)) self.ampl_plot.addItem(peak_line) self.ampl_curves.append(ampl_curve) self.bg_curves.append(bg_curve) self.peak_lines.append(peak_line) bg = pg.mkColor(0xFF, 0xFF, 0xFF, 150) self.peak_text = pg.TextItem(anchor=(0, 1), color="k", fill=bg) self.peak_text.setPos(self.depths[0], 0) self.peak_text.setZValue(100) self.ampl_plot.addItem(self.peak_text) rate = self.sensor_config.update_rate xlabel = "Sweeps" if rate is None else "Time (s)" x_scale = 1.0 if rate is None else 1.0 / rate y_scale = self.depth_res x_offset = -self.processing_config.history_length * x_scale y_offset = self.depths[0] - 0.5 * self.depth_res is_single_sensor = len(self.sensor_config.sensor) == 1 self.history_plots = [] self.history_ims = [] for i, sensor_id in enumerate(self.sensor_config.sensor): title = None if is_single_sensor else "Sensor {}".format(sensor_id) plot = win.addPlot(row=1, col=i, title=title) plot.setMenuEnabled(False) plot.setMouseEnabled(x=False, y=False) plot.hideButtons() plot.setLabel("bottom", xlabel) plot.setLabel("left", "Depth (m)") im = pg.ImageItem(autoDownsample=True) im.setLookupTable(utils.pg_mpl_cmap("viridis")) im.resetTransform() im.translate(x_offset, y_offset) im.scale(x_scale, y_scale) plot.addItem(im) self.history_plots.append(plot) self.history_ims.append(im) self.setup_is_done = True self.update_processing_config()
def setup(self, win): win.setWindowTitle("Acconeer Parking Detector") # Sweep Plot self.sweep_plot = win.addPlot(title="Sweep") self.sweep_plot.setMenuEnabled(False) self.sweep_plot.setMouseEnabled(x=False, y=False) self.sweep_plot.hideButtons() self.sweep_plot.showGrid(x=True, y=True) self.sweep_plot.addLegend(offset=(-10, 10)) self.sweep_plot.setLabel("bottom", "Distance (cm)") self.sweep_plot.setLabel("left", "Amplitude") self.sweep_plot.setYRange(0, 2000) self.sweep_plot.setXRange(100.0 * self.depths[0], 100.0 * self.depths[-1]) self.sweep_curve = self.sweep_plot.plot( pen=utils.pg_pen_cycler(0), name="Envelope sweep", ) self.sweep_background = self.sweep_plot.plot( pen=utils.pg_pen_cycler(2), name="Background estimate", ) self.leak_estimate = self.sweep_plot.plot( pen=None, symbol="o", symbolSize=8, symbolPen="k", symbolBrush=utils.color_cycler(1), name="Leak estimate", ) # To show the legend correctly before the first update self.leak_estimate.setData([], []) self.smooth_max_sweep = utils.SmoothMax( self.sensor_config.update_rate, hysteresis=0.6, tau_decay=5, ) win.nextRow() # Reflector weight Plot self.weight_plot = win.addPlot(title="Reflection observables") self.weight_plot.setMenuEnabled(False) self.weight_plot.setMouseEnabled(x=False, y=False) self.weight_plot.hideButtons() self.weight_plot.showGrid(x=True, y=True) self.weight_plot.addLegend(offset=(-10, 10)) self.weight_plot.setLabel("bottom", "Distance (cm)") self.weight_plot.setLabel("left", "Weight") self.weight_plot.setYRange(0, 500) self.weight_plot.setXRange(100.0 * self.depths[0], 100.0 * self.depths[-1]) self.detection_html_format = '<div style="text-align: center">' \ '<span style="color: #FFFFFF;font-size:16pt;">' \ '{}</span></div>' detection_html = self.detection_html_format.format( "Parked car detected!") self.detection_text_item = pg.TextItem( html=detection_html, fill=pg.mkColor(255, 140, 0), anchor=(0.5, 0), ) self.weight_plot.addItem(self.detection_text_item) self.detection_text_item.hide() self.weight_curve = self.weight_plot.plot( pen=utils.pg_pen_cycler(0), name="Reflector weight", ) self.limits_center = None self.detection_limits = self.weight_plot.plot( pen=utils.pg_pen_cycler(3), name="Detection limits", ) self.limit_line = pg.InfiniteLine(angle=0, pen=utils.pg_pen_cycler(3, "--")) self.weight_plot.addItem(self.limit_line) self.trailing_sweeps = self.weight_plot.plot( pen=None, symbol="o", symbolSize=8, symbolPen="k", symbolBrush=utils.color_cycler(2), name="Queued sweep", ) self.current_sweep = self.weight_plot.plot( pen=None, symbol="o", symbolSize=8, symbolPen="k", symbolBrush=utils.color_cycler(1), name="Last sweep", ) # To show the legends correctly before the first update self.trailing_sweeps.setData([], []) self.current_sweep.setData([], []) self.smooth_max_weight = utils.SmoothMax( self.sensor_config.update_rate, hysteresis=0.6, tau_decay=5, ) win.nextRow() # Detection history Plot self.hist_plot = win.addPlot(title="Detection history") self.hist_plot.setMenuEnabled(False) self.hist_plot.setMouseEnabled(x=False, y=False) self.hist_plot.hideButtons() self.hist_plot.showGrid(x=True, y=False) self.hist_plot.hideAxis("left") self.hist_plot.setLabel("bottom", "Time (s)") self.hist_plot.setYRange(-0.5, 1.5) self.true_text_item = pg.TextItem("True", color=pg.mkColor(0, 0, 0), anchor=(0, 0.5)) self.true_text_item.setPos( 0.01 * self.processing_config.history_length_s, 1) self.false_text_item = pg.TextItem("False", color=pg.mkColor(0, 0, 0), anchor=(0, 0.5)) self.false_text_item.setPos( 0.01 * self.processing_config.history_length_s, 0) self.hist_plot.addItem(self.true_text_item) self.hist_plot.addItem(self.false_text_item) self.hist_dots = self.hist_plot.plot( pen=None, symbol="o", symbolSize=5, symbolPen="k", symbolBrush=utils.color_cycler(0), ) win.layout.setRowStretchFactor(0, 8) win.layout.setRowStretchFactor(1, 9) self.update_processing_config()
def setup(self, win): # Data plots self.data_plots = [] self.data_curves = [] for i in range(self.num_depths): title = "{:.0f} cm".format(100 * self.depths[i]) plot = win.addPlot(row=0, col=i, title=title) plot.setMenuEnabled(False) plot.showGrid(x=True, y=True) plot.setYRange(0, 2**16) plot.hideAxis("left") plot.hideAxis("bottom") plot.plot(np.arange(self.sweeps_per_frame), 2**15 * np.ones(self.sweeps_per_frame)) curve = plot.plot(pen=utils.pg_pen_cycler()) self.data_plots.append(plot) self.data_curves.append(curve) # Spectral density plot self.sd_plot = win.addPlot(row=1, col=0, colspan=self.num_depths) self.sd_plot.setMenuEnabled(False) self.sd_plot.setLabel("left", "Normalized PSD (dB)") self.sd_plot.showGrid(x=True, y=True) self.sd_curve = self.sd_plot.plot(pen=utils.pg_pen_cycler()) dashed_pen = pg.mkPen("k", width=2, style=QtCore.Qt.DashLine) self.sd_threshold_line = pg.InfiniteLine(angle=0, pen=dashed_pen) self.sd_plot.addItem(self.sd_threshold_line) self.smooth_max = utils.SmoothMax( self.est_update_rate, tau_decay=0.5, tau_grow=0, hysteresis=0.2, ) # Rolling speed plot self.vel_plot = pg.PlotItem() self.vel_plot.setMenuEnabled(False) self.vel_plot.setLabel("bottom", "Time (s)") self.vel_plot.showGrid(x=True, y=True) self.vel_plot.setXRange(-EST_VEL_HISTORY_LENGTH, 0) self.vel_max_line = pg.InfiniteLine(angle=0, pen=pg.mkPen("k", width=1)) self.vel_plot.addItem(self.vel_max_line) self.vel_scatter = pg.ScatterPlotItem(size=8) self.vel_plot.addItem(self.vel_scatter) self.vel_html_fmt = '<span style="color:#000;font-size:24pt;">{:.1f} {}</span>' self.vel_text_item = pg.TextItem(anchor=(0.5, 0)) self.vel_plot.addItem(self.vel_text_item) # Sequence speed plot self.sequences_plot = pg.PlotItem() self.sequences_plot.setMenuEnabled(False) self.sequences_plot.setLabel("bottom", "History") self.sequences_plot.showGrid(y=True) self.sequences_plot.setXRange(-NUM_SAVED_SEQUENCES + 0.5, 0.5) tmp = np.flip(np.arange(NUM_SAVED_SEQUENCES) == 0) brushes = [pg.mkBrush(utils.color_cycler(n)) for n in tmp] self.bar_graph = pg.BarGraphItem( x=np.arange(-NUM_SAVED_SEQUENCES, 0) + 1, height=np.zeros(NUM_SAVED_SEQUENCES), width=0.8, brushes=brushes, ) self.sequences_plot.addItem(self.bar_graph) self.sequences_text_item = pg.TextItem(anchor=(0.5, 0)) self.sequences_plot.addItem(self.sequences_text_item) sublayout = win.addLayout(row=2, col=0, colspan=self.num_depths) sublayout.addItem(self.vel_plot, col=0) sublayout.addItem(self.sequences_plot, col=1) self.setup_is_done = True self.update_processing_config()
def setup(self, win): win.setWindowTitle("Acconeer Distance Detector") # Sweep Plot self.sweep_plot = win.addPlot(title="Sweep and threshold") self.sweep_plot.setMenuEnabled(False) self.sweep_plot.setMouseEnabled(x=False, y=False) self.sweep_plot.hideButtons() self.sweep_plot.showGrid(x=True, y=True) self.sweep_plot.addLegend() self.sweep_plot.setLabel("bottom", "Distance (cm)") self.sweep_plot.setYRange(0, 20000) self.sweep_plot.setXRange(100.0 * self.r[0], 100.0 * self.r[-1]) self.sweep_curve = self.sweep_plot.plot( pen=utils.pg_pen_cycler(5), name="Envelope sweep", ) self.mean_sweep_curve = self.sweep_plot.plot( pen=utils.pg_pen_cycler(0, width=3), name="Mean Envelope sweep", ) self.threshold_curve = self.sweep_plot.plot( pen=utils.pg_pen_cycler(1), name="Threshold", ) self.smooth_max_sweep = utils.SmoothMax( self.sensor_config.update_rate, hysteresis=0.6, tau_decay=3, ) self.peak_lines = [] for i in range(3): color_idx = 1 if i > 0 else 0 width = 2 if i == 0 else 1 color_tuple = utils.hex_to_rgb_tuple(utils.color_cycler(color_idx)) line = pg.InfiniteLine( pen=pg.mkPen(pg.mkColor(*color_tuple, 150), width=width)) self.sweep_plot.addItem(line) self.peak_lines.append(line) self.peak_text = pg.TextItem( anchor=(0, 1), color=utils.color_cycler(0), fill=pg.mkColor(0xFF, 0xFF, 0xFF, 150), ) self.peak_text.setPos(self.r[0] * 100, 0) self.peak_text.setZValue(100) self.sweep_plot.addItem(self.peak_text) win.nextRow() # Detection history Plot self.hist_plot = win.addPlot(title="Detected peaks") self.hist_plot.setMenuEnabled(False) self.hist_plot.setMouseEnabled(x=False, y=False) self.hist_plot.hideButtons() self.hist_plot.showGrid(x=True, y=True) self.hist_plot.addLegend() self.hist_plot.setLabel("bottom", "Time history (s)") self.hist_plot.setLabel("left", "Distance (cm)") self.hist_plot.setXRange(-10, 0) self.hist_plot.setYRange(100.0 * self.r[0], 100.0 * self.r[-1]) self.main_peak = self.hist_plot.plot( pen=None, symbol="o", symbolSize=8, symbolPen="k", symbolBrush=utils.color_cycler(0), name="Main peak", ) self.minor_peaks = self.hist_plot.plot( pen=None, symbol="o", symbolSize=5, symbolPen="k", symbolBrush=utils.color_cycler(1), name="Minor peaks", ) self.first_distance_above_threshold = self.hist_plot.plot( pen=None, symbol="o", symbolSize=3, symbolPen="k", symbolBrush=utils.color_cycler(2), name="First distance above threshold", visible=False, ) self.setup_is_done = True
def setup(self, win): win.setWindowTitle("Acconeer Distance Detector") # Sweep Plot self.sweep_plot = win.addPlot(title="Sweep and threshold") self.sweep_plot.showGrid(x=True, y=True) self.sweep_plot.addLegend() self.sweep_plot.setLabel("bottom", "Distance (cm)") self.sweep_plot.setYRange(0, 20000) self.sweep_plot.setXRange(100.0 * self.r[0], 100.0 * self.r[-1]) self.sweep_curve = self.sweep_plot.plot( pen=utils.pg_pen_cycler(5), name="Envelope sweep", ) self.mean_sweep_curve = self.sweep_plot.plot( pen=utils.pg_pen_cycler(0, width=3), name="Mean Envelope sweep", ) self.threshold_curve = self.sweep_plot.plot( pen=utils.pg_pen_cycler(1), name="Threshold", ) self.smooth_max_sweep = utils.SmoothMax( self.sensor_config.update_rate, hysteresis=0.6, tau_decay=3, ) win.nextRow() # Detection history Plot self.hist_plot = win.addPlot(title="Detected peaks") self.hist_plot.showGrid(x=True, y=True) self.hist_plot.addLegend() self.hist_plot.setLabel("bottom", "Time history (s)") self.hist_plot.setLabel("left", "Distance (cm)") self.hist_plot.setXRange(-10, 0) self.hist_plot.setYRange(100.0 * self.r[0], 100.0 * self.r[-1]) self.main_peak = self.hist_plot.plot( pen=None, symbol="o", symbolSize=8, symbolPen='k', symbolBrush=utils.color_cycler(0), name="Main peak", ) self.minor_peaks = self.hist_plot.plot( pen=None, symbol='o', symbolSize=5, symbolPen='k', symbolBrush=utils.color_cycler(1), name="Minor peaks", ) self.setup_is_done = True