18 const std::vector<enums::DiscreteLegPos>& discrete_leg_pos_list) :
19 next_move_(next_move),
20 discrete_leg_pos_list_(discrete_leg_pos_list)
22 assert(discrete_leg_pos_list.size() != 0);
28 const int current_node_index,
29 std::vector<RobotStateNode>* output_graph)
const
35 if (kLiftedLegNum == 1)
38 Create1LegLifted(current_node, current_node_index, output_graph);
40 else if (kLiftedLegNum == 2)
43 Create2LegLifted(current_node, current_node_index, output_graph);
45 else if (kLiftedLegNum == 3)
48 Create3LegLifted(current_node, current_node_index, output_graph);
62 (*output_graph).emplace_back(new_node);
69void NodeCreatorLegHierarchy::Create1LegLifted(
71 const int current_node_index,
72 std::vector<RobotStateNode>* output_graph)
const
75 std::vector<int> lifted_leg_list;
81 for (
const auto i : discrete_leg_pos_list_)
91 (*output_graph).emplace_back(new_node);
96void NodeCreatorLegHierarchy::Create2LegLifted(
97 const RobotStateNode& current_node,
98 const int current_node_index,
99 std::vector<RobotStateNode>* output_graph)
const
104 std::vector<int> lifted_leg_list;
110 for (
const auto i : discrete_leg_pos_list_)
112 for (
const auto j : discrete_leg_pos_list_)
114 RobotStateNode new_node = current_node;
121 new_node.ChangeToNextNode(current_node_index, next_move_);
123 (*output_graph).emplace_back(new_node);
129void NodeCreatorLegHierarchy::Create3LegLifted(
130 const RobotStateNode& current_node,
131 const int current_node_index,
132 std::vector<RobotStateNode>* output_graph)
const
137 std::vector<int> lifted_leg_list;
143 for (
const auto i : discrete_leg_pos_list_)
145 for (
const auto j : discrete_leg_pos_list_)
147 for (
const auto k : discrete_leg_pos_list_)
149 RobotStateNode new_node = current_node;
157 new_node.ChangeToNextNode(current_node_index, next_move_);
159 (*output_graph).push_back(new_node);
NodeCreatorLegHierarchy(HexapodMove next_move, const std::vector< enums::DiscreteLegPos > &discrete_leg_pos_list)
コンストラクタ.
void Create(const RobotStateNode ¤t_node, int current_node_index, std::vector< RobotStateNode > *output_nodes) const override
現在のノードから次のノード群を生成する.
void ChangeDiscreteLegPos(const int leg_index, const enums::DiscreteLegPos new_discretized_leg_pos, LegStateBit *leg_state)
脚の状態を変更する.遊脚を表すビットはそのまま.
int GetLiftedLegNum(const LegStateBit &leg_state)
遊脚している脚の本数を返す関数.
void GetLiftedLegIndexByVector(const LegStateBit &leg_state, std::vector< int > *res_index)
遊脚している脚の脚番号0~5を,引数_res_numberで参照渡しする関数.
HexapodMove
ロボットが次にどの動作をするのかを表す列挙体.
グラフ構造のためのノード(頂点).旧名 LNODE
leg_func::LegStateBit leg_state
[4 byte] 脚状態,重心パターンを bitで表す.旧名 leg_con.
constexpr void ChangeToNextNode(const int parent_index_, const HexapodMove next_move_)
次の動作を設定する関数. 深さを一つ深くして,親と次の動作を設定する.