第一次拿到RealSense D435时,我完全被这个小巧的设备惊艳到了。它比我想象中要轻便许多,重量只有72克左右,三围尺寸约90mm×25mm×25mm,放在手掌上就像个精致的玩具。但千万别被它的外表迷惑,这个小家伙可是Intel推出的专业级深度相机,在机器人视觉领域有着广泛应用。
D435采用了双目立体视觉原理,配备了两个全局快门的RGB摄像头(最高支持1920×1080分辨率)和一个红外投影器。最让我惊喜的是它的深度检测范围,官方标称0.25米到10米,实测在室内环境下,2米范围内的精度可以达到毫米级。记得第一次用它测量桌子的高度,数据与卷尺测量结果相差不到3毫米,这对于机器人避障和导航来说已经相当够用了。
与其他深度相机相比,D435有几个突出优势:
不过在实际使用中我也发现了一些需要注意的地方。比如在强光环境下,红外投影可能会被干扰,导致深度数据出现噪点。另外,虽然标称支持USB2.0,但为了获得最佳性能,强烈建议使用USB3.0接口。我第一次使用时就是插错了接口,结果帧率直接腰斩,排查了半天才发现问题所在。
我推荐使用Ubuntu 20.04 LTS搭配ROS Noetic,这是目前最稳定的组合。虽然ROS2也很火,但对于刚接触ROS的开发者来说,Noetic的文档和社区支持会更友好一些。安装Ubuntu时有个小技巧:记得勾选"安装第三方软件",这样可以省去后续手动安装显卡驱动的麻烦。
系统装好后,第一件事就是配置软件源。我习惯使用清华的镜像源,速度会快很多:
bash复制sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g" /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
ROS的安装看似简单,但有几个坑我必须要提醒大家:
bash复制sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt install ros-noetic-desktop-full
安装完成后,千万别忘了初始化rosdep,这个工具在后面编译驱动时会用到:
bash复制sudo rosdep init
rosdep update
最后把ROS环境变量加到bashrc里,这样每次打开终端都不用重新source了:
bash复制echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
对于刚入门的开发者,我建议先用APT安装官方预编译的SDK,这样最省心:
bash复制sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-key F6E65AC044F831AC80A06380C8B3A55A6F3EFCDE
sudo add-apt-repository "deb https://librealsense.intel.com/Debian/apt-repo $(lsb_release -cs) main" -u
sudo apt update
sudo apt install librealsense2-dkms librealsense2-utils librealsense2-dev
安装完成后,插上相机,运行下面命令测试:
bash复制realsense-viewer
如果能看到相机画面,说明基础驱动已经装好了。这里有个常见问题:如果提示"No device connected",先检查USB接口是不是3.0的,然后试试重新插拔相机。
如果你需要最新功能或者想修改SDK代码,就需要从源码编译了。我建议使用v2.50.0这个稳定版本:
bash复制git clone https://github.com/IntelRealSense/librealsense.git
cd librealsense
git checkout v2.50.0
安装编译依赖是个细致活,缺一不可:
bash复制sudo apt install -y git libssl-dev libusb-1.0-0-dev pkg-config libgtk-3-dev \
libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev libelf-dev
编译时记得打开BUILD_EXAMPLES选项,这样会编译出很多有用的示例程序:
bash复制mkdir build && cd build
cmake .. -DBUILD_EXAMPLES=true
make -j$(nproc)
sudo make install
编译完成后要配置udev规则,否则普通用户无法直接访问相机设备:
bash复制./scripts/setup_udev_rules.sh
我习惯把所有ROS包都放在catkin_ws下管理:
bash复制mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
这里有个大坑要注意:一定要选择与ROS版本匹配的tag!对于Noetic,我推荐使用2.3.2版本:
bash复制cd ~/catkin_ws/src
git clone https://github.com/IntelRealSense/realsense-ros.git
cd realsense-ros
git checkout 2.3.2
还需要安装一个依赖包ddynamic_reconfigure:
bash复制git clone https://github.com/pal-robotics/ddynamic_reconfigure.git
编译前记得解决依赖问题:
bash复制rosdep install --from-paths src --ignore-src -r -y
然后就可以开始编译了:
bash复制cd ~/catkin_ws
catkin_make clean
catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make install
编译完成后,把工作空间的环境变量也加到bashrc里:
bash复制echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
最简单的启动方式是使用默认launch文件:
bash复制roslaunch realsense2_camera rs_camera.launch
如果看到"RealSense Node Is Up!"的提示,说明节点启动成功了。这时候可以查看当前发布的话题:
bash复制rostopic list
正常情况下应该能看到/camera/color/image_raw、/camera/depth/image_rect_raw等话题。
我在调试过程中遇到过几个典型问题:
报错"Failed to resolve the request..."
这通常是USB带宽不足导致的,可以尝试降低分辨率:
bash复制roslaunch realsense2_camera rs_camera.launch depth_width:=640 depth_height:=480 color_width:=640 color_height:=480
图像帧率不稳定
检查USB接口是否是蓝色的3.0接口,线材质量也很关键,建议使用原装线。
IMU数据缺失
需要在launch文件中启用IMU:
bash复制roslaunch realsense2_camera rs_camera.launch enable_gyro:=true enable_accel:=true
启动专门的点云demo:
bash复制roslaunch realsense2_camera demo_pointcloud.launch
在RViz中,需要添加以下几个显示项:
为了让显示效果更好,我通常会调整以下参数:
bash复制pip install pyrealsense2 numpy opencv-python
下面是一个同时获取深度和彩色图像的完整示例:
python复制import pyrealsense2 as rs
import numpy as np
import cv2
# 配置管道
pipeline = rs.pipeline()
config = rs.config()
# 启用流配置
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
# 开始传输
profile = pipeline.start(config)
# 获取深度传感器的深度标尺
depth_sensor = profile.get_device().first_depth_sensor()
depth_scale = depth_sensor.get_depth_scale()
# 创建对齐对象(深度到彩色)
align_to = rs.stream.color
align = rs.align(align_to)
try:
while True:
# 等待一组连贯的帧
frames = pipeline.wait_for_frames()
# 对齐深度帧到彩色帧
aligned_frames = align.process(frames)
# 获取对齐后的帧
depth_frame = aligned_frames.get_depth_frame()
color_frame = aligned_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
)
# 水平堆叠图像
images = np.hstack((color_image, depth_colormap))
# 显示图像
cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE)
cv2.imshow('RealSense', images)
# 按q或ESC退出
key = cv2.waitKey(1)
if key in (ord('q'), 27):
break
finally:
# 停止传输
pipeline.stop()
cv2.destroyAllWindows()
这段代码实现了深度图与彩色图的对齐显示,这是很多视觉应用的基础。在实际项目中,我通常会在此基础上添加目标检测、距离测量等功能。