Although war is not happening, the dangerous impact is still tangible today. Landmine has been one of the threats left by the past wars, killing 15,000–20,000 people every year according to UN Mine Action Service. Demining efforts cost US$ 300–1000 per mine and imposing danger to people, resulting one person is killed and two are injured for every mines cleared.
Robot can be really helpful in solving this problem, as it is designed to do the “dull, dirty, dangerous, and difficult” tasks. In 2017, IEEE Robotics Automation Society’s Special Interest Group on Humanitarian Technology (RAS–SIGHT) held a competition. The competition was Humanitarian Robotics and Automation Technology Challenge (HRATC), held at the 2017 International Conference on Robotics and Automation (ICRA’17).
Albeit not participating directly at that moment, I found the competition as interesting so I practiced my robotics skill by finishing the challenge. The simulation environment is provided by the committee through their website. I made a few changes in the simulator environment and completed the mission by detecting 3 out of 4 mines.
My autonomous algorithm includes a waypoint following, landmine detection, and obstacle avoidance algorithm. Check out the following GitHub repositories for the code, modified simulation environment and autonomous algorithm. If you’re interested on the algorithm details, keep reading!
Waypoint Following Algorithm
In the simulation, the rover is equipped with a localization sensors, namely inertial measurement unit (IMU), GPS, and odometry. These sensors is then fused using an extended Kalman Filter (EKF) to localize the robot in the environment.
The robot user will define a region of interest (ROI) in which the robot will operate. Then, an algorithm will produce a grid scan pattern to navigate within the ROI. Intersection points with the ROI border will be used as the waypoints.
Below is the pseudo code for the waypoint following navigation algorithm. An important remark is the termination condition for bot the heading and distance. Instead of using an exact termination condition, using equal to (==) comparator, a tolerance should be defined. This is important since the sensors measurements do not have 100% accuracy, therefore we might not have exactly our desired pose.
if(headingDiff > headingTolerance): rotateRight() elif(headingDiff < -headingTolerance): rotateLeft() else: if(distance > distanceTolerance): moveStaright() else: stop() if (not lastWaypointReached): setNewTarget() else: missionFinished = True
Landmine Detection and Avoidance
The rover is equipped with a metal detector sensor, consisting of two coils, one on each side. While moving to the next waypoint, the rover will notice a landmine is detected whenever one of the coils value is higher than certain threshold.
Once the rover marked a certain coordinate as dangerous, the rover will create a new waypoints around the landmine and will update the waypoints list. To avoid a deadlock, avoidance algorithm should check whether the previous waypoint target is within a safe distance from the landmine. If it is too close to the landmine, the rover will ignore the waypoint and proceed to the next one instead.
The rover is equipped with a Li-DAR sensor to detects obstacle, measuring every 0.5 degree covering 180 degrees in total, from the rover right side to its left side.
For a simplicity purpose, the Li-DAR measurement is divided into five regions as shown in figure below. Although reducing the Li-DAR capability, this has been enough to avoid obstacles in the simulation. Further advancement might be required in a more complex environment.
The obstacle avoidance algorithm utilizes a bug-algorithm to avoid hitting the obstacle. The algorithm version used in the simulation is depicted on point g, DistBug, on the figure below.
Below is the pseudo code for the obstacle avoidance.
currentObstacleState = 0, no obstacle
currentObstacleState = 1, obstacle in front or right, turn left
currentObstacleState = 2, obstacle in front or left, turn right
currentObstacleState = 3, obstacle on left or right side, follow wall
if (currentObstacleState == 0): goToWaypoint(headingDiff, distance) elif (currentObstacleState == 1): turnLeft() elif (currentObstacleState == 2): turnRight() elif (currentObstacleState == 3): followWall() else: robotStop(
If you have any suggestions for the algorithm advancement or questions related to the algorithm, feel free to contact me!