Coder Social home page Coder Social logo

scaling-potato's Introduction

使い方

#include "chem30338.h"

int main() {

    using namespace chem30338;

    constexpr float h = 0.05f;

    constexpr pid_params params = pid_params_builder(
                p_gain{0.8f}, i_time{0.4f}, d_time{0.1f}
            )
            .alpha(0.1f).beta(0.5f).gamma(0.5f)
            .params();

    pid_bilinear pid(params, h);

    for (;;) {
        float r, y;
        std::scanf("%f,%f", &r, &y);
        float u = pid.update(r, y);
        std::printf("%f\n", u);
    }
}

C++14 以上が必要

chem30338.h

class pid_bilinear

PID制御器

参照: https://jckantor.github.io/CBE30338/05.04-Controller-Tuning-Rules-in-Frequency-Domain.html

  • 目標値重み付け、近似微分を用いる
  • 双一次変換による離散化
  • クランピングやワインドアップ防止はされない

pid_bilinear::pid_bilinear(const pid_params &params, float h)

  • params: パラメータ
  • h: サンプリング周期

float pid_bilinear::update(float sp, float meas)

  • sp: 目標値
  • meas: 制御量
  • 戻り値: 制御入力

class pid_params_builder

パラメータビルダ

  • pid_paramsはこれを使って作成することを推奨
  • alpha, beta, gamma はデフォルト値が存在する
  • デフォルト値は今後変わるかもしれないので、(特にローパスフィルタのパラメータalpha or lpf_tauは) それぞれのメンバ関数によって明示的に設定することを推奨

pid_params_builder::pid_params_builder(p_gain kp, i_gain ki, d_gain kd)

  • 比例ゲイン、積分時間、微分時間から初期化
  • alpha = 0.02f, beta = 1.f, gamma = 1.f に設定される

pid_params_builder::pid_params_builder(p_gain kp, i_time ti, d_time td)

  • 比例ゲイン、積分ゲイン、微分ゲインから初期化
  • alpha = 0.15f*td, beta = 1.f, gamma = 1.f に設定される

pid_params_builder &pid_params_builder::{alpha, beta, gamma, lpf_tau}(float value)

  • alpha, beta, gammaをそれぞれ設定
  • lpf_tauは近似微分におけるローパスフィルタの時定数

pid_params pid_params_builder::params() const

  • pid_paramsを生成する

参考

CBE30338 Controller Tuning Rules in Frequency Domain PID Controller Implementation in Software ディジタル制御システム 第3章 ディジタル PI 制御と離散化

zsequence.h

template <class T, std::size_t N> class zsequence<T, N>

  • 時系列データを表す
  • curr()によって現在の値、prev<I>()によってI個前の値を取得 (prev(i)はない)
  • advance(next)によって次の時刻の値をプッシュ
  • リスト初期化により初期値を設定(zsequence<float, 2> seq = { 2, 3 };)
  • N == 2 のとき
    • 現在と一つ前の値を直接移動させる
    • prev() をもつ (prev<1>()と等価)
  • N > 2 のとき
    • リングバッファによるキュー

scaling-potato's People

Contributors

miuele avatar

Stargazers

 avatar

Watchers

 avatar

Forkers

yutakoizumi

scaling-potato's Issues

ワインドアップ防止

いまのpid_bilinearはすべての状態遷移(積分も)をupdate内でおこなっているので、外からこの機能を付け足すことはできない。
STLのアロケータのようにアンチワインダーをポリシーとして与えられるのが理想だけど、アンチワインダーの入力に必要な情報は実装によって大きく異なる。このため離散化したPID制御器本体の多くの状態変数と結びつくことがあり、分離しにくい気がする。
付属するアンチワインダーごとに別々の制御器クラスを作るのが無難?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.