Four ECUs, one bus
The car is four MACS Studio models, each running as its own node with its own CAN Bus node. car.dbc is the wiring: a message's sender transmits it, and every node named as a receiver of one of its signals receives it.
| ECU | What it does |
|---|---|
| Vehicle | The car itself: 1,850 kg, a 350 Nm rear motor, tyres with slip on dry, wet, snow or ice, brakes and a 75 kWh pack |
| VCU | Power modes, gears, the pedal map, regeneration and the torque request |
| ABS | Reference speed, ABS per wheel, brake blending with regeneration and traction control |
| Cluster | Speedometer, power meter, trip computer, warning lamps and a DTC counter |
Stop an ECU, mid-drive
Stop an ECU's CAN node and its frames stop. Every receiver's RX timeout fires, and the rest of the car responds as it was designed to.
| Lost | What happens |
|---|---|
| VCU | The inverter goes to its safe state, the cluster lights the CAN lamp and names the VCU, and a DTC is counted |
| ABS | The brakes fall back to plain hydraulics and the wheels lock on snow, while the VCU limps home at half torque without regeneration |
| Cluster | Nothing else depends on it, so the driver's display freezes and goes stale |
Tested like the real thing
The test suite runs against the deployed project at two levels. SIL tests stop one ECU's CAN node and play the bus themselves. System tests run the whole car on the bus, including braking on snow and losing ECUs mid-drive.
A driver that learnt the track
The car can also drive itself round a 700 m lap of hills, a kicker and washboard. The policy was trained by reinforcement learning on 12 cars in parallel, each one the same four models. It laps in about 30 to 33 s, against 41 s for a hand-tuned cruise at 66 km/h, and runs live as a Python node using only NumPy.
This is a simulation running on a virtual CAN bus, built to show what MACS can do.


