ページ 11

3つのセンサを同期してデータを取得したいです.

Posted: 2012年10月19日(金) 17:30
by オグ
初めまして,オグと申します.

現在,卒業研究で実験車両のプラットフォームをC++言語で構築しています.
その中で,3つのセンサを同期してデータを取得したいのですが,どうもやり方がわかりません.

現在の開発環境,センサ概要は下記のようになっています.
開発環境
●Windows XP
●Visual Studio 2010 C++
●Win32コンソールアプリケーション

センサ(すべてシリアル通信でRS232c→USB→PC)
●レーザレーダ(サンプリングタイム25ms)
●9軸ジャイロセンサ(サンプリングタイム10ms~1000ms:可変)
●車速センサ(サンプリングタイム250ms)


サンプリングタイムが各センサでバラバラなため同期に難航しています.
また,各センサ1つ1つでのデータ取得はできます.


現在は,各センサそれぞれ独立でデータ取得・更新を行い,PCの時間で区切ってそれぞれのデータを引抜いてきて,同期データを取得するようなプログラムを作りたいと思っています.
卒業研究を始めるにあたって,C言語を勉強し始めた様な初心者で申し訳ないのですが,ご回答宜しくお願い致します.

Re: 3つのセンサを同期してデータを取得したいです.

Posted: 2012年10月19日(金) 18:39
by softya(ソフト屋)
はじめまして。
25msや50m周期で揃えれば大丈夫そうに見えますがダメなのでしょうか?
あとどうやっても、マルチタスクOSであるWindows XPの場合は最低数ms台の誤差は出るのですが問題はないですか?

Re: 3つのセンサを同期してデータを取得したいです.

Posted: 2012年10月21日(日) 13:05
by beatle
オグ さんが書きました: 現在は,各センサそれぞれ独立でデータ取得・更新を行い,PCの時間で区切ってそれぞれのデータを引抜いてきて,同期データを取得するようなプログラムを作りたいと思っています.
それなら、各センサは非同期でデータを更新しつつ、メインスレッドからタイマーか何かで各センターのデータが格納されている変数を読み取る、というのはどうでしょうか。

コード:

double sensor_data[3];

//3つのセンサーが非同期にデータを更新する
void raser_rader_received(double value)
{
    sensor_data[0] = value;
}
void gyro_received(double value)
{
    sensor_data[1] = gyro;
}
void velocity_received(double value)
{
    sensor_data[2] = value;
}

// タイマーにより一定間隔で呼び出される
void timer_tick()
{
    // sensor_data[0], ... , sensor_data[2]を使って何らかの処理
}

Re: 3つのセンサを同期してデータを取得したいです.

Posted: 2012年10月31日(水) 19:24
by オグ
softyaさん,beatleさん
ご返答有難うございます.また,連絡が遅れて申し訳ありません.

現状では,9軸ジャイロセンサとレーザレーザの同期については確認できました.(50ms周期)
また,数ms台の誤差は問題ありません.
beatleさんにご指摘いただいた通り,各センサを非同期で更新しつつ,タイマーで各センサのデータを引抜くように,同期プログラムを作成しています.

今,現在で問題となっているのは車速センサの同期方法です.
車速センサを含めて同期を行うと,その他のセンサのデータ取得に200ms程,遅れがでてしまいます.

そのため,車速センサ単体でのデータ取得の時間計測をしたところ,1回データを取得し終わった後に,200msほどループが止まっていることが判明しました.
車速センサのデータ取得についてはReadFile関数で文字列を1行分読み取っているだけです.
【1行分読み込んだ後に次の文字列のヘッダを受信するまで待つ】という処理は行っていません.
現在は,この問題で悩んでいます.

アドバイスを宜しくお願い致します.

Re: 3つのセンサを同期してデータを取得したいです.

Posted: 2012年10月31日(水) 21:34
by softya(ソフト屋)
それだけの情報では何とも言えませんが、
>200msほどループが止まっていることが判明しました.
どの関数で止まっているのでしょうか? 肝心な情報が抜け落ちています。