ARラジコンを作る


モチベーション

最近、AR、VRデバイスが続々リリースされていますが、ラジコンにカメラを載せて、このカメラ画像をVRゴーグルにデバイスに表示して遊びたい!
ということで作ってみました。
(現状は、VRゴーグルに画像を表示して走るラジコン、というとこまでです。ARで何かを表示するというのは、これからになります。)

のんびり開発していたら先日ARマリカーが発売されてしまいました・・・。やりたいことはARマリカーとほぼ同じです。

開発したもの

システム構成

構成図

構成は大まかにこのようになっています。

Oculus Goとコントローラ以外はラジコンの上に載っています。載せるための台は、適当にプラ棒などで作りました。

ハードウェア

  • Oculus Go
  • Raspberry Pi 4 Model B
  • Arduino Uno
  • タミヤ ワイルドウィリー2
  • サーボモータ SG-90
  • Raspberry Pi Camera Module V2.1
    • USBカメラも可
  • Nintendo Switch Proコントローラー
    • Bluetoothで使用できるコントローラなら何でも可
  • 各ケーブル(ジャンパケーブル、USBケーブルなど)
  • バッテリー

バッテリーは、持っていたモバイルバッテリーをラズパイに繋げたら動いたのでそのまま使っています。が、容量が若干足りていないので、ラズパイで使えるバッテリーを探して使用することをお勧めします。

環境・言語

  • 環境
    • Ubuntu 18.04 (Raspberry Pi)
    • ROS, ROS#, ROS Serial
  • 言語
    • c++
    • Unity

今回、各デバイス上で動くアプリはROSを使って開発しました。ROSにはアプリ間の通信や、センサデータの取得など色々な機能が揃っているので便利です。
また、ROSはUnityとArduinoをサポートしており、これらのアプリの開発にも使用しました。

開発

ソースコード

今回開発したソフトウェアはgithubで公開しています。
- https://github.com/hiro-han/ar-car-camera-controller
- https://github.com/hiro-han/ar-car-car-controller
- https://github.com/hiro-han/ar-car-arduino-controller
- https://github.com/hiro-han/ar-car-car-control-msgs

各機能の開発

各機能の開発方法についての詳細は、以下リンクを参照して下さい。

その他参考

※僕は電子工作についてはあまり詳しくありません。動くものはできましたが、安全かどうか、と言われると自信がありません。
Arduinoに繋いだモータを手動で回したらArduinoに電気が流れて回路が壊れるのでは?という気もしています。このあたり、詳しい方がいらっしゃたらご教授いただけると幸いです。(フォトカプラを使えばいい・・?)

Ubuntu server 18.04にROSをインストールする方法は公式にも説明がありますし、多くの人がまとめているます。

ビルド & 実行

githubからソースコードをcloneして、動かす手順は以下になります。

  • 前提
    • Raspiで専用カメラ、Bluetoothが使用できること
    • ROSの環境構築ができていること
    • コントローラ(/dev/input/js0)とArduino(/dev//dev/ttyACM0)が一般ユーザで使用できること

ビルド

# ソースコードのクローン
$ cd {catkin_workspace}/src
$ git clone https://github.com/hiro-han/ar-car-car-controller.git car_controller
$ git clone https://github.com/hiro-han/ar-car-car-controller.git car_controller
$ git clone https://github.com/hiro-han/ar-car-arduino-controller.git arduino_controller
$ git clone https://github.com/hiro-han/ar-car-car-control-msgs.git car_control_msgs

# ビルド
$ cd {catkin_workspace}
$ catkin_make
$ source devel/setup.bash

# Arduinoにソフト書き込み
$ catkin_make arduino_controller_firmware_arduino_controller
$ catkin_make arduino_controller_firmware_arduino_controller-upload

実行

Launchファイルの作成

IPアドレスは、それぞれの環境に合わせて変更してください。

ar-car.launch
<launch>
  <include file="$(find rosbridge_server)/launch/rosbridge_websocket.launch" /> 
  <param name="rosbridge_websocket/address" value="192.168.4.8"/>
  <node name="uvc_camera" pkg="uvc_camera" type="uvc_camera_node"/>
  <node name="joy_node" pkg="joy" type="joy_node" />
  <node name="camera_controller" pkg="camera_controller" type="camera_controller_node"/>
  <node name="car_controller" pkg="car_controller" type="car_controller_node">
    <param name="controller_type" value="ProCon" type="string" />
  </node>
  <node name="arduino_controller" pkg="rosserial_python" type="serial_node.py">
    <param name="port" value="/dev/ttyACM0" />
  </node>
</launch>

実行

1.ROSの実行

$ roslaunch ar-car.launch

2.Oculusアプリの実行

最後に

これでOculus Goでカメラ画像を見つつ、コントローラでラジコンを制御できます。
好きなように遊んでください。