
ROBORAY
September - October 2017
As a quick introduction to robotic systems, my team was tasked with creating a marine animal inspired aquatic robot to cut across the surface of a pool in straight lines, turning before hitting the sides. We were intrigued by the flapping, oscillating motion of a ray’s fins, and decided to build a simplified version of it as our robot’s means of propulsion. At high speeds, the strokes of its ‘wings’ gave our ray an interesting bobbing gait; when released into the test pool, it completed its transits with charm, if not grace.

In beginning the basic mechanical design of our craft, we had two features fairly set in our minds: the ray-like shape of the deck and the flippered propulsion system.  We were concerned that the flippers might hit walls if they were to protrude too far beyond the ray’s body, but the ray-like shape conveniently allowed us to design a deck that would protrude over the flippers. These ‘wings’ on the deck were supported by smaller pontoon-like ‘ama’ which kept the boat laterally steady. To allow for the changing weight of electronics and optimize the robot’s height in the water, we mounted the ama on threaded rods. Our main hull was routed from foam in a half ellipsoid shape, just wide enough to accommodate a waterproof electronics box in the center.

In addition to pivoting up and down, we wanted our fins to rotate on their shafts to create 45 degree angles on the upstrokes and downstrokes. We accomplished this by setting pins into the flipper rods which fit into slits in the flippers, constraining them to a 90 degree range of rotation relative to the shafts. This rotation occured naturally due to the forces of the water as a servo-operated linkage on the deck moved each flipper rod up and down. Our steering was achieved both through individual control of these fins and by a rudder on the back. Unconventionally, we mounted the rear, rather than the front, of the rudder to its servo. This let us scull the robot backward, and the servo kept the water from pushing the rudder to one side, as it would tend to do in this rudder configuration.

Our electrical system was divided into a power circuit and a data circuit. Power was drawn from a 7.2V battery, which needed to accommodate three servos, an Arduino with attached I/Oshield, and two sensors which we mounted onto the front of the ray to detect the pool walls. Â The data circuitry included signals from those servos and sensors, as well as a status LED. Through power calculations and testing, we learned that the system could only support about 15 minutes of runtime before we saw erratic behaviour in the servos. We also learned to separate the servo power from the regulated Arduino power, as the servos caused voltage fluctuations that would cause erratic sensor readings if not separated. The sensors themselves also needed to be repositioned and their readings averaged before we got reasonable results.

Our control code started the ray off straight by driving both fins and centering the rudder. The fins were driven using a Fourier series approximation of a triangle wave, so as to move them up and down at constant velocity without instantaneously reversing the servos. Values from each of the two sensors were continually read and averaged, and when one sensor’s average exceeded a set threshold (it had detected a wall) the ray was turned in the opposite direction by driving one flipper, stopping the other, and turning the rudder. A countdown timer set at the beginning of each turn kept the ray turning for a predetermined duration before it was set straight again. If both sensors exceeded a higher threshold (the ray was dangerously close to a wall), the rudder was driven using the Fourier function to scull the ray backward.