見出し画像

RaspberryPi 3 に Ubuntu を入れて ROS を使う備忘録

以前書いた記事(RaspberryPi Zero WH へ ROS melodic をインストールした後の試行錯誤の備忘録)で RaspberryPi Zero WH と ROS の組み合わせのハードル高いことがわかったので、RaspberryPi 3 に移行した際の設定方法や変更点をまとめておこうと思います。

使用機器

- RaspberryPi 3 Model B(B+ではありません)
- Arduino Pro mini 5V
- PiCamera V1

OSやバージョン

- Ubuntu 18.04.5 LTS (32bit)
- ROS melodic

ROS melodic と Ubuntu のバージョンの組み合わせは Ubuntu install of ROS Melodic にある通り、melodic が 18.04(Bionic)に対応していることが確認できるので、18.04.5 LTS を選択しました。また、RaspberryPi 3 で 64 bit を使用することはあまりメリットがないという意見が多いのを見聞きしたので 32 bit を選択しています。

初期設定

まず、初めての起動は有線をつなげて起動します(ネット接続されていないと起動が途中で止まるような設定が有効になっているためか起動できなかったので)。次に内蔵の WiFi 設定として /etc/netplan/50-cloud-init.yaml を Vim などで開き、SSID やパスワードを設定を以下のように追記し、保存します。

 # This file is generated from information provided by the datasource.  Changes
 # to it will not persist across an instance reboot.  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
      wifis:
          wlan0:
              access-points:
                  ここにSSID:
                     password: ここにパスワード
             dhcp4: true
             optional: true

次に WiFi のパワーマネジメントを常時オフにする設定をします。まずは以下コマンドで iwconfig を使えるようにします。

$ sudo apt install wireless-tools

以下コマンドでパワーマネジメントを OFF に設定できるのですが、再起動すると設定が戻ってしまうため、永続的に設定されるようにします。

$ sudo iwconfig wlan0 power off

起動時に上記コマンドが実行されるように Service を作成・登録します。まずは任意の場所に以下のようなスクリプト(wifi_power_management_off.sh)を作成し、実行権限を付与します。

#!/bin/sh
/sbin/iwconfig wlan0 power off
$ sudo chmod 0755 wifi_power_management_off.sh

次に /etc/systemd/system/ の下にUnit定義ファイル(wifi_power_management_off.service)を作ります(以下)

[Unit]
Description = setting wifi power management off
[Service]
ExecStart = /home/ubuntu/wifi_power_management_off.sh
Restart = no
Type = simple
[Install]
WantedBy = multi-user.target

以下コマンドで作成したUnit が Service登録されているか確認します

$ systemctl list-unit-files --type=service | grep wifi_power_management_off

以下コマンドで自動起動設定します。

$ sudo systemctl enable wifi_power_management_off

これを設定しても内臓 WiFi が安定しなかったので SSH接続がタイムアウトで自動的に切断されないようにする を参考に ClientAliveInterval と ClientAliveCountMax を変更しました。ここまで設定してもまだ不安定なことがあるので別途 WiFi ドングルを使用した方が良いかもしれません。

ROSのインストール

ほぼ公式通りに進めて問題ないです。変更点としては GUI ツールなどは使用しない予定なので ROS-Base: (Bare Bones) をインストールしました。こちらは用途に合わせて変えてもらえればと思います。

PiCamera V1 を Ubuntu + ROS で使う準備

まずは PiCamera V1 を RaspberryPi に接続します。Vim 等で /boot/firmware/config.txt を開き末尾に以下2行を追記し、保存したら再起動します。(参考:Raspberry Pi Camera ModuleをROSで使うメモ

start_x=1
gpu_mem=128

次にカメラ接続確認のため以下手順で vcgencmd をインストールし、接続確認を行います。

$ sudo add-apt-repository ppa:ubuntu-raspi2/ppa
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install libraspberrypi-bin libraspberrypi-dev
$ vcgencmd get_camera (これでsupported=1 detected=1が出ればOK)

次に ROS で PiCamera V1 を使うために cv_camera をインストールします。 cv_camera をインストールすると Python の opencv 3.2.0 もインストールされます。

$ sudo apt install ros-melodic-cv-camera

以下コマンドで 動作確認します。

$ rosrun cv_camera cv_camera_node

ROSSerial を使う準備

RaspberryPi の GPIO 8(Rx) と Arduino の Tx 、RaspberryPi の GPIO 10 と Arduino の Rx を繋いだ状態ではシリアルコンソールが有効になったままであるためか、RaspberryPi が起動できませんでした。なので、シリアルコンソールを無効にする設定をします。まずは以下手順で Ubuntu で raspi-config を使えるようにします。(参考:ubuntu 18.04 にraspi-configをインストールしてGPIOの初期設定を変更した話

$ sudo echo "deb http://archive.raspberrypi.org/debian/ jessie main" >> /etc/apt/sources.list
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 7FA3303E
$ sudo apt update
$ sudo apt install raspi-config
$ sudo mount /dev/mmcblk0p1 /boot

次に raspi-config を起動し、“5 Interfacing Options” を選択し、 続いて “P6 Serial” を選択。would like a login shell to be accessible over serial. で No を選択し、would like the serial port hardware to be enabled. で Yes を選択します。一旦ここで再起動が必要になると思うので再起動します。再起動すると再度 mount をしないと raspi-config が使えないので注意してください。

再起動後、再度 mount を実行します。mount すると /boot/nobtcmd.txt が出現するのでこれを Vim などで開きます。すると console=serialXXX,115200 みたいな部分があるのでこれを削除し、保存します。以下で最後にシリアルコンソールを永続的に無効化します。

$ systemctl stop serial-getty@ttyS0.service
$ systemctl disable serial-getty@ttyS0.service

一旦再起動し、RaspberryPi と Arduino が接続されたままでも起動することを確認してください。あとは Arduino に ROS を用いたソースを書き込み、RaspberryPi 側で以下コマンドで ROSSerial が使えるか確認しましょう

$ rosrun rosserial_python serial_node.py /dev/ttyS0

まとめ

RaspberryPi Zero WH の時は ROS のインストール自体がハードルが高かったですが、RaspberryPi 3 は Ubuntu が使えるため、ROS のインストールが非常に楽でした。その他にもカメラや Arduino についても設定のハードルがとても低くなり楽になりました。

この記事が気に入ったらサポートをしてみませんか?