Thanks to support from DeSET (part of The Nippon Foundation) I’ve been putting some effort into swarming with boats. The idea is that it should be faster to map a large area of the sea using a large number of syncronised boats.
I’ve previously done swarming with multicopters and rovers and so it wasn’t too difficult to get working. As a reminder there are at least 3 ways to do swarming with ArduPilot:
- Using the ground station’s swarming feature (available in Mission Planner, uCGS, Robsense’s SwarmLink and probably other ground stations) – I did not use this method in these test
- Independent but syncronised missions using the NAV_DELAY command
- Using Follow mode
The first video above is using the syncronised mission method. All three boats have parallel missions loaded into them and before each waypoints there is a NAV_DELAY command to ensure the next command starts at the specified UTC time. By the way support for NAV_DELAY was recently added by long time ArduPilot developer TomPittenger who now works at AION Robotics
Below is a picture of the mission loaded into the white boat. You can see there’s a DELAY command after the first waypoint. The Hour and Minute fields are set to “-1” which means they are ignored and the mission will start on the 1st second of the next minute after the DELAY command is executed. When creating the missions I had to be a little careful to calculate this “second” value although it wasn’t very hard, I just divided the distance to the next waypoint by the target speed and added 10 seconds.
The video below shows the Follow mode method. I was driving the lead vehicle (the white one) in Acro mode and the follwer was simply put in Follow mode with FOLL_X = -4 meaning to follow 4m behind the lead. The two vehicles had a telemetry connection between them using 900mHz SiK telemetry radios but any telemetry connection should work.
You’ll probably notice that the follower sometimes gets ahead of the lead. I think this is because the FOLL_POS_P parameter value (defaults to 0.1) was too low and I hope to try again with a higher value like 0.25.
The way that follow works is the following vehicle’s velocity is a combination of two other velocity vectors. The base is the lead vehicle’s velocity, then on top of this we add a correction velocity which is FOLL_POS_P x the difference between where we are and where we want to be (i.e. position error)
Because the gain was too low, the following vehicle was mostly just driving around at the same speed as the lead and then only very slowly correcting the position error.