Raspberry Pi Camera ModuleをROSで使うメモ．

もともと，RaspberryPi3B+にUbuntu18.04を入れて，ROS（melodic）でUSBカメラから画像処理して云々するつもりでした．
しかし，USBカメラが大きくてスペースが無かったので，ラズパイのカメラモジュールを載せようという話になりました．
とりあえずラズパイにフラットケーブルぶっ刺せば行けるやろ（）とググってみましたが，Raspbianだったり，ROSがIndigoだったり[Raspberry Pi 3にROSをセットアップしてRaspberry Pi純正カメラ(Raspicam)で遊んでみた - karaage. [からあげ]](https://karaage.hatenadiary.jp/entry/2017/04/13/073000)でつまずいたので，未来の自分の為にメモとして残しておきます．

## 環境
- Raspberry Pi 3B
    - このメモ書くまでこいつが3B+だと思っていました……~~まあ違いなんてないでしょ~~
- Ubuntu 18.04.4 LTS (Bionic Beaver)
    - ここからダウンロードしてきました：[Index of /ubuntu/releases/18.04.4/release](http://cdimage.ubuntu.com/ubuntu/releases/18.04.4/release/)
    - arm64版です
- Raspberry Pi Camera Module
    - こいつを買いました：[Amazon | Longruner Raspberry pi カメラモジュール 広角160度 魚眼レンズ 夜間 1080p高解像度 500W画素 ズームレンズ 16ピンFFCケーブル+Pi Zero Zero Wリボンケーブル Raspberry pi 4 3 2 1とpi Zero Zero Wに交換可能 空撮 FPCドローン LC20 ](https://www.amazon.co.jp/dp/B074TVM4MR)
- ROS Melodic Morenia

## 結論
##### 1. /boot/firmware/config.txtの変更

```text:config.txt
[pi3]
#kernel=uboot_rpi_3.bin
kernel=vmlinuz
initramfs initrd.img followkernel

[all]
arm_64bit=1
#device_tree_address=0x03000000
start_x=1
gpu_mem=128
```
config.txtを変えたら，再起動してください．
最後の2行がカメラの設定に必要な行です．
[Raspberry Piと純正カメラモジュールで監視カメラを作る、おそらく正しい方法 jessie版 (motion + v4l2ドライバ) - Qiita](https://qiita.com/rukihena/items/95da3860f9ca86c39f8d)

##### 2. コマンドを打つ．

```bash
$ sudo add-apt-repository ppa:ubuntu-raspi2/ppa
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libraspberrypi-bin libraspberrypi-dev
```
多分必要ないと思いますが，vcgencmdでカメラの接続確認を行うためにインストールしておきます．

##### 3. cv_cameraノードを使う．
ROSのインストールはここの公式を見ればいいので略します．[melodic/Installation/Ubuntu - ROS Wiki](http://wiki.ros.org/melodic/Installation/Ubuntu)
cv_cameraノードをどう使うかも，面倒なので略します．

## 余談 ~~ただの愚痴です~~

最初，config.txtのkernelを変えずにカメラモジュールを使おうとしたら，/dev/video0が生成されず，見事にハマりました．
その後，[ARM/RaspberryPi - Ubuntu Wiki](https://wiki.ubuntu.com/ARM/RaspberryPi#VideoCore)ココらへんを読んでvcgencmdを導入し，カメラの確認をしました．

```bash
$ vcgencmd get_camera
supported=1 detected=1
```
が，それでも/dev/video0が生成されず.
[Raspberry Pi3でカメラモジュールをOpenCVで使う - 電気のDIY](https://seesaawiki.jp/yattemiyo/d/Raspberry%20Pi3%A4%C7%A5%AB%A5%E1%A5%E9%A5%E2%A5%B8%A5%E5%A1%BC%A5%EB%A4%F2OpenCV%A4%C7%BB%C8%A4%A6)ここで出てきた様に
``$ sudo modprobe bcm2835-v4l2``でドライバーを入れようとしてもエラーを返されてドライバーが入らず．
結局ラズパイにUbuntuをインストールし直し，上の手順を踏んだらvideo0が生成されました．

[UbiquityRobotics/raspicam_node: ROS node for camera module of Raspberry Pi](https://github.com/UbiquityRobotics/raspicam_node)こいつがKineticしか対応していないので無理かと思いつつcv_cameraで試したら一発で成功し歓喜しました．

あと，[ARM/RaspberryPi - Ubuntu Wiki](https://wiki.ubuntu.com/ARM/RaspberryPi#Optional_PPAs)ココらへんのOptional_PPAsの項目を読んでいると，raspistillコマンドも使えるようになると思いきや，使えませんでした．
[raspberrypi/userland: Source code for ARM side libraries for interfacing to Raspberry Pi GPU.](https://github.com/raspberrypi/userland)こっちのGithubの説明を読むと，

> Whilst 64-bit userspace is not officially supported, some of the libraries will work for it. To cross compile, install gcc-aarch64-linux-gnu and g++-aarch64-linux-gnu first. For both native and cross compiles, add the option --aarch64 to the buildme command.

という感じで64bit版はサポートしていないみたいでしたが，aptでg++-aarch64-linux-gnuをインストールして，cloneしたやつを直接ビルドしたらraspistillも使えました．（使わない）