RaspberryPi4にUbuntu18.04とROSを入れて、モニターレスVNC接続できるようにする

ラズパイにROS環境を構築する方法についてはネットの先輩方が様々な良記事を書かれておりますが、
細かいところで躓いたりしたので、誰かの役に立てればと思い、今回記事にしてみました。

##1.目的
RaspberryPi4にUbuntu18.04を入れてROS(melodic)を動作させる環境を構築する。
また一応デスクトップ環境での確認も行えるよう、GUIとモニターレスVNCの設定も行う。 

##2. Ubuntu18.04のインストール
SDカードへのOSイメージの書き込みからROSインストールまでの基本的な流れについては下記サイトが参考になります。

https://rt-net.jp/mobility/archives/12773

なお今回は、OSイメージは下記サイトでダウンロードできる`Raspberry Pi 3 (64-bit ARM) preinstalled server image`を利用しました。

https://cdimage.ubuntu.com/releases/18.04/release/

###wifiの設定について
netplanを用いてwifi設定を行いますが、参照先サイトの記述だとGUI環境上でwifiや画面共有の設定変更が行えないため、`50-cloud-init.yaml`に`renderer`のプロパティを追記します。
なおssh等行う時ホスト名を利用するため、今回はIP固定にしておりません。

```yaml:50-cloud-init.yaml
network:
    version: 2
    renderer: NetworkManager　<-追記
    ethernets:
        eth0:
            dhcp4: true
            optional: true
    wifis:
        wlan0:
            access-points:
                YOUR-SSID:                    
                    password: "PASSWORD"
            dhcp4: true
            optional: true
```

※備考：ホスト名の変更方法

```
$ hostnamectl set-hostname 新しいホスト名
```
上記コマンドでホスト名を変更して再起動後、sshで`ubuntu@新ホスト名`でsshが可能になっています。

###Ubuntu-desktopのインストール
ネットワークの設定が完了したらGUIのインストールを行います。
[Ubuntu公式のチュートリアル](https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#5-install-a-desktop)では下記コマンドでインストールを行っていますが、自分の場合インストール完了後に再起動するとGUIは立ち上がりませんでした。。

```
$ sudo apt install ubuntu-desktop
```
なので、下記方法でGUIをインストールします。

```
$ sudo apt install tasksel
$ sudo tasksel install ubuntu-desktop
```

上記コマンドでインストール完了後、再起動するとGUIが立ち上がるはずです。

##3. ROSのインストール
一つ一つコマンドを叩いていくのも面倒なので、[ROS講座](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)のスクリプトを真似させていただき、下記のようなシェルスクリプトを用意して実行させます。

```sh:ros_install.sh
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654


sudo apt-get -y update
sudo apt-get -y upgrade


sudo apt-get -y install ros-melodic-desktop
apt-cache search ros-melodic

sudo rosdep init
rosdep update


echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
source /opt/ros/melodic/setup.bash

sudo apt-get -y install python-rosinstall
```
なお今回インストールするROSは、ラズパイ上でシミュレーションは行わせるつもりはないため`ros-melodic-desktop`を選択しました。
上記スクリプトの処理が終わったら、一度再起動します。

```
$ sudo reboot
```

再起動完了後、turtlesim等でROSが動作しているか確認を行います。

```
$ roscore
//別端末
$ rosrun turtlesim turtlesim_node
//別端末
$ rosrun turtlesim turtle_teleop_key
```
上記確認で特別問題がなければROSのインストールは完了です。

##4.VNCの環境設定
基本的にはsshで作業を行うためGUIは必ずしも必要ではないですが、ラズパイ側のGUIを用いて確認したい事(RealSenceのViewer等)もあったりします。
そこで今回は下記方法でモニターレスのVNC環境を作っていきます。

まず、ラズパイにモニターを繋げた状態でのUbuntu側のVNC設定や、win/macからの接続については、下記サイトの方法にて行うことができます。

https://www.yokoweb.net/2019/12/09/ubuntu-18_04-desktop-vnc-remote/

ただ、このままではラズパイにモニター無しで繋げた状態でのVNC接続が行えないため、Ubuntu側の自動ログイン設定と、仮想モニターの設定を行います。

https://linuxfan.info/ubuntu-1804-auto-login

https://note.com/nakachandayo/n/n9a5a75ccfbbe

ここでの注意ポイントとして、仮想モニターの設定だけだとVNC接続はできません。Ubuntu側はログインしている状態でないとVNC接続できないため、自動ログイン設定を行ってください。
また、仮想モニター設定済の状態だとラズパイにモニターを繋げてもGUIは表示されないため、先に自動ログインの設定をする事をオススメします。
※[ログイン前の状態からVNCを行う方法](https://mixture.dcmnjp.net/linux/ubuntu/x11vnc.html)もあるようですが、自分の用途としてはログイン済でも問題ないので、今回はここまでとします。

##まとめ
以上、ネット上の先輩方の力をお借りしつつ、ラズパイ4上にUbuntu18.04とROS melodicの環境構築を行いました。

当初Ubuntu ServerとしてCLIのみで利用するつもりだったのですが、今後のことも考えて一応GUIも準備しておくか！と考えた結果、
上記にも書いたubuntu-desktopのインストール失敗が原因で、~~何を考えたのか~~~OSをraspbianやxubuntuに変えて試してみたりしていたらあっという間に時間が溶けていきました。。(特にraspbianのROSビルド。。)

正直蛇足な部分で時間を消費した感もありますが、これも開発の醍醐味ということで(~~;)

※上記一連の流れでご不明点がございましたら、可能な限り回答したいと思いますので、コメントいただければと存じます。