♣️ Simplifices angle updating

This commit is contained in:
Rune Harlyk
2024-05-26 15:14:35 +02:00
committed by Rune Harlyk
parent 7482752698
commit ccf6f01e4d
2 changed files with 20 additions and 35 deletions
+3 -3
View File
@@ -53,7 +53,7 @@ static esp_err_t inverse(float a[4][4], float b[4][4])
typedef struct {
float omega, phi, psi, xm, ym, zm;
} position_t;
} body_state_t;
#define RAD2DEGREES 57.295779513082321 // 180 / PI
@@ -93,7 +93,7 @@ public:
}
~Kinematics(){}
esp_err_t calculate_inverse_kinematics(float lp[4][4], position_t p, float result[12]) {
esp_err_t calculate_inverse_kinematics(float lp[4][4], body_state_t p, float result[12]) {
esp_err_t ret = ESP_OK;
ret = bodyIK(p);
@@ -119,7 +119,7 @@ public:
return ret;
}
esp_err_t bodyIK(position_t p) {
esp_err_t bodyIK(body_state_t p) {
float cos_omega = cos(p.omega*DEGREES2RAD);
float sin_omega = sin(p.omega*DEGREES2RAD);
float cos_phi = cos(p.phi*DEGREES2RAD);
+17 -32
View File
@@ -114,53 +114,38 @@ class MotionService
}
bool updateMotion() {
bool updated = false;
float new_angles[12] = {0,};
switch (motionState) {
case MOTION_STATE::IDLE:
break;
case MOTION_STATE::REST:
for (int i = 0; i < 12; i++) {
float new_angle = lerp(angles[i], rest_angles[i], 0.5);
if (new_angle != angles[i]) {
angles[i] = new_angle;
updated = true;
}
}
update_angles(rest_angles, new_angles, false);
break;
case MOTION_STATE::STAND: {
float new_angles[12] = {0,};
kinematics.calculate_inverse_kinematics(lp, position, new_angles);
for (int i = 0; i < 12; i++) {
float new_angle = lerp(angles[i], new_angles[i] * dir[i], 0.3);
if (new_angle != angles[i]) {
angles[i] = new_angle;
updated = true;
}
}
if (updated) {
ESP_LOGI("MotionService", "New angles: %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f %.1f", angles[0], angles[1], angles[2], angles[3], angles[4], angles[5], angles[6], angles[7], angles[8], angles[9], angles[10], angles[11]);
}
break;
}
case MOTION_STATE::WALK:
float new_angles[12] = {0,};
lp[0][1] += walk_dir;
if (lp[0][1] >= 200) walk_dir = -1;
if (lp[0][1] <= 100) walk_dir = 1;
if (lp[0][1] >= 50) walk_dir = -1;
if (lp[0][1] <= -100) walk_dir = 1;
kinematics.calculate_inverse_kinematics(lp, position, new_angles);
for (int i = 0; i < 12; i++) {
float new_angle = lerp(angles[i], new_angles[i] * dir[i], 0.3);
if (new_angle != angles[i]) {
angles[i] = new_angle;
updated = true;
}
}
break;
}
return update_angles(new_angles, angles);
}
bool update_angles(float new_angles[12], float angles[12], bool useLerp = true) {
bool updated = false;
for (int i = 0; i < 12; i++) {
float new_angle = useLerp ? lerp(angles[i], new_angles[i] * dir[i], 0.3) : new_angles[i] * dir[i];
if (new_angle != angles[i]) {
angles[i] = new_angle;
updated = true;
}
}
return updated;
}
@@ -180,7 +165,7 @@ class MotionService
constexpr static int MotionInterval = 100;
position_t position = {0, 0, 0, 0, 0, 0};
body_state_t position = {0, 0, 0, 0, 0, 0};
float dir[12] = {-1, -1, -1, 1, -1, -1, -1, -1, -1, 1, -1, -1};
float lp[4][4] = {
{ 100, -100, 100, 1},