Hello,
My group and I are running the vitalsigns.py class using an IWR1443BOOST to collect heart rate data. However, we're receiving frequent "nan" values in the data. What could be the cause of this?
Thanks.
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Hello,
My group and I are running the vitalsigns.py class using an IWR1443BOOST to collect heart rate data. However, we're receiving frequent "nan" values in the data. What could be the cause of this?
Thanks.
Hi Paul,
Are you using one of our vital signs demos? If so, which vital signs demo are you using?
1. 14xx Vital Signs
2. 3D People Counting with Vital Signs
3. 68xx Vital Signs
Thank you,
Angie Mitchell
What we did was we pip-installed mmWave:
>pip install mmWave
We then imported vitalsign.py:
from mmWave import vitalsign
We are making a call to the tlvRead function (passed in "false" to disp argument as we are not displaying anything), which detects the magic word and goes through a finite state machine, and returns the data object.
# vitalsign # ver:0.0.10 # 2020/02/04 # # import serial #import time import struct #import numpy as np class vsos: rangeBinIndexMax = 0 rangeBinIndexPhase = 0 maxVal = float(0.0) processingCyclesOut = 0 processingCyclesOut1 = 0 rangeBinStartIndex = 0 rangeBinEndIndex = 0 unwrapPhasePeak_mm = float(0.0) outputFilterBreathOut = float(0.0) outputFilterHeartOut = float(0.0) heartRateEst_FFT = float(0.0) heartRateEst_FFT_4Hz = float(0.0) heartRateEst_xCorr = float(0.0) heartRateEst_peakCount = float(0.0) breathingRateEst_FFT = float(0.0) breathingEst_xCorr = float(0.0) breathingEst_peakCount = float(0.0) confidenceMetricBreathOut = float(0.0) confidenceMetricBreathOut_xCorr = float(0.0) confidenceMetricHeartOut = float(0.0) confidenceMetricHeartOut_4Hz = float(0.0) confidenceMetricHeartOut_xCorr = float(0.0) sumEnergyBreathWfm = float(0.0) sumEnergyHeartWfm = float(0.0) motionDetectedFlag = float(0.0) rsv = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0] class header: version = "" totalPackLen =0 tvlHeaderLen = 8 platform = "" frameNumber = 0 timeCpuCycles = 0 numDetectedObj = 0 numTLVs = 0 rsv = 0 class VitalSign: magicWord = [b'\x02',b'\x01',b'\x04',b'\x03',b'\x06',b'\x05',b'\x08',b'\x07',b'\0x99'] port = "" hdr = header vs = vsos() ''' version = "" totalPackLen =0 tvlHeaderLen = 8 platform = "" frameNumber = 0 timeCpuCycles = 0 numDetectedObj = 0 numTLVs = 0 ''' def __init__(self,port): self.port = port print("***vital sign init***") def vital_port(self): print("------vital Sign ---- ok:" + self.port) def showHeader(self): print("**********************") print("PID:\t%d "%(self.hdr.frameNumber)) print("Version:\t%x "%(self.hdr.version)) print("TLV:\t\t%d "%(self.hdr.numTLVs)) print("Detect Obj:\t%d "%(self.hdr.numDetectedObj)) print("Platform:\t%X "%(self.hdr.platform)) print("TotalPackLen:\t%d "%(self.hdr.totalPackLen)) def getvitalSignsOutputStats(self): return self.vs def getHeader(self): return self.hdr def vitalSignsOutputStats(self,buf): try: (self.vs.rangeBinIndexMax, self.vs.rangeBinIndexPhase, self.vs.maxVal, self.vs.processingCyclesOut, self.vs.processingCyclesOut1, self.vs.rangeBinStartIndex, self.vs.rangeBinEndIndex, self.vs.unwrapPhasePeak_mm, self.vs.outputFilterBreathOut, self.vs.outputFilterHeartOut, self.vs.heartRateEst_FFT, self.vs.heartRateEst_FFT_4Hz, self.vs.heartRateEst_xCorr, self.vs.heartRateEst_peakCount, self.vs.breathingRateEst_FFT, self.vs.breathingEst_xCorr, self.vs.breathingEst_peakCount, self.vs.confidenceMetricBreathOut, self.vs.confidenceMetricBreathOut_xCorr, self.vs.confidenceMetricHeartOut, self.vs.confidenceMetricHeartOut_4Hz, self.vs.confidenceMetricHeartOut_xCorr, self.vs.sumEnergyBreathWfm, self.vs.sumEnergyHeartWfm, self.vs.motionDetectedFlag, self.vs.rsv[0],self.vs.rsv[1],self.vs.rsv[2], self.vs.rsv[3],self.vs.rsv[4],self.vs.rsv[5], self.vs.rsv[6],self.vs.rsv[7],self.vs.rsv[8], self.vs.rsv[9]) = struct.unpack('2Hf2H2H28f', buf) except: print("vsos error found:") return (False,self.vs) return (True,self.vs) def tlvRead(self,disp): #print("---tlvRead---") vsdata = vsos idx = 0 lstate = 'idle' sbuf = b"" #*******Message TLV Header 1 ******* mmWaveType1 = 0 length1 = 0 #********Message TLV Header 2****** mmWaveType2 = 0 length2 = 0 while True: ch = self.port.read() #print(str(ch)) if lstate == 'idle': #print(self.magicWord) if ch == self.magicWord[idx]: #print("*** magicWord:"+ "{:02x}".format(ord(ch)) + ":" + str(idx)) #GPIO.output(21, True) idx += 1 if idx == 8: idx = 0 lstate = 'header' rangeProfile = b"" sbuf = b"" #print("--vital header") else: idx = 0 rangeProfile = b"" return (False,vsdata, rangeProfile) elif lstate == 'header': sbuf += ch idx += 1 if idx == 40: #print("------header-----") #print(":".join("{:02x}".format(c) for c in sbuf)) #print("------header end -----") # [header - Magicword] + [Message TLV header] try: '''(self.version , self.totalPackLen, self.platform , self.frameNumber, self.timeCpuCycles, self.numDetectedObj, self.numTLVs, rsv, mmWaveType1, length1) = struct.unpack('10I', sbuf) ''' (self.hdr.version , self.hdr.totalPackLen, self.hdr.platform , self.hdr.frameNumber, self.hdr.timeCpuCycles, self.hdr.numDetectedObj, self.hdr.numTLVs, self.hdr.rsv, mmWaveType1, length1) = struct.unpack('10I', sbuf) except: print("Improper TLV structure found: ") return (False,vsdata, rangeProfile) if disp == True: self.showHeader() #-----[Message TLV header] = 8 bytes ---- print("mmWave Type 1:\t%d "%(mmWaveType1)) print("Data 1 Len:\t%d "%(length1)) sbuf = b"" idx = 0 lstate = 'vsos' #if length1 > 288: length1 = 128 #print("header=>data1=>length:"%(length1)) elif idx > 40: idx = 0 lstate = 'idle' return (False, vsdata ,rangeProfile) elif lstate == 'vsos': #128 Vital Signs Output Status sbuf += ch idx += 1 if idx == length1: #128 #print("-----vital Signs Output Stats----") #print(":".join("{:02x}".format(c) for c in sbuf)) vflag, vsdata = self.vitalSignsOutputStats(sbuf) #print("-----vital Signs Output Stats end ---") if not vflag: lstate = 'idle' return (False,vsdata, rangeProfile) idx = 0 lstate = 'mTLVh' sbuf = b"" elif idx > length1: idx = 0 lstate = 'idle' return (False,vsdata, rangeProfile) elif lstate == 'mTLVh': sbuf += ch idx += 1 if idx == 8: #print(":".join("{:02x}".format(c) for c in sbuf)) idx = 0 try: mmWaveType2 , length2 = struct.unpack('2I',sbuf) except: print("Improper Type2, length structure found: ") return (False,vsdata, rangeProfile) #print("mmWave Type 2:\t%d "%(mmWaveType2)) #print("Data 2 Len:\t%d "%(length2)) #print("mTLVh---state") if length2 > 252: length2 = 252 lstate = 'rangeProfile' rangeProfile = b"" #[Message TLV header] = 8 bytes elif idx > 8: idx = 0 lstste = 'idle' elif lstate == 'rangeProfile': rangeProfile += ch idx += 1 if idx == length2: idx = 0 try: fmt = '{:d}h'.format(int(length2/2)) xd = struct.unpack(fmt,rangeProfile) except: print("Improper rangeProfile data found: ") return (False,vsdata, rangeProfile) #print("---------rangeProfile:" + str(len(rangeProfile))) #print(":".join("{:02x}".format(c) for c in rangeProfile)) #GPIO.output(21, False) #print(xd) return (True,vsdata, list(xd)) elif idx > length2: idx = 0 lstate = 'idle' if __name__ == '__main__': vs = VitalSign() while True: vs.tvlRead(False)
Hi Paul,
For support with vitalsign.py I would reach out to the maker of the python library. TI does not maintain that library.
For another method of quickly seeing heart rate data using a TI EVM please see the TI mmWave lab for IWR1443 Vital Signs. The User's guide will help you get started detecting heart rate and breathing rate with our EVM.
Thank you,
Angie Mitchell