RaspberryPi4上にESP32用のmicro-ROS開発環境を作る
はじめに
この記事は、RaspberryPi4 に ESP32 用の 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 を参考にセットアップします。
-
micro SD に Raspberry Pi 4 用の Ubuntu 20.04 (64-bit) のイメージを書き込みます。
-
Raspberry Pi Imager を使って直接 micro SD に書き込むか、Ubuntu の公式ページからイメージをダウンロードした後 balena Etcher 等のソフトを使って micro SD に書き込みます。
-
Raspberry Pi Imager を使って直接 micro SD に書き込むか、Ubuntu の公式ページからイメージをダウンロードした後 balena Etcher 等のソフトを使って micro SD に書き込みます。
-
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
-
HDMI ディスプレイ、キーボード、LANケーブルを接続して RaspberryPi4 を起動します。
-
ログインします。デフォルトユーザー名は
ubuntu
、初回パスワードはubuntu
です。ログイン後すぐにパスワードの変更を求められるので設定します。 -
デスクトップ環境をインストールします。Ubuntu Desktops on the Pi によると、Ubuntuの標準である
ubuntu-desktop
は少し重いものの一応動くそうです。$ sudo apt install $ sudo apt upgrade $ sudo apt install ubuntu-desktop $ sudo reboot
-
デスクトップ起動後、ネットワークが
Wired Unmanaged
になっていることがあります。
この場合、/etc/netplan/50-cloud-init.yaml
にrenderer: 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 を参考にセットアップします。
-
依存パッケージをインストールします。
$ 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
-
toolchain ビルド作業用のディレクトリを作成します。
mkdir -p ~/esp cd ~/esp
-
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)
-
-
パスを設定します。
$ 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 用に少し手を加えます。
-
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
-
rosdep を使って依存関係を更新します。
$ sudo apt update && rosdep update $ rosdep install --from-path src --ignore-src -y
-
pip をインストールします。
$ sudo apt install python3-pip
-
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
を追加します。 -
micro_ros_setup 自体のツールをインストールします。
$ cd ~/microros_ws $ colcon build $ source install/local_setup.bash
上記のコマンドを実行すると
~/microros_ws/install
にツールがインストールされます。 -
ファームウェアのワークスペースを作成します。
$ 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.c
とapp-colcon.meta
ファイルを含むディレクトリを作成すれば、自作アプリを追加することもできます。
ファームウェアの設定
-
ビルドするアプリとオプションを指定します。以下のコマンドはサンプルの
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
-
WiFi 接続を設定します。以下のコマンドを実行すると各種設定画面が表示されるので、micro-ROS Transport Settings -> WiFi Configuration から WiFi の SSID とパスワードを設定します。
$ ros2 run micro_ros_setup build_firmware.sh menuconfig
ファームウェアのビルドと書き込み
-
ファームウェアのビルドを開始します。
$ ros2 run micro_ros_setup build_firmware.sh
`colcon build` with stderr output
とメッセージが表示されることがありますが、そのまま進んで問題ないようです。
-
ESP32 を RaspberryPi4 に接続してファームウェアを書き込みます。
$ ros2 run micro_ros_setup flash_firmware.sh
Micro XRCE-DDS Agent のインストールと起動
マイコン上の micro-ROS アプリが他の ROS2 システムと通信するには、Micro XRCE-DDS Agent と接続する必要があります。以下の手順で Agent を RaspberryPi4 にインストールして、起動させます。
-
Agent をダウンロードします。
$ ros2 run micro_ros_setup create_agent_ws.sh
-
Agent をビルドします。
$ ros2 run micro_ros_setup build_agent.sh $ source install/local_setup.bash
-
Agent を起動します。
$ ros2 run micro_ros_agent micro_ros_agent udp4 -p 8888
Agent の起動後、ESP32 を再起動すれば接続されるはずです。
-
別のターミナルを開いて ROS2 のメッセージが届いているか確認します。
$ ros2 topic list
$ ros2 topic echo /freertos_int32_publisher
メッセージが表示されれば成功です。
Discussion