初めまして、hiramaです。
普段は長期インターンとして、弁当盛り付けロボットの研究開発をしています。
さて、今回はRaspberry Pi 3にROS2をインストールする方法を書いていきます。
※ どうやら64bitに対応済みのイメージが配布され始めたみたいなので、以前書いた方法は下の方に備忘録としてまとめておきます。
想定している環境は以下になります。
- Raspberry Pi 3 Model B or B+
- Ubuntu 18.04.3 (arm64)
- ROS2 Dashing Diademata
Raspberry Pi 3にUbuntuをインストール
64bit対応済みのイメージが配布されているので、それを利用します。
今回はARM 64bit対応のUbuntu 18.04.3を使用します。
http://cdimage.ubuntu.com/ubuntu/releases/18.04.3/release からRaspberry Pi 3 (64-bit ARM) preinstalled server imageをクリックしてイメージをダウンロードします。
違うバージョンを使いたい場合は、http://cdimage.ubuntu.com/ubuntu/releases から選ぶことができます。もし今回指定した18.04.3のリンクが切れていた場合は、新しいバージョンのイメージをここから選んでダウンロードしてください。
イメージをダウンロードしたら、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がインストールされます。
今回インストールするROS2のバージョンは、Dashing Diademataになります。なのでCHOOSE_ROS_DISTROという環境変数にdashingを指定します。
export CHOOSE_ROS_DISTRO=dashing
のdashingの部分をcrystalなどに変えることで違うバージョンをインストールすることができます。
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' export CHOOSE_ROS_DISTRO=dashing sudo apt update sudo apt install ros-$CHOOSE_ROS_DISTRO-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-bootとcloudimg-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