2021年2月7日日曜日

Raspberry Pi 4の64bit OSでlibrealsenseをビルドする

(2021.2.9 Pythonラッパー(pyrealsense2)を使うを追記)

 目的


Raspberry Pi で RealSense (L515)を扱いたい。
できるならmatadata, 加速度・ジャイロセンサーも使いたい(UVC Backendでなくて)。
このため、Raspberry Piのkernelにpatchを適用・ビルドし、RealSenseが動作する(realsense-viewerが実行できる)ところまでを確認した。

このブログでは、ビルド手順以外でつまったところ、補足的な内容を残す。


リファレンス


以下を参考にした。
1.はRaspberry Piのインストールガイドであるが、UVC_BACKENDでの手順。

2, 4, 5.はRaspberry Pi のkernelにpatchを適用するものだが、当時のkernel バージョンは4.x系で、現在のバージョン(5.x系)ではうまくいかない。


ビルド


ビルド手順については、Githubのリポジトリにアップしたのでそちらを参照。




つまったこと


とくにつまったことを記載する。


kernel pathの作成


librealsenseにあるpatchは以下だが、そのままRaspberry Piのkernel(5.10.13)には適用できなかった。
おそらく、最新のkernel ソースの変更に伴うものであると推測。
このため、上記のpatchをもとにRaspberry Piのkernelに適用できるpatchを作成した。


Raspberry Pi OS 64 bitのkernel ビルド


最初、Raspberry Pi上でのkernelのソースビルドを実行しようとした。
以下は公式ドキュメントの手順。
しかし、いざビルドを行うとエラーとなって実行できない。。。
どうやら、Raspberry Pi OS 64 bitでのkernel ビルドはできないとのこと。
(公式ドキュメントもよく読むとクロスコンパイルの手順はあるけど、64 bitのRaspberry Pi上でのビルド手順はない。。。)
このため、Host PCでのクロスコンパイルを行うこととした。


WSL(Windows Subsystem for Linux)でビルドするとSDカードに書き込みできない...


Raspberry PiのkernelはWSLのUbuntu上でクロスコンパイルが可能(実際できた)。
しかしながら、SDカードへ書き込む際に問題が発生する。
rootsf(ext4)への書き込みが必要だが、Windowsが認識できないためマウントできず書き込めない。。。
結局、Fedora 33(のvirt-managerで動かしているUbuntu)から書き込みを行った。

ただ、WSL2ではext4もマウントできるようなので、上記は私の認識不足かもしれない。。。


librealsenseのビルド


依存関係のあるライブラリの一つにlibapriltag(オプション)がある。
これをインストールしてlibrealsenseをビルドするとビルドエラーとなる。このため、インストールせずにビルドした。
/usr/bin/ld: CMakeFiles/rs-pose-apriltag.dir/rs-pose-apriltag.cpp.o: in function `apriltag_manager::apriltag_pose_destroy(apriltag_pose_t*)':
/home/pi/librealsense-2.41.0/examples/pose-apriltag/rs-pose-apriltag.cpp:106: undefined reference to `matd_destroy'
/usr/bin/ld: /home/pi/librealsense-2.41.0/examples/pose-apriltag/rs-pose-apriltag.cpp:106: undefined reference to `matd_destroy'
/usr/bin/ld: CMakeFiles/rs-pose-apriltag.dir/rs-pose-apriltag.cpp.o: in function `main':
/home/pi/librealsense-2.41.0/examples/pose-apriltag/rs-pose-apriltag.cpp:76: undefined reference to `tag36h11_create()'
/usr/bin/ld: /home/pi/librealsense-2.41.0/examples/pose-apriltag/rs-pose-apriltag.cpp:92: undefined reference to `tag36h11_destroy(apriltag_family*)'
/usr/bin/ld: CMakeFiles/rs-pose-apriltag.dir/rs-pose-apriltag.cpp.o: in function `apriltag_manager::detect(unsigned char*, rs2_pose const*) const':
/home/pi/librealsense-2.41.0/examples/pose-apriltag/rs-pose-apriltag.cpp:123: undefined reference to `estimate_pose_for_tag_homography(apriltag_detection_info_t*, apriltag_pose_t*)'
/usr/bin/ld: /home/pi/librealsense-2.41.0/examples/pose-apriltag/rs-pose-apriltag.cpp:161: undefined reference to `matd_create'
collect2: error: ld returned 1 exit status
make[2]: *** [examples/pose-apriltag/CMakeFiles/rs-pose-apriltag.dir/build.make:92: examples/pose-apriltag/rs-pose-apriltag] エラー 1
make[1]: *** [CMakeFiles/Makefile2:1919: examples/pose-apriltag/CMakeFiles/rs-pose-apriltag.dir/all] エラー 2
make[1]: *** 未完了のジョブを待っています....


32 bit版(Raspberry Pi OS)は?


おそらく、kernelビルドもうまくいくはずだが、試していない。
余力があれば試してみる。


Pythonラッパー(pyrealsense2)を使う(2021.2.9追記)


Pythonでpyrealsense2はimportできるのだが、いざAPIを呼び出すとエラーになることが分かった。


$ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
<<< import pyrealsense2 as rs
<<< pipeline = rs.pipeline()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'pyrealsense2' has no attribute 'pipeline'
<<< quit()

原因はライブラリへのPathが通っていないと推測。
/usr/lib/python3/dist-packages/pyrealsense2/配下にある
  • pybackend2.cpython-37m-aarch64-linux-gnu.so
  • pyrealsense2.cpython-37m-aarch64-linux-gnu.so
が、Pathが通っていないためと推測。

このため、.bashrcにPYTHONPATHを追加することで無事呼び出せることが確認できた。
export PYTHONPATH=$PYTHONPATH:/usr/lib/python3/dist-packages/pyrealsense2/

0 件のコメント:

コメントを投稿