I would like to propose the following architecture:
![schematic](https://cdn.statically.io/img/i.sstatic.net/9KYyP.png)
simulate this circuit – Schematic created using CircuitLab
Main Application Processor:
This is a grunty beast running all the Top-Level tasks like motion planning, cameras, WIFI, what-not.... It does not directly control the motors and does not get down in the "for move x i have to run motor[n] at y speed". This can run a OS without any hard real-time constraints.
Motion Co-Processor:
This processor handles the real-time movement planning and motor tasking. From information received by the application processor (e.g. turn vehicle left 15° within 2 seconds while going with a absolute velocity of 5m/s and do not violate 5m/s^2 in x/y) it derives the actual motor commands (e.g Motor1: Turn 5rpm, Motor3: turn 9 rpm... you get the idea). It can signal problems to the application controller, but handles all the real-time and safety stuff on its own.
Motor controllers:
Each motor has its own controller which handles the low-level motor controll (PWM generation, current monitoring, velocity control, torque control, whatever... ).
It is connected to the Motion Co-Processor via a serial PtP link (i would suggest RS485, as low cost). I would use PtP over multidrop, as it avoids congestion in fault scenarios and is easier to manage from a real-time perspective. As you have to feed DC-supply for the motors to every motor anyways, you might as well add two small wires (RS_A, RS_B) as well.
NOTE: Your protocoll between the motion processor and the motor controller must implement some sort of interrupt signaling! (Hey motion processor, i just ran into a torque limit... therefore the requested move is not possible - please replan the motion for all the other motors.)