25 std::pair<bool, Vector2> com_candidate[kDiscretizationNum * kDiscretizationNum];
28 if (!MakeComCandidatePoint(polygon, com_candidate))
34 std::vector<Vector2> edge_vec;
45 for (
int i = 0; i < kDiscretizationNum * kDiscretizationNum; ++i)
47 if (!IsInMargin(polygon, edge_vec, com_candidate[i].second))
50 com_candidate[i].first =
false;
55 Vector3 after_move_com_pos = { com_candidate[i].second.
x,
56 com_candidate[i].second.y,
65 const Vector3 after_move_leg_pos = current_node.
leg_pos[j] - real_dif;
67 if (!checker_ptr_->IsLegInRange(j, after_move_leg_pos))
70 com_candidate[i].first =
false;
79 const Vector2 k_rotate_center = { -10000, 0 };
80 const float k_rotate_r = 10000;
82 float min_dist = -100000;
85 for (
int i = 0; i < kDiscretizationNum * kDiscretizationNum; ++i)
87 if (com_candidate[i].first)
89 const float dist = fabsf(
90 (com_candidate[i].second - k_rotate_center).GetLength() - k_rotate_r);
106 (*output_com).x = com_candidate[min_index].second.x;
107 (*output_com).y = com_candidate[min_index].second.y;
113bool ComSelector::MakeComCandidatePoint(
115 std::pair<bool, Vector2> coms[kDiscretizationNum * kDiscretizationNum])
const
118 const float kMinX = polygon.
GetMinX();
119 const float kMaxX = polygon.
GetMaxX();
120 const float kMinY = polygon.
GetMinY();
121 const float kMaxY = polygon.
GetMaxY();
123 const float kWidth = kMaxX - kMinX;
124 const float kHeight = kMaxY - kMinY;
131 const float kDeltaWidth = kWidth /
static_cast<float>(kDiscretizationNum);
132 const float kDeltaHeight = kHeight /
static_cast<float>(kDiscretizationNum);
135 for (
int x = 0; x < kDiscretizationNum; ++x)
137 for (
int y = 0; y < kDiscretizationNum; ++y)
139 coms[x * kDiscretizationNum + y].first =
true;
140 coms[x * kDiscretizationNum + y].second.x = kMinX + kDeltaWidth * x;
141 coms[x * kDiscretizationNum + y].second.y = kMinY + kDeltaHeight * y;
149bool ComSelector::IsInMargin(
const Polygon2& polygon,
150 const std::vector<Vector2>& edge_vec,
151 const Vector2& candidate_point)
const
153 for (
int i = 0; i < polygon.GetVertexNum(); ++i)
155 Vector2 v_map = candidate_point - polygon.GetVertex(i);
157 if (v_map.Cross(edge_vec[i]) > -kStabilityMargin)
bool GetComFromPolygon(const Polygon2 &polygon, const RobotStateNode ¤t_node, Vector3 *output_com) const
重心を求める.
static constexpr int kLegNum
bool IsGrounded(const LegStateBit &leg_state, const int leg_index)
脚番号 leg_index 0 ~ 5 に応じて,その脚が接地しているかを調べる. 脚は右前脚を0番として,時計回りに0,1,2,3,4,5となる.左前足が5番.
constexpr bool IsEqual(const T num1, const T num2) noexcept
C++において,小数同士の計算は誤差が出てしまう. 誤差込みで値が等しいか調べる.
Vector3 RotateVector3(const Vector3 &vec, const EulerXYZ &rot)
回転させたベクトルを返す.三角関数の処理が多く重たいので注意.
constexpr float GetMaxX() const
頂点の中で最大のx座標を返す関数.
constexpr float GetMinY() const
頂点の中で最小のy座標を返す関数.
constexpr int GetVertexNum() const
多角形の頂点数を返す関数.
constexpr float GetMaxY() const
頂点の中で最大のy座標を返す関数.
constexpr Vector2 GetVertex(const int i) const
頂点の座標を返す関数.
constexpr float GetMinX() const
頂点の中で最小のx座標を返す関数.
constexpr Quaternion GetConjugate() const noexcept
クォータニオンの共役を返す. 共役なクォータニオンとは,ベクトル成分の符号を反転させたもの q = w + xi + yj + zk とすると, qの共役は w - xi - yj - zk となる...
グラフ構造のためのノード(頂点).旧名 LNODE
std::array< Vector3, HexapodConst::kLegNum > leg_pos
[4 * 3 * 6 = 72 byte] 脚先の座標.(coxa(脚の付け根)を原点とする)
leg_func::LegStateBit leg_state
[4 byte] 脚状態,重心パターンを bitで表す.旧名 leg_con.
Vector3 center_of_mass_global_coord
[4 * 3 = 12byte] グローバル座標系における重心の位置.旧名 GCOM
Quaternion posture
[4 * 4 = 16byte] 姿勢を表すクォータニオン.
Vector2 GetNormalized() const
このベクトルを正規化したベクトルを返す.