improved moveControl
This commit is contained in:
+11
-57
@@ -10,7 +10,6 @@
|
|||||||
#include <DabbleESP32.h>
|
#include <DabbleESP32.h>
|
||||||
|
|
||||||
void gamepadInput();
|
void gamepadInput();
|
||||||
int8_t modSpeed(int8_t dir, int8_t speed);
|
|
||||||
|
|
||||||
MotorControl left_motor;
|
MotorControl left_motor;
|
||||||
MotorControl right_motor;
|
MotorControl right_motor;
|
||||||
@@ -34,88 +33,43 @@ void setup() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
if (millis() - last_millis > 700) {
|
if (millis() - last_millis > 400) {
|
||||||
gamepadInput();
|
gamepadInput();
|
||||||
// left_motor.toString();
|
// left_motor.toString();
|
||||||
|
// Serial.printf("speed: %f, ", speedometer_right.getSpeed());
|
||||||
// right_motor.toString();
|
// right_motor.toString();
|
||||||
// Serial.printf("Speed L: %f, Speed R: %f \n", speedometer_left.getSpeed(), speedometer_right.getSpeed());
|
// Serial.printf("Speed L: %f, Speed R: %f \n", speedometer_left.getSpeed(), speedometer_right.getSpeed());
|
||||||
|
|
||||||
last_millis = millis();
|
last_millis = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
left_motor.runMotorControl();
|
// left_motor.runMotorControl();
|
||||||
right_motor.runMotorControl();
|
right_motor.runMotorControl();
|
||||||
speedometer_left.runSpeedometer();
|
// speedometer_left.runSpeedometer();
|
||||||
speedometer_right.runSpeedometer();
|
speedometer_right.runSpeedometer();
|
||||||
moveController.runMoveControl();
|
// moveController.runMoveControl();
|
||||||
}
|
}
|
||||||
|
|
||||||
void gamepadInput() {
|
void gamepadInput() {
|
||||||
Dabble.processInput(); //this function is used to refresh data obtained from smartphone.Hence calling this function is mandatory in order to get data properly from your mobile.
|
Dabble.processInput(); //this function is used to refresh data obtained from smartphone.Hence calling this function is mandatory in order to get data properly from your mobile.
|
||||||
//Serial.print("KeyPressed: ");
|
//Serial.print("KeyPressed: ");
|
||||||
|
|
||||||
static int8_t speed_left = 0;
|
|
||||||
if (GamePad.isUpPressed()) {
|
if (GamePad.isUpPressed()) {
|
||||||
speed_left = modSpeed(1, speed_left);
|
moveController.setSpeed(1.3);
|
||||||
} else if (GamePad.isDownPressed()) {
|
} else if (GamePad.isDownPressed()) {
|
||||||
speed_left = modSpeed(-1, speed_left);
|
moveController.setSpeed(0);
|
||||||
} else {
|
} else {
|
||||||
speed_left = modSpeed(0, speed_left);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int8_t speed_right = 0;
|
|
||||||
if (GamePad.isTrianglePressed()) {
|
if (GamePad.isTrianglePressed()) {
|
||||||
speed_right = modSpeed(1, speed_right);
|
right_motor.setTargetSpeed(20);
|
||||||
} else if (GamePad.isCrossPressed()) {
|
} else if (GamePad.isCrossPressed()) {
|
||||||
speed_right = modSpeed(-1, speed_right);
|
right_motor.setTargetSpeed(30);
|
||||||
} else {
|
} else if (GamePad.isCirclePressed()){
|
||||||
speed_right = modSpeed(0, speed_right);
|
right_motor.setTargetSpeed(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
left_motor.setTargetSpeed(speed_left);
|
|
||||||
right_motor.setTargetSpeed(speed_right);
|
|
||||||
|
|
||||||
// int a = GamePad.getAngle();
|
// int a = GamePad.getAngle();
|
||||||
// int b = GamePad.getRadius();
|
// int b = GamePad.getRadius();
|
||||||
// Serial.printf("Winkel: %d, Radius: %d \n", a, b);
|
// Serial.printf("Winkel: %d, Radius: %d \n", a, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t modSpeed(int8_t dir, int8_t speed) {
|
|
||||||
int8_t new_speed = 0;
|
|
||||||
if (dir == 1) {
|
|
||||||
if (speed > 0) {
|
|
||||||
new_speed = speed + 5;
|
|
||||||
} else if (speed == 0) {
|
|
||||||
new_speed = 5;
|
|
||||||
} else {
|
|
||||||
new_speed = speed + 5;
|
|
||||||
}
|
|
||||||
} else if (dir == 0) {
|
|
||||||
if (speed > 0) {
|
|
||||||
new_speed = speed - 5;
|
|
||||||
} else if (speed == 0) {
|
|
||||||
new_speed = 0;
|
|
||||||
} else {
|
|
||||||
new_speed = speed + 5;
|
|
||||||
}
|
|
||||||
} else if (dir == -1) {
|
|
||||||
if (speed > 0) {
|
|
||||||
new_speed = speed - 5;
|
|
||||||
} else if (speed == 0) {
|
|
||||||
new_speed = -5;
|
|
||||||
} else {
|
|
||||||
new_speed = speed - 5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_speed < -100) {
|
|
||||||
new_speed = -100;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (new_speed > 100) {
|
|
||||||
new_speed = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new_speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
+18
-3
@@ -78,7 +78,7 @@ void MotorControl::runMotorControl() {
|
|||||||
|
|
||||||
void MotorControl::setTargetSpeed(int16_t speed) {
|
void MotorControl::setTargetSpeed(int16_t speed) {
|
||||||
//TODO: Exceptionhandling
|
//TODO: Exceptionhandling
|
||||||
if (speed <= 100 || speed <= -100) {
|
if (speed <= 100 && speed >= -100) {
|
||||||
this->target_speed = speed;
|
this->target_speed = speed;
|
||||||
} else {
|
} else {
|
||||||
Serial.println("Invalid Argument in MotorControl::setTargetSpeed");
|
Serial.println("Invalid Argument in MotorControl::setTargetSpeed");
|
||||||
@@ -101,10 +101,25 @@ int16_t MotorControl::getSpeed() {
|
|||||||
return this->speed;
|
return this->speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int16_t MotorControl::getTargetSpeed() {
|
||||||
|
return this->target_speed;
|
||||||
|
}
|
||||||
|
|
||||||
bool MotorControl::isTargetSpeedReached() {
|
bool MotorControl::isTargetSpeedReached() {
|
||||||
if (this->target_speed == this->speed) {
|
if (this->target_speed == this->speed)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MotorControl::isAccelerationPositive() {
|
||||||
|
if (speed < target_speed)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MotorControl::isAccelerationNegative() {
|
||||||
|
if (speed > target_speed)
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,10 @@ class MotorControl {
|
|||||||
void toString();
|
void toString();
|
||||||
|
|
||||||
int16_t getSpeed();
|
int16_t getSpeed();
|
||||||
|
int16_t getTargetSpeed();
|
||||||
bool isTargetSpeedReached();
|
bool isTargetSpeedReached();
|
||||||
|
bool isAccelerationPositive();
|
||||||
|
bool isAccelerationNegative();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setSpeed(int16_t speed);
|
void setSpeed(int16_t speed);
|
||||||
|
|||||||
+61
-2
@@ -15,13 +15,72 @@ void MoveControl::init(MotorControl *left_motor, MotorControl *right_motor,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MoveControl::runMoveControl() {
|
void MoveControl::runMoveControl() {
|
||||||
|
static uint64_t last_millis = 0;
|
||||||
|
if (millis() - last_millis < RUN_MOVE_CONTROL_DELAY) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
last_millis = millis();
|
||||||
|
|
||||||
|
this->calcWheelSpeed();
|
||||||
|
//this->regulateMotorPower(this->left_motor, this->left_speedometer, this->wheelspeed_left_target);
|
||||||
|
this->regulateMotorPower(this->right_motor, this->right_speedometer, this->wheelspeed_right_target);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveControl::setSpeed(int8_t speed) {
|
void MoveControl::setSpeed(double speed) {
|
||||||
this->speed = speed;
|
this->x_speed = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveControl::setRotationspeed(double speed) {
|
void MoveControl::setRotationspeed(double speed) {
|
||||||
this->rotation_speed = speed;
|
this->rotation_speed = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MoveControl::calcWheelSpeed() {
|
||||||
|
// original formula:
|
||||||
|
// (1 / r) / 1 b \ / x \ = / Xl \
|
||||||
|
// \ 1 -b / \ T / \ Xr /
|
||||||
|
|
||||||
|
// (1 / r) * 1
|
||||||
|
const static double A = 15.82278481;
|
||||||
|
// (1 / r) * b
|
||||||
|
const static double B = 2.096518987;
|
||||||
|
|
||||||
|
this->wheelspeed_right_target = (A * this->x_speed + B * this->rotation_speed) * (WHEEL_DIAMETER / 2);
|
||||||
|
this->wheelspeed_left_target = (A * this->x_speed + (-B) * this->rotation_speed) * (WHEEL_DIAMETER / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MoveControl::regulateMotorPower(MotorControl *motor, Speedometer *cur_speed, double tar_speed) {
|
||||||
|
if (tar_speed > 0) {
|
||||||
|
// Direction FORWARD
|
||||||
|
if (cur_speed->getSpeed() - tar_speed < 0) {
|
||||||
|
// Too fast
|
||||||
|
if (motor->isAccelerationPositive() || motor->isTargetSpeedReached()) {
|
||||||
|
motor->setTargetSpeed(motor->getTargetSpeed() - SPEED_STEPS);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Too slow
|
||||||
|
if (motor->isAccelerationNegative() || motor->isTargetSpeedReached()) {
|
||||||
|
motor->setTargetSpeed(motor->getTargetSpeed() + SPEED_STEPS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (tar_speed < 0) {
|
||||||
|
// Direction BACKWARD
|
||||||
|
if (cur_speed->getSpeed() - tar_speed > 0) {
|
||||||
|
// Too fast
|
||||||
|
if (motor->isAccelerationPositive() || motor->isTargetSpeedReached()) {
|
||||||
|
motor->setTargetSpeed(motor->getTargetSpeed() - SPEED_STEPS);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Too slow
|
||||||
|
if (motor->isAccelerationNegative() || motor->isTargetSpeedReached()) {
|
||||||
|
motor->setTargetSpeed(motor->getTargetSpeed() + SPEED_STEPS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Direction STOP
|
||||||
|
motor->setTargetSpeed(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+9
-2
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "motorControl.h"
|
#include "motorControl.h"
|
||||||
#include "speedometer.h"
|
#include "speedometer.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
class MoveControl {
|
class MoveControl {
|
||||||
public:
|
public:
|
||||||
@@ -12,17 +13,23 @@ class MoveControl {
|
|||||||
void init(MotorControl *left_motor, MotorControl *right_motor,
|
void init(MotorControl *left_motor, MotorControl *right_motor,
|
||||||
Speedometer *left_encoder, Speedometer *right_encoder);
|
Speedometer *left_encoder, Speedometer *right_encoder);
|
||||||
void runMoveControl();
|
void runMoveControl();
|
||||||
void setSpeed(int8_t speed);
|
void setSpeed(double speed);
|
||||||
void setRotationspeed(double speed);
|
void setRotationspeed(double speed);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void calcWheelSpeed();
|
||||||
|
static void regulateMotorPower(MotorControl *motor, Speedometer *cur_speed, double tar_speed);
|
||||||
|
|
||||||
MotorControl *left_motor;
|
MotorControl *left_motor;
|
||||||
MotorControl *right_motor;
|
MotorControl *right_motor;
|
||||||
Speedometer *left_speedometer;
|
Speedometer *left_speedometer;
|
||||||
Speedometer *right_speedometer;
|
Speedometer *right_speedometer;
|
||||||
|
|
||||||
int8_t speed = 0;
|
double x_speed = 0;
|
||||||
double rotation_speed = 0;
|
double rotation_speed = 0;
|
||||||
|
|
||||||
|
double wheelspeed_left_target = 0;
|
||||||
|
double wheelspeed_right_target = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MOVE_CONTROL_H
|
#endif // MOVE_CONTROL_H
|
||||||
+27
-4
@@ -1,7 +1,9 @@
|
|||||||
#include "speedometer.h"
|
#include "speedometer.h"
|
||||||
|
|
||||||
Speedometer::Speedometer() {
|
Speedometer::Speedometer() {
|
||||||
|
for (int i = 0; i < BUF_SIZE; i++) {
|
||||||
|
this->buf[i] = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Speedometer::init(uint8_t pinA, uint8_t pinB) {
|
void Speedometer::init(uint8_t pinA, uint8_t pinB) {
|
||||||
@@ -21,7 +23,8 @@ void Speedometer::runSpeedometer() {
|
|||||||
uint16_t elapsed_time = time - this->last_millis;
|
uint16_t elapsed_time = time - this->last_millis;
|
||||||
this->last_millis = time;
|
this->last_millis = time;
|
||||||
|
|
||||||
int64_t count = encoder.getCount();
|
int16_t count = encoder.getCount();
|
||||||
|
this->addValToBuf(count);
|
||||||
encoder.clearCount();
|
encoder.clearCount();
|
||||||
|
|
||||||
uint8_t direction = STOP;
|
uint8_t direction = STOP;
|
||||||
@@ -31,7 +34,7 @@ void Speedometer::runSpeedometer() {
|
|||||||
direction = BACKWARD;
|
direction = BACKWARD;
|
||||||
}
|
}
|
||||||
|
|
||||||
count = abs(count); // Absolute time in milliseconds
|
count = abs(this->getAverage()); // Absolute time in milliseconds
|
||||||
double n = (double)count / ENC_STEPS; // Wheel revolutions in absolute time
|
double n = (double)count / ENC_STEPS; // Wheel revolutions in absolute time
|
||||||
double u = (double)n / ((double)elapsed_time / 1000); // Wheel revolutions per second
|
double u = (double)n / ((double)elapsed_time / 1000); // Wheel revolutions per second
|
||||||
double ms = u * (WHEEL_DIAMETER * PI); // Speed in m/s
|
double ms = u * (WHEEL_DIAMETER * PI); // Speed in m/s
|
||||||
@@ -44,7 +47,9 @@ void Speedometer::runSpeedometer() {
|
|||||||
this->speed = 0;
|
this->speed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Serial.printf("time: %d, count: %d, n: %f, u: %f, ms: %f \n", time, count, n, u, ms);
|
Serial.printf("time: %d, ", time);
|
||||||
|
Serial.printf("count: %d, ",count);
|
||||||
|
Serial.printf("n: %f, u: %f, ms: %f \n", n, u, ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
double Speedometer::getSpeed() {
|
double Speedometer::getSpeed() {
|
||||||
@@ -60,3 +65,21 @@ uint8_t Speedometer::getDirection() {
|
|||||||
return STOP;
|
return STOP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Speedometer::addValToBuf(int16_t val) {
|
||||||
|
this->buf[this->bufPos] = val;
|
||||||
|
this->bufPos++;
|
||||||
|
|
||||||
|
if (this->bufPos == BUF_SIZE) {
|
||||||
|
this->bufPos = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t Speedometer::getAverage() {
|
||||||
|
int16_t sum = 0;
|
||||||
|
for (int i = 0; i < BUF_SIZE; i++) {
|
||||||
|
sum += this->buf[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return sum / BUF_SIZE;
|
||||||
|
}
|
||||||
@@ -17,10 +17,16 @@ class Speedometer {
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void addValToBuf(int16_t val);
|
||||||
|
int16_t getAverage();
|
||||||
|
|
||||||
ESP32Encoder encoder;
|
ESP32Encoder encoder;
|
||||||
|
|
||||||
double speed = 0;
|
double speed = 0;
|
||||||
uint32_t last_millis = 0;
|
uint32_t last_millis = 0;
|
||||||
|
|
||||||
|
uint8_t bufPos = 0;
|
||||||
|
int16_t buf[BUF_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SPEEDOMETER_H
|
#endif // SPEEDOMETER_H
|
||||||
Reference in New Issue
Block a user