16 const std::vector<DiscreteLegPos>& discrete_leg_pos_list)
17 : next_move_(next_move), discrete_leg_pos_list_(discrete_leg_pos_list) {
18 assert(discrete_leg_pos_list.size() != 0);
23 std::vector<RobotStateNode>* output_graph)
const {
28 if (kLiftedLegNum == 1) {
30 Create1LegLifted(current_node, current_node_index, output_graph);
31 }
else if (kLiftedLegNum == 2) {
33 Create2LegLifted(current_node, current_node_index, output_graph);
34 }
else if (kLiftedLegNum == 3) {
36 Create3LegLifted(current_node, current_node_index, output_graph);
48 (*output_graph).emplace_back(new_node);
54void NodeCreatorLegHierarchy::Create1LegLifted(
56 std::vector<RobotStateNode>* output_graph)
const {
58 std::vector<int> lifted_leg_list;
63 for (
const auto i : discrete_leg_pos_list_) {
72 (*output_graph).emplace_back(new_node);
76void NodeCreatorLegHierarchy::Create2LegLifted(
77 const RobotStateNode& current_node,
const int current_node_index,
78 std::vector<RobotStateNode>* output_graph)
const {
82 std::vector<int> lifted_leg_list;
87 for (
const auto i : discrete_leg_pos_list_) {
88 for (
const auto j : discrete_leg_pos_list_) {
89 RobotStateNode new_node = current_node;
96 new_node.ChangeToNextNode(current_node_index, next_move_);
98 (*output_graph).emplace_back(new_node);
103void NodeCreatorLegHierarchy::Create3LegLifted(
104 const RobotStateNode& current_node,
const int current_node_index,
105 std::vector<RobotStateNode>* output_graph)
const {
109 std::vector<int> lifted_leg_list;
114 for (
const auto i : discrete_leg_pos_list_) {
115 for (
const auto j : discrete_leg_pos_list_) {
116 for (
const auto k : discrete_leg_pos_list_) {
117 RobotStateNode new_node = current_node;
125 new_node.ChangeToNextNode(current_node_index, next_move_);
127 (*output_graph).push_back(new_node);
void Create(const RobotStateNode ¤t_node, int current_node_index, std::vector< RobotStateNode > *output_nodes) const override
現在のノードから次のノード群を生成する.
NodeCreatorLegHierarchy(HexapodMove next_move, const std::vector< DiscreteLegPos > &discrete_leg_pos_list)
コンストラクタ.
int GetLiftedLegNum(const LegStateBit &leg_state)
遊脚している脚の本数を返す関数.
void ChangeDiscreteLegPos(const int leg_index, const DiscreteLegPos new_discretized_leg_pos, LegStateBit *leg_state)
脚の状態を変更する.遊脚を表すビットはそのまま.
void GetLiftedLegIndexByVector(const LegStateBit &leg_state, std::vector< int > *res_index)
遊脚している脚の脚番号0~5を,引数_res_numberで参照渡しする関数.
HexapodMove
ロボットが次にどの動作をするのかを表す列挙体.
leg_func::LegStateBit leg_state
[4 byte] 脚状態,重心パターンを bitで表す.旧名 leg_con.
constexpr void ChangeToNextNode(const int parent_index_, const HexapodMove next_move_)
次の動作を設定する関数. 深さを一つ深くして,親と次の動作を設定する.