最近ROSの開発に使用するPCを新しくしました。そこでRViz/RViz2などのOpenGLを使うソフトウェア周りでトラブルがあったので、その内容と対処方法を紹介します。
この記事はROS 2 Advent Calendar 2024の12/20の記事として投稿しています。
要約
今回から新たな取り組みとしてChatGPTを使って本記事を要約した内容も紹介しておくことにします。ChatGPT o1で要約しました。
本記事ではUbuntu 20.04を新しいIntel CPUとDocker環境で利用する際に生じるRVizのソフトウェアレンダリング問題を、kisak-mesa PPAから最新のMesaドライバを導入して解決する手順を紹介します。
背景
ROSとUbuntuディストリビューションの関係
ROSの開発では、使用するROSのディストリビューションが対応するUbuntuのバージョンに制約されることがよくあります。たとえば、ROS 1の最後のディストリビューションであるROS NoeticはUbuntu 20.04での利用が前提とされており、このバージョンは2025年4月までサポートされます。そのため、Ubuntu 20.04を引き続き使用する必要がある状況が生じることもあります。
ROS 2/ROS 1のメッセージを変換するためのros1_bridgeも、基本的にはROS NoeticとあわせてUbuntu 20.04でROS 2 Foxy/Galacticで動かすことが多いと思います。
Ubuntu 20.04と最新CPUの対応状況
標準構成のUbuntu 20.04では、IntelのCPU内蔵GPU(iGPU)ドライバであるintel-media-driver(mesa)は 21.2.6
が最新のものとしてビルド済のバイナリが用意されているようです。このため、IntelのCPUは最新が第15世代となっていますが(2024年12月現在)、Ubuntu 20.04の標準的なソフトウェアで対応しているPCは、IntelのCPUのものの場合には第10~12世代までに限定されている状況です。
AMDのCPUはあまり使わないので詳しくは把握できていませんが、最新世代のCPUに対応したドライバがUbuntu 20.04では入手しづらい※というのはある程度似ているようです。
※ここでいう「入手しづらい」というのは、自分でソースからビルドしたり、有志によってビルドされたバイナリを入手してくる必要があるなどを指します。
Lenovoのサイトには各PCごとにOS対応表がありますが、最新のものはUbuntu 22.04や24.04が必要になってくるようです。
ROS開発の際のPC選び
CPUとOSの対応状況を考えたとき、Ubuntu 20.04をインストールするPCとしてIntelのCPUを選ぶ場合は第11世代か第12世代のものを搭載したものを調達するのが楽そうではあるものの、残念ながらだんだん新品では調達しづらくなって来ているようです。中古で出回っているものもありますが、多くはIntelだと第8~10世代のCPUを搭載したものが多く、さらにメモリが若干少ないような印象があります。CPUが少し古くても何とかなりますが、メモリが少ないのは困ります。
そうなってくるともう少し新しい世代のCPUを搭載したPCを調達してUbuntu 22.04や24.04などをインストールし、仮想マシンやDockerを使って開発するのが良さそうです。
新しいPCで発生した問題
GPUレンダリングの問題とその原因
Ubuntu 20.04の標準的な環境では、最新のIntel CPU向けのグラフィックスドライバが提供されていません。たとえホストマシンで新しいOSと最新ドライバを使用していても、Dockerを使ってUbuntu 20.04のコンテナを起動し、ホストマシンへX11転送を行うと、GPUでOpenGLのソフトウェアをレンダリングできない状況が発生するようです。
このため、RVizを使用する際に常にソフトウェアレンダリングに切り替わり、CPU使用率が100%に張り付くという問題に遭遇しました。
mesaバージョンの違いによる影響
色々調べたところ、下記のフォーラムで第13世代のRaptor Lakeに対応しているのは mesaのバージョン22.4.2
以降であると書かれているのを見かけました。
最新版のドライバを使うことでこの問題は解決できる可能性が高そうと考え、Ubuntu 20.04のDockerイメージに新しいバージョンのmesaをインストールしてみたところ問題が解決できたので、詳細を共有します。
解決方法:Ubuntu 20.04のDockerイメージを修正
今回は有志が提供するバイナリを使用する方法でUbuntu 20.04のDockerイメージを用意し、Intelの第13世代CPUであるi5-1335U搭載のPCでもRVizを問題なく使えるようにする方法を紹介します。
実際に下記の環境で確認しました。
- CPU:Intel Core i5-1335U(第13世代)
- OS:Ubuntu 22.04.5
- Docker:Docker Engine Version 27.3.1
使用するのは下記のPPA(Personal Package Archives)リポジトリです。
Dockerfileでは上記の有志が提供するPPAを使用してmesaドライバをインストールするようにします。具体的には、下記のRUNコマンドを追加します。
# install the latest intel media driver to use GPU
# Avoid libGL error: failed to create dri screen
# https://bugs.launchpad.net/ubuntu/+source/intel-media-driver/+bug/2004237
RUN apt-get update && \
apt-get install -y software-properties-common && \
add-apt-repository ppa:kisak/kisak-mesa && \
apt-get update && \
apt-get upgrade -y && \
apt-get install -y libegl-mesa0 && \
rm -rf /var/lib/apt/lists/*
このDockerfileのようにUbuntu 20.04に新しいmesaドライバをインストールすることで、下記のようにRVizのCPU使用率を大幅に下げて開発ができるようになりました。
RVizのCPU使用率が改善された様子を以下のスクリーンショットで示します。上が変更前、下が変更後です。
まとめ
今回は、Ubuntu 20.04のDockerイメージを最新のIntel CPU環境で利用する際に発生するRVizのGPUレンダリング問題について、その原因と解決策をまとめました。
具体的には、有志のkisak-mesa PPAを利用してmesaの最新版をインストールする方法で解決できました。この方法はAMDのCPUでも同様の効果が期待できる可能性があります。RVizのパフォーマンスにお困りの方はぜひ試してみてください。
コメント