16#include <boost/thread.hpp>
17#include <magic_enum.hpp>
32 std::unique_ptr<GraphTreeCreator>&& graph_tree_creator,
33 std::unique_ptr<IMapCreator>&& map_creator,
34 const std::shared_ptr<GraphicDataBroker>& broker_ptr,
35 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr) :
36 graph_tree_creator_ptr_(
std::move(graph_tree_creator)),
37 map_creator_ptr_(
std::move(map_creator)),
38 broker_ptr_(broker_ptr),
39 setting_ptr_(setting_ptr)
41 assert(graph_tree_creator_ptr_ !=
nullptr);
42 assert(map_creator_ptr_ !=
nullptr);
43 assert(broker_ptr_ !=
nullptr);
44 assert(setting_ptr_ !=
nullptr);
48 map_state_ = map_creator_ptr_->InitMap();
50 broker_ptr_->map_state.SetData(map_state_);
62 std::vector<RobotStateNode> graph;
66 OutputGraphStatus(graph);
68 if (graph.size() == 0)
76 CreateGraph(first_node, &graph);
79 broker_ptr_->graph.SetData(graph);
99 std::vector<std::function<void()>> func_list;
105 CreateGraph(selected, &graph);
106 broker_ptr_->graph.SetData(graph);
125 broker_ptr_->graph.Clean();
140 static_cast<int>(func_list.size()),
141 "整数で操作を選択してください.範囲外の値の場合終了します.");
144 if (selected_index < func_list.size())
146 func_list[selected_index]();
160void SystemMainGraphViewer::CreateGraph(
const RobotStateNode parent, std::vector<RobotStateNode>* graph)
162 assert(graph !=
nullptr);
181 graph_tree.AddNode(parent_node);
184 graph_tree_creator_ptr_->Init(divided_map);
188 const GraphSearchResult result = graph_tree_creator_ptr_->CreateGraphTree(0, 5, &graph_tree);
195 for (
int i = 0; i < graph_tree.GetGraphSize(); i++)
197 (*graph).push_back(graph_tree.GetNode(i));
209void SystemMainGraphViewer::OutputGraphStatus(
const std::vector<RobotStateNode>& graph)
const
221 if (graph.size() > 0)
229 for (
const auto& i : graph)
231 if (i.depth < depth_num.size())
233 depth_num[i.depth]++;
241 for (
const auto& i : depth_num)
257RobotStateNode SystemMainGraphViewer::SelectNodeByInput(
258 const std::vector<RobotStateNode>& graph)
const
265 if (graph.size() == 0)
269 NodeInitializer node_initializer{ Vector3{0.f, 0.f, 30.f}, EulerXYZ(),
HexapodMove::kNone };
270 RobotStateNode first_node = node_initializer.InitNode();
280 static_cast<int>(graph.size()) - 1,
285 selected_node_index),
kSystem);
287 return graph[selected_node_index];
static void Output(const std::string &str, OutputDetail detail)
コマンドラインに文字を出力する関数. SetOutputLimit() で設定した出力の許可範囲内であれば出力される. 必ず SetOutputLimit() を呼び出してから使うこと.
static int InputInt(int min, int max, int default_num, const std::string &str="Please enter an integer.")
整数を入力させる関数. 出力される文字列は,必ず OutputDetail::kSystem で出力される.
static void OutputNewLine(int num, OutputDetail detail)
コマンドラインで改行をする関数.
static void OutputTitle(const std::string &title_name, bool output_copy_right=false)
コマンドラインにこのソフトのタイトルを出力する関数. 出力される文字列は,必ず OutputDetail::kSystem で出力される.
static void OutputHorizontalLine(const std::string &line_visual, OutputDetail detail)
コマンドラインに水平線を出力する関数.
static bool InputYesNo(const std::string &str="Are you sure?")
yesかnoを入力させる関数.返り値で yes なら true,noなら falseを返す. 出力される文字列は,必ず OutputDetail::kSystem で出力される.
static void InfoOutput(const std::string &str)
コマンドラインに文字を出力する関数.Info用の出力.
static void FormatOutput(OutputDetail detail, const std::format_string< Args... > str, Args &&... args)
コマンドラインに文字を出力する関数. SetOutputLimit() で設定した出力の許可範囲内であれば出力される. 必ず SetOutputLimit() を呼び出してから使うこと.
void Init(const MapState &map_state, const Vector3 global_robot_com)
マップのデータを初期化する. ロボットの重心座標を中心にマップのデータを格子状に分割し, その中に存在する脚設置可能点を集める.
RobotStateNode 構造体をノードとする木構造のグラフのクラス.
static const int kMaxDepth
グラフ探索の最大深さ.
ノードの初期化を行うクラス. シミュレーション時にノードの初期値を設定するために使用する.
std::string GetElapsedMilliSecondString() const
経過時間をミリ秒で表した文字列を取得する.
void Start()
計測開始にこの関数を呼ぶ. リセット処理などを呼ぶ必要なしで,再度計測できる.
void Main() override
主要な処理を行う関数.
SystemMainGraphViewer(std::unique_ptr< GraphTreeCreator > &&graph_tree_creator, std::unique_ptr< IMapCreator > &&map_creator, const std::shared_ptr< GraphicDataBroker > &broker_ptr, const std::shared_ptr< const ApplicationSettingRecord > &setting_ptr)
std::string EnumToStringRemoveTopK(const T &enum_value)
enumを文字列に変換する関数. Google C++ coding style だと enumの要素は 先頭にkをつけてキャメルケースで書くことが推奨されている. 例えば,
OutputDetail
コマンドラインに文字を出力する際に,その詳細を指定するための列挙体.
@ kSystem
システムメッセージ,常に出力する.
enums::Result result
成功か失敗か.
グラフ構造のためのノード(頂点).旧名 LNODE
void ChangeLootNode()
自身を根ノードに変更する関数. depthを0に,parent_numを-1に初期化する.
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
std::string ToString() const
ノードの情報を文字列に変換する関数. デバッグ用に詳細な情報を出力する.