I am using the Navio+ board for recording IMU data from the MPU9250 and writing it to a .csv file. I’m having problems with it recording reliably. I tried a python script that was roughly based of the AccelGyroMag.py example provided in the GitHub repo, but I’m having problems with the delay. I have looked in the MPU9250.py file for a setting to change the speed of data output on the actual IMU rather than after the data has been sent to the script, but I can’t seem to get it to work.
Is there a “best practices” way of recording data at a very consistent rate? I’d like to record at close to 1000 Hz for frequency analysis.
Specs: Navio+ Board on RPi 3 running Raspbian 8 Jessie
Code tested:
#pull the current UNIX time for the file name
currentUNIXTime = int(round(time.time() * 1000))
#create the file name from the time stamp and the IMU code
fileName = str(currentUNIXTime) + "_" + IMU_CODE + ".csv"
#open a file with the file name and write to it
fileToWrite = open(fileName, 'w')
#write the header string to the file
fileToWrite.write(HEADER_STRING)
#set the counter to 1 because we have written 1 line to the file
counter = 1
#print the number of files written to the user
print "There have been {} files written NAVIO IMU".format(filesWritten)
#while we still have lines left to write to the file
while counter <= secondsPerFile * hertz:
#get the accel, gyro, mag data from the IMU
m9a, m9g, m9m = imu.getMotion9()
#pull a time stamp for the data that we will write
currentUNIXTime = int(round(time.time() * 1000))
#create the string that we need to write to the file
stringToWrite = str(currentUNIXTime) + "," + \
str(m9a[0]) + "," + str(m9a[1]) + "," + str(m9a[2]) + "," + \
str(m9g[0]) + "," + str(m9g[1])+ "," + str(m9g[2]) + "," + \
str(m9m[0]) + "," + str(m9m[1]) + "," + str(m9m[2]) + "\n"
#write the data to the file
fileToWrite.write(stringToWrite)
#increment the counter by 1 because we have written a file
counter = counter + 1
#sleep so that the frequency of recording is correct
time.sleep(freqOfRecording)
#once we have written enough data, close the file
fileToWrite.close()
#increment the files written counter by 1
filesWritten = filesWritten + 1
I had set this script to record at 800 Hz so freqOfRecording was 1/800 of a second for the delay time. This resulted in an actual recording rate of about 390 Hz.
=====================================================================
UPDATE: I have experimented with the AHRS system written in C++, which already prints the frequency of recording. This solves the problem of not knowing what rate the sensor data is being recorded at. I can add in the IMU data and write all of the data to a .csv file from the script.
If I’m missing something glaring, please let me know. Thanks!