GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
main.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
8#include <memory>
9
10#include <boost/thread.hpp>
11
12#include "test_main.h"
13
14#if !defined (DESIGNLAB_USE_TEST)
15
18#include "boot_mode_selector.h"
19#include "cmdio_util.h"
24#include "graph_tree_creator.h"
27#include "graphic_main_basic.h"
31#include "graphic_system.h"
36#include "map_creator_factory.h"
43#include "toml_file_importer.h"
45#include "phantomx_mk2.h"
46
47
48
49// このプロジェクトがコンパイルされない場合はソリューションエクスプローラーから
50// DesignLabを右クリック →「スタートアッププロジェクトに設定」を選択.
51
52
53int main()
54{
55 // int main内では designlab:: を省略できる.
56 // 推奨されない書き方だが,可読性のため,ここでのみ使用する.
57 using namespace designlab;
58 using enum OutputDetail;
59
60 // まずは,設定ファイルを読み込む
61 CmdIOUtil::SetOutputLimit(kSystem);
62
63 TomlDirectoryExporter toml_directory_exporter;
64 toml_directory_exporter.Export();
65
66 TomlFileImporter<ApplicationSettingRecord> application_setting_importer(std::make_unique<ApplicationSettingRecordValidator>());
67
68
69 // 読み込んだ設定ファイルをクラスに記録する.
70 const auto application_setting_record = std::make_shared<const ApplicationSettingRecord>(application_setting_importer.ImportOrUseDefault("./settings.toml"));
71
72
73 // 次に,コマンドラインの出力を設定する.
74 CmdIOUtil::DoOutput(application_setting_record->do_cmd_output);
75 CmdIOUtil::SetOutputLimit(application_setting_record->cmd_output_detail);
76
77 // タイトルを表示する.
78 CmdIOUtil::OutputTitle("Free Gait Planning for a Hexapod Walking Robot by Graph Search", true);
79
80
81 // GUIを別のスレッドで実行する.
82 // このスレッドへはGraphicDataBrokerを通してデータを渡す.
83 GraphicSystem graphic_system(application_setting_record);
84
85 // グラフィックシステムを別スレッドで実行する.
86 boost::thread graphic_thread(&GraphicSystem::Main, &graphic_system);
87
88
89 // 処理を実行する.
90 while (true)
91 {
92 // 起動モードを選択する.
93 BootMode boot_mode = application_setting_record->default_mode;
94
95 if (application_setting_record->ask_about_modes)
96 {
97 BootModeSelector boot_mode_selector;
98
99 // デフォルトの起動モードを設定する.
100 boot_mode_selector.SetDefaultBootMode(application_setting_record->default_mode);
101
102 // 起動モードを選択する.
103 boot_mode = boot_mode_selector.SelectBootMode();
104 }
105
106
107 // 選択が終わったら,選択されたモードに応じてシステムを作成する.
108 auto graphic_data_broker = std::make_shared<GraphicDataBroker>();
109
111 const PhantomXMkIIParameterRecord parameter_record = parameter_importer.ImportOrUseDefault("./simulation_condition/phantomx_mk2.toml");
112
113 auto phantomx_mk2 = std::make_shared<PhantomXMkII>(parameter_record);
114
115 auto node_creator_builder_straight = std::make_unique<NodeCreatorBuilderStraightMove>(phantomx_mk2, phantomx_mk2, phantomx_mk2);
116 auto node_creator_builder_turn_spot = std::make_unique<NodeCreatorBuilderTurnSpot>(phantomx_mk2, phantomx_mk2, phantomx_mk2);
117
118 auto graph_tree_creator_straight = std::make_unique<GraphTreeCreator>(std::move(node_creator_builder_straight));
119 auto graph_tree_creator_turn_spot = std::make_unique<GraphTreeCreator>(std::move(node_creator_builder_turn_spot));
120
121 auto graph_searcher_straight = std::make_unique<GraphSearcherStraightMove>(phantomx_mk2);
122 auto graph_searcher_turn_spot = std::make_unique<GraphSearcherSpotTurn>(phantomx_mk2, phantomx_mk2);
123
124 std::unique_ptr<ISystemMain> system_main;
125
126 switch (boot_mode)
127 {
128 case BootMode::kSimulation:
129 {
130 // シミュレーションシステムクラスを作成する.
131
132 auto gait_pattern_generator_straight = std::make_unique<GaitPatternGeneratorBasic>(std::move(graph_tree_creator_straight), std::move(graph_searcher_straight), 4, 20000000);
133 auto gait_pattern_generator_turn_spot = std::make_unique<GaitPatternGeneratorBasic>(std::move(graph_tree_creator_turn_spot), std::move(graph_searcher_turn_spot), 4, 20000000);
134 auto gait_pattern_generator_switch_move = std::make_unique<GaitPatternGeneratorSwitchMove>(std::move(gait_pattern_generator_straight), std::move(gait_pattern_generator_turn_spot));
135
136 const SimulationSettingRecord simulation_setting_record = TomlFileImporter<SimulationSettingRecord>{}.ImportOrUseDefault("./simulation_condition/simulation_setting.toml");
137
138 auto map_creator = MapCreatorFactory::Create(simulation_setting_record);
139 auto simulation_end_checker = SimulationEndCheckerFactory::Create(simulation_setting_record);
140 auto robot_operator = RobotOperatorFactory::Create(simulation_setting_record);
141 auto node_initializer = std::make_unique<NodeInitializer>(simulation_setting_record.initial_positions,
142 simulation_setting_record.initial_posture,
143 simulation_setting_record.initial_move);
144 auto result_exporter = std::make_shared<ResultFileExporter>(phantomx_mk2);
145
146 system_main = std::make_unique<SystemMainSimulation>(
147 std::move(gait_pattern_generator_switch_move),
148 std::move(map_creator),
149 std::move(simulation_end_checker),
150 std::move(robot_operator),
151 std::move(node_initializer),
152 graphic_data_broker,
153 application_setting_record,
154 result_exporter);
155
156 auto graphic_main = std::make_unique<GraphicMainBasic>(graphic_data_broker, phantomx_mk2, phantomx_mk2, phantomx_mk2, application_setting_record);
157
158 graphic_system.ChangeGraphicMain(std::move(graphic_main));
159
160 break;
161 }
162 case BootMode::kViewer:
163 {
164 // グラフビューアシステムクラスを作成する.
165
166 TomlFileImporter<SimulationSettingRecord> simulation_setting_importer;
167 const SimulationSettingRecord simulation_setting_record =
168 simulation_setting_importer.ImportOrUseDefault("./simulation_condition/simulation_setting.toml");
169
170 auto map_creator = MapCreatorFactory::Create(simulation_setting_record);
171
172 system_main = std::make_unique<SystemMainGraphViewer>(
173 std::move(graph_tree_creator_straight),
174 std::move(map_creator),
175 graphic_data_broker,
176 application_setting_record);
177
178 std::unique_ptr<IGraphicMain> graphic_main_viewer =
179 std::make_unique<GraphicMainGraphViewer>(graphic_data_broker, phantomx_mk2, phantomx_mk2, phantomx_mk2, application_setting_record);
180
181 graphic_system.ChangeGraphicMain(std::move(graphic_main_viewer));
182
183 break;
184 }
185 case BootMode::kDisplayModel:
186 {
187 std::unique_ptr<IGraphicMain> graphic_main_test =
188 std::make_unique<GraphicMainDisplayModel>(
189 phantomx_mk2,
190 phantomx_mk2,
191 phantomx_mk2,
192 application_setting_record);
193
194 graphic_system.ChangeGraphicMain(std::move(graphic_main_test));
195
196 break;
197 }
198 case BootMode::kResultViewer:
199 {
200 // 結果表示システムクラスを作成する.
201 system_main = std::make_unique<SystemMainResultViewer>(graphic_data_broker, application_setting_record, phantomx_mk2, phantomx_mk2);
202
203 std::unique_ptr<IGraphicMain> graphic_main = std::make_unique<GraphicMainBasic>(graphic_data_broker, phantomx_mk2, phantomx_mk2, phantomx_mk2, application_setting_record);
204
205 graphic_system.ChangeGraphicMain(std::move(graphic_main));
206
207 break;
208 }
209 case BootMode::kRobotControl:
210 {
211 system_main = std::make_unique<SystemMainRobotControl>(graphic_data_broker);
212
213 std::unique_ptr<IGraphicMain> graphic_main_robot_control =
214 std::make_unique<GraphicMainRobotControl>(graphic_data_broker, phantomx_mk2, phantomx_mk2, phantomx_mk2, application_setting_record);
215
216 graphic_system.ChangeGraphicMain(std::move(graphic_main_robot_control));
217 break;
218 }
219 default:
220 {
221 assert(false); // 無効なモードが指定された.
222 break;
223 }
224 }
225
226 // システムを実行する.
227 if (system_main)
228 {
229 system_main->Main();
230 }
231
232
233 // もう一度実行するかどうかを選択する.
234 CmdIOUtil::OutputHorizontalLine("=", kSystem);
235 CmdIOUtil::OutputNewLine(1, kSystem);
236
237 if (!CmdIOUtil::InputYesNo("Continue?"))
238 {
239 break;
240 }
241
242 CmdIOUtil::OutputNewLine(1, kSystem);
243 CmdIOUtil::OutputHorizontalLine("=", kSystem);
244 CmdIOUtil::OutputNewLine(1, kSystem);
245 }
246
247 CmdIOUtil::Output("Waiting for Dxlib to exit; press the X button on the GUI.", kSystem);
248 graphic_thread.join();
249
250 return 0;
251}
252
253#endif // ! defined (DESIGNLAB_USE_TEST)
254
255
256
起動モードを選択するクラス.
constexpr void SetDefaultBootMode(const BootMode default_mode)
デフォルトの起動モードを設定する.
BootMode SelectBootMode()
起動モードを選択する. BootModeが int 型をもとにしているかつ, 0から始まることを前提にしているので, うまく動作しない場合は,BootModeの定義を見直すこと.
Dxlibの処理を行うクラス.
void ChangeGraphicMain(std::unique_ptr< IGraphicMain > &&graphic_main_ptr)
グラフィックの表示を行うクラスを変更する.
TOMLファイルを入れるディレクトリを作成し, TOMLファイル読み込みの準備をするクラス.
void Export()
TOMLファイルを入れるディレクトリを作成し, TOMLファイル読み込みの準備をする.
tomlファイルを読み込んで構造体に変換するテンプレートクラス.
T ImportOrUseDefault(const std::string &file_path) const
指定したファイルパスのファイルを読み込み,構造体に変換する. 読込に失敗した場合は,デフォルトの構造体を返す. また,読込に失敗した場合には, デフォルトの構造体をファイルに出力するかどうかをユーザに問...
int main()
Definition main.cpp:53
BootMode
起動モードを表す列挙型.
Definition boot_mode.h:19
OutputDetail
コマンドラインに文字を出力する際に,その詳細を指定するための列挙体.