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 <boost/thread.hpp>
9#include <memory>
10
11#include "test_main.h"
12
13#if !defined(DESIGNLAB_USE_TEST)
14
17#include "boot_mode_selector.h"
18#include "cmdio_util.h"
19#include "gpg_builder_flat.h"
20#include "graphic_main_basic.h"
24#include "graphic_system.h"
28#include "phantomx_mk2.h"
36#include "toml_file_importer.h"
37#include "xr_r1.h"
38
39// このプロジェクトがコンパイルされない場合はソリューションエクスプローラーから
40// DesignLabを右クリック →「スタートアッププロジェクトに設定」を選択.
41
42namespace {
43
44auto LoadApplicationSettingRecord() {
45 using enum designlab::OutputDetail;
50
52
53 TomlDirectoryExporter toml_directory_exporter;
54 toml_directory_exporter.Export();
55
56 TomlFileImporter<ApplicationSettingRecord> application_setting_importer(
57 std::make_unique<ApplicationSettingRecordValidator>());
58
59 return std::make_shared<const ApplicationSettingRecord>(
60 application_setting_importer.ImportOrUseDefault("./settings.toml"));
61}
62
63void InitOutputSetting(
64 std::shared_ptr<const designlab::ApplicationSettingRecord> setting) {
65 designlab::cmdio::DoOutput(setting->do_cmd_output);
66 designlab::cmdio::SetOutputLimit(setting->cmd_output_detail);
67}
68
69auto LoadPhantomXMkII() {
73
74 TomlFileImporter<PhantomXMkIIParameterRecord> parameter_importer;
75 const auto record = parameter_importer.ImportOrUseDefault(
76 "./simulation_condition/phantomx_mk2.toml");
77
78 return std::make_shared<PhantomXMkII>(record);
79}
80
81auto LoadXrR1() {
82 using designlab::XrR1;
84
85 return std::make_shared<XrR1>(XrR1ParameterRecord{});
86}
87
88} // namespace
89
90int main() {
91 // int main内では designlab:: を省略できる.
92 // 推奨されない書き方だが,可読性のため,ここでのみ使用する.
93 using namespace designlab;
94 using enum OutputDetail;
95
96 // 設定を読み込む.
97 auto app_setting_record = LoadApplicationSettingRecord();
98
99 // 出力設定を初期化する.
100 InitOutputSetting(app_setting_record);
101
102 // タイトルを表示する.
103 cmdio::OutputTitle(
104 "Free Gait Planning for a Hexapod Walking Robot by Graph Search", true);
105
106 // GUIを別のスレッドで実行する.
107 // このスレッドへはGraphicDataBrokerを通してデータを渡す.
108 GraphicSystem graphic_system(app_setting_record);
109
110 // グラフィックシステムを別スレッドで実行する.
111 boost::thread graphic_thread(&GraphicSystem::Main, &graphic_system);
112
113 cmdio::SystemOutput("Now Waiting for Dxlib to start.");
114
115 while (!graphic_system.IsInitialized()) {
116 // Dxlibの初期化が終わるまで待機する.
117 }
118
119 cmdio::SystemOutput("Dxlib has started.");
120 cmdio::OutputNewLine(1, kSystem);
121
122 // 処理を実行する.
123 while (true) {
124 // 起動モードを選択する.
125 BootMode boot_mode = app_setting_record->default_mode;
126
127 if (app_setting_record->ask_about_modes) {
128 BootModeSelector boot_mode_selector;
129
130 // デフォルトの起動モードを設定する.
131 boot_mode_selector.SetDefaultBootMode(app_setting_record->default_mode);
132
133 // 起動モードを選択する.
134 boot_mode = boot_mode_selector.SelectBootMode();
135 }
136
137 // 選択が終わったら,選択されたモードに応じてシステムを作成する.
138 std::unique_ptr<ISystemMain> system_main;
139
140 switch (boot_mode) {
141 case BootMode::kSimulation: {
142 // シミュレーションシステムクラスを作成する.
143 auto phantomx_mk2 = LoadXrR1();
144
145 const auto gpg_builder = std::make_unique<GpgBuilderFlat>(
146 phantomx_mk2, phantomx_mk2, phantomx_mk2);
147 auto gait_pattern_generator = gpg_builder->Build();
148
149 const auto sim_setting_record =
151 "./simulation_condition/simulation_setting.toml");
152
153 auto map_creator = MapCreatorSelector{}.Select(sim_setting_record);
154 auto simulation_end_checker =
155 SimulationEndCheckerFactory::Create(sim_setting_record);
156 auto robot_operator = RobotOperatorFactory::Create(sim_setting_record);
157 auto node_initializer = std::make_unique<NodeInitializer>(
158 sim_setting_record.initial_positions,
159 sim_setting_record.initial_posture,
160 sim_setting_record.initial_move);
161 auto result_exporter =
162 std::make_shared<ResultFileExporter>(phantomx_mk2, phantomx_mk2);
163
164 const auto graphic_data_broker = std::make_shared<GraphicDataBroker>();
165
166 system_main = std::make_unique<SystemMainSimulation>(
167 std::move(gait_pattern_generator), std::move(map_creator),
168 std::move(simulation_end_checker), std::move(robot_operator),
169 std::move(node_initializer), graphic_data_broker,
170 app_setting_record, result_exporter);
171
172 auto graphic_main = std::make_unique<GraphicMainBasic>(
173 graphic_data_broker, phantomx_mk2, phantomx_mk2, phantomx_mk2,
174 app_setting_record);
175
176 graphic_system.ChangeGraphicMain(std::move(graphic_main));
177
178 break;
179 }
180 case BootMode::kViewer: {
181 // グラフビューアシステムクラスを作成する.
182
183 TomlFileImporter<SimulationSettingRecord> simulation_setting_importer;
184 const SimulationSettingRecord simulation_setting_record =
185 simulation_setting_importer.ImportOrUseDefault(
186 "./simulation_condition/simulation_setting.toml");
187
188 auto hexapod_param = LoadXrR1();
189 auto graphic_data_broker = std::make_shared<GraphicDataBroker>();
190
191 auto map_creator =
192 MapCreatorSelector{}.Select(simulation_setting_record);
193 auto node_creator_builder = std::make_unique<NodeCreatorBuilderBodyRot>(
194 hexapod_param, hexapod_param, hexapod_param);
195 auto graph_tree_creator =
196 std::make_unique<GraphTreeCreator>(std::move(node_creator_builder));
197
198 system_main = std::make_unique<SystemMainGraphViewer>(
199 std::move(graph_tree_creator), std::move(map_creator),
200 graphic_data_broker, app_setting_record);
201
202 std::unique_ptr<IGraphicMain> graphic_main_viewer =
203 std::make_unique<GraphicMainGraphViewer>(
204 graphic_data_broker, hexapod_param, hexapod_param,
205 hexapod_param, app_setting_record);
206
207 graphic_system.ChangeGraphicMain(std::move(graphic_main_viewer));
208
209 break;
210 }
211 case BootMode::kDisplayModel: {
212 auto phantomx_mk2 = LoadXrR1();
213
214 std::unique_ptr<IGraphicMain> graphic_main_test =
215 std::make_unique<GraphicMainDisplayModel>(
216 phantomx_mk2, phantomx_mk2, phantomx_mk2, app_setting_record);
217
218 graphic_system.ChangeGraphicMain(std::move(graphic_main_test));
219
220 break;
221 }
222 case BootMode::kResultViewer: {
223 // 結果表示システムクラスを作成する.
224 auto phantomx_mk2 = LoadXrR1();
225 auto graphic_data_broker = std::make_shared<GraphicDataBroker>();
226
227 system_main = std::make_unique<SystemMainResultViewer>(
228 graphic_data_broker, app_setting_record, phantomx_mk2,
229 phantomx_mk2);
230
231 std::unique_ptr<IGraphicMain> graphic_main =
232 std::make_unique<GraphicMainBasic>(
233 graphic_data_broker, phantomx_mk2, phantomx_mk2, phantomx_mk2,
234 app_setting_record);
235
236 graphic_system.ChangeGraphicMain(std::move(graphic_main));
237
238 break;
239 }
240 case BootMode::kRobotControl: {
241 auto graphic_data_broker = std::make_shared<GraphicDataBroker>();
242 auto phantomx_mk2 = LoadPhantomXMkII();
243 system_main =
244 std::make_unique<SystemMainRobotControl>(graphic_data_broker);
245
246 std::unique_ptr<IGraphicMain> graphic_main_robot_control =
247 std::make_unique<GraphicMainRobotControl>(
248 graphic_data_broker, phantomx_mk2, phantomx_mk2, phantomx_mk2,
249 app_setting_record);
250
251 graphic_system.ChangeGraphicMain(std::move(graphic_main_robot_control));
252 break;
253 }
254 default: {
255 assert(false); // 無効なモードが指定された.
256 break;
257 }
258 }
259
260 // システムを実行する.
261 if (system_main) {
262 system_main->Main();
263 }
264
265 // もう一度実行するかどうかを選択する.
266 cmdio::OutputHorizontalLine("=", kSystem);
267 cmdio::OutputNewLine(1, kSystem);
268
269 if (!cmdio::InputYesNo("Continue?")) {
270 break;
271 }
272
273 cmdio::OutputNewLine(1, kSystem);
274 cmdio::OutputHorizontalLine("=", kSystem);
275 cmdio::OutputNewLine(1, kSystem);
276 }
277
278 cmdio::SystemOutput(
279 "Waiting for Dxlib to exit; press the X button on the GUI.");
280 graphic_thread.join();
281
282 return 0;
283}
284
285#endif // ! defined (DESIGNLAB_USE_TEST)
起動モードを選択するクラス.
constexpr void SetDefaultBootMode(const BootMode default_mode)
デフォルトの起動モードを設定する.
BootMode SelectBootMode()
起動モードを選択する. BootModeが int 型をもとにしているかつ, 0から始まることを前提にしているので, うまく動作しない場合は,BootModeの定義を見直すこと.
Dxlibの処理を行うクラス.
bool IsInitialized() const
初期化が終わっているか.
void ChangeGraphicMain(std::unique_ptr< IGraphicMain > &&graphic_main_ptr)
グラフィックの表示を行うクラスを変更する.
マップを生成するクラスを生成するクラス.
std::unique_ptr< IMapCreator > Select(const SimulationSettingRecord &record) const
マップを生成するクラスを生成する.
PhantomX mk-2 の状態を計算するクラス.
TOMLファイルを入れるディレクトリを作成し, TOMLファイル読み込みの準備をするクラス.
tomlファイルを読み込んで構造体に変換するテンプレートクラス.
T ImportOrUseDefault(const std::string &file_path) const
指定したファイルパスのファイルを読み込み,構造体に変換する. 読込に失敗した場合は,デフォルトの構造体を返す. また,読込に失敗した場合には, デフォルトの構造体をファイルに出力するかどうかをユーザに問...
int main()
Definition main.cpp:90
void DoOutput(bool do_output)
そもそも出力をするかを設定する関数. false に設定しても システムメッセージは出力される.
void SetOutputLimit(OutputDetail limit)
出力するメッセージをどこまで許可するかを設定する関数. この関数を呼び出してから出ないと,他の関数を使えない. 例えば kError に設定すると, kError 未満の出力( kInfo とか...
BootMode
起動モードを表す列挙型.
Definition boot_mode.h:16
OutputDetail
コマンドラインに文字を出力する際に,その詳細を指定するための列挙体.
アプリの設定を記録する構造体.