🫚 Makes combinatorial a constant expression
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
#include <Kinematics.h>
|
#include <Kinematics.h>
|
||||||
|
#include <MathUtils.h>
|
||||||
|
|
||||||
struct gait_state_t {
|
struct gait_state_t {
|
||||||
float step_height;
|
float step_height;
|
||||||
@@ -209,8 +210,23 @@ class BezierState : public GaitState {
|
|||||||
private:
|
private:
|
||||||
float phase_time = 0.0f;
|
float phase_time = 0.0f;
|
||||||
uint8_t phase = 0;
|
uint8_t phase = 0;
|
||||||
uint8_t contact_phases[4][2] = {{1, 0}, {0, 1}, {0, 1}, {1, 0}};
|
static constexpr uint8_t contact_phases[4][2] = {{1, 0}, {0, 1}, {0, 1}, {1, 0}};
|
||||||
|
static constexpr uint8_t BEZIER_POINTS = 12;
|
||||||
float step_length = 0.0f;
|
float step_length = 0.0f;
|
||||||
|
static constexpr std::array<float, BEZIER_POINTS> COMBINATORIAL_VALUES = {
|
||||||
|
combinatorial_constexpr(11, 0), // 1
|
||||||
|
combinatorial_constexpr(11, 1), // 11
|
||||||
|
combinatorial_constexpr(11, 2), // 55
|
||||||
|
combinatorial_constexpr(11, 3), // 165
|
||||||
|
combinatorial_constexpr(11, 4), // 330
|
||||||
|
combinatorial_constexpr(11, 5), // 462
|
||||||
|
combinatorial_constexpr(11, 6), // 462
|
||||||
|
combinatorial_constexpr(11, 7), // 330
|
||||||
|
combinatorial_constexpr(11, 8), // 165
|
||||||
|
combinatorial_constexpr(11, 9), // 55
|
||||||
|
combinatorial_constexpr(11, 10), // 11
|
||||||
|
combinatorial_constexpr(11, 11) // 1
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const char *name() const override { return "Bezier"; }
|
const char *name() const override { return "Bezier"; }
|
||||||
@@ -300,7 +316,7 @@ class BezierState : public GaitState {
|
|||||||
0.9f * *height, 1.1f * *height, 1.1f * *height, 1.1f * *height, 0.0f, 0.0f};
|
0.9f * *height, 1.1f * *height, 1.1f * *height, 1.1f * *height, 0.0f, 0.0f};
|
||||||
|
|
||||||
for (int i = 0; i < 12; i++) {
|
for (int i = 0; i < 12; i++) {
|
||||||
float b = combinatorial(11, i) * std::pow(phase, i) * std::pow(1.0f - phase, 11 - i);
|
float b = COMBINATORIAL_VALUES[i] * std::pow(phase, i) * std::pow(1.0f - phase, 11 - i);
|
||||||
point[0] += b * STEP[i] * X_POLAR;
|
point[0] += b * STEP[i] * X_POLAR;
|
||||||
point[1] += b * Y[i];
|
point[1] += b * Y[i];
|
||||||
point[2] += b * STEP[i] * Z_POLAR;
|
point[2] += b * STEP[i] * Z_POLAR;
|
||||||
@@ -316,15 +332,4 @@ class BezierState : public GaitState {
|
|||||||
|
|
||||||
return M_PI_2 + foot_dir + offset_mod;
|
return M_PI_2 + foot_dir + offset_mod;
|
||||||
}
|
}
|
||||||
|
|
||||||
static float combinatorial(const int n, int k) {
|
|
||||||
if (k < 0 || k > n) return 0.0f;
|
|
||||||
if (k == 0 || k == n) return 1.0f;
|
|
||||||
k = std::min(k, n - k);
|
|
||||||
float c = 1.0f;
|
|
||||||
for (int i = 0; i < k; i++) {
|
|
||||||
c = (c * (n - i)) / (i + 1);
|
|
||||||
}
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
@@ -69,4 +69,16 @@ inline bool arrayEqual(const float arr1[4][4], const float arr2[4][4], float eps
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr float combinatorial_constexpr(const int n, int k) {
|
||||||
|
if (k < 0 || k > n) return 0.0f;
|
||||||
|
if (k == 0 || k == n) return 1.0f;
|
||||||
|
k = (k < (n - k)) ? k : (n - k);
|
||||||
|
float result = 1.0f;
|
||||||
|
for (int i = 0; i < k; ++i) {
|
||||||
|
result *= (n - i);
|
||||||
|
result /= (i + 1);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Reference in New Issue
Block a user