Rover製作11 ロボット用のNUCの事前設定をする

# 環境

この記事は以下の環境で動いています。

| 項目 |	値 |
|:--|:--|
| CPU | Core i5-8250U |
| Ubuntu | 22.04 |
| ROS2 | Humble |

# 概要

EspressoFrameにはメインのコンピューターとしてNUCを搭載しています。
EspressoFrameの電源投入で、NUCの起動->Ubuntuの自動ログイン->ROS2プログラム&Rvizの自動起動が行われるまでの設定を行います。

# 背景知識

## 自動起動

NUCに電源を刺したらあとは操作をせずに待つだけで自動でプログラムが起動するように設定します。このためには以下の要素が必要です。

* (1)NUCのDCプラグに電源が来ると、電源ボタンを押さずに電源ONする。
* (2)Ubuntuで自動でログインする（GUI表示に必要）
* (3)ros launchが自動で起動する
* (4)rvizの画面が自動でGUIに表示される。

このうち(3)はsystemdを、(4)はGUIが絡むのでgnomeのauto-startを使用します。

## HWボタンでのシャットダウン

ubuntuのshutdownをせずに、PCから電源を抜くとファイルが壊れる可能性があります。しかしロボットのPCにいちいちsshログインして`sudo shutdown now`するのは面倒ですし、場合によってはネットワークにつながっていないこともあります。
acpiという電源をつかさどるプログラムの設定をして、起動中に電源ボタンを押すとshutdownすることが出来ます。

## リモートデスクトップ

Ubuntu22からGUIでリモートデスクトップの設定が出来るようになりました。自動ログインと併用するとパスワード関係の問題が発生します。デフォルトではパスワード用のkeyringはログインしないと解除されませんが、自動ログインではこれが解除されません。そのため自動ログインでログインした場合は、リモートデスクトップ接続が出来ません。
これの対処法としてパスワード設定を変更して平文で置くことで回避します。

# 事前条件

以下が必要です。

* WindowsPC
    * インターネット接続
* USBメモリー
    * パーテーションごと書き換えるので、内容がクリアされます。
* インストール対象のNUC
    * 有線接続のUSBキーボード・マウス、HDMIモニタ接続

# 手順

# Ubuntuインストールメディアの作成

* WindowsPCでの作業を行う
* [ubuntu公式サイト](https://jp.ubuntu.com/download)より「Ubuntu Desktop 22.04.2 LTS」をダウンロード
* MicrosoftStoreより「Rufus」をインストールする
* WindowsPCにUSBメモリーを挿入
* 「Rufus」を実行する
    * 「デバイス」で挿入したUSBメモリを選択
    * 「選択」でダウンロードしたUbuntuのisoファイルを選択
    * 「スタート」を押すとUSBメモリへの書き込みが始まる
    * 終了したら「Rufus」を閉じる
* USBメモリを抜く

![rufus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254442/4c9e656b-b868-632d-d9e5-5324faa18a24.png)

## NUCへのUbuntuのインストール

* NUCにUSBキーボード、マウスを接続する、HDMIモニターを接続する
* NUCに上記のUSBメモリを接続する
* NUCを起動して、画面指示に従ってUbuntuをインストールする

NUCでUbuntuが起動して、ログインできれば完了

## 追加プログラムのインストール

* Ubuntu起動後に「activity」から「Terminal」を実行
* 以下を実行する

```shell:追加プログラムのインストール
sudo apt update
sudo apt upgrade
sudo apt install git vim openssh-server
```

## ROS2のインストール

[ROS2公式ドキュメント](https://docs.ros.org/en/humble/Installation.html)を参照

## Ubuntuの自動ログイン設定

* 「setting」アプリを起動
* 「Users」タブを開いて、以下の設定をする。
    * 「Automatic Login」：「on」
* 「setting」アプリを閉じる

## プログラムの自動起動

* `vim ~/data/start_ros.sh`で以下のファイルを作成する（のちに書き換えます）。

```shell:~/data/start_ros.sh
#!/bin/bash
echo "start ${0}"
source /opt/ros/humble/setup.bash
echo "end ${0}"
```

* `sudo vim /etc/systemd/system/ros.service`で以下のファイルを作成する。
```systemd:/etc/systemd/system/ros.service
[Unit]
After=network-online.target
Requires=network-online.target

[Service]
User=ubuntu
ExecStart=/home/ubuntu/data/start_ros.sh
Type=simple

[Install]
WantedBy=multi-user.target
```

* terminalで以下のコマンドを実行する。

```shell:systemdの設定
systemctl daemon-reload
sudo systemctl enable ros
sudo systemctl restart ros
```

## GUIプログラムの自動起動

* `vim ~/data/start_rviz.sh`で以下のファイルを作成する（のちに書き換えます）。

```shell:~/data/start_rviz.sh
#!/bin/bash
echo "start ${0}"
source /opt/ros/humble/setup.bash
echo "end ${0}"
```

* 「Activity」にて、「gnome-session-properties」と入力してアプリを呼び出す
* 出てきたウィンドウで「Add」を押す。出てきた画面で以下の操作
    * 「Name」に「rviz_autostart」を入力
    * 「command」横の「Browse」を選択して上記のshファイルを選択する
    * 「Add」を押す。

## 電源ボタン押下でshutdownする設定

* `sudo vim /etc/acpi/events/power`で以下のファイルを新規作成する
```shell:/etc/acpi/events/power
event=button/power
action=/sbin/poweroff
```

* `sudo service acpid restart`を実行する。

## 画面OFF防止設定

画面設定（OFFにしない、lockしない）設定->privacy
* 「setting」アプリを起動
* 「privacy」タブを開いて、以下の設定をする。
    * 「Blank screen display」：「Never」
    * 「Utomatic screen lock」：「off」
* 「setting」アプリを閉じる

## サイドバーが自動で隠れる設定

* 「setting」アプリを起動
* 「Apearance」タブを開いて、以下の設定をする。
    * 「Auto-hide the Dock」をOffにする。
* 「setting」アプリを閉じる

## USB接続デバイスの設定

* ターミナルで以下を実行

```shell:USBデバイス設定
$usermod -aG GROUPS $USER
```

## リモートデスクトップの設定

* 「activity」から「Passwords and Keys」を選択します。
    * 左のベンドから選択すると「GNOME Remote Desktop RDP credentials」となるものを選びます。
    * 左のベント上のアイテムを右クリックして「change Password」をクリック
    * 「Choose a new pasword for ...」の画面で空欄のまま「Continue」を押す。
* 「setting」アプリを起動
* 「sharing」タブを開く
    * 「Remote Desktop」を押す。
        * 「Remote Desktop」をonにする。
        * 「Remote Control」をonにする。
        * 「Authentication」の「Password」を「ubuntu」にする。
        * ウィンドウを閉じる。
* 「setting」アプリを閉じる

## Grubの待機時間を短くする。

* `sudo vim /etc/default/grub`でファイル編集
    * `GRUB_TIMEOUT=10`を`GRUB_TIMEOUT=2`と書き換え
* `sudo update-grub`を実行

## 電源投入でNUCの起動設定

* NUCを電源OFF状態から電源ONにする。
* bool中にキーボードの「F2」を押す。
* bios画面で「Power」->「Secondary Power」を選択する。
* 「After Power Failure」で「Power On」を選択する。
* 「F10」を押して、Biosを抜ける

# 参考

* [NUCの自動起動](https://www.intel.com/content/www/us/en/support/articles/000054773/intel-nuc/intel-nuc-mini-pcs.html)
* [systemd設定]()

# 目次ページへのリンク
[ROS2講座の目次へのリンク](https://qiita.com/srs/items/5f0d765343ca78f524ed)