LoginSignup
1

posted at

ROS2用のラズパイ環境構築

これは東工大ロボット技術研究会のアドベントカレンダー rogy Advent Calendar 2022 22日目の記事です。
ラズパイの環境構築に関する知見がそれなりにまとまったので共有します。


やることの詳細

  • Raspberry Pi (4B)を使う
  • Ubuntu Server 22.04 64-bitをインストールする
    • ヘッドレス、つまりラズパイをディスプレイに繋げないでやる
  • そのUbuntu Server上にROS2 Humbleを入れる

OSを焼く

microSDの容量は16~64GBあたりが好ましいです。

Raspberry Pi Imagerを入手

microSDに色々と設定済みのOSを焼けるRaspberry Pi Imagerを使います。

OS インストール方法
Windows ↑のサイトからダウンロードして開く
macOS brew install --cask raspberry-pi-imager
Ubuntu sudo snap install rpi-imager

フォーマット

microSDに重要なデータが存在しないことを確認してからmicroSDをフォーマットします。Raspberry Pi Imagerを開き、OS選択画面で「削除」、書き込み先選択画面で適切なmicroSDを選び、「書き込む」ボタンを押すことでフォーマットが始まります。

rpi-imager-1.png

Ubuntu Serverをインストール

Raspberry Pi Imagerを開き、OS選択画面でOther general-purpose OS → Ubuntuと進み、"Ubuntu Server 22.04.1 LTS (64-bit)"を選びます。

↓の3点が少し紛らわしいので気をつけてください。

  • Desktopを選んでいないか
  • バージョンは22.10になっていないか(22.04になっているか)
  • 64-bitのものを選んでいるか

書き込みを始める前に、初期ユーザー等の基本設定をします。Raspberry Pi Imagerのウィンドウ右下にある歯車:gear:ボタンを押して、↓の5つを設定します。

項目 内容
ホスト名 チェックを入れてよしなに設定する
SSH パスワード認証を選択する
ユーザー名とパスワード チェックを入れてよしなに
Wi-Fi チェックを入れない(後で設定する)
ロケール設定 タイムゾーンはAsia/Tokyo, キーボードはjp

Wi-Fiにチェックを入れないのは複数Wi-Fiの登録を容易にするためです。

ここで設定したホスト名、ユーザー名、パスワードは後で使用するので覚えておきましょう。

rpi-imager-2.png

設定が完了したらmicroSDにイメージを書き込んでください。

Wi-Fi設定

書き込みが完了したらmicroSDをパソコンに差し直す。system-bootという名前でマウントされるはずなので、その中のnetwork-configというファイルを↓のように編集する。

network-config
# long-long-comments

version: 2
ethernets:
  eth0:
    dhcp4: true
    optional: true
wifis:
  wlan0:
    dhcp4: true
    optional: true
    access-points:
      "wifi-ssid":
        password: "raw-wifi-password"

設定例がコメントアウトされて示されているはずなので、そのコメントを外して自分のWi-Fi設定に書き換えましょう。

wifi-ssidに登録したいWi-FiのSSID, raw-wifi-passwordに登録したいWi-Fiのパスワードを入れてください。コメントアウトには複数のWi-Fi設定が書かれているはずなので、登録したいWi-Fiが複数ある場合も設定例に従えばうまく行きます。

network-config.png

ここではVimで編集している画面を出しましたが、VSCodeなどお好みのエディタで編集しましょう。

SSH接続

起動確認

ラズパイに電源を入れて、数分経ってからssh user@hostname.localを実行して接続します。user, hostnameはイメージを焼くときに設定したユーザー名、ホスト名に置き換えてください。

以前に同じホスト名でラズパイを起動した経験がある場合はssh-keygen -R hostname.localを実行することで以前のホストの情報を消せます

パスワード入力を求められるが、キーボードを叩いてもシェルに反映されないので注意が必要です。SSHでログインしたシェルはexitで閉じられます。

接続先省略

接続のたびにuser@hostname.localで接続先を指定するのは面倒なので、接続先を省略できるように設定しましょう。~/.ssh/configに次のように記述することでuser@hostname.localhogeに省略することが可能になります。

~/.ssh/config
Host hoge
    Hostname hostname.local
    User user

鍵登録

SSH接続するたびにパスワードを入力するのは面倒なので、SSH公開鍵を登録することでパスワード入力を省略できるようにします。

以前にSSHのRSA鍵を生成していない場合はssh-keygen -t rsaを実行して生成してください。このコマンドを実行すると鍵の場所、パスワードが聞かれるが全てデフォルト(場所は~/.ssh/id_rsa、パスワードはなし)でいいです。コマンドを実行してからエンターを3回押したら鍵生成が完了します。

scp ~/.ssh/id_rsa.pub user@hostname.local:/home/user/を実行してSSH公開鍵をラズパイに送信します。(前述の省略設定を施している場合はuser@hostname.localhogeに省略できます)

Windowsではこのコマンドでエラーが出るかもしれません。その場合はcd $HOMEを実行してから、または新しくターミナルを開き直してからscp ./.ssh/id_rsa.pub user@hostname.local:/home/user/を実行するといいです。

ssh hogeでラズパイにログインして、次のコマンドを順に実行します。これでラズパイにSSH公開鍵が登録され、SSH接続のたびにパスワードを入力する必要がなくなります。

$ mkdir -p ~/.ssh
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/id_rsa.pub

first-ssh.png

↑の画像では左側でラズパイにログインして公開鍵の登録、右側で手元のmacの~/.ssh/configの表示、およびscpを用いた鍵送信を行なっています。

apt関連

aptとは、インストールされているパッケージの管理を行なってくれるソフトウェア、いわゆるパッケージマネージャーです。Ubuntuで何かソフトウェアを追加する際にはほぼ必ずaptを使用します。

パッケージ更新

これはラズパイを起動するたびに行いましょう。

$ sudo apt update
$ sudo apt upgrade  # アップグレード可能なパッケージがある場合

必須のパッケージ群

これは最初に一回やればいいです。

$ sudo apt install build-essential cmake git locales curl wget gnupg lsb-release python3 python3-pip vim

ROS2インストール

ロケール設定

UTF-8をサポートしているものであればなんでもいいらしいのでja_JP.UTF-8でも良さそうですが、避けられるエラーは極力避けたいのでen_US.UTF-8に設定します。

$ sudo locale-gen en_US.UTF-8
$ sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
$ export LANG=en_US.UTF-8
$ locale  # verify settings

リポジトリ追加

apt-cache policy | grep universeで次のような文字列が出力に入っていることを確認します。(jammyが合っていれば他は気にしなくても多分大丈夫です)

500 http://us.archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
    release v=22.04,o=Ubuntu,a=jammy,n=jammy,l=Ubuntu,c=universe,b=amd64

入っていなければ↓のコマンドを実行しましょう。

$ sudo apt install software-properties-common
$ sudo add-apt-repository universe

ROS2のリポジトリをaptに追加します。

$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

インストール

ついでにcolconも入れてしまいます。

$ sudo apt update && sudo apt upgrade
$ sudo apt install ros-humble-desktop python3-colcon-common-extensions

起動時設定

次の3行を~/.bashrcに追加して、シェル起動時にROS2, colcon_cdの設定が読み込まれるようにします。

$ source /opt/ros/humble/setup.bash
$ source /usr/share/colcon_cd/function/colcon_cd.sh
$ export _colcon_cd_root=/opt/ros/humble/

追加方法がわからない場合は↓のコマンドを順に実行しましょう。

$ echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
$ echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
$ echo "export _colcon_cd_root=/opt/ros/humble/" >> ~/.bashrc

起動確認

シェル1

$ ros2 run demo_nodes_cpp talker

シェル2

$ ros2 run demo_nodes_cpp listener

シェル3(なくてもいい)

$ ros2 topic echo /chatter

↓のように、talkerでのHello, world: nlistener側にも出ていたら成功です。

ros2-demo.png

コマンド停止はctrl + Cでできます。

tips

ログアウト/再起動/シャットダウン

  • SSH接続を閉じる場合: exit
  • ラズパイを再起動させる場合: sudo reboot
  • ラズパイをすぐにシャットダウンさせる場合: sudo shutdown now

再起動/シャットダウンではSSH接続が急に切れるが(多分)問題はないです。

X11 Forwarding

SSHでGUI転送ができるようになります。

Linuxでなければ以下のソフトをインストールする必要があるので注意してください。

tmux

1つのウィンドウに複数パネルを配置したり、セッションをバックグラウンドに移せたりする便利なやつです。時間がかかるコマンドはこいつで切り離してあげるのがおすすめです。

VSCodeのRemote SSH

パソコン内の環境で開発しているのと同じ感覚でRaspberry Piの環境での開発が可能になります。

参考文献

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1