ハードウェアからサーバ・アプリまでワンストップで開発

VR徘徊(5) StereoPi V1でROSを動かす

メモリが足りない

さて、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は敬遠されがち」ということの意味もよくわかったような気がします。

ただ、お陰でいろんな割り切るべき点がはっきりしたので、そういった意味では良かったと思います。

次回は実際にルンバにつないで動かしてみたいと思います。

最近のエントリー

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル

LED行燈の試作(1)

エントリを書くこと