Using PyRoboViz, I have visualized the 2D LIDAR map in real-time on Pi itself. However, while the visualization is on, the 'read descriptor bytes' from LIDAR occasionally flagged an error while scanning.
As a workaround, I have re-routed the real-time visualization of LIDAR map to a remote machine using MQTT. The robot position, angle, and map were encoded as a byte array that is decoded at the MQTT client as below.
# At the MQTT Transmission side data2Transmit = np.array([x, y, theta]) # Map which is saved as a bytearray is appended at the end if scan_count % 30 == 0: client.publish("safetycam/topic/slamviz", \\ data2Transmit.tobytes() + mapbytes) # At the MQTT receiving side # As 3 float values takes 8*3 = 24 bytes robotPos_bytes = msg.payload[:24] map_bytes = msg.payload[24:] robotPos = np.frombuffer(robotPos_bytes, dtype='float64') robotPos = np.array(robotPos) x, y, theta = robotPos viz.display(x / 1000., y / 1000., theta, map_bytes)
The only downside of this method is the slow rendering of the LIDAP map on the remote machine. You can increase the speed by reducing the MQTT publish frequency or reducing the map size.
Later I found a better fix to the above 'read descriptor bytes' problem while scanning. The solution was to write the LIDAR scan method as a separate thread and keep the visualization as a separate thread while devising a mechanism for the threads to communicate.
The multi-threaded implementation can be found in the repository here