Other Parts Discussed in Thread: IWR1642
Hi all
I have written a python script to read the data stream over USB, convert the object data into (x,y) coordinates and to display it on the console, using the IWR1642 EVM. I tested it in an empty room and got some bizarre results (Ex. range of 355m, etc). I have attached my python script and sample output. Please tell me where I went wrong.
output.txt
Read Data: [2, 1, 4, 3, 6, 5, 8, 7, 5, 0, 0, 1, 192, 2, 0, 0, 66, 22, 10, 0, 215, 151, 0, 0, 190, 102, 4, 161, 8, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0, 8, 0, 7, 0, 1, 0, 0, 0, 37, 0, 228, 255, 13, 0, 0, 0, 27, 0, 0, 0, 15, 0, 185, 0, 57, 3, 0, 0, 51, 0, 0, 0, 21, 0, 187, 2, 156, 5, 0, 0, 59, 0, 0, 0, 24, 0, 181, 2, 177, 6, 0, 0, 95, 0, 0, 0, 2, 0, 162, 3, 10, 11, 0, 0, 255, 0, 0, 0, 15, 0, 186, 227, 48, 13, 0, 0, 27, 0, 0, 0, 11, 0, 246, 1, 168, 2, 0, 0, 51, 0, 0, 0, 15, 0, 100, 0, 58, 6, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 216, 123, 160, 122, 62, 108, 58, 80, 98, 89, 101, 94, 250, 101, 104, 100, 196, 93, 73, 100, 88, 102, 244, 101, 182, 102, 99, 100, 49, 96, 111, 92, 126, 95, 56, 90, 164, 90, 170, 91, 80, 93, 242, 88, 36, 96, 235, 100, 11, 107, 59, 109, 107, 108, 62, 113, 37, 113, 13, 107, 24, 94, 80, 91, 73, 97, 205, 94, 175, 86, 166, 84, 87, 81, 59, 82, 191, 80, 115, 85, 65, 84, 70, 80, 70, 80, 57, 82, 246, 83, 116, 75, 185, 66, 104, 73, 44, 76, 150, 95, 246, 112, 42, 117, 224, 108, 143, 84, 159, 76, 164, 71, 134, 74, 251, 86, 29, 108, 81, 117, 1, 115, 85, 100, 165, 93, 150, 92, 220, 83, 0, 78, 52, 74, 229, 74, 163, 77, 32, 80, 126, 77, 123, 69, 181, 74, 154, 72, 43, 69, 87, 68, 28, 71, 113, 72, 3, 71, 250, 73, 9, 70, 15, 69, 144, 67, 191, 70, 7, 75, 51, 74, 112, 70, 148, 71, 232, 69, 218, 74, 227, 72, 234, 67, 99, 73, 232, 73, 73, 87, 109, 91, 143, 86, 246, 76, 117, 73, 72, 69, 166, 71, 175, 69, 159, 66, 126, 67, 176, 67, 176, 68, 22, 70, 219, 66, 186, 66, 90, 65, 163, 64, 23, 64, 131, 70, 146, 66, 219, 66, 119, 70, 83, 70, 39, 72, 150, 70, 244, 70, 66, 67, 39, 66, 182, 67, 202, 62, 22, 70, 183, 65, 52, 66, 115, 69, 250, 67, 45, 67, 32, 69, 194, 71, 141, 69, 11, 65, 133, 64, 218, 65, 141, 59, 232, 66, 147, 69, 180, 69, 78, 63, 35, 68, 194, 65, 205, 60, 250, 65, 248, 67, 99, 66, 53, 71, 210, 70, 106, 63, 190, 64, 223, 67, 182, 67, 246, 65, 111, 68, 23, 70, 147, 66, 181, 64, 48, 65, 146, 66, 42, 65, 109, 68, 39, 68, 225, 64, 70, 63, 226, 63, 105, 65, 84, 59, 139, 69, 78, 66, 161, 68, 236, 64, 201, 61, 112, 67, 246, 67, 251, 65, 239, 64, 119, 67, 164, 67, 20, 67, 62, 66, 93, 63, 163, 67, 125, 69] Detected Object data: [1, 0, 0, 0, 37, 0, 228, 255, 13, 0, 0, 0, 27, 0, 0, 0, 15, 0, 185, 0, 57, 3, 0, 0, 51, 0, 0, 0, 21, 0, 187, 2, 156, 5, 0, 0, 59, 0, 0, 0, 24, 0, 181, 2, 177, 6, 0, 0, 95, 0, 0, 0, 2, 0, 162, 3, 10, 11, 0, 0, 255, 0, 0, 0, 15, 0, 186, 227, 48, 13, 0, 0, 27, 0, 0, 0, 11, 0, 246, 1, 168, 2, 0, 0, 51, 0, 0, 0, 15, 0, 100, 0, 58, 6, 0, 0] Range Velocity X_coor Y_coor [[ 7.81250000e+00 0.00000000e+00 -1.08527132e-01 5.03875969e-02] [ 2.10937500e+02 0.00000000e+00 7.17054264e-01 3.19767442e+00] [ 3.98437500e+02 0.00000000e+00 2.70930233e+00 5.56589147e+00] [ 4.60937500e+02 0.00000000e+00 2.68604651e+00 6.63953488e+00] [ 7.42187500e+02 0.00000000e+00 3.60465116e+00 1.09534884e+01] [ 1.99218750e+03 0.00000000e+00 -2.80542636e+01 1.30852713e+01] [ 2.10937500e+02 0.00000000e+00 1.94573643e+00 2.63565891e+00] [ 3.98437500e+02 0.00000000e+00 3.87596899e-01 6.17829457e+00]]
import serial import sys import string import struct import time import numpy as np import math from decimal import * # # # # # # # # # # # # # # # # # # # # # # # GLOBAL VARIABLES OBJ_STRUCT_SIZE_BYTES = 12; magicWord = [2,1,4,3,6,5,8,7] word = [1,256,65536,16777216] #word = [1, 16, 256, 65536] word1 = [1,256] # # # # # # # # # # # # # # # # # # # # # # #####CONFIGURATION PARAMETERS FROM GUI DEMO ######### txChannelEn = 3 #channelCfg #2 numTxAnt = 2 digOutSampleRate = 5209 # profileCfg #11 freqSlopeConst = 70 #profileCfg #8 numAdcSamples = 256 #profileCfg #10 numRangeBins = 8 #pow2roundup(numAdcSamples) startFreq = 77 #profileCfg #2 idleTime = 429 #profileCfg #3 rampEndTime = 57.14 #profileCfg #5 chirpEndIdx = 1 #frameCfg #2 chirpStartIdx = 0 #frameCfg #1 numLoops = 16 #frameCfg #3 numChirpsPerFrame = (chirpEndIdx -chirpStartIdx + 1) *numLoops numDopplerBins = numChirpsPerFrame/numTxAnt ######################################################## rangeIdxToMeters = 3e8 * digOutSampleRate * 1e3 /(2 * freqSlopeConst * 1e12 * numRangeBins) dopplerResolutionMps = 3e8 / (2*startFreq*1e9 *(idleTime + rampEndTime) * 1e-6 * numDopplerBins * numTxAnt) ser = serial.Serial(port ='COM3', baudrate = 921600, timeout = 0.2) while True: #if 1>0: #byteVec = ser.read(ser.inWaiting()) byteVec = ser.read(520) x = list(byteVec) startIdx = [] #print('Read Data:\n',x, '\n') for ind in (i for i,e in enumerate(x) if e==magicWord[0]): #To obtain the start indices of all magic words if x[ind:ind+8]==magicWord: startIdx.append(ind) for j in startIdx: #For each packet, do the needful j = j + 8 #Skip magic word j = j + 20 #get to number of detected objects. Only TLV selected is Detected Points numDetObj = 0 k = 1 for k in range(4): if j+k >= len(x): break numDetObj = numDetObj+ x[j+k]*word[k] #Refer line 1220 of mmw_demo.m #print('NumDetObj= '+str(numDetObj)+'\n') j = j + 8 #Exit the header part j = j+8 # SKIP TLV INFORMATION if j +4>= len(x): # Account for exceeding the length of list break #detObj part Refer line 1245 of mmw_demo.m numObj = 0 detObj = np.zeros([numDetObj, 5]) numObj = x[j+1] + x[j+2]*256 j = j+2 xyzQFormat = 2^(x[j+1] + x[j+2]*256) j = j+2 bytes = x[j: j+numDetObj*OBJ_STRUCT_SIZE_BYTES] #print('Detected Object data: \n', bytes, '\n') if len(bytes) >= numDetObj*OBJ_STRUCT_SIZE_BYTES: j = j+numDetObj*OBJ_STRUCT_SIZE_BYTES #print(len(bytes)/numDetObj) bytes = np.array(bytes).reshape(numDetObj, OBJ_STRUCT_SIZE_BYTES) #print(bytes, '\n') #print('rangeIdxToMeters = ', rangeIdxToMeters, '\n') #print('xyzQFormat = ', xyzQFormat, '\n') detObj[:, 0] = (bytes[:, 0] + bytes[:, 1] * 256)* rangeIdxToMeters detObj[:, 1] = bytes[:, 2] + bytes[:, 3]*256 for r in range(numDetObj): if detObj[r,1] > numDopplerBins/2-1: detObj[r,1] -= numDopplerBins #detObj[:,1,detObj[:,1] > numDopplerBins/2-1] =detObj[:,1,detObj[:,1] > numDopplerBins/2-1] - numDopplerBins; # Refer mmw_demo.m line 1265 detObj[:, 1] *= dopplerResolutionMps detObj[:, 2] = (bytes[:, 6] + bytes[:, 7]*256) detObj[:, 3] = (bytes[:, 8] + bytes[:, 9]*256) for r in range(numDetObj): if detObj[r,2] > 32767: detObj[r,2] -= 65536 #for r in range(numDetObj): # if detObj[r,3] > 32767: # detObj[r,3] -= 65536 #detObj[:,2,detObj[:,2] > 32767] = detObj[:,2, detObj[:,2] > 32767] - 65536 detObj[:,3][detObj[:,3] > 32767] = detObj[:,3][ detObj[:,3] > 32767] - 65536 detObj[:,2] = detObj[:, 2] / xyzQFormat detObj[:,3] = detObj[:, 3] / xyzQFormat for r in range(numDetObj): if detObj[r,1] == 0: detObj[r, 4] = -1 continue detObj[r,4] = np.sqrt(detObj[r,2]**2 + detObj[r,3]**2)/abs(detObj[r,1]) print("Range \t\t Velocity \t\t X_coor \t\t Y_coor \tETA\n", np.around(detObj, decimals = 2), '\n') #break #break ser.close()