8#ifndef DESIGNLAB_GAIT_PATTERN_GRAPH_TREE_H_
9#define DESIGNLAB_GAIT_PATTERN_GRAPH_TREE_H_
33 kGraphMaxSize(graph_max_size)
35 nodes_.resize(graph_max_size);
40 [[nodiscard]]
constexpr int GetGraphSize()
const {
return graph_size_; }
45 [[nodiscard]]
constexpr bool IsEmpty()
const {
return graph_size_ == 0; }
53 [[nodiscard]]
constexpr bool HasRoot()
const
55 return graph_size_ != 0;
83 assert(index < graph_size_);
109 assert(graph_size_ < kGraphMaxSize);
111 nodes_[graph_size_++] = node;
113 assert(nodes_[graph_size_ - 1].IsLootNode() ||
114 0 <= nodes_[graph_size_ - 1].parent_index);
116 assert(nodes_[graph_size_ - 1].parent_index < graph_size_);
118 assert(nodes_[graph_size_ - 1].IsLootNode() ||
119 nodes_[graph_size_ - 1].depth - 1 == nodes_[nodes_[graph_size_ - 1].parent_index].depth);
123 constexpr void Reset() { graph_size_ = 0; }
133 assert(index < graph_size_);
134 std::vector<float> com_vertical_trajectory_reverse;
137 for (
int i = index; i != -1; i = nodes_[i].parent_index)
139 if (com_vertical_trajectory_reverse.empty() ||
140 com_vertical_trajectory_reverse.back() != nodes_[i].center_of_mass_global_coord.z)
142 com_vertical_trajectory_reverse.push_back(nodes_[i].center_of_mass_global_coord.z);
147 std::vector<float> com_vertical_trajectory(com_vertical_trajectory_reverse.size());
148 for (
int i = 0; i < com_vertical_trajectory_reverse.size(); ++i)
150 com_vertical_trajectory[i] = com_vertical_trajectory_reverse[com_vertical_trajectory_reverse.size() - 1 - i];
153 return com_vertical_trajectory;
157 std::vector<RobotStateNode> nodes_;
163 const int kGraphMaxSize;
RobotStateNode 構造体をノードとする木構造のグラフのクラス.
GaitPatternGraphTree()=delete
constexpr void Reset()
グラフをリセットする.
constexpr bool IsEmpty() const
グラフが空かどうかを返す.
const RobotStateNode & GetRootNode() const
グラフの根ノードの参照を返す.
const int GetParentNodeIndex(const int index, const int depth) const
指定したノードの親ノードの参照を返す.depthは親ノードの深さを指定する.
constexpr int GetRootIndex() const
グラフの根ノードのインデックスを返す. ノードがない場合を考慮していないため, HasRoot()で根ノードを持つかどうかを確認すること. 一番最初に追加されたノードは必ず根ノードになるため, ...
std::vector< float > GetCoMVerticalTrajectory(const int index) const
指定したノードの重心の上下移動軌跡を返す.
const RobotStateNode & GetParentNode(const int index, const int depth) const
指定したノードの親ノードの参照を返す.depthは親ノードの深さを指定する.
GaitPatternGraphTree(const int graph_max_size)
コンストラクタ. ノード数の最大値を指定する.
void AddNode(const RobotStateNode &node)
ノードを追加する. 追加するノードは親ノードのインデックスと,depthの指定が適切にされている必要がある. これらが適切にされていない場合,アサーションに引っかかる. また,あらかじめ確保...
const RobotStateNode & GetNode(const int index) const
グラフのノードの参照を返す.
constexpr bool HasRoot() const
グラフが根ノードを持つかどうかを返す. 根ノードとは,親を持たないノードのこと. 一番最初に追加するノードは必ず根になるため, 根を持つかどうかはノードの総数が0でないかどうかで判定できる.
constexpr int GetGraphSize() const
グラフのノードの総数を返す.
グラフ構造のためのノード(頂点).旧名 LNODE