Raspberry Pi 3にROS2をインストールしてみた

やってみた

 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 UltraAmazon\989

合計:8,009円

KSYは自前でECサイトを持っていてAmazonよりもお得が商品があったりするので、先に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:
    version: 2
    renderer: NetworkManager
    ethernets:
        eth0:
            dhcp4: true
            match:
                macaddress: xx:xx:xx:xx:xx:xx
            set-name: eth0
    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-SSID            xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  wifi
netplan-eth0                  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  ethernet

nmcliコマンドでインターフェースをonにすると接続される。(1度やれば再起動しても接続される)

$ sudo nmcli c up netplan-wlan0-SSID

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]
タイトルとURLをコピーしました