Isaac ROS Depth Segmentation#

概述#

Isaac ROS Depth Segmentation提供 NVIDIA NVIDIA 加速深度分割包。

isaac_ros_bi3d使用优化的Bi3D DNN 模型,通过二元分类执行立体深度估计,用于深度分割。深度分割可用于确定障碍物是否在邻近场内,并避免在导航过程中与障碍物发生碰撞。

Bi3D 在节点图上使用,以从同步时间输入的左右立体图像对中提供深度分割。要使用 Bi3D,图像需要被矫正并调整大小以适应适当的输入分辨率。需要保持图像的纵横比;因此,可能需要进行裁剪和调整大小以保持输入的纵横比。DNN 编码到 DNN 推理,再到 DNN 解码的图是 Bi3D 节点的一部分。推理是使用 TensorRT 执行的,因为 Bi3D DNN 模型设计为使用 TensorRT 支持的优化。与其他立体视差函数相比,深度分割提供了一个预测,即障碍物是否在接近场内,而不是连续深度,同时预测从地面平面的自由空间,这是其他功能通常不提供的。与 Isaac ROS 中的其他立体视差函数不同,深度分割在 NVIDIA DLA(深度学习加速器)上运行,这是独立于 GPU 的。

isaac_ros_bi3d#

下载快速入门资源#

从NGC下载快速启动数据:

#确保已安装所需的库
sudo apt-get install -y curl tar
 
NGC_ORG="nvidia"
NGC_TEAM="isaac"
NGC_RESOURCE="isaac_ros_assets"
NGC_VERSION="isaac_ros_bi3d"
NGC_FILENAME="quickstart.tar.gz"

REQ_URL="https://api.ngc.nvidia.com/v2/resources/$NGC_ORG/$NGC_TEAM/$NGC_RESOURCE/versions/$NGC_VERSION/files/$NGC_FILENAME"

mkdir -p ${ISAAC_ROS_WS}/isaac_ros_assets/${NGC_VERSION} && \
    curl -LO --request GET "${REQ_URL}" && \
    tar -xf ${NGC_FILENAME} -C ${ISAAC_ROS_WS}/isaac_ros_assets/${NGC_VERSION} && \
    rm ${NGC_FILENAME}

下载预先训练的Bi3D模型:#

mkdir -p ${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation && \
cd ${ISAAC_RO
S_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation && \
wget 'https://api.ngc.nvidia.com/v2/models/nvidia/isaac/bi3d_proximity_segmentation/versions/2.0.0/files/featnet.onnx' &&
wget 'https://api.ngc.nvidia.com/v2/models/nvidia/isaac/bi3d_proximity_segmentation/versions/2.0.0/files/segnet.onnx'

将 .onnx 模型文件转换为 TensorRT 引擎计划文件

/usr/src/tensorrt/bin/trtexec \
--saveEngine=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/featnet.plan \
--onnx=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/featnet.onnx \
--int8 --useDLACore=0 --allowGPUFallback &&
/usr/src/tensorrt/bin/trtexec \
--saveEngine=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/segnet.plan \
--onnx=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/segnet.onnx \
--int8 --useDLACore=0 --allowGPUFallback

运行启动文件#

rosbag#

ros2 launch isaac_ros_examples isaac_ros_examples.launch.py \
launch_fragments:=bi3d \
interface_specs_file:=${ISAAC_ROS_WS}/isaac_ros_assets/isaac_ros_bi3d/rosbag_quickstart_interface_specs.json \
featnet_engine_file_path:=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/featnet.plan \
segnet_engine_file_path:=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/segnet.plan \
max_disparity_values:=10

启动另一个docker终端

ros2 bag play --loop ${ISAAC_ROS_WS}/isaac_ros_assets/isaac_ros_bi3d/bi3dnode_rosbag

RealSense Camera#

ros2 launch isaac_ros_examples isaac_ros_examples.launch.py \
launch_fragments:=realsense_stereo_rect,bi3d \
interface_specs_file:=${ISAAC_ROS_WS}/isaac_ros_assets/isaac_ros_bi3d/realsense_quickstart_interface_specs.json \
featnet_engine_file_path:=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/featnet.plan \
segnet_engine_file_path:=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/segnet.plan \
max_disparity_values:=10

Hawk Camera#

ros2 launch isaac_ros_examples isaac_ros_examples.launch.py \
launch_fragments:=argus_stereo,resize_rectify_stereo,bi3d \
interface_specs_file:=${ISAAC_ROS_WS}/isaac_ros_assets/isaac_ros_bi3d/hawk_quickstart_interface_specs.json \
featnet_engine_file_path:=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/featnet.plan \
segnet_engine_file_path:=${ISAAC_ROS_WS}/isaac_ros_assets/models/bi3d_proximity_segmentation/segnet.plan \
max_disparity_values:=10

可视化结果#

再启动一个docker终端

ros2 run isaac_ros_bi3d isaac_ros_bi3d_visualizer.py --max_disparity_value 30

ROS参数#

ROS 参数

类型

默认

描述

image_height

uint16_t

576

输入图像的高度

image_width

uint16_t

960

输入图像的宽度

featnet_engine_file_path

std::string

’path_to_featnet_engine’

Bi3D Featnet 引擎计划的路径

segnet_engine_file_path

std::string

’path_to_segnet_engine’

Bi3D Segnet 引擎计划的路径

max_disparity_values

int64_t

64

用于 Bi3D 推理的最大视差值数量。Isaac ROS 深度分割在推理过程中理论上最多支持 64 个视差值。但是,用户实际运行的最大视差长度取决于用户的硬件和内存可用性。

disparity_values

std::vector<int64_t>

{10, 20, 30, 40, 50, 60}

用于 Bi3D 推理的特定阈值视差值。视差值的数量不得超过max_disparity_valuesROS 参数中设置的值。

ROS 主题

界面

描述

left_image_bi3d

sensor_msgs/Image

消息必须是sensor_msgs/Image具有rgb8图像编码的 ROS。

只能有一个发布者节点发布到left_image_bi3d。Bi3DNode 无法保证多个发布者的时间行为,并且可能无法对正确的图像对执行推理。Bi3D 将根据第一个可用情况处理输入对。对要处理的每个唯一场景(发布者)使用单独的 Bi3DNode 实例。

right_image_bi3d

sensor_msgs/Image

消息必须是sensor_msgs/Image具有rgb8图像编码的 ROS。

只能有一个发布者节点发布到right_image_bi3d。Bi3DNode 无法保证多个发布者的时间行为,并且可能无法对正确的图像对执行推理。Bi3D 将根据第一个可用情况处理输入对。对要处理的每个唯一场景(发布者)使用单独的 Bi3DNode 实例。

left_camera_info_bi3d

sensor_msgs/CameraInfo

Bi3D 输出差异中的焦距是从该主题中提取的

right_camera_info_bi3d

sensor_msgs/CameraInfo

Bi3D 输出差异中填充的基线是从该主题中提取的

ROS Topic

Interface

Description

bi3d_node/bi3d_output

stereo_msgs/DisparityImage

Bi3D 的深度分割以视差图像的形式给出。对于不被视为自由空间的像素,它们的值设置为被突破的最近(最大)视差平面。如果像素值不突破任何视差平面或为自由空间,则将其设置为 0。