RealSense D455 2

RealSense D455で写真撮影できるようにするところまで進めます。

とにかくやってみる

下記を実行できるようにすることが本稿の目的です。

rs-capture Sample
rs-capture.cpp

Examplesを順番にやると、先頭の10Bytesをprintfで表示するとかをやることになります。これはD455を買った人がやることではなくて、D455を作る人がやる疎通の検証と思います。

とにかくやってみる前に準備する

何事にも準備は大事です。

CPATH

CPATHはUNIX環境であれば使えるはずの環境変数です。
.hや.hppを置いている場所を記述して、探しに行かせます。

Environment Variables
CLANG(1)

(1)ってなんだったっけという人は、macまたはUbuntuを使っているとして下記で確認できます。


$ man man

1行だけのソースコードを作成します。


$ cd ~/develop
$ vi 001.cpp

001.cpp

#include <librealsense2/rs.hpp>

rs.hppを探します。

findの使い方の詳細は下記で説明しています。

探す


$ cd ~/develop/vcpkg
$ find . -name "rs.hpp"

include path listの設定をします。
$CPATHに何も入っていなくても入っていても、上手くいくよくやる方法です。


$ vi ~/.bashrc

.bashrc

CPATH=/home/jn/develop/vcpkg/packages/realsense2_x64-linux/include:$CPATH
export CPATH

$ printenv
$ . ~/.bashrc
$ printenv

$ g++ 001.cpp -o 001

少し怒られるけど、成功です !!

LIBRARY_PATH

LIBRARY_PATH
.aと.soを置いている場所を記述して、探しに行かせます。

Environment Variables Affecting GCC

ソースコードを追記します。

001.cpp

#include <librealsense2/rs.hpp>

int
main(void)
{
    rs2::pipeline p;

    return EXIT_SUCCESS;
}

コンパイルします。


$ g++ 001.cpp -o 001

怒られます。


/usr/bin/ld: in function `rs2::pipeline::pipeline(rs2::context)':
001.cpp: undefined reference to `rs2_create_pipeline'

ldはlinkerです。
Wikipediaから名前の由来は下記らしいです。このあたりの古い情報(大体Internet以前)になるとまず出てこないのがUNIXです。

On Unix and Unix-like systems, the linker is known as “ld”. Origins of the name “ld” are “LoaDer” and “Link eDitor”. The term “loader” was used to describe the process of loading external symbols from other programs during the process of linking.

Linker (computing)

当たりをつけます。
grはaliasです。下記、参照。なんとなくわかる人は、読まないでgrep使ってください。

探す


$ cd ~/develop/vcpkg
$ find . -name "*realsense*" | less
$ gr rs2_create_pipeline -r .

findの結果から抜粋。


/packages/realsense2_x64-linux/lib/librealsense-file.a
./packages/realsense2_x64-linux/lib/librealsense2.a

grepの結果から抜粋。


Binary file ./packages/realsense2_x64-linux/lib/librealsense2.a matches

libの下のlibrealsense2.aを使うことにします。

.bashrc

LIBRARY_PATH=/home/jn/develop/vcpkg/packages/realsense2_x64-linux/lib:$LIBRARY_PATH
export LIBRARY_PATH


$ . ~/.bashrc
$ g++ 001.cpp -l realsense2 -o 001

まだ、怒られます。libの下を全て読み込むようにします。


$ g++ 001.cpp -l realsense2 -l fw -l realsense-file -o 001

まだ、怒られます。付け加えます。

.bashrc

LIBRARY_PATH=/home/jn/develop/vcpkg/packages/realsense2_x64-linux/lib:$LIBRARY_PATH
LIBRARY_PATH=/home/jn/develop/vcpkg/packages/libusb_x64-linux/lib:$LIBRARY_PATH
export LIBRARY_PATH

$ . ~/.bashrc
$ g++ 001.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -o 001

まだ、怒られます。pthread関連が無いとたくさん怒られています。


$ find . -name "libpthread.a"
$ find /usr -name "libpthread.a"

/usrの下に見つかりました。

.bashrc

LIBRARY_PATH=/home/jn/develop/vcpkg/packages/realsense2_x64-linux/lib:$LIBRARY_PATH
LIBRARY_PATH=/home/jn/develop/vcpkg/packages/libusb_x64-linux/lib:$LIBRARY_PATH
LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
export LIBRARY_PATH

$ . ~/.bashrc
$ g++ 001.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -o 001

まだ、怒られます。しかし、もう上手く行きそうです。


$ find /usr -name "*libudev*"

こちらは.aはなくて.soがあります。


$ g++ 001.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -l udev -o 001

成功 !!

バイナリが300MB弱もある !!

余談

ソースコードがほとんど無いためか、fwが無くてもコンパイルが通ります。
忘れてしまうので、付けっ放しの方がいいと思います。


$ g++ 001.cpp -l realsense2 -l realsense-file -l usb-1.0 -l pthread -l udev -o 001

root file system直下の構成

こんなときは/usrの下を探す、に決まっているのですが、慣れている人でないと厳しいでしょう。

残念ながら、自分はroot file system直下の説明について、非常にわかりやすいというものを読んだ記憶がありません。

最初は下記のそれぞれの下を覚えていくと良いと思います。

  • /usr
  • /usr/local
  • /var
  • /etc

凄く頭の良い人達が設計して、長い年月の淘汰を生き残った仕様なので、わからないことはないと思います。
C言語も同じと思うのですが、どうしてもC言語が合わないと言う人を複数知っているので、UNIXが合わない人も複数いるのでしょう。

ただの仕様とか約束事だから丸暗記すれば使えるようにはなると思います。
ですが、機能の数だけファイルやディレクトリがあるわけで、それが膨大すぎて立ち向かう気が失せる気持ちはわかります。

libudev.soとか言われてもわかんねーよ、なんだよしらねーよ、という気持ちもわかりますが、1つずつ確実にわからないことを潰していくしかありません。

こんなことで喜んでいないで写真を撮らないと

ここからが本番です。
0000000000のところは自分の環境に合わせてください。


$ cd ~/develop
$ ln -s vcpkg/buildtrees/realsense2/src/0000000000-0000000000.clean/examples ex
$ ln -s vcpkg/buildtrees/realsense2/src/0000000000-0000000000.clean/wrappers wrap
$ ln -s vcpkg/buildtrees/realsense2/src/0000000000-0000000000.clean rs
$ cd ex
$ cd capture

$ g++ rs-capture.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -l udev -o capture

example.hppが見つからないと起こられます。


$ g++ rs-capture.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -l udev -I ../ -o capture

glfw3.hが無いと怒られます。


example.hpp:10:10: fatal error: GLFW/glfw3.h: No such file or directory

黙らせます。


$ sudo apt install libglfw3-dev

The following NEW packages will be installed:
  libegl-dev libegl1-mesa-dev libgl-dev libgl1-mesa-dev libgles-dev libgles1 libglfw3 libglfw3-dev libglvnd-dev libglx-dev libopengl-dev libopengl0 libpthread-stubs0-dev libvulkan-dev libwayland-bin
  libwayland-dev libx11-dev libxau-dev libxcb1-dev libxdmcp-dev libxext-dev libxrandr-dev libxrender-dev x11proto-core-dev x11proto-dev x11proto-randr-dev x11proto-xext-dev xorg-sgml-doctools xtrans-dev

[Y/n] Y

$ g++ rs-capture.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -l udev -I ../ -o capture

glu.hが無いと怒られます。


/usr/include/GLFW/glfw3.h:215:13: fatal error: GL/glu.h: No such file or directory

結局、このあたりの操作はlibrealsense本家に書かれていることを1つずつやっていることになります。

Linux Ubuntu Installation

インストールできるか確認します。


$ apt search mesa

インストールします。


$ sudo apt install libglu1-mesa-dev

$ g++ rs-capture.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -l udev -I ../ -o capture

しばらく戻ってこないので成功かと思ったら、怒られました。
OpenGL系が全滅の勢いに見えます。


/usr/bin/ld: in function `set_viewport(rect const&)':
rs-capture.cpp: undefined reference to `glViewport'

$ cd /usr
$ gr glViewport -r .

grepの結果から抜粋。

libGL.so.1.7.0を使うことにします。だめならlibOpenGL.so.0.0.0を使います。
sudo apt install libglfw3-devのところを見てください。どちらもlibglfw3-devのインストールのときにインストールしています。


Binary file ./lib/x86_64-linux-gnu/libOpenGL.so.0.0.0 matches
Binary file ./lib/x86_64-linux-gnu/libepoxy.so.0.0.0 matches
Binary file ./lib/x86_64-linux-gnu/libgtk-3.so.0.2404.16 matches
Binary file ./lib/x86_64-linux-gnu/libGL.so.1.7.0 matches
Binary file ./lib/x86_64-linux-gnu/libGLESv1_CM.so.1.2.0 matches
Binary file ./lib/x86_64-linux-gnu/libgdk-3.so.0.2404.16 matches
Binary file ./lib/x86_64-linux-gnu/libwebkit2gtk-4.0.so.37.55.4 matches
Binary file ./lib/x86_64-linux-gnu/libGLX_mesa.so.0.0.0 matches
Binary file ./lib/x86_64-linux-gnu/libcogl.so.20.4.2 matches
Binary file ./lib/x86_64-linux-gnu/libGLESv2.so.2.1.0 matches
Binary file ./lib/x86_64-linux-gnu/libGLdispatch.so.0.0.0 matches

$ cd -
$ g++ rs-capture.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -l udev -l GL -I ../ -o capture

あとは、glfwとgluだけが残りました。


$ cd /usr
$ gr glfwWindowShouldClose -r .

.aまたは.soは、下記だけが該当します。


Binary file ./lib/x86_64-linux-gnu/libglfw.so.3.3 matches

$ gr gluPerspective -r .

.aまたは.soに該当したものを列挙します。


Binary file ./lib/x86_64-linux-gnu/gstreamer-1.0/libgstopengl.so matches
Binary file ./lib/x86_64-linux-gnu/libGLU.a matches
Binary file ./lib/x86_64-linux-gnu/libGLU.so.1.3.1 matches

$ cd -
$ g++ rs-capture.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -l udev -l GL -l glfw -l GLU -I ../ -o capture

成功 !!


$ ./capture

怒られます。権限が無くてdeviceをopenできないようです。RealSenseのことでしょう。
原因追求は後回しにします。


$ sudo ./capture

成功 !!

examples/pointcloud/rs-pointcloud.cpp


$ cd ../pointcloud
$ g++ rs-pointcloud.cpp -l realsense2 -l fw -l realsense-file -l usb-1.0 -l pthread -l udev -l GL -l glfw -l GLU -I ../ -o pointcloud
$ sudo ./pointcloud

広告

IT開発関連書とビジネス書が豊富な翔泳社の通販『SEshop』
さくらのレンタルサーバ
ムームードメイン
Oisix(おいしっくす)
らでぃっしゅぼーや
珈琲きゃろっと
エプソムソルト




«       »