We completed the buoy task.
We started by first narrowing the range values used for HSV filtering to avoid picking up on gray and orange-red objects and to instead limit it to just saturated red colors. This significantly reduced false positives.
The final CV algorithm can detect the buoy when it is within 5 meters of the robot and not cut off in the camera frame. Beyond 5 meters, the buoy appears dark red and appears more like a circle than its actual balloon shape. If the buoy gets cut off, its contour doesn’t match with the reference contour. A small area near the top and bottom edges of the buoy gets filtered out in HSV filtering as it is not as saturated as the rest; while this is not an issue with the CV detections, it means that task planning must use the width of the bounding box, not the height, to compute an accurate meters to pixels ratio.
We then pivoted to figuring out the task planning for the body task. Since the size of the buoy is known, the robot can compute a meters to pixels ratio, and use the distance between the frame’s center and the center of the bounding box to compute how many meters it needs to move in the Y and Z directions to keep the buoy in the center of the frame.
The robot approaches the buoy in increments of 0.5 meters. After every step, it corrects its Y and Z positions. It centers the buoy in the Y axis, but maintains a constant depth along the Z axis. Maintaining a constant depth is necessary to ensure the robot doesn’t get too close to the surface. This means as the robot moves closer, the buoy creeps towards the top of the camera frame, but it never goes out of frame entirely as the robot begins circumnavigation before doing so.
When width of the buoy is greater than 50 pixels, the robot slows down to increments of 0.25. Once the with is greater than 100 pixels, the robot is approximately 1 meter from the buoy, and begins circumnavigating it in an approximately 2m x 2m square. The circumnavigation is done entirely with dead reckoning, albeit in no more than 1 meter increments. It leaves plenty of buffer space around the buoy, ensuring that
After circumnavigating, the robot continues to move around the buoy to get on the opposite side from where it started so it could detect the path marker located on the bottom of the pool and proceed to the bins task.
Although we’ve had issues with the tether and thruster Arduino in previous pool tests, they were mostly fine in this test. The tether never appeared to slow down, and the thruster Arduino disconnected only once. And, no leaks.