20 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
21 const std::shared_ptr<const IHexapodPostureValidator>& checker_ptr) :
22 converter_ptr_(converter_ptr),
23 checker_ptr_(checker_ptr),
24 evaluator_(InitializeEvaluator())
32 const int max_depth)
const
54 const float target_z_value = InitTargetZValue(graph.
GetRootNode(), divided_map_state, target_quat);
58 int max_evaluation_value_index = -1;
71 candidate_evaluation_value.
value.at(kTagAmountOfTurn) = GetAmountOfTurnEvaluationValue(graph.
GetNode(i), target_quat);
72 candidate_evaluation_value.
value.at(kTagLegRot) = GetLegRotEvaluationValue(graph.
GetNode(i), graph.
GetRootNode());
73 candidate_evaluation_value.
value.at(kTagZDiff) = GetZDiffEvaluationValue(graph.
GetNode(i), target_z_value);
76 if (evaluator_.
LeftIsBetter(candidate_evaluation_value, max_evaluation_value))
78 max_evaluation_value = candidate_evaluation_value;
79 max_evaluation_value_index = i;
84 if (max_evaluation_value_index < 0 || graph.
GetGraphSize() <= max_evaluation_value_index)
92 return { result, max_evaluation_value, graph.
GetParentNode(max_evaluation_value_index, 1), };
96 const std::vector<GaitPatternGraphTree>& graph_vector,
101 std::vector<std::tuple<GraphSearchResult, GraphSearchEvaluationValue, RobotStateNode>> result_vector;
103 for (
const auto& graph : graph_vector)
105 const auto result =
SearchGraphTree(graph, operation, divided_map_state, max_depth);
107 result_vector.push_back(result);
112 int max_evaluation_value_index = -1;
114 for (
int i = 0; i < result_vector.size(); i++)
116 const auto& [result, evaluation_value, _] = result_vector.at(i);
123 if (evaluator_.
LeftIsBetter(evaluation_value, max_evaluation_value))
125 max_evaluation_value = evaluation_value;
126 max_evaluation_value_index = i;
131 if (max_evaluation_value_index < 0 || max_evaluation_value_index >= result_vector.size())
137 return result_vector[max_evaluation_value_index];
148 GraphSearchEvaluator::EvaluationMethod leg_rot_method =
150 .is_lower_better =
false,
154 GraphSearchEvaluator::EvaluationMethod z_diff_method =
156 .is_lower_better =
true,
160 GraphSearchEvaluator ret({ {kTagAmountOfTurn, amount_of_turn_method}, {kTagLegRot, leg_rot_method}, {kTagZDiff, z_diff_method} },
161 { kTagZDiff, kTagAmountOfTurn, kTagLegRot });
166float GraphSearcherTurn::InitTargetZValue(
const RobotStateNode& node,
167 const DividedMapState& divided_map_state,
168 const Quaternion& target_quat)
const
171 const float min_z = -150.0f;
172 const float max_z = 150.0f;
174 for (
int i = 0; i < div; i++)
176 const float z = min_z + (max_z - min_z) /
static_cast<float>(div) *
static_cast<float>(i);
178 Vector3 pos = node.center_of_mass_global_coord;
181 RobotStateNode temp_node = node;
182 temp_node.ChangeGlobalCenterOfMass(pos,
false);
183 temp_node.ChangePosture(converter_ptr_, target_quat);
185 if (!checker_ptr_->IsBodyInterferingWithGround(temp_node, divided_map_state))
187 return node.center_of_mass_global_coord.z + z;
191 return node.center_of_mass_global_coord.z;
194float GraphSearcherTurn::GetAmountOfTurnEvaluationValue(
195 const RobotStateNode& node,
196 const Quaternion& target_quat)
const
203 const Quaternion target_to_current = node.posture.GetConjugate() * target_quat;
205 return target_to_current.w;
208float GraphSearcherTurn::GetLegRotEvaluationValue(
209 const RobotStateNode& node,
210 const RobotStateNode& root_node)
const
218 result += (node.leg_pos[i].ProjectedXY() -
219 root_node.leg_pos[i].ProjectedXY()).GetLength();
223 result += (node.leg_pos[i] - root_node.leg_pos[i]).GetLength();
232float GraphSearcherTurn::GetZDiffEvaluationValue(
233 const RobotStateNode& node,
234 const float target_z_value)
const
236 return abs(node.center_of_mass_global_coord.z - target_z_value);
RobotStateNode 構造体をノードとする木構造のグラフのクラス.
const RobotStateNode & GetRootNode() const
グラフの根ノードの参照を返す.
const RobotStateNode & GetParentNode(const int index, const int depth) const
指定したノードの親ノードの参照を返す.depthは親ノードの深さを指定する.
const RobotStateNode & GetNode(const int index) const
グラフのノードの参照を返す.
constexpr bool HasRoot() const
グラフが根ノードを持つかどうかを返す. 根ノードとは,親を持たないノードのこと. 一番最初に追加するノードは必ず根になるため, 根を持つかどうかはノードの総数が0でないかどうかで判定できる.
constexpr int GetGraphSize() const
グラフのノードの総数を返す.
bool LeftIsBetter(const GraphSearchEvaluationValue &left, const GraphSearchEvaluationValue &right, bool return_true_case_of_equal=true) const
2つの評価値を比較する.左側の評価値が良い場合は true を返す.
GraphSearchEvaluationValue InitializeEvaluationValue() const
評価値を初期化する. 自身の持つ評価方法を用いて,評価値を初期化する.
GraphSearcherTurn(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodPostureValidator > &checker_ptr)
std::tuple< GraphSearchResult, GraphSearchEvaluationValue, RobotStateNode > SearchGraphTreeVector(const std::vector< GaitPatternGraphTree > &graph_vector, const RobotOperation &operation, const DividedMapState ÷d_map_state, int max_depth) const override
std::tuple< GraphSearchResult, GraphSearchEvaluationValue, RobotStateNode > SearchGraphTree(const GaitPatternGraphTree &graph, const RobotOperation &operation, const DividedMapState ÷d_map_state, int max_depth) const override
グラフを受け取り,その中から最適な次の動作を出力する.
static constexpr int kLegNum
bool IsGrounded(const LegStateBit &leg_state, const int leg_index)
脚番号 leg_index 0 ~ 5 に応じて,その脚が接地しているかを調べる. 脚は右前脚を0番として,時計回りに0,1,2,3,4,5となる.左前足が5番.
@ kTurn
旋回中心と,旋回半径と,旋回方向を与えて旋回させる.
@ kSpotTurnLastPosture
その場で旋回させる(最終的な姿勢 Posture を示す)
std::map< Tag, float > value
bool is_lower_better
評価値が小さいほど良い場合は true.
探索において目標となる座標や角度,評価する値についてまとめた構造体.
RobotOperationType operation_type
Quaternion spot_turn_last_posture
旋回時の回転軸.右ねじの回転.
グラフ構造のためのノード(頂点).旧名 LNODE
int depth
[4 byte] 自身の深さ.一番上の親が深さ0となる.