12#include <boost/thread.hpp>
13#include <magic_enum.hpp>
26 std::unique_ptr<IGaitPatternGenerator>&& gait_pattern_generator_ptr,
27 std::unique_ptr<IMapCreator>&& map_creator_ptr,
28 std::unique_ptr<ISimulationEndChecker>&& simulation_end_checker_ptr,
29 std::unique_ptr<IRobotOperator>&& robot_operator_ptr,
30 std::unique_ptr<NodeInitializer>&& node_initializer_ptr,
31 const std::shared_ptr<GraphicDataBroker>& broker_ptr,
32 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr,
33 const std::shared_ptr<ResultFileExporter>& result_exporter_ptr) :
34 gait_pattern_generator_ptr_(
std::move(gait_pattern_generator_ptr)),
35 map_creator_ptr_(
std::move(map_creator_ptr)),
36 simulation_end_checker_ptr_(
std::move(simulation_end_checker_ptr)),
37 robot_operator_ptr_(
std::move(robot_operator_ptr)),
38 node_initializer_ptr_(
std::move(node_initializer_ptr)),
39 broker_ptr_(broker_ptr),
40 setting_ptr_(setting_ptr),
41 result_exporter_ptr_(result_exporter_ptr)
43 assert(gait_pattern_generator_ptr_ !=
nullptr);
44 assert(map_creator_ptr_ !=
nullptr);
45 assert(simulation_end_checker_ptr_ !=
nullptr);
46 assert(robot_operator_ptr_ !=
nullptr);
47 assert(broker_ptr_ !=
nullptr);
48 assert(setting_ptr_ !=
nullptr);
51 result_exporter_ptr_->CreateRootDirectory();
54 map_state_ = map_creator_ptr_->InitMap();
57 broker_ptr_->map_state.SetData(map_state_);
74 for (
int i = 0; i < kSimulationNum; i++)
89 if (setting_ptr_->do_step_execution_each_simulation)
100 if (setting_ptr_->do_gui_display)
103 broker_ptr_->graph.PushBack(current_node);
108 for (
int j = 0; j < kGaitPatternGenerationLimit; j++)
112 operation = robot_operator_ptr_->Update(current_node);
119 const GraphSearchResult result_state = gait_pattern_generator_ptr_->GetNextNodeByGraphSearch(current_node, map_state_, operation, &result_node);
127 if (result_state.
result != kSuccess)
141 current_node = result_node;
143 if (setting_ptr_->do_gui_display)
146 broker_ptr_->graph.PushBack(current_node);
153 dead_lock_checker.
AddNode(current_node);
171 if (simulation_end_checker_ptr_->IsEnd(current_node))
182 if (j == kGaitPatternGenerationLimit - 1)
191 if (setting_ptr_->do_step_execution_each_gait)
199 result_exporter_ptr_->PushSimulationResult(record);
202 broker_ptr_->simulation_end_index.PushBack(broker_ptr_->graph.GetSize() - 1);
213 result_exporter_ptr_->Export();
220void SystemMainSimulation::OutputSetting()
const
228 if (setting_ptr_->do_cmd_output)
232 const std::string output_str = magic_enum::enum_name(setting_ptr_->cmd_output_detail).data();
238 const std::string output_str = magic_enum::enum_name(
kSystem).data();
241 "・No output to the command line. (The exception is the output of the one whose priority is {}.", output_str);
247 if (setting_ptr_->do_step_execution_each_simulation)
259 if (setting_ptr_->do_step_execution_each_gait)
270 if (setting_ptr_->do_gui_display)
static void SpacedOutput(const std::string &str, OutputDetail detail)
コマンドラインに文字を出力する関数. 前と後ろに改行を挿入する.
static void Output(const std::string &str, OutputDetail detail)
コマンドラインに文字を出力する関数. SetOutputLimit() で設定した出力の許可範囲内であれば出力される. 必ず SetOutputLimit() を呼び出してから使うこと.
static void WaitAnyKey(const std::string &str="Waiting for input.")
入力待ちをする関数. 出力される文字列は,必ず 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 FormatOutput(OutputDetail detail, const std::format_string< Args... > str, Args &&... args)
コマンドラインに文字を出力する関数. SetOutputLimit() で設定した出力の許可範囲内であれば出力される. 必ず SetOutputLimit() を呼び出してから使うこと.
static void SpacedFormatOutput(OutputDetail detail, const std::format_string< Args... > str, Args &&... args)
コマンドラインに文字を出力する関数. SetOutputLimit() で設定した出力の許可範囲内であれば出力される. 必ず SetOutputLimit() を呼び出してから使うこと.
void AddNode(const RobotStateNode &node)
ロボットが行った動作を追加する.上限数を超えたら,古いものから削除する.
bool IsDeadLock() const
直近に行った動作を比較して,ロボットが正しく動作できているか判断する.
double GetElapsedMilliSecond() const
計測結果をミリ秒で取得. start()と end()を呼び出してからこの関数を呼ぶ.
void Start()
計測開始にこの関数を呼ぶ. リセット処理などを呼ぶ必要なしで,再度計測できる.
SystemMainSimulation()=delete
デフォルトコンストラクタは禁止.
void Main() override
いままで int mainで行われた処理をまとめたもの. 目標地点へ着くか,歩容計画に失敗した場合に,シミュレーションを終える. また,規定の回数シミュレーションしたら終了する.
@ kFailureByNodeLimitExceeded
ノード数の上限に達したため,シミュレーションに失敗した.
@ kFailureByLoopMotion
動作がループしてしまったため,シミュレーションに失敗した.
@ kSuccess
目標座標,姿勢を満たし,シミュレーションに成功した.
@ kFailureByGraphSearch
グラフ探索に失敗しため,シミュレーションに失敗した.
std::string EnumToStringRemoveTopK(const T &enum_value)
enumを文字列に変換する関数. Google C++ coding style だと enumの要素は 先頭にkをつけてキャメルケースで書くことが推奨されている. 例えば,
OutputDetail
コマンドラインに文字を出力する際に,その詳細を指定するための列挙体.
@ kSystem
システムメッセージ,常に出力する.
enums::Result result
成功か失敗か.
std::string ToString() const
探索において目標となる座標や角度,評価する値についてまとめた構造体.
グラフ構造のためのノード(頂点).旧名 LNODE
void ChangeLootNode()
自身を根ノードに変更する関数. depthを0に,parent_numを-1に初期化する.
std::string ToString() const
ノードの情報を文字列に変換する関数. デバッグ用に詳細な情報を出力する.
enums::SimulationResult simulation_result
シミュレーション全体の結果.
std::vector< GraphSearchResultRecord > graph_search_result_recorder
MapState map_state
最新の地面の状態.