Raspberry Pi 4BにUbuntu 18.04をインストールし,ROS Melodicを動かすまで


初めに

この記事は機械系 Advent Calendar 2020の記事です.
機情B3の自主プロにあたって,ラズパイの上でROSを走らせるつもりでインストールしたのですが,何気に躓くポイントが多かったのでその手順を残しておきます.今後,同じようなことをしようとした誰かの役に立てば嬉しいです(どちらかというとROSのインストールというより,その前のセットアップ部分の内容が大きいです).

Raspberry Pi 4B にUbuntu 18.04を入れて,その上にROSをインストールしていきます.
Screen Shot 2020-05-21 at 5.31.42.png
(https://www.raspberrypi.org/products/raspberry-pi-4-model-b/?resellerType=home)

必要なもの

  • Raspberry Pi 4 Model B
  • micro SDカード
  • SDカードリーダ
  • ディスプレイ
  • キーボード
  • 作業用PC(学科PCなど)

今後SSHでログインするのであれば,ディスプレイとキーボードは最初のセットアップのみ必要.

Ubuntu 18.04 LTSのインストール

Cononical公式サイトにはUbuntu Serverを入れるものなので,今回の場合は以下のサイトに従ってUbuntu LTSをインストールします.(Ubuntu Serverを入れてからその後にDesktopをインストールする方法も上記のサイトに載っていますが,今回は実践しません.)

ただ,上のサイトのイメージファイルのリンクはUbuntu 20.04 になっているため,SDカードへの書き込みまではこのサイトの通り行うと良いです.

ネットワークの設定までできたら,ifconfig と打ち込んで,ラズパイのIPアドレスを確認しておきましょう(後のSSHログイン時に必要になります).また,可能ならネットワークのプロバイダの設定からIPアドレスを固定しておくと便利です1

また,wifiの設定が正しく行われ,外部のネットワークに繋がっているかを確認するため,

$ ping 8.8.8.8

としてGoogleを叩くなどしてみると良いでしょう.ちゃんと応答が返ってくれば大丈夫です.

ここまでできたら,

$ sudo poweroff

としてラズパイの電源を切り,ディスプレイやキーボードを取り外してオッケーです.

Gnome Desktopのインストール

今後SSHログインで外部PCからしか利用しないなら,上記のインストール手順のうちデスクトップのインストールはスキップしても大丈夫ですが,もしラズパイ本体を学科PCのようにしてGUIで操作したいと思ったらデスクトップをインストールする必要があります.
ただ,上記の公式サイトにもGnome Desktopのインストールは載っていないですし,実際XubuntuやLubuntuのように

$ sudo apt install ubuntu-desktop

としても上手くいかなかったので,下のように

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

としてtaskselを用いるとインストールできました.(正直ここは「色々試したら上手くいった案件」なので,中身を理解しているわけではありません...)

追記(03/17/2021)

このときに試したらsudo apt install ubuntu-desktopで上手くいきました.初めに

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)  
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

とエラーが出たのですが,このサイトに従って

$ sudo rm /var/lib/apt/lists/lock
$ sudo rm /var/cache/apt/archives/lock
$ sudo rm /var/lib/dpkg/lock*
$ sudo dpkg --configure -a

とすることで解決しました.

細かな設定(個人的な趣味)

  • 日本語キーボードレイアウトに変更
    デフォルトだとUS配列になっているので,このサイトに従って変更
  • デフォルトのエディタをGNU nanoからVimに変更
    bashのデフォルトエディタがnanoになっているので,以下のコマンドを打ってVimに変更.
$ sudo update-alternatives --set editor /usr/bin/vim.basic
  • 矢印キーによるコマンド履歴補完
    bashのコマンド履歴補完が微妙なので,このサイトに従って ~/.bashrc にその設定を追加.これによって,ターミナルのコマンド履歴を遡りやすくなる.

SSHの設定

前項までで,同じネットワークに接続された作業用PCから,

$ ssh ubuntu@<IPアドレス> -p 22

としてパスワードを入力すればSSHでログインができるはずです(ラズパイの初期設定でポート番号が22であるため).

ラズパイを電源に接続してすぐはネットワークに接続されていないかもしれないので,SSHが通らないときpingコマンドを使ってネットワーク状況を確認しましょう.

$ ping <IPアドレス>

セキュリティの強化

上記まででネットワークの設定が完了すれば, ifconfig で確認されるIPアドレスを使ってSSHログインはできるのですが,ユーザ名が"ubuntu", ポート番号が22というデフォルト設定のままで,セキュリティがガバガバなので,以下の1つ目のサイトの①~③までを参考に,新しいユーザの登録・ポート番号の変更を行います.

設定が完了したら,

$ ssh <ユーザ名>@<IPアドレス> -p <ポート番号>
$ # 例 ssh [email protected] -p 50

と打って,設定したパスワードを打ち込めばラズパイにログインできます.

SSH接続を公開鍵認証に

上記のSSH接続はパスワード認証で実施されている(SSHログインのときにパスワードを打ち込んでログインする)のですが,これをよりセキュリティ性の高い公開鍵認証に変更します.前項でも参照したこのサイトの④を参考にしながら,以下のサイトに則って進めていきます.


(https://tool-lab.com/raspi-key-authentication-over-ssh/)

秘密鍵と公開鍵の作成(作業用PC側)

ラズパイに接続したい作業用PCに既に秘密鍵と公開鍵が生成されているか確認します.~/.ssh/ 以下に id_rsa.pubid_dsa.pub というファイルがあれば以前に生成した印です.(そのPCでGitHubにSSHキー登録などしていれば,その際に生成しているはずです.)
もし無ければ

$ ssh-keygen

として作成しましょう.

公開鍵をラズパイにコピー

上で作った公開鍵をラズパイにコピーします.作業用PC側で

$ ssh-copy-id <ユーザ名>@<IPアドレス> -p <ポート番号>

とするとSSH経由で,ラズパイ側の ~/.ssh/authorized_keys というファイルの中に,作業用PCの公開鍵 ~/.ssh/id_rsa.pub の中身がコピーされるはずなので,それを確認します.
これができていれば,

$ ssh <ユーザ名>@<IPアドレス> -i <秘密鍵ファイル> -p <ポート番号>
$ # 例 ssh [email protected] -i ~/.ssh/id_rsa -p 50

としてログインしたときに,パスワード入力なしでログインできるはずです.

*この方法で上手くいかない場合は,このサイトにある方法でやってみましょう.

公開鍵認証のみを許可(パスワード認証の無効化)

上記までで,パスワード認証に加えて公開鍵認証を許可することができました.ということは,未だパスワード認証はできてしまうので,セキュリティが向上したわけではありません.よってパスワード認証を無効化します.
ラズパイ側で

$ sudo vi /etc/ssh/sshd_confg

としてsudo権限でこのファイルを編集し,真ん中付近に記載されている
「#PasswordAuthentication yes」を「PasswordAuthentication no」に変更して保存します.

ここまでしたらラズパイを再起動($ sudo reboot) 又は

$ sudo /etc/init.d/ssh restart

としてSSHサーバを再起動しましょう.先程公開鍵を登録したPCからはSSHログインできますが,他のPCから同様にログインしようとしても, Permission denied (publickey). と表示されてログインできないはずです.
こうしてセキュリティ対策ができました.SSH接続するPCを増やしたい場合は,同じ要領で公開鍵を登録すればいいだけです.

configファイルの作成

ここまでで基本的な設定は終了しましたが,SSHログインの度に毎回毎回IPアドレスやポート番号を打ち込むのは面倒です.そこで,それらをまとめたconfigファイルを作っておくと便利です.実はこのファイルは,後に設定す(ラズパイの初期設定でポート番号が22であるため)る,VSCodeからSSHログインするために必要なので,ここで作っておきます.
作業用PC側で,~/.ssh/config というファイルを作成し(既に存在する場合は追記する形で)

Host <ホスト名>
    HostName <IPアドレス>
    User <ユーザ名>
    Port <ポート番号>
    IdentityFile <秘密鍵ファイル>
Host raspi
    HostName 111.111.11.11
    User taro
    Port 50
    IdentityFile ~/.ssh/id_rsa

と記述します.
そうすれば,次回以降は

$ ssh <ホスト名>

と打ち込むだけでSSHログインすることができます.

VSCodeからSSHで遠隔操作するための設定

以下の記事を参考に,VSCodeに"Remote Development"という拡張機能を追加します.
先程作成したconfigファイルのおかげで,SSH接続が行えるようになります.

ROS Melodicのインストール

http://wiki.ros.org/melodic/Installation/Ubuntuに従ってインストールしていけばいいです.

Ubuntu repositoriesの許可

Ubuntuでは apt updateapt upgrade によって /etc/apt/source.list を参照し,その中に記載されているリポジトリの管理を行います.リポジトリにはその信頼度やライセンスによって"Main", "Restricted", "Universe", "Multiverse"の4種類に分かれており,まずはこれを全て許可する必要があります.
現在許可されているリポジトリの種類を見るためには以下のコマンドを打てばよく,

$ grep ^deb /etc/apt/sources.list

コマンド出力に記載のあるリポジトリの種類が許可されていることを意味します.

心配ならば

$ sudo add-apt-repository main
$ sudo add-apt-repository restricted
$ sudo add-apt-repository universe
$ sudo add-apt-repository multiverse

とすれば,改めてそれぞれを許可することができます.

ROS Melodicのインストール

ここからもwikiに従って以下のように実行すれば良いです.(wikiがアップデートされているかもしれないので,随時確認してください.)

# packages.ros.org からのパッケージの許可
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# packages.ros.org の公開鍵の取得
$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
# Debian packageのアップデートの確認
$ sudo apt update

あとは,自分の用途や好みに従って以下のうち,好きなものをインストールすれば良いです.僕はラズパイにUbuntuデスクトップをインストールしませんでしたが,なんとなく一番上のdesktop-fullをインストールしました.

# Desktop-Full Install: (Recommended) : ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators and 2D/3D perception
$ sudo apt install ros-melodic-desktop-full
# Desktop Install: ROS, rqt, rviz, and robot-generic libraries
$ sudo apt install ros-melodic-desktop
# ROS-Base: (Bare Bones) ROS package, build, and communication libraries. No GUI tools.
$ sudo apt install ros-melodic-ros-base

確認

正しくインストールがなされたかを確認しておきましょう.ROSコマンドを利用するために

$ source /opt/ros/melodic/setup.bash

としてソースを通し(もしくは ~/.bashrc に記述してもいいです),別々のターミナルから

# それぞれ別々のターミナルで
$ roscore
$ rosrun roscpp_tutorials talker
$ rosrun roscpp_turorials listener

として実行してみます.
以下のように出力されればROSプログラムが正しく実行され,ノード間で通信できていることを意味しています.


I2C通信の有効化,GPIOピンの設定

ラズパイの良いところは,小型である上にGPIOピンを使えることですが,通常のUbuntu 18.04にはGPIOピンを使うためのドライバが入っていないので,何かの方法でインストールしなくてはいけません.
僕はまだ行っていませんが,この辺りの記事が参考になるのではないかと思っています.できたら追記します.もしくは,できた人がいれば教えてください.


  1. /etc/netplan/50-cloud-init.yaml の中の dhcp4: true という記述はDHCPサーバを利用することを意味しています.DHCPサーバはネットワークに接続されている機器に自動的にIPアドレスを割り振るものなので,ifconfigと打ってそのIPアドレスを確認する必要があります.また,基本的には毎回同じIPアドレスに割り振られるそうですが,特定のIPアドレスに確定させたい場合はプロバイダに確認して設定する必要があります.(僕はNECのwifiを利用しているので,このサイトから設定できるらしいです.)