2023 年 02 月 13 日 Linux 技術ネタ
第 2 部では、Advantech 社から提供されている RSB-3720 ボードに対して、Intel RealSense™ depth camera D435 を使用するための、起動イメージの構築、RealSense SDK のインストール、Python を用いた自作プログラム実装の流れを説明します。
RSB-3720 は、Advantech 社が開発した ARM プロセッサ搭載の小型モジュールです。主な機能としては
といったものがあります。
| Memory | On-board LDDDR4 4GB/6GB |
|---|---|
| CPU | NXP i.MX8M Plus Cortex-A53 Quad/Dual core(up to 1.8GHz) |
| Linux | Yocto Linux & Android |
| Power Supply Voltage | 12V |
| Power Consumption | 7.13W (Max) |
| Dimension (mm) | 100 x 72 x 19 mm |
各機器、ケーブルを 3.2 節の接続図のように接続します。
電源ケーブルを接続すると、すぐにボードが起動します。起動スイッチはありません。SW1 は起動方式を選択するためのスイッチです。以下の表のように設定します。(上:ON 下:OFF)
| 起動方式 | SW1-1 | SW1-2 | SW1-3 | SW1-4 |
|---|---|---|---|---|
| emmc ブート | OFF | ON | OFF | OFF |
| SD ブート | ON | ON | OFF | OFF |
USB ポートにキーボードやマウスを接続すると、HDMI ディスプレイ上の GUI の操作を行うことができます。
SD カードに書き込むイメージについては、次章で説明します。
各種機器やケーブルは以下の図のように接続します。

ホストPC (Ubuntu20.04.1 LTS) にて、起動イメージの構築作業を行います。Advantech が提供しているUbuntu イメージを以下のリンクからダウンロードします。
起動用 SD カードに Ubuntu イメージを書き込みます。
$ gzip -d 3720A1AIM30UIVA0362_iMX8MP_6G_2021-11-29.img.gz SDカードのデバイス名が /dev/sdx の場合 $ sudo dd if=3720A1AIM30UIVA0362_iMX8MP_6G_2021-11-29.img of=/dev/sdx bs=1M conv=fsync
Ubuntu イメージを書き込んだ SD カードをターゲットボードに差し込み、起動確認を行います。
以下より、RSB-3720 上でのコマンド操作を背景黄色で表現します。
次のユーザでログインできることを確認します。
ディストリビューションのバージョンを確認します。
SD カード内の Ubuntu (aarch64) イメージに対して RealSense SDK の導入を行い、自作プログラムを実装します。
必要なパッケージをインストールします。
Github から RealSense SDK のソースファイルをダウンロードして、ビルドとインストールを行います。
以下のコマンドより realsense-viewer が起動します。
以下のような Depth カメラと RGB カメラの映像が表示されれば、OK です。

いよいよ本題となる、Python を用いた自作プログラムの実装にチャレンジしていきます。
Python 本体と pip をインストールします。
後に使用するモジュールをインストールします。
Intel RealSense SDK 内に用意されている Python モジュールをビルドしてインストールします。
標準に設定されている Python のバージョンを確認して、そのバージョンで指定されたライブラリ内に RealSense 用の so ファイルが生成されていることを確認します。
Python の site-packages に生成された so ファイルのシンボリックリンクを作成します。
Intel RealSense SDK 内に用意されているサンプルプログラムを動かしてみます。
RGB カメラと Depth カメラの映像が表示されます。

RGB カメラの背景画像が深度情報よりフィルタリングされます。

SDK 内のサンプルプログラムが動作することが確認できましたので、RealSense の Python 環境構築は問題なさそうです。
そこで、自作プログラムの作成をトライしてみます。まずはワークスペースを準備します。
サンプルプログラムを参考にし、RealSense に搭載されている 4 つのカメラ (IR1, IR2, Depth, RGB) の映像を表示するプログラムを作成しました。
import pyrealsense2 as rs
import numpy as np
import cv2
# ストリームの設定
config = rs.config()
config.enable_stream(rs.stream.infrared, 1, 640, 480, rs.format.y8, 30)
config.enable_stream(rs.stream.infrared, 2, 640, 480, rs.format.y8, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
# ストリーミング開始
pipeline = rs.pipeline()
pipeline.start(config)
try:
while True:
# フレーム待ち
frames = pipeline.wait_for_frames()
#IR1
ir_frame1 = frames.get_infrared_frame(1)
ir_image1 = np.asanyarray(ir_frame1.get_data())
#IR2
ir_frame2 = frames.get_infrared_frame(2)
ir_image2 = np.asanyarray(ir_frame2.get_data())
# RGB
color_frame = frames.get_color_frame()
color_image = np.asanyarray(color_frame.get_data())
# 深度
depth_frame = frames.get_depth_frame()
depth_image = np.asanyarray(depth_frame.get_data())
# 2次元データをカラーマップに変換
ir_colormap1 = cv2.applyColorMap(cv2.convertScaleAbs(ir_image1), cv2.COLORMAP_JET)
ir_colormap2 = cv2.applyColorMap(cv2.convertScaleAbs(ir_image2), cv2.COLORMAP_JET)
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.02), cv2.COLORMAP_JET)
# イメージの結合
images = np.vstack(( np.hstack((ir_colormap1, ir_colormap2)), np.hstack((color_image, depth_colormap)) ))
# 表示
cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
cv2.imshow('RealSense', images)
# q キー入力で終了
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
finally:
# ストリーミング停止
pipeline.stop()
表示した映像が以下となります。上 2 つが赤外線カメラ (IR1, IR2)、左下が RGB カメラ、右下が Depth カメラの映像となります。

応用編として、RealSense から物体までの距離を測定するプログラムを作成しました。
import pyrealsense2 as rs
import numpy as np
import cv2
# ストリームの設定
config = rs.config()
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
# ストリーミング開始
pipeline = rs.pipeline()
pipeline.start(config)
# Alignオブジェクト生成
align_to = rs.stream.color
align = rs.align(align_to)
try:
while True:
# フレーム待ち
frames = pipeline.wait_for_frames()
# RGBとDepthの位置ずれを修正
aligned_frames = align.process(frames)
# RGB
color_frame = aligned_frames.get_color_frame()
color_image = np.asanyarray(color_frame.get_data())
# 深度
depth_frame = aligned_frames.get_depth_frame()
depth_image = np.asanyarray(depth_frame.get_data())
# 2次元データをカラーマップに変換
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.02), cv2.COLORMAP_JET)
### 画像処理 ###
# ポイントで指定した箇所の奥行きを計算
px = 320
py = 240
depth_data = depth_frame.get_distance(px, py)
# ポイントにマーカーと距離を表示
depth_str = str(round(depth_data, 2)) + "m"
cv2.drawMarker(color_image, (px,py), (0,0,255))
cv2.putText(color_image, depth_str, (px,py), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,0,255), thickness=2)
cv2.drawMarker(depth_colormap, (px,py), (0,0,255))
cv2.putText(depth_colormap, depth_str, (px,py), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,0,255), thickness=2)
### 画像処理 end ###
# イメージの結合
images = np.hstack((color_image, depth_colormap))
# 表示
cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
cv2.imshow('RealSense', images)
# q キー入力で終了
if cv2.waitKey(1) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
finally:
# ストリーミング停止
pipeline.stop()
カメラから 50cm 間隔で時計を配置し、距離を計測します。


表示された映像が以下となります。
画面中央にあるマーカーの画素で奥行を測定しています。測定データを元に距離 (m) データに変換し、画面上に表示しています。



RSB-3720 上でも、第 1 回目と同様に RealSense カメラの動作環境を構築することができました。
今回はサンプルアプリケーションだけでなく、Python を用いて自作したプログラムでカメラ表示を行ってみましたが、比較的容易にプログラムを書くことができ、開発の幅が広がったと感じます。
Python からの制御ができるメリットとして、ML ソフトウェア開発との親和性があると考えます。
NXP i.MX8M Plus の Linux 環境では、NXP 社から ML ソフトウェア開発のベースプラットフォームとして、eIQ® ML ソフトウェア開 success 発環境 が提供されています。
eIQ を活用することで、ML ソフトウェア開発への着手が容易となります。
NXP i.MX8M Plus をベースとしている、RSB-3720 の BSP (Advantech) でも、eIQ で ML ソフトウェアが構築可能です。
また、ML ソフトウェアは基本的に Python アプリケーションで構成されるため、Intel RealSense と組み合わせることで、物体検出、認識など ML ソフトウェアの開発の加速が期待できます。
2025 年 05 月 14 日 Vigiles サポート
2024 年 09 月 02 日 Vigiles サポート
2024 年 03 月 01 日 Vigiles サポート
2025 年 06 月 04 日 Yocto Project よもやま話
2025 年 06 月 03 日 Yocto Project よもやま話
2024 年 03 月 26 日 Yocto Project よもやま話
2024 年 01 月 10 日 Linux 技術ネタ
2023 年 12 月 12 日 Linux 技術ネタ
2023 年 03 月 31 日 Linux 技術ネタ
2025 年 08 月 08 日 イベントレポート
2024 年 12 月 06 日 イベントレポート
2024 年 07 月 26 日 イベントレポート
2025 年 04 月 01 日 リクルート
2023 年 05 月 30 日 リクルート
2022 年 12 月 27 日 リクルート
2025 年 10 月 06 日 信州リネオ便り
2025 年 07 月 08 日 信州リネオ便り
2025 年 05 月 01 日 信州リネオ便り
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 13 日 マーケティング統括部
2019 年 04 月 25 日 マーケティング統括部
2018 年 12 月 18 日 マーケティング統括部