ogochan
さて、Stereo Pi V1にUbuntuが動いてカメラが動きました。次は当然ROSのインストールです。
あれやこれややって何とか動くところまで来ました。
序
とりあえず前回インストールした環境でROSのインストールを試みます。
ROSのインストールについては、
VR徘徊(2) Orange Pi 5にROS2をインストールする
に書いた通りです。
ところが、ROSの構築の最後のステップ、つまりbuildでつまづきます。
問題
buildの問題となったものは、
- コンパイルエラーが出るものがある
多分ARM 32bit Ubuntuではコンパイル出来ないものがある - コンパイル中にメモリ不足が起きる
Stereo Pi V1は中身がCM3なので、メモリが1GBしかありません。OOM Killerが発動したものが結構あります - 遅い
Orange Pi 5は高速なマシンだったのですねぇ... - そもそもディスク不足
というものです。ARM 32bit Ubuntuではコンパイル出来ないものは、--packages-skip
で逃げたりしてみたのですが、あまりに多いので挫折しました。
解決
コンパイルに関しては、結局ARM 64bit Ubuntuを再インストールしてコンパイルが通るようになりました。
メモリ不足は意外だったのですが、高々コンパイルしかしないのにメモリ食うんですねぇ。gccでメモリ不足でコンパイル出来ないなんて、Ver 1.36の時代を思い出してしまいました。これはswapを作ることで逃げました。もっともeMMCと言うか半導体ディスク相手にswapというのは「一体何をしているんだ?」という感じがします。
遅いのはどうしようもないんですが、try and errorを繰り返してますから本当にどうしようもなく。
ということでこの辺でStereo Pi V1でのself buildは諦めました。まぁ動いてさえいればいいことなので、self buildにこだわる必要はありません。幸いROSの実行環境は
ROSのフォルダをまるっとコピー
で複製可能なので、Orange Pi 5でbuildしたものをStereo Piに移して、必要なものはOrange Pi 5からscp等で追加してやるということにしました。となると、当然build出来るかどうかと関係なく、Stereo Pi側の環境もARM64環境となります。
ディスク不足はなかなか大変で、ARM64環境でのROS2はだいたい12GBくらい必要なんですが、ARM64 UbuntuにROS開発環境の諸々をインストールした時点でeMMCの空きは8GB程度しかありません。全然入りそうにありません。
結局、~/ros2_iron/
の下にある
- 明らかに不要そうなモジュール
デモとかサンプルとか - コンパイルした時に生成される中間的なファイル
要するに.o
- ログやら何やら
を消して6GB程度に圧縮しました。これでコピーできるようになりました。
確認
あまり深く考えずに、Stereo Pi側で、
$ ros2 run demo_nodes_cpp talker
[INFO] [1706784505.898756911] [talker]: Publishing: 'Hello World: 1'
[INFO] [1706784506.898039529] [talker]: Publishing: 'Hello World: 2'
[INFO] [1706784507.898031413] [talker]: Publishing: 'Hello World: 3'
[INFO] [1706784508.898236268] [talker]: Publishing: 'Hello World: 4'
[INFO] [1706784509.898058368] [talker]: Publishing: 'Hello World: 5'
[INFO] [1706784510.898068386] [talker]: Publishing: 'Hello World: 6'
[INFO] [1706784511.898079188] [talker]: Publishing: 'Hello World: 7'
[INFO] [1706784512.898030409] [talker]: Publishing: 'Hello World: 8'
[INFO] [1706784513.897998874] [talker]: Publishing: 'Hello World: 9'
[INFO] [1706784514.898079839] [talker]: Publishing: 'Hello World: 10'
と起動してやってから、Orange Pi 5側で、
$ ros2 run demo_nodes_py listener
[INFO] [1706784575.957439015] [listener]: I heard: [Hello World: 31]
[INFO] [1706784576.916636551] [listener]: I heard: [Hello World: 32]
[INFO] [1706784577.915786170] [listener]: I heard: [Hello World: 33]
[INFO] [1706784578.917546040] [listener]: I heard: [Hello World: 34]
[INFO] [1706784579.916813825] [listener]: I heard: [Hello World: 35]
[INFO] [1706784580.915861654] [listener]: I heard: [Hello World: 36]
[INFO] [1706784581.918972295] [listener]: I heard: [Hello World: 37]
[INFO] [1706784582.926861736] [listener]: I heard: [Hello World: 38]
という感じで動いてくれました。同じネットワーク上だと適当に探してくれるのですね。この辺、実際の運用ではインターネット越しになるので、またいろいろ考えなきゃいけないわけですが、今のところは動いた動いたってことで満足しておきます。
まとめ
既にやったことなんで簡単だろうと舐めていたんですが、なかなかに面倒臭い問題が起きますね。ROSしか動かさないからeMMC余裕だろと思ってたんですが、案外必要だってこともわかりました。「組み込みのプロの間ではROSは敬遠されがち」ということの意味もよくわかったような気がします。
ただ、お陰でいろんな割り切るべき点がはっきりしたので、そういった意味では良かったと思います。
次回は実際にルンバにつないで動かしてみたいと思います。