ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
MovingDifferentiator.hh
[詳解]
1
8//
9// Copyright (C) 2011-2022 Yokokura, Yuki
10// This program is free software;
11// you can redistribute it and/or modify it under the terms of the FreeBSD License.
12// For details, see the License.txt file.
13
14#ifndef MOVINGDIFFERENTIATOR
15#define MOVINGDIFFERENTIATOR
16
17#include <cmath>
18#include "RingBuffer.hh"
19
20// ARCS組込み用マクロ
21#ifdef ARCS_IN
22 // ARCSに組み込まれる場合
23 #include "ARCSassert.hh"
24 #include "ARCSeventlog.hh"
25#else
26 // ARCSに組み込まれない場合
27 #define arcs_assert(a) (assert(a))
28 #define PassedLog()
29 #define EventLog(a)
30 #define EventLogVar(a)
31#endif
32
33namespace ARCS { // ARCS名前空間
37template <size_t W, typename T = double>
39 public:
42 : VarWindow(), TimeWindow(), FirstTime(true)
43 {
44
45 }
46
50 : VarWindow(r.VarWindow), TimeWindow(r.TimeWindow), FirstTime(r.FirstTime)
51 {
52
53 }
54
59
64 double GetSignal(const double Var, const double Time){
65 if(FirstTime){
66 // 初めて呼ばれた場合は,
67 VarWindow.FillBuffer(Var); // 初期位置でバッファを埋めておく
68 TimeWindow.FillBuffer(Time); // 初期時刻でバッファを埋めておく
69 FirstTime = false; // フラグリセット
70 return 0; // 最初の1回目は速度を計算できないのでゼロ
71 }else{
72 // 2回目以降は,
73 const T dx = Var - VarWindow.GetFinalValue(); // 現在位置と位置リングバッファの最後尾との偏差の計算
74 const double dt = Time - TimeWindow.GetFinalValue();// 現在時刻と時刻リングバッファの最後尾との偏差の計算
75 const T v = dx/dt; // 微分の計算
76 VarWindow.SetFirstValue(Var); // 位置リングバッファの先頭に現在位置を詰める
77 TimeWindow.SetFirstValue(Time); // 時刻リングバッファの先頭に現在時刻を詰める
78 if(std::isfinite(v)){
79 return v; // 微分結果が有限値なら計算結果を返す
80 }else{
81 return 0; // ゼロ割のときはゼロにしておく
82 }
83 }
84 }
85
90 template<size_t NN, size_t MM>
91 Matrix<NN,MM> GetSignal(const Matrix<NN,MM>& Var, const double Time){
92 if(FirstTime){
93 // 初めて呼ばれた場合は,
94 VarWindow.FillBuffer(Var); // 初期位置でバッファを埋めておく
95 TimeWindow.FillBuffer(Time); // 初期時刻でバッファを埋めておく
96 FirstTime = false; // フラグリセット
97 return Matrix<NN,MM>::zeros(); // 最初の1回目は速度を計算できないのでゼロ
98 }else{
99 // 2回目以降は,
100 const T dx = Var - VarWindow.GetFinalValue(); // 現在位置と位置リングバッファの最後尾との偏差の計算
101 const double dt = Time - TimeWindow.GetFinalValue();// 現在時刻と時刻リングバッファの最後尾との偏差の計算
102 const T v = dx/dt; // 微分の計算
103 VarWindow.SetFirstValue(Var); // 位置リングバッファの先頭に現在位置を詰める
104 TimeWindow.SetFirstValue(Time); // 時刻リングバッファの先頭に現在時刻を詰める
105 return v; // 計算結果を返す
106 }
107 }
108
110 void Reset(void){
111 FirstTime = true;
112 }
113
114 private:
116 const MovingDifferentiator& operator=(const MovingDifferentiator&) = delete;
117 RingBuffer<T, W, false> VarWindow;
119 bool FirstTime;
120};
121}
122
123#endif
124
ARCS イベントログクラス
ARCS用ASSERTクラス
行列/ベクトル計算クラス(テンプレート版)
Definition Matrix.hh:44
static constexpr Matrix zeros(void)
m行n列の零行列を返す関数
Definition Matrix.hh:648
移動微分器
Definition MovingDifferentiator.hh:38
void Reset(void)
リセット
Definition MovingDifferentiator.hh:110
Matrix< NN, MM > GetSignal(const Matrix< NN, MM > &Var, const double Time)
微分値を計算する関数(行列版)
Definition MovingDifferentiator.hh:91
MovingDifferentiator(MovingDifferentiator &&r)
ムーブコンストラクタ
Definition MovingDifferentiator.hh:49
~MovingDifferentiator()
デストラクタ
Definition MovingDifferentiator.hh:56
double GetSignal(const double Var, const double Time)
微分値を計算する関数(double版)
Definition MovingDifferentiator.hh:64
MovingDifferentiator()
コンストラクタ
Definition MovingDifferentiator.hh:41
リングバッファクラス
Definition RingBuffer.hh:51
T GetFinalValue(void)
バッファから最後尾の値を取り出す関数
Definition RingBuffer.hh:128
void SetFirstValue(const T &u)
値をバッファの先頭に格納する関数
Definition RingBuffer.hh:80
void FillBuffer(const T &u)
バッファを指定値で埋める
Definition RingBuffer.hh:160