8#ifndef DESIGNLAB_GAIT_PATTERN_GRAPH_TREE_H_
9#define DESIGNLAB_GAIT_PATTERN_GRAPH_TREE_H_
29 : graph_size_(0), kGraphMaxSize(graph_max_size) {
30 nodes_.resize(graph_max_size);
35 [[nodiscard]]
constexpr int GetGraphSize()
const {
return graph_size_; }
40 [[nodiscard]]
constexpr bool IsEmpty()
const {
return graph_size_ == 0; }
48 [[nodiscard]]
constexpr bool HasRoot()
const {
return graph_size_ != 0; }
70 assert(index < graph_size_);
81 const int depth)
const;
90 const int depth)
const;
102 assert(graph_size_ < kGraphMaxSize);
104 nodes_[graph_size_++] = node;
106 assert(nodes_[graph_size_ - 1].IsLootNode() ||
107 0 <= nodes_[graph_size_ - 1].parent_index);
109 assert(nodes_[graph_size_ - 1].parent_index < graph_size_);
111 assert(nodes_[graph_size_ - 1].IsLootNode() ||
112 nodes_[graph_size_ - 1].depth - 1 ==
113 nodes_[nodes_[graph_size_ - 1].parent_index].depth);
117 constexpr void Reset() { graph_size_ = 0; }
124 const int index)
const {
126 assert(index < graph_size_);
127 std::vector<float> com_vertical_trajectory_reverse;
130 for (
int i = index; i != -1; i = nodes_[i].parent_index) {
131 if (com_vertical_trajectory_reverse.empty() ||
132 com_vertical_trajectory_reverse.back() !=
133 nodes_[i].center_of_mass_global_coord.z) {
134 com_vertical_trajectory_reverse.push_back(
135 nodes_[i].center_of_mass_global_coord.z);
140 std::vector<float> com_vertical_trajectory(
141 com_vertical_trajectory_reverse.size());
142 for (
int i = 0; i < com_vertical_trajectory_reverse.size(); ++i) {
143 com_vertical_trajectory[i] = com_vertical_trajectory_reverse
144 [com_vertical_trajectory_reverse.size() - 1 - i];
147 return com_vertical_trajectory;
151 std::vector<RobotStateNode> nodes_;
157 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
グラフのノードの総数を返す.