【Rover C ProをObnizで動かす】遠隔操作できる自宅監視カメラ(コントローラー作成)

  • 2021.06.14
  • IoT
【Rover C ProをObnizで動かす】遠隔操作できる自宅監視カメラ(コントローラー作成)

前回からの続きです.

Obnizサーバー上のコントローラーを操作→その入力値を取得→値を16進数に変換後、ラズパイ側(ペリフェラル)にBLE通信で送る→ラズパイ側で10進数へ再変換→モーターを動かす.
上記の流れについてその都度メモしていたものを雑記ですが今回まとめました.

スティックの押し具合をどのように値として操作機器(ラズパイ)に送るか、その考え方の参考にでもなれば幸いです.

コントローラーについて

roverc_hat

x,y座標を以下のようにf、r、l、bとして細分化する.

バーチャルコントローラ

コントローラーから取得した入力値を係数としてどのホイールをどのように回転(正転、逆転)させるか決める.
また、上図の座標においてマイナスの範囲が存在するものの、係数として使用する際には絶対値として用いる.

メカナムホイール計算方法

上記については以下で既に説明しております.

コントローラスティックで入力した値を4方向(f,l,r,b)の値へと変換する

プログラムを以下に記す.

また、ラズパイ側へ送る際は以下の関数で符号付きの16進数へと変換する.

試しにラズパイ側へ送送ってみると以下のような結果を得ることができた.
(←:ラズパイ側、→:Obniz側)

座標を送信

上の結果におけるラズパイ側の処理(取得データの解析方法)を次に説明する

Obnizから取得したデータをラズパイ側で解析する

以下を参考にまずは符号つき16進数を10真数へと変換する
Pythonで符号付16進数データを正負の10進数に変換(データ解析前処理)

ただし、xor部分については0b11111110ではなく0b11111111、さらに+1する必要があった.(値が少し小さくなってしまうため)
以下のように訂正(変換したい値が4つあるため、dataOut_Decを配列にしている)
dataOut_Dec = (int(bin(int(dataIn_Hex, 0) ^ 0b11111110), 0)) * (-1)

dataOut_dec.append((int(bin((int(data_hex, 0) ^ 0b11111111) + 1), 0)) * (-1))

変換したら、以下のように小数第一位の数値に変換およびf,b,l,rに代入する.
また、ここで更に10で割り、小数へと変換する.

左前、右前、左後、右後の車輪のスピードを保持した「self.speed = [0,0,0,0]」に各方向のエネルギーの結果を代入する.

そして最後に各モーターに書き込む.

バーチャルパッド描画

バーチャルパッドは以下のように描画.
(参考:https://qiita.com/Yamazin/items/2056deb0507d97dbcf1f )

また、タッチイベントは以下の様にする.

終わりに

バーチャルパッドを使ってのラジコン操作が可能となりました.
今回UIはJSで作りましたが、応用すればPS4コントローラーなどでも全然いけるかと思います.
また、制御関連にあまり手を加えていないこともあり、必要以上に進んでしまうなどオーバーシュートが目立ちます.
ここら辺のチューニングはガジェットの機能を一通り実装してから着手したいと考えています(ロボット工学について絶賛勉強中でございますゆえ).