RaspberryPiセットアップ

ロボットに載せるオンボードコンピュータとして，RaspberryPiを使いました．

一緒に使う予定のロボットに既にUbuntu18.04が搭載されていたので，rosのバージョンをそろえるためにこちらもUbuntu18.04をOSとして載せたものの... 少し古めのUbuntuなので，最新のものに比べてひと手間必要でした．

基本的なインストール方法やwifi設定などのセットアップ方法は，Ubuntu18.04に限らずほとんどのUbuntuに共通していると思います．

# インストール＆初期設定手順

1. SDカードをFAT32で初期化（フォーマット）する
    a. 32GB以上のSDカードはデフォルトのWindowsフォーマッタでは初期化できないので，無料のアプリをインストールして頑張る．（私は，[AOMEI Partition Assistant Standard](https://www.diskpart.com/jp/free-partition-manager.html)を使いました．）
	b. そのアプリの手順に従って初期化する（AOMEIなら[これ](https://www.diskpart.com/jp/articles/format-64gb-sd-card-to-fat32.html#:~:text=%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%201.%2064GB%20SD%E3%82%AB%E3%83%BC%E3%83%89,%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%80%8D%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)に従う）

2. [raspberryPi Imager](https://qiita.com/karaage0703/items/79e09db0ef3ebcf94882)をインストール

3. [ラスベリーパイ用Ubuntu18.04 server OS](http://ubuntutym2.u-toyama.ac.jp/ubuntu-dvd/18.04/release/)のダウンロード（**ubuntu-18.04.5-preinstalled-server-arm64** と **raspi4.img.xz** の2つ）

    :::note warn
	*  Ubuntu serverはDesktop版と異なり，ターミナル画面しか表示されない（CUI操作のみ）
	* Ubuntu18.06以前のバージョンだと，RaspberryPi用のUbuntuはserverしか配布されていないのでこちらを利用した（もっと最新のものならDesktopもある．）
    
4. raspberryPi Imagerを起動し，*Operating System* > *Use custom* > *ダウンロードしておいたubuntuファイル* を選択．さらに，保存する先のSDカードを選択して書き込む．

5. microSDをRaspberryPiに挿入．モニターとかとつないで，最後に電源供給を行うと起動する

6. Log in ID：*ubuntu*，password：*ubuntu* でログインすると，パスワードの変更を求められる．そこで，現在のパスワード → 新しいパスワード → 新しいパスワード の順に入力する

7. 初期設定
	* [キーボード配列の日本語化](https://qiita.com/Toshiaki0315/items/08dfaf70ec11b23fe05b)
	  デフォルトだとUSキーボードになっていて，いろいろ打ちにくいので，日本語キーボード配列に設定し直した
	* [有線 / 無線LAN接続＆IPアドレスの固定](#有線-/-無線LAN接続＆IPアドレスの固定)
        wifiなどのネットワークに接続する．ssh接続することを見越してIPアドレスも固定する．
	* [有線 / 無線LANによるssh接続](#有線-/-無線LANによるssh接続)
    	実際にsshしてみた
	* [Desktop版への変更](#Desktop版への変更)
    	GUIアプリを使う必要があったので，CUIしかないUbuntu serverから GUI操作も可能なUbuntu Desktopに変更した

# 有線 / 無線LAN接続＆IPアドレスの固定
Ubuntuでは，ネット接続の設定にNetplanを利用している.デフォルトでは *"/etc/netplan/50-cloud-init.yaml"* にその設定ファイルがある．

このファイルは後で自動的に書き換えられる可能性があるので，接続設定はこのファイルをもとに *"/etc/netplan/99_config.yaml"* など適当なファイルを新規作成し，そこに記入する．

0. 自分のubuntuにおけるwifiやイーサネットのアダプタ名を確認
    ```
    $ ifconfig

    wlan0: 無線LANのアダプタ名
        xxxyyyzzz
    eth0:  有線のアダプタ名
        aaabbbccc
    ```

1. ファイル（"/etc/netplan/99_config.yaml"）の作成
    vimを使って作成＆編集を行う場合は以下のコマンド
	```
    $ sudo vim /etc/netplan/99_config.yaml
    ```

2. 接続設定（無線→有線でひとつづつ試すのがいい）
    ```cpp:/etc/netplan/99_config.yaml
	network:
	  version: 2
	  renderer: networkd
	  ethernets:
	    eth0(有線のアダプタ名):
	      dhcp4: false
	      addresses: [192.168.aaa.bbb/24]
	 wifis: 
	    wlan0（無線LANアダプタ名）: 
	      dhcp4: false
	      addresses: [192.168.xxx.yyy/24]
	      gateway4: 192.168.xxx.zzz
	      nameservers: 
	          addresses: [192.168.xxx.zzz, 8.8.8.8]
	      access-points: 
	          wifi SSID:
	              password: "wifi_password"
	```
    ただし，以下のようにアドレス関連で分からないことがあった場合は，とりあえずそのネットワークに接続されているPC（Windowsとか）で，ネットワーク情報を確認するといい．
    * 接続先のネットワークでのIPアドレスの型が分からない
    * 自分の接続しているwifiサーバのアドレス（*gateway4* と *nameserver*の*address*部分）が分からない
    
    [参考サイト](https://www.planex.co.jp/support/download/router/mzk-wnh/v31/html/menu-5-d.html#:~:text=%E3%80%8C%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%80%8D%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E2%86%92%E3%80%8C%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%80%8D%E2%86%92%E3%80%8C,IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)をもとに調べると，↓の写真のようにネットワーク情報が表示された．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3250323/29755713-5854-dbe1-2d3a-234cde5d32cd.png)


# 有線 / 無線LANによるssh接続
有線LANの場合も無線LANの場合もやり方は同じ．ただし，有線LANのほうが通信が安定しているので動作も軽い．詳細は[参考サイト](https://zenn.dev/uchinarupower/articles/raspi-ubuntu18-install#open-ssh-server)を参照．

# Desktop版への変更
デスクトップ版は軽量版（xubuntu，lubuntu）など様々あるが，今回は普通のUbuntuにする．インストール終了後に再起動するとデスクトップ画面が表示される

 ```		
$ sudo apt install -y ubuntu-desktop
$ reboot
```

# トラブルシューティング
## 1．起動してすぐはwifiにつながるのに，その後つながらなくなる！
### 発生した事象：
起動直後はpingも通って間違いなくwifiにも接続できているのに，しばらくするとpingもsshも通らなくなった！
### 原因：
1. wifiモジュールが暫くするとスリープモードに入る（wifiを利用できなくなる）
2. セキュリティーソフトでブロックされている（ラズパイとsshをする側のPC，両方大丈夫か）
3. 両方
### 解決策：
[参考サイト](https://elsammit-beginnerblg.hatenablog.com/entry/2021/02/16/213737)
1. wifiモジュールが暫くするとスリープモードに入る（wifiを利用できなくなる）場合
この場合，wifiへの接続そのものが切れているので，ネットにも接続できなくなる
	a. 原因を確認
    ```cpp
    $ iwconfig  
    // "Power Management:on"と表示されたら，低電力化のためにスリープ移行するモードになっている．
   ```

	b. 節電モードをオフにする
    ```
    $ sudo iwconfig wlan0 power off
    ```
  
	c. 変更を確認
    ```cpp
    $ iwconfig
    //"Power Management:off"と表示されたら，OK!
    ```
		
	
## 2. セキュリティーソフトでブロックされている（ラズパイとsshをする側のPC，両方大丈夫か）
### 発生した事象：
このとき，ネットワークはつながっているのでpingは通る．しかし，sshは"connection refused"と表示される．

1. ローカルPC（Windowsなど）→ラズパイにpingを送信：成功

2. ラズパイ→ローカルPCにpingを送信：失敗

    :::note info
    このとき，ローカルPC側に「不正なアクセスをブロックしました」などというセキュリティーソフトからのメッセージが来ていないか確認する
        
3. ローカルPCのセキュリティーソフトでラズパイとの通信を許可する

## 3．wifiのオンオフを切り替えたい
[参考サイト](https://www.cagylogic.com/archives/2021/03/21152156/11727.php)
```
$ nmcli radio wifi on
$ nmcli radio wifi off
```

## 4．モニタに繋げないと起動しない
[参考サイト１](https://goodjobnahibi.blogspot.com/2021/08/raspberry-pi-os64bit-hdmi.html)，[２](https://scrapbox.io/ryoheimorimoto/Ubuntu_on_Raspberry_Pi_%E3%81%A7_HDMI_%E3%81%8C%E5%8F%8D%E5%BF%9C%E3%81%97%E3%81%AA%E3%81%84%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95)
* RaspberryPiをモニタに繋げた状態で電源を入れる→起動する（pingもsshも通る）
* RaspberryPiをモニタに繋げない状態で電源を入れる→起動しない（pingすら通らない）

これは，ラズパイの設定ファイルに追記することで直るらしい．
```cpp
$ sudo vim /boot/fireware/usercfg.txt

// 以下，追記内容（開いたのは設定ファイルに追記するファイルなので通常は何も書かれていない）
hdmi_force_hotplug=1
```