前提・実現したいこと
初めて質問いたします。pythonにて複数のセンサ(TWILITE2525A)から取得したデータをリアルタイムにグラフ表示するプログラムを作成したいです。https://github.com/ubi-naist/2525Utilを参考に複数(とりあえず2台)のセンサから加速度を取得するプログラムを作成したいのですが、1台目のデータしか表示されない状況です。
プログラミングについてはど素人で、基本的な理解が足りない部分が多くあると思いますが、どなたか解決策のご教授お願いいたします。
コードは以下の通りです。
発生している問題
エラーメッセージは表示されませんが、1台分のグラフしか表示されません。
該当のソースコード
python
# -*- coding: utf-8 -*- import serial import threading import matplotlib.pyplot as plt import numpy as np import time import copy import os from argparse import ArgumentParser from Twilite2525AReceiver import Twilite2525AReceiver sensor_data = {} log = False log_folder = 'log' log_path = '' data_keys = ['rc', 'lq', 'ct', 'ed', 'id', 'ba', 'a1', 'a2', 'x', 'y', 'z', 'ts'] def argv_parser(): argparser = ArgumentParser() argparser.add_argument('--log', action='store_const', const=True, default=False) args_param = argparser.parse_args() return args_param def port_reader1(file_name='port1.txt'): with open(file_name, 'r') as p_file: port1 = p_file.readline().strip() return port1 def port_reader2(file_name='port2.txt'): with open(file_name, 'r') as p_file: port2 = p_file.readline().strip() return port2 def received(timestamp, data, length=50): # print(timestamp, data['ed'], data['id'], data['ct'], data['lq'], flush=True) if log: content = str(timestamp) for key in data_keys: content += ',' + data[key] with open(log_path, 'a') as f: f.write(content + '\n') keys = ['time', 'x', 'y', 'z'] x = float(data['x'])/100. y = float(data['y'])/100. z = float(data['z'])/100. values = [timestamp, x, y, z] ed = data['ed'] + ':' + data['id'] # print(timestamp, ed, x, y, z) if ed in sensor_data.keys(): if len(sensor_data[ed][keys[0]]) >= length: for key, value in zip(keys, values): sensor_data[ed][key].pop(0) for key, value in zip(keys, values): sensor_data[ed][key].append(value) else: sensor_data[ed] = {} for key in keys: sensor_data[ed][key] = [] sensor_data[ed]['time'].append(timestamp) sensor_data[ed]['x'].append(x) sensor_data[ed]['y'].append(y) sensor_data[ed]['z'].append(z) def plot_data1(start_time): keys = ['x', 'y', 'z'] current_node_size = 0 plot_dict = {} while True: sensor_data_cp = copy.deepcopy(sensor_data) node_size = len(sensor_data_cp.keys()) if node_size > 0: if current_node_size != node_size: current_node_size = node_size plt.close() fig, axs = plt.subplots(node_size, 1) plot_dict = {} if current_node_size == 1: axs = [axs] for ed, ax in zip(sensor_data_cp.keys(), axs): plot_dict[ed] = {} plot_dict[ed]['ax'] = ax time_array = np.array(sensor_data_cp[ed]['time']) - start_time for key in keys: plot_dict[ed][key], = ax.plot(time_array, sensor_data_cp[ed][key]) ax.set_ylabel(ed) else: for ed in plot_dict.keys(): time_array = np.array(sensor_data_cp[ed]['time']) - start_time if len(time_array) < 2: continue for key in keys: plot_dict[ed][key].set_data(time_array, sensor_data_cp[ed][key]) plot_dict[ed]['ax'].set_xlim((time_array.min(), time_array.max())) plot_dict[ed]['ax'].set_ylim((-3, 3)) # print(len(time_array)) plt.pause(0.05) def plot_data2(start_time): keys = ['x', 'y', 'z'] current_node_size = 0 plot_dict = {} while True: sensor_data_cp = copy.deepcopy(sensor_data) node_size = len(sensor_data_cp.keys()) if node_size > 0: if current_node_size != node_size: current_node_size = node_size plt.close() fig, axs = plt.subplots(node_size, 1) plot_dict = {} if current_node_size == 1: axs = [axs] for ed, ax in zip(sensor_data_cp.keys(), axs): plot_dict[ed] = {} plot_dict[ed]['ax'] = ax time_array = np.array(sensor_data_cp[ed]['time']) - start_time for key in keys: plot_dict[ed][key], = ax.plot(time_array, sensor_data_cp[ed][key]) ax.set_ylabel(ed) else: for ed in plot_dict.keys(): time_array = np.array(sensor_data_cp[ed]['time']) - start_time if len(time_array) < 2: continue for key in keys: plot_dict[ed][key].set_data(time_array, sensor_data_cp[ed][key]) plot_dict[ed]['ax'].set_xlim((time_array.min(), time_array.max())) plot_dict[ed]['ax'].set_ylim((-3, 3)) # print(len(time_array)) plt.pause(0.05) def main(): try: # twilite2525 port1 = port_reader1() port2 = port_reader2() ser1 = serial.Serial(port1, 115200, timeout=1) ser2 = serial.Serial(port2, 115200, timeout=1) if log: log_file = open(log_path, 'w') header = 'timestamp' for key in data_keys: header += ',' + key log_file.write(header + '\n') log_file.close() twilite1 = Twilite2525AReceiver(ser1, received) twilite1.run() # matplotlib start_time = time.time() plot_data1(start_time) twilite2 = Twilite2525AReceiver(ser2, received) twilite2.run() # matplotlib start_time = time.time() plot_data2(start_time) except serial.SerialException: print('error:could not open port') exit(-1) if __name__ == '__main__': args = argv_parser() if args.log: print('-- logging option') log = True if not os.path.exists('.' + os.sep + log_folder): os.mkdir(log_folder) timestamp_str = str(int(time.time())) log_path = '.' + os.sep + log_folder + os.sep + timestamp_str + '-log.csv' main()
補足情報
TWILITE2525Aについて
https://mono-wireless.com/jp/products/TWE-Lite-2525A/index.html
以下のコードを参考にしました。
https://github.com/ubi-naist/2525Util
まだ回答がついていません
会員登録して回答してみよう