ROS2-Foxyでdarknet-ros（Ubuntu20.04+OpenCV4.2+CUDA11.2）

※この記事は過去に私が投稿した記事（[えいあーる・れいの技術日記（はてなブログ）](https://ar-ray.hatenablog.com/)）を修正したものです。

元記事はこちら↓

https://ar-ray.hatenablog.com/entry/2021/03/20/180000

　この記事では、Ubuntu20.04+CUDA11.2でDarknet_rosを動かす方法を環境構築と合わせて説明します。リポジトリを見る限りYOLOv3までの対応だと思います。
　Ubuntu20.04+CUDA11.2+OpenCV4.2+ROS2-Foxy（2021年3月時点ですべて最新）の組み合わせを前提にしています。また、NVIDIAドライバのバージョンは460.32.03です。

## ハードウェア
　次のハードウェアで環境構築しました。

- CPU：Ryzen7 2700x(16threads @4.3GHz)
- GPU：GeForce RTX2080Ti(TU102)
- RAM：16GB DDR4

## Ubuntu20.04LTSの環境構築

### 1．Ubuntu20.04LTSのインストール
- PCをUbuntu20.04を焼いたUSBメモリでブートし、インストールを行います。`minimal installation`でいいです。言語は英語推奨。

### 2．パッケージの更新とインストール

　gccとcmakeはNVIDIA Driverのインストールで必要です。

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install git gcc cmake
```
### 3．NVIDIA Driverのインストール
- https://www.nvidia.co.jp/Download/index.aspx?lang=jp でGPUの種類とOSを選択してダウンロードします。


### 4．nouveauを無効化する

```
echo `blacklist nouveau` >> /etc/modprobe.d/blacklist-nouveau.conf
echo `options nouveau modeset=0` >> /etc/modprobe.d/blacklist-nouveau.conf
sudo reboot
```

### 5．NVIDIA Driverをインストールする

- ログイン画面が表示されたら、Ctrl+Alt+F2を押してCUIログインをします。

```
$ cd ~/Downloads/
$ chmod +x NVIDIA-Linux-x86_64-460.67.run
$ ./NVIDIA-Linux-x86_64-460.67.run

###基本的には質問に対してOKでいいです

$ sudo reboot
```

### 6．ログインしてドライバインストール確認
- 再度ログインしてターミナルを開き、`$ nvidia-smi`でドライバがインストールされているか確認します。

成功例

```
| NVIDIA-SMI 460.32.03    Driver Version: 460.32.03    CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  On   | 00000000:06:00.0  On |                  N/A |
| 24%   32C    P8    22W / 260W |    654MiB / 11016MiB |      3%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A       983      G   /usr/lib/xorg/Xorg                102MiB |
|    0   N/A  N/A      1491      G   /usr/lib/xorg/Xorg                336MiB |
|    0   N/A  N/A      1623      G   /usr/bin/gnome-shell               70MiB |
|    0   N/A  N/A      2349      G   ...AAAAAAAAA= --shared-files       72MiB |
|    0   N/A  N/A     18194      G   ...AAAAAAAA== --shared-files       22MiB |
|    0   N/A  N/A    113055      G   ...AAAAAAAAA= --shared-files       35MiB |
+-----------------------------------------------------------------------------+
```

### 7．CUDA 11.2のインストール

- https://developer.nvidia.com/cuda-downloads に従ってインストールします。

- `$ sudo apt install cuda-11-2`のステップまで終わらせます。
- nanoやvscodeなどで~/.bashrcを開いて環境変数の設定を追記します。2行目についてはcudaのままでもいいし、cuda-11.2などのバージョン指定でもよいです。（バージョンを切り替えがちな人はbashrcに記載しないほうがいいかも）

```
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

### 8．cuDNNのインストール
※かなり面倒な方法なので、もっと楽な方法があれば教えてください。

- https://developer.nvidia.com/rdp/cudnn-download に移動して対応するcuDNNをダウンロードして、`/usr/local/cuda-11.2/include/`と`/usr/local/cuda-11.2/lib64/`にそれぞれファイルをコマンドでコピペし、シンボリックリンクを作成します。

## ROS2のインストール

- https://docs.ros.org/en/foxy/Installation.html に従ってインストールを進めます。OpenCVはFoxy依存なので、`ros-foxy-vision-opencv`パッケージは必ずインストールしてください。（`ros-foxy-desktop`で勝手にインストールされます）

## ROS2用ワークスペースの作成とソースコードのダウンロード

　4つめのコマンドで--recusiveオプションを追加しないように！(OpenCV3のバージョンがダウンロードされてしまいます。)

```
$ source /opt/ros/foxy/setup.bash

$ cd ~/
$ mkdir -p ros2_ws/src
$ cd ros2_ws/src
$ git clone https://github.com/ajaypaul2008/darknet_ros.git
$ cd darknet_ros
$ git checkout foxy

$ git clone https://github.com/kunaltyagi/darknet.git
$ cd darknet
$ git checkout opencv4

$ cd ~/ros2_ws/
$ colcon build
```
- webカメラ用ROS2パッケージもインストールしておきましょう。

```
$ sudo apt install ros-foxy-v4l2-camera
```

## 実行

　あらかじめROS2とワークスペースの環境はロードしておきましょう。

- 1つめのターミナル：`$ ros2 run v4l2_camera v4l2_camera_node __ns:=/color`

- 2つめのターミナル：`ros2 launch darknet_ros darknet_ros.launch.py`


## (YOLOv4)AlexeyAB氏実装のdarknetについて

　Ubuntu20.04LTS+CUDA11.2の場合、コンパイルしてそのまま動きました。MakeFileのパスは適宜変更してください。CUDA11以上を使用する場合は`-gencode arch=compute_30,code=sm_30 \`を削除してください。（CUDA11より、KeplerアーキテクチャのGPUは使えなくなりました。）
![](https://cdn-ak.f.st-hatena.com/images/fotolife/R/Ray_ar/20210320/20210320004142.png)

## トラブルシューティング

- `cannot find -lcuda`というエラーについて：以下のリンクを参照して、バージョンを書き換えてシンボリックリンクを貼り付けてください。

https://github.com/pjreddie/darknet/issues/2024:embed

- `Could not load library libcudnn_cnn_train.so.8`などロードできないという趣旨のエラー：エラーをよく確認して、リンクを正しく貼り直してください。

- `error "OpenCV 4.x+ requires enabled C++11 support"`というエラーが出る：[ROS2用ワークスペースの作成](https://qiita.com/drafts/93baac6cc716dc1862fe#ROS2用ワークスペースの作成)の時点でダウンロードしたリポジトリがOpenCV3用の可能性があります。OpenCV4用のリポジトリをダウンロードしてください。

## 使用したリポジトリ

https://github.com/kunaltyagi/darknet/tree/cb82c21fbbaf06177e49ea20660487b1fbe08d54

https://github.com/ajaypaul2008/darknet_ros/tree/a18840adde6edc48486ede069e98b49649279b6e

### 関連
- Darknet YOLOv3・YOLOv4の作者のリポジトリです。

https://github.com/pjreddie/darknet

https://github.com/alexeyAB/darknet