ARラジコンを作る

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

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

# 開発したもの
![car.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293692/39ee3312-f787-e840-4866-a5dd9cd5e441.jpeg)

![car-run-optimized.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293692/762010aa-b7a2-1455-8453-875d29a2898b.gif)


# システム構成
## 構成図
構成は大まかにこのようになっています。
![ar-car.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293692/8dd66607-1dd6-f951-5600-1bd93967d449.png)

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](http://wiki.ros.org/ja)***を使って開発しました。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


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

- [Oculus GoにRaspiのカメラ画像を表示する&姿勢を取得する](https://qiita.com/hiro-han/items/5303ac758d798f1db587)
- [Oculus Goの姿勢を使ってサーボモーターをコントロールする](https://qiita.com/hiro-han/items/01561be3bfdc484a8407)
- [Raspberry Pi, Arduinoでタミヤラジコンを制御する](https://qiita.com/hiro-han/items/86b2ef8aa589c9f916f8)
- [Raspberry PiでNintendo Switchのプロコンを使う](https://qiita.com/hiro-han/items/ac460a554529e1764171)

その他参考

- [Raspberry Pi 4に Ubuntu server 18.04をインストール](https://qiita.com/hiro-han/items/56c4fb6a1ad4c1713a7f)
- [Raspberry PiでプロコンとPS3コントローラを使用する](https://qiita.com/hiro-han/items/ac460a554529e1764171)

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

Ubuntu server 18.04にROSをインストールする方法は[公式](http://wiki.ros.org/melodic/Installation/Ubuntu)にも説明がありますし、多くの人がまとめているます。


# ビルド & 実行
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でカメラ画像を見つつ、コントローラでラジコンを制御できます。
好きなように遊んでください。