Hallo Zusammen,
da ich, wie schon von anderen auch berichtet, Probleme bei der Ansteuerung der Antriebsmotoren hatte, habe ich mir mal die Prozedur motorControlImuDir() angesehen. Dabei ist mir aufgefallen, daß es zurzeit keine Drehzahlregelung (nach RPM) gibt.
Ausserdem wird in setMotorSpeed() die Solldrehzahl (in RPM) als PWM übergeben.
Das hatte bei mir zur Folge, daß nach 3 Sekunden der Robi stehen geblieben ist, weil die zu geringe Soll-PWM nicht ausgereicht hat.
Nun habe ich den Code mal testweise etwas abgeändert (siehe unten). So würde die kompassgeregelte Richtungssteuerung inclusive Drehzahlregelung funktionieren. Die Vorlage zur Drehzahlregelung habe ich der Prozedur motorControl() entnommen und den Parameter imuDirPID.y integriert.
Bei mir funktioniert das super. Quasi Tempomat und Richtungsregelung.
Vielleicht kann das ja mal jemand testen und Feedback geben!
EDIT: Sollte die Geschwindigkeitsregelung zu stark pendeln, dann ist der Proportionalfaktor "double P = 3.0;" zu veringern.
Viele Grüße
Aiko
da ich, wie schon von anderen auch berichtet, Probleme bei der Ansteuerung der Antriebsmotoren hatte, habe ich mir mal die Prozedur motorControlImuDir() angesehen. Dabei ist mir aufgefallen, daß es zurzeit keine Drehzahlregelung (nach RPM) gibt.
Ausserdem wird in setMotorSpeed() die Solldrehzahl (in RPM) als PWM übergeben.
Das hatte bei mir zur Folge, daß nach 3 Sekunden der Robi stehen geblieben ist, weil die zu geringe Soll-PWM nicht ausgereicht hat.
Nun habe ich den Code mal testweise etwas abgeändert (siehe unten). So würde die kompassgeregelte Richtungssteuerung inclusive Drehzahlregelung funktionieren. Die Vorlage zur Drehzahlregelung habe ich der Prozedur motorControl() entnommen und den Parameter imuDirPID.y integriert.
Bei mir funktioniert das super. Quasi Tempomat und Richtungsregelung.
Vielleicht kann das ja mal jemand testen und Feedback geben!
EDIT: Sollte die Geschwindigkeitsregelung zu stark pendeln, dann ist der Proportionalfaktor "double P = 3.0;" zu veringern.
Viele Grüße
Aiko
Code:
// PID controller: correct direction during normal driving (requires IMU)
void Robot::motorControlImuDir(){
int motorLeftSetpoint = motorLeftSpeed;
int motorRightSetpoint = motorRightSpeed;
int correctLeft = 0;
int correctRight = 0;
double P = 3.0;
imuDirPID.x = distancePI(imu.ypr.yaw, imuDriveHeading) / PI * 180.0;
imuDirPID.w = 0;
imuDirPID.y_min = -motorSpeedMax;
imuDirPID.y_max = motorSpeedMax;
imuDirPID.max_output = motorSpeedMax;
imuDirPID.compute();
if (imuDirPID.y < 0) correctRight = imuDirPID.y;
if (imuDirPID.y > 0) correctLeft = imuDirPID.y;
double motorLeftSpeedE = (motorLeftSetpoint - correctLeft) - motorLeftRpm;
double motorRightSpeedE = (motorRightSetpoint + correctRight) - motorRightRpm;
int leftSpeed = max(-motorSpeedMaxPwm, min(motorSpeedMaxPwm, motorLeftPWM + motorLeftSpeedE*P));
int rightSpeed = max(-motorSpeedMaxPwm, min(motorSpeedMaxPwm,motorRightPWM + motorRightSpeedE*P));
setMotorSpeed( leftSpeed, rightSpeed, true );
}