10#include <boost/thread.hpp>
13#include <magic_enum.hpp>
28 std::unique_ptr<GraphTreeCreator>&& graph_tree_creator,
29 std::unique_ptr<IMapCreator>&& map_creator,
30 const std::shared_ptr<GraphicDataBroker>& broker_ptr,
31 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr)
32 : graph_tree_creator_ptr_(
std::move(graph_tree_creator)),
33 map_creator_ptr_(
std::move(map_creator)),
34 broker_ptr_(broker_ptr),
35 setting_ptr_(setting_ptr) {
36 assert(graph_tree_creator_ptr_ !=
nullptr);
37 assert(map_creator_ptr_ !=
nullptr);
38 assert(broker_ptr_ !=
nullptr);
39 assert(setting_ptr_ !=
nullptr);
43 map_state_ = map_creator_ptr_->InitMap();
45 broker_ptr_->map_state.SetData(map_state_);
56 std::vector<RobotStateNode> graph;
59 OutputGraphStatus(graph);
61 if (graph.size() == 0) {
67 CreateGraph(first_node, &graph);
70 broker_ptr_->graph.SetData(graph);
85 std::vector<std::function<void()>> func_list;
87 func_list.push_back([&]() {
89 CreateGraph(selected, &graph);
90 broker_ptr_->graph.SetData(graph);
93 func_list.push_back([&]() {
103 func_list.push_back([&]() {
105 broker_ptr_->graph.Clean();
119 0,
static_cast<int>(func_list.size()),
120 static_cast<int>(func_list.size()),
121 "整数で操作を選択してください.範囲外の値の場合終了します.");
124 if (selected_index < func_list.size()) {
125 func_list[selected_index]();
135void SystemMainGraphViewer::CreateGraph(
const RobotStateNode parent,
136 std::vector<RobotStateNode>* graph) {
137 assert(graph !=
nullptr);
156 graph_tree.AddNode(parent_node);
158 graph_tree_creator_ptr_->Init(divided_map);
163 graph_tree_creator_ptr_->CreateGraphTree(0, 5, &graph_tree);
170 for (
int i = 0; i < graph_tree.GetGraphSize(); i++) {
171 (*graph).push_back(graph_tree.GetNode(i));
186void SystemMainGraphViewer::OutputGraphStatus(
187 const std::vector<RobotStateNode>& graph)
const {
189 constexpr size_t kMaxDepth = 5;
196 cmdio::OutputF(detail,
"Number of nodes in the graph : {}", graph.size());
198 if (graph.size() > 0) {
201 std::vector<int> depth_num(kMaxDepth + 1);
205 for (
const auto& i : graph) {
206 if (i.depth < depth_num.size()) {
207 depth_num[i.depth]++;
215 for (
const auto& i : depth_num) {
229RobotStateNode SystemMainGraphViewer::SelectNodeByInput(
230 const std::vector<RobotStateNode>& graph)
const {
236 if (graph.size() == 0) {
239 NodeInitializer node_initializer{Vector3{0.f, 0.f, 30.f}, EulerXYZ(),
241 RobotStateNode first_node = node_initializer.InitNode();
248 int selected_node_index =
253 std::format(
"選択されたノード,{}番を親にします.", selected_node_index),
256 return graph[selected_node_index];
void Init(const MapState &map_state, const Vector3 global_robot_com)
マップのデータを初期化する. ロボットの重心座標を中心にマップのデータを格子状に分割し, その中に存在する脚設置可能点を集める.
RobotStateNode 構造体をノードとする木構造のグラフのクラス.
ノードの初期化を行うクラス. シミュレーション時にノードの初期値を設定するために使用する.
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)
void OutputF(OutputDetail detail, const std::format_string< Args... > str, Args &&... args)
コマンドラインに文字を出力する関数, format した文字列を出力する. SetOutputLimit() で設定した出力の許可範囲内であれば出力される.
void OutputHorizontalLine(const std::string &line_visual, OutputDetail detail)
コマンドラインに水平線を出力する関数.
void SystemOutputF(const std::format_string< Args... > str, Args &&... args)
コマンドラインに文字を出力する関数. System 用の出力. format した文字列を出力する.
void InfoOutputF(const std::format_string< Args... > str, Args &&... args)
コマンドラインに文字を出力する関数. Info 用の出力. format した文字列を出力する.
void SystemOutput(const std::string &str)
コマンドラインに文字を出力する関数. System 用の出力.
int InputInt(int min, int max, int default_num, const std::string &str="Please enter an integer.")
整数を入力させる関数. 出力される文字列は, 必ず OutputDetail::kSystem で出力される.
void InfoOutput(const std::string &str)
コマンドラインに文字を出力する関数. Info 用の出力.
void OutputNewLine(int num, OutputDetail detail)
コマンドラインで改行をする関数.
void OutputTitle(const std::string &title_name, bool output_copy_right=false)
コマンドラインにこのソフトのタイトルを出力する関数. 出力される文字列は,必ず OutputDetail::kSystem で出力される.
void Output(const std::string &str, OutputDetail detail)
コマンドラインに文字を出力する関数. SetOutputLimit 関数で設定した出力の許可範囲内であれば出力される.
bool InputYesNo(const std::string &str="Are you sure?")
yesかnoを入力させる関数.返り値で yes なら true, no なら false を返す. 出力される文字列は,必ず OutputDetail::kSystem で出力される.
std::string EnumToStringRemoveTopK(const T &enum_value)
enumを文字列に変換する関数. Google C++ coding style だと enumの要素は 先頭にkをつけてキャメルケースで書くことが推奨されている....
OutputDetail
コマンドラインに文字を出力する際に,その詳細を指定するための列挙体.
@ kSystem
システムメッセージ,常に出力する.
enums::Result result
成功か失敗か.
void ChangeLootNode()
自身を根ノードに変更する関数. depthを0に,parent_numを-1に初期化する.
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
std::string ToString() const
ノードの情報を文字列に変換する関数. デバッグ用に詳細な情報を出力する.