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
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.