🎃

RaspberryPi4上にESP32用のmicro-ROS開発環境を作る

2021/09/12に公開

はじめに

この記事は、RaspberryPi4ESP32 用の micro-ROS 開発環境を構築する手順の備忘録です。

参考

ハードウェア

  • RaspberryPi4 Model B (4GB RAM)
  • 32GB micro SD
  • M5StickC Plus (ESP32-PICO-D4)

micro-ROS 関連のライブラリ

  • micro_ros_arduino
    • Arduino IDE や Arduino CLI 用の micro-ROS ライブラリです。
    • 今回は使用しません。
  • micro_ros_espidf_component
    • ESP-IDF 用の micro-ROS コンポーネントです。
    • 今回は使用しません。
  • micro_ros_setup
    • micro-ROSアプリをビルドするための環境をセットアップするツールと、micro-ROSアプリをビルドするツールを提供する ROS2 パッケージです。
    • 今回はこれを使用します。

RaspberryPi4 のセットアップ

How to install Ubuntu Server on your Raspberry Pi を参考にセットアップします。

  1. micro SD に Raspberry Pi 4 用の Ubuntu 20.04 (64-bit) のイメージを書き込みます。

  2. micro SD に書き込まれたファイルの中から network-config を開き、固定 IP アドレスを設定します。

    ethernets:
      eth0:
        addresses:
          - 192.168.x.x/24
        gateway4: 192.168.x.1
        nameservers:
          addresses: [192.168.x.x]
        optional: true
    
  3. HDMI ディスプレイ、キーボード、LANケーブルを接続して RaspberryPi4 を起動します。

  4. ログインします。デフォルトユーザー名は ubuntu、初回パスワードは ubuntu です。ログイン後すぐにパスワードの変更を求められるので設定します。

  5. デスクトップ環境をインストールします。Ubuntu Desktops on the Pi によると、Ubuntuの標準である ubuntu-desktop は少し重いものの一応動くそうです。

    $ sudo apt install
    $ sudo apt upgrade
    $ sudo apt install ubuntu-desktop
    $ sudo reboot
    
  6. デスクトップ起動後、ネットワークが Wired Unmanaged になっていることがあります。

    この場合、/etc/netplan/50-cloud-init.yamlrenderer: NetworkManager を追加して以下のコマンドを実行します。(参考 No wired connection - Wired unmanaged ubuntu 18.04

    $ sudo netplan apply
    

ROS2 Foxy のインストール

Installing ROS 2 via Debian Packages の手順通りに ROS2 Foxy をインストールします(具体的な手順は省略します)。

ROS2 Foxy のインストールが終わったら、以下のコマンドで rosdep と colcon をインストールします。

$ sudo apt install python3-rosdep
$ sudo rosdep init
$ rosdep update
$ sudo apt install python3-colcon-common-extensions

ESP32 用の Toolchain のビルド

ESP32 のソースコードのコンパイルには専用の toolchain が必要です。本来であれば Espressif が提供するビルド済みのバイナリを利用しますが、本記事執筆時点では RaspberryPi4 上で利用できるバイナリが無いため自分でビルドします。

Setup Linux Toolchain from Scratch を参考にセットアップします。

  1. 依存パッケージをインストールします。

    $ sudo apt-get install git wget libncurses-dev flex bison gperf python3 python3-pip python3-setuptools python3-serial python3-cryptography python3-future python3-pyparsing python3-pyelftools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
    $ sudo apt-get install gawk gperf grep gettext python python-dev automake bison flex texinfo help2man libtool libtool-bin make
    
  2. toolchain ビルド作業用のディレクトリを作成します。

    mkdir -p ~/esp
    cd ~/esp
    
  3. toolchain をソースからビルドします。
    なお、ここで micro_ros_setup と互換性のあるバージョンを選択しないと後々問題が置きます。本記事執筆時点では、micro_ros_setup は ESP-IDF v4.1 を利用する仕様になっており、ESP-IDF v4.1 は esp-2020r2 というバージョンの toolchain を必要としています。

    $ git clone https://github.com/espressif/crosstool-NG.git
    $ cd crosstool-NG
    $ git checkout esp-2020r2 # 適切なタグを選択
    $ git submodule update --init
    $ ./bootstrap && ./configure --enable-local && make
    $ ./ct-ng xtensa-esp32-elf
    $ ./ct-ng build
    $ chmod -R u+w builds/xtensa-esp32-elf
    
    • ./ct-ng build は 160 分ほどかかります。
    • [ERROR] Don't set LD_LIBRARY_PATH. It screws up the build. というエラーが出た場合は $ unset LD_LIBRARY_PATH を実行してください。
    • [ERROR] >> Build failed in step 'Retrieving needed toolchain components' tarballs' というエラーが出た場合は、crosstool-NG/.config ファイルの CT_EXPAT_VERSION="2.2.5"CT_EXPAT_VERSION="2.4.1" に変更してください。expat に何らかの脆弱性が見つかり古いバージョンが利用できなくなっているようです。(参考 expat-2.2.9.tar.gz Not Found #13
  4. パスを設定します。

    $ cp -r ~/esp/crosstool-NG/builds/xtensa-esp32-elf ~/esp/xtensa-esp32-elf
    $ export PATH="$HOME/esp/xtensa-esp32-elf/bin:$PATH"
    

micro-ROS ビルドシステムのセットアップ

First micro-ROS Application on FreeRTOS を参考に micro_ros_setup を使って micro-ROS ビルドシステムをインストールします。※ただし RaspberryPi 用に少し手を加えます。

  1. ROS2 のワークスペースを作成します。

    $ mkdir -p ~/microros_ws
    $ cd ~/microros_ws
    $ git clone -b $ROS_DISTRO https://github.com/micro-ROS/micro_ros_setup.git src/micro_ros_setup
    
  2. rosdep を使って依存関係を更新します。

    $ sudo apt update && rosdep update
    $ rosdep install --from-path src --ignore-src -y
    
  3. pip をインストールします。

    $ sudo apt install python3-pip
    
  4. toolchain をダウンロードしないように変更します。
    micro_ros_setup は micro-ROS ビルドシステムの構築中に ESP-IDF を自動でインストールする仕様になっており、RaspberryPi4 上では ESP32 用の toolchain をダウンロードできずエラーになります。そこでインストール用のスクリプトにダウンロードをスキップさせるような変更を加えます。
    具体的には、micro_ros_setup/config/freertos/esp32/create.sh を開き、python3 esp-idf/tools/idf_tools.py install の行の前に sed -i -e `s/always/never/g` esp-idf/tools/tools.json を追加します。

  5. micro_ros_setup 自体のツールをインストールします。

    $ cd ~/microros_ws
    $ colcon build
    $ source install/local_setup.bash
    

    上記のコマンドを実行すると ~/microros_ws/install にツールがインストールされます。

  6. ファームウェアのワークスペースを作成します。

    $ ros2 run micro_ros_setup create_firmware_ws.sh freertos esp32
    

    上記のコマンドを実行すると、ESP32 向けのファームウェアをビルドするためのワークスペースが ~/microros_ws/firmware に作成されます。
    micro-ROS アプリは ~/microros_ws/firmware/freertos_apps/apps の下に配置されており、次のような構成になっています。

    apps
    |-- <app_name>
    |    |-- app.c 
    |    +-- app-colcon.meta
    

    app.c はアプリのソースコードです。app-colcon.meta は colcon の設定ファイルで、ROS Middleware (RMW) の設定を記述します。
    サンプルに習って app.capp-colcon.meta ファイルを含むディレクトリを作成すれば、自作アプリを追加することもできます。

ファームウェアの設定

  1. ビルドするアプリとオプションを指定します。以下のコマンドはサンプルの int32_publisher を指定します。また、RaspberryPi4 の IP アドレスとポートを指定します(後述する Micro XRCE-DDS Agent の接続先となります)。

    $ ros2 run micro_ros_setup configure_firmware.sh int32_publisher -t udp -i 192.168.x.x -p 8888
    
  2. WiFi 接続を設定します。以下のコマンドを実行すると各種設定画面が表示されるので、micro-ROS Transport Settings -> WiFi Configuration から WiFi の SSID とパスワードを設定します。

    $ ros2 run micro_ros_setup build_firmware.sh menuconfig
    

ファームウェアのビルドと書き込み

  1. ファームウェアのビルドを開始します。

    $ ros2 run micro_ros_setup build_firmware.sh
    

    `colcon build` with stderr output とメッセージが表示されることがありますが、そのまま進んで問題ないようです。

  2. ESP32 を RaspberryPi4 に接続してファームウェアを書き込みます。

    $ ros2 run micro_ros_setup flash_firmware.sh
    

Micro XRCE-DDS Agent のインストールと起動

マイコン上の micro-ROS アプリが他の ROS2 システムと通信するには、Micro XRCE-DDS Agent と接続する必要があります。以下の手順で Agent を RaspberryPi4 にインストールして、起動させます。

  1. Agent をダウンロードします。

    $ ros2 run micro_ros_setup create_agent_ws.sh
    
  2. Agent をビルドします。

    $ ros2 run micro_ros_setup build_agent.sh
    $ source install/local_setup.bash
    
  3. Agent を起動します。

    $ ros2 run micro_ros_agent micro_ros_agent udp4 -p 8888
    

    Agent の起動後、ESP32 を再起動すれば接続されるはずです。

  4. 別のターミナルを開いて ROS2 のメッセージが届いているか確認します。

    $ ros2 topic list
    
    $ ros2 topic echo /freertos_int32_publisher
    

    メッセージが表示されれば成功です。

Discussion