def setup(self, win):
        win.setWindowTitle("Acconeer envelope mode example")
        self.envelope_plot_window = win.addPlot(row=0, col=0, title="Envelope",
                                                colspan=self.num_sensors)
        self.envelope_plot_window.showGrid(x=True, y=True)
        self.envelope_plot_window.addLegend(offset=(-10, 10))
        self.envelope_plot_window.setYRange(0, 1)
        self.envelope_plot_window.setLabel("left", "Amplitude")
        self.envelope_plot_window.setLabel("bottom", "Distance (mm)")

        self.peak_text = pg.TextItem(text="", color=(1, 1, 1), anchor=(0, 1), fill="#f0f0f0")
        self.peak_text.setZValue(3)
        self.envelope_plot_window.addItem(self.peak_text)

        self.envelope_plots = []
        self.peak_vlines = []
        self.clutter_plots = []
        self.hist_plot_images = []
        self.hist_plots = []
        self.hist_plot_peaks = []

        lut = example_utils.pg_mpl_cmap("viridis")
        hist_pen = example_utils.pg_pen_cycler(1)

        for s in range(self.num_sensors):
            legend_text = "Sensor {}".format(self.sensor_config.sensor[s])
            pen = example_utils.pg_pen_cycler(s+1)
            self.envelope_plots.append(
                self.envelope_plot_window.plot(range(10), np.zeros(10), pen=pen, name=legend_text)
                )
            self.peak_vlines.append(
                pg.InfiniteLine(pos=0, angle=90, pen=pg.mkPen(width=2, style=QtCore.Qt.DotLine))
                )
            self.envelope_plot_window.addItem(self.peak_vlines[s])

            hist_title = "Envelope history"
            if self.num_sensors == 1:
                pen = pg.mkPen(0.2, width=2, style=QtCore.Qt.DotLine)
                self.clutter_plots.append(
                    self.envelope_plot_window.plot(
                        range(10),
                        np.zeros(10),
                        pen=pen,
                        name="Background")
                    )
                self.clutter_plots[0].setZValue(2)
            else:
                hist_title = "History {}".format(legend_text)

            self.hist_plot_images.append(win.addPlot(row=2, col=s,
                                                     title=hist_title))
            self.hist_plot_images[s].setLabel("left", "Distance (mm)")
            self.hist_plot_images[s].setLabel("bottom", "Time (s)")
            self.hist_plots.append(pg.ImageItem())
            self.hist_plots[s].setAutoDownsample(True)
            self.hist_plots[s].setLookupTable(lut)
            self.hist_plot_images[s].addItem(self.hist_plots[s])

            self.hist_plot_peaks.append(
                self.hist_plot_images[s].plot(range(10), np.zeros(10), pen=hist_pen))
Exemple #2
0
    def setup(self, win):
        win.resize(1600, 1000)
        win.setWindowTitle("Track distance example")

        # Plot amplitude from data and the tracked distance
        self.distance_plot = win.addPlot(row=0, col=0, colspan=2)
        self.distance_plot.showGrid(x=True, y=True)
        self.distance_plot.setLabel("left", "Amplitude")
        self.distance_plot.setLabel("bottom", "Depth (m)")
        self.distance_curve = self.distance_plot.plot(pen=example_utils.pg_pen_cycler(0))
        pen = example_utils.pg_pen_cycler(1)
        pen.setStyle(QtCore.Qt.DashLine)
        self.distance_inf_line = pg.InfiniteLine(pen=pen)
        self.distance_plot.addItem(self.distance_inf_line)

        # Dynamic plot to show breath over time
        # self.distance_over_time_plot = win.addPlot(row=1, col=0)
        # self.distance_over_time_plot.showGrid(x=True, y=True)
        # self.distance_over_time_plot.setLabel("left", "Distance")
        # self.distance_over_time_plot.setLabel("bottom", "Time (s)")
        # self.distance_over_time_curve = self.distance_over_time_plot.plot(
        #     pen=example_utils.pg_pen_cycler(0))
        # self.distance_over_time_plot.setYRange(-8, 8)

        # Plot for tracked distance over time
        # self.distance_over_time_plot2 = win.addPlot(row=1, col=1)
        # self.distance_over_time_plot2.showGrid(x=True, y=True)
        # self.distance_over_time_plot2.setLabel("left", "Distance")
        # self.distance_over_time_plot2.setLabel("bottom", "Time (s)")
        # self.distance_over_time_curve2 = self.distance_over_time_plot2.plot(
        #     pen=example_utils.pg_pen_cycler(0))
        # self.distance_over_time_plot2.setYRange(0.4, 1.5)

        self.smooth_max = example_utils.SmoothMax(self.config.sweep_rate)
        self.first = True
    def setup(self, win):
        win.setWindowTitle("Acconeer presence detection example")

        self.env_plot = win.addPlot(title="Burst mean of Envelope²")
        self.env_plot.showGrid(x=True, y=True)
        self.env_plot.setLabel("bottom", "Depth (m)")
        self.env_curve = self.env_plot.plot(pen=example_utils.pg_pen_cycler(0))
        self.env_smooth_max = example_utils.SmoothMax(self.config.sweep_rate /
                                                      10)

        win.nextRow()
        move_hist_plot = win.addPlot(title="Changes in received power")
        move_hist_plot.showGrid(x=True, y=True)
        move_hist_plot.setLabel("bottom", "Time(s)")
        move_hist_plot.setXRange(-5, 0)
        move_hist_plot.setYRange(0, 1)
        self.move_hist_curve = move_hist_plot.plot(
            pen=example_utils.pg_pen_cycler(0))
        self.move_hist_smooth_max = example_utils.SmoothMax(
            self.config.sweep_rate / 10)
        limit_pen = pg.mkPen("k", width=2.5, style=QtCore.Qt.DashLine)
        limit_line = pg.InfiniteLine(self.threshold, angle=0, pen=limit_pen)
        move_hist_plot.addItem(limit_line)
        self.move_hist_text = pg.TextItem(color=pg.mkColor("k"),
                                          anchor=(0.5, 0))
        self.move_hist_text.setPos(-2.5, 0.95)
        move_hist_plot.addItem(self.move_hist_text)
Exemple #4
0
    def setup(self, win):
        win.setWindowTitle("Acconeer breathing example")
        win.resize(800, 600)

        self.peak_plot = win.addPlot(title="IQ at peak")
        example_utils.pg_setup_polar_plot(self.peak_plot, 0.3)
        self.peak_curve = self.peak_plot.plot(
            pen=example_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(-0.3 * 1.15, -0.3 * 1.15)

        self.env_plot = win.addPlot(title="Envelope and delta")
        self.env_plot.addLegend()
        self.env_plot.showGrid(x=True, y=True)
        self.env_plot.setYRange(0, 0.3)
        self.env_curve = self.env_plot.plot(
            pen=example_utils.pg_pen_cycler(0),
            name="Envelope",
        )
        self.delta_curve = self.env_plot.plot(
            pen=example_utils.pg_pen_cycler(1),
            name="Phase delta",
        )
        self.peak_vline = pg.InfiniteLine(
            pen=pg.mkPen("k", width=2.5, style=QtCore.Qt.DashLine))
        self.env_plot.addItem(self.peak_vline)

        win.nextRow()
        self.move_plot = win.addPlot(title="Breathing movement")
        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=example_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)

        self.zoom_plot = win.addPlot(title="Relative movement")
        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=example_utils.pg_pen_cycler(0))
    def setup(self, win):
        win.setWindowTitle("Acconeer obstacle detection example")

        self.env_ax = win.addPlot(row=0, col=0, title="Envelope and max FFT")
        self.env_ax.setLabel("bottom", "Depth (cm)")
        self.env_ax.setXRange(*(self.config.range_interval * 100))
        self.env_ax.showGrid(True, True)
        self.env_ax.addLegend()
        self.env_ax.setYRange(0, 0.1)

        self.env_ampl = self.env_ax.plot(pen=example_utils.pg_pen_cycler(0),
                                         name="Envelope")
        self.fft_max = self.env_ax.plot(pen=example_utils.pg_pen_cycler(
            1, "--"),
                                        name="FFT max")

        self.peak_dist_text = pg.TextItem(color="k", anchor=(0, 1))
        self.env_ax.addItem(self.peak_dist_text)
        self.peak_dist_text.setPos(self.config.range_start * 100, 0)
        self.peak_dist_text.setZValue(3)

        self.env_peak_vline = pg.InfiniteLine(pos=0,
                                              angle=90,
                                              pen=pg.mkPen(
                                                  width=2,
                                                  style=QtCore.Qt.DotLine))
        self.env_ax.addItem(self.env_peak_vline)

        self.obstacle_ax = win.addPlot(row=1, col=0, title="Obstacle map")
        self.obstacle_im = pg.ImageItem()
        self.obstacle_ax.setLabel("bottom", "Velocity (cm/s)")
        self.obstacle_ax.setLabel("left", "Distance (cm)")
        self.obstacle_im.setLookupTable(example_utils.pg_mpl_cmap("viridis"))
        self.obstacle_ax.addItem(self.obstacle_im)

        self.obstacle_ax.setXRange(-self.max_velocity, self.max_velocity)
        self.obstacle_ax.setYRange(*self.config.range_interval * 100)

        self.obstacle_peak = pg.ScatterPlotItem(brush=pg.mkBrush("k"), size=15)
        self.obstacle_ax.addItem(self.obstacle_peak)

        self.peak_fft_text = pg.TextItem(color="w", anchor=(0, 1))
        self.obstacle_ax.addItem(self.peak_fft_text)
        self.peak_fft_text.setPos(-self.max_velocity,
                                  self.config.range_start * 100)

        self.smooth_max = example_utils.SmoothMax(self.config.sweep_rate,
                                                  tau_decay=1,
                                                  tau_grow=0.2)
Exemple #6
0
    def setup(self, win):
        win.setWindowTitle("Acconeer presence detection example")

        dashed_pen = pg.mkPen("k", width=2.5, style=QtCore.Qt.DashLine)

        self.move_plot = win.addPlot(title="Movement")
        self.move_plot.showGrid(x=True, y=True)
        self.move_plot.setLabel("bottom", "Depth (m)")
        self.move_curve = self.move_plot.plot(pen=example_utils.pg_pen_cycler())
        self.move_smooth_max = example_utils.SmoothMax(self.config.sweep_rate)

        self.move_depth_line = pg.InfiniteLine(pen=dashed_pen)
        self.move_depth_line.hide()
        self.move_plot.addItem(self.move_depth_line)

        win.nextRow()

        move_hist_plot = win.addPlot(title="Movement history")
        move_hist_plot.showGrid(x=True, y=True)
        move_hist_plot.setLabel("bottom", "Time (s)")
        move_hist_plot.setXRange(-5, 0)
        move_hist_plot.setYRange(0, 1)
        self.move_hist_curve = move_hist_plot.plot(pen=example_utils.pg_pen_cycler())
        limit_line = pg.InfiniteLine(self.movement_limit, angle=0, pen=dashed_pen)
        move_hist_plot.addItem(limit_line)

        self.present_html_format = '<div style="text-align: center">' \
                                   '<span style="color: #FFFFFF;font-size:16pt;">' \
                                   '{}</span></div>'
        present_html = self.present_html_format.format("Presence detected!")
        not_present_html = '<div style="text-align: center">' \
                           '<span style="color: #FFFFFF;font-size:16pt;">' \
                           '{}</span></div>'.format("No presence detected")
        self.present_text_item = pg.TextItem(
            html=present_html,
            fill=pg.mkColor(255, 140, 0),
            anchor=(0.5, 0),
            )
        self.not_present_text_item = pg.TextItem(
            html=not_present_html,
            fill=pg.mkColor("b"),
            anchor=(0.5, 0),
            )
        self.present_text_item.setPos(-2.5, 0.95)
        self.not_present_text_item.setPos(-2.5, 0.95)
        move_hist_plot.addItem(self.present_text_item)
        move_hist_plot.addItem(self.not_present_text_item)
        self.present_text_item.hide()
    def setup(self, win):
        self.plots = []
        self.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.showGrid(x=True, y=True)
            plot.setYRange(-2**15, 2**15)
            plot.hideAxis("left")
            plot.hideAxis("bottom")
            plot.plot(np.arange(self.num_subsweeps),
                      np.zeros(self.num_subsweeps))
            curve = plot.plot(pen=example_utils.pg_pen_cycler())
            self.plots.append(plot)
            self.curves.append(curve)

        self.ft_plot = win.addPlot(row=1, col=0, colspan=self.num_depths)
        self.ft_im = pg.ImageItem(autoDownsample=True)
        self.ft_im.setLookupTable(example_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.stepsize, 6)

        self.smooth_max = example_utils.SmoothMax(
            self.smooth_max_f,
            tau_grow=0,
            tau_decay=0.5,
            hysteresis=0.1,
        )

        self.setup_is_done = True
        self.update_processing_config()
Exemple #8
0
    def setup(self, win):
        win.setWindowTitle("Keras training results")

        self.acc_plot_window = win.addPlot(row=0,
                                           col=0,
                                           title="Training results")
        self.acc_plot_window.showGrid(x=True, y=True)
        self.acc_plot_window.addLegend(offset=(-10, 10))
        self.acc_plot_window.setYRange(0, 1)
        self.acc_plot_window.setXRange(0, 1)
        self.acc_plot_window.setLabel("left", "Accuracy/Loss")
        self.acc_plot_window.setLabel("bottom", "Epoch")

        self.progress_acc = pg.TextItem(color="k",
                                        anchor=(0, 1),
                                        fill="#f0f0f0")
        self.progress_acc.setPos(0, 0)
        self.progress_acc.setZValue(2)
        self.acc_plot_window.addItem(self.progress_acc, ignoreBounds=True)

        self.loss_plot_window = win.addPlot(row=1,
                                            col=0,
                                            title="Test-set results")
        self.loss_plot_window.showGrid(x=True, y=True)
        self.loss_plot_window.addLegend(offset=(-10, 10))
        self.loss_plot_window.setYRange(0, 1)
        self.loss_plot_window.setXRange(0, 1)
        self.loss_plot_window.setLabel("left", "Accuracy/Loss")
        self.loss_plot_window.setLabel("bottom", "Epoch")

        self.progress_loss = pg.TextItem(color="k",
                                         anchor=(0, 1),
                                         fill="#f0f0f0")
        self.progress_loss.setPos(.5, 0.5)
        self.progress_loss.setZValue(2)
        self.loss_plot_window.addItem(self.progress_loss, ignoreBounds=True)

        hp = self.history_plots = {}
        pen = example_utils.pg_pen_cycler(1)
        hp["acc"] = self.acc_plot_window.plot(pen=pen, name="Accuracy")
        hp["loss"] = self.loss_plot_window.plot(pen=pen, name="Loss")
        pen = example_utils.pg_pen_cycler(2)
        hp["val_acc"] = self.acc_plot_window.plot(pen=pen,
                                                  name="Val. Accuracy")
        hp["val_loss"] = self.loss_plot_window.plot(pen=pen, name="Val. Loss")
 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 = example_utils.pg_pen_cycler(label_num)
             self.prediction_plots.append(
                 self.predictions_plot_window.plot(pen=pen, name=label))
    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.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=example_utils.pg_pen_cycler(0),
                name="Filtered",
                )
        self.raw_phi_curve = self.phi_plot.plot(
                pen=example_utils.pg_pen_cycler(1),
                name="Raw",
                )

        win.nextRow()
        self.spect_plot = win.addPlot(title="Power spectrum")
        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=example_utils.pg_pen_cycler(1))
        self.spect_smax = example_utils.SmoothMax(self.config.sweep_rate / 15)
        self.spect_dft_inf_line = pg.InfiniteLine(pen=example_utils.pg_pen_cycler(1, "--"))
        self.spect_plot.addItem(self.spect_dft_inf_line)
        self.spect_est_inf_line = pg.InfiniteLine(pen=example_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.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=example_utils.pg_pen_cycler(0),
                name="Breathing est.",
                )
        self.fest_dft_curve = self.fest_plot.plot(
                pen=example_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 setup(self, win):
        win.setWindowTitle("Acconeer envelope example")

        self.plot = win.addPlot(title="Envelope")
        self.plot.showGrid(x=True, y=True)
        self.plot.setLabel("bottom", "Depth (m)")
        self.plot.setLabel("left", "Amplitude")

        self.curves = []
        for i in range(len(self.config.sensor)):
            pen = example_utils.pg_pen_cycler(i)
            curve = self.plot.plot(pen=pen)
            self.curves.append(curve)

        self.xs = np.linspace(*self.config.range_interval, self.num_points)
        self.smooth_max = example_utils.SmoothMax(self.config.sweep_rate)
Exemple #12
0
    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.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=example_utils.pg_pen_cycler(0))
        pen = example_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.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(example_utils.pg_phase_ticks)
        self.arg_curve = self.arg_plot.plot(pen=example_utils.pg_pen_cycler(0))
        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")
        example_utils.pg_setup_polar_plot(self.iq_plot, 0.5)
        self.iq_curve = self.iq_plot.plot(pen=example_utils.pg_pen_cycler())
        self.iq_scatter = pg.ScatterPlotItem(
            brush=pg.mkBrush(example_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.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=example_utils.pg_pen_cycler())
        self.hist_plot.setYRange(-5, 5)

        self.hist_zoom_plot = win.addPlot(row=1, col=2)
        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=example_utils.pg_pen_cycler())
        self.hist_zoom_plot.setYRange(-0.5, 0.5)

        self.smooth_max = example_utils.SmoothMax(self.config.sweep_rate)
        self.first = True
    def setup(self, win):
        win.setWindowTitle("Acconeer power bin example")

        self.plot = win.addPlot(title="Power bin")
        self.plot.showGrid(x=True, y=True)
        self.plot.setLabel("bottom", "Depth (m)")
        self.plot.setLabel("left", "Amplitude")

        self.curves = []
        for i in range(len(self.config.sensor)):
            pen = example_utils.pg_pen_cycler(i)
            curve = self.plot.plot(pen=pen,
                                   symbol="o",
                                   symbolPen="k",
                                   symbolBrush=pg.mkBrush(
                                       example_utils.color_cycler(i)))
            self.curves.append(curve)

        self.smooth_max = example_utils.SmoothMax(self.config.sweep_rate)
    def setup(self, win):
        win.setWindowTitle("Acconeer IQ example")

        self.ampl_plot = win.addPlot(title="IQ")
        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.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(example_utils.pg_phase_ticks)

        self.ampl_curves = []
        self.phase_curves = []
        for i in range(len(self.config.sensor)):
            pen = example_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.xs = np.linspace(*self.config.range_interval, self.num_points)
        self.smooth_max = example_utils.SmoothMax(self.config.sweep_rate)
Exemple #15
0
    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.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=example_utils.pg_pen_cycler(0),
            name="Envelope signal",
        )
        self.sign_lp_hist_curve = self.sign_hist_plot.plot(
            pen=example_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.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=example_utils.pg_pen_cycler(0),
            name="Relative deviation",
        )

        self.detection_dots = self.rel_dev_hist_plot.plot(
            pen=None,
            symbol='o',
            symbolSize=20,
            symbolBrush=example_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 = example_utils.SmoothMax(
            self.sensor_config.sweep_rate,
            hysteresis=0.6,
            tau_decay=3,
        )

        self.smooth_max_rel_dev = example_utils.SmoothMax(
            self.sensor_config.sweep_rate,
            hysteresis=0.6,
            tau_decay=3,
        )

        self.setup_is_done = True
        self.update_processing_config()
Exemple #16
0
    def setup(self, win):
        win.setWindowTitle("Acconeer presence detection example")

        dashed_pen = pg.mkPen("k", width=2.5, style=QtCore.Qt.DashLine)

        if self.processing_config["show_sweep"]["value"]:
            data_plot = win.addPlot(
                title="Sweep (blue), fast (orange), and slow (green)")
            data_plot.showGrid(x=True, y=True)
            data_plot.setLabel("bottom", "Depth (m)")
            data_plot.setYRange(-2**15, 2**15)
            self.sweep_scatter = pg.ScatterPlotItem(
                size=10,
                brush=example_utils.pg_brush_cycler(0),
            )
            self.fast_scatter = pg.ScatterPlotItem(
                size=10,
                brush=example_utils.pg_brush_cycler(1),
            )
            self.slow_scatter = pg.ScatterPlotItem(
                size=10,
                brush=example_utils.pg_brush_cycler(2),
            )
            data_plot.addItem(self.sweep_scatter)
            data_plot.addItem(self.fast_scatter)
            data_plot.addItem(self.slow_scatter)

            win.nextRow()

        if self.processing_config["show_noise"]["value"]:
            self.noise_plot = win.addPlot(title="Noise")
            self.noise_plot.showGrid(x=True, y=True)
            self.noise_plot.setLabel("bottom", "Depth (m)")
            self.noise_curve = self.noise_plot.plot(
                pen=example_utils.pg_pen_cycler())
            self.noise_smooth_max = example_utils.SmoothMax(
                self.sensor_config.sweep_rate)

            win.nextRow()

        if self.processing_config["show_depthwise_output"]["value"]:
            self.move_plot = win.addPlot(title="Depthwise presence")
            self.move_plot.showGrid(x=True, y=True)
            self.move_plot.setLabel("bottom", "Depth (m)")
            self.move_curve = self.move_plot.plot(
                pen=example_utils.pg_pen_cycler())
            self.move_smooth_max = example_utils.SmoothMax(
                self.sensor_config.sweep_rate,
                tau_decay=1.0,
            )

            self.move_depth_line = pg.InfiniteLine(pen=dashed_pen)
            self.move_depth_line.hide()
            self.move_plot.addItem(self.move_depth_line)
            limit_line = pg.InfiniteLine(self.movement_limit,
                                         angle=0,
                                         pen=dashed_pen)
            self.move_plot.addItem(limit_line)

            win.nextRow()

        move_hist_plot = win.addPlot(title="Presence history")
        move_hist_plot.showGrid(x=True, y=True)
        move_hist_plot.setLabel("bottom", "Time (s)")
        move_hist_plot.setXRange(-HISTORY_LENGTH_S, 0)
        move_hist_plot.setYRange(0, OUTPUT_MAX)
        self.move_hist_curve = move_hist_plot.plot(
            pen=example_utils.pg_pen_cycler())
        limit_line = pg.InfiniteLine(self.movement_limit,
                                     angle=0,
                                     pen=dashed_pen)
        move_hist_plot.addItem(limit_line)

        self.present_html_format = '<div style="text-align: center">' \
                                   '<span style="color: #FFFFFF;font-size:16pt;">' \
                                   '{}</span></div>'
        present_html = self.present_html_format.format("Presence detected!")
        not_present_html = '<div style="text-align: center">' \
                           '<span style="color: #FFFFFF;font-size:16pt;">' \
                           '{}</span></div>'.format("No presence detected")
        self.present_text_item = pg.TextItem(
            html=present_html,
            fill=pg.mkColor(255, 140, 0),
            anchor=(0.5, 0),
        )
        self.not_present_text_item = pg.TextItem(
            html=not_present_html,
            fill=pg.mkColor("b"),
            anchor=(0.5, 0),
        )
        self.present_text_item.setPos(-2.5, 0.95 * OUTPUT_MAX)
        self.not_present_text_item.setPos(-2.5, 0.95 * OUTPUT_MAX)
        move_hist_plot.addItem(self.present_text_item)
        move_hist_plot.addItem(self.not_present_text_item)
        self.present_text_item.hide()
Exemple #17
0
    def init_graphs(self, mode="Select service"):
        axes = {
            "Select service": [None, None],
            "IQ": [None, None],
            "Envelope": [None, None],
            "Power bin": [None, None],
            "Presence detection": [prd, prd.PresenceDetectionProcessor],
            "Breathing": [br, br.BreathingProcessor],
            "Phase tracking": [pht, pht.PhaseTrackingProcessor],
            "Sleep breathing": [sb, sb.PresenceDetectionProcessor],
            "Obstacle detection": [od, od.ObstacleDetectionProcessor],
        }

        self.external = axes[mode][1]
        canvas = None

        self.textboxes["power_bins"].setVisible(False)
        self.labels["power_bins"].setVisible(False)
        self.cl_supported = False
        if "IQ" in self.mode.currentText() or "Envelope" in self.mode.currentText():
            self.cl_supported = True
        else:
            self.load_clutter_file(force_unload=True)
        self.buttons["create_cl"].setEnabled(self.cl_supported)
        self.buttons["load_cl"].setEnabled(self.cl_supported)

        self.current_canvas = mode

        font = QFont()
        font.setPixelSize(12)
        ax_color = (0, 0, 0)
        ax = ("bottom", "left")

        if mode == "Select service":
            canvas = QLabel()
            pixmap = QPixmap(self.acc_file)
            canvas.setPixmap(pixmap)
            return canvas

        pg.setConfigOption("background", "#f0f0f0")
        pg.setConfigOption("foreground", "k")
        pg.setConfigOption("leftButtonPan", False)
        pg.setConfigOptions(antialias=True)
        canvas = pg.GraphicsLayoutWidget()

        if self.external:
            self.service_widget = axes[mode][0].PGUpdater(self.update_sensor_config())
            self.service_widget.setup(canvas)
            self.external = axes[mode][1]
            return canvas
        elif "power" in mode.lower():
            self.power_plot_window = canvas.addPlot(title="Power bin")
            self.power_plot_window.showGrid(x=True, y=True)
            for i in ax:
                self.power_plot_window.getAxis(i).tickFont = font
                self.power_plot_window.getAxis(i).setPen(ax_color)
            pen = pg.mkPen(example_utils.color_cycler(0), width=2)
            self.power_plot = pg.BarGraphItem(x=np.arange(1, 7),
                                              height=np.linspace(0, 6, num=6),
                                              width=.5,
                                              pen=pen,
                                              name="Power bins")
            self.power_plot_window.setLabel("left", "Amplitude")
            self.power_plot_window.setLabel("bottom", "Power bin range (mm)")
            self.power_plot_window.setYRange(0, 10)
            self.power_plot_window.setXRange(0.5, 6.5)
            self.power_plot_window.addItem(self.power_plot)
            self.textboxes["power_bins"].setVisible(True)
            self.labels["power_bins"].setVisible(True)
        else:
            self.envelope_plot_window = canvas.addPlot(title="Envelope")
            self.envelope_plot_window.showGrid(x=True, y=True)
            self.envelope_plot_window.addLegend()
            for i in ax:
                self.envelope_plot_window.getAxis(i).tickFont = font
                self.envelope_plot_window.getAxis(i).setPen(ax_color)

            pen = example_utils.pg_pen_cycler()
            self.envelope_plot = self.envelope_plot_window.plot(range(10),
                                                                np.zeros(10),
                                                                pen=pen,
                                                                name="Envelope")
            self.envelope_plot_window.setYRange(0, 1)
            pen = pg.mkPen(0.2, width=2, style=QtCore.Qt.DotLine)
            self.clutter_plot = self.envelope_plot_window.plot(range(10),
                                                               np.zeros(10),
                                                               pen=pen,
                                                               name="Background")
            self.clutter_plot.setZValue(2)

            self.snr_text = pg.TextItem(text="", color=(1, 1, 1), anchor=(0, 1))
            self.snr_text.setZValue(3)
            self.envelope_plot_window.addItem(self.snr_text)
            self.envelope_plot_window.setLabel("left", "Amplitude")
            self.envelope_plot_window.setLabel("bottom", "Distance (mm)")

            canvas.nextRow()

            if mode.lower() == "iq":
                self.iq_plot_window = canvas.addPlot(title="Phase")
                self.iq_plot_window.showGrid(x=True, y=True)
                self.iq_plot_window.addLegend()
                for i in ax:
                    self.iq_plot_window.getAxis(i).tickFont = font
                    self.iq_plot_window.getAxis(i).setPen(ax_color)
                pen = example_utils.pg_pen_cycler()
                self.iq_plot = self.iq_plot_window.plot(range(10),
                                                        np.arange(10)*0,
                                                        pen=pen,
                                                        name="IQ Phase")
                self.iq_plot_window.setLabel("left", "Normalized phase")
                self.iq_plot_window.setLabel("bottom", "Distance (mm)")
                canvas.nextRow()
            self.hist_plot_image = canvas.addPlot()
            self.hist_plot = pg.ImageItem(titel="History")
            colormap = plt.get_cmap("viridis")
            colormap._init()
            lut = (colormap._lut * 255).view(np.ndarray)
            self.hist_plot.setLookupTable(lut)
            pen = example_utils.pg_pen_cycler(1)
            self.hist_plot_peak = self.hist_plot_image.plot(range(10),
                                                            np.zeros(10),
                                                            pen=pen)
            self.hist_plot_image.addItem(self.hist_plot)
            self.hist_plot_image.setLabel("left", "Distance (mm)")
            self.hist_plot_image.setLabel("bottom", "Time (Sweep number)")
            for i in ax:
                    self.hist_plot_image.getAxis(i).tickFont = font
                    self.hist_plot_image.getAxis(i).setPen(ax_color)

        return canvas
Exemple #18
0
    def setup(self, win):
        win.setWindowTitle("Acconeer presence detection example")
        win.setAntialiasing(True)

        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.showGrid(x=True, y=True)
        self.data_plot.setLabel("bottom", "Depth (m)")
        self.data_plot.setLabel("left", "Amplitude")
        self.data_plot.setYRange(-2**15, 2**15)
        self.sweep_scatter = pg.ScatterPlotItem(
            size=10,
            brush=example_utils.pg_brush_cycler(0),
        )
        self.fast_scatter = pg.ScatterPlotItem(
            size=10,
            brush=example_utils.pg_brush_cycler(1),
        )
        self.slow_scatter = pg.ScatterPlotItem(
            size=10,
            brush=example_utils.pg_brush_cycler(2),
        )
        self.data_plot.addItem(self.sweep_scatter)
        self.data_plot.addItem(self.fast_scatter)
        self.data_plot.addItem(self.slow_scatter)

        # Noise estimation plot

        self.noise_plot = win.addPlot(
            row=1,
            col=0,
            title="Noise",
        )
        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=example_utils.pg_pen_cycler())
        self.noise_smooth_max = example_utils.SmoothMax(
            self.sensor_config.sweep_rate)

        # Depthwise presence plot

        self.move_plot = win.addPlot(
            row=2,
            col=0,
            title="Depthwise presence",
        )
        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 = example_utils.SmoothMax(
            self.sensor_config.sweep_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=example_utils.pg_brush_cycler(0),
        )
        self.move_plot.addItem(fbi)

        fbi = pg.FillBetweenItem(
            self.inter_curve,
            self.total_curve,
            brush=example_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.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=example_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()
Exemple #19
0
    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.showGrid(x=True, y=True)
            plot.setYRange(-2**15, 2**15)
            plot.hideAxis("left")
            plot.hideAxis("bottom")
            plot.plot(np.arange(self.num_subsweeps),
                      np.zeros(self.num_subsweeps))
            curve = plot.plot(pen=example_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.setLabel("left", "Normalized ASD")
        self.sd_plot.showGrid(x=True, y=True)
        self.sd_curve = self.sd_plot.plot(pen=example_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 = example_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.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.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(example_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()
Exemple #20
0
    def setup(self, win):
        win.setWindowTitle("Acconeer obstacle detection example")

        row_idx = 0
        self.env_ax = win.addPlot(row=row_idx,
                                  col=0,
                                  colspan=4,
                                  title="Envelope and max FFT")
        self.env_ax.setLabel("bottom", "Depth (cm)")
        self.env_ax.setXRange(*(self.sensor_config.range_interval * 100))
        self.env_ax.showGrid(True, True)
        self.env_ax.addLegend()
        self.env_ax.setYRange(0, 0.1)

        self.env_ampl = self.env_ax.plot(pen=example_utils.pg_pen_cycler(0),
                                         name="Envelope")
        self.fft_max = self.env_ax.plot(pen=example_utils.pg_pen_cycler(
            1, "--"),
                                        name="FFT max")

        self.peak_dist_text = pg.TextItem(color="k", anchor=(0, 1))
        self.env_ax.addItem(self.peak_dist_text)
        self.peak_dist_text.setPos(self.sensor_config.range_start * 100, 0)
        self.peak_dist_text.setZValue(3)

        self.env_peak_vline = pg.InfiniteLine(pos=0,
                                              angle=90,
                                              pen=pg.mkPen(
                                                  width=2,
                                                  style=QtCore.Qt.DotLine))
        self.env_ax.addItem(self.env_peak_vline)
        row_idx += 1

        self.obstacle_ax = win.addPlot(row=row_idx,
                                       col=0,
                                       colspan=self.num_hist_plots,
                                       title="Obstacle map")
        self.obstacle_im = pg.ImageItem()
        self.obstacle_ax.setLabel("bottom", "Velocity (cm/s)")
        self.obstacle_ax.setLabel("left", "Distance (cm)")
        self.obstacle_im.setLookupTable(example_utils.pg_mpl_cmap("viridis"))
        self.obstacle_ax.addItem(self.obstacle_im)

        self.obstacle_ax.setXRange(-self.max_velocity, self.max_velocity)
        self.obstacle_ax.setYRange(*self.sensor_config.range_interval * 100)

        self.obstacle_ax.setXRange(-self.max_velocity, self.max_velocity)
        self.obstacle_ax.setYRange(*self.sensor_config.range_interval * 100)

        self.obstacle_peak = pg.ScatterPlotItem(brush=pg.mkBrush("k"), size=15)
        self.obstacle_ax.addItem(self.obstacle_peak)

        self.peak_fft_text = pg.TextItem(color="w", anchor=(0, 1))
        self.obstacle_ax.addItem(self.peak_fft_text)
        self.peak_fft_text.setPos(-self.max_velocity,
                                  self.sensor_config.range_start * 100)

        self.peak_val_text = pg.TextItem(color="w", anchor=(0, 0))
        self.obstacle_ax.addItem(self.peak_val_text)
        self.peak_val_text.setPos(-self.max_velocity,
                                  self.sensor_config.range_end * 100)

        row_idx += 1
        if self.advanced_plots["background_map"]:
            self.obstacle_bg_ax = win.addPlot(row=row_idx,
                                              col=0,
                                              colspan=self.num_hist_plots,
                                              title="Obstacle background")
            self.obstacle_bg_im = pg.ImageItem()
            self.obstacle_bg_ax.setLabel("bottom", "Velocity (cm/s)")
            self.obstacle_bg_ax.setLabel("left", "Distance (cm)")
            self.obstacle_bg_im.setLookupTable(
                example_utils.pg_mpl_cmap("viridis"))
            self.obstacle_bg_ax.addItem(self.obstacle_bg_im)
            row_idx += 1

        if self.advanced_plots["threshold_map"]:
            self.obstacle_thresh_ax = win.addPlot(row=row_idx,
                                                  col=0,
                                                  colspan=self.num_hist_plots,
                                                  title="Obstacle threshold")
            self.obstacle_thresh_im = pg.ImageItem()
            self.obstacle_thresh_ax.setLabel("bottom", "Velocity (cm/s)")
            self.obstacle_thresh_ax.setLabel("left", "Distance (cm)")
            self.obstacle_thresh_im.setLookupTable(
                example_utils.pg_mpl_cmap("viridis"))
            self.obstacle_thresh_ax.addItem(self.obstacle_thresh_im)
            row_idx += 1

        hist_col = 0
        row_idx += self.num_hist_plots
        if self.hist_plots["distance"][1]:
            self.peak_hist_ax_l = win.addPlot(row=row_idx,
                                              col=hist_col,
                                              title="Distance history")
            self.peak_hist_ax_l.setLabel("bottom", "Sweep")
            self.peak_hist_ax_l.setXRange(0, self.peak_hist_len)
            self.peak_hist_ax_l.showGrid(True, True)
            self.peak_hist_ax_l.addLegend(offset=(-10, 10))
            self.peak_hist_ax_l.setYRange(self.sensor_config.range_start * 100,
                                          self.sensor_config.range_end * 100)
            hist_col += 1

        if self.hist_plots["velocity"][1]:
            self.peak_hist_ax_c = win.addPlot(row=row_idx,
                                              col=hist_col,
                                              title="Velocity history")
            self.peak_hist_ax_c.setLabel("bottom", "Sweep")
            self.peak_hist_ax_c.setXRange(0, self.peak_hist_len)
            limit = np.round(self.max_velocity / 10) * 10
            if limit < 1.0:
                limit = self.max_velocity
            self.peak_hist_ax_c.setYRange(-limit, limit)
            self.peak_hist_ax_c.showGrid(True, True)
            self.peak_hist_ax_c.addLegend(offset=(-10, 10))
            hist_col += 1

        if self.hist_plots["angle"][1]:
            self.peak_hist_ax_r = win.addPlot(row=row_idx,
                                              col=hist_col,
                                              title="Angle history")
            self.peak_hist_ax_r.setLabel("bottom", "Sweep")
            self.peak_hist_ax_r.setXRange(0, self.peak_hist_len)
            self.peak_hist_ax_r.showGrid(True, True)
            self.peak_hist_ax_r.addLegend(offset=(-10, 10))
            self.peak_hist_ax_r.setYRange(-100, 100)
            hist_col += 1

        if self.hist_plots["amplitude"][1]:
            self.peak_hist_ax_r1 = win.addPlot(row=row_idx,
                                               col=hist_col,
                                               title="Amplitude history")
            self.peak_hist_ax_r1.setLabel("bottom", "Sweep")
            self.peak_hist_ax_r1.setXRange(0, self.peak_hist_len)
            self.peak_hist_ax_r1.showGrid(True, True)
            self.peak_hist_ax_r1.addLegend(offset=(-10, 10))
            hist_col += 1

        for i in range(self.nr_locals):
            if self.hist_plots["velocity"][1]:
                self.hist_plots["velocity"][0].append(
                    self.peak_hist_ax_c.plot(
                        pen=example_utils.pg_pen_cycler(i),
                        name="Veloctiy {:d}".format(i)))
            if self.hist_plots["angle"][1]:
                self.hist_plots["angle"][0].append(
                    self.peak_hist_ax_r.plot(
                        pen=example_utils.pg_pen_cycler(i),
                        name="Angle {:d}".format(i)))
            if self.hist_plots["distance"][1]:
                self.hist_plots["distance"][0].append(
                    self.peak_hist_ax_l.plot(
                        pen=example_utils.pg_pen_cycler(i),
                        name="Distance {:d}".format(i)))
            if self.hist_plots["amplitude"][1]:
                self.hist_plots["amplitude"][0].append(
                    self.peak_hist_ax_r1.plot(
                        pen=example_utils.pg_pen_cycler(i),
                        name="Amplitude {:d}".format(i)))

        self.smooth_max = example_utils.SmoothMax(
            self.sensor_config.sweep_rate, tau_decay=1, tau_grow=0.2)