Raspberry Pi 3にROS2をインストール

初めまして、hiramaです。

普段は長期インターンとして、弁当盛り付けロボットの研究開発をしています。

 

さて、今回はRaspberry Pi 3にROS2をインストールする方法を書いていきます。

※ どうやら64bitに対応済みのイメージが配布され始めたみたいなので、以前書いた方法は下の方に備忘録としてまとめておきます。

想定している環境は以下になります。

  • Raspberry Pi 3 Model B or B+
  • Ubuntu 18.04.2 (arm64)
  • ROS2 Bouncy Bolson

Raspberry Pi 3にUbuntuをインストール

64bit対応済みのイメージが配布されているので、それを利用します。

http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/ubuntu-18.04.2-preinstalled-server-arm64+raspi3.img.xzからイメージをダウンロードします。ダウンロードしたイメージをmicro SDカードに書き込みます。私はEtcher(https://www.balena.io/etcher/)というソフトを使って書き込みました。

これでPCでする作業は終わりです。micro SDカードをRaspberry Piに差し込んで、起動をします。このとき、ネットワークに繋がっていないと起動してくれません。なので、有線LANを接続してネットワークに繋がっている状態で起動してください。

ここから、Raspberry Pi上での作業になります。

作業中にaptの自動更新があると作業の邪魔になってしまうので、以下のコマンドでaptの自動更新を切ります。

sudo sed -i ‘s/1/0/g’ /etc/apt/apt.conf.d/20auto-upgrades

起動時にネットワークがなくても止まらないようにします。パスワードは2回聞かれます。

systemctl disable systemd-networkd-wait-online.service
systemctl mask systemd-networkd-wait-online.service

ROS2のインストール

それでは、カーネルを64bitにしたのでROS2をインストールしたいと思います。

以下のコマンドをすべて実行すればROS2がインストールされます。

sudo apt install curl
curl http://repo.ros2.org/repos.key | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64,arm64] http://repo.ros2.org/ubuntu/main `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
sudo apt update
sudo apt install ros-bouncy-ros-base
sudo apt install python3-argcomplete
sudo apt install python3-colcon-common-extensions

 

以上でROS2のインストールは終わりになります。

次回は、ROS2を試してみたいと思います!

 

 

 

 


 

 

 

これより下は、64bit対応イメージが配布される前の、64bitに対応させるための記事になります。現在は配布されているイメージを使う方が問題がないと思います。一応のためにメモとして残しておきます。

(この方法は、試行錯誤してやった方法になります。ROS2が動作することは確認していますが、自己責任でお願いします。)

想定している環境は以下のとおりです。

  • Raspberry Pi 3 Model B
  • Ubuntu 18.04 (arm用)
  • ROS2 Bouncy Bolson

Raspberry Pi 3にUbuntuをインストール

まずは、Raspberry PiにUbuntuをインストールします。ROS2は64bitではないとインストールできないので、カーネルを64bit対応にしていくことから初めます。

http://cdimage.ubuntu.com/ubuntu/releases/18.04/release/ubuntu-18.04.1-preinstalled-server-armhf+raspi2.img.xz からイメージをダウンロードします。ダウンロードしたイメージをmicro SDカードに書き込みます。私はEtcher(https://www.balena.io/etcher/)というソフトを使って書き込みました。

書き込みが終わると、system-bootcloudimg-rootfsディレクトリがmicro SDカードの中にできます。https://github.com/raspberrypi/firmware/blob/master/boot/bcm2710-rpi-3-b.dtb?raw=true からbcm2710-rpi-3-b.dtbというファイルをダウンロードして、system-bootの中にコピーします(もともとあるbcm2709-rpi-2-b.dtbは削除しなくて大丈夫です)。

次に、system-bootの中にあるconfig.txtを編集します(もしここで、間違えて編集すると起動しなくなる可能性があります。 そのため、バックアップを取っておくことをオススメします)。

kernel=uboot.bin
device_tree_address=0x02000000

この2行を下のように書き換えます。

kernel=vmlinuz
initramfs initrd.img followkernel
#kernel=uboot.bin
#device_tree_address=0x02000000

これでPCでする作業は終わりです。micro SDカードをRaspberry Piに差し込んで、起動をします。このとき、ネットワークに繋がっていないと起動してくれません。なので、有線LANを接続してネットワークに繋がっている状態で起動してください。

ここから、Raspberry Pi上での作業になります。

作業中にaptの自動更新があると作業の邪魔になってしまうので、以下のコマンドでaptの自動更新を切ります。

sudo sed -i ‘s/1/0/g’ /etc/apt/apt.conf.d/20auto-upgrades

起動時にネットワークがなくても止まらないようにします。パスワードは2回聞かれます。

systemctl disable systemd-networkd-wait-online.service
systemctl mask systemd-networkd-wait-online.service

 

次に、カーネルを64bitにする作業を行います。

以下のコマンドを実行します。

sudo dpkg --add-architecture arm64
sudo apt update
sudo apt install linux-image-raspi2:arm64

64bitで起動させるために、config.txtを書き換えます。以下をconfig.txtに追加します。

arm_control=0x200

ここまでやったら再起動をします。もし、Raspberry Piが起動しなかったら上記の手順のどこかを間違えている可能性があるので、見直してみてください。

ラズパイが再起動したら、以下のコマンドを実行してaarch64と出てくるかどうかを確認します。ここで、aarch64と出てきたら64bitになっています。

arch

ROS2をインストールするために、dpkgとaptを64bitに対応させます。

どうやら、パッケージの依存があるみたいなので、エラーが起こるパッケージを先に64bit対応にします。

sudo apt install aptitude:arm64 libklibc:arm64 openssh-server:arm64

そして、dpkgとaptを64bit対応させます。このときに、いろいろ表示されます。Yes, do as I say!と入力すればインストールされます。

sudo apt install dpkg:arm64 apt:arm64

インストールされているパッケージを64bit対応にします。ここでも、上記同様にYes, do as I say!と入力してください。途中で、キーボードレイアウトを問われるので、好きなキーボードレイアウトを選択してください。

sudo apt install -f

ネットワークに接続できるようにするため、以下のコマンドで必要なパッケージをインストールします。

sudo apt install network-manager netplan.io

/etc/netplan/50-cloud-init.yamlというファイルを書き換えて、接続できるようにします。ファイルの中にあるethernetsと同じインデントの場所に以下を追記します(インデントに気をつけてください)。

renderer: NetworkManager

追記するとファイル全体が以下のようになると思います。<MAC ADDRESS>にはRaspberry PiのMACアドレスが入っています。

network:
    version: 2
    ethernets:
        eth0:
            dhcp4: true
            match:
                macaddress: <MAC ADDRESS>
            set-name: eth0
    renderer: NetworkManager

この設定を反映して再起動をします。

sudo netplan apply
sudo reboot

起動したら、日本時間の設定をします。このときに地域を聞かれたら、Asia→Tokyoを選びます。

sudo dpkg-reconfigure tzdata

参考

Raspberry Pi 3で64ビットカーネル起動 Ubuntu 18.04.1 Multiarch

Raspberry Pi 3 Model B plus でUbuntu18.04を起動してみた。 – Qiita

Ubuntu Server 18.04 LTSの無線LAN接続 – Qiita

Installing ROS2 via Debian Packages

ROS 2の紹介 by gbiggs

ARM/RaspberryPi – Ubuntu Wiki