21 std::pair<bool, Vector2>
22 com_candidate[kDiscretizationNum * kDiscretizationNum];
25 if (!MakeComCandidatePoint(polygon, com_candidate)) {
30 std::vector<Vector2> edge_vec;
41 for (
int i = 0; i < kDiscretizationNum * kDiscretizationNum; ++i) {
42 if (!IsInMargin(polygon, edge_vec, com_candidate[i].second)) {
44 com_candidate[i].first =
false;
49 Vector3 after_move_com_pos = {com_candidate[i].second.
x,
50 com_candidate[i].second.y,
59 const Vector3 after_move_leg_pos = current_node.
leg_pos[j] - real_dif;
61 if (!checker_ptr_->IsLegInRange(j, after_move_leg_pos)) {
63 com_candidate[i].first =
false;
72 const Vector2 k_rotate_center = {-10000, 0};
73 const float k_rotate_r = 10000;
75 float min_dist = -100000;
78 for (
int i = 0; i < kDiscretizationNum * kDiscretizationNum; ++i) {
79 if (com_candidate[i].first) {
80 const float dist = fabsf(
81 (com_candidate[i].second - k_rotate_center).GetLength() - k_rotate_r);
83 if (min_dist < dist) {
90 if (min_index == -1) {
95 (*output_com).x = com_candidate[min_index].second.x;
96 (*output_com).y = com_candidate[min_index].second.y;
101bool ComSelector::MakeComCandidatePoint(
103 std::pair<bool, Vector2> coms[kDiscretizationNum * kDiscretizationNum])
106 const float kMinX = polygon.
GetMinX();
107 const float kMaxX = polygon.
GetMaxX();
108 const float kMinY = polygon.
GetMinY();
109 const float kMaxY = polygon.
GetMaxY();
111 const float kWidth = kMaxX - kMinX;
112 const float kHeight = kMaxY - kMinY;
118 const float kDeltaWidth = kWidth /
static_cast<float>(kDiscretizationNum);
119 const float kDeltaHeight = kHeight /
static_cast<float>(kDiscretizationNum);
122 for (
int x = 0; x < kDiscretizationNum; ++x) {
123 for (
int y = 0; y < kDiscretizationNum; ++y) {
124 coms[x * kDiscretizationNum + y].first =
true;
125 coms[x * kDiscretizationNum + y].second.x = kMinX + kDeltaWidth * x;
126 coms[x * kDiscretizationNum + y].second.y = kMinY + kDeltaHeight * y;
133bool ComSelector::IsInMargin(
const Polygon2& polygon,
134 const std::vector<Vector2>& edge_vec,
135 const Vector2& candidate_point)
const {
136 for (
int i = 0; i < polygon.GetVertexNum(); ++i) {
137 Vector2 v_map = candidate_point - polygon.GetVertex(i);
139 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 となる...
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
このベクトルを正規化したベクトルを返す.