Guten Abend!
Heute habe ich meinem Robotor Odometrie im Rahmen meiner Möglichkeiten gegönnt. D.h. auf den Achsen der Räder sitzen Schlitzscheiben mit Gabellichtschranken, die pro Umdrehung 49 Ticks liefern.
[ul]
[li]Der Odometrietest läuft problemlos.[/li]
[li]Die Pausen (Mower muss wenden, weil Bumper an Hindernis) bei Richtungsänderungen gibt es nicht mehr.[/li]
[li]Problematisch ist, dass es jetzt (wenn überhaupt) keine schnelle Reaktion mehr auf Bumpersignale mehr gibt. Die Räder drehen sich lange weiter, reissen Furchen, fast Gräben in meinen zarten Rasen.[/li]
[li]Es gibt ab und an Odometriefehler, wenn das passiert, tut der Mower das was er zuletzt getan hat (er dreht sich, oder fährt ohne Rücksicht auf Verluste und Sensoren piepsend weiter). Dann sind Kommandos über Bluetooth genauso wirkunkslos wie der Taster - es hilft nur noch Strom aus.[/li]
[/ul]
Ich habe folgende Fragen:
Gibt es Tipps, wie man den totalen Kontrollverlust im Fehlerfall vermeiden kann?
Wie muss ich die Motoren parametrieren, dass trotz Odometrie zeitnah auf Sensoren reagiert wird?
Vielen Dank im Voraus
Marcello
Heute habe ich meinem Robotor Odometrie im Rahmen meiner Möglichkeiten gegönnt. D.h. auf den Achsen der Räder sitzen Schlitzscheiben mit Gabellichtschranken, die pro Umdrehung 49 Ticks liefern.
[ul]
[li]Der Odometrietest läuft problemlos.[/li]
[li]Die Pausen (Mower muss wenden, weil Bumper an Hindernis) bei Richtungsänderungen gibt es nicht mehr.[/li]
[li]Problematisch ist, dass es jetzt (wenn überhaupt) keine schnelle Reaktion mehr auf Bumpersignale mehr gibt. Die Räder drehen sich lange weiter, reissen Furchen, fast Gräben in meinen zarten Rasen.[/li]
[li]Es gibt ab und an Odometriefehler, wenn das passiert, tut der Mower das was er zuletzt getan hat (er dreht sich, oder fährt ohne Rücksicht auf Verluste und Sensoren piepsend weiter). Dann sind Kommandos über Bluetooth genauso wirkunkslos wie der Taster - es hilft nur noch Strom aus.[/li]
[/ul]
Ich habe folgende Fragen:
Gibt es Tipps, wie man den totalen Kontrollverlust im Fehlerfall vermeiden kann?
Wie muss ich die Motoren parametrieren, dass trotz Odometrie zeitnah auf Sensoren reagiert wird?
Code:
Mower::Mower(){
name = "Robbie";
// ------- wheel motors -----------------------------
motorAccel = 1000; // motor wheel acceleration - only functional when odometry is not in use (warning: do not set too low)
motorSpeedMaxRpm = 20; // motor wheel max RPM (WARNING: do not set too high, so there's still speed control when battery is low!)
motorSpeedMaxPwm = 255; // motor wheel max Pwm (8-bit PWM=255, 10-bit PWM=1023)
motorPowerMax = 100; // motor wheel max power (Watt)
motorSenseRightScale = 15.3; // motor right sense scale (mA=(ADC-zero)/scale)
motorSenseLeftScale = 15.3; // motor left sense scale (mA=(ADC-zero)/scale)
motorPowerIgnoreTime = 1000; // time to ignore motor power (ms)
motorZeroSettleTime = 3000 ; // how long (ms) to wait for motors to settle at zero speed
motorRollTimeMax = 5000; // max. roll time (ms)
motorRollTimeMin = 3000; //min. roll time (ms) should be smaller than motorRollTimeMax
motorReverseTime = 2000; // max. reverse time (ms)
motorForwTimeMax = 80000; // max. forward time (ms) / timeout
motorBiDirSpeedRatio1 = 0.3; // bidir mow pattern speed ratio 1
motorBiDirSpeedRatio2 = 0.92; // bidir mow pattern speed ratio 2
// ---- normal control ---
motorLeftPID.Kp = 1.5; // motor wheel PID controller
motorLeftPID.Ki = 0.29;
motorLeftPID.Kd = 0.25;
/*// ---- fast control ---
motorLeftPID.Kp = 1.76; // motor wheel PID controller
motorLeftPID.Ki = 0.87;
motorLeftPID.Kd = 0.4;*/
motorRightSwapDir = 0; // inverse right motor direction?
motorLeftSwapDir = 0; // inverse left motor direction?
// ------ mower motor -------------------------------
motorMowAccel = 2000; // motor mower acceleration (warning: do not set too low) 2000 seems to fit best considerating start time and power consumption
motorMowSpeedMaxPwm = 255; // motor mower max PWM
motorMowPowerMax = 75.0; // motor mower max power (Watt)
motorMowModulate = 0; // motor mower cutter modulation?
motorMowRPMSet = 3300; // motor mower RPM (only for cutter modulation)
motorMowSenseScale = 15.3; // motor mower sense scale (mA=(ADC-zero)/scale)
motorMowPID.Kp = 0.005; // motor mower RPM PID controller
motorMowPID.Ki = 0.01;
motorMowPID.Kd = 0.01;
// ------ bumper -----------------------------------
bumperUse = 1; // has bumpers?
// ------ drop -----------------------------------
dropUse = 0; // has drops? Dropsensor - Absturzsensor vorhanden ?
dropcontact = 1; //contact 0-openers 1-closers Dropsensor - Kontakt 0-Öffner - 1-Schließer betätigt gegen GND
// ------ rain ------------------------------------
rainUse = 0; // use rain sensor?
// ------ sonar ------------------------------------
sonarUse = 1; // use ultra sonic sensor? (WARNING: robot will slow down, if enabled but not connected!)
sonarLeftUse = 1;
sonarRightUse = 1;
sonarCenterUse = 1;
sonarTriggerBelow = 30; // ultrasonic sensor trigger distance
// ------ perimeter ---------------------------------
perimeterUse = 0; // use perimeter?
perimeterTriggerTimeout = 0; // perimeter trigger timeout when escaping from inside (ms)
perimeterOutRollTimeMax = 2000; // roll time max after perimeter out (ms)
perimeterOutRollTimeMin = 750; // roll time min after perimeter out (ms)
perimeterOutRevTime = 2200; // reverse time after perimeter out (ms)
perimeterTrackRollTime = 1500; //roll time during perimeter tracking
perimeterTrackRevTime = 2200; // reverse time during perimeter tracking
perimeterPID.Kp = 51.0; // perimeter PID controller
perimeterPID.Ki = 12.5;
perimeterPID.Kd = 0.8;
trackingPerimeterTransitionTimeOut = 2000;
trackingErrorTimeOut = 10000;
trackingBlockInnerWheelWhilePerimeterStruggling = 1;
// ------ lawn sensor --------------------------------
lawnSensorUse = 0; // use capacitive Sensor
// ------ IMU (compass/accel/gyro) ----------------------
imuUse = 0; // use IMU?
imuCorrectDir = 0; // correct direction by compass?
imuDirPID.Kp = 5.0; // direction PID controller
imuDirPID.Ki = 1.0;
imuDirPID.Kd = 1.0;
imuRollPID.Kp = 0.8; // roll PID controller
imuRollPID.Ki = 21;
imuRollPID.Kd = 0;
// ------ model R/C ------------------------------------
remoteUse = 1; // use model remote control (R/C)?
// ------ battery -------------------------------------
batMonitor = 1; // monitor battery and charge voltage?
batGoHomeIfBelow = 11.4; // drive home voltage (Volt)
batSwitchOffIfBelow = 10.1; // switch off battery if below voltage (Volt)
batSwitchOffIfIdle = 1; // switch off battery if idle (minutes)
batFactor = 0.495; // battery conversion factor / 10 due to arduremote bug, can be removed after fixing (look in robot.cpp)
batChgFactor = 0.495; // battery conversion factor / 10 due to arduremote bug, can be removed after fixing (look in robot.cpp)
batFull =14.4; // battery reference Voltage (fully charged) PLEASE ADJUST IF USING A DIFFERENT BATTERY VOLTAGE! FOR a 12V SYSTEM TO 14.4V
batChargingCurrentMax =1.6; // maximum current your charger can devliver
batFullCurrent = 0.3; // current flowing when battery is fully charged
startChargingIfBelow = 11.5; // start charging if battery Voltage is below
chargingTimeout = 12600000; // safety timer for charging (ms) 12600000 = 3.5hrs
// Sensorausgabe Konsole (chgSelection =0)
// Einstellungen ACS712 5A (chgSelection =1 / chgSenseZero ~ 511 / chgFactor = 39 / chgSense =185.0 / chgChange = 0 oder 1 (je nach Stromrichtung) / chgNull = 2)
// Einstellungen INA169 board (chgSelection =2)
chgSelection = 2;
chgSenseZero = 511; // charge current sense zero point
chgFactor = 39; // charge current conversion factor - Empfindlichkeit nimmt mit ca. 39/V Vcc ab
chgSense = 185.0; // mV/A empfindlichkeit des Ladestromsensors in mV/A (Für ACS712 5A = 185)
chgChange = 0; // Messwertumkehr von - nach + 1 oder 0
chgNull = 2; // Nullduchgang abziehen (1 oder 2)
// ------ charging station ---------------------------
stationRevTime = 1800; // charge station reverse time (ms)
stationRollTime = 1000; // charge station roll time (ms)
stationForwTime = 1500; // charge station forward time (ms)
stationCheckTime = 1700; // charge station reverse check time (ms)
// ------ odometry ------------------------------------
odometryUse = 1; // use odometry?
twoWayOdometrySensorUse = 0; // use optional two-wire odometry sensor?
odometryTicksPerRevolution = 49; // encoder ticks per one full resolution
odometryTicksPerCm = 0.65; // encoder ticks per cm
odometryWheelBaseCm = 24; // wheel-to-wheel distance (cm)
odometryRightSwapDir = 0; // inverse right encoder direction?
odometryLeftSwapDir = 0; // inverse left encoder direction?
// ----- GPS -------------------------------------------
gpsUse = 0; // use GPS?
stuckIfGpsSpeedBelow = 0.2; // if Gps speed is below given value the mower is stuck
gpsSpeedIgnoreTime = 5000; // how long gpsSpeed is ignored when robot switches into a new STATE (in ms)
// ----- other -----------------------------------------
buttonUse = 1; // has digital ON/OFF button?
// ----- user-defined switch ---------------------------
userSwitch1 = 0; // user-defined switch 1 (default value)
userSwitch2 = 0; // user-defined switch 2 (default value)
userSwitch3 = 0; // user-defined switch 3 (default value)
// ----- timer -----------------------------------------
timerUse = 0; // use RTC and timer?
// ----- bluetooth -------------------------------------
bluetoothUse = 1; // use Bluetooth module?
// ----- esp8266 ---------------------------------------
esp8266Use = 0; // use ESP8266 Wifi module?
esp8266ConfigString = "123test321";
// ------ mower stats-------------------------------------------
statsOverride = false; // if set to true mower stats are overwritten - be careful
statsMowTimeMinutesTotal = 300;
statsBatteryChargingCounterTotal = 11;
statsBatteryChargingCapacityTotal = 30000;
// -----------configuration end-------------------------------------
}
Vielen Dank im Voraus
Marcello