18 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
19 const std::shared_ptr<const IHexapodStatePresenter>& presenter_ptr,
20 const std::shared_ptr<const IHexapodPostureValidator>& checker_ptr,
23 next_move_(next_move),
24 converter_ptr_(converter_ptr),
25 presenter_ptr_(presenter_ptr),
26 checker_ptr_(checker_ptr) {
27 for (
size_t i = 0; i < kCandidateDirectionNum; ++i) {
28 const float deg = 360.0f / kCandidateDirectionNum * i +
29 360 / (kCandidateDirectionNum * 2.0f);
32 candidate_directions_[i] =
Vector3(std::cos(rad), std::sin(rad), 0.0f);
38 std::vector<RobotStateNode>* output_graph)
const {
41 std::array<Vector3, kCandidateDirectionNum> candidate_directions_rotated;
43 for (
size_t i = 0; i < kCandidateDirectionNum; ++i) {
44 candidate_directions_rotated[i] =
48 for (
size_t i = 0; i < kCandidateDirectionNum; ++i) {
51 next_node = current_node;
54 for (
float j = kMoveDistanceStep; j <= kMaxMoveDistance;
55 j += kMoveDistanceStep) {
58 candidate_directions_rotated[i] * j,
62 if (checker_ptr_->IsAllLegInRange(next_node.
leg_state,
65 !checker_ptr_->IsBodyInterferingWithGround(next_node, map_)) {
67 able_count =
static_cast<int>(j);
77 candidate_directions_rotated[i] *
static_cast<float>(able_count),
88 output_graph->push_back(next_node);
static constexpr int kLegNum
NodeCreatorComMoveStraight(const DividedMapState &devide_map, const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodStatePresenter > &presenter_ptr, const std::shared_ptr< const IHexapodPostureValidator > &checker_ptr, HexapodMove next_move)
void Create(const RobotStateNode ¤t_node, int current_num, std::vector< RobotStateNode > *output_graph) const override
現在のノードから次のノード群を生成する.
void ChangeDiscreteLegPos(const int leg_index, const DiscreteLegPos new_discretized_leg_pos, LegStateBit *leg_state)
脚の状態を変更する.遊脚を表すビットはそのまま.
constexpr T ConvertDegToRad(const T deg) noexcept
角度を [deg] から [rad] に変換する関数.
Vector3 RotateVector3(const Vector3 &vec, const EulerXYZ &rot)
回転させたベクトルを返す.三角関数の処理が多く重たいので注意.
HexapodMove
ロボットが次にどの動作をするのかを表す列挙体.
std::array< Vector3, HexapodConst::kLegNum > leg_pos
[4 * 3 * 6 = 72 byte] 脚先の座標.(coxa(脚の付け根)を原点とする)
leg_func::LegStateBit leg_state
[4 byte] 脚状態,重心パターンを bitで表す.旧名 leg_con.
constexpr void ChangeToNextNode(const int parent_index_, const HexapodMove next_move_)
次の動作を設定する関数. 深さを一つ深くして,親と次の動作を設定する.
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
Quaternion posture
[4 * 4 = 16byte] 姿勢を表すクォータニオン.
void ChangeGlobalCenterOfMass(const Vector3 &new_com, bool do_change_leg_base_pos)
重心位置を変更する関数.