def main():
    args = example_utils.ExampleArgumentParser().parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    elif args.spi:
        client = RegSPIClient()
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = configs.IQServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [0.2, 0.6]
    config.sweep_rate = 50

    info = client.start_streaming(config)

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    fc = example_utils.FreqCounter(num_bits=(4 * 8 * info["data_length"]))

    while not interrupt_handler.got_signal:
        info, data = client.get_next()
        fc.tick()

    print("\nDisconnecting...")
    client.disconnect()
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = config_setup()
    config.sensor = args.sensors
    info = client.setup_session(config)
    num_points = info["data_length"]
    tracking = Tracking(num_points, config.range_interval)

    fig, (amplitude_ax) = plt.subplots(1)
    fig.set_size_inches(12, 6)
    fig.canvas.set_window_title("filename")

    for ax in [amplitude_ax]:
        ax.set_xlabel("time (s)")
        ax.set_xlim(0, num_points / config.sweep_rate)

    amplitude_ax.set_ylabel("Distance (m)")
    amplitude_ax.set_ylim(config.range_interval[0], config.range_interval[1])

    xs = np.linspace(0, num_points / config.sweep_rate, num=num_points)
    amplitude_line = amplitude_ax.plot(xs, np.zeros_like(xs))[0]

    fig.tight_layout()
    plt.ion()
    plt.show()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    client.start_streaming()
    counter = 0
    while not interrupt_handler.got_signal:
        info, sweep = client.get_next()
        amplitude = np.abs(sweep)
        track = tracking.tracking(sweep, counter)
        peak = track
        counter += 1
        if counter == num_points:
            counter = 0
        # print(peak)
        amplitude_line.set_ydata(peak)
        # amplitude_line.set_ydata(amplitude)
        fig.canvas.flush_events()

    print("Disconnecting...")
    client.disconnect()
def main():
    args = example_utils.ExampleArgumentParser().parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    elif args.spi:
        client = RegSPIClient()
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    # Normally when using a single sensor, get_next will return
    # (info, data). When using mulitple sensors, get_next will return
    # lists of info and data for each sensor, i.e. ([info], [data]).
    # This is commonly called squeezing. To disable squeezing, making
    # get_next _always_ return lists, set:
    # client.squeeze = False

    config = configs.EnvelopeServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [0.2, 0.3]
    config.sweep_rate = 5

    session_info = client.setup_session(config)
    print("Session info:\n", session_info, "\n")

    # Now would be the time to set up plotting, signal processing, etc.

    client.start_streaming()

    # Normally, hitting Ctrl-C will raise a KeyboardInterrupt which in
    # most cases immediately terminates the script. This often becomes
    # an issue when plotting and also doesn't allow us to disconnect
    # gracefully. Setting up an ExampleInterruptHandler will capture the
    # keyboard interrupt signal so that a KeyboardInterrupt isn't raised
    # and we can take care of the signal ourselves. In case you get
    # impatient, hitting Ctrl-C a couple of more times will raise a
    # KeyboardInterrupt which hopefully terminates the script.
    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session\n")

    while not interrupt_handler.got_signal:
        info, data = client.get_next()
        print(info, "\n", data, "\n")

    print("Disconnecting...")
    client.disconnect()
예제 #4
0
def main():
    args = example_utils.ExampleArgumentParser().parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    client.squeeze = False

    config = configs.IQServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [1, 8]
    config.sweep_rate = 1
    config.gain = 0.8
    #config.running_average_factor = 0.5
    tid = 5
    sekvenser = config.sweep_rate * tid

    info = client.setup_session(config)
    num_points = info["data_length"]

    fig_updater = ExampleFigureUpdater(config, num_points)
    plot_process = PlotProcess(fig_updater)
    plot_process.start()

    client.start_streaming()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")
    start = time.time()
    # while not interrupt_handler.got_signal:
    for i in range(0, sekvenser):
        #info, data = client.get_next()
        data = get_data(client)
        plot_data = {
            "amplitude": np.abs(data),
            "phase": np.angle(data),
        }

        try:
            plot_process.put_data(plot_data)
        except PlotProccessDiedException:
            break

    end = time.time()
    # print(i+1)
    print((end - start), "s")
    # print("Disconnecting...")
    plot_process.close()
    client.disconnect()
예제 #5
0
    def connect_to_server(self):
        if self.buttons["connect"].text() == "Connect":
            max_num = 4
            if "Select service" in self.current_canvas:
                self.mode.setCurrentIndex(2)

            if self.interface.currentText().lower() == "socket":
                self.client = JSONClient(self.textboxes["host"].text())
            else:
                port = self.ports.currentText()
                if "scan" in port.lower():
                    self.error_message("Please select port first!")
                    return
                self.client = RegClient(port)
                max_num = 1

            conf = self.update_sensor_config()
            sensor = 1
            connection_success = False
            error = None
            while sensor <= max_num:
                conf.sensor = sensor
                try:
                    self.client.setup_session(conf)
                    self.client.start_streaming()
                    self.client.stop_streaming()
                    connection_success = True
                    self.textboxes["sensor"].setText("{:d}".format(sensor))
                    break
                except Exception as e:
                    sensor += 1
                    error = e
            if connection_success:
                self.buttons["start"].setEnabled(True)
                self.buttons["create_cl"].setEnabled(True)
                self.buttons["stop"].setEnabled(True)
            else:
                self.error_message("Could not connect to sever!\n{}".format(error))
                return

            self.buttons["connect"].setText("Disconnect")
            self.buttons["connect"].setStyleSheet("QPushButton {color: red}")
        else:
            self.buttons["connect"].setText("Connect")
            self.buttons["connect"].setStyleSheet("QPushButton {color: black}")
            self.sig_scan.emit("stop")
            self.buttons["start"].setEnabled(False)
            self.buttons["create_cl"].setEnabled(False)
            if self.cl_supported:
                self.buttons["load_cl"].setEnabled(True)

            try:
                self.client.stop_streaming()
            except Exception:
                pass

            try:
                self.client.disconnect()
            except Exception:
                pass
예제 #6
0
    def __init__(self):
        # Setup radar data
        self.args = example_utils.ExampleArgumentParser().parse_args()
        example_utils.config_logging(self.args)
        if self.args.socket_addr:
            self.client = JSONClient(self.args.socket_addr)
        else:
            port = self.args.serial_port or example_utils.autodetect_serial_port(
            )
            self.client = RegClient(port)

        self.client.squeeze = False
        self.config = configs.IQServiceConfig()
        self.config.sensor = self.args.sensors
        self.config.range_interval = [0.2, 0.6]
        self.config.sweep_rate = 1
        self.config.gain = 1
        self.time = 5
        self.seq = self.config.sweep_rate * self.time

        self.info = self.client.setup_session(self.config)
        self.num_points = self.info["data_length"]
        self.matrix = np.zeros((self.seq, self.num_points), dtype=np.csingle)
        self.matrix_copy = np.zeros((self.seq, self.num_points),
                                    dtype=np.csingle)
        self.matrix_idx = 0
        super(Radar, self).__init__()
    def __init__(self, q):
        # Setup radar
        self.args = example_utils.ExampleArgumentParser().parse_args()
        example_utils.config_logging(self.args)
        if self.args.socket_addr:
            self.client = JSONClient(self.args.socket_addr)
        else:
            port = self.args.serial_port or example_utils.autodetect_serial_port()
            self.client = RegClient(port)

        self.client.squeeze = False
        self.config = configs.IQServiceConfig()
        self.config.sensor = self.args.sensors
        self.config.range_interval = [0.2, 0.6]  # Intervall för mätningar
        self.config.sweep_rate = 1  # Frekvensen
        self.config.gain = 1  # Gain mellan 0 och 1, vi använder 1
        self.time = 10  # Hur lång mätningen ska vara
        # totalt antal sekvenser som krävs för att få en specifik tid
        self.seq = self.config.sweep_rate * self.time

        self.info = self.client.setup_session(self.config)
        self.num_points = self.info["data_length"]  # Antalet mätpunkter per sekvens
        # print(self.num_points)
        # Matris med nollor som fylls med rardardata
        self.matrix = np.zeros((self.seq, self.num_points), dtype=np.csingle)
        self.matrix_copy = np.zeros((self.seq, self.num_points),
                                    dtype=np.csingle)  # En copy på ovanstående
        self.temp_vector = np.zeros((0, self.num_points), dtype=np.csingle)
        self.matrix_idx = 0  # Index för påfyllning av matris
        super(Radar, self).__init__()
        # En First In First Out (FIFO) kö där mätdata sparas och kan hämtas ut för signalbehandling
        self.q = q
예제 #8
0
    def __init__(self, radar_queue, interrupt_queue):
        # Setup for collecting data from radar
        self.args = example_utils.ExampleArgumentParser().parse_args()
        example_utils.config_logging(self.args)
        if self.args.socket_addr:
            self.client = JSONClient(self.args.socket_addr)
        else:
            port = self.args.serial_port or example_utils.autodetect_serial_port(
            )
            self.client = RegClient(port)

        self.client.squeeze = False
        self.config = configs.IQServiceConfig()
        self.config.sensor = self.args.sensors

        self.config.range_interval = [0.2, 0.6]  # Measurement interval
        self.config.sweep_rate = 1  # Frequency for collecting data
        self.config.gain = 1  # Gain between 0 and 1.
        self.time = 10  # Duration for a set amount of sequences
        self.seq = self.config.sweep_rate * self.time

        self.info = self.client.setup_session(
            self.config)  # Setup acconeer radar session
        self.num_points = self.info[
            "data_length"]  # Amount of data points per sampel

        #### Det här kanske inte ska vara i den här klassen #####
        # Vector for radar values from tracked data
        self.peak_vector = np.zeros((1, self.seq), dtype=np.csingle)
        self.data_idx = 0  # Inedex for peak vector used for filtering

        self.radar_queue = radar_queue
        self.interrupt_queue = interrupt_queue
        self.timeout = time.time() + self.time
        b = 0
예제 #9
0
def main():
    args = example_utils.ExampleArgumentParser().parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    client.squeeze = False

    config = configs.EnvelopeServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [0.2, 0.6]
    config.sweep_rate = 60
    config.gain = 0.6
    # config.session_profile = configs.EnvelopeServiceConfig.MAX_SNR
    # config.running_average_factor = 0.5
    # config.compensate_phase = False  # not recommended

    info = client.setup_session(config)
    num_points = info["data_length"]

    pg_updater = PGUpdater(config, num_points)
    pg_process = PGProcess(pg_updater)
    pg_process.start()

    client.start_streaming()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    while not interrupt_handler.got_signal:
        info, data = client.get_next()

        try:
            pg_process.put_data(data)
        except PGProccessDiedException:
            break

    print("Disconnecting...")
    pg_process.close()
    client.disconnect()
예제 #10
0
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = config_setup()
    config.sensor = args.sensors

    tid = 10

    sekvenser = tid * config.sweep_rate
    filename = "Reflektor_2.csv"

    info = client.setup_session(config)
    num_points = info["data_length"]
    fig_updater = FigureUpdater2(config, num_points)
    plot_process = PlotProcess(fig_updater)
    plot_process.start()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    client.start_streaming()

    while not interrupt_handler.got_signal:
        info, sweep = client.get_next()
        amplitude = np.abs(sweep)
        plot_data = {
            "amplitude": np.abs(sweep),
            "phase": np.angle(sweep),
            "ymax": amplitude.max(),
            "xmax": config.range_interval[0] + (config.range_interval[1] - config.range_interval[0]) *
            (np.argmax(amplitude)/num_points),
        }
        try:
            plot_process.put_data(plot_data)
        except PlotProccessDiedException:
            break

    print("Disconnecting...")
    plot_process.close()
    client.disconnect()
예제 #11
0
def main():
    args = example_utils.ExampleArgumentParser().parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    client.squeeze = False

    config = configs.PowerBinServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [0.1, 0.7]
    config.sweep_rate = 60
    config.gain = 0.6
    # config.bin_count = 8

    info = client.setup_session(config)
    num_points = info["actual_bin_count"]

    pg_updater = PGUpdater(config, num_points)
    pg_process = PGProcess(pg_updater)
    pg_process.start()

    client.start_streaming()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    while not interrupt_handler.got_signal:
        info, data = client.get_next()

        try:
            pg_process.put_data(data)
        except PGProccessDiedException:
            break

    print("Disconnecting...")
    pg_process.close()
    client.disconnect()
예제 #12
0
def main():
    args = example_utils.ExampleArgumentParser().parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    elif args.spi:
        client = RegSPIClient()
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = configs.EnvelopeServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [0.2, 0.6]
    config.sweep_rate = 10

    client.start_streaming(config)
    client.get_next()
    client.disconnect()
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = get_base_config()
    config.sensor = args.sensors

    client.setup_session(config)

    pg_updater = PGUpdater(config)
    pg_process = PGProcess(pg_updater)
    pg_process.start()

    client.start_streaming()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    processor = ObstacleDetectionProcessor(config)

    while not interrupt_handler.got_signal:
        info, sweep = client.get_next()
        plot_data = processor.process(sweep)

        if plot_data is not None:
            try:
                pg_process.put_data(plot_data)
            except PGProccessDiedException:
                break

    print("Disconnecting...")
    pg_process.close()
    client.disconnect()
예제 #14
0
    def __init__(self, HR_filter_queue,
                 go):  # Lägg till RR_filter_queue som inputargument
        self.go = go
        # Setup for collecting data from radar
        self.args = example_utils.ExampleArgumentParser().parse_args()
        example_utils.config_logging(self.args)
        if self.args.socket_addr:
            self.client = JSONClient(self.args.socket_addr)
            # Test för att se vilken port som används av radarn
            print("RADAR Port = " + self.args.socket_addr)
        else:
            port = self.args.serial_port or example_utils.autodetect_serial_port(
            )
            self.client = RegClient(port)

        self.client.squeeze = False
        self.config = configs.IQServiceConfig()
        self.config.sensor = self.args.sensors

        self.config.range_interval = [0.2, 0.6]  # Measurement interval
        self.config.sweep_rate = 20  # Frequency for collecting data
        self.config.gain = 1  # Gain between 0 and 1.
        self.time = 1  # Duration for a set amount of sequences
        self.seq = self.config.sweep_rate * self.time  # Amount of sequences during a set time and sweep freq

        self.info = self.client.setup_session(
            self.config)  # Setup acconeer radar session
        self.num_points = self.info[
            "data_length"]  # Amount of data points per sampel
        self.data_getting = 0  # Inedex for printing still getting data once a second

        self.HR_filter_queue = HR_filter_queue
        # self.a = a
        # self.RR_filter_queue = RR_filter_queue
        # Initiation for tracking method
        self.N_avg = 10  # How manny peaks averaged over when calculating peaks_filtered
        self.I_peaks = np.zeros(self.N_avg)
        self.locs = np.zeros(self.N_avg)
        self.I_peaks_filtered = np.zeros(self.N_avg)
        self.tracked_distance = np.zeros(self.N_avg)
        self.tracked_amplitude = np.zeros(self.N_avg)
        self.tracked_phase = np.zeros(self.N_avg)
        self.threshold = 0  # variable for finding peaks above threshold
        self.data_idx = 0  # Index in vector for tracking. Puts new tracked peak into tracking vector
        # converts index to real length
        self.real_dist = np.linspace(self.config.range_interval[0],
                                     self.config.range_interval[1],
                                     num=self.num_points)
        self.counter = 0  # Used only for if statement only for first iteration and not when data_idx goes back to zero

        super(Radar, self).__init__()  # Inherit threading vitals
def main():
    args = example_utils.ExampleArgumentParser().parse_args()
    example_utils.config_logging(args)
    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)
    client.squeeze = False

    # Setup parameters
    filename = "Lins50cmPuls_0328_Test1.csv"
    time = 300
    config = setup_parameters()
    seq = config.sweep_rate * time
    config.sensor = args.sensors
    info = client.setup_session(config)
    num_points = info["data_length"]
    # print(num_points)
    info_file(filename, config, num_points, time, seq)  # Setup info file
    print(num_points)

    matris = np.zeros((seq, num_points), dtype=np.csingle)
    client.start_streaming()
    print("Starting...")

    start = timer.time()
    for i in range(0, seq):
        info, sweep = client.get_next()
        matris[seq - i - 1][:] = sweep[:]
    end = timer.time()
    print(i + 1)
    print((end - start), "s")
    # print("Disconnecting...")
    matris = np.flip(matris, 0)
    np.savetxt(filename, matris, delimiter=";")
    matris = None
    client.disconnect()
def check_connection(args):
    print("Checking connection to radar")
    try:
        if args.socket_addr:
            client = JSONClient(args.socket_addr)
        elif args.spi:
            client = RegSPIClient()
        else:
            port = args.serial_port or example_utils.autodetect_serial_port()
            client = RegClient(port)

        client.connect()
        client.disconnect()
        return True
    except Exception:
        print()
        traceback.print_exc()
        print()
        return False
예제 #17
0
def setup(request):
    conn_type, *args = request.param

    if conn_type == "spi":
        client = RegSPIClient()
        sensor = 1
    elif conn_type == "uart":
        port = args[0] or autodetect_serial_port()
        client = RegClient(port)
        sensor = 1
    elif conn_type == "socket":
        client = JSONClient(args[0])
        sensor = int(args[1])
    else:
        pytest.fail()

    client.connect()
    yield (client, sensor)
    client.disconnect()
예제 #18
0
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = config_setup()
    config.sensor = args.sensors

    tid = 10
    sekvenser = tid * config.sweep_rate
    filename = "Reflektor_2.csv"

    info = client.setup_session(config)
    num_points = info["data_length"]

    amplitude_y_max = 22000
    N_avg = 10
    tracking = Tracking(num_points, config.range_interval, N_avg)
    print("numpoints: ", num_points)
    fig, (amplitude_ax) = plt.subplots(1)
    fig.set_size_inches(12, 6)
    fig.canvas.set_window_title(filename)

    for ax in [amplitude_ax]:
        # ax.set_xlabel("Depth (m)")
        # ax.set_xlim(config.range_interval)
        ax.set_xlabel("Time (s)")
        ax.set_xlim(0, 100)

    # amplitude_ax.set_ylabel("Amplitude")
    # amplitude_ax.set_ylim(0, 1.1 * amplitude_y_max)

    amplitude_ax.set_ylabel("tracked distance (m)")
    amplitude_ax.set_ylim(config.range_interval)

    xs = np.linspace(0, 100, num=100)
    amplitude_line = amplitude_ax.plot(xs, np.zeros_like(xs))[0]

    fig.tight_layout()
    plt.ion()
    plt.show()
    list = np.zeros(100)
    i = 0
    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    client.start_streaming()
    matris = np.zeros((sekvenser, 2))
    counter = 0
    while not interrupt_handler.got_signal:
        # for i in range(0, sekvenser):
        info, sweep = client.get_next()
        start = round(time.time() * 1000) / 1000
        track = tracking.tracking(sweep)
        end = round(time.time() * 1000) / 1000
        print("Time for tracking loop {}".format(end - start))
        list[i] = track
        amplitude_line.set_ydata(list)

        i += 1
        if i == 100:
            i = 0
            list = np.zeros(100)
        if not plt.fignum_exists(1):  # Simple way to check if plot is closed
            break
        fig.canvas.flush_events()
        # annotate.remove()
    # matris = np.mean(matris, axis=0)
    # np.savetxt(filename, matris, delimiter=",")

    print("Disconnecting...")
    plt.close()
    client.disconnect()
예제 #19
0
    def __init__(self, list_of_variables_for_threads, bluetooth_server):
        super(DataAcquisition, self).__init__()         # Inherit threading vitals

        # Declaration of global variables
        self.go = list_of_variables_for_threads["go"]
        self.list_of_variables_for_threads = list_of_variables_for_threads
        self.bluetooth_server = bluetooth_server
        self.run_measurement = self.list_of_variables_for_threads['run_measurement']
        self.window_slide = self.list_of_variables_for_threads["window_slide"]
        self.initiate_write_respitory_rate = list_of_variables_for_threads["initiate_write_heart_rate"]
        self.resp_rate_csv = []
        # Setup for collecting data from Acconeer's radar files
        self.args = example_utils.ExampleArgumentParser().parse_args()
        example_utils.config_logging(self.args)
        # if self.args.socket_addr:
        #     self.client = JSONClient(self.args.socket_addr)
        #     print("RADAR Port = " + self.args.socket_addr)
        # else:
        #     print("Radar serial port: " + self.args.serial_port)
        #     port = self.args.serial_port or example_utils.autodetect_serial_port()
        #     self.client = RegClient(port)
        self.client = JSONClient('0.0.0.0')
        print("args: " + str(self.args))
        self.client.squeeze = False
        self.config = configs.IQServiceConfig()
        self.config.sensor = self.args.sensors
        print(self.args.sensors)
        # self.config.sensor = 1
        # Settings for radar setup
        self.config.range_interval = [0.4, 1.4]  # Measurement interval
        # Frequency for collecting data. To low means that fast movements can't be tracked.
        self.config.sweep_rate = 20  # Probably 40 is the best without graph
        # For use of sample freq in other threads and classes.
        self.list_of_variables_for_threads["sample_freq"] = self.config.sweep_rate
        # The hardware of UART/SPI limits the sweep rate.
        self.config.gain = 0.7  # Gain between 0 and 1. Larger gain increase the SNR, but come at a cost
        # with more instability. Optimally is around 0.7
        self.info = self.client.setup_session(self.config)  # Setup acconeer radar session
        self.data_length = self.info["data_length"]  # Length of data per sample

        # Variables for tracking method
        self.first_data = True      # first time data is processed
        self.dt = 1 / self.list_of_variables_for_threads["sample_freq"]
        self.low_pass_const = self.low_pass_filter_constants_function(
            0.25, self.dt)  # Constant for a small
        # low-pass filter to smooth the changes. tau changes the filter weight, lower tau means shorter delay.
        # Usually tau = 0.25 is good.
        self.number_of_averages = 2  # Number of averages for tracked peak
        self.plot_time_length = 10  # Length of plotted data
        # Number of time samples when plotting
        self.number_of_time_samples = int(self.plot_time_length / self.dt)
        self.tracked_distance_over_time = np.zeros(
            self.number_of_time_samples)  # Array for distance over time plot
        self.local_peaks_index = []  # Index of big local peaks
        self.track_peak_index = []  # Index of last tracked peaks
        self.track_peaks_average_index = None  # Average of last tracked peaks
        self.threshold = 1  # Threshold for removing small local peaks. Start value not important

        # Returned variables
        self.tracked_distance = None  # distance to the tracked peak (m)
        self.tracked_amplitude = None
        self.tracked_phase = None
        self.tracked_data = None  # the final tracked data that is returned

        # Variables for phase to distance and plotting
        self.low_pass_amplitude = None  # low pass filtered amplitude
        self.low_pass_track_peak = None
        self.track_peak_relative_position = None  # used for plotting
        # the relative distance that is measured from phase differences (mm)
        self.relative_distance = 0  # relative distance to signal process
        self.real_time_breathing_amplitude = 0  # to send to the application
        self.last_phase = 0  # tracked phase from previous loop
        # saves old values to remove bias in real time breathing plot
        self.old_realtime_breathing_amplitude = np.zeros(1000)
        self.c = 2.998e8  # light speed (m/s)
        self.freq = 60e9  # radar frequency (Hz)
        self.wave_length = self.c / self.freq  # wave length of the radar
        self.delta_distance = 0  # difference in distance between the last two phases (m)
        self.delta_distance_low_pass = 0  # low pass filtered delta distance for plotting
        self.noise_run_time = 0  # number of run times with noise, used to remove noise
        self.not_noise_run_time = 0  # number of run times without noise

        # other
        # how often values are plotted and sent to the app
        self.modulo_base = int(self.list_of_variables_for_threads["sample_freq"] / 10)
        if self.modulo_base == 0:
            self.modulo_base = 1
        print('modulo base', self.modulo_base)
        self.run_times = 0  # number of times run in run
        self.calibrating_time = 5  # Time sleep for passing through filters. Used for Real time breathing

        # Graphs
        self.plot_graphs = False  # if plot the graphs or not
        if self.plot_graphs:
            self.pg_updater = PGUpdater(self.config)
            self.pg_process = PGProcess(self.pg_updater)
            self.pg_process.start()
        # acconeer graph
        self.low_pass_vel = 0
        self.hist_vel = np.zeros(self.number_of_time_samples)
        self.hist_pos = np.zeros(self.number_of_time_samples)
        self.last_data = None  # saved old data

        # filter
        self.highpass_HR = filter.Filter('highpass_HR')
        self.lowpass_HR = filter.Filter('lowpass_HR')
        self.highpass_RR = filter.Filter('highpass_RR')
        self.lowpass_RR = filter.Filter('lowpass_RR')

        self.HR_filtered_queue = list_of_variables_for_threads["HR_filtered_queue"]
        self.RR_filtered_queue = list_of_variables_for_threads["RR_filtered_queue"]
        # TODO remove
        self.RTB_final_queue = list_of_variables_for_threads["RTB_final_queue"]

        self.amp_data = []
예제 #20
0
class DataAcquisition(threading.Thread):
    def __init__(self, list_of_variables_for_threads, bluetooth_server):
        super(DataAcquisition, self).__init__()         # Inherit threading vitals

        # Declaration of global variables
        self.go = list_of_variables_for_threads["go"]
        self.list_of_variables_for_threads = list_of_variables_for_threads
        self.bluetooth_server = bluetooth_server
        self.run_measurement = self.list_of_variables_for_threads['run_measurement']
        self.window_slide = self.list_of_variables_for_threads["window_slide"]
        self.initiate_write_respitory_rate = list_of_variables_for_threads["initiate_write_heart_rate"]
        self.resp_rate_csv = []
        # Setup for collecting data from Acconeer's radar files
        self.args = example_utils.ExampleArgumentParser().parse_args()
        example_utils.config_logging(self.args)
        # if self.args.socket_addr:
        #     self.client = JSONClient(self.args.socket_addr)
        #     print("RADAR Port = " + self.args.socket_addr)
        # else:
        #     print("Radar serial port: " + self.args.serial_port)
        #     port = self.args.serial_port or example_utils.autodetect_serial_port()
        #     self.client = RegClient(port)
        self.client = JSONClient('0.0.0.0')
        print("args: " + str(self.args))
        self.client.squeeze = False
        self.config = configs.IQServiceConfig()
        self.config.sensor = self.args.sensors
        print(self.args.sensors)
        # self.config.sensor = 1
        # Settings for radar setup
        self.config.range_interval = [0.4, 1.4]  # Measurement interval
        # Frequency for collecting data. To low means that fast movements can't be tracked.
        self.config.sweep_rate = 20  # Probably 40 is the best without graph
        # For use of sample freq in other threads and classes.
        self.list_of_variables_for_threads["sample_freq"] = self.config.sweep_rate
        # The hardware of UART/SPI limits the sweep rate.
        self.config.gain = 0.7  # Gain between 0 and 1. Larger gain increase the SNR, but come at a cost
        # with more instability. Optimally is around 0.7
        self.info = self.client.setup_session(self.config)  # Setup acconeer radar session
        self.data_length = self.info["data_length"]  # Length of data per sample

        # Variables for tracking method
        self.first_data = True      # first time data is processed
        self.dt = 1 / self.list_of_variables_for_threads["sample_freq"]
        self.low_pass_const = self.low_pass_filter_constants_function(
            0.25, self.dt)  # Constant for a small
        # low-pass filter to smooth the changes. tau changes the filter weight, lower tau means shorter delay.
        # Usually tau = 0.25 is good.
        self.number_of_averages = 2  # Number of averages for tracked peak
        self.plot_time_length = 10  # Length of plotted data
        # Number of time samples when plotting
        self.number_of_time_samples = int(self.plot_time_length / self.dt)
        self.tracked_distance_over_time = np.zeros(
            self.number_of_time_samples)  # Array for distance over time plot
        self.local_peaks_index = []  # Index of big local peaks
        self.track_peak_index = []  # Index of last tracked peaks
        self.track_peaks_average_index = None  # Average of last tracked peaks
        self.threshold = 1  # Threshold for removing small local peaks. Start value not important

        # Returned variables
        self.tracked_distance = None  # distance to the tracked peak (m)
        self.tracked_amplitude = None
        self.tracked_phase = None
        self.tracked_data = None  # the final tracked data that is returned

        # Variables for phase to distance and plotting
        self.low_pass_amplitude = None  # low pass filtered amplitude
        self.low_pass_track_peak = None
        self.track_peak_relative_position = None  # used for plotting
        # the relative distance that is measured from phase differences (mm)
        self.relative_distance = 0  # relative distance to signal process
        self.real_time_breathing_amplitude = 0  # to send to the application
        self.last_phase = 0  # tracked phase from previous loop
        # saves old values to remove bias in real time breathing plot
        self.old_realtime_breathing_amplitude = np.zeros(1000)
        self.c = 2.998e8  # light speed (m/s)
        self.freq = 60e9  # radar frequency (Hz)
        self.wave_length = self.c / self.freq  # wave length of the radar
        self.delta_distance = 0  # difference in distance between the last two phases (m)
        self.delta_distance_low_pass = 0  # low pass filtered delta distance for plotting
        self.noise_run_time = 0  # number of run times with noise, used to remove noise
        self.not_noise_run_time = 0  # number of run times without noise

        # other
        # how often values are plotted and sent to the app
        self.modulo_base = int(self.list_of_variables_for_threads["sample_freq"] / 10)
        if self.modulo_base == 0:
            self.modulo_base = 1
        print('modulo base', self.modulo_base)
        self.run_times = 0  # number of times run in run
        self.calibrating_time = 5  # Time sleep for passing through filters. Used for Real time breathing

        # Graphs
        self.plot_graphs = False  # if plot the graphs or not
        if self.plot_graphs:
            self.pg_updater = PGUpdater(self.config)
            self.pg_process = PGProcess(self.pg_updater)
            self.pg_process.start()
        # acconeer graph
        self.low_pass_vel = 0
        self.hist_vel = np.zeros(self.number_of_time_samples)
        self.hist_pos = np.zeros(self.number_of_time_samples)
        self.last_data = None  # saved old data

        # filter
        self.highpass_HR = filter.Filter('highpass_HR')
        self.lowpass_HR = filter.Filter('lowpass_HR')
        self.highpass_RR = filter.Filter('highpass_RR')
        self.lowpass_RR = filter.Filter('lowpass_RR')

        self.HR_filtered_queue = list_of_variables_for_threads["HR_filtered_queue"]
        self.RR_filtered_queue = list_of_variables_for_threads["RR_filtered_queue"]
        # TODO remove
        self.RTB_final_queue = list_of_variables_for_threads["RTB_final_queue"]

        self.amp_data = []

    def run(self):
        self.client.start_streaming()  # Starts Acconeers streaming server
        while self.go:
            self.run_times = self.run_times + 1
            # This data is an 1D array in terminal print, not in Python script however....
            data = self.get_data()
            tracked_data = self.tracking(data)  # processing data and tracking peaks
            # Test with acconeer filter for schmitt.
            if tracked_data is not None:
                # filter the data
                highpass_filtered_data_HR = self.highpass_HR.filter(
                    tracked_data["relative distance"])
                bandpass_filtered_data_HR = self.lowpass_HR.filter(highpass_filtered_data_HR)

                highpass_filtered_data_RR = self.highpass_RR.filter(
                    tracked_data["relative distance"])
                bandpass_filtered_data_RR = self.lowpass_RR.filter(highpass_filtered_data_RR)

                if self.run_measurement:
                    self.HR_filtered_queue.put(
                        bandpass_filtered_data_HR)  # Put filtered data in output queue to send to SignalProcessing
                    self.RR_filtered_queue.put(bandpass_filtered_data_RR)
                    # self.RTB_final_queue.put(bandpass_filtered_data_RR)
                    # Send to app
                    if self.run_times % self.modulo_base == 0:
                        # Send real time breathing amplitude to the application
                        self.bluetooth_server.write_data_to_app(
                            tracked_data["real time breathing amplitude"], 'real time breath')
                        # self.bluetooth_server.write_data_to_app(
                        #    bandpass_filtered_data_HR, 'real time breath')

                self.csv_filtered_respitory(bandpass_filtered_data_RR)

            if self.plot_graphs and self.run_times % self.modulo_base == 0:
                try:
                    self.pg_process.put_data(tracked_data)  # plot data
                except PGProccessDiedException:
                    self.go.pop(0)
                    break
        self.RR_filtered_queue.put(0)  # to quit the signal processing thread
        # print('before for loop to fill HR queue')
        for i in range(600):
            # print("Data acq filling HR queue with 0:s")
            self.HR_filtered_queue.put(0)
        print("out of while go in radar")
        self.client.disconnect()
        self.pg_process.close()

    def get_data(self):
        # self.client.get_next()
        info, data = self.client.get_next()  # get the next data from the radar
        # print('info',info[-1]['sequence_number'],'run_times',self.run_times)
        if info[-1]['sequence_number'] > self.run_times + 10:
            # to remove delay if handling the data takes longer time than for the radar to get it
            print("sequence diff over 10, removing difference",
                  info[-1]['sequence_number']-self.run_times)
            for i in range(0, info[-1]['sequence_number']-self.run_times):
                self.client.get_next()  # getting the data without using it
            info, data = self.client.get_next()
            self.run_times = info[-1]['sequence_number']
        return data

    def tracking(self, data):
        data = np.array(data).flatten()
        data_length = len(data)
        amplitude = np.abs(data)
        power = amplitude * amplitude

        # Find and track peaks
        if np.sum(amplitude)/data_length > 1e-6:
            max_peak_index = np.argmax(power)
            max_peak_amplitude = amplitude[max_peak_index]
            if self.first_data:  # first time
                self.track_peak_index.append(max_peak_index)  # global max peak
                self.track_peaks_average_index = max_peak_index
            else:
                self.local_peaks_index, _ = signal.find_peaks(power)  # find local max in data
                index = 0
                index_list = []
                for peak in self.local_peaks_index:
                    if np.abs(amplitude[peak]) < self.threshold:
                        index_list.append(index)
                        index += 1
                # deletes all indexes with amplitude < threshold
                np.delete(self.local_peaks_index, index_list)
                if len(self.local_peaks_index) == 0:  # if no large peaks were found, use the latest value instead
                    print("No local peak found")
                    self.track_peak_index.append(self.track_peak_index[-1])
                else:
                    # Difference between found local peaks and last tracked peak
                    peak_difference_index = np.subtract(
                        self.local_peaks_index, self.track_peaks_average_index)
                    # The tracked peak is expected to be the closest local peak found
                    self.track_peak_index.append(
                        self.local_peaks_index[np.argmin(np.abs(peak_difference_index))])
                if len(self.track_peak_index) > self.number_of_averages:
                    self.track_peak_index.pop(0)  # remove oldest value
                if amplitude[self.track_peak_index[-1]] < 0.5 * max_peak_amplitude:  # if there is a much larger peak
                    self.track_peak_index.clear()  # reset the array
                    self.track_peak_index.append(max_peak_index)  # new peak is global max
                self.track_peaks_average_index = int(  # Average and smooth the movements of the tracked peak
                    np.round(self.low_pass_const * (np.average(self.track_peak_index))
                             + (1 - self.low_pass_const) * self.track_peaks_average_index))
            # threshold for next peak
            self.threshold = np.abs(amplitude[self.track_peaks_average_index]) * 0.8
            # so it won't follow a much smaller peak
            self.track_peak_relative_position = self.track_peaks_average_index / \
                len(data)  # Position of the peak
            # relative the range of the data
            # Converts relative distance to absolute distance
            self.tracked_distance = (1 - self.track_peaks_average_index / len(data)) * self.config.range_interval[
                0] + self.track_peaks_average_index / len(data) * self.config.range_interval[1]
            # Tracked amplitude is absolute value of data for the tracked index
            # TODO byt till denna
            self.tracked_amplitude = amplitude[self.track_peaks_average_index]
            # Tracked phase is the angle between I and Q in data for tracked index
            self.tracked_phase = np.angle(data[self.track_peaks_average_index])
        else:
            # track_peak_relative_position = 0
            self.not_noise_run_time = 0
            self.tracked_distance = 0
            self.tracked_phase = 0
            self.tracked_amplitude = 0
            if self.first_data:  # first time
                self.track_peaks_average_index = 0

        # Plots, phase to distance and noise ignoring
        if self.first_data:
            self.tracked_data = None
            self.low_pass_amplitude = amplitude
        else:
            # Amplitude of data for plotting
            self.low_pass_amplitude = self.low_pass_const * amplitude + \
                (1 - self.low_pass_const) * self.low_pass_amplitude

            # real time graph over the whole range
            # self.tracked_distance_over_time = np.roll(
            #     self.tracked_distance_over_time, -1)  # Distance over time
            # self.tracked_distance_over_time[-1] = self.tracked_distance

            # real time graph zoomed in
            # com_idx = int(self.track_peak_relative_position * data_length)
            # delta_angle = np.angle(data[com_idx] * np.conj(self.last_data[com_idx]))
            # vel = self.list_of_variables_for_threads["sample_freq"] * 2.5 * delta_angle / (2 * np.pi)
            # self.low_pass_vel = self.low_pass_const * vel + \
            #     (1 - self.low_pass_const) * self.low_pass_vel
            # dp = self.low_pass_vel / self.list_of_variables_for_threads["sample_freq"]
            # self.hist_pos = np.roll(self.hist_pos, -1)
            # self.hist_pos[-1] = self.hist_pos[-2] + dp
            # plot_hist_pos = self.hist_pos - self.hist_pos.mean()

            plot_hist_pos = None

            # self.RTB_final_queue.put(plot_hist_pos[-1]*10)  # Gets tracked breathing in mm
            # self.RR_filtered_queue.put(plot_hist_pos[-1]*10)

            # Phase to distance and unwrapping
            discount = 2        # TODO optimize for movements
            if self.tracked_phase < -np.pi + discount and self.last_phase > np.pi - discount:
                wrapped_phase = self.tracked_phase + 2 * np.pi
            elif self.tracked_phase > np.pi - discount and self.last_phase < -np.pi + discount:
                wrapped_phase = self.tracked_phase - 2 * np.pi
            else:
                wrapped_phase = self.tracked_phase

            # Delta distance
            self.delta_distance = self.wave_length * \
                (wrapped_phase - self.last_phase) / (4 * np.pi)

            # Low pass filtered delta distance
            self.delta_distance_low_pass = self.wave_length * (wrapped_phase - self.last_phase) / (4 * np.pi) * self.low_pass_const + \
                (1 - self.low_pass_const) * \
                self.delta_distance_low_pass  # calculates the distance traveled from phase differences

            # TODO testa med konjugat
            # delta_angle = np.angle(data[self.track_peaks_average_index] * np.conj(self.last_data[self.track_peaks_average_index]))
            # vel = self.list_of_variables_for_threads["sample_freq"] * 2.5 * delta_angle / (2 * np.pi)
            # self.low_pass_vel = self.low_pass_const * vel + \
            #     (1 - self.low_pass_const) * self.low_pass_vel
            # self.delta_distance = self.low_pass_vel / self.list_of_variables_for_threads["sample_freq"] / 1000

            # Remove Noise
            # Indicate if the current measurement is noise or not, to not use the noise in signal_processing
            if np.amax(self.low_pass_amplitude) < 0.01:
                # Noise
                self.noise_run_time += 1
                if self.noise_run_time >= 10 and self.not_noise_run_time >= 5:
                    self.not_noise_run_time = 0
            else:
                # Real value
                self.not_noise_run_time += 1
                if self.noise_run_time >= 10 and self.not_noise_run_time >= 5:
                    self.noise_run_time = 0
            if self.noise_run_time >= 10 and self.not_noise_run_time < 5:
                # If there has been noise at least 10 times with less than 5 real values, the data is considered to be purely noise.
                self.tracked_distance = 0
                self.delta_distance = 0
                self.delta_distance_low_pass = 0
                if self.real_time_breathing_amplitude == 0:
                    self.old_realtime_breathing_amplitude = np.zeros(1000)

            self.relative_distance = self.relative_distance - self.delta_distance  # relative distance in m
            self.real_time_breathing_amplitude = self.real_time_breathing_amplitude - \
                self.delta_distance_low_pass  # real time breathing in m
            # The minus sign comes from changing coordinate system; what the radar think is outward is inward for the person that is measured on
            self.last_phase = self.tracked_phase

            # Code to remove bias that comes from larger movements that is not completely captured by the radar.
            self.old_realtime_breathing_amplitude = np.roll(
                self.old_realtime_breathing_amplitude, -1)
            self.old_realtime_breathing_amplitude[-1] = self.real_time_breathing_amplitude
            self.old_realtime_breathing_amplitude = self.old_realtime_breathing_amplitude - \
                self.old_realtime_breathing_amplitude.mean() / 4
            self.real_time_breathing_amplitude = self.old_realtime_breathing_amplitude[-1]

            # self.amp_data.append(self.relative_distance*1000)
            # if len(self.amp_data) > 500:
            #     print('mean', np.mean(self.amp_data))
            #     print('variance', np.var(self.amp_data))
            #     print('min', np.amin(self.amp_data))
            #     print('max', np.amax(self.amp_data))
            #     print('std', np.std(self.amp_data))
            #     print('diff', np.amax(self.amp_data) - np.amin(self.amp_data))
            #     self.amp_data.clear()

            # Tracked data to return and plot
            self.tracked_data = {"tracked distance": self.tracked_distance,
                                 "tracked amplitude": self.tracked_amplitude, "tracked phase": self.tracked_phase,
                                 "abs": self.low_pass_amplitude, "tracked distance over time": plot_hist_pos,
                                 "tracked distance over time 2": self.tracked_distance_over_time,
                                 "relative distance": self.relative_distance * 1000,
                                 "real time breathing amplitude": self.real_time_breathing_amplitude*1000}
        self.last_data = data
        self.first_data = False
        return self.tracked_data

    # Creates low-pass filter constants for a very small low-pass filter
    def low_pass_filter_constants_function(self, tau, dt):
        return 1 - np.exp(-dt / tau)

    def csv_filtered_respitory(self, bandpass_filtered_data_RR):
        if self.initiate_write_respitory_rate and time.time() - self.list_of_variables_for_threads["start_write_to_csv_time"] < 5*60:
            #print("Inside save to csv respitory rate")
            self.resp_rate_csv.append(bandpass_filtered_data_RR)
            # lf.heart_rate_reliability_csv.append(found_peak_reliability_int)
        elif self.initiate_write_respitory_rate:
            self.go.pop(0)
            self.list_of_variables_for_threads["go"] = self.go
            # print("Out of while go heart_rate")
            np_csv = np.asarray(self.resp_rate_csv)
            # print("Saved as numpy array")
            np.savetxt("respitory_rate.csv", np_csv, delimiter=";")
            print("Should have saved CSV")
            self.resp_rate_csv.clear()
            # Remove Bluetooth clients
            for client in self.bluetooth_server.client_list:
                print('try to remove client ' +
                      str(self.bluetooth_server.address_list[self.bluetooth_server.client_list.index(client)]))
                client.close()
                print('remove client ' +
                      str(self.bluetooth_server.address_list[self.bluetooth_server.client_list.index(client)]))
            self.bluetooth_server.server.close()
            print("server is now closed")
            os.system("echo 'power off\nquit' | bluetoothctl")
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = configs.EnvelopeServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [0.2, 0.6]
    config.sweep_rate = 60
    config.gain = 0.65

    info = client.setup_session(config)
    num_points = info["data_length"]
    xs = np.linspace(*config.range_interval, num_points)
    num_hist = 2 * config.sweep_rate

    hist_data = np.zeros([num_hist, num_points])
    hist_max = np.zeros(num_hist)
    smooth_max = example_utils.SmoothMax(config.sweep_rate)

    app = QtGui.QApplication([])
    pg.setConfigOption("background", "w")
    pg.setConfigOption("foreground", "k")
    pg.setConfigOptions(antialias=True)
    win = pg.GraphicsLayoutWidget()
    win.closeEvent = lambda _: interrupt_handler.force_signal_interrupt()
    win.setWindowTitle("Acconeer PyQtGraph example")

    env_plot = win.addPlot(title="Envelope")
    env_plot.showGrid(x=True, y=True)
    env_plot.setLabel("bottom", "Depth (m)")
    env_plot.setLabel("left", "Amplitude")
    env_curve = env_plot.plot(pen=pg.mkPen("k", width=2))

    win.nextRow()
    hist_plot = win.addPlot()
    hist_plot.setLabel("bottom", "Time (s)")
    hist_plot.setLabel("left", "Depth (m)")
    hist_image_item = pg.ImageItem()
    hist_image_item.translate(-2, config.range_start)
    hist_image_item.scale(2 / num_hist, config.range_length / num_points)
    hist_plot.addItem(hist_image_item)

    # try to get a colormap from matplotlib
    try:
        hist_image_item.setLookupTable(example_utils.pg_mpl_cmap("viridis"))
    except ImportError:
        pass

    win.show()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    client.start_streaming()

    while not interrupt_handler.got_signal:
        info, sweep = client.get_next()

        hist_data = np.roll(hist_data, -1, axis=0)
        hist_data[-1] = sweep
        hist_max = np.roll(hist_max, -1)
        hist_max[-1] = np.max(sweep)
        y_max = smooth_max.update(np.amax(hist_max))
        env_curve.setData(xs, sweep)
        env_plot.setYRange(0, y_max)
        hist_image_item.updateImage(hist_data, levels=(0, y_max))

        app.processEvents()

    print("Disconnecting...")
    app.closeAllWindows()
    client.disconnect()
예제 #22
0
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = get_base_config()
    config.sensor = args.sensors

    info1 = client.setup_session(config)
    num_points = info1["data_length"]

    fig_updater = ExampleFigureUpdater(config)
    plot_process = PlotProcess(fig_updater)
    plot_process.start()

    client.start_streaming()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    processor = PhaseTrackingProcessor(config)
    start = time.time()
    i = 0
    while not interrupt_handler.got_signal:

        info, sweep = client.get_next()
        plot_data = processor.process(sweep)

        try:
            plot_process.put_data(
                plot_data)  # Will ignore the first None from processor
        except PlotProccessDiedException:
            break
        i += 1
    end = time.time()
    print(i + 1)
    print((end - start), "s")
    print("Disconnecting...")
    plot_process.close()
    client.disconnect()
    # k = 1
    # m = num_points
    # n = 50
    # matris_real = np.zeros((n, m), dtype=np.csingle)
    # matris_imag = np.zeros((n, m), dtype=np.csingle)
    # while not interrupt_handler.got_signal:
    #     if k < 100:
    #         k += 1
    #     matris_imag = np.roll(matris_imag, 1, axis=0)
    #     matris_real = np.roll(matris_real, 1, axis=0)
    #     info, sweep = client.get_next()
    #     vector_real_temp = np.real(sweep)
    #     vector_imag_temp = np.imag(sweep)
    #     matris_real[[0], :] = vector_real_temp
    #     matris_imag[[0], :] = vector_imag_temp
    #     vector_real = np.mean(matris_real, axis=0)
    #     vector_imag = np.mean(matris_imag, axis=0)
    #     vector = vector_real + 1j*vector_imag

    #     plot_data = processor.process(vector)
    #     if plot_data is not None:
    #         try:
    #             plot_process.put_data(plot_data)
    #         except PlotProccessDiedException:
    #             break

    # Fungerande test av medelvärdesbildning
    # k=100
    # while not interrupt_handler.got_signal:
    #     info, sweep = client.get_next()
    #     real_tot = np.zeros(num_points)
    #     imag_tot = np.zeros(num_points)
    #     for i in range(1, k):
    #         info, sweep = client.get_next()
    #         real = sweep.real
    #         imag = sweep.imag
    #         imag_tot = list(map(operator.add, imag_tot, imag))
    #         real_tot = np.add(real_tot, real)
    #         imag_tot = [x / k for x in imag_tot]
    #         real = [x / k for x in real_tot]

    #     plot_data = processor.process(sweep)
    #     if plot_data is not None:
    #         try:
    #             plot_process.put_data(plot_data)
    #         except PlotProccessDiedException:
    #             break

    print("Disconnecting...")
    plot_process.close()
    client.disconnect()
예제 #23
0
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    elif args.spi:
        client = RegSPIClient()
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = configs.IQServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [0.2, 0.6]
    config.sweep_rate = 10
    config.gain = 0.6

    info = client.setup_session(config)
    num_points = info["data_length"]

    amplitude_y_max = 0.3

    fig, (amplitude_ax, phase_ax) = plt.subplots(2)
    fig.set_size_inches(8, 6)
    fig.canvas.set_window_title("Acconeer matplotlib example")

    for ax in [amplitude_ax, phase_ax]:
        ax.set_xlabel("Depth (m)")
        ax.set_xlim(config.range_interval)
        ax.grid(True)

    amplitude_ax.set_ylabel("Amplitude")
    amplitude_ax.set_ylim(0, 1.1 * amplitude_y_max)
    phase_ax.set_ylabel("Phase")
    example_utils.mpl_setup_yaxis_for_phase(phase_ax)

    xs = np.linspace(*config.range_interval, num_points)
    amplitude_line = amplitude_ax.plot(xs, np.zeros_like(xs))[0]
    phase_line = phase_ax.plot(xs, np.zeros_like(xs))[0]

    fig.tight_layout()
    plt.ion()
    plt.show()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    client.start_streaming()

    while not interrupt_handler.got_signal:
        info, sweep = client.get_next()

        amplitude = np.abs(sweep)
        phase = np.angle(sweep)

        max_amplitude = np.max(amplitude)
        if max_amplitude > amplitude_y_max:
            amplitude_y_max = max_amplitude
            amplitude_ax.set_ylim(0, 1.1 * max_amplitude)

        amplitude_line.set_ydata(amplitude)
        phase_line.set_ydata(phase)

        if not plt.fignum_exists(1):  # Simple way to check if plot is closed
            break

        fig.canvas.flush_events()

    print("Disconnecting...")
    plt.close()
    client.disconnect()
예제 #24
0
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = config_setup()
    config.sensor = args.sensors

    tid = 10
    sekvenser = tid * config.sweep_rate
    filename = "Reflektor_2.csv"

    info = client.setup_session(config)
    num_points = info["data_length"]

    amplitude_y_max = 22000

    fig, (amplitude_ax) = plt.subplots(1)
    fig.set_size_inches(12, 6)
    fig.canvas.set_window_title(filename)

    for ax in [amplitude_ax]:
        ax.set_xlabel("Depth (m)")
        ax.set_xlim(config.range_interval)
        ax.set_xticks(np.linspace(0.4, 0.8, num=5))
        ax.set_xticks(np.concatenate([
            np.linspace(0.41, 0.49, num=9),
            np.linspace(0.51, 0.59, num=9),
            np.linspace(0.61, 0.69, num=9),
            np.linspace(0.71, 0.79, num=9)
        ]),
                      minor=True)
        ax.grid(True, which='major')
        ax.grid(True, which='minor')

    amplitude_ax.set_ylabel("Amplitude")
    amplitude_ax.set_ylim(0, 1.1 * amplitude_y_max)

    xs = np.linspace(*config.range_interval, num_points)
    amplitude_line = amplitude_ax.plot(xs, np.zeros_like(xs))[0]

    fig.tight_layout()
    plt.ion()
    plt.show()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    client.start_streaming()
    matris = np.zeros((sekvenser, 2))

    while not interrupt_handler.got_signal:
        # for i in range(0, sekvenser):
        info, sweep = client.get_next()
        amplitude = np.abs(sweep)
        ymax = amplitude.max()
        xmax = config.range_interval[0] + (config.range_interval[1] - config.range_interval[0]) * \
            (np.argmax(amplitude)/num_points)
        matris[0][:] = [xmax, ymax]
        matris = np.roll(matris, 1, axis=0)

        text = "x={:.2f}, y={:.2f}".format(xmax, ymax)
        bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
        arrowprops = dict(arrowstyle="->",
                          connectionstyle="angle,angleA=0,angleB=90")
        kw = dict(xycoords='data',
                  textcoords="axes fraction",
                  arrowprops=arrowprops,
                  bbox=bbox_props,
                  ha="right",
                  va="top")
        annotate = ax.annotate(text,
                               xy=(xmax, ymax),
                               xytext=(0.96, 0.96),
                               **kw)

        amplitude_line.set_ydata(amplitude)

        if not plt.fignum_exists(1):  # Simple way to check if plot is closed
            break
        fig.canvas.flush_events()
        annotate.remove()
    # matris = np.mean(matris, axis=0)
    # np.savetxt(filename, matris, delimiter=",")

    print("Disconnecting...")
    plt.close()
    client.disconnect()
예제 #25
0
def main():
    args = example_utils.ExampleArgumentParser(num_sens=1).parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    config = base_config()
    config.sensor = args.sensors

    info = client.setup_session(config)
    num_points = info["data_length"]

    # Setup plot window for amplitude and phase filled with zeros.
    amplitude_y_max = 1

    fig, (amplitude_ax, phase_ax1) = plt.subplots(2)
    fig.set_size_inches(12, 6)
    fig.canvas.set_window_title("Annotate test")
    fig, (ny_ax2) = plt.subplots(1)
    fig.set_size_inches(8, 5)
    fig.canvas.set_window_title("test två fönster")

    for ax in [amplitude_ax]:
        ax.set_xlabel("Depth (m)")
        ax.set_xlim(config.range_interval)
        ax.grid(True)
    for ax1 in [phase_ax1]:
        ax1.set_xlabel("Depth(m)")
        ax1.set_xlim(config.range_interval)
        ax1.grid(True)

    for ax2 in [ny_ax2]:
        ax2.set_xlabel("Depth (m)")
        ax2.set_xlim(config.range_interval)
        ax2.grid(True)

    amplitude_ax.set_ylabel("Amplitude")
    amplitude_ax.set_ylim(0, 1.0 * amplitude_y_max)
    phase_ax1.set_ylabel("Phase")
    example_utils.mpl_setup_yaxis_for_phase(phase_ax1)

    ny_ax2.set_ylim(-1, 1)

    xs = np.linspace(*config.range_interval, num_points)
    amplitude_line = amplitude_ax.plot(xs, np.zeros_like(xs))[0]
    phase_line = phase_ax1.plot(xs, np.zeros_like(xs))[0]
    ny_line = ny_ax2.plot(xs, np.zeros_like(xs))[0]

    fig.tight_layout()
    plt.ion()
    plt.show()

    # Setup box for annotation with maximum
    bbox_props = dict(boxstyle="square,pad=0.3", fc="w", ec="k", lw=0.72)
    arrowprops = dict(arrowstyle="->",
                      connectionstyle="angle,angleA=0,angleB=90")
    kw = dict(xycoords='data',
              textcoords="axes fraction",
              arrowprops=arrowprops,
              bbox=bbox_props,
              ha="right",
              va="top")

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    client.start_streaming()

    while not interrupt_handler.got_signal:
        # for i in range(0, 1):
        # Get new sensor data
        info, sweep = client.get_next()
        amplitude = np.abs(sweep)
        phase = np.angle(sweep)

        # Update annotation with the new amplitude and position
        ymax = amplitude.max()
        xmax = config.range_interval[0] + (config.range_interval[1] - config.range_interval[0]) * \
            (np.argmax(amplitude)/num_points)
        text = "x={:.2f}, y={:.2f}".format(xmax, ymax)
        annotate = ax.annotate(text,
                               xy=(xmax, ymax),
                               xytext=(0.96, 0.96),
                               **kw)
        vline_ax0 = ax.axvline(x=xmax,
                               ymin=0,
                               ymax=ymax,
                               linewidth=2,
                               color='k')
        vline_ax1 = ax1.axvline(x=xmax,
                                ymin=-np.pi,
                                ymax=np.pi,
                                linewidth=2,
                                color='k')

        # update plot with new sensor data
        amplitude_line.set_ydata(amplitude)
        phase_line.set_ydata(phase)

        if not plt.fignum_exists(1):  # Simple way to check if plot is closed
            break
        fig.canvas.flush_events()
        annotate.remove()
        vline_ax0.remove()
        vline_ax1.remove()

    print("Disconnecting...")
    plt.close()
    client.disconnect()
예제 #26
0
    def run(self):
        print("#### New thread for %s" % self.name)

        args = self._demo_ctrl.streaming_client_args
        print("args:", args)

        example_utils.config_logging(args)

        if args.socket_addr:
            client = JSONClient(args.socket_addr)
        else:
            port = args.serial_port or example_utils.autodetect_serial_port()
            client = RegClient(port)

        try:
            client.connect()
        except Exception as e:
            print("Got exception:", e)

        session_info = client.setup_session(self.config)
        print("Session info:\n", session_info, "\n")

        client.start_streaming()
        while not self.terminating:
            sweep_info, sweep_data = client.get_next()

            d = self.process_data(sweep_data)
            if d is not None:
                self._demo_ctrl.put_cmd(str(d))
            if self.terminating:
                break
        client.disconnect()
예제 #27
0
def main():
    args = example_utils.ExampleArgumentParser().parse_args()
    example_utils.config_logging(args)

    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    elif args.spi:
        client = RegSPIClient()
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    client.squeeze = False

    config = configs.SparseServiceConfig()
    config.sensor = args.sensors
    config.range_interval = [0.24, 1.20]
    config.sweep_rate = 60
    config.number_of_subsweeps = 16
    # config.hw_accelerated_average_samples = 60

    client.setup_session(config)

    pg_updater = PGUpdater(config)
    pg_process = PGProcess(pg_updater)
    pg_process.start()

    client.start_streaming()

    interrupt_handler = example_utils.ExampleInterruptHandler()
    print("Press Ctrl-C to end session")

    while not interrupt_handler.got_signal:
        info, data = client.get_next()

        try:
            pg_process.put_data(data)
        except PGProccessDiedException:
            break

    print("Disconnecting...")
    pg_process.close()
    client.disconnect()
예제 #28
0
def main():
    # To simplify the examples, we use a generic argument parser. It
    # lets you choose between UART/socket, set which sensor(s) to use,
    # and the verbosity level of the logging.
    args = example_utils.ExampleArgumentParser().parse_args()

    # Logging is done using the logging module with a logger named
    # acconeer_utils. We call another helper function which sets up the
    # logging according to the verbosity level set in the arguments.
    # -q  or --quiet:   ERROR   (typically not used)
    # default:          WARNING
    # -v  or --verbose: INFO
    # -vv or --debug:   DEBUG
    example_utils.config_logging(args)

    # Pick client depending on whether socket, SPI, or UART is used
    if args.socket_addr:
        client = JSONClient(args.socket_addr)
    elif args.spi:
        client = RegSPIClient()
    else:
        port = args.serial_port or example_utils.autodetect_serial_port()
        client = RegClient(port)

    # Create a configuration to run on the sensor. A good first choice
    # is the envelope service, so let's pick that one.
    config = configs.EnvelopeServiceConfig()

    # In all examples, we let you set the sensor(s) via the command line
    config.sensor = args.sensors

    # Set the measurement range [meter]
    config.range_interval = [0.2, 0.3]

    # Set the target measurement rate [Hz]
    config.sweep_rate = 10

    # Other configuration options might be available. Check out the
    # example for the corresponding service/detector to see more.

    client.connect()

    # In most cases, explicitly calling connect is not necessary as
    # setup_session below will call connect if not already connected.

    # Set up the session with the config we created. If all goes well,
    # some information/metadata for the configured session is returned.
    session_info = client.setup_session(config)
    print("Session info:\n", session_info, "\n")

    # Now would be the time to set up plotting, signal processing, etc.

    # Start streaming data from the session. This call will block until
    # the sensor has confirmed that streaming has started.
    client.start_streaming()

    # Alternatively, start_streaming can be given the config instead. In
    # that case, the client will call setup_session(config) for you
    # before starting the stream. For example:
    # session_info = client.start_streaming(config)
    # As this will call setup_session in the background, this will also
    # connect if not already connected.

    # In this simple example, we just want to get a couple of sweeps.
    # To get a sweep, call get_next. get_next will block until the sweep
    # is recieved. Some information/metadata is returned together with
    # the data.

    for i in range(3):
        sweep_info, sweep_data = client.get_next()
        print("Sweep {}:\n".format(i + 1), sweep_info, "\n", sweep_data, "\n")

    # We're done, stop streaming. All buffered/waiting sweeps are thrown
    # away. This call will block until the sensor has confirmed that
    # streaming/session has ended.
    client.stop_streaming()

    # Calling stop_streaming before disconnect is not necessary as
    # disconnect will call stop_streaming if streaming is started.

    # Remember to always call disconnect to do so gracefully
    client.disconnect()