Darkside(https対応しました)

2021年10月12日の記事

2021年10月12日(火) 21:30

gcc が変?

 値は取得できるが、かなりズレている。暫くチェックして、ようやく Jetson Nano 側のプログラムミスに気づいた。取得アドレスがズレていたのだ。正しいアドレスから読み出すと、dsPIC 同様にまっとうな値が返って来た。
 今のセンサー取り付けだと、車体が右に傾くとX値がプラスになり、左に傾くとマイナスになる。レンジはプラスマイナス2Gで、20ビットである。つまり、1Gがモロに掛かると絶対値は262144あたりということになる。実際に車体を横倒しにすると、255179みたいになった。これだと、0.973Gぐらいだ。
 もしかすると、レンジは1G=10メートル毎秒毎秒なのかもしれない。

 HDDの容量が、1ギガ=10億みたいな。

 微妙な違いではあるが、傾斜センサーの値を角度に変換して表示しようとするとそれなりに重要である。あ、2軸の値の比率から角度を求めれば良いのか。左右の傾きだけでなく俯仰も取得したいので、結局3軸の値はすべて欲しい。
 センサーレベルで読むのは簡単だが、読み取り部分はC言語で記述している。それを CPython → Python にリレーしている。Python は複数の返り値を受け取れるが、C言語はそうではない。3つの値を return させるのに、最もスマートなやり方とは?

 XYZそれぞれを取得する別関数を作るのが簡単だが、そうすると傾斜センサーへのアクセスが3回に分かれる。ただでさえ低速なI2Cな上に、dsPIC と共有している。できるだけ、一気読みで済ませたい。
 ここで言語仕様の違いから泥沼にハマるのを避けるべく、少々スマートさに欠けるがC言語の static 変数に保存しておくことにする。一気読みした値を static に保存し、その static から読む別関数を用意する。角度変換などはC言語の中で済ませておいて、Python には結果だけ返すのが良いだろう。

 Python の三角関数は引数がラジアンなので、返り値は−πから+πにすれば扱い易い。
 左右の傾きは、右傾斜が+で左傾斜が−。
 俯仰はもちろん、仰角が+で俯角が−でいいだろう。

 ところで、傾斜センサーは20ビットなので3バイトに渡って読み出すことになる。
 それを signed long に合体させるというのは、案外面倒臭い。dsPIC では union 使って直接変換しちゃってたのだが、同じことを Jetson Nano でやったらなぜか unsigned long が返って来る。union の signed long で受けて signed long に代入しても、負数が最上位ビット1の上での正数として取得されている。左詰めしてみたら、signed long なのに double へ代入すると40億とか。
 これ、どう考えてもコンパイラーのバグだろ・・・しかし ubuntu 上の gcc に、こんなバグあったのか?

 そこまでガチガチに速度追求する必要はないので、符号判定して自前で unsigned を signed に変換する。とりあえず、3軸の値はマトモに取得できるようになった。
 ついでに、センサー温度も読み出してみる。データーシートの記述に従うより5度ぐらい高く出ている。まあ参考程度だから補正してアバウトに使えば良いだろう。せいぜいが、オマケとしてカメラ映像の隅に車内温度として表示するていどだ。

written by higashino [Sタンク 1/16] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL
Darkside(https対応しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4