Pythonを使用してステップ応答を評価する[ファイル読み込みから軌跡プロットまで]

制御

本記事では、データロガーで取得したステップ応答データをPythonにて自動処理するサンプルコードを紹介します。

想定される状況と実現したいPython処理内容

想定される状況

何かしらの実験環境にて実行したステップ応答結果をデータロガーを使用して取得したとします。

出力形式はcsvファイルです。

ステップ応答結果を評価する、また図をプロットすることをExcelで行うことが多いと思います。

しかし、大量の実験データを処理するのは非常に大変ですので、Pythonで自動化したいとだれもが思うでしょう。

そこで、Chat GPT様に聞き、サンプルコードを作りました。

実現したいPython処理内容

  • 指定したフォルダ内の全てのcsvファイルの読み込み
  • ステップ応答の評価項目を一つのExcelファイルに保存
  • 図のプロット

サンプルコード

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
from control.matlab import stepinfo
from openpyxl import Workbook

# CSVファイルが格納されているディレクトリ
directory_path = 'ここにディレクトリパスを記述'

# Excelファイルのパスを設定(ディレクトリ内に保存)
excel_file = os.path.join(directory_path, 'stepinfo_results.xlsx')

# Excelファイルを作成し、結果を保存する
wb = Workbook()
ws = wb.active
ws.title = "StepInfo Results"

# stepinfoのすべてのキーをヘッダーとして定義
stepinfo_keys = ['RiseTime', 'SettlingTime', 'Overshoot', 'Undershoot', 'Peak', 'PeakTime', 'SettlingMin', 'SettlingMax', 'SteadyStateValue']

# Excelファイルのヘッダー行を設定
ws.append(['File Name'] + stepinfo_keys)

# ディレクトリ内のすべてのCSVファイルを処理
for filename in os.listdir(directory_path):
    if filename.endswith(".csv"):
        file_path = os.path.join(directory_path, filename)
        
        # CSVファイルの読み込み(コメント行を無視)
        data = pd.read_csv(file_path, header=1)
        
        # TimeとDataを抽出
        time = data['Time'].values
        data_values = data['Data'].values
        
        # ステップ応答の評価項目を計算
        info = stepinfo(data_values, time)
        
        # infoからすべてのステップ応答情報を取得し、Excelに書き込む
        stepinfo_values = [info.get(key, 'N/A') for key in stepinfo_keys]
        ws.append([filename] + stepinfo_values)
        
        # 応答のプロット
        plt.plot(time, data_values, label='Step Response')
        plt.title(f'Step Response for {filename}')
        plt.xlabel('Time (seconds)')
        plt.ylabel('Response')
        plt.grid(True)
        
        # stepinfoの結果をグラフ上に描画
        plt.axhline(y=info['Overshoot']/100 * max(data_values), color='r', linestyle='--', label='Overshoot')
        plt.axhline(y=1.02, color='g', linestyle='--', label='Settling Band (2%)')
        plt.axhline(y=0.98, color='g', linestyle='--')
        
        plt.axvline(x=info['RiseTime'], color='b', linestyle='--', label='Rise Time')
        plt.axvline(x=info['SettlingTime'], color='purple', linestyle='--', label='Settling Time')
        plt.axvline(x=info['PeakTime'], color='orange', linestyle='--', label='Peak Time')
        
        # 凡例を表示
        plt.legend()
        
        # プロットを画像ファイルとして保存
        plot_filename = os.path.join(directory_path, f'{filename}_plot.png')
        plt.savefig(plot_filename)
        plt.close()

# Excelファイルを保存
wb.save(excel_file)

print(f"All CSV files processed and results saved to {excel_file}")

stepinfoの戻り値infoの中身

RiseTime(立ち上がり時間)

定義: ステップ応答が初めて10%から90%に達するのにかかる時間を表します。これは、応答が急激に上昇する部分を評価するために使われます。
計算方法: 応答データが最初の10%の定常状態値(最終的な出力値)に到達してから、90%の値に達するまでの時間を計測します。

SettlingTime(定常状態到達時間)

定義: 応答が最終値の特定の範囲内(通常は±2%)に収束するまでの時間を示します。システムが安定状態に達する速度を評価するために重要です。
計算方法: ステップ応答が最終的な定常状態値に収束するまでの時間を確認します。

Overshoot(オーバーシュート)

定義: 応答が最終値を超えた最大の値とその最終値との差をパーセントで示します。これは、応答が目標値をどれだけ超えたかを評価する指標です。
計算方法: 最大応答値と最終定常状態値との差を最終定常状態値で割り、パーセントとして表します。

Undershoot(アンダーシュート)

定義: 応答が最終値に達する前に下回った最小値と最終値との差を示します。アンダーシュートはオーバーシュートと対を成す概念です。
計算方法: 最小応答値と最終定常状態値との差を計算します。

Peak(ピーク)

定義: ステップ応答の最大値を示します。これは、応答の最大振幅を評価するための指標です。
計算方法: ステップ応答のデータの中で最も高い値を取得します。

SteadyStateValue(定常状態値)

定義: システムが最終的に収束する値を示します。これは、制御システムの出力が長期的に維持される値です。
計算方法: 応答データの長期平均または最終的な値を使用して計算します。

PeakTime(ピーク時間)

定義: ステップ応答が最大値に達するまでの時間を示します。オーバーシュートの発生タイミングを把握するために重要です。
計算方法: ステップ応答データの中で最大値が発生する時刻を特定します

参考書籍と参考サイト

タイトルとURLをコピーしました