アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下、角速度、加速度、地磁気をセンシング可能なセンサが3種類あります。
・ジャイロセンサー(3軸) 検出範囲:±1000 dps、
・加速度センサー (3軸) 検出範囲:±6G、
・地磁気センサー (3軸) 検出範囲:0.6 mT、感度:0.3 uT/LSB


今、センサからそれぞれ、1サンプルあたり16バイトの諧調値を表す
データがサンプリング周波数毎に送られてきます。

私が実装したのはセンサデータをサンプリング毎に
以下の配列dataに格納するところまでです。
この配列dataに -?~+?のデータが格納されます。
//X軸だけの例
PBYTE data[6];
data[0]→加速度センサX軸の上位バイト
data[1]→加速度センサX軸の下位バイト
data[2]→角速度センサX軸の上位バイト
data[3]→角速度センサX軸の下位バイト
data[4]→地磁気センサX軸の上位バイト
data[5]→地磁気センサX軸の下位バイト

//ここで、質問になります。
この諧調値が入っている配列dataをdouble型配列
に変換したいのです。言語はC言語になります。
固定長から変換するので当然誤差が入って構いません。
おそらく、最上位ビットは符号ビットと思われます。

センサの静止状態で取得してみたデータ例があります。
//取得データ例(すべてX軸)
data[0]→128'・'
data[1]→162'l'
data[2]→0
data[3]→28''
data[4]→255'・'
data[5]→190'セ'

私のポンコツ頭では難しいです。
どうか助けてください。よろしくお願いします。

A 回答 (4件)

おそらく、その関数のマニュアルに


getData( PBYTE data,...)
みたいな感じで書いてあるのでしょうね。
> //取得データ例(すべてX軸)
> data[0]→128'・'
とあるので、実際にはBYTE data[6]等と宣言できているように思えます。

> data[0]→加速度センサX軸の上位バイト
> data[1]→加速度センサX軸の下位バイト
から16bitの整数にする部分は、上位を8ビットシフトして、ビット毎のorを取る
int a ;
double d;
a = (data[0] << 8 ) | data[1] ;
となります。(intは17bit以上と仮定)

今ある情報で言えるのはここまでです。


問題は、この数値の意味です。
ここから先は、そのセンサの仕様書を見ないと、何が正しいかわかりません。


整数の正負表現は一つではありません。それによって、double(や、C言語で普通に使う整数)に変換する方法が違います。(各用語について詳しくは検索でもしてください)
・2の補数
Cの内部表現と同じなので、符号あり16bit整数にキャストするだけ
d=(double)((short)a); /* shortが16bitと仮定 */
・最上位に負号+15bitの絶対値
最上位が1だっら、絶対値に-1を掛けます
d=(double)(a & 0x7fff) ;
if ( (a & 0x8000) != 0 ) { d *= -1.0 ; }
・下駄履き
本来の値に「下駄」を足したもの。本来の値にするには、逆に「下駄」を引く。
計測器だと、この表現も多いです。
d=(double)a - (double)0x8000 ; /* a=本来の値+0x8000 */
・その他、1の補数等。まったくの独自形式の場合もあり

さらに、その数値が何を表すのかは、そのセンサ次第です。
加速度300 だとして、それが300/100=3Gなのか、300/1000=0.3Gなのか 300/256=1.17Gなのか、もっと複雑な計算がいるのか、そのセンサの仕様書で調べなければわかりません。
    • good
    • 0

AD変換した値をビッグエンディアンで格納しているようですね。


PBYTEに関してはANo.2さんの疑問が解決しないとちょっとおかしなことになるようですが、dataに説明のデータが入っているとすると、下記でできませんか(試してはありません)。
short x= (unsigned char)data[1]|((short)(unsigned char)data[0]<<8);
double y = x;
加速度/角速度/地磁気に合わせて計数を掛けるなりn次曲線に近似するなりの後処理が必要だとは思いますが。
    • good
    • 0

いくつかあやしい部分があります。



> PBYTE data[6];

本当にdataがこのように宣言されているのであれば、data[0]~data[6]の内容はBYTEへのポインタのはずです。「上位/下位バイト」という説明と整合しませんし、その後のdata[0]→128'・'などの例からも、data[0] の型はPBYTEではなくBYTEであると考えたほうが正しそうです。
それとも、data[0]~data[6]には本当にポインタが入っていて、例示されている128とか162とかの値はポイントされている先の内容なのでしょうか。

> 1サンプルあたり16バイト

「上位/下位バイト」という説明と合わせて考えると、これはきっと「16ビット (2バイト)」の書き間違いですよね。

それで、その16ビットのデータはどんなフォーマットなのでしょうか? 符号付き16ビット整数? それとも固定小数点数または浮動小数点数? たとえば例に挙がっている
data[0]→128'・'
data[1]→162'l'
は-6G~+6Gの間のどんな値を表しているのですか? 普通の符号付き16ビット整数として考えれば-32606という値になりますが。
センサーのマニュアルにデータフォーマットについて書かれていないでしょうか。その情報がないと、誰にもDOUBLE型への変換はできません。
    • good
    • 0

「上位バイト」とか「下位バイト」とか分かっているならそれにしたがって (符号はとりあえず後回しで) 数値を組み立てればいいはず. たとえば, 10進数で「上位桁が 2, 下位桁が 4」とわかっているときにここから 24 という数値を組み立てるにはどのような式を使えばいいか考えてください.



なお, 符号についてはここにある情報だけでは処理できません. 「最上位ビットは符号ビット」としても, 符号付きの整数がセンサからどのような形式で送られるのかが分からないです.

余談だけど, 「諧調値」はおそらく「階調値」ですよね?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!