10#include <boost/thread.hpp>
11#include <magic_enum.hpp>
23 std::unique_ptr<IGaitPatternGenerator>&& gait_pattern_generator_ptr,
24 std::unique_ptr<IMapCreator>&& map_creator_ptr,
25 std::unique_ptr<ISimulationEndChecker>&& simulation_end_checker_ptr,
26 std::unique_ptr<IRobotOperator>&& robot_operator_ptr,
27 std::unique_ptr<NodeInitializer>&& node_initializer_ptr,
28 const std::shared_ptr<GraphicDataBroker>& broker_ptr,
29 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr,
30 const std::shared_ptr<ResultFileExporter>& result_exporter_ptr)
31 : gait_pattern_generator_ptr_(
std::move(gait_pattern_generator_ptr)),
32 map_creator_ptr_(
std::move(map_creator_ptr)),
33 simulation_end_checker_ptr_(
std::move(simulation_end_checker_ptr)),
34 robot_operator_ptr_(
std::move(robot_operator_ptr)),
35 node_initializer_ptr_(
std::move(node_initializer_ptr)),
36 broker_ptr_(broker_ptr),
37 setting_ptr_(setting_ptr),
38 result_exporter_ptr_(result_exporter_ptr) {
39 assert(gait_pattern_generator_ptr_ !=
nullptr);
40 assert(map_creator_ptr_ !=
nullptr);
41 assert(simulation_end_checker_ptr_ !=
nullptr);
42 assert(robot_operator_ptr_ !=
nullptr);
43 assert(broker_ptr_ !=
nullptr);
44 assert(setting_ptr_ !=
nullptr);
47 result_exporter_ptr_->CreateRootDirectory();
50 map_state_ = map_creator_ptr_->InitMap();
53 broker_ptr_->map_state.SetData(map_state_);
68 for (
int i = 0; i < kSimulationNum; ++i) {
73 robot_operator_ptr_->Init();
85 if (setting_ptr_->do_step_execution_each_simulation) {
93 if (setting_ptr_->do_gui_display) {
95 broker_ptr_->graph.PushBack(current_node);
99 for (
int j = 0; j < kGaitPatternGenerationLimit; ++j) {
103 robot_operator_ptr_->Update(current_node);
111 gait_pattern_generator_ptr_->GetNextNodeByGraphSearch(
112 current_node, map_state_, operation, &result_node);
121 if (result_state.
result != kSuccess) {
128 "Simulation failed. SimulationResult = {}/ GraphSearch = {}",
138 current_node = result_node;
140 if (setting_ptr_->do_gui_display) {
142 broker_ptr_->graph.PushBack(current_node);
146 kInfo,
"[ Simulation {} times / Gait generation {} times ]\n{}",
147 i + 1, j + 1, current_node.
ToString());
151 dead_lock_checker.
AddNode(current_node);
162 "Simulation failed. SimulationResult = {} / GraphSearch = {}",
172 if (simulation_end_checker_ptr_->IsEnd(current_node)) {
177 "The simulation was successful. SimulationResult = {}",
184 if (j == kGaitPatternGenerationLimit - 1) {
194 if (setting_ptr_->do_step_execution_each_gait) {
202 result_exporter_ptr_->PushSimulationResult(record);
205 broker_ptr_->simulation_end_index.PushBack(broker_ptr_->graph.GetSize() -
215 result_exporter_ptr_->Export();
221void SystemMainSimulation::OutputSetting()
const {
227 if (setting_ptr_->do_cmd_output) {
230 const std::string output_str =
231 magic_enum::enum_name(setting_ptr_->cmd_output_detail).data();
235 " ・Only those with a priority of {} or higher will be output.",
238 const std::string output_str = magic_enum::enum_name(
kSystem).data();
241 "・No output to the command line. (The exception "
242 "is the output of the one whose priority is {}.",
248 if (setting_ptr_->do_step_execution_each_simulation) {
256 if (setting_ptr_->do_step_execution_each_gait) {
264 if (setting_ptr_->do_gui_display) {
void AddNode(const RobotStateNode &node)
ロボットが行った動作を追加する.上限数を超えたら,古いものから削除する.
bool IsDeadLock() const
直近に行った動作を比較して,ロボットが正しく動作できているか判断する.
double GetElapsedMilliSecond() const
計測結果をミリ秒で取得. start()と end()を呼び出してからこの関数を呼ぶ.
void Start()
計測開始にこの関数を呼ぶ. リセット処理などを呼ぶ必要なしで,再度計測できる.
SystemMainSimulation()=delete
デフォルトコンストラクタは禁止.
void Main() override
いままで int mainで行われた処理をまとめたもの. 目標地点へ着くか,歩容計画に失敗した場合に,シミュレーションを終える. また,規定の回数シミュレーションしたら終了する.
void OutputF(OutputDetail detail, const std::format_string< Args... > str, Args &&... args)
コマンドラインに文字を出力する関数, format した文字列を出力する. SetOutputLimit() で設定した出力の許可範囲内であれば出力される.
void SpacedOutput(const std::string &str, OutputDetail detail)
コマンドラインに文字を出力する関数. 前と後ろに改行を挿入する.
void OutputHorizontalLine(const std::string &line_visual, OutputDetail detail)
コマンドラインに水平線を出力する関数.
void WaitAnyKey(const std::string &str="Waiting for input.")
入力待ちをする関数. 出力される文字列は, 必ず OutputDetail::kSystem で出力される.
void OutputNewLine(int num, OutputDetail detail)
コマンドラインで改行をする関数.
void OutputTitle(const std::string &title_name, bool output_copy_right=false)
コマンドラインにこのソフトのタイトルを出力する関数. 出力される文字列は,必ず OutputDetail::kSystem で出力される.
void SpacedOutputF(OutputDetail detail, const std::format_string< Args... > str, Args &&... args)
コマンドラインに文字を出力する関数, format した文字列を出力する. SetOutputLimit 関数で設定した出力の許可範囲内であれば出力される.
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 で出力される.
@ 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
探索において目標となる座標や角度,評価する値についてまとめた構造体.
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
最新の地面の状態.