加速度センサーのデータ特性の分析とフィルターの設計


13

基本的な運転シナリオである25MPHの通常の道路の約32秒分の加速度計データと、約7個のくぼみと道路の大まかなパッチがあります。加速度計は、両面テープで私の車のダッシュボードに取り付けられています。

問題:加速度計からのノイズの多いすべてのデータがあり、ポットホールイベントが発生したことを検出する簡単な方法を作成する必要があります。以下は、時間領域とFFTのデータのグラフです。加速度計はGForceで測定しています

基本的に、私は私のarduinoに、大学院レベルの数学と技術を使用せずに、かなり高い精度でpot穴が発生したことを知ってほしい。

100hzでサンプリングされた加速度計には、Z軸に50HZ RCローパスフィルターがあります。

Here is the CSV data for the 32 seconds of accelerometer readings TIME, GFORCE format:

http://hamiltoncomputer.us/50HZLPFDATA.CSV

更新:これは、Arduinoで得られる最高のサンプリングレートでサンプリングされた加速度計1000HZのRAWフル帯域幅です。CSVファイルの直接ダウンロード:約112秒のデータ

http://hamiltoncomputer.us/RAWUNFILTEREDFULLBANDWIDTH500HZ.csv

黒いトレースは、フィルタリングされていないRAWの加速度センサーデータです。青色のトレースは、FFT、Dominate 2HZ、および12HZで検出された極端な周波数に基づくバンドストップフィルターによってフィルタリングされます。

http://img213.imageshack.us/img213/194/rollout.png

時間領域では、ポットホールイベントは次のようになります。 ここに画像の説明を入力してください

FFTの10から15HZの成分が何なのか、実際のポットホールなのか、それとも道路に対する車輪のホイールホップなのか、それとも車の共振周波数なのかわかりません。

FFT:

FFT

実際のポットホールイベントのように見えますが、ここはHPF @ 13HZです。ポットホールの主要な機能は強化されているようです

http://img69.imageshack.us/img69/8663/hpf13potholefft.png

ポットホールをリアルタイムで検出してカウントできるようにしたい

サスペンションは、動揺病を引き起こす10〜13 HZよりもずっと遅く動くはずです。

更新:

AngryEEの提案に従って、加速度計1000HZの全帯域幅と、arduinoで得られる最大サンプリングレートを使用しました。

FFT:

FFT未フィルタリングデータ全帯域幅

ポットホールイベントとその周辺のバンプとロードノイズのサンプルデータを次に示します。

ファイルされていないデータポーリングイベント

ダイオードエンベロープ検出器回路を追加、出力は同じように見えます...加速度計は常に0〜3.3ボルトを出力します... ここに画像の説明を入力してください

更新:

多くの路上試験から、Z軸上の私の車で1.6Gの最大45 MPHを超えることはありませんでした。rand()を使用して擬似ランダムGforce加速を生成しました。

私の考えは、1〜3秒のデータウィンドウを見て、Z軸の変位を計算できる場合ですが、加速度計のドリフトと積分の誤差が心配でした。ここで90%でさえ正確である必要はありません。> 70%は良いでしょうが、一度に1から3秒の変位を見ている場合、それはリアルタイムで可能ですか?このように、変位が1インチ、2インチ、5インチなどより大きいかどうかを確認できます。変位が大きいほど、バンプまたはポットホールは粗くなります。

私がこれを正しく行っているかどうかを確認できますか?基本的にデスクトップで設定し、rand()を使用して-1.6から1.6 Gのランダムな加速を生成し、50HZのサンプリングレートで3秒間のデータをキャプチャします

* nixを実行する場合は、Windows.hのSleep()を使用して20mSの遅延、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 . . .

3
きれいに詳細な説明。ただし、これを編集して、特定の比較的狭い質問を述べると、焦点を絞った回答が得られます。
アニンドゴーシュ

一般的な特定の質問を書きました、生のノイズの多い加速度計信号からポットホールが発生したことを検出する方法が必要です。arduinoのようなマイクロコントローラーがポットホールイベントをリアルタイムで検出できるようにする有用な機能または検出方法を抽出
zacharoni16

ポットホールイベントは、ポットホールに関係なく存在する振動よりも遅いため、代わりにLPFを使用して、ポットホールの近くにある素敵なバンプを強化する必要があります。移動平均フィルターはそれを行うことができるかもしれません。生活を楽にするために、LPFの前に測定の代わりにabs値を使用することを検討することもできます。
チンタラギリシャシャンク

情報を更新しました。ありがとうございます。移動平均に取り組んでいます。サスペンションの共振は約12.5HZのようです。ハードウェアのLPFの周りにカットオフがあると思います
-zacharoni16

適切なサンプルCSVファイルなどを提供します。上記のデータが利用可能であるとあなたが言うところは、リンクとして機能しないようです。
オリンラスロップ

回答:


12

これは、かなり単純なフィルタリングで解決できるようです。元のデータは次のとおりです。

ここで適切な詳細レベルで個々のイベントで何が起こっているかを見るには多すぎます。次に、2番目の26〜28のデータのみを示します。

私はもともとこれをローパスフィルターにかけると思っていましたが、そこには低周波信号がないのでうまくいきません。代わりに、高周波信号の振幅が上がります。以下はオリジナルに重ねられたローパスです:

これは、ポットホールイベント中ではなく、信号の「平均」にかなりよく従っていることに注意してください。元の信号からこの平均値を引くと、イベント中のこの平均値からの逸脱が他の場合よりもはるかに大きくなります。別の言い方をすれば、本当に必要なのはハイパスフィルターです。元の値からローパスを差し引くことでこれを実現しますが、本番システムでは明示的にハイパスフィルタリングを行うことでこれを行います。とにかく、ここにハイパスフィルタリングされたオリジナルがあります:

これは、イベントを検出するための明らかなアプローチを示しています。イベント中の信号振幅は、他の場合よりもはるかに多くなります。これは、RMSを計算し、いくつかのローパスフィルタリングを適用することで検出できます。

データ全体をズームバックすると、次のように表示されます。

これにより、データ内の5つのイベントが明確に識別されますが、それがこのデータが示すはずのものかどうかはわかりません。イベントをより詳細に見ると、ピークの前後約1秒でそれぞれのディップが低いことがわかります。これは、現在のRMS信号を単純にしきい値処理するだけでは十分でない場合、さらに多くのことができることを意味します。たとえば、どちらの方法でも1秒以内に最低点に対する点の高さを探す単純なアルゴリズムは、バックグラウンドノイズをさらに減らす必要があります。同じことについて別の言い方をすると、この信号を区別して、1秒間の上昇を探します。ポットホールイベントは、ダブレットによって検出されます。つまり、高いピークに続いて低いピークが検出されます。

これを見る別の方法は、RMS信号をバンドパスすることです。既にローパスフィルター処理されていますが、急勾配の急なイベントを探しているため、低周波数の一部を除去することで、バックグラウンドノイズを減らすこともできます。

ここからの信号を改善する方法はたくさんありますが、少なくとも最初のパスの有用な結果に到達する方法を示したことを願っています。

追加:

ピークの両側のディップがうまく機能するかどうか興味があったので、試してみました。前のプロットのRMSから始まる非線形フィルターを使用しました。各ポイントの値は、前の1秒間の最低ポイントと次の1秒間の最低ポイントを超えた最小値です。結果は非常に良く見えます:

5つのピークのうち最も低いピークは、最も高いバックグラウンドノイズの3倍以上です。もちろん、これらの5つのバンプが検出したいイベントを表し、残りはそうではないと仮定しています。

コメントへの応答で追加:

私は時間領域でフィルタを行ったので、周波数応答を直接知りません。ローパスフィルターの場合、入力信号をCOS ^ 2フィルターカーネルで畳み込みました。私の記憶が正しければ、カーネルの半径(中心から端までの距離)は数100ミリ秒です。プロットがよく見えるまで、この値を試しました。RMSをローパスフィルター処理するために、同じフィルターカーネルを使用しましたが、今回は半径が約1秒です。正確には覚えていません。良い結果が得られるまで実験してください。

非線形フィルターはダブレットを検出しませんでした。前にも言ったように、1秒前に現在のポイントとすべてのポイントの最低点の差を見つけ、1秒以内に現在のポイントとすべてのポイントの最低点の差を見つけました。それから私はそれらの2つの分を取った。

私が使用したソフトウェアは、この目的のためにハックしたプログラムでした。CSVファイルの読み取りと書き込みを行うためのさまざまなルーチンが既にあったため、記述する必要があるのはフィルタリングコードだけで、これは非常に簡単です。残りは、CSVファイルを操作およびプロットするための既存のプログラムで行われました。


うわー、これは非常にエキサイティングな結果です。あなたは実用的な用語で物事を説明する素晴らしい方法を持っています。HPFで使用したカットオフ周波数と、完璧に見えるRMS信号のLPFカットオフに興味があります。また、ダブレットの検出に使用した非線形フィルターは、matlabまたは設計アプリケーションでそれを行いましたか?ハードウェアでもこれを設計したいと思います。5つのピークがヒットした5つのポットホールと一致します。素晴らしい結果です!私はMATLABを有し、またSciDavis使用されて
zacharoni16

@zach:私はあなたの質問のいくつかに対処するために私の答えを更新しようとします。残念ながら私の回答はコミュニティwikiに変換されたため、最初に修正するためのmodを待っています。このCWのことは、何かに時間を費やすと本当にひどくなり、突然、もう所有しなくなります。
オリンラスロップ

@OlinLathrop編集すると元に戻ります。編集が完了したら、元に戻すようにフラグを設定する必要があります。私は今それを行いますが、再度フラグを立てなければならない場合でも驚かないでください。CWについての不満については、4〜6か月に1回CWを元に戻す必要があります。編集が多く、ユーザーがCWになりたくない非常に狭い状況について話していると思います。トニーや他の状況に対処するのに比べて、これは対処するのに理想的な旗、簡単できれいなカットについてです。:)
Kortuk

1
@Andrew:回答の最後の段落で述べたように、CSVファイルとライブラリルーチンを操作して、それらを簡単に読み書きできるさまざまな定型プログラムがあります。その上にフィルタリングコードを追加するのは簡単です。ほとんどのフィルターは、数行実行されるコードのほんの数行です。上記のように1回限りのテストでは、すべてが即座に終了するため、プロセッサを効率的に使用する必要はありません。たとえば、テーブルを作成する代わりに、必要に応じてCOS関数を呼び出しました。
オリンラスロップ

1
@OlinLathropあなたが答えで言及したことを見ましたが、カスタムスクリプトが設定されているかどうか、Matlabまたはそれを実行するものか、あなたがしたことを知りませんでした。どうやってやっているのか教えてくれますか?魅力的ですね。缶詰のグラフィックライブラリを使用して出力を表示していますか?Excelでダンプしてプロットするか、gnuplot / octaveまたは...を使用していますか?
akohlsmith

2

エッジ検出ポットホールは、トラブルを求めている可能性があります。センサーから見た実際の振動ははるかに高い周波数であるため、車の振動エンベロープが答えがあります。RMSからDCを使用して、約15Hz以上で応答し、低域通過します。


1000HZのフルセンサー帯域幅で別のテストを行い、Arduinoでシリアル上で可能な限り高速でサンプリングしました。同様の結果を得る。2HZと13HZの支配的な周波数と比較して、17HZを超える周波数はすぐに消滅しますが、9〜13.5HZのものがどこから来るのかはまだわかりません。加速度計はダッシュボードに取り付けられています。サスペンションは明らかに9〜13HZで動いていないか、狂ったように跳ね回っています。RMSからDCへの意味がわかりませんか?
zacharoni16

加速度計は何らかの方法で車に取り付けられています。何らかの方法で車台にボルトで固定したとしても、ボルトは周波数を抑制および増幅できます。車は、多くの異なる周波数で物が振動するのに十分に複雑な獣です。AC信号をDC RMS値に変換する回路(およびおそらく数学アルゴリズム)があります。検索で見つけられるはずです。これは、高周波振動を振幅に変換することにより、信号のエンベロープを生成するのに役立ちます。
チンタラギリシャシャンク

半波整流器(ダイオード)はどうですか?しかし、それはすべてを正のピークに変換し、ポットホールイベントは-Gを引くか、これは問題になりませんか?
zacharoni16

それが問題になるとは思わない。あなたの振動振幅は、支配的な効果であるほど十分に高いようです。ただし、信号を見て、代わりに小さなポットホールを見逃さないように、完全な波整流をお勧めします。
チンタラギリシャシャンク

Shashack上記の投稿回路を追加しましたが、出力はほとんど変わりませんでした。RC時定数を2mS前後に選択し、2mSでサンプリングしています500サンプル/秒
zacharoni16

2

周波数領域フィルターまたはしきい値を探す代わりに、「典型的な」ポットホールのカーネルを考え出し、それと実行相関をとることをお勧めします。これはテンプレートマッチング技術と見なされ、マイクロコントローラプラットフォームに適しているようです。

簡単なレビューについては、http: //scribblethink.org/Work/nvisionInterface/vi95_lewis.pdfを参照してください。DOBBS、STEVEN E.、NEIL M. SCHMITT、HALUK S. OZEMEKを参照してください。「マイコンのリアルタイム相関を使用したテンプレートマッチングによるQRS検出」Journal of Clinical Engineering 9.3(1984):197-212。

より強力なプラットフォームを使用している場合は、ウェーブレットをスピンすることをお勧めします。


ありがとう:)、これは非常に難しいようですが、何か不足していますか?
zacharoni16

単純なフィルターよりも難しいですが、完了したときに望んでいることを行う可能性が高くなります!どうしても、MatlabやRのようなもので動作するようになるまで、マイクロコントローラーに実装しようとしないでください
Scott Seidman

「フィルター」をリアルタイムで実行するには、タイムステップごとに周波数領域の乗算を実行するのではなく、おそらくそれを畳み込みとして処理します。相互相関(テンプレートマッチングへの主なアプローチ)は、インパルス応答の時間スケールが畳み込みのように反転せず、このインパルス応答を「テンプレート」と呼ぶことを除き、まったく同じ操作になります。 。次に、そのテンプレートが必要なものを把握する必要があります。
スコットサイドマン

この回答のおかげで、現在のスキルレベルを上回っているように思えるので、それを実装するにはさらに多くの調査と研究を行う必要があります。努力を感謝します
-zacharoni16

2

別のアプローチでは、信号の移動分散を計算して、ポットホールが実際に突き出ているかどうかを確認します。これは、Nポイント幅の移動分散フィルターのmatlab関数です-計算にたたみ込みを使用して巧妙に(自分で言う必要がある場合)

function y=movingvar(X,N)
% y=movingvar(X,N)
% Calculates N-point moving variance of  Vector X
% Highly recommend that N be odd (no error checking)
% Note: first and last N/2 points will be unreliable.
% Output will be a column vector.


X=X(:);
XSQR=X.*X;
convsig=ones(1,N);
y=(conv(convsig,XSQR)-(conv(convsig,X).^2)/N)/(N-1);

y=y(ceil(N/2):length(X)+floor(N/2));

これは標準偏差の計算に似ていますか?
zacharoni16

うん、ちょうど二乗
スコット

1

私が最初に考えたのは、ローパスフィルターは使用するのに間違ったタイプのフィルターかもしれないということです。ポットホールは、基本的に、ステップ関数または方形波のような高周波イベントです。50Hzでフィルタリングされたデータを見ると、ポットホールに関する情報が失われているように思われます。ポットホールイベントに大きな違いはなく、すべて同じ波線のように見えます。最初にハイパスフィルターを使用し、次にはるかに高い周波数のローパスフィルターを使用します。加速度計がすでにローパスフィルターされている場合は、ローパスフィルターを完全に回避することができます。

ハイパスフィルターデータを取得したら、しきい値が適切に設定された単純なコンパレーターが、ポットホールに起因する加速度データのピークを抽出し、それらをカウントできると思います。


RC 50HZフィルターを外すと、加速度計はデフォルトの500HZまたは1000HZ LPFを使用します。これは、機械的振動を得るのに十分な高さでなければなりません。サンプルレートを100HZから1000HZに増やし、さらにデータを投稿します。洞察力をありがとう
zacharoni16

私は、イベント、これはどのようにフィルタを上混乱さ:(同様のデータを取得しているようだとポットホールを隔離し、バンプ、完全な加速度センサーの帯域幅と高速サンプリングを使用
zacharoni16

低域フィルターではなく、高域フィルターを使用すると言いました。フィルター処理されていないデータのFFTを確認したいと思います。
AngryEE

加速度計には1000HZ LPFが組み込まれているので、変更することはできません。フィルタリングされていないデータのFFTをすぐに投稿します
-zacharoni16

それを変更する必要はありません-ポットホールに当たったときの急激な加速から生じる高周波数が必要ですが、通常の乗り心地の穏やかな揺れは必要ありません。信号は、いくつかの主要な過渡スパイクを伴う低周波振動によって特徴付けられるようです。高周波で迅速な過渡スパイクを捕捉したいが、一定の低周波を除去したい場合。したがって、おそらく50Hzまたは100Hz未満のすべてを除外する必要があります。
AngryEE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.