We’re working on a board that connects cameras and sensors to a robot’s compute over CAN-FD and GMSL2. Three things came up during development that changed the design more than anything we planned upfront.
The flash budget made the decision for us.
We started assuming the board would speak ROS directly. Put micro-ROS on the chip to test it, and it ate 60% of flash before we’d written any of our own code.
That settled it. The device speaks Cyphal now. ROS runs host-side behind a thin bridge, and one firmware image serves three transports instead of one.
One reboot didn’t actually reboot anything.
A link kept dying every time we swapped a board. Power cycles didn’t fix it. Full host reboots didn’t fix it either.
Turned out one chip never fully powered off. It was getting backfed through its own data lines and holding old state through every reset we tried. The fix was a single reset write, once we found where the power was actually coming from.
Also explained an older bug on the same rig we’d never tracked down. Same root cause.
Timestamps mattered more than we assumed.
We treated per-sample timestamps as optional at first. Sensor sends data, host receives it, how far off could the timing really be.
Turns out it matters a lot once you’re fusing readings from different nodes on different transports. SLAM cares when the sensor captured the reading, not when the host got it. Those two numbers aren’t close.
Now every sample is stamped at capture, on the node, with a sequence number so drops are visible.
Wrote this up mostly for our own record and I guess other people building sensor nodes run into some version of the same three things.