Stuck on an "island"

rulle

New member
Hi. My name is Rulle (Roland) and I'm from Sweden.
I have purchased an Ardumower kit, Pcb 1.2 mega and 1.0a8 azurit.
In my garden I have flowerbeds, bushes and trees.
Therefore, I have put the bwf around some "islands". It creates a problem when the mower will go charging.
If it during "perifind" hits an island it will follow the bwf around the island and will not come loose.
Have I missed any settings? I use IMU and Odometry. I guess it would be easy to check the compass or the Odometry to see if it goes around.

Sorry for my bad english
Rulle
 
Hi Alexander and thank you for a quick answer.
My garden is more complex than your example.
The distance to my islands (I have 7) is several meters so I have built my islands as automower and robomower do, the wires tight together.
If I have a distance of 30 cm, the lawn will be uncut in that area and it will look ridiculous.

My solution is something like this: (hopefully)
Since the mower runs counterclockwice around the island the right Odometry counts faster.
Check Odometry at the start of "peritrack", then if right Odometry counts x pulses ( x depending of wheels base and diameter) more than the left, it's stuck on an island. Stop, turn 90 degress right and start a new perifind.

What do you think? Is this a possible solution? Maybe you have a better way to solv this.
I'm not so experienced programmer so I can do this nicely.
Best regards Rulle
Attachment: https://forum.ardumower.de/data/med...7/Ardumower_perimeter_rulle_2017-09-23-2.jpg/
 
Zuletzt bearbeitet von einem Moderator:
I did it with a fast return like Ambrogio do. Where you have to build a triangle in the perimeter wire.If the robot hits to a triangle he left the perimeter. https://youtu.be/UVDPixXWZv4 But you have to program it because by your self. My software is not working at the moment and will only work on PCB1.3 with DUE.
You can find my code in https://github.com/kwrtz/Raindancer/blob/master/code/Raindancer/bPerimeterTracking.h
Your solution could also be work if the iland circle is closely enough. But you don't know in which direction you have to leave the iland. It could be, that it hops from one iland to the other and so on.
 
Hi.
@ALexander
Not sure the tracking and imu(gy801) can compute at the same time on mega but with the gy88 and it's DMP maybe it is possible.
Maybe you have a gy88 version adjustable for Azurit and it s help me a lot (Sunray use a pc for calibration)
I use the i2cdev version but difficult to find the complementary with the compass and the calibration.
@Rulle
Another simple solution is to had a timeout on tracking.
If the mower need 3minutes to make all the tracking, put a timeout to 4 mins so if the mower did not find the station in 4 mins go to perifind again.
In the perifind had a imu heading to help the mower don't find again another island.

Thanks.
 
Hello again
Back in business after a lot of work at work and no time for ardumower.
Today I did a first test run on the "island" problem.
It seems to work. :)
I will keep on testing.
https://youtu.be/Y07PFAObkIQ
 
Hi Rulle
Very good.
how did you manage the problem ?
On the video i suppose the imu is used but if true then i think it's can not manage this kind of area ?
Maybe you can also solve this ?
islandimu.jpg


Maybe you can share the parts of code.
Thanks.
Attachment: https://forum.ardumower.de/data/media/kunena/attachments/3545/islandimu.jpg/
 
Zuletzt bearbeitet von einem Moderator:
Since I'm not a programmer i had to do it easy, very easy.
I did it like this:

Since the mower runs counterclockwice around the island the right Odometry counts faster.
Check Odometry at the start of "peritrack", then if right Odometry counts x pulses ( x depending of wheels base and diameter) more than the left, it's stuck on an island. Stop, turn 90 degress right and start a new perifind.

Here is the code:
robot.h

Code:
long PeriOdoLeft ;   // left wheel counter while perimetertracking
    long PeriOdoRight ;  // right wheel counter while perimetertracking 

virtual void checkPeriOdo();


mower.cpp

Code:
if ((setPins & 0b00010000) && (actPins & 0b00010000))                       // pin left is RISING
    {     
      if (robot.motorLeftPWMCurr >= 0)            // forward
       { robot.odometryLeft++;
       robot.PeriOdoLeft++;                      //new variable will not interfere odometryLeft
       }
      else
       { robot.odometryLeft--;                 // backward
        robot.PeriOdoLeft--;
       }
    }
    if ((setPins & 0b01000000) && (actPins & 0b01000000))                         // pin right is RISING
    {     
      if (robot.motorRightPWMCurr >= 0)
       { robot.odometryRight++;          // forward
        robot.PeriOdoRight++;}      //new variable will not interfere odometryRight
       
      else
        {robot.odometryRight--;                // backward
        robot.PeriOdoRight--;}               
    }


and finaly robot.cpp

Code:
void Robot::checkPeriOdo(){
 
  if(PeriOdoRight-PeriOdoLeft >3400){
    
  setNextState(STATE_PERI_ROLL,RIGHT);
 
  }
}

if (stateNew == STATE_PERI_TRACK){        
    //motorMowEnable = false;     // FIXME: should be an option?
    perimeterMagMaxValue = perimeterMagMedian.getHighest();
    setActuator(ACT_CHGRELAY, 0);
    perimeterPID.reset();
    PeriOdoLeft = PeriOdoRight = 0;
    }

   case STATE_PERI_TRACK:
      // track perimeter
      checkCurrent();                  
      checkBumpersPerimeter();
      checkPeriOdo();
      //checkSonar();                   
      if (batMonitor){
        if (chgVoltage > 5.0){ 
          setNextState(STATE_STATION, 0);
        }
      }
      break;


That's it. Quite simple solution, but it works for me.
 
Oben