35 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
36 const std::shared_ptr<const IHexapodJointCalculator>& calculator_ptr,
37 const std::shared_ptr<const IHexapodPostureValidator>& checker_ptr,
38 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr) :
39 mouse_ptr_(
std::make_shared<
Mouse>()),
40 calculator_ptr_(calculator_ptr),
41 converter_ptr_(converter_ptr)
44 robot_ = node_initializer.InitNode();
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>(setting_ptr->window_size_x, setting_ptr->window_size_y, camera);
57 const auto camera_dragger = std::make_shared<CameraDragger>(camera);
59 const auto camera_parameter_gui = std::make_shared<DxlibGuiCameraParameterDisplayer>(setting_ptr->window_size_x, setting_ptr->window_size_y, camera);
61 camera_parameter_gui->SetVisible(
false);
63 const auto node_display_gui = std::make_shared<DxlibGuiNodeDisplayer>(setting_ptr->window_size_x, setting_ptr->window_size_y, converter_ptr, calculator_ptr, checker_ptr);
66 const auto [hexapod_renderer, hexapod_node_setter] =
69 const auto map_renderer = std::make_shared<MapRenderer>();
70 map_renderer->SetMapState(map_state_);
71 map_renderer->SetNode(robot_);
73 const auto world_grid_renderer = std::make_shared<WorldGridRenderer>();
75 const auto approximated_motion_range_render =
76 std::make_shared<ApproximatedMotionRangeRender>(checker_ptr, converter_ptr);
78 gui_updater_.
Register(camera_parameter_gui, 1);
79 gui_updater_.
Register(camera_dragger, 0);
80 gui_updater_.
Register(node_display_gui, 1);
81 gui_updater_.
Register(camera_gui, 1);
85 node_setter_group_.
Register(approximated_motion_range_render);
86 node_setter_group_.
Register(camera_gui);
87 node_setter_group_.
Register(node_display_gui);
88 node_setter_group_.
Register(hexapod_node_setter);
89 node_setter_group_.
Register(map_renderer);
92 render_group_.
Register(hexapod_renderer);
93 render_group_.
Register(map_renderer);
94 render_group_.
Register(world_grid_renderer);
100 assert(mouse_ptr_ !=
nullptr);
102 mouse_ptr_->Update();
116 node_setter_group_.
SetNode(robot_);
125 render_group_.
Draw();
131void GraphicMainDisplayModel::MoveBody()
133 const float kComSpeed = 1.1f;
185 float angle_speed = kComSpeed / 360.0f * 2.f * std::numbers::pi_v<float>;
199 float angle_speed = kComSpeed / 360.0f * 2.f * std::numbers::pi_v<float>;
213 float angle_speed = kComSpeed / 360.0f * 2.f * std::numbers::pi_v<float>;
226void GraphicMainDisplayModel::MoveLeg()
228 const float kSpeed = 1;
229 const float kAngleSpeed = 0.01f;
262 converter_ptr_->ConvertLegToGlobalCoordinate(
291 divided_map_tile_index_ % divided_map_state_.
GetPointNum(map_x, map_y));
293 ++divided_map_tile_index_;
295 robot_.
leg_pos[i] = converter_ptr_->ConvertGlobalToLegCoordinate(
303 std::array<HexapodJointState, HexapodConst::kLegNum> res =
304 calculator_ptr_->CalculateAllJointState(robot_);
306 float coxa = res[i].joint_angle[0];
307 float femur = res[i].joint_angle[1];
308 float tibia = res[i].joint_angle[2];
314 kAngleSpeed : kAngleSpeed * -1.f;
327 kAngleSpeed : kAngleSpeed * -1.f;
331 femur = (femur + tibia - std::numbers::pi_v<float>) > 0 ? femur - speed : femur;
337 float speed = keyboard_.
GetPressingCount(KEY_INPUT_I) > 0 ? kAngleSpeed : kAngleSpeed * -1.f;
339 tibia = (femur + tibia - std::numbers::pi_v<float>) > 0 ? tibia - speed : tibia;
constexpr int GetDividedMapIndexX(const float pos_x) const noexcept
指定した座標を DividedMap のインデックスに変換する. 範囲外の値を指定した場合でも,値を丸めずに返す. そのため,IsInMap で範囲内に存在するかどうかを確認する必要がある.
Vector3 GetPointPos(int x_index, int y_index, int divided_map_index) const
格子状に切り分けられたマップから,脚設置可能点の実際の座標を取得する. 範囲外の値を指定した場合は,(0,0,0)を返す.
void Init(const MapState &map_state, const Vector3 global_robot_com)
マップのデータを初期化する. ロボットの重心座標を中心にマップのデータを格子状に分割し, その中に存在する脚設置可能点を集める.
constexpr int GetDividedMapIndexY(const float pos_y) const noexcept
指定した座標を DividedMap のインデックスに変換する. 範囲外の値を指定した場合でも,値を丸めずに返す. そのため,IsInMap で範囲内に存在するかどうかを確認する必要がある.
int GetPointNum(int x_index, int y_index) const
格子状に切り分けられたマップから,脚設置可能点の数を取得する. 範囲外の値を指定した場合は,0を返す.
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のキーが押されているフレーム数を取得する.
static std::unique_ptr< IMapCreator > Create(const SimulationSettingRecord &record)
マップを生成するクラスを生成する.
ノードの初期化を行うクラス. シミュレーション時にノードの初期値を設定するために使用する.
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(脚の付け根)を原点とする)
void ChangeGlobalCenterOfMass(const designlab::Vector3 &new_com, bool do_change_leg_base_pos)
重心位置を変更する関数.
void ChangePosture(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const designlab::Quaternion &new_posture)
クォータニオンを変更し,胴体を回転させる関数.
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
Quaternion posture
[4 * 4 = 16byte] 姿勢を表すクォータニオン.
std::array< Vector3, HexapodConst::kLegNum > leg_reference_pos
static constexpr Vector3 GetUpVec() noexcept
上に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetUpVec() と呼び出せる.
static constexpr Vector3 GetFrontVec() noexcept
正面に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetFrontVec() と呼び出せる.
static constexpr Vector3 GetLeftVec() noexcept
左に進む単位ベクトルを返す. 静的な関数なので,Vector3::GetLeftVec() と呼び出せる.