मेरे पास एक बुनियादी ड्राइविंग परिदृश्य 25MPH सामान्य सड़कों के एक्सेलेरोमीटर डेटा के बारे में 32 सेकंड के साथ-साथ लगभग 7 गड्ढे और सड़क का एक मोटा पैच है। एक्सेलेरोमीटर को मेरी कार के डैश बोर्ड पर डबल साइडेड टेप के साथ लगाया गया है।
समस्या: मेरे पास सभी डेटा हैं जो एक्सेलेरोमीटर से शोर है, और मुझे यह पता लगाने के लिए एक सरल तरीका बनाने की आवश्यकता है कि एक गड्ढा घटना हुई है। टाइम डोमेन और एफएफटी में डेटा के कई ग्राफ नीचे दिए गए हैं। एक्सेलेरोमीटर जीफ़ोर्स में माप रहा है
मूल रूप से मैं चाहता हूं कि मेरे आर्दीनो को पता चले कि एक गड्ढा काफी सटीकता के साथ आया है और स्नातक स्तर की गणित और तकनीकों का उपयोग नहीं कर रहा है।
एक्सेलेरोमीटर का नमूना 100 हर्ट्ज पर ज़ेड एक्सिस पर एक सरल 50 हर्ट्ज आरसी कम पास् ट फिल्टर है
Here is the CSV data for the 32 seconds of accelerometer readings TIME, GFORCE format:
http://hamiltoncomputer.us/50HZLPFDATA.CSV
अद्यतन: यह आरडब्ल्यूडब्ल्यू का पूर्ण बैंडविड्थ है, जो उच्चतम नमूना दर पर नमूनाबद्ध किया गया है, जो कि Arduino पर मिल सकता है। डायरेक्ट CSV फ़ाइल डाउनलोड: लगभग 112 सेकंड डेटा
http://hamiltoncomputer.us/RAWUNFILTEREDFULLBANDWIDTH500HZ.csv
ब्लैक ट्रेस RAW अनफ़िल्टर्ड एक्सेलेरोमीटर डेटा है: ब्लू ट्रेस एक बैंडस्टॉप फ़िल्टर द्वारा एफएफटी, डोमिनेट 2 एचज़ेड और 12 एचजेड में पाए जाने वाले चरम आवृत्तियों के आधार पर फ़िल्टर किया जाता है।
गड्ढे की घटना समय डोमेन में इस तरह दिखती है:
निश्चित नहीं है कि एफएफटी में 10 से 15 हर्ट्ज घटक क्या है, क्या यह वास्तविक गड्ढा है, या क्या यह सड़क के खिलाफ पहियों का पहिया हॉप है, या क्या यह कार की गुंजायमान आवृत्ति है?
FFT:
ऐसा लगता है कि यह वास्तविक गड्ढे वाली घटना है, यहाँ HPF @ 13HZ है
मैं वास्तविक समय में गड्ढों का पता लगाने और उनकी गणना करने में सक्षम होना चाहता हूं
ऐसा लगता है कि जवाबी कार्रवाई के लिए निलंबन को 10 से 13 एचजेड की तुलना में बहुत धीमी गति से आगे बढ़ना चाहिए जिससे मुझे लगता है कि गति-बीमारी होगी
अपडेट करें:
एंग्रीई के सुझावों के अनुसार, मैंने एक्सीलरोमीटर 1000 एचजेड की पूरी बैंडविड्थ का उपयोग किया और अधिकतम नमूना दर जो कि मुझे आर्डिनो पर मिल सकती है।
FFT:
यहाँ गड्ढे की घटना और उसके आसपास कुछ धक्कों और सड़क के शोर के डेटा का एक नमूना टुकड़ा है:
डायोड लिफाफा डिटेक्टर सर्किट जोड़ा, उत्पादन एक ही लग रहा है ... त्वरणमापी हमेशा उत्पादन 0 से 3.3Volts नकारात्मक नहीं ...
अपडेट करें:
कई सड़क परीक्षणों से, मैंने Z अक्ष पर अपनी कार में कभी भी 1.6G से 45 MPH तक अधिक नहीं किया, मैंने छद्म आयामी GFS त्वरण उत्पन्न करने के लिए रैंड () का उपयोग किया।
मेरा विचार यह है कि अगर मैं डेटा की 1 से 3 सेकंड की खिड़कियों को देख सकता हूं, तो मैं Z अक्ष के विस्थापन की गणना कर सकता हूं, लेकिन मैं एक्सेलेरोमीटर के बहाव और एकीकरण में त्रुटियों के बारे में चिंतित था। मुझे यहां 90% सटीक होने की आवश्यकता नहीं है,> 70% अच्छा होगा, लेकिन अगर मैं एक समय में एक से तीन सेकंड में विस्थापन को देख रहा हूं तो क्या वास्तविक समय में ऐसा करना संभव होगा? इस तरह मैं देख सकता हूं कि क्या विस्थापन 1 इंच, 2 इंच, 5 इंच से अधिक है। विस्थापन जितना बड़ा था उतना ही मोटा या गहरा था:
क्या आप यह जांच सकते हैं कि क्या मैं यह सही कर रहा हूं, मैं मूल रूप से अपने डेस्कटॉप पर सेट करता हूं, रैंड () का उपयोग करके -1.6 से 1.6 जी तक यादृच्छिक त्वरण उत्पन्न करता है, 3 सेकंड के डेटा को कैप्चर करता है @ एक सिम्युलेटेड 50HZ नमूनाकरण दर
अगर आप * nix चलाते हैं, तो मैं 20mS देरी करने के लिए Windows.h से Sleep () का उपयोग कर रहा हूँ, 50HZ नमूना दर
मैं सिर्फ यह देखना चाहता था कि क्या कोड आपके लिए ठीक है, मैंने अभी तक विशेष बफर नहीं किया है, मैं इसे लागू करने के तरीके पर उलझन में हूं: टिप्पणी की गई कोड, उस वर्ग से है जिसके लिए मैं काम कर रहा हूं , लेकिन मैं इसे अभी तक 100% नहीं समझता। एक परिपत्र बफ़र डेटा की खिड़कियों को सही तरीके से स्थानांतरित करने की अनुमति देगा?
#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;
}
नमूना रन:
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 . . .