6自由度のトラックボールを作りたい(調査編①)
6自由度、つまりXYZ軸の回転と移動を操作できるトラックボールが欲しくなりました
一応商品としては3DConnexionのSpace mouseとかがあります
が、トラックボールが単純に好きなのでこれをトラックボールでできたらなと思っています。
まずどうやって3軸の回転データを手に入れるかを考えます。
自分用メモを含むので詳しく解説していきますが、間違っている可能性高いので
間違っていたら教えていただけると助かります。
トラックボールの仕組み
トラックボールは球体で、3軸すべての方向に360度回りますが、とれるデータは2軸です。
理由はセンサーが普通のマウスと一緒の物を使用していて、このオプティカルフローセンサーというものが平面用だからです。
黄色い点がセンサーとして、緑と赤の線の回転しか取れないということです。
もしもZ軸回転を行ったとしてもXとY軸での回転はないのでセンサーでは読み取れません。(実際にはセンサーの特性上、多少は動きがあると思います。)
Z軸回転も取得する方法
これは単純な話で、Z軸の回転を取得できる場所にもう一つセンサーを置くことです。
これで各センサーの値を取得すればXYZすべての回転がわかります。
各回転軸の移動量/回転角
下のセンサーをSaとして、横についてるセンサーをSbとします
各センサーの値を以下のように格納します。
X = Sa.Y
Y = Sa.X
Z = Sb.X
回転なので、XとYが反転しているのは注意です。
次は回転角を求めます。
センサーからのデータは、ICにもよりますが大体CPIをかけるとインチに変換できると思います。
1インチ25.4mmなのでそれをふまえ以下のように計算します
Xmm = X/CPI*25.4
Ymm = Y/CPI*25.4
Zmm = Z/CPI*25.4
これで移動量(mm)が手に入りました
次に実際の回転角を求めます。
トラックボールの半径をrとして計算します。
円弧の長さLから中心核x°を求める公式は
x°=180ℓ/πr
なのでそれぞれ読み替えていくと以下になります
普通のトラックボールは直径34mmが多いみたいなのでその場合rは17になります
Xd=(180*Xmm)/(πr)
Yd=(180*Ymm)/(πr)
Zd=(180*Zmm)/(πr)
でしょうか・・・・・
合ってますかね💦・・・・・
ただ実際に使うときはDPI調整と称して感度をいじると思うので
一個目の式で事足りそうな気もしています