ラズパイZero にROS2をインストールします。ただ、このコンピュータは少々非力なため、この上で直接インストールするのは現実的ではありません。
方法は2つあるようです。
1つは、他のコンピュータ上でクロスコンパイル環境を作って、この上で作成したROS2をZeroに転送する方法。
もう一つは、同様に他のコンピュータ上でROS2をクロスコンパイルして作成するのですが、これを使ってイメージを作りMicroSDカードに焼くという方法です。これはArch LinuxというOSをイメージにしますが、やってみたところ最終的にはrclpy._rclpyというエントリポイントが見つからないというエラーでROS2の起動に失敗しました。ただ、Arch LinuxというシンプルなOSをWi-Fi設定済みで作成できるので何かに応用できるかもしれません。失敗談を含めてこの2つの方法をやってみます。
Jetson とZero を使ってROS2でtopic通信してみる
1:クロスコンパイル環境で作成したROS2をZeroに転送する
epuck_ros2ではx64(amd64)で環境構築することが想定されています。クロスコンパイルの対象はarmv6(Raspberry Pi Zero)です。
従って、母艦になるのは主にIntel MacかWindowsです。
母艦側
ここではWindows 10 + VirtualBox + Ubuntu 18.04 + Docker で環境構築してみます。
● Windows 10 + VirtualBox + Ubuntu 18.04 に関しては、ここ参照。仮想ディスクサイズは15GBは必要です。VirtualBox の最新バージョンは6.1です。これを使います。
● Docker のインストールに関しては、ここ参照(16.04でやってますが18.04 でも一緒)。
Ubuntu を起動したら必要なファイルを作成しておきます。
epuck_ros2にある4つのファイルをコピー・ペーストして、権限を付与しておきます。
Dockerfile <—666
bashrc.sh <—777
start_docker.sh <—777
toolchain.cmake <—666
start_docker.shはsudoで実行できるように、各コマンドの前にsudoをつけておきます。
ラズパイZero側
OSはRaspbian Liteを使います、ここ参照。
Raspberry Pi Preparation
ROS2 requires the following packages to be installed on your Raspberry Pi:
ROS2では、次のパッケージをRaspberryPiにインストールする必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
sudo apt update # Compilation dependencies sudo apt install \ liblog4cxx-dev \ python3-dev # Runtime dependencies sudo apt install \ python3-numpy \ python3-netifaces \ python3-yaml # Optional tools sudo apt install sshfs |
母艦側
ROS2 Cross-Compilation on Your PC
Now we can start a process of ROS2 cross-compilation. The supplied Docker image is equipped with most of the tools you need, so start it with:
これで、ROS2クロスコンパイルのプロセスを開始できます。 提供されているDockerイメージには、必要なツールのほとんどが含まれているため、次のコマンドから始めてください。
1 |
./start_docker.sh |
終了後、コンテナが起動します。
おまじない(不要かもしれませんが念のため)
1 |
pip3 install rcutils |
Rootfs Preparation
As your Raspberry Pi is equipped with ROS2 dependencies you have to synchronize the rootfs. This will allow the cross-compiler to use header files and libraries from your Raspberry Pi. There are two ways to get the rootfs inside your Docker.
Raspberry PiにはROS2依存関係が装備されているため、rootfsを同期する必要があります。 これにより、クロスコンパイラーはRaspberryPiのヘッダーファイルとライブラリを使用できるようになります。 Docker内でrootfsを取得する方法は2つあります。
ラズパイZeroのIPアドレスを調べておいてください。
1つめ、rsyncを使う(ネット環境にもよるとは思いますが、30分くらいかかりました)
Initially, rsync will take more time to perform synchronization, but the cross-compilation process will be faster after (as the cross-compiler doesn’t have to transfer a file from Raspberry Pi every time).
最初、rsyncは同期の実行に時間がかかりますが、クロスコンパイルプロセスは後で高速になります(クロスコンパイラーは毎回Raspberry Piからファイルを転送する必要がないためです)。
1 |
rsync -rLR --safe-links pi@[raspberry_pi_ip]:/{lib,usr,opt/vc/lib} /home/develop/rootfs |
もう一つはsshfsを使う
注:rsyncでエラーを経験した場合以下を実行しておく
rm -rf /home/develop/rootfs/*
こちらを使ってみます。
1 |
sshfs -o follow_symlinks,allow_other -o cache_timeout=115200 pi@[raspberry_pi_ip]:/ /home/develop/rootfs |
Compilation Commands
In the Docker, we prepared a few commands with the cross-* prefix to bootstrap your development. For example, you can use cross-initialize to download the ROS2 source code or cross-colcon-build to build it. These commands are simple bash functions located in .bashrc. You can see how the commands are implemented by typing e.g. type cross-initialize and change them according to your needs. Therefore, in the Docker container type:
Dockerでは、開発をブートストラップするために、cross- *プレフィックスが付いたコマンドをいくつか用意しました。 たとえば、cross-initializeを使用してROS2ソースコードをダウンロードしたり、cross-colcon-buildを使用してビルドしたりできます。 これらのコマンドは、.bashrcにある単純なbash関数です。 たとえば、次のように入力すると、コマンドがどのように実装されているかを確認できます。 cross-initializeと入力し、必要に応じて変更します。 したがって、Dockerコンテナタイプでは次のようになります。
1 |
cross-initialize |
to download the ROS2 source code. By default, it will initialize the ROS2 Foxy distribution, but if you want to change it you can use ROS_DISTRO environment variable, e.g. for ROS2 Dashing:
ROS2ソースコードをダウンロードします。 デフォルトでは、ROS2 Foxyディストリビューションが初期化されますが、変更する場合は、ROS_DISTRO環境変数を使用できます。 ROS2 Dashingの場合:
注:今回はFoxyを使うので以下は不要です。
1 |
export ROS_DISTRO=dashing |
To compile the ROS2 source code execute:
ROS2ソースをコンパイル
cyclonddsでビルドエラーが出ます。直し方が分かりませんでした。ただ今回は不要なので、ソースを削除しておきます。
1 |
rm -rf ~/ros2_ws/src/eclipse-cyclonedds |
ros2topicをビルド
1 |
cross-colcon-build --packages-up-to ros2topic |
注:sshfsを使った場合
予期しないビルドエラーが結構出ます。XXが見つからないとか、XXが無いとか….。都度対処が必要になります。そんなわけない….と感じたら、再度cross-colcpn-buildを実行してみてください。
また、コネクションが切れてfatal-error になることもあります。
sshfsで再度マウントして、cross-colcpn-buildを再実行してみてください。
Flag --packages-up-to ros2topic
will compile ros2topic
and all it’s recursive dependencies. Also, note that it can happen that you need to run the command twice to compile fastrtps
package.
Flag –packages-up-to ros2topicは、ros2topicとそのすべての再帰的な依存関係をコンパイルします。 また、fastrtpsパッケージをコンパイルするためにコマンドを2回実行する必要がある場合があることに注意してください。
こんな感じですが、今回は実行しません(というか、fastrtpsはros2topicビルド時に作成されます)。
1 |
cross-colcon-build --packages-up-to fastrtps |
ビルドが無事終了したら…….
Using the Cross-Compiled ROS2 on your Raspberry Pi
To use the cross-compiled ROS2 on your Raspberry Pi you have to copy ./ros2_ws/install to the Raspberry Pi:
Raspberry PiでクロスコンパイルされたROS2を使用するには、./ros2_ws/installをRaspberryPiにコピーする必要があります。
1 |
scp -r install pi@[raspberry_pi_ip]:/home/pi/ros2 |
結構な数のファイルが転送されます。
使ってみる
Jetson Nano とラズパイZeroでROS2を使ったtopic通信をやってみます。
Jetson側でのROS2環境設定は「Jetson Nanoで学習済みモデルを使って、いろいろやってみる(8-1)ROS2(DDS)」をご参照。
Zero側
ROS2フォルダーが作成されています。
以下を実行してROS2コマンドが使えるようにセットアップします。
1 |
source /home/pi/ros2/local_setup.bash |
Jetson Nano で作成しておいたROS2環境から、メッセージをPublishしたものを、Zero側でSubscribeしてみます。
注:
run実行には直接は関係しませんが、ROS2起動時にlarkというモジュールがない、というメッセージが出る場合
1 2 |
sudo apt install python3-pip pip3 install lark |
JetsonからメッセージをPublish
1 |
ros2 run demo_nodes_py talker |
ZeroでメッセージをSubscribe
1 |
ros2 topic echo /chatter |
では反対に、topicを使ってZeroからメッセージをpublishしてみます。
1 |
ros2 topic pub /chatter std_msgs/String "data: Hello ROS Users" |
JetsonでメッセージをSubscribe
1 |
ros2 topic echo /chatter |
Next
2:ROS2をプリセットしたZero用のOSイメージを作成してみる
Appendix
【start_docker.sh】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/bin/bash set -e if [ ! -d "./ros2_ws" ]; then sudo mkdir -p ./ros2_ws sudo chmod 777 ./ros2_ws fi touch ./ros2_ws/.dockerignore if [ ! -d "./rootfs" ]; then sudo mkdir -p ./rootfs sudo chmod 777 ./rootfs fi echo "Building docker image..." sudo docker build -t rpi_cross_compile -f Dockerfile . sudo docker run -it \ --device /dev/fuse \ --cap-add SYS_ADMIN \ --security-opt apparmor:unconfined \ -v $PWD/rootfs:/home/develop/rootfs \ -v $PWD/ros2_ws:/home/develop/ros2_ws \ rpi_cross_compile \ /bin/bash |
Leave a Reply