MicroMouse Control Module  v1.3.2-2-ge2c6882
公開メンバ関数 | 限定公開変数類 | フレンド | 全メンバ一覧
ctrl::AccelDesigner クラス

拘束条件を満たす曲線加減速の軌道を生成するクラス [詳解]

#include <accel_designer.h>

ctrl::AccelDesigner の継承関係図
Inheritance graph
[凡例]
ctrl::AccelDesigner 連携図
Collaboration graph
[凡例]

公開メンバ関数

 AccelDesigner (const float j_max, const float a_max, const float v_max, const float v_start, const float v_target, const float dist, const float x_start=0, const float t_start=0)
 初期化付きコンストラクタ [詳解]
 
 AccelDesigner ()
 とりあえずインスタンス化を行う空のコンストラクタ [詳解]
 
void reset (const float j_max, const float a_max, const float v_max, const float v_start, const float v_target, const float dist, const float x_start=0, const float t_start=0)
 引数の拘束条件から曲線を生成する関数 [詳解]
 
float j (const float t) const
 任意の時刻 t [s] における躍度 j [m/s/s/s] を返す関数 [詳解]
 
float a (const float t) const
 任意の時刻 t [s] における加速度 a [m/s/s] を返す関数 [詳解]
 
float v (const float t) const
 任意の時刻 t [s] における速度 v [m/s] を返す関数 [詳解]
 
float x (const float t) const
 任意の時刻 t [s] における位置 x [m] を返す関数 [詳解]
 
float t_end () const
 終点時刻 [s] [詳解]
 
float v_end () const
 終点速度 [m/s] [詳解]
 
float x_end () const
 終点位置 [m] [詳解]
 
float t_0 () const
 曲線加速の開始時刻 [s] [詳解]
 
float t_1 () const
 最高速度に達する時刻 [s] [詳解]
 
float t_2 () const
 曲線減速の開始時刻 [s] [詳解]
 
float t_3 () const
 曲線減速の終了時刻 [s] [詳解]
 
const std::array< float, 8 > getTimeStamps () const
 曲線加速の境界のタイムスタンプを取得 [詳解]
 
void printCsv (const float t_interval=1e-3f) const
 stdout に軌道のcsvを出力する関数。 [詳解]
 
void printCsv (std::ostream &os, const float t_interval=1e-3f) const
 std::ostream に軌道のcsvを出力する関数。 [詳解]
 

限定公開変数類

float t0
 
float t1
 
float t2
 
float t3
 境界点の時刻 [s] [詳解]
 
float x0
 
float x3
 境界点の位置 [m] [詳解]
 
AccelCurve ac
 曲線加速用オブジェクト [詳解]
 
AccelCurve dc
 曲線減速用オブジェクト [詳解]
 

フレンド

std::ostream & operator<< (std::ostream &os, const AccelDesigner &obj)
 情報の表示 [詳解]
 

詳解

拘束条件を満たす曲線加減速の軌道を生成するクラス

構築子と解体子

◆ AccelDesigner() [1/2]

ctrl::AccelDesigner::AccelDesigner ( const float  j_max,
const float  a_max,
const float  v_max,
const float  v_start,
const float  v_target,
const float  dist,
const float  x_start = 0,
const float  t_start = 0 
)
inline

初期化付きコンストラクタ

引数
[in]j_max最大躍度の大きさ [m/s/s/s]、正であること
[in]a_max最大加速度の大きさ [m/s/s], 正であること
[in]v_max最大速度の大きさ [m/s]、正であること
[in]v_start始点速度 [m/s]
[in]v_target目標速度 [m/s]
[in]dist移動距離 [m]
[in]x_start始点位置 [m] (オプション)
[in]t_start始点時刻 [s] (オプション)
49  {
50  reset(j_max, a_max, v_max, v_start, v_target, dist, x_start, t_start);
51  }
void reset(const float j_max, const float a_max, const float v_max, const float v_start, const float v_target, const float dist, const float x_start=0, const float t_start=0)
引数の拘束条件から曲線を生成する関数
Definition: accel_designer.h:70
呼び出し関係図:

◆ AccelDesigner() [2/2]

ctrl::AccelDesigner::AccelDesigner ( )
inline

とりあえずインスタンス化を行う空のコンストラクタ

注意
別途 reset() により初期化すること。
56 { t0 = t1 = t2 = t3 = x0 = x3 = 0; }
float t3
境界点の時刻 [s]
Definition: accel_designer.h:280
float x3
境界点の位置 [m]
Definition: accel_designer.h:281
float t0
Definition: accel_designer.h:280
float x0
Definition: accel_designer.h:281
float t2
Definition: accel_designer.h:280
float t1
Definition: accel_designer.h:280

関数詳解

◆ a()

float ctrl::AccelDesigner::a ( const float  t) const
inline

任意の時刻 t [s] における加速度 a [m/s/s] を返す関数

引数
[in]時刻t [s]
戻り値
加速度 [m/s/s]
178  {
179  if (t < t2)
180  return ac.a(t - t0);
181  else
182  return dc.a(t - t2);
183  }
float a(const float t) const
任意の時刻 t [s] における加速度 a [m/s/s] を返す関数
Definition: accel_curve.h:149
AccelCurve dc
曲線減速用オブジェクト
Definition: accel_designer.h:283
AccelCurve ac
曲線加速用オブジェクト
Definition: accel_designer.h:282
呼び出し関係図:

◆ getTimeStamps()

const std::array<float, 8> ctrl::AccelDesigner::getTimeStamps ( ) const
inline

曲線加速の境界のタイムスタンプを取得

237  {
238  return {{
239  t0 + ac.t_0(),
240  t0 + ac.t_1(),
241  t0 + ac.t_2(),
242  t0 + ac.t_3(),
243  t2 + dc.t_0(),
244  t2 + dc.t_1(),
245  t2 + dc.t_2(),
246  t2 + dc.t_3(),
247  }};
248  }
float t_2() const
等加速度直線運動の終了時刻 [s]
Definition: accel_curve.h:218
float t_3() const
曲線加速の終了時刻 [s]
Definition: accel_curve.h:222
float t_1() const
等加速度直線運動の開始時刻 [s]
Definition: accel_curve.h:214
float t_0() const
曲線加速の開始時刻 [s]
Definition: accel_curve.h:210
呼び出し関係図:

◆ j()

float ctrl::AccelDesigner::j ( const float  t) const
inline

任意の時刻 t [s] における躍度 j [m/s/s/s] を返す関数

引数
[in]時刻t [s]
戻り値
躍度 [m/s/s/s]
167  {
168  if (t < t2)
169  return ac.j(t - t0);
170  else
171  return dc.j(t - t2);
172  }
float j(const float t) const
任意の時刻 t [s] における躍度 j [m/s/s/s] を返す関数
Definition: accel_curve.h:132
呼び出し関係図:

◆ printCsv() [1/2]

void ctrl::AccelDesigner::printCsv ( const float  t_interval = 1e-3f) const
inline

stdout に軌道のcsvを出力する関数。

252  {
253  printCsv(std::cout, t_interval);
254  }
void printCsv(const float t_interval=1e-3f) const
stdout に軌道のcsvを出力する関数。
Definition: accel_designer.h:252

◆ printCsv() [2/2]

void ctrl::AccelDesigner::printCsv ( std::ostream &  os,
const float  t_interval = 1e-3f 
) const
inline

std::ostream に軌道のcsvを出力する関数。

258  {
259  for (float t = t0; t < t_end(); t += t_interval)
260  os << t << "," << j(t) << "," << a(t) << "," << v(t) << "," << x(t)
261  << std::endl;
262  }
float j(const float t) const
任意の時刻 t [s] における躍度 j [m/s/s/s] を返す関数
Definition: accel_designer.h:167
float a(const float t) const
任意の時刻 t [s] における加速度 a [m/s/s] を返す関数
Definition: accel_designer.h:178
float t_end() const
終点時刻 [s]
Definition: accel_designer.h:209
float x(const float t) const
任意の時刻 t [s] における位置 x [m] を返す関数
Definition: accel_designer.h:200
float v(const float t) const
任意の時刻 t [s] における速度 v [m/s] を返す関数
Definition: accel_designer.h:189
呼び出し関係図:

◆ reset()

void ctrl::AccelDesigner::reset ( const float  j_max,
const float  a_max,
const float  v_max,
const float  v_start,
const float  v_target,
const float  dist,
const float  x_start = 0,
const float  t_start = 0 
)
inline

引数の拘束条件から曲線を生成する関数

この関数によってもれなくすべての変数が初期化される。

引数
[in]j_max最大躍度の大きさ [m/s/s/s]、正であること
[in]a_max最大加速度の大きさ [m/s/s], 正であること
[in]v_max最大速度の大きさ [m/s]、正であること
[in]v_start始点速度 [m/s]
[in]v_target目標速度 [m/s]
[in]dist移動距離 [m]
[in]x_start始点位置 [m] (オプション)
[in]t_start始点時刻 [s] (オプション)
72  {
73  /* 目標速度に到達可能か、走行距離から終点速度を決定していく */
74  auto v_end = v_target; //< 仮代入
75  /* 移動距離の拘束により、目標速度に達し得ない場合の処理 */
77  j_max, a_max, v_start, v_end);
78  if (std::abs(dist) < std::abs(dist_min)) {
79  ctrl_logd << "vs -> ve != vt" << std::endl;
80  /* 目標速度$v_t$に向かい、走行距離$d$で到達し得る終点速度$v_e$を算出 */
81  v_end = AccelCurve::calcReachableVelocityEnd(j_max, a_max, v_start,
82  v_target, dist);
83  }
84  /* 飽和速度の仮置き */
85  auto v_sat = dist > 0 ? std::max({v_start, v_max, v_end})
86  : std::min({v_start, -v_max, v_end});
87  /* 曲線を生成 */
88  ac.reset(j_max, a_max, v_start, v_sat); //< 加速部分
89  dc.reset(j_max, a_max, v_sat, v_end); //< 減速部分
90  /* 最大速度まで加速すると走行距離の拘束を満たさない場合の処理 */
91  const auto d_sum = ac.x_end() + dc.x_end();
92  if (std::abs(dist) < std::abs(d_sum)) {
93  ctrl_logd << "vs -> vr -> ve" << std::endl;
94  /* 走行距離などの拘束から到達可能速度を算出 */
95  const auto v_rm = AccelCurve::calcReachableVelocityMax(
96  j_max, a_max, v_start, v_end, dist);
97  /* 無駄な減速を回避 */
98  v_sat = dist > 0 ? std::max({v_start, v_rm, v_end})
99  : std::min({v_start, v_rm, v_end});
100  ac.reset(j_max, a_max, v_start, v_sat); //< 加速
101  dc.reset(j_max, a_max, v_sat, v_end); //< 減速
102  }
103  /* t23 = nan 回避; vs = ve = d = 0 のときに発生 */
104  if (std::abs(v_sat) < std::numeric_limits<float>::epsilon()) v_sat = 1;
105  /* 各定数の算出 */
106  const auto t23 = (dist - ac.x_end() - dc.x_end()) / v_sat;
107  x0 = x_start;
108  x3 = x_start + dist;
109  t0 = t_start;
110  t1 = t0 + ac.t_end(); //< 曲線加速終了の時刻
111  t2 = t0 + ac.t_end() + t23; //< 等速走行終了の時刻
112  t3 = t0 + ac.t_end() + t23 + dc.t_end(); //< 曲線減速終了の時刻
113 #if 0
114  /* 出力のチェック */
115  const auto e = 0.01f; //< 数値誤差分
116  bool show_info = false;
117  /* 飽和速度時間 */
118  if (t23 < 0) {
119  ctrl_logd << t23 << std::endl;
120  show_info = true;
121  }
122  /* 終点速度 */
123  if (std::abs(v_start - v_end) > e + std::abs(v_start - v_target)) {
124  std::cerr << "Error: Velocity Target!" << std::endl;
125  show_info = true;
126  }
127  /* 飽和速度 */
128  if (std::abs(v_sat) >
129  e + std::max({v_max, std::abs(v_start), std::abs(v_end)})) {
130  std::cerr << "Error: Velocity Saturation!" << std::endl;
131  show_info = true;
132  }
133  /* タイムスタンプ */
134  if (!(t0 <= t1 + e && t1 <= t2 + e && t2 <= t3 + e)) {
135  ctrl_loge << "Error: Time Point Relationship!" << std::endl;
136  show_info = true;
137  }
138  /* 入力情報の表示 */
139  if (show_info) {
140  ctrl_loge << "Constraints:"
141  << "\tj_max: " << j_max << "\ta_max: " << a_max
142  << "\tv_max: " << v_max << "\tv_start: " << v_start
143  << "\tv_target: " << v_target << "\tdist: " << dist
144  << std::endl;
145  ctrl_loge << "ad.reset(" << j_max << ", " << a_max << ", " << v_max
146  << ", " << v_start << ", " << v_target << ", " << dist << ");"
147  << std::endl;
148  /* 表示 */
149  ctrl_loge << "Time Stamp: "
150  << "\tt0: " << t0 << "\tt1: " << t1 << "\tt2: " << t2
151  << "\tt3: " << t3 << std::endl;
152  ctrl_loge << "Position: "
153  << "\tx0: " << x0 << "\tx1: " << x0 + ac.x_end()
154  << "\tx2: " << x0 + (dist - dc.x_end()) << "\tx3: " << x3
155  << std::endl;
156  ctrl_loge << "Velocity: "
157  << "\tv0: " << v_start << "\tv1: " << v(t1) << "\tv2: " << v(t2)
158  << "\tv3: " << v_end << std::endl;
159  }
160 #endif
161  }
#define ctrl_logd
Definition: accel_curve.h:48
#define ctrl_loge
Definition: accel_curve.h:28
static float calcReachableVelocityMax(const float j_max, const float a_max, const float vs, const float ve, const float d)
走行距離の拘束から達しうる最大速度を算出する関数
Definition: accel_curve.h:316
float x_end() const
終点位置 [m]
Definition: accel_curve.h:206
void reset(const float j_max, const float a_max, const float v_start, const float v_end)
引数の拘束条件から曲線を生成する関数
Definition: accel_curve.h:92
float t_end() const
終点時刻 [s]
Definition: accel_curve.h:198
static float calcReachableVelocityEnd(const float j_max, const float a_max, const float vs, const float vt, const float d)
走行距離の拘束から達しうる終点速度を算出する関数
Definition: accel_curve.h:263
static float calcDistanceFromVelocityStartToEnd(const float j_max, const float a_max, const float v_start, const float v_end)
速度差の拘束から達しうる変位を算出する関数
Definition: accel_curve.h:345
float v_end() const
終点速度 [m/s]
Definition: accel_designer.h:213
呼び出し関係図:

◆ t_0()

float ctrl::AccelDesigner::t_0 ( ) const
inline

曲線加速の開始時刻 [s]

221 { return t0; }

◆ t_1()

float ctrl::AccelDesigner::t_1 ( ) const
inline

最高速度に達する時刻 [s]

225 { return t1; }

◆ t_2()

float ctrl::AccelDesigner::t_2 ( ) const
inline

曲線減速の開始時刻 [s]

229 { return t2; }

◆ t_3()

float ctrl::AccelDesigner::t_3 ( ) const
inline

曲線減速の終了時刻 [s]

233 { return t3; }

◆ t_end()

float ctrl::AccelDesigner::t_end ( ) const
inline

終点時刻 [s]

209 { return t3; }

◆ v()

float ctrl::AccelDesigner::v ( const float  t) const
inline

任意の時刻 t [s] における速度 v [m/s] を返す関数

引数
[in]時刻t [s]
戻り値
速度 [m/s]
189  {
190  if (t < t2)
191  return ac.v(t - t0);
192  else
193  return dc.v(t - t2);
194  }
float v(const float t) const
任意の時刻 t [s] における速度 v [m/s] を返す関数
Definition: accel_curve.h:166
呼び出し関係図:

◆ v_end()

float ctrl::AccelDesigner::v_end ( ) const
inline

終点速度 [m/s]

213 { return dc.v_end(); }
float v_end() const
終点速度 [m/s]
Definition: accel_curve.h:202
呼び出し関係図:

◆ x()

float ctrl::AccelDesigner::x ( const float  t) const
inline

任意の時刻 t [s] における位置 x [m] を返す関数

引数
[in]時刻t [s]
戻り値
位置 [m]
200  {
201  if (t < t2)
202  return x0 + ac.x(t - t0);
203  else
204  return x3 - dc.x_end() + dc.x(t - t2);
205  }
float x(const float t) const
任意の時刻 t [s] における位置 x [m] を返す関数
Definition: accel_curve.h:183
呼び出し関係図:

◆ x_end()

float ctrl::AccelDesigner::x_end ( ) const
inline

終点位置 [m]

217 { return x3; }

フレンドと関連関数の詳解

◆ operator<<

std::ostream& operator<< ( std::ostream &  os,
const AccelDesigner obj 
)
friend

情報の表示

266  {
267  os << "AccelDesigner:";
268  os << "\td: " << obj.x3 - obj.x0;
269  os << "\tvs: " << obj.ac.v(0);
270  os << "\tvm: " << obj.ac.v_end();
271  os << "\tve: " << obj.dc.v_end();
272  os << "\tt0: " << obj.t0;
273  os << "\tt1: " << obj.t1;
274  os << "\tt2: " << obj.t2;
275  os << "\tt3: " << obj.t3;
276  return os;
277  }

メンバ詳解

◆ ac

AccelCurve ctrl::AccelDesigner::ac
protected

曲線加速用オブジェクト

◆ dc

AccelCurve ctrl::AccelDesigner::dc
protected

曲線減速用オブジェクト

◆ t0

float ctrl::AccelDesigner::t0
protected

◆ t1

float ctrl::AccelDesigner::t1
protected

◆ t2

float ctrl::AccelDesigner::t2
protected

◆ t3

float ctrl::AccelDesigner::t3
protected

境界点の時刻 [s]

◆ x0

float ctrl::AccelDesigner::x0
protected

◆ x3

float ctrl::AccelDesigner::x3
protected

境界点の位置 [m]


このクラス詳解は次のファイルから抽出されました: