Working contolled motor

This commit is contained in:
Pascal Serrarens 2024-01-09 17:14:33 +01:00
parent a21485857d
commit 3cc37ebae9
5 changed files with 32 additions and 19 deletions

View File

@ -12,7 +12,7 @@ ControlledMotor::ControlledMotor(Motor *motor, Encoder *encoder)
#include <Arduino.h>
void ControlledMotor::SetTargetSpeed(float speed) {
this->targetSpeed = speed;
this->currentTargetSpeed = speed;
// this->rotationDirection =
// (targetSpeed < 0) ? Direction::Reverse : Direction::Forward;
// this->direction = (targetSpeed < 0) ? Motor::Direction::CounterClockwise
@ -21,22 +21,31 @@ void ControlledMotor::SetTargetSpeed(float speed) {
void ControlledMotor::Update(float currentTimeMs) {
actualSpeed = encoder->GetRevolutionsPerSecond(currentTimeMs);
if (this->targetSpeed < 0)
if (this->currentTargetSpeed < 0)
actualSpeed = -actualSpeed;
float deltaTime = currentTimeMs - this->lastUpdateTime;
float error = currentTargetSpeed - actualSpeed;
float errorChange = (error - lastError) * deltaTime;
float delta = error * pidP + errorChange * pidD;
// Serial.print("direction ");
// Serial.print(this->direction);
// Serial.print(" actualSpeed ");
// Serial.println(actualSpeed);
Serial.print(" actualSpeed ");
Serial.print(actualSpeed);
// Serial.print(" target ");
// Serial.println(this->targetSpeed);
// Serial.println(this->currentTargetSpeed);
Serial.print(" motor target speed ");
Serial.print(motor->currentTargetSpeed);
Serial.print(" + ");
Serial.print(error * pidP);
Serial.print(" + ");
Serial.println(errorChange * pidD);
float error = targetSpeed - velocity;
float timeStep = currentTimeMs - lastUpdateTime;
float acceleration = error * timeStep * pidP; // Just P is used at this moment
motor->SetTargetSpeed(
this->targetSpeed); // + acceleration); // or something like that
motor->SetTargetSpeed(motor->currentTargetSpeed +
delta); // or something like that
this->lastUpdateTime = currentTimeMs;
}

View File

@ -19,8 +19,8 @@ public:
}
float velocity;
float pidP = 1;
float pidD = 0;
float pidP = 0.02F;
float pidD = 0.001F;
float pidI = 0;
void Update(float currentTimeMs) override;
@ -39,8 +39,9 @@ public:
Encoder *encoder;
protected:
float lastUpdateTime;
float targetSpeed;
float lastUpdateTime = 0;
float lastError = 0;
// float targetSpeed;
float actualSpeed;
float netDistance = 0;
float startDistance = 0;

View File

@ -23,7 +23,8 @@ DifferentialDrive::DifferentialDrive(Motor *leftMotor, Motor *rightMotor,
rightMotor->position.distance = distance;
}
void DifferentialDrive::SetTargetSpeeds(float leftSpeed, float rightSpeed) {
void DifferentialDrive::SetMotorTargetSpeeds(float leftSpeed,
float rightSpeed) {
for (unsigned int motorIx = 0; motorIx < this->motorCount; motorIx++) {
Motor *motor = motors[motorIx];
if (motor == nullptr)
@ -40,7 +41,8 @@ void DifferentialDrive::SetTargetSpeeds(float leftSpeed, float rightSpeed) {
void DifferentialDrive::SetTwistSpeed(float forward, float yaw) {
float leftSpeed = Float::Clamp(forward - yaw, -1, 1);
float rightSpeed = Float::Clamp(forward + yaw, -1, 1);
SetTargetSpeeds(leftSpeed, rightSpeed);
// The speeds should be translated to m/s to revolutions per second here
SetMotorTargetSpeeds(leftSpeed, rightSpeed);
}
void DifferentialDrive::SetTwistSpeed(Vector2 linear, float yaw) {

View File

@ -33,7 +33,7 @@ public:
/// @brief Set the target speeds of the motors directly
/// @param leftSpeed The target speed of the left Motor
/// @param rightSpeed The target speed of the right Motor
void SetTargetSpeeds(float leftSpeed, float rightSpeed);
void SetMotorTargetSpeeds(float leftSpeed, float rightSpeed);
/// @brief Controls the motors through forward and rotation speeds
/// @param forward The target forward speed of the Roboid

View File

@ -30,8 +30,9 @@ public:
virtual void Update(float currentTimeMs);
protected:
float currentTargetSpeed = 0;
protected:
};
} // namespace RoboidControl