ソースを読み解く際の前提条件や仕様は以下のようになっています。
座標系の仕様
座標系を直している関係上、-z方向が前方になっているので注意してください。
![](https://robot-creation-diary.com/wp-content/uploads/2023/01/%E9%96%A2%E7%AF%80%E5%8F%AF%E5%8B%95%E7%AF%84%E5%9B%B2-1024x566.png)
![](https://robot-creation-diary.com/wp-content/uploads/2023/01/%E8%BB%B8%E3%81%AE%E5%9B%9E%E8%BB%A2%E6%96%B9%E5%90%91-1024x918.png)
使用モジュール
python : numpy, numpy-quaternion
Arduino : Adafruit_PWMServoDriver
unity: ROS TCP Connector, Oculus XR Plugin
PC-Arduino uno間のシリアル通信の仕様
![](http://robot-creation-diary.com/wp-content/uploads/2023/03/シリアル通信データ仕様2-1024x469.png)
PC-Arduino Unoシリアル通信は開始フラグ0xFFから終了フラグ0xFEで一つの通信ブロックとなります。角度データは、整数部、小数部(二桁)の順に入っています。2バイトで一組になります。
![](https://robot-creation-diary.com/wp-content/uploads/2023/01/%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%BA%E8%A8%AD%E5%AE%9A%E3%81%AE%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8-1-1024x407.png)
データのサイズは0から253まで取れます。255, 254 は、開始フラグと終了フラグに使われているためです。開始フラグと終了フラグを含んだ大きさが符号なし1バイトで入ります。
![](https://robot-creation-diary.com/wp-content/uploads/2023/01/%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%B5%E3%83%A0%E8%A8%88%E7%AE%97%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8-1024x325.png)
チェックサムは、終了フラグの前に入っています。開始フラグからチェックサムの直前までのデータを
- 0と開始フラグのxor演算
- 1の結果とデータサイズのxor演算
- 2の結果とデータの1番目のxor演算
と順番にxor演算を行った結果が入っています。
チェックサムに0xFF, 0xFE が入っていても問題なく処理されます。
頭の位置
![](http://robot-creation-diary.com/wp-content/uploads/2023/03/headposition.png)
頭の位置は小さなオブジェクトを作成し、そのオブジェクトを”CenterEyeAnchor”に入れて求めています。-0.15ほど後ろに下げています。”Cast Shadow” off で影も消しています。影ありにするとスクリーンにこのオブジェクトの影が落ちてしまいます。