- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 MPU-6000 加速度计和 Raspberry Pi Zero W 来记录挡风玻璃中的振动数据。我对 Python 还很陌生,所以请耐心等待。
我编写了一个 python2 脚本,用于将 MPU-6000 配置为通过 I2C 进行通信,并将时钟配置为 400 kHz。当加速度计寄存器中有新数据可用时,MPU-6000 会发出中断,该数据被读取、转换为 2 的补码,然后与时间戳一起写入 CSV 文件。加速度计的输出速率配置为 1 kHz。
我遇到的情况是,在对所有三个传感器轴进行采样时,脚本无法将所有数据点写入 CSV 文件。我得到了大约 650 个数据点 pr 轴 pr 秒,而不是 1000 个数据点 pr 轴 pr 秒。我尝试过只编写一个轴,事实证明,每秒 1000 个数据点是成功的。我知道 MPU-6000 有一个可用的 FIFO 寄存器,我可能可以突发读取以获得 1000 个样本/秒,没有任何问题。问题是获取每个样本的时间戳,所以我还没有尝试实现从 FIFO 寄存器读取。
我很可能会在 Matlab 中完成大部分后处理,因此 python 脚本应该做的最重要的事情是以确定的速率将任何形式的传感器数据写入 CSV 文件,并带有时间戳。
有没有办法进一步改进我的 Python 脚本,以便我可以对所有三个轴进行采样并以 1 kHz 的速率写入 CSV 文件?
我的脚本的部分内容如下所示:
#!/usr/bin/python
import smbus
import math
import csv
import time
import sys
import datetime
# Register addresses
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c
samlerate_divider = 0x19
accel_config = 0x1C
INT_Enable = 0x38
def read_byte(reg):
return bus.read_byte_data(address, reg)
def read_word(reg):
h = bus.read_byte_data(address, reg)
l = bus.read_byte_data(address, reg+1)
value = (h <<8)+l
return value
def read_word_2c(reg):
val = read_word(reg)
if (val >= 0x8000):
return -((65535 - val) + 1)
else:
return val
csvwriter = None
def csv_open():
csvfile = open('accel-data.csv', 'a')
csvwriter = csv.writer(csvfile)
def csv_write(timedelta, accelerometerx, accelerometery, accelerometerz):
global csvwriter
csvwriter.writerow([timedelta, accelerometerx, accelerometery,
accelerometerz])
# I2C configs
bus = smbus.SMBus(1)
address = 0x69
#Power management configurations
bus.write_byte_data(address, power_mgmt_1, 0)
bus.write_byte_data(address, power_mgmt_2, 0x00)
#Configure sample-rate divider
bus.write_byte_data(address, 0x19, 0x07)
#Configure data ready interrupt:
bus.write_byte_data(address,INT_Enable, 0x01)
#Opening csv file and getting ready for writing
csv_open()
csv_write('Time', 'X_Axis', 'Y_Axis', 'Z_Axis')
print
print "Accelerometer"
print "---------------------"
print "Printing acccelerometer data: "
#starttime = datetime.datetime.now()
while True:
data_interrupt_read = bus.read_byte_data(address, 0x3A)
if data_interrupt_read == 1:
meas_time = datetime.datetime.now()
# delta_time = meas_time - starttime
accelerometer_xout = read_word_2c(0x3b)
accelerometer_yout = read_word_2c(0x3d)
accelerometer_zout = read_word_2c(0x3f)
# accelerometer_xout = read_word(0x3b)
# accelerometer_yout = read_word(0x3d)
# accelerometer_zout = read_word(0x3f)
# accelerometer_xout_scaled = accelerometer_xout / 16384.0
# accelerometer_yout_scaled = accelerometer_yout / 16384.0
# accelerometer_zout_scaled = accelerometer_zout / 16384.0
# csv_write(meas_time, accelerometer_xout_scaled,
accelerometer_yout_scaled, accelerometer_zout_scaled)
csv_write(meas_time, accelerometer_xout, accelerometer_yout,
accelerometer_zout)
continue
最佳答案
如果您尝试写入的数据是连续的,那么最好的方法是最大限度地减少写入所需的处理量,并最大限度地减少写入的数据量。为此,一个好的方法是将原始数据写入二进制格式的文件。每个数据字只需要写入 2 个字节。 datetime 对象可以转换为时间戳,需要 4 个字节。因此,您可以使用如下格式:
[4 byte timestamp][2 byte x][2 byte y][2 byte z]
Python 的 struct
库可用于将多个变量转换为可写入文件的单个二进制字符串。数据似乎已签名,如果是这种情况,您可以尝试按原样写入单词,然后使用支持签名值的内置库稍后将其读回。
例如,可以使用以下命令将原始数据写入二进制文件:
#!/usr/bin/python
import smbus
import math
import csv
import time
import sys
import datetime
import struct
# Register addresses
power_mgmt_1 = 0x6b
power_mgmt_2 = 0x6c
samlerate_divider = 0x19
accel_config = 0x1C
INT_Enable = 0x38
def read_byte(reg):
return bus.read_byte_data(address, reg)
def read_word(reg):
h = bus.read_byte_data(address, reg)
l = bus.read_byte_data(address, reg+1)
value = (h <<8)+l
return value
# I2C configs
bus = smbus.SMBus(1)
address = 0x69
#Power management configurations
bus.write_byte_data(address, power_mgmt_1, 0)
bus.write_byte_data(address, power_mgmt_2, 0x00)
#Configure sample-rate divider
bus.write_byte_data(address, 0x19, 0x07)
#Configure data ready interrupt:
bus.write_byte_data(address, INT_Enable, 0x01)
print
print "Accelerometer"
print "---------------------"
print "Printing accelerometer data: "
#starttime = datetime.datetime.now()
bin_format = 'L3H'
with open('accel-data.bin', 'ab') as f_output:
while True:
#data_interrupt_read = bus.read_byte_data(address, 0x3A)
data_interrupt_read = 1
if data_interrupt_read == 1:
meas_time = datetime.datetime.now()
timestamp = time.mktime(meas_time.timetuple())
accelerometer_xout = read_word(0x3b)
accelerometer_yout = read_word(0x3d)
accelerometer_zout = read_word(0x3f)
f_output.write(struct.pack(bin_format, timestamp, accelerometer_xout, accelerometer_yout, accelerometer_zout))
稍后,您可以使用以下方法将二进制文件转换为 CSV 文件:
from datetime import datetime
import csv
import struct
bin_format = 'L3h' # Read data as signed words
entry_size = struct.calcsize(bin_format)
with open('accel-data.bin', 'rb') as f_input, open('accel-data.csv', 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['Time', 'X_Axis', 'Y_Axis', 'Z_Axis'])
while True:
bin_entry = f_input.read(entry_size)
if len(bin_entry) < entry_size:
break
entry = list(struct.unpack(bin_format, bin_entry))
entry[0] = datetime.fromtimestamp(entry[0]).strftime('%Y-%m-%d %H:%M:%S')
csv_output.writerow(entry)
如果您的数据收集不连续,您可以使用线程。一个线程会将您的数据读入一个特殊的队列。另一个线程可以将队列中的项目读取到磁盘上。
如果是连续的,如果数据写入速度慢于读取速度,则此方法将失败。
看看特价Format characters用于告诉struct
如何打包和解包二进制数据。
关于Python - 加速度计以 1 kHz 速率读取和写入 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53400637/
大家早上好! 我遇到以下问题:我有传感器加速度计并添加了一个可以帮助我输入另一个 Intent 的按钮,但不知道为什么这个按钮不起作用!有什么建议吗?谢谢帮助!! 程序是这样的: package co
我想使用手机加速计来滚动球中的球。运动有效正确的是,问题在于球撞到墙时。我怎样才能顺利滚动球沿着大球内侧滑动的动画? 这是我当前移动球并检查交点的代码: onSuccess: function
我是 Core Motion 的新手,我很困惑。有人可以用简单的术语解释这些输入衡量的是什么以及它们如何有用吗? 最佳答案 加速度计通过“感觉”施加到设备上的运动力来测量相对于重力的运动。运动力可以描
尝试测量基于距离的加速度(移动加速度计)。如果那是真的 Accelerometer { id: accel dataRate: 1000 / 25 onReadingChang
我需要实现一个震动识别器,我正在使用设备上的加速度计来实现这一点。但是,当我检查从传感器获得的值时,它们似乎因设备而异。例如,我在一台设备上得到 0-8 的值范围作为力(经过一些计算),在另一台设备上
我一直在尝试使用 sensors 实现陀螺仪图像查看器包,然而,结果似乎非常滞后。我在 YouTube 上发现了一个类似的项目它试图实现类似的目标,但正如您在视频中看到的那样,动画也非常滞后。 以下代
我必须找到解决问题的最佳方法,尝试识别 body 运动(口袋里有 iPhone),例如行走、停止、左转/右转、坐下。 我正在考虑只是启发式地查找与每个操作相对应的数据,然后根据该数据(带有阈值)检查传
如何平滑 iPhone/iPod Touch 的加速计? 最佳答案 您可以在使用之前对传入数据应用过滤器来平滑加速度计数据。您要做的第一件事是为您的过滤器设置一个常量。 #define kFilter
我想使用陀螺仪、加速度计和磁力计来获得 3 轴完全平滑的旋转。 第一个问题是我的输出有很大的噪音,我想知道如何消除它。 第二个问题是陀螺仪漂移,我认为应该用卡尔曼滤波器来解决。 第三个问题是加速度计。
我编写了让玩家左右移动的代码,当玩家向左移动时它有一个动画,当他向右移动时它有另一个动画。 这是代码(dt 是 deltaTime): // Moving player desktop
我最近在我的摩托罗拉 Droid 上使用 Android SDK 和适用于 Android SDK 的 Adobe AIR 来研究 Android 加速度计。我注意到加速度计工作得很好,但我想知道
我想创建一个用户在开车时无法打开短信的应用程序(意味着通过检查 android 设备特定速度的加速度计)。在 android 中是否可行,如果是,那么我们如何做到这一点。谢谢。 .尼山贾恩 最佳答案
我正在开发一个 iPhone 应用程序,我们试图在其中计算移动汽车的加速度。类似的应用程序已经完成了这一点(Dynolicious),但不同的是,这个应用程序是为一般城市驾驶而设计的,而不是在拖拉带上
当水平放置在平面上时,我的 Galaxy S4 报告恒定加速度 X:0.2 Y:-0.1 Z:10.4 由于它平稳地水平放置在 table 上,因此期望报告 X:0 Y:0 Z:10.4 通过检查与我
我目前正在开发一个 android 应用程序。我必须用事件时间记录加速度计传感器事件坐标。我得到了像“3497855005850”这样的传感器事件时间戳,但我无法将事件时间戳转换为用户可读的日期时间格
我正在尝试构建一个应用程序,用于从我的手机上读取加速度计的值,该应用程序仅支持 Android 2.1。 如何使用兼容 2.1 的代码从加速度计中读取数据? 最佳答案 从这里开始: public cl
我有两个问题: 1. 是否可以检索 b2Body 的当前 X 坐标?我知道 API GetPosition 但这还不够具体,我需要专门的 X 坐标。 2. 是否可以在我的 UIAcceleromete
Phonegap 加速度计似乎返回如下 y 值: // +10 y axis = straight up = 0/360 deg // -10 y axis = straight down = 180
我一直在使用这个代码 Android: I want to shake it实现摇动运动检测器。但实际上当我在我的智能手机上运行它时,它什么也没做。我尝试使用断点来检查,但它永远不会进入 if (mA
我正在 Android 中开发一个应用程序以及 Android Wear 支持。在查看来自 https://developer.android.com/training/building-wearab
我是一名优秀的程序员,十分优秀!