GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
node_creator_com_move.cpp
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
9
10#include "graph_search_const.h"
11#include "leg_state.h"
12#include "math_util.h"
13
14
15namespace designlab
16{
17
19 const DividedMapState& map,
20 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
21 const std::shared_ptr<const IHexapodStatePresenter>& presenter_ptr,
22 const std::shared_ptr<const IHexapodPostureValidator>& checker_ptr,
23 const HexapodMove next_move) :
24 map_(map),
25 maker_(converter_ptr),
26 selector_(checker_ptr),
27 next_move_(next_move),
28 converter_ptr_(converter_ptr),
29 presenter_ptr_(presenter_ptr),
30 checker_ptr_(checker_ptr)
31{
32}
33
34
36 const int current_num,
37 std::vector<RobotStateNode>* output_graph) const
38{
39 std::array<ComPosAndPolygon, ComCandidatePolygonMaker::kMakePolygonNum> candidate_polygons;
40
41 // 重心移動先の候補地点の範囲を示す多角形を作成する.
42 maker_.MakeCandidatePolygon(current_node, &candidate_polygons);
43
44 // 候補範囲から実際に移動する先の座標を選択する.
45 for (int i = 0; i < ComCandidatePolygonMaker::kMakePolygonNum; ++i)
46 {
47 // そもそも多角形が候補点になりえないならば,その多角形は無視する.
48 if (!candidate_polygons[i].is_able) { continue; }
49
50 Vector3 result_com;
51
52 if (selector_.GetComFromPolygon(candidate_polygons[i].polygon, current_node, &result_com))
53 {
54 RobotStateNode next_node = current_node;
55
56 // 重心位置を変更し,それに伴い接地脚の位置も変更する.
57 next_node.ChangeGlobalCenterOfMass(result_com, false);
58
59 // leg_state の com_pattern を変更する
60 leg_func::ChangeDiscreteComPos(candidate_polygons[i].com_pos, &next_node.leg_state);
61
62 for (int j = 0; j < HexapodConst::kLegNum; ++j)
63 {
65 &next_node.leg_state);
66 }
67
68 next_node.ChangeToNextNode(current_num, next_move_); // 深さや親ノードを変更する
69
70 if (checker_ptr_->IsStable(next_node.leg_state, next_node.leg_pos) &&
71 !checker_ptr_->IsBodyInterferingWithGround(next_node, map_))
72 {
73 (*output_graph).push_back(next_node);
74 }
75 }
76 }
77
78 // 結果が空だったら現在姿勢をそのまま追加する.
79 if ((*output_graph).empty())
80 {
81 RobotStateNode next_node = current_node;
82 next_node.ChangeToNextNode(current_num, next_move_);
83
84 (*output_graph).push_back(next_node);
85 }
86}
87
88} // namespace designlab
static constexpr int kMakePolygonNum
作成する多角形の数.
void MakeCandidatePolygon(const RobotStateNode &node, std::array< ComPosAndPolygon, kMakePolygonNum > *output_poly) const
現在のロボットの状態を表すノードから, 重心位置の候補地点を示す多角形を作成する.
bool GetComFromPolygon(const Polygon2 &polygon, const RobotStateNode &current_node, Vector3 *output_com) const
重心を求める.
マップを格子状に分割して管理するクラス.
static constexpr int kLegNum
void Create(const RobotStateNode &current_node, int current_num, std::vector< RobotStateNode > *output_graph) const override
現在のノードから次のノード群を生成する.
NodeCreatorComMove(const DividedMapState &devide_map, const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodStatePresenter > &presenter_ptr, const std::shared_ptr< const IHexapodPostureValidator > &checker_ptr, HexapodMove next_move)
@ kCenter
現在の位置にある.
void ChangeDiscreteLegPos(const int leg_index, const enums::DiscreteLegPos new_discretized_leg_pos, LegStateBit *leg_state)
脚の状態を変更する.遊脚を表すビットはそのまま.
void ChangeDiscreteComPos(const enums::DiscreteComPos new_com_pattern, LegStateBit *leg_state)
重心のデータを変更する.
HexapodMove
ロボットが次にどの動作をするのかを表す列挙体.
グラフ構造のためのノード(頂点).旧名 LNODE
std::array< Vector3, HexapodConst::kLegNum > leg_pos
[4 * 3 * 6 = 72 byte] 脚先の座標.(coxa(脚の付け根)を原点とする)
void ChangeGlobalCenterOfMass(const designlab::Vector3 &new_com, bool do_change_leg_base_pos)
重心位置を変更する関数.
leg_func::LegStateBit leg_state
[4 byte] 脚状態,重心パターンを bitで表す.旧名 leg_con.
constexpr void ChangeToNextNode(const int parent_index_, const HexapodMove next_move_)
次の動作を設定する関数. 深さを一つ深くして,親と次の動作を設定する.
3次元の位置ベクトルを表す構造体.