在 NVIDIA Jetson Xavier NX 开发板上设置Intel® RealSense™ 深度相机 D455 的过程相当繁琐,我不得不从多个不同的 GitHub 问题中收集信息。因此,我决定通过这篇博客文章为你提供一个捷径,以便你尝试进行相同的设置。

在使用相机与 NVIDIA 开发板时,我遇到的第一个问题是,缺乏预构建的 RealSense SDK 二进制发行版。由于 Jetson 开发板基于 ARM 芯片组,因此我需要在设备本身从源代码构建 SDK。

首先,我安装了以下依赖项:

sudo apt install libssl-dev

安装好依赖项后,我下载了源代码,解压并创建了构建目录:

# 获取源代码并解压
wget https://github.com/IntelRealSense/librealsense/archive/refs/tags/v2.48.0.zip
unzip v2.48.0.zip
cd librealsense-2.48.0
mkdir build && cd build

接下来,我设置了 PATH 环境变量,以告知构建脚本 CUDA 的位置:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64
export PATH=$PATH:$CUDA_HOME/bin

首先,用以下命令进行简单的构建测试,以查看构建是否可能成功:

cmake ../ -DFORCE_RSUSB_BACKEND=ON -DBUILD_PYTHON_BINDINGS:bool=true -DPYTHON_EXECUTABLE=/usr/bin/python3

构建成功后我尝试了更高级的构建,这将构建示例程序,并包括一些优化,例如构建带有 CUDA 支持的版本,以便在包含 NVIDIA GPU 的设备(如 Jetson)上进行更快的对齐处理。

cmake ../ -DFORCE_RSUSB_BACKEND=ON -DBUILD_PYTHON_BINDINGS:bool=true -DPYTHON_EXECUTABLE=/usr/bin/python3 -DCMAKE_BUILD_TYPE=release -DBUILD_EXAMPLES=true -DBUILD_GRAPHICAL_EXAMPLES=true -DBUILD_WITH_CUDA:bool=true

构建成功后,终于到了安装的时候!

make -j4
sudo make install

现在 pyrealsense2 应该已经安装好了,但仍然可能出现两个错误。

解决路径问题

将 pyrealsense 的安装路径添加到 PYTHONPATH 中,否则 Python 安装将无法识别该模块。将以下内容添加到 .bashrc 文件中:

export PYTHONPATH=/usr/local/lib/python3.6/pyrealsense2

如果已经向 PYTHONPATH 添加了其他库,可以使用以下命令:

export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.6/pyrealsense2

解决权限问题

尽管此时可以导入该模块,但访问相机时可能仍然会遇到问题。这可以通过添加 SDK 源代码中提供的规则轻松解决。

bash

sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && udevadm trigger

重新启动系统后,规则应该已经应用,可以通过以下命令找到 RealSense 设备:

作为最后一步,我在 Python 脚本中调用了该库:

python复制

import pyrealsense2 as rs
import numpy as np
import cv2

width = 640
height = 360

pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, width, height, rs.format.z16, 30)
config.enable_stream(rs.stream.color, width, height, rs.format.bgr8, 30)

profile = pipeline.start(config)

depth_sensor = profile.get_device().first_depth_sensor()
depth_scale = depth_sensor.get_depth_scale()

print("Depth Scale is: ", depth_scale)

try:
while True:
frames = pipeline.wait_for_frames()
depth_frame = frames.get_depth_frame()
color_frame = frames.get_color_frame()
if not depth_frame or not color_frame:
continue

# 将图像转换为 numpy 数组
depth_image = np.asanyarray(depth_frame.get_data())
color_image = np.asanyarray(color_frame.get_data())
depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

depth = depth_image[320,240].astype(float)*depth_scale

cv2.imshow('rgb', color_image)
cv2.imshow('depth', depth_colormap)
print(f'Depth: {depth} m')

if cv2.waitKey(1) == ord("q"):
break
finally:
pipeline.stop()