GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
node_creator_body_rot.h
[詳解]
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#ifndef DESIGNLAB_NODE_CREATOR_BODY_ROT_H_
9#define DESIGNLAB_NODE_CREATOR_BODY_ROT_H_
10
11#include <memory>
12#include <vector>
13
14#include "math_util.h"
15#include "divided_map_state.h"
19
20
21namespace designlab
22{
23
26class NodeCreatorBodyRot final : public INodeCreator
27{
28public:
30 const DividedMapState& devide_map,
31 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
32 const std::shared_ptr<const IHexapodPostureValidator>& checker_ptr,
33 const Vector3& rot_axis,
34 HexapodMove next_move);
35
37
38 void Create(const RobotStateNode& current_node, int current_num,
39 std::vector<RobotStateNode>* output_graph) const override;
40
41
42private:
44 static constexpr float kBodyYawRotAngleMax = math_util::ConvertDegToRad(20.f);
45
47 static constexpr float kBodyYawRotAngleMin = math_util::ConvertDegToRad(-20.f);
48
50 static constexpr int kBodyYawRotAngleDivNum = 21;
51
52
53 constexpr std::array<float, kBodyYawRotAngleDivNum> CreateCandidateAngle() const
54 {
55 std::array<float, kBodyYawRotAngleDivNum> res{};
56 int count = 0;
57
58 res[count++] = (kBodyYawRotAngleMax + kBodyYawRotAngleMin) / 2;
59
60 // 絶対値の小さい順に並べる.
61 const float dif = (kBodyYawRotAngleMax - kBodyYawRotAngleMin) /
62 (kBodyYawRotAngleDivNum - 1);
63
64 for (int i = 0; i < kBodyYawRotAngleDivNum / 2; ++i)
65 {
66 res[count++] = res[0] + dif * (i + 1);
67 res[count++] = res[0] - dif * (i + 1);
68 }
69
70 return res;
71 }
72
73 const std::array<float, kBodyYawRotAngleDivNum> candidate_angle_ = CreateCandidateAngle();
74
75 const DividedMapState map_;
76 const HexapodMove next_move_;
77
78 const std::shared_ptr<const IHexapodCoordinateConverter> converter_ptr_;
79 const std::shared_ptr<const IHexapodPostureValidator> checker_ptr_;
80
81 Vector3 rot_axis_;
82
83 static_assert(kBodyYawRotAngleMax > kBodyYawRotAngleMin,
84 "kBodyYawRotAngleMax は kBodyYawRotAngleMinよりも大きい必要があります.");
85 static_assert(kBodyYawRotAngleDivNum % 2 == 1,
86 "kBodyYawRotAngleDivNum は奇数である必要があります.");
87};
88
89} // namespace designlab
90
91
92#endif // DESIGNLAB_NODE_CREATOR_BODY_ROT_H_
マップを格子状に分割して管理するクラス.
ノード生成処理のインターフェース.
ロボットの回転を表すノードを生成するクラス.
void Create(const RobotStateNode &current_node, int current_num, std::vector< RobotStateNode > *output_graph) const override
現在のノードから次のノード群を生成する.
constexpr T ConvertDegToRad(const T deg) noexcept
角度を [deg] から [rad] に変換する関数.
Definition math_util.h:126
HexapodMove
ロボットが次にどの動作をするのかを表す列挙体.
グラフ構造のためのノード(頂点).旧名 LNODE
3次元の位置ベクトルを表す構造体.