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 ソフトウェアの開発の加速が期待できます。
2024 年 09 月 02 日 Vigiles サポート
2024 年 03 月 01 日 Vigiles サポート
2023 年 08 月 28 日 Vigiles サポート
2024 年 03 月 26 日 Yocto Project よもやま話
2023 年 07 月 25 日 Yocto Project よもやま話
2023 年 06 月 20 日 Yocto Project よもやま話
2024 年 01 月 10 日 Linux 技術ネタ
2023 年 12 月 12 日 Linux 技術ネタ
2023 年 03 月 31 日 Linux 技術ネタ
2024 年 07 月 26 日 イベントレポート
2024 年 07 月 09 日 イベントレポート
2024 年 06 月 03 日 イベントレポート
2023 年 05 月 30 日 リクルート
2022 年 12 月 27 日 リクルート
2022 年 09 月 27 日 リクルート
2024 年 09 月 25 日 信州リネオ便り
2024 年 08 月 20 日 信州リネオ便り
2024 年 08 月 07 日 信州リネオ便り
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 10 日 ソリューション統括部
2019 年 12 月 13 日 マーケティング統括部
2019 年 04 月 25 日 マーケティング統括部
2018 年 12 月 18 日 マーケティング統括部