Tôi có khoảng 32 giây dữ liệu gia tốc của kịch bản lái xe cơ bản 25MPH đường thông thường cùng với việc đánh khoảng 7 ổ gà và một đoạn đường gồ ghề. Gia tốc kế được gắn trên bảng điều khiển của xe tôi bằng băng keo hai mặt.
Vấn đề: Tôi có tất cả dữ liệu gây nhiễu từ gia tốc kế và tôi cần thực hiện một cách đơn giản để phát hiện sự kiện ổ gà đã xảy ra. Dưới đây là một số biểu đồ dữ liệu trong miền thời gian và FFT. Gia tốc kế đang đo bằng GForce
Về cơ bản tôi muốn arduino của tôi biết một ổ gà đã xảy ra với độ chính xác khá lớn và không sử dụng toán học và kỹ thuật cấp độ sau đại học.
Gia tốc kế được lấy mẫu ở 100hz có LỌC PASS THẤP RC 50HZ đơn giản TRÊN Z AXIS
Here is the CSV data for the 32 seconds of accelerometer readings TIME, GFORCE format:
http://hamiltoncomputer.us/50HZLPFDATA.CSV
CẬP NHẬT: Đây là băng thông đầy đủ RAW của gia tốc kế 1000HZ được lấy mẫu ở tốc độ lấy mẫu cao nhất tôi có thể nhận được trên Arduino. Tải xuống tệp CSV trực tiếp: Khoảng 112 giây dữ liệu
http://hamiltoncomputer.us/RAWUNFILTEREDFULLBANDWIDTH500HZ.csv
Dấu vết đen là dữ liệu Gia tốc kế chưa được lọc RAW: Dấu vết màu xanh được lọc bởi bộ lọc bandstop dựa trên tần số cực lớn được tìm thấy trong FFT, Thống trị 2HZ và 12HZ.
Sự kiện ổ gà trông như thế này trong miền thời gian:
không chắc chắn thành phần 10 đến 15HZ trong FFT là ổ gà thực sự, hay nó là bánh xe của bánh xe so với đường, hay đó là tần số cộng hưởng của xe?
FFT:
Có vẻ như đó là sự kiện ổ gà thực tế, đây là HPF @ 13HZ Các tính năng vượt trội của ổ gà dường như được tăng cường
Tôi muốn có thể phát hiện và đếm ổ gà trong thời gian thực
Có vẻ như nó là phản trực giác, hệ thống treo sẽ di chuyển chậm hơn rất nhiều so với 10 đến 13 HZ sẽ gây ra chứng say tàu xe
CẬP NHẬT:
Theo đề xuất của AngryEE, tôi đã sử dụng toàn bộ băng thông của gia tốc kế 1000HZ và tốc độ lấy mẫu tối đa tôi có thể có trên arduino.
FFT:
đây là một mẩu dữ liệu mẫu của sự kiện ổ gà và một số va chạm và tiếng ồn xung quanh nó:
Đã thêm mạch dò đường bao Diode, đầu ra trông giống nhau ... Gia tốc kế luôn xuất 0 đến 3,3Volts không âm ...
CẬP NHẬT:
Từ nhiều thử nghiệm trên đường, tôi chưa bao giờ vượt quá 1.6 MPH trong xe của mình trên trục Z, tôi đã sử dụng rand () để tạo ra khả năng tăng tốc giả của Gforce.
Ý tưởng của tôi là nếu tôi có thể nhìn vào 1 đến 3 cửa sổ dữ liệu, tôi có thể tính toán độ dịch chuyển của trục Z, nhưng tôi lo lắng về độ trôi của gia tốc kế và lỗi trong tích hợp. Tôi không cần phải chính xác 90% ở đây,> 70% sẽ tốt, nhưng nếu tôi nhìn vào sự dịch chuyển ở một đến ba giây một lần thì điều đó có thể làm được trong thời gian thực không? Bằng cách này tôi có thể thấy nếu độ dịch chuyển lớn hơn như 1 inch, 2 inch, 5 inch. Sự dịch chuyển càng lớn thì vết sưng hoặc ổ gà càng cứng:
Bạn có thể kiểm tra xem tôi có làm đúng không, về cơ bản tôi đã thiết lập trên máy tính để bàn của mình, sử dụng rand () để tạo gia tốc ngẫu nhiên từ -1,6 đến 1,6 G, ghi lại 3 giây dữ liệu @ tốc độ lấy mẫu 50HZ mô phỏng
Nếu giống như bạn chạy * nix, tôi đang sử dụng Sleep () từ Windows.h để thực hiện độ trễ 20mS, tốc độ lấy mẫu 50HZ
Tôi chỉ muốn xem mã có phù hợp với bạn không, tôi chưa thực hiện bộ đệm cicular, tôi hơi bối rối về cách triển khai nó: mã nhận xét, là từ lớp tôi đang làm việc cho nó , nhưng tôi chưa hiểu nó 100%. Một bộ đệm tròn sẽ cho phép di chuyển liên tục các cửa sổ dữ liệu phải không?
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <ctime> // USED BY RAND
#include <windows.h> // Used for delay
using namespace std;
#define SAMPLE_RATE 0.020 // Sample rate in Milliseconds
#define GRAVITYFT_SEC 32 // Gravity velocity 32 feet/sec
#define INCH_FOOT 12 // 12 inches in foot, from velocity to inch displacement calculation
int main(int argc, char *argv[])
{
srand((unsigned)time(0)); // SEED RAND() for simulation of Geforce Readings
// SIMULATING ACCELERATION READINGS INTO A CIRCULAR BUFFER
// circular_buffer Acceleration; // Create a new Circular buffer for Acceleration
// cb_init(&Acceleration, 150, 4); // Sampling @ 50HZ, 3 seconds of data = 150, size is float data of 4 bytes
//Simulate a sample run of Acceleration data using Rand()
// WE WILL BE SIMULATING "RANDOM" GEFORCE RATINGS using the rand() function constraining to -1.6 to 1.6 GFORCE
// These ratings are consistent with our road tests of apparently random vibration and Geforce readings not exceeding about 1.6 G's
float Gforce[150]; // Random Geforce for 3 second window of data
float velocity[150]; // Hold velocity information
float displacement[150]; // Hold Displacement information
float LO = -1.6; // Low GForce limit recorded from 6 road tests at different speeds
float HI = 1.6; // High GForce limit recorded from 6 road tests at different speeds
for(int i = 0; i < 150; i++) // 3 Second iwndow of random acceleration data
{
Gforce[i] = LO + (float)rand()/((float)RAND_MAX/(HI-LO)); // Borrowed from Stackexchange : http://stackoverflow.com/questions/686353/c-random-float
if( i == 0) // Initial values @ first Acceleration
{
velocity[i] = Gforce[i] * SAMPLE_RATE * GRAVITYFT_SEC; // Initial velocity
displacement[i] = velocity[i] * SAMPLE_RATE * INCH_FOOT; // Initial Displacement
}
else
{
velocity[i] = velocity[i-1] + (Gforce[i] * SAMPLE_RATE * GRAVITYFT_SEC); // Calculate running velocity into buffer
displacement[i] = displacement[i-1] +(velocity[i] * SAMPLE_RATE * INCH_FOOT); // Calculate running displacement into buffer
}
//cout << endl << Gforce[i]; // Debugging
//cb_push_back(&Acceleration, &Gforce[i]); // Push the GeForce into the circular buffer
Sleep(SAMPLE_RATE*1000); // 20mS delay simulates 50HZ sampling rate Sleep() expects number in mS already so * 1000
}
// PRINT RESULTS
for (int j = 0; j < 150; j++)
{
cout << setprecision (3) << Gforce[j] << "\t\t" << velocity[j] << "\t\t" << displacement[j] << endl;
}
// READ THE BUFFER
//cb_free(&Acceleration); // Pervent Memory leaks
system("PAUSE");
return EXIT_SUCCESS;
}
Chạy mẫu:
GFORCE FT/SEC Inch Displacement Z axis
-0.882 -0.565 -0.136
0.199 -0.437 -0.24
-1.32 -1.29 -0.549
0.928 -0.691 -0.715
0.6 -0.307 -0.788
1.47 0.635 -0.636
0.849 1.18 -0.353
-0.247 1.02 -0.108
1.29 1.85 0.335
0.298 2.04 0.824
-1.04 1.37 1.15
1.1 2.08 1.65
1.52 3.05 2.38
0.078 3.1 3.12
-0.0125 3.09 3.87
1.24 3.88 4.8
0.845 4.42 5.86
0.25 4.58 6.96
0.0463 4.61 8.06
1.37 5.49 9.38
-0.15 5.39 10.7
0.947 6 12.1
1.18 6.75 13.7
-0.791 6.25 15.2
-1.43 5.33 16.5
-1.58 4.32 17.5
1.52 5.29 18.8
-0.208 5.16 20.1
1.36 6.03 21.5
-0.294 5.84 22.9
1.22 6.62 24.5
1.14 7.35 26.3
1.01 8 28.2
0.284 8.18 30.1
1.18 8.93 32.3
-1.43 8.02 34.2
-0.167 7.91 36.1
1.14 8.64 38.2
-1.4 7.74 40
-1.49 6.79 41.7
-0.926 6.2 43.2
-0.575 5.83 44.6
0.978 6.46 46.1
-0.909 5.87 47.5
1.46 6.81 49.2
0.353 7.04 50.8
-1.12 6.32 52.4
-1.12 5.6 53.7
-0.141 5.51 55
0.463 5.8 56.4
-1.1 5.1 57.6
0.591 5.48 59
0.0912 5.54 60.3
-0.47 5.23 61.5
-0.437 4.96 62.7
0.734 5.42 64
-0.343 5.21 65.3
0.836 5.74 66.7
-1.11 5.03 67.9
-0.771 4.54 69
-0.783 4.04 69.9
-0.501 3.72 70.8
-0.569 3.35 71.6
0.765 3.84 72.5
0.568 4.21 73.5
-1.45 3.28 74.3
0.391 3.53 75.2
0.339 3.75 76.1
0.797 4.26 77.1
1.3 5.09 78.3
0.237 5.24 79.6
1.52 6.21 81.1
0.314 6.41 82.6
0.369 6.65 84.2
-0.598 6.26 85.7
-0.905 5.68 87.1
-0.732 5.22 88.3
-1.47 4.27 89.4
0.828 4.8 90.5
0.261 4.97 91.7
0.0473 5 92.9
1.53 5.98 94.3
1.24 6.77 96
-0.0228 6.76 97.6
-0.0453 6.73 99.2
-1.07 6.04 101
-0.345 5.82 102
0.652 6.24 104
1.37 7.12 105
1.15 7.85 107
0.0238 7.87 109
1.43 8.79 111
1.08 9.48 113
1.53 10.5 116
-0.709 10 118
-0.811 9.48 121
-1.06 8.8 123
-1.22 8.02 125
-1.4 7.13 126
0.129 7.21 128
0.199 7.34 130
-0.182 7.22 132
0.135 7.31 133
0.885 7.87 135
0.678 8.31 137
0.922 8.9 139
-1.54 7.91 141
-1.16 7.16 143
-0.632 6.76 145
1.3 7.59 146
-0.67 7.16 148
0.124 7.24 150
-1.19 6.48 151
-0.728 6.01 153
1.22 6.79 154
-1.33 5.94 156
-0.402 5.69 157
-0.532 5.35 159
1.27 6.16 160
0.323 6.37 162
0.428 6.64 163
0.414 6.91 165
-0.614 6.51 166
1.37 7.39 168
0.449 7.68 170
0.55 8.03 172
1.33 8.88 174
-1.2 8.11 176
-0.641 7.7 178
-1.59 6.69 179
1.02 7.34 181
-0.86 6.79 183
-1.55 5.79 184
-0.515 5.46 186
0.352 5.69 187
0.824 6.22 188
1.14 6.94 190
-1.03 6.29 192
-1.13 5.56 193
0.139 5.65 194
0.293 5.84 196
1.08 6.53 197
-1.23 5.75 199
-1.1 5.04 200
-1.17 4.29 201
-0.8 3.78 202
-0.905 3.2 203
-0.0769 3.15 203
-0.323 2.95 204
-0.0186 2.93 205
Press any key to continue . . .