双目深度算法
1. 功能介绍
地瓜双目深度估计算法输入为双目图像数据,输出为左视图对应的视差图和深度图。算法借鉴IGEV网络,采用了GRU架构,具有较好的数据泛化性和较高的推理效率。
双目算法代码仓库:https://github.com/D-Robotics/hobot_stereonet
mipi相机代码仓库:https://github.com/D-Robotics/hobot_mipi_cam
zed相机代码仓库:https://github.com/D-Robotics/hobot_zed_cam
双目算法讲解:直播回放 | 基于RDK X5的AI双目算法部署实战
2. 支持平台
| 平台 | 系统支持 | 示例功能 |
|---|---|---|
| RDK X5, RDK X5 Module | Ubuntu 22.04 (Humble) | 启动双目相机,推理出深度结果,并在Web端显示 |
| RDK S100, RDK S100P | Ubuntu 22.04 (Humble) | 启动双目相机,推理出深度结果,并在Web端显示 |
3. 模型版本
| 平台 | 算法版本 | 量化方式 | 输入尺寸 | 最高推理帧率(fps) | 模型说明 |
|---|---|---|---|---|---|
| X5 | V2.0 | int16 | 640x352x3x2 | 15 | 历史版本 |
| X5 | V2.1 | int16 | 640x352x3x2 | 15 | 历史版本,带置信度输出 |
| X5 | V2.2 | int8 | 640x352x3x2 | 23 | 历史版本 |
| X5 | V2.3 | int8 | 640x352x3x2 | 27 | 历史版本,最高帧率 |
| X5 | V2.4_int16 | int16 | 640x352x3x2 | 15 | 当前主版本,高精度深度估计 |
| X5 | V2.4_int8 | int8 | 640x352x3x2 | 23 | 当前主版本,高帧率深度估计 |
| X5 | V2.5_int16 | int16 | 640x352x3x2 | 16 | 最新版本,高精度深度估计 |
| X5 | V2.5_int16_96 | int16 | 640x352x3x2 | 18 | 最新版本,最大搜索视差96视差 |
| X5 | V2.5_int16_544_448 | int16 | 544x448x3x2 | 15 | 最新版本,544*448分辨率 |
| X5 | V2.5_int16_544_448_96 | int16 | 544x448x3x2 | 17 | 最新版本,544*448分辨率,最大搜索视差96视差 |
| S100 | V2.1 | int16 | 640x352x3x2 | 53 | 历史版本,带置信度输出 |
| S100 | V2.4 | int16 | 640x352x3x2 | 53 | 当前主版本,带置信度输出 |
4. 准备工作
4.1. RDK平台
- RDK已烧录好RDK OS系统
- RDK已成功安装TogetheROS.Bot
- 如果需要在线推理,请准备好双目相机,目前支持多款MIPI相机、ZED mini/2i USB相机
- 如果需要离线推理,请准备好双目图像数据
- 确认PC机能够通过网络访问RDK
4.2. 系统和功能包版本
| 版本 | 查询方法 | |
|---|---|---|
| RDK X5系统镜像版本 | 3.3.3及以上 | cat /etc/version |
| RDK S100系统镜像版本 | 4.0.2-Beta及以上 | cat /etc/version |
| tros-humble-hobot-stereonet功能包版本 | 2.5.0及以上 | apt list | grep tros-humble-hobot-stereonet/ |
| tros-humble-mipi-cam功能包版本 | 2.3.13及 以上 | apt list | grep tros-humble-mipi-cam/ |
| tros-humble-hobot-zed-cam功能包版本 | 2.3.3及以上 | apt list | grep tros-humble-hobot-zed-cam/ |
- 如果系统镜像版本不符合要求,请参考文档对应章节进行镜像烧录
- 如果功能包版本不符合要求,请执行以下指令进行更新:
sudo apt update
sudo apt install --only-upgrade tros-humble-hobot-stereonet
sudo apt install --only-upgrade tros-humble-mipi-cam
sudo apt install --only-upgrade tros-humble-hobot-zed-cam
- 如果以上指令无法将程序更新到最新版本,则需要将apt源文件修改为beta源:
# 修改为beta源,执行以下命令:
sudo echo 'deb [signed-by=/usr/share/keyrings/sunrise.gpg] http://archive.d-robotics.cc/ubuntu-rdk-x5-beta jammy main' | sudo tee /etc/apt/sources.list.d/sunrise.list
apt update
# 如果需要重新改回为正式源,则执行以下命令:
sudo echo 'deb [signed-by=/usr/share/keyrings/sunrise.gpg] http://archive.d-robotics.cc/ubuntu-rdk-x5 jammy main' | sudo tee /etc/apt/sources.list.d/sunrise.list
apt update
如果sudo apt update命令执行失败或报错,请查看常见问题章节的Q10: apt update 命令执行失败或报错如何处理?解决。
5. 算法启动
5.1. 注意事项(必看!!!)
请用root用户执行文档中的命令,其他用户执行可能权限不够,造成一些不必要的错误。

5.2. MIPI双目相机安装
(1) 230AI MIPI双目相机
- RDK官方230AI MIPI双目相机如图所示:

注意:请检查相机背面丝印印有CDPxxx-V3/V4,确认相机 是V3或V4版本
- RDK X5安装方式如图所示:

- RDK S100安装方式如图所示,注意S100的CAM子板拨码开关要拨到
LPWM和3.3V:

(2) 132GS MIPI双目相机
- RDK官方132GS MIPI双目相机如图所示:

- RDK X5安装方式如图所示:

- 最新线材做了升级,注意线材是带有方向的,CAM端接入相机,RDK端接入开发板。(白色和黑色线材均能正常使用,两种线材随机发货)

- RDK S100安装方式如图所示,注意S100的CAM子板拨码开关要拨到
LPWM和3.3V:

5.3. 在线启动指令
(1) 确认双目相机I2C信号正常
- 确认230AI双目相机I2C信号是否正常,通过ssh连接RDK,执行以下命令,如果输出0x30、0x32、0x50等地址,则代表相机连接正常:
# RDK X5
i2cdetect -r -y 4
i2cdetect -r -y 6
# RDK S100
i2cdetect -r -y 1
i2cdetect -r -y 2

- 确认132GS双目相机I2C信号是否正常,通过ssh连接RDK,执行以下命令,如果输出0x32、0x33、0x50等地址,则代表相机连接正常:
# RDK X5
i2cdetect -r -y 4
i2cdetect -r -y 6
# RDK S100
i2cdetect -r -y 1
i2cdetect -r -y 2

如果I2C信号检测不到,相机无法正常工作
(2) 确认相机出流正常
- 方法1:如果已经安装tros-humble-hobot-stereonet功能包,则可以直接复制
cp -rv /opt/tros/humble/share/hobot_stereonet/script/run_cam.sh ./
- 方法2:手动创建启动脚本
run_cam.sh,写入以下内容
#!/bin/bash
source /opt/tros/humble/setup.bash
ros2 pkg prefix mipi_cam
image_width=1280
image_height=1088
framerate=30.0
rotation=90.0
gdc_enable=False
cal_rotation=90.0
lpwm_enable=True
frame_ts_type=realtime
out_format=nv12
channel=2
channel2=0
log_level=ERROR
while [[ $# -gt 0 ]]; do
case $1 in
--image_width) image_width=$2; shift 2 ;;
--image_height) image_height=$2; shift 2 ;;
--framerate) framerate=$2; shift 2 ;;
--rotation) rotation=$2; shift 2 ;;
--gdc_enable) gdc_enable=$2; shift 2 ;;
--cal_rotation) cal_rotation=$2; shift 2 ;;
--lpwm_enable) lpwm_enable=$2; shift 2 ;;
--frame_ts_type) frame_ts_type=$2; shift 2 ;;
--out_format) out_format=$2; shift 2 ;;
--channel) channel=$2; shift 2 ;;
--channel2) channel2=$2; shift 2 ;;
--log_level) log_level=$2; shift 2 ;;
*) echo "unknown param: $1"; exit 1 ;;
esac
done
ros2 run mipi_cam mipi_cam --ros-args \
-p device_mode:=dual -p dual_combine:=1 \
-p image_width:=$image_width -p image_height:=$image_height \
-p framerate:=$framerate -p rotation:=$rotation \
-p gdc_enable:=$gdc_enable -p cal_rotation:=$cal_rotation \
-p lpwm_enable:=$lpwm_enable \
-p frame_ts_type:=$frame_ts_type \
-p out_format:=$out_format \
-p channel:=$channel -p channel2:=$channel2 \
--log-level $log_level
- 执行如下指令:
- 230AI
- 132GS
bash run_cam.sh --image_width 1920 --image_height 1080 --rotation 0.0 --cal_rotation 0.0 --log_level INFO
bash run_cam.sh --rotation 90.0 --log_level INFO
- 以X5上接入132GS相机为例,正确启动相机会打印如下日志(S100或不同型号相机接入会打印不同的日志):

- 日志解析:
I2C bus是控制通道编号,可以用于配置传感器寄存器,例如设置分辨率、设置帧率、启动 streaming,图像数据不走I2C,I2C只负责控制。
程序会检测X5的第4路和第6路I2C控制器,是否能扫到sensor地址。日志中检测到0x32、0x30两个地址,对应I2C bus-4和I2C bus-6,也可以使用上文提到的i2cdetect -r -y 4指令扫描sensor地址。
mipi rx phy是图像数据通道编号,相机采集的图像数据会走该高速通道传输到芯片。
日志显示X5有两个mipi phy,分别是编号0和编号2,对应左右目相机。该编号可以设置到下文提到的channel和mipi_channel参数,用于改变左右目图像的拼接顺序。