I have been asking a couple of questions here and around on autonomous boats and finally I decided to post the design and gather some feedback.
The idea is to build a small vessel capable of advanced autonomous navigation (on a given path), path optimisation and obstacle avoidance, being at the same time completely independent from fuel thanks to renewable energy sources, only relying on solar panels and thermoelectric generators. The displacement of the boat is around 2m, with a bulb at the bottom containing LiFePo batteries.
On the electronics side, I thought to split tasks into several units, made of microcontrollers running a RTOS (ChibiOs or FreeRTOS, I still have to choose) and a Single Board Computer with Arch Linux. Up to now the units identified are:
- High level navigation unit
- Low level navigation unit
- Power unit
- Engine unit
The High level navigation unit would perform the following tasks:
- Path planning: global route calculation, considering shorelines, high-traffic routes and sea bathymetry to avoid groundings;
- Obstacle Avoidance: using a forward-looking sonar for underwater obstacles, AIS for boats, a thermal imaging camera and maybe a small radar for other types of objects;
- Local navigation: optimise the path taking into account the general predefined path (from the path planner), use Inertial Navigation and dead reckoning in case of GPS failure.
- Local System Management: put sensors in sleep mode when they're not needed or in case of power shortages.
The Low level navigation unit is responsible for:
- Local navigation
- Local System Management
- Communication: transmit and receive messages via radio link or satellite;
The Power unit contains a MPPT solar charger and a battery monitor and is responsible for: - Charging and powering the units; - Sensing the battery and informing other units on the charge status; - Disabling units to go in low power mode (one after the other).
The last unit is simply an interface to the engines, basically it's an ESC connected to the other units.
The backbone of the boat would be the well-established CAN Bus running NMEA2000 since almost all sensors use this protocol, and both the SBC and the uC would share messages via CanBus. Locally, the SBC will have a CanBus interface and a MessageBus where threads responsible for the aforementioned tasks will stream messages (inter-thread) and eventually publish frames on the Can Bus to interface with sensors (say put the Sonar in sleep mode) or the other units. Ideally in case of failure the boat should be able to navigate with just one of the two navigation units, obviously losing some functionalities.
My main concern is to reduce failure points so that a single error or broken sensor/unit would not compromise the whole system. Ideally there could be failsafe additions such as a Draculino, an Arduino running on RF and piezoelectric harvested energy to stream QRSS and morse position messages to nearby boats, but probably it's useless.
Fun fact: this design should be COLREG compliant due to the several anti-collision features and some small details I didn't mention such as the navigation light or the manoeuvre normaliser (to make the boat steer in a human-understandable way).