Data format

All messages should be byte messages.

Best practice is to use C-order numpy arrays bytes.

they can be generated via the .tobytes() method from numpy arrays.

They can be read via np.frombuffer.

Currently used message format

## position of the car (1, 7) 
### qx, qy, qz, qw are angles quaternion.
position = np.array([x, y, z, qx, qy, qz, qw])

## frames (HEIGHT, WIDTH, 4)
frame = np.array([[[b, g, r, i], ... n_width ... ], ... n_height ... ])

## Obstacles without location (-1, 6)
bbox_2d = np.array([[min_x, max_x, min_y, max_y, confidence, label], ... n_bbox ... ])

## Obstacles with locations (-1, 5)
obstacles = np.array([[x, y, z, confidence, label], ... n_obstacle ... ])

## waypoints to follow. Shape (-1, 3)
waypoints = np.array([[x, y, speed], ... n_waypoint ... ])

## control for the car (1, 3)
control = np.array([throttle, steer, brake])