33 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
34 const std::shared_ptr<const IHexapodJointCalculator>& calculator_ptr,
35 const std::shared_ptr<const IHexapodPostureValidator>& checker_ptr,
36 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr)
37 : mouse_ptr_(
std::make_shared<
Mouse>()),
38 calculator_ptr_(calculator_ptr),
39 converter_ptr_(converter_ptr) {
42 robot_ = node_initializer.InitNode();
47 "./simulation_condition/simulation_setting.toml");
50 map_state_ = map_creator->InitMap();
51 divided_map_state_.
Init(map_state_, {});
53 const auto camera = std::make_shared<DxlibCamera>();
54 const auto camera_gui = std::make_shared<DxlibGuiCamera>(
55 setting_ptr->window_size_x, setting_ptr->window_size_y, camera);
58 const auto camera_dragger = std::make_shared<CameraDragger>(camera);
60 const auto camera_parameter_gui =
61 std::make_shared<DxlibGuiCameraParameterDisplayer>(
62 setting_ptr->window_size_x, setting_ptr->window_size_y, camera);
64 camera_parameter_gui->SetVisible(
false);
66 const auto node_display_gui = std::make_shared<DxlibGuiNodeDisplayer>(
67 setting_ptr->window_size_x, setting_ptr->window_size_y, converter_ptr,
68 calculator_ptr, checker_ptr);
69 node_display_gui->SetPos(setting_ptr->window_size_x - 10, 10,
72 const auto [hexapod_renderer, hexapod_node_setter] =
74 setting_ptr->gui_display_quality);
76 const auto map_renderer = std::make_shared<MapRenderer>();
77 map_renderer->SetMapState(map_state_);
78 map_renderer->SetNode(robot_);
80 const auto world_grid_renderer = std::make_shared<WorldGridRenderer>();
82 const auto approximated_motion_range_render =
83 std::make_shared<ApproximatedMotionRangeRender>(checker_ptr,
86 gui_updater_.
Register(camera_parameter_gui, 1);
87 gui_updater_.
Register(camera_dragger, 0);
88 gui_updater_.
Register(node_display_gui, 1);
89 gui_updater_.
Register(camera_gui, 1);
93 node_setter_group_.
Register(approximated_motion_range_render);
94 node_setter_group_.
Register(camera_gui);
95 node_setter_group_.
Register(node_display_gui);
96 node_setter_group_.
Register(hexapod_node_setter);
97 node_setter_group_.
Register(map_renderer);
100 render_group_.
Register(hexapod_renderer);
101 render_group_.
Register(map_renderer);
102 render_group_.
Register(world_grid_renderer);
106 assert(mouse_ptr_ !=
nullptr);
108 mouse_ptr_->Update();
119 node_setter_group_.
SetNode(robot_);
127 render_group_.
Draw();
132void GraphicMainDisplayModel::MoveBody() {
133 const float kComSpeed = 1.1f;
172 float angle_speed = kComSpeed / 360.0f * 2.f * std::numbers::pi_v<float>;
184 float angle_speed = kComSpeed / 360.0f * 2.f * std::numbers::pi_v<float>;
196 float angle_speed = kComSpeed / 360.0f * 2.f * std::numbers::pi_v<float>;
210void GraphicMainDisplayModel::MoveLeg() {
211 const float kSpeed = 1;
212 const float kAngleSpeed = 0.01f;
229 Vector3 global = converter_ptr_->ConvertLegToGlobalCoordinate(
249 .and_then([&](
int pos_num) {
251 map_x, map_y, divided_map_tile_index_ % pos_num);
257 ++divided_map_tile_index_;
259 robot_.
leg_pos[i] = converter_ptr_->ConvertGlobalToLegCoordinate(
267 std::array<HexapodJointState, HexapodConst::kLegNum> res =
268 calculator_ptr_->CalculateAllJointState(robot_);
270 float coxa = res[i].joint_angle[0];
271 float femur = res[i].joint_angle[1];
272 float tibia = res[i].joint_angle[2];
277 : kAngleSpeed * -1.f;
297 : kAngleSpeed * -1.f;
301 femur = (femur + tibia - std::numbers::pi_v<float>) > 0
313 : kAngleSpeed * -1.f;
315 tibia = (femur + tibia - std::numbers::pi_v<float>) > 0
constexpr int GetDividedMapIndexX(const float pos_x) const noexcept
指定した座標を DividedMap のインデックスに変換する. 範囲外の値を指定した場合でも,値を丸めずに返す. そのため,IsInMap で範囲内に存在するかどうかを確認する必要がある.
nostd::expected< Vector3, std::string > GetPointPos(int x_index, int y_index, int divided_map_index) const
格子状に切り分けられたマップから,脚設置可能点の実際の座標を取得する. 範囲外の値を指定した場合は, unexpected を返す.
void Init(const MapState &map_state, const Vector3 global_robot_com)
マップのデータを初期化する. ロボットの重心座標を中心にマップのデータを格子状に分割し, その中に存在する脚設置可能点を集める.
constexpr int GetDividedMapIndexY(const float pos_y) const noexcept
指定した座標を DividedMap のインデックスに変換する. 範囲外の値を指定した場合でも,値を丸めずに返す. そのため,IsInMap で範囲内に存在するかどうかを確認する必要がある.
nostd::expected< int, std::string > GetPointNum(int x_index, int y_index) const
格子状に切り分けられたマップから,脚設置可能点の数を取得する. 範囲外の値を指定した場合は, unexpected を返す.
void Register(const std::shared_ptr< IDxlib3dRenderer > &renderer)
3D描画を行うクラスを登録する.
void Draw() const
登録されているクラスの draw 関数を呼ぶ. また,Zソートを行う.
void Register(const std::shared_ptr< T > &gui_ptr, int priority)
UpdateとDrawを行うGUIを登録する. IDxlibClickableまたは,IDxlibDraggable, IDxlibWheelHandlerを継承している場合は,...
void OpenTerminal()
Terminalを開く. 他のGUIをRegisterした後に呼び出すこと. 2回目以降の呼び出しは無視される. また,Terminalは最も優先度が高い.
void Draw() const
登録済みのGUIのDraw関数を実行する.
void Activate(const std::shared_ptr< const Mouse > &mouse_ptr)
GUIのUpdate関数を実行し,クリック,ドラッグなどの判定を行う. 優先度の高いものから順に各種判定を行う.
void Register(const std::shared_ptr< IDxlibNodeSetter > &setter)
ノードの設定を行うクラスを登録する.
void SetNode(const RobotStateNode &node)
登録済みの全てのクラスに対してノードの設定を行う.
void Draw() const override
描画を行う. ここでは描画系の処理のみを行い内部のデータを 更新しないため const を付けている.
bool Update() override
描画画面の更新を行う.純粋仮想関数のため, 継承先では必ず override する必要がある.
GraphicMainDisplayModel(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodJointCalculator > &calculator_ptr, const std::shared_ptr< const IHexapodPostureValidator > &checker_ptr, const std::shared_ptr< const ApplicationSettingRecord > &setting_ptr)
static constexpr int kLegNum
static std::tuple< std::shared_ptr< IDxlib3dRenderer >, std::shared_ptr< IDxlibNodeSetter > > Build(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodJointCalculator > &calculator_ptr, DisplayQuality display_quality)
HexapodRendererクラスのインスタンスを作成する. static関数なので,HexapodRendererBuilder::Build()と呼び出す.
void Update()
キー入力を更新する. これを毎フレーム実行しないと,キー入力を取得できない.
int GetPressingCount(const int key_code) const
keyCodeのキーが押されているフレーム数を取得する.
std::unique_ptr< IMapCreator > Select(const SimulationSettingRecord &record) const
マップを生成するクラスを生成する.
ノードの初期化を行うクラス. シミュレーション時にノードの初期値を設定するために使用する.
static constexpr float kFemurLength
第2関節部の長さ[mm].
static constexpr float kTibiaAngleMax
static constexpr float kFemurAngleMin
第2関節の可動範囲の最大値[rad].詳しくは referenceフォルダ参照.
static constexpr float kFemurAngleMax
第2関節の可動範囲の最小値[rad].詳しくは referenceフォルダ参照.
static constexpr float kCoxaLength
第1関節部の長さ[mm].
static constexpr float kCoxaAngleMin
第1関節の可動範囲の最大値[rad].詳しくは referenceフォルダ参照.
static constexpr float kTibiaAngleMin
第2関節の可動範囲の最大値[rad].詳しくは referenceフォルダ参照.
static constexpr float kTibiaLength
第3関節部の長さ[mm].
static constexpr std::array< float, kPhantomXLegNum > kCoxaDefaultAngle
第1関節の初期角度[rad]
static constexpr float kCoxaAngleMax
第2関節の可動範囲の最小値[rad].詳しくは referenceフォルダ参照.
tomlファイルを読み込んで構造体に変換するテンプレートクラス.
T ImportOrUseDefault(const std::string &file_path) const
指定したファイルパスのファイルを読み込み,構造体に変換する. 読込に失敗した場合は,デフォルトの構造体を返す. また,読込に失敗した場合には, デフォルトの構造体をファイルに出力するかどうかをユーザに問...
Vector3 RotateVector3(const Vector3 &vec, const EulerXYZ &rot)
回転させたベクトルを返す.三角関数の処理が多く重たいので注意.
constexpr unsigned int kDxlibGuiAnchorRightTop
constexpr unsigned int kDxlibGuiAnchorLeftTop
static Quaternion MakeByAngleAxis(float rad_angle, const Vector3 &axis)
回転軸と回転角からクォータニオンを作成する. q = cos(θ/2) * w + sin(θ/2) * { v.x + v.y + v.z } となる. ノルムは必ず1になる.
std::array< Vector3, HexapodConst::kLegNum > leg_pos
[4 * 3 * 6 = 72 byte] 脚先の座標.(coxa(脚の付け根)を原点とする)
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
void ChangePosture(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const Quaternion &new_posture)
クォータニオンを変更し,胴体を回転させる関数.
Quaternion posture
[4 * 4 = 16byte] 姿勢を表すクォータニオン.
std::array< Vector3, HexapodConst::kLegNum > leg_reference_pos
void ChangeGlobalCenterOfMass(const Vector3 &new_com, bool do_change_leg_base_pos)
重心位置を変更する関数.
static constexpr Vector3 GetUpVec() noexcept
上に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetUpVec() と呼び出せる.
static constexpr Vector3 GetFrontVec() noexcept
正面に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetFrontVec() と呼び出せる.
static constexpr Vector3 GetLeftVec() noexcept
左に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetLeftVec() と呼び出せる.