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。 |