NanoPi-NEO2でROS2を動かしてみた


はじめに

初めてAdvent Calenderを書きます。
ROSを使ったことはあるけれど、そろそろROS2にも触れておきたいな...という気分になってきたので、ROS2に挑戦してみました。

NanoPi-NEO2とは


FriendlyElecが販売しているシングルボードコンピュータです。40mm x 40mmという非常にコンパクトな基板サイズながら、64bitクアッドコアのARM Cortex-A53のCPUを搭載しています。ただし、HDMIコネクタ、WiFi、Bluetoothは付いていません。

なぜHDMIもWiFiも付いていないボードをわざわざ使うのかというと、次のような理由からです。

  1. 64bitコアであること
    ROS2は多様なプラットフォームで動作するらしいですが、Dashing Diademataので最もサポートの厚いプラットフォームはUbuntu Bionic(18.04)64bitのようです。NanoPi-NEO2は、ArmbianというARMボード向けのDebian、UbuntuベースのOSを使用することで、この環境を作ることができます。
  2. 技適の問題を回避できること
    最近のシングルボードコンピュータはWiFiやBluetoothを搭載していることがよくありますが、国内で技適マークのない無線機器を使用すると電波法違反になる場合があります。その点、もともとWiFi非搭載なことはむしろ利点です。(11月20日から総務省に届け出をすることで、技適なしの無線機器でも使用することができるようになりました。詳細についてはこちら。)
  3. コンパクトなこと
    上にも書きましたが、40mm x 40mm(コネクタ含まず)という驚きの小ささです。これでいてUSB機器を接続できるので、ちょっと凝ったこともできるんじゃないでしょうか。
  4. 入手性が良いこと
    秋月電子で購入できます。(ただし、秋月電子で取り扱われているものはRAM 512MBモデルです。1GBモデルはAliExpress等の海外通販サイトで販売されています。)

NanoPi-NEO2のセットアップ

メーカーのWikiが参考になります。ただし、今回使用するOSはUbuntuCoreではなくArmbianです。

用意するもの

  • NanoPi-NEO2(1GBモデルがおすすめ)
  • NanoPi-NEOシリーズ用ヒートシンク(かなり発熱するためほぼ必須)
  • マイクロSDカード(Class10以上、8GB以上)
  • USB ACアダプタ(2A以上)
  • LANケーブル

SDカードの作成

  • NanoPi-NEO2用のArmbian Bionicのイメージをダウンロードして解凍します。
  • BalenaEtcher等のソフトでOSイメージをMicro SDカードに書き込みます。

アカウント作成

  • NanoPi-NEO2をLANケーブルでご家庭のネットワークに接続します。
  • USB ACアダプタに繋いで電源を入れます。起動すると基板上の緑色のランプが点滅します。
  • NanoPi-NEO2のIPアドレスを検索します。Linux PCなら以下のようなコマンドでネットワーク上のIPアドレスの一覧を取得可能です。
$ nmap -sP 192.168.xxx.xxx/24
  • IPアドレスが分かったら、sshでログインします。初回パスワードは1234になっています。
  • 自動でアカウント作成が始まります。現在のrootパスワード(1234)を入力して、新しいrootパスワード(適当に決めてください)を入力します。
  • 次に、新しいアカウントのユーザ名とパスワードを入力します。
  • その後、Full Nameなどの個人情報の入力を促されますが、空欄でも問題ないようです。
  • アカウントができたら、ログアウトして新アカウントでログインし直します。

アップデート

  • アップデートしておきましょう。
$ sudo apt update
$ sudo apt upgrade

ROS2のインストールと実行

用意するもの

  • ROS2インストール済みのLinux PC

Dashing Diademataのインストール

  • 通常のPCと同様に、公式の手順でインストールすることができます。
  • Installing ROS2 via Debian Packages に従ってインストールすればOKです。
  • ただし、$ sudo apt install ros-dashing-desktopの実行には非常に時間がかかるので、ros-dashing-desktopの代わりにros-dashing-ros-baseをインストールすることをお勧めします。

デモの実行

  • ros-dashing-ros-baseをインストールした場合、デモが入っていないので、以下のコマンドでインストールします。
$ sudo apt install ros-dashing-demo-nodes-cpp ros-dashing-demo-nodes-py
  • インストールできたら、1つ目のターミナルからtalkerノードを起動します。
$ ros2 run demo_nodes_cpp talker
  • 次に、2つ目のターミナルを立ち上げて新たにsshでログインし、listenerノードを起動します。
$ ros2 run demo_nodes_py listener
  • このように送受信できたら成功です。

RealSenseのテスト

せっかくなのでIntelの深度カメラ、RealSense D435iを動かしてみました。

ros2_intel_realsenseのインストール

  • RealSense用のROS2パッケージ ros2_intel_realsense があるので手順に従ってインストールします。
  • 必要なROS2パッケージのインストール
$ sudo apt-get install ros-dashing-cv-bridge ros-dashing-librealsense2 ros-dashing-message-filters ros-dashing-image-transport
  • ROS2以外の必要なもののインストール
$ sudo apt-get install -y libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev
$ sudo apt-get install -y libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev
  • 2019年11月時点ではバージョン2.0.4のバイナリが提供されており、aptでインストールすることができました。しかし、このバージョンではYAMLファイルからパラメータを指定することができないため、今回はソースからビルドすることにします。
  • まずワークスペースを作って、gitでros2_intel_realsenseのソースコードをクローンします。
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws/src
$ git clone https://github.com/intel/ros2_intel_realsense.git
  • colcon buildでワークスペースをビルドします。デフォルトでは並列にビルドされるようになっていますが、今回は処理能力不足のためか途中でフリーズしてしまったので、--executor sequentialをつけて1個ずつビルドするようにしました。
$ cd ~/ros2_ws
$ source /opt/ros/dashing/setup.bash
$ colcon build --executor sequential

パラメータ

  • パラメータを記述するYAMLファイルを作ります。 ファイル名は適当にrealsense_parameters.yamlとしておきます。
  • NanoPi-NEO2の性能では、RealSenseの標準の解像度だとエラーになりやすいため、解像度を落として起動した方が安定します。
RealSenseCameraNode:
  ros__parameters:
    enable_pointcloud: false
    enable_aligned_pointcloud: false
    enable_depth: true
    enable_aligned_depth: true
    enable_infra1: false
    enable_infra2: false
    enable_fisheye: false
    depth_width: 480
    depth_height: 270
    depth_fps: 6
    color_width: 424
    color_height: 240
    color_fps: 6

RealSenseの起動

  • 以下のようなコマンドでパラメータを渡しながらRealSenseノードを起動できます。
$ ros2 run realsense_ros2_camera realsense_ros2_camera __params:=realsense_parameters.yaml 
  • ROS2インストール済みのPCを同じネットワークに接続すれば、rviz2で画像を確認できます。

その他

ネットワーク設定

  • IPアドレスの固定化

    $ sudo nmcli connection show # Check Connection Name
    $ sudo nmcli connection modify 'Wired connection 1' \
      connection.autoconnect yes ipv4.method manual \
      ipv4.address 192.168.xxx.xxx/24 ipv4.gateway 192.168.xxx.1 ipv4.dns 8.8.8.8
    $ sudo reboot
    
  • WiFi USBアダプタを取り付けることで、WiFiを使用することもできます。WiFiの設定方法はここでは割愛します。

スワップ領域拡大

  • メモリ容量が不足しているとcolcon buildが通らなかったり(特に512MBモデルでは)しますが、スワップ領域を拡大することで解決することがあります。
  • 参考:linux スワップ(swap)領域の作成

音声出力

  • NanoPi-NEO2にイヤホンジャックはついていませんが、Audioピンが出ているためジャックDIP化キットなどで配線すれば音声を出力することができます。
  • 以下のコマンドでArmbianの設定ツールを呼び出し、System -> Hardware -> analog-codecをチェックして音声出力を有効化します。
  $ sudo armbian-config
  • 次のコマンドでデバイス一覧を確認します。こんな感じになると思います。
  $ aplay -l
  **** List of PLAYBACK Hardware Devices ****
  card 0: Codec [H3 Audio Codec], device 0: CDC PCM Codec-0 []
    Subdevices: 1/1
    Subdevice #0: subdevice #0
  • 以下のコマンドで、接続したスピーカーやイヤホンから音がでれば成功です。
  $ aplay /usr/share/sounds/alsa/Front_Center.wav

USBコネクタの追加

  • デフォルトではUSBコネクタが1つしかついていないのですが、実はポート2つ分のピンが別に付いているので、USBコネクタDIP化キットなどに配線すれば複数のUSB機器を使用することができます。

おわりに

そんなわけで、NanoPi-NEO2でROS2を動かすことができました。NanoPi-NEO2自体は2年ほど前のものですが、こういうボードでもROS2を動かせると分かったので、いろいろと夢が広がります。まだまだROS2について分からないところはたくさんありますが、今後も勉強していきたいと思います。