Skip to content

使用 Isaac Perceptor

本教程介绍如何利用 NVIDIA Jetson、Isaac ROS、Isaac Perceptor 和 NVIDIA Nova 技术,实现纯视觉导航(Vision-based Navigation),完全摆脱对激光雷达、主动式深度传感器或其他测距传感器的依赖。 整套方案仅依靠被动式立体相机作为外部感知源,即可完成避障、定位与建图,是一种功能强大且经济高效的替代方案。 所用脚本与资源可在 open-navigation/opennav_visual_navigation 中找到。

本教程首先讲解视觉导航的基本概念,然后说明如何配置并启动一套支持视觉的 Nav2 软件栈,最后通过一台执行自主安防巡逻任务的移动机器人进行硬件演示。

无论你是为资源受限的嵌入式系统做开发,还是在寻找昂贵传感器套件的替代方案,本教程都将完整介绍如何仅凭视觉感知,在搭载立体相机与 Jetson AGX Orin 的 NVIDIA Nova 参考平台上部署先进的自主导航。

注意:虽然基于视觉的方案功能强大且高效,但在某些环境中可能面临挑战。涉及玻璃表面、无特征走廊、细长障碍物、突然移动、振动,或光照变化下长时间静止的场景,都可能影响性能。 请务必仔细评估视觉导航方案是否契合你应用的具体需求与环境条件,以确保获得最佳效果。

本教程假设你拥有一台 NVIDIA Jetson(例如 Orin NX 或 AGX Orin),以及与 Nova 参考平台兼容的立体相机传感器。 本教程将使用驱动 Segway Nova Carter 机器人的 Jetson AGX Orin,该机器人由 Segway 与 NVIDIA 合作打造,专用于视觉导航任务。 不过,具体需要哪款 Jetson 产品,取决于所运行的相机数量、分辨率与模型对其 GPU 算力的需求。 利用本教程中的通用概念与设计,将这些技术应用到非 Nova 平台上也是可行的。但由于 NVIDIA 提供的 launch 文件与节点均基于该平台假设,因此这样做需要大量的定制开发工作。

导航的核心任务是将机器人成功移动到目的地,这需要将环境传感器数据融合为地图,并与任务意图相结合。 主要要素包括路径规划(Path Planning)、控制(Control)、感知(Perception)、定位(Localization),以及将它们整合在一起的自主系统。 如需了解更多导航相关知识,请参阅概念。

其中,感知与定位直接使用传感器数据。 规划与控制使用的则是这些子系统输出的信息——例如机器人当前位姿或潜在障碍物位置——而非原始传感器数据。 环境模型会将多个传感器的数据融合为一种与数据源无关的表示,供规划与控制算法据此做出决策。 在 Nav2 中,这一角色通常由 Costmap(代价地图)包承担,但也可能是高度图、体素网格等。

因此,从激光雷达/深度导航切换到视觉导航,主要需要调整感知与定位两个环节。 具体而言,需要用基于视觉的系统替换以下现有方案:

  • 数据采集(Data Acquisition):根据立体相机信息计算视差(disparity)信息及派生结果
  • 数据融合(Data Fusion):将多个相机数据流融合为环境模型,供规划与控制使用
  • 建图(Mapping):使用相机数据创建环境的全局一致视图
  • 定位(Localization):在执行任务期间,利用环境的全局一致视图在环境中定位机器人

目前,基于激光雷达的方案使用 Costmap2D、SLAM 库(如 SLAM Toolbox 或 Cartographer)以及全局定位器(如 AMCL)来解决上述问题。

NVIDIA 提供了替换现有激光雷达导航方案所需的全部技术。 这得益于 NVIDIA GPU 的强大算力以及 Isaac ROS 与 Perceptor SDK 的能力。

数据采集:

使用激光雷达或深度传感器获取深度数据相对简单。 多数情况下,ROS 驱动程序会连接传感器,并以深度图像(Depth Image)或 PointCloud2 等标准格式输出深度数据。 有时还需要做后处理来去噪或消除其他伪影,以改善后续的 3D 重建质量。

视觉导航则不同。从传感器数据到最终的环境模型,需要经过更多处理阶段,才能构建出全局路径规划与局部轨迹规划(控制)所需的结果。

首先,通过 Jetson 的 libargus 或传感器厂商提供的库,以低延迟、时间同步的方式获取传感器数据,为视觉建图与定位提供精确信息。 这对视觉方案的性能至关重要,且该机制支持众多传感器。 随后,使用 Isaac 的 isaac_ros_ess 估计视差,它利用 GPU 加速,以深度学习方式计算立体视差图像。 最后,isaac_ros_stereo_image_proc 将视差图像转换为深度图像,供后续 3D 重建使用。

注意:isaac_ros_stereo_image_proc 也可以计算 PointCloud2,前提是应用程序需要点云而非深度图像格式。

数据融合:

获取深度信息后,即可用它来构建和更新环境模型,从而基于对环境的理解做出智能的规划与控制决策。 虽然从定义上讲,3D 重建方法未必都需要深度信息,但大多数现代且稳健的方案都依赖于此,因此需要 Isaac SDK 的深度估计流水线。

NVIDIA 提供了一个出色的 3D 重建解决方案——NvBlox。 NvBlox 是一个 GPU 加速的符号距离场(signed-distance field)库,可通过体素网格生成环境模型。 它能接收来自多组立体相机对的深度图像,并构建 3D 环境表示。

它还可以接收可选的语义分割掩码,用于检测场景中的人、机器人或其他动态物体,并在环境模型更新时将其排除。 更新结束后,这些动态障碍物的信息会被重新加回地图中,从而在不依赖复杂清除逻辑的情况下,避免环境更新中出现与动态障碍物相关的伪影。 常见演示使用特定的人体分割模型来展示这一功能,但任何经过训练、可分割任意类别物体的模型都可以使用。

注意:在进行任何视觉导航,或用于视觉导航的数据采集/数据融合之前,可能需要预先重新生成这些模型。常见错误信息及其解决方案的详细信息请参阅故障排查(Troubleshooting)章节。

NvBlox 节点图

NvBlox 模型以代价地图层插件(Costmap Layer Plugin)的形式集成在 Costmap2D 包中,用于更新占用网格模型,供规划与控制使用。 Nav2 的未来版本可能会直接使用 3D 环境模型,无需为移动操作、可通过性(traversability)估计等需要 3D 碰撞检测的场景做降维处理。

这样就不需要使用体素层(Voxel Layer)、时空体素层(Spatio-Temporal Voxel Layer)、障碍物层(Obstacle Layer)或其他传感器处理层来标记和清除占用网格数据。

建图:

建图对于长期规划至关重要,它能帮助我们理解环境,并知道如何以最优方式从空间中某一点导航到任意其他点。 虽然只需感知即时空间即可完成的短期导航任务可能不需要预先建图,但大多数实际部署的应用都有以下需求:要么(1)需要时间最优的执行,不能迷失在无法通向目标的错误区域中;要么(2)在大型空间中运行,目标位姿通常无法从当前传感器数据中直接获取,需要预先建图来确定到达路线。

cuVSLAM 用于视觉 SLAM(VSLAM),根据传感器数据创建并保存环境地图。 它是一种纯视觉建图方案,仅使用立体相机图像与 IMU 数据,通过立体特征匹配对环境进行建图。 由于中等规模空间的建图对计算资源要求较高,该过程通过遥控数据采集离线完成,完全取代了 2D、3D 或其他类型的激光雷达 SLAM。

定位:

cuVSLAM 也用于在建图过程中生成的特征地图内进行运行时纯定位。 在 Jetson AGX Orin 上,使用 4 组立体相机对时可超过 30 fps 运行,相机数量更少时速度还会更快。

此外,Isaac ROS SDK 提供的视觉全局定位(Visual Global Localization,cuVGL)工具,用于在定位启动时初始位姿未知的情况下确定起始位姿。 它会将初始位姿处观测到的特征与预先构建的地图进行匹配,在启动时一次性确定起始位姿,随后交由 cuVSLAM 继续定位会话——从而解决机器人绑架(kidnapped robot)问题。 该工具用于在开始导航会话前设置机器人的初始位姿,也可在运行期间重新定位机器人,整个过程不到 1 秒即可完成。

如果你尚未安装最新的 Jetpack,请按照以下说明操作。 截至撰写本文时,最新版本为 Jetpack 6.2,搭配 Isaac 3.2。

如果 Jetson 当前运行的是 Jetpack 6.0 或更高版本,请使用此指南通过 apt 升级到 Jetpack 6.2。 否则,需要使用 NVIDIA SDK Manager 进行升级,它既可作为 Docker 镜像,也可作为 Debian 包在开发计算机上运行。

注意:如果使用 SDK Manager 升级,请确保 Jetson 用于刷机的 USB-C 端口可用。请使用该有线连接的 IP 地址,而不要通过本地 WAN。

如果尚未设置,请按照以下说明安装并配置 Nova Init。

如果尚未设置为最大电源模式(Max Power Mode),建议现在就进行设置,以充分利用 Jetson 的全部性能。 电源模式通过 nvpmodel 命令控制,CPU/GPU 时钟频率则通过 jetson_clocks 控制。以下命令将把 Jetson 设置为最大电源模式,同时将 CPU/GPU 时钟锁定为最高频率。

将 CPU/GPU 时钟设置为最高:sudo /usr/bin/jetson_clocks

将功耗设置为最大电源模式:sudo nvpmodel -m 2

通过运行 sudo /usr/bin/jetson_clocks --show|tail -1 和 sudo /usr/bin/nvpmodel -q|head -1 确认设置。

有关功耗、CPU/GPU 频率、散热风扇转速等详细信息,请参阅 https://docs.nvidia.com/jetson/archives/r35.1/DeveloperGuide/text/SD/PlatformPowerAndPerformance/JetsonOrinNxSeriesAndJetsonAgxOrinSeries.html

对于功耗受限的应用,请根据电力资源、计算需求与应用时长选择最合适的电源设置。演示完成后可重新调整,以针对你的需求与功耗进行优化。

数款相机与此工作流兼容。 推荐使用 Stereolabs ZED 相机,它与 NVIDIA 生态原生集成,易于使用。 Stereolabs 还提供了功能丰富的视觉与空间 AI SDK,可进一步增强基于视觉的移动机器人的功能与智能化水平。 此外,Leopard Imaging 的立体相机同样兼容并受支持。

cuVSLAM 对时间同步有严格要求以保证精确结果,因此需要使用与系统紧密集成且高度同步的相机,建议从上述兼容选项中选择。 如果想在不使用 cuVSLAM 的情况下仅使用 NvBlox,并采用其他定位与建图方案,则有更广泛的相机可选(如 Realsense)。 NvBlox 使用 cuVSLAM 提供的位姿估计,但这些位姿估计也可以来自任何其他来源。 NvBlox 利用位姿估计将传感器数据对齐到场景中,以构建环境模型。 NvBlox 仅用单个立体相机就能良好工作,但 cuVSLAM 通常需要两个或更多相机才能看到足够多的场景,从而获得稳健的结果。

首先,按照 NVIDIA 的强烈建议,使用 Docker 搭建 Isaac ROS Dev 开发环境。

以下命令可在 Linux shell 中一次性整块运行,也可逐条运行:

Terminal window
sudo systemctl daemon-reload && sudo systemctl restart docker
sudo apt install git-lfs
git lfs install --skip-repo
mkdir -p /mnt/nova_ssd/workspaces/isaac_ros-dev/src
echo "export ISAAC_ROS_WS=/mnt/nova_ssd/workspaces/isaac_ros-dev/" >> ~/.bashrc
source ~/.bashrc

这将配置 Git LFS(大文件存储),用于下载 Isaac ROS 源代码仓库中存储的权重与文件。 它还会在外部挂载的 SSD 或本地计算机上创建开发工作区 isaac_ros-dev。 建议使用外部挂载的 SSD 或 NVME 硬盘,以获得足够的存储空间来运行本演示。

如果使用外部硬盘,运行:echo "export ISAAC_ROS_WS=/mnt/nova_ssd/workspaces/isaac_ros-dev/" >> ~/.bashrc

如果没有外部硬盘,或使用的是容量较大(>1TB)的内置硬盘,请将该行改为 echo "export ISAAC_ROS_WS=/home/${USER}/workspaces/isaac_ros-dev/" >> ~/.bashrc

环境变量 ISAAC_ROS_WS 用于将工作区挂载到 Isaac ROS 容器中,也用于其他 Isaac 工作流,请务必始终保持该变量的设置。

注意:NVIDIA Jetson Orin 和 Jetson Xavier 系列系统具有 M.2 Key-M(又称 2280)插槽,支持板载 NVME SSD 硬盘。NVIDIA SDK Manager 安装工具提供配置选项,可将 Jetpack 镜像烧录到该硬盘,从而以 PCIe 速度提供大容量存储,无需外部硬盘或 MicroSD 卡。

请确保用于建图的 rosbag 以及输出占用网格地图的目录已挂载到 Docker 容器中。可在 ${ISAAC_ROS_WS}/src/isaac_ros_common/scripts/.isaac_ros_dev-dockerargs 中添加,然后重启容器:

Terminal window
echo -e '-v /mnt/nova_ssd/recordings:/mnt/nova_ssd/recordings' > ${ISAAC_ROS_WS}/src/isaac_ros_common/scripts/.isaac_ros_dev-dockerargs
echo -e '-v /mnt/nova_ssd/maps:/mnt/nova_ssd/maps' > ${ISAAC_ROS_WS}/src/isaac_ros_common/scripts/.isaac_ros_dev-dockerargs

接下来,克隆 isaac_ros_common 包,它包含 Isaac ROS 的关键组件,包括在 Dev 环境中运行 Isaac 所需的 Dockerfile 与脚本。

Terminal window
cd ${ISAAC_ROS_WS}/src && git clone -b release-3.2 https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common.git

如果使用 Nova Carter 设备,请执行以下操作来配置 Docker。

现在可以启动容器了,运行以下命令:

Terminal window
cd ${ISAAC_ROS_WS}/src/isaac_ros_common && ./scripts/run_dev.sh

Isaac 环境准备就绪后,可将 opennav_visual_navigation 项目作为起点加入。

Terminal window
# Clones the project and creates a colcon_ws relative to your path
cd ${ISAAC_ROS_WS}/src && git clone git@github.com:open-navigation/opennav_visual_navigation.git

演示使用 Nova Carter 机器人,硬件通过 nova_carter_bringup 的 launch 文件 navigation.launch.py 和 teleop.launch.py 启动,这两个文件会启动机器人硬件及演示所需的其他节点。 该配置已预先集成 Nav2、Isaac Perceptor,并与 Nova 参考平台深度整合。 更多信息请参阅该包的文档。

若要适配其他平台,请创建一个新的 my_robot_nav 包,它需要:

  • 启动机器人硬件驱动,用于接收指令、启动传感器、提供变换树(transformation tree)等
  • 启动 Isaac Perceptor,通常通过 isaac_ros_perceptor_bringup 包的 perceptor_general.launch.py 或 perceptor_rgbd.launch.py
  • 使用相应配置启动 Nav2(即移除 AMCL,改用 cuVSLAM;针对 NvBlox 配置代价地图)

用这些 launch 文件替换本包中使用的 nova_carter_bringup/launch/navigation.launch.py。

演示配置使用前、左、右三组立体相机进行 VSLAM 定位,并使用 NvBlox 进行实时 3D 重建。 后置相机也能提供有用信息(在 VSLAM 建图数据采集阶段也会使用),但在当前 Isaac 版本下,它带来的计算负担已超出 AGX Orin 的实时处理能力。 这在将来或使用 Thor 等更新的 Jetson 平台时有望得到改善。 2D 和 3D 激光雷达在本方案中已禁用,不会在任何环节使用。

第一步是生成数据集,用于在离线处理阶段创建 VSLAM 地图。 在现实的大型空间中,这无法在 Jetson 上实时完成,因此初始建图需要通过遥控操作机器人来完成。

技巧与提示:

  • 移动机器人之前,先在起始位姿处录制 10 秒数据,用于后续定位测试
  • 开始录制前,将机器人遥控到空旷区域,确保它没有处于停靠状态,且相机没有被墙壁、家具等遮挡,以保证起始数据包含足够的特征供后续处理使用
  • 每 5×5 米区域大约行驶 1 分钟
  • 以闭合回路行驶,从多个角度采集数据(即以不同方向行驶以获得不同视角)
  • 不要长时间直线行驶,穿插、蛇形行驶效果更好
  • 构建高质量的 VSLAM 地图需要一定技巧,可能需要尝试几次才能获得理想结果

建图过程演示 1

建图过程演示 2

准备就绪后,在之前的 Docker 容器中运行以下命令,并使用摇杆操控机器人在空间中行驶:

Terminal window
ros2 launch isaac_ros_nova_recorder nova_recorder.launch.py \
config:=nova-carter_hawk-4_imu \
headless:=True

这将启动 isaac_ros_nova_recorder 节点(封装了 isaac_ros_data_recorder),以及来自 nova_carter_bringup 包的遥操作(teleop)节点。也可在宿主机环境中通过便捷脚本启动录制:./scripts/run_docker_nova_recorder.sh

注意:config 参数用于指定建图期间使用的传感器组合。nova-carter_hawk-4_imu 配置仅使用 Nova Carter 机器人前部的 4 个立体相机及板载 IMU。如果没有 Hawk 相机或希望使用其他传感器,可查看 /etc/nova 下的其他配置。使用更多传感器会导致 rosbag2 录制文件更大,并可能显著延长后处理时间。

有关可用配置的更多详细信息,请参见:

https://nvidia-isaac-ros.github.io/v/release-3.1/repositories_and_packages/isaac_ros_nova/isaac_ros_data_recorder/index.html#try-more-examples

按照上述指南操控机器人在空间中行驶。在上面的示例中,nova_carter_recorder 节点将开始录制 Nova Carter 机器人上集成的 Hawk 相机拍摄的立体图像。数据默认以 rosbag2(MCAP)文件形式存储在 /mnt/nova_ssd/recordings 目录中。有关其他命令行参数的详细信息(例如将建图数据存储到 Amazon S3 等),请参阅完整的 nova_carter_recorder 教程:https://nvidia-isaac-ros.github.io/repositories_and_packages/isaac_ros_nova/isaac_ros_nova_recorder/index.html。区域建图完成后(记得做回环检测),在启动录制的终端中按 CTRL-C 停止。

回环检测演示

这是为空间建图时使用的回环检测(loop closure)技术。

完成后,/mnt/nova_ssd/recordings 中会出现包含 MCAP 文件的目录,如下所示:

nvidia@carter-v24-nav2:/mnt/nova_ssd/recordings$ ls -l
total 5612708
drwxr-xr-x 2 root root 4096 Sep 14 18:15 2025-09-15_01-07-21_rosbag2
drwxr-xr-x 2 root root 4096 Sep 16 10:14 2025-09-16_17-13-45_rosbag2
drwxr-xr-x 2 root root 4096 Sep 16 10:25 2025-09-16_17-14-57_rosbag2
[...]

录制文件可能相当大,即使是短时间的录制也不例外:

nvidia@carter-v24-nav2:/mnt/nova_ssd/recordings$ du -ah -d 1 2025-09-16_17-14-57_rosbag2
16K 2025-09-16_17-14-57_rosbag2/metadata.yaml
18G 2025-09-16_17-14-57_rosbag2/2025-09-16_17-14-57_rosbag2_0.mcap
18G 2025-09-16_17-14-57_rosbag2
nvidia@carter-v24-nav2:/mnt/nova_ssd/recordings$

数据集采集完成后,必须进行处理以生成用于定位的 cuVSLAM 地图和用于初始全局定位的 cuVGL 地图。可通过 ./tools/create_map.sh <PATH_TO_ROSBAG> <PATH_TO_OUTPUT_FOLDER> 完成。使用推荐目录的示例如下:

Terminal window
export LD_LIBRARY_PATH="/workspaces/isaac_ros-dev/ros_ws/isaac_ros_assets/models/dnn_stereo_disparity/dnn_stereo_disparity_v4.1.0_onnx/plugins/aarch64/:$LD_LIBRARY_PATH"
ros2 run isaac_mapping_ros create_map_offline.py --sensor_data_bag=/mnt/nova_ssd/recordings/<RECORDED_BAG_NAME> \
--base_output_folder=/mnt/nova_ssd/recordings/maps \
--print_mode all --steps_to_run edex,cuvslam,cuvgl

警告:从 isaac-ros-ess 4.1.0 版本开始,插件架构已变更为支持自定义插件。这意味着需要显式提供已安装模型的插件路径,即使使用的是 NVIDIA 提供的默认插件也是如此。 对于作为 isaac-ros-ess-install-models 包安装的 dnn_stereo_disparity 模型,路径如下:

export LD_LIBRARY_PATH="/workspaces/isaac_ros-dev/ros_ws/isaac_ros_assets/models/dnn_stereo_disparity/dnn_stereo_disparity_v4.1.0_onnx/plugins/aarch64/:$LD_LIBRARY_PATH"

不设置该路径将导致深度和 occupancy_map 生成步骤失败。

完成后,输出内容类似如下:

nvidia@carter-v24-nav2:/mnt/nova_ssd/recordings/maps$ ls -l 2025-11-13_04-02-21_2025-11-13_02-54-48_rosbag2/
total 68
drwxr-xr-x 5 nvidia nvidia 4096 Nov 13 16:55 cuvgl_map
drwxr-xr-x 2 nvidia nvidia 4096 Nov 12 23:11 cuvslam_map
drwxr-xr-x 10 nvidia nvidia 4096 Nov 12 23:16 edex
drwxr-xr-x 2 nvidia nvidia 4096 Nov 13 00:40 logs
drwxr-xr-x 2 nvidia nvidia 4096 Nov 12 23:12 poses
nvidia@carter-v24-nav2:/mnt/nova_ssd/recordings/maps$

此步骤可能需要较长时间(取决于录制时长,最多可达数小时),并将占用 Jetson 的全部计算资源。建议在处理期间不要在 Jetson 上运行其他工作负载。

所有脚本运行完毕后,最终目录内容应类似于:

nvidia@carter-v24-nav2:/mnt/nova_ssd/recordings/maps$ ls -l 2025-11-13_04-02-21_2025-11-13_02-54-48_rosbag2/
total 68
drwxr-xr-x 5 nvidia nvidia 4096 Nov 13 16:55 cuvgl_map
drwxr-xr-x 2 nvidia nvidia 4096 Nov 12 23:11 cuvslam_map
drwxr-xr-x 10 nvidia nvidia 4096 Nov 12 23:16 edex
drwxr-xr-x 2 nvidia nvidia 4096 Nov 26 00:40 logs
drwxr-xr-x 4 nvidia nvidia 4096 Nov 12 23:21 map_frames
-rw-r--r-- 1 nvidia nvidia 93 Nov 26 00:40 metadata.yaml
-rw-r--r-- 1 root root 17267 Nov 26 01:07 occupancy_map.png
-rw-r--r-- 1 root root 134 Nov 26 01:07 occupancy_map.yaml
drwxr-xr-x 2 nvidia nvidia 4096 Nov 12 23:12 poses
nvidia@carter-v24-nav2:/mnt/nova_ssd/recordings/maps$

说明:

  • cuvgl_map——包含与 cuvslam_map 配合使用的视觉全局定位(Visual Global Localization)数据库,包括视觉词袋(Visual Bag Of Words,VBOW)数据等。
  • cuvslam_map——包含 VSLAM 地图
  • edex——相机内参和帧元数据
  • depth——由 isaac_ros_dnn_stereo_disparity DNN 模型和 ESS 插件生成的深度图
  • map_frames——录制的相机话题数据,按相机拆分为单独的帧,包括原始图像和深度图像
  • poses——位姿数据库

可以看到,除了已填充的地图目录外,还有 occupancy_map.png 和 occupancy_map.yaml 文件。它们对于点到点(point-to-point)VSLAM 导航非常有用。YAML 文件应引用 PNG 文件,内容类似于典型的 2D ROS 地图元数据文件:

image: "occupancy_map.png"
mode: "trinary"
resolution: 0.05
origin: [-20.8, -16, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.25

来看 occupancy_map.png 文件本身:

占用网格地图

这张地图缺少激光雷达生成的占用网格地图中常见的精细细节。这是图像数据转换为深度数据时产生的伪影,也凸显了录制视觉数据时进行回环检测的重要性。尽管外观较为粗糙,这张地图对于空间中的视觉导航已经足够。占用网格地图实际上只是机器人在视觉导航期间所使用的整个定位栈中的一层。Isaac ROS Perceptor 还会使用 cuvslam_map、cuvgl_map 以及机器人相机的实时图像数据,在已建图空间中进行基于特征的定位。

初始设置完成后,即可开始使用视觉定位与避障进行导航。

Isaac Perceptor Polymath 场地全景

运行主演示 launch 文件即可看到效果:

Terminal window
ros2 launch opennav_visual_nav_demo visual_nav_demo_launch.py

注意:此命令封装了更长的命令:

ros2 launch nova_carter_bringup perceptor.launch.py use_foxglove_whitelist:=false stereo_camera_configuration:=front_left_right_configuration disable_vgl:=False vslam_load_map_folder_path:=$vslam_dir vgl_map_dir:=$vgl_dir occupancy_map_yaml_file:=$occupancy_map_path vslam_enable_slam:=True

需要从另一个终端附加到容器并运行:

ros2 launch nav2_bringup navigation_launch.py

来启动 Nav2(NVIDIA 提供了自己的 VSLAM 技术栈,因此 Nav2 默认不会被一起启动)。

现在 Foxglove Studio 中应显示类似如下的画面:

NvBlox 厨房场景视图

现在可以像下面视频中那样进行导航了。特别感谢 Nav2 赞助商 Polymath Robotics 在假期期间允许使用他们的场地进行这些演示。

本教程展示了如何在不使用激光雷达或深度相机的情况下,利用 NVIDIA 的技术(Jetson、Isaac ROS、Isaac Perceptor、Nova 参考平台)实现纯视觉导航。 为进一步发挥 GPU 能力,可在视觉导航期间利用 Isaac SDK、ZED SDK 或其他 AI 技术挖掘更多视觉能力,例如:

  • 目标检测或语义分割:isaac-ros-peoplenet 和 isaac-ros-peoplesemsegnet 用于从已建图空间中识别人物并进行人物语义分割
  • 地面或自由空间分割
  • 探索其他 VSLAM、VIO 或 3D 建图技术

以下文档提供更详细的信息:

相关的 GitHub 仓库:

更多演示:

Error Code 6: API Usage Error (The engine plan file is not compatible with this version of TensorRT, expecting library version 10.7.0.23 got...

此错误通常发生在 Nova Carter 主机上安装的包与 Docker 容器中的包版本不一致时,具体涉及 TensorRT 和 nvblox 包。更常见的情况是,Nova Carter 的 Jetpack 安装提供的是 10.3.x 版本的 TensorRT(tensorrt、nvinfer 等),而开发 Docker 容器使用的是 10.7.x。

有关修复此错误的分步指南,请参阅重建 TensorRT 引擎。

Error Code 4: API Usage Error

在解决 Error Code 6: 的引擎重建方案中,此错误应已被规避。如果仍然出现,则问题出在 trtexec 生成新的 .engine 和 .plan 文件的方式上。 默认情况下,trtexec 生成「lean」(精简)的 .engine 运行时模型,而 dnn_stereo_disparity 节点需要「full」(完整)运行时模型才能正常运行。

ess_engine_x.so: No such file or directory

这是 isaac_ros_mapping 可能抛出的 Docker 容器库路径问题。 可在 Docker 启动/入口脚本中将 $ISAAC_ROS_WS/isaac_ros_assets 路径加入 LD_LIBRARY_PATH,或在处理 isaac_nova_recorder 录制数据时将其前置到启动脚本中。一行修复方式如下:

Terminal window
LD_LIBRARY_PATH="/workspaces/isaac_ros-dev/ros_ws/isaac_ros_assets/models/dnn_stereo_disparity/dnn_stereo_disparity_v4.1.0_onnx/plugins/aarch64/:$LD_LIBRARY_PATH" \
ros2 run isaac_mapping_ros create_map_offline.py \
--sensor_data_bag=/mnt/nova_ssd/recordings/<PATH_TO_RECORDED_DATA>/ \
--base_output_folder=/mnt/nova_ssd/recordings/maps/

此问题也会影响深度和占用网格地图的生成,相关错误来自 isaac_ros_dnn_disparity。

默认情况下,./tools/create_map.sh 脚本可能因各种原因无法完成所有建图阶段。如果反复崩溃,可分段生成 VSLAM 所需的地图数据。

例如,在生成深度和 occupancy_map 数据时遇到错误,可跳过这些步骤,按如下方式生成 cuvgl 和 cuvslam 资产:

Terminal window
ros2 run isaac_mapping_ros create_map_offline.py --sensor_data_bag=/mnt/nova_ssd/recordings/<path_to_recorded_bag_file>/ \
--steps_to_run edex cuvslam map_frames cuvgl

如需使用现有数据继续处理并(重新)生成 cuvslam 数据集,运行:

Terminal window
ros2 run isaac_mapping_ros create_map_offline.py --sensor_data_bag=/mnt/nova_ssd/recordings/<path_to_recorded_bag_file>/ \
--map_dir=/mnt/nova_ssd/recordings/maps/${EXISTING_MAP_DIR}/ --steps_to_run cuvslam

同样,单独运行深度处理步骤的命令如下:

Terminal window
export LD_LIBRARY_PATH="${ISAAC_ROS_WS}/isaac_ros_assets/models/dnn_stereo_disparity/dnn_stereo_disparity_v4.1.0_onnx/plugins/aarch64:$LD_LIBRARY_PATH"
ros2 run isaac_mapping_ros run_ess_ros_offline.py \
--image_dir=/mnt/nova_ssd/recordings/maps/${EXISTING_MAP_DIR}/map_frames/raw \
--output_dir=/mnt/nova_ssd/recordings/maps/${EXISTING_MAP_DIR}/map_frames/depth \
--frames_meta_file=/mnt/nova_ssd/recordings/maps/${EXISTING_MAP_DIR}/map_frames/raw/frames_meta.json

occupancy_map 生成步骤可以通过以下命令运行:

Terminal window
ros2 run isaac_mapping_ros create_map_offline.py \
--sensor_data_bag=/mnt/nova_ssd/recordings/${BAG_DIR} \
--base_output_folder=/mnt/nova_ssd/recordings/maps \
--map_dir=/mnt/nova_ssd/recordings/maps/${EXISTING_MAP_DIR} \
--print_mode all --steps_to_run occupancy

./tools/create_map.sh 使用的大多数工具可以在 Docker 容器的 /opt/ros/humble/lib/isaac_mapping_ros 目录下找到,必要时可以单独运行:

root@carter-v24-nav2:/opt/ros/humble/lib/isaac_mapping_ros# ls -l
total 7080
-rwxr-xr-x 1 root root 100512 Jul 10 00:17 camera_frame_selection
-rwxr-xr-x 1 root root 112816 Jul 10 00:17 copy_image_dir_main
-rwxr-xr-x 1 root root 7099 Jul 10 00:15 create_cuvgl_map.py
-rwxr-xr-x 1 root root 17072 Jul 10 00:15 create_map_offline.py
-rwxr-xr-x 1 root root 116912 Jul 10 00:17 decode_video
-rwxr-xr-x 1 root root 121016 Jul 10 00:17 mapping_pose_to_rosbag
-rwxr-xr-x 1 root root 5233656 Jul 10 00:17 optimize_vo_with_keyframe_pose_main
-rwxr-xr-x 1 root root 67680 Jul 10 00:17 rosbag_poses_to_tum_format
-rwxr-xr-x 1 root root 1129064 Jul 10 00:17 rosbag_to_mapping_data
-rwxr-xr-x 1 root root 18543 Jul 10 00:15 run_ess_ros_offline.py
-rwxr-xr-x 1 root root 43304 Jul 10 00:17 run_nvblox
-rwxr-xr-x 1 root root 4001 Jul 10 00:15 run_rosbag_to_mapping_data.py
-rwxr-xr-x 1 root root 112856 Jul 10 00:17 select_frames_meta
-rwxr-xr-x 1 root root 141512 Jul 10 00:17 update_keyframe_pose_main
root@carter-v24-nav2:/opt/ros/humble/lib/isaac_mapping_ros#

这些工具在 NVIDIA 教程中有详细介绍:https://nvidia-isaac-ros.github.io/reference_workflows/isaac_perceptor/tutorial_mapping_and_localization.html#creating-maps