ROSを大して触らないうちに世の中はROSと互換性のないROS2になっていた。2年遅れぐらいになってしまったが、今日からROS2を触るためにRaspberry Pi 3 Model B+にROS2をインストールしてみた。
材料
Raspberry Piは多少値段が高くても怪しげな会社から買うより、正規代理店から買ったほうが失敗がないと思う。あと、電流3Aのまともな電源アダプターって売ってなかったりするので、セットで買ってしまったほうが楽。
ROSは結構容量を食うのでSDカードは32GB以上がおすすめ。
商品名 | 購入先 | 価格 |
Raspberry Pi 3 Model B+ Base Kit V1 (本体/5V3A電源/ヒートシンク) | Amazon | 7,020円 |
microSDカード 32GB UHS-I Class10 SanDisk Ultra | Amazon | 989円 |
合計:8,009円
KSYは自前でECサイトを持っていてお得なセット商品があったりするので、先にECサイトをチェックしてから買ったほうがいいかも。( Raspberry Pi Shop by KSY )
Ubuntuのインストール
SDカードにUbuntuのイメージをコピー
OSはUbuntuのほうがROS2的に都合がよいので、RasbianではなくUbuntu 18.04 LTS にした。
Raspberry Pi3用のUbuntuのイメージはここからダウンロードできる。(ubuntu-18.04.3-preinstalled-server-arm64+raspi3.img.xz)
SDカードへのイメージコピーは、Raspberry Pi本家でもオススメされているSD Memory Card FormatterでフォーマットしてbalenaEtcherでコピーした。
無線LAN接続を有効にする
OSが立ち上がったらID/PW : ubuntu/ubuntuでログインする。(パスワードは初回ログイン時に強制的に変更させられる)
有線だけで使うのであれば不要だが、サーバー向けイメージで無線LANを使う場合にはいくつか追加でパッケージをインストールする必要がある。
有線でインターネットに接続してaptコマンドでnetwork-managerとwireless-toolsをインストールする。インストールできたら一度再起動しておく。
$ sudo apt install network-manager wireless-tools
$ sudo reboot
nmcliコマンドを実行してデバイスの一覧が取得できればOK。
$ nmcli d
DEVICE TYPE STATE CONNECTION
wlan0 wifi disconnected --
eth0 ethernet unavailable --
lo loopback unmanaged --
/etc/netplan/50-cloud-init.yamlを編集してwifiの設定を追加する。
$ sudo vi /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource. Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
eth0:
dhcp4: true
optional: true
version: 2
renderer: NetworkManager
wifis:
wlan0:
addresses: []
dhcp4: true
optional: true
access-points:
"SSID":
password: "PASSWORD"
設定を追加したらnetplanコマンドを実行して反映する。
$ sudo netplan apply
nmcliコマンドでwifiの設定が追加されていればOK。
$ nmcli c
NAME UUID TYPE DEVICE
netplan-wlan0-xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx wifi
netplan-eth0 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ethernet
nmcliコマンドでインターフェースをonにすると接続される。
$ sudo nmcli c up netplan-wlan0-xxxxxxxx
defaultで自動接続するように設定されているが、SSIDをステルス機能(SSIDの隠蔽)で隠している場合には、以下のコマンドで設定を変更しておかないと自動接続されない。
$ sudo nmcli c mod netplan-wlan0-xxxxxxxx 802-11-wireless.hidden true
Localeの確認&変更
ROS2はUTF-8環境で動作することを想定しているので、UTF-8になっているかLocaleを確認する。何もしていなければC.UTF-8になっているはずなので変更しなくてもよいはず。
$ locale
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=
せっかくなので日本語(ja_JP.UTF-8)に変更した。
$ sudo locale-gen ja_JP ja_JP.UTF-8
$ sudo update-locale LC_ALL=ja_JP.UTF-8 LANG=ja_JP.UTF-8
$ export LANG=ja_JP.UTF-8
ROS2のインストール
APTリソースリストにROS2を追加
ROS公式のパッケージダウンロード先をリストに追加しておく。パッケージとしてcurl , gnupg2 , lsb_releaseが必要になるが、curlとlsb_releaseはインストール済だったのでgnupg2だけ追加した。
$ sudo apt install gnupg2
$ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
$ sudo apt update
ROS2と関連ツールのインストール
ROS本体とビルドに使うパッケージをインストールする。ROS本体は2019年5月に公開された最新ディストリビューションのDashing Diademataにした。GUIはいらないので、ros-dashing-ros-baseをインストールした。
$ sudo apt install ros-dashing-ros-base
$ sudo apt install python3-colcon-common-extensions python3-rosdep python3-argcomplete
インストールが完了したら、初期化とアップデートを実行しておく。
$ sudo rosdep init
$ rosdep update
動作確認
動作確認の前に環境設定を行う。
$ echo "source /opt/ros/dashing/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
GUIツールつきのros-dashing-desktopパッケージでインストールするとdemoも一緒にインストールされるが、ros-dashing-ros-baseだと入らないので別途aptでインストールする。
$ sudo apt install ros-dashing-demo-nodes-cpp
demoのlistenerノードを先に起動しておいて、次にtalkerノードを起動して通信ができていればOK。
$ ros2 run demo_nodes_cpp listener &
[1] 1422
$ ros2 run demo_nodes_cpp talker
[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [listener]: I heard: [Hello World: 1]
[INFO] [talker]: Publishing: 'Hello World: 2'
[INFO] [listener]: I heard: [Hello World: 2]
[INFO] [talker]: Publishing: 'Hello World: 3'
[INFO] [listener]: I heard: [Hello World: 3]
[INFO] [talker]: Publishing: 'Hello World: 4'
[INFO] [listener]: I heard: [Hello World: 4]
[INFO] [talker]: Publishing: 'Hello World: 5'
[INFO] [listener]: I heard: [Hello World: 5]