111 lines
3.3 KiB
Python
111 lines
3.3 KiB
Python
import serial
|
|
import time
|
|
|
|
import matplotlib.pyplot as plt
|
|
from mpl_toolkits.mplot3d.axes3d import Axes3D
|
|
|
|
from parser_mmw_demo import parser_one_mmw_demo_output_packet
|
|
|
|
# Turning interactive mode on for plotting
|
|
plt.ion()
|
|
fig = plt.figure()
|
|
|
|
# Change the configuration file name
|
|
configFileName = 'hedgehog.cfg'
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
# Function to configure the serial ports and send the data from
|
|
# the configuration file to the radar
|
|
def serialConfig(configFileName):
|
|
|
|
# Serial device ports
|
|
CLIport = serial.Serial('/dev/ttyACM0', 115200)
|
|
Dataport = serial.Serial('/dev/ttyACM1', 921600)
|
|
|
|
# Read the configuration file and send it to the board
|
|
with open(configFileName, mode="rt", encoding="utf-8") as config_file:
|
|
for line in config_file:
|
|
line = line.rstrip("\r\n")
|
|
print(f"[CONFIG] writing: '{line}'")
|
|
|
|
CLIport.write((line + "\n").encode())
|
|
time.sleep(0.01)
|
|
|
|
return CLIport, Dataport
|
|
|
|
# ------------------------- MAIN -----------------------------------------
|
|
|
|
# Configurate the serial port
|
|
CLIport, Dataport = serialConfig(configFileName) # Enable when reading from sensor
|
|
# Dataport = open("sensor_data.bin", mode="rb") # Enable when reading from file
|
|
|
|
# parser_one_mmw_demo_output_packet extracts only one complete frame at a time
|
|
# so call this in a loop till end of file
|
|
|
|
def parse_frames():
|
|
|
|
ax = fig.add_subplot(projection="3d")
|
|
|
|
# making the plot axis constant
|
|
ax.set_xlim(0, 1)
|
|
ax.set_ylim(0, 1)
|
|
ax.set_zlim(0, 1)
|
|
|
|
plt.show()
|
|
|
|
sensor_data = bytearray()
|
|
bytes_parsed = 0
|
|
while True:
|
|
read_data = Dataport.read(256)
|
|
with open("sensor_data.bin", mode="ab") as fp:
|
|
fp.write(read_data)
|
|
|
|
sensor_data += bytearray(read_data)
|
|
|
|
# parser_one_mmw_demo_output_packet function already prints the
|
|
# parsed data to stdio. So showcasing only saving the data to arrays
|
|
# here for further custom processing
|
|
parser_result, \
|
|
headerStartIndex, \
|
|
totalPacketNumBytes, \
|
|
numDetObj, \
|
|
numTlv, \
|
|
subFrameNumber, \
|
|
detectedX_array, \
|
|
detectedY_array, \
|
|
detectedZ_array, \
|
|
detectedV_array, \
|
|
detectedRange_array, \
|
|
detectedAzimuth_array, \
|
|
detectedElevation_array, \
|
|
detectedSNR_array, \
|
|
detectedNoise_array = parser_one_mmw_demo_output_packet(sensor_data[bytes_parsed::1], len(sensor_data) - bytes_parsed)
|
|
|
|
ax.clear()
|
|
|
|
# Setting axis labels
|
|
ax.set_xlabel("X label")
|
|
ax.set_ylabel("Y label")
|
|
ax.set_zlabel("Z label")
|
|
|
|
ax.set_autoscale_on(False)
|
|
ax.scatter(detectedX_array, detectedY_array, detectedZ_array)
|
|
plt.pause(0.01)
|
|
|
|
# Check the parser result
|
|
print ("Parser result: ", parser_result)
|
|
if (parser_result == 0):
|
|
bytes_parsed += (headerStartIndex+totalPacketNumBytes)
|
|
print("totalBytesParsed: ", bytes_parsed)
|
|
else:
|
|
# bytes_parsed += 1
|
|
continue
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
parse_frames()
|
|
except KeyboardInterrupt:
|
|
CLIport.write("sensorStop\n".encode()) # Enable when reading from sensor
|
|
# Dataport.close() # Enable when reading from file
|
|
exit(0)
|