欢迎访问 Isaac ROS,这是一套硬件加速、高性能、低延迟的 ROS 2 软件包,用于制造自主机器人,充分利用 Jetson 和其他英伟达平台的强大功能。
英伟达 Jetson 平台运行在基于 Ubuntu Linux 的 JetPack 操作系统上。JetPack 5.x 是在 Ubuntu 20.04 Focal 的基础上构建的,这意味着由 ROS 2 Buildfarm 为 Ubuntu 22.04 Jammy 构建的 ROS 2 Humble 的 Debian 包不受支持。
由于官方 ROS 2 Buildfarm 只为 Ubuntu 22.04 Jammy 构建,因此 Isaac ROS Buildfarm 的设置是为 Ubuntu 20.04 Focal 从源代码构建 ROS 2 软件包。
Isaac ROS Buildfarm 是官方 Buildfarm 的一个分叉,经过几处修改,几乎可以为 Ubuntu 20.04 Focal 构建所有 ROS 2 软件包。英伟达的半全球 CDN 发布了这些社区贡献的软件包和即将预构建的 Isaac ROS Debian 软件包。
要将 CDN 设置为 apt 源,请执行以下步骤:
设置地域
locale # check for UTF-8
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
locale # verify settings
安装依赖项
sudo apt update && sudo apt install gnupg wget
sudo apt install software-properties-common
sudo add-apt-repository universe
设置源代码
首先,在 apt 注册 GPG 密钥。下面列出了两个选项,一个是 .com(美国 CDN),另一个是 .cn(中国 CDN),请选择您喜欢的选项。
wget -qO - https://isaac.download.nvidia.com/isaac-ros/repos.key | sudo apt-key add -
wget -qO - https://isaac.download.nvidia.cn/isaac-ros/repos.key | sudo apt-key add -
现在将软件源添加到你的 apt 源中。
echo 'deb https://isaac.download.nvidia.com/isaac-ros/ubuntu/main focal main' | sudo tee -a /etc/apt/sources.list"
echo 'deb https://isaac.download.nvidia.cn/isaac-ros/ubuntu/main focal main' | sudo tee -a /etc/apt/sources.list"
接下来,对于所有非 Buildfarm ROS 2 软件包,请确保已获取 ROS 2 apt 仓库。
sudo apt update && sudo apt install curl -y \
&& sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
这样就可以正常安装几乎所有的 ROS 2 软件包。我们保证支持任何依赖于 Isaac ROS 的 ROS 2 软件包。
sudo apt update
根据 ROS 2 文档:
桌面安装(推荐): ROS、RViz、演示、教程。
sudo apt install ros-humble-desktop
或者
sudo apt install ros-humble-desktop-full
ROS 基础安装(裸机): 通信库、消息包、命令行工具。无图形用户界面工具。
sudo apt install ros-humble-ros-base
开发工具: 用于构建 ROS 软件包的编译器和其他工具
sudo apt install ros-dev-tools
Isaac ROS 套件由英伟达™(NVIDIA®)开发并发布,旨在利用英伟达™(NVIDIA®)Jetson 和独立 GPU 上的硬件加速功能来实现标准的机器人应用。
Isaac ROS 在输入和输出话题上使用标准的 ROS 接口,因此非常易于使用,可直接替代机器人开发人员熟悉的基于 CPU 的常用 ROS 实现。
Platform |
Hardware |
Software |
Notes |
---|---|---|---|
Jetson |
Jetson Orin Jetson Xavier |
JetPack 5.1.2 |
For best performance, ensure that power settings are configured appropriately. |
x86_64 |
NVIDIA GPU |
Ubuntu 20.04+ CUDA 11.8+ |
ROS 支持
所有 Isaac ROS 软件包的设计和测试都与 ROS 2 Humble 兼容。
如果您的应用程序是使用 ROS 1 Noetic 构建的,您可以使用 Isaac ROS NITROS Bridge 以更快的性能集成 Isaac ROS 软件包。
警告
Isaac ROS 软件包仅针对 ROS 2 Humble 进行过测试。目前还不支持其他 ROS 2 版本。
请按照以下步骤使用 Isaac ROS Dev Docker 镜像建立 ROS 2 开发者环境。或者,你也可以通过 Isaac ROS Buildfarm 安装预构建的 ROS 2 Humble 平台。
注意事项
我们强烈建议你使用 Isaac ROS Dev Docker 镜像来设置开发环境。这将简化您的开发环境设置,为 Jetson 和 x86_64 平台提供正确版本的依赖项。在 Isaac ROS Dev Docker 容器中工作将设置 ROS 并自动配置 Isaac ROS Buildfarm。
设置运行 Isaac ROS 的硬件:
cat /etc/nv_tegra_release
运行以下命令将 GPU 和 CPU 时钟设置为最大值。更多详情,请参阅 "最大化 Jetson 性能"。
sudo /usr/bin/jetson_clocks
运行以下命令将电源设置为 MAX。详情请参阅 "电源模式控制"。
sudo /usr/sbin/nvpmodel -m 0
将你的用户添加到 docker 组。
sudo usermod -aG docker $USER
newgrp docker
安装 Docker。
根据官方的 Docker 安装说明(此处),安装 docker-buildx-插件。
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt install docker-buildx-plugin
考虑为 Jetson 添加更多存储空间,以获得更好的体验: Jetson 开发人员环境设置
如果您正在使用 Jetson 开发者套件,则需要一个快速且大容量的存储设备来存储容器映像和 rosbag 文件。要增加存储容量,请在 Jetson 开发者套件的载板上安装 NVMe SSD 卡。
注意事项
一般不建议通过 USB 3.x 连接固态硬盘,因为它的写入/读取速度比通过 NVMe(PCIe)接口连接的固态硬盘慢。
要正确配置带有 NVMe SSD 的 Jetson,请选择以下方法之一:
第一种方案最直接,但需要重新刷新整个 Jetson 开发套件,从而丢失设备上已有的任何文件。
第二个方案需要更多工作,但无需重新刷新 Jetson。本文其余部分将介绍如何使用第二种方法配置固态硬盘。如果您的 Jetson 已经设置并运行,但没有 NVMe 固态硬盘,请按照以下步骤操作。
物理安装固态硬盘并自动安装
lspci
典型的输出结果如下:
0007:01:00.0 Non-Volatile memory controller: Marvell Technology Group Ltd. Device 1322 (rev 02)
运行 lsblk 查找设备名称。
lsblk
典型的输出结果如下:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 16M 1 loop
mmcblk1 179:0 0 59.5G 0 disk
├─mmcblk1p1 179:1 0 58G 0 part /
├─mmcblk1p2 179:2 0 128M 0 part
├─mmcblk1p3 179:3 0 768K 0 part
├─mmcblk1p4 179:4 0 31.6M 0 part
├─mmcblk1p5 179:5 0 128M 0 part
├─mmcblk1p6 179:6 0 768K 0 part
├─mmcblk1p7 179:7 0 31.6M 0 part
├─mmcblk1p8 179:8 0 80M 0 part
├─mmcblk1p9 179:9 0 512K 0 part
├─mmcblk1p10 179:10 0 64M 0 part
├─mmcblk1p11 179:11 0 80M 0 part
├─mmcblk1p12 179:12 0 512K 0 part
├─mmcblk1p13 179:13 0 64M 0 part
└─mmcblk1p14 179:14 0 879.5M 0 part
zram0 251:0 0 1.8G 0 disk [SWAP]
zram1 251:1 0 1.8G 0 disk [SWAP]
zram2 251:2 0 1.8G 0 disk [SWAP]
zram3 251:3 0 1.8G 0 disk [SWAP]
nvme0n1 259:0 0 238.5G 0 disk
识别固态硬盘对应的设备。在本例中,它是 nvme0n1。
格式化固态硬盘,创建挂载点,并将其挂载到文件系统。
sudo mkfs.ext4 /dev/nvme0n1
sudo mkdir /ssd
sudo mount /dev/nvme0n1 /ssd
为确保启动后挂载持续进行,请在 fstab 文件中添加一个条目:
确定固态硬盘的 UUID:
lsblk -f
在 fstab 文件中添加一个新条目:
sudo vi /etc/fstab
插入以下一行,将 UUID 替换为从 lsblk -f 中找到的值:
UUID=************-****-****-****-******** /ssd/ ext4 defaults 0 2
更改 /ssd 目录的所有权。
sudo chown ${USER}:${USER} /ssd
将 Docker 目录迁移到固态硬盘
安装固态硬盘并将其提供给你的设备后,你可以使用额外的存储容量来存放空间很大的 Docker 目录。
sudo systemctl stop docker
移动现有的 Docker 文件夹。
sudo du -csh /var/lib/docker/ && \
sudo mkdir /ssd/docker && \
sudo rsync -axPS /var/lib/docker/ /ssd/docker/ && \
sudo du -csh /ssd/docker/
编辑 /etc/docker/daemon.json
sudo vi /etc/docker/daemon.json
插入类似下面的 "data-root "行:
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia",
"data-root": "/ssd/docker"
}
重命名旧的 Docker 数据目录。
sudo mv /var/lib/docker /var/lib/docker.old
重新启动 Docker 守护进程。
sudo systemctl daemon-reload && \
sudo systemctl restart docker && \
sudo journalctl -u docker
在固态硬盘上测试 Docker
watch -n1 df
[终端 2] 打开一个新终端,开始拉取 Docker。
docker pull nvcr.io/nvidia/l4t-base:r35.2.1
[终端 1] 观察/ssd 上的磁盘使用量随着容器映像的下载和提取而上升。
~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nvcr.io/nvidia/l4t-base r35.2.1 dc07eb476a1d 7 months ago 713MB
重新启动 Jetson,并验证是否出现以下情况:
~$ sudo blkid | grep nvme
/dev/nvme0n1: UUID="9fc06de1-7cf3-43e2-928a-53a9c03fc5d8" TYPE="ext4"
~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mmcblk1p1 116G 18G 94G 16% /
none 3.5G 0 3.5G 0% /dev
tmpfs 3.6G 108K 3.6G 1% /dev/shm
tmpfs 734M 35M 699M 5% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.6G 0 3.6G 0% /sys/fs/cgroup
tmpfs 734M 88K 734M 1% /run/user/1000
/dev/nvme0n1 458G 824M 434G 1% /ssd
~$ docker info | grep Root
Docker Root Dir: /ssd/docker
~$ sudo ls -l /ssd/docker/
total 44
drwx--x--x 4 root root 4096 Mar 22 11:44 buildkit
drwx--x--- 2 root root 4096 Mar 22 11:44 containers
drwx------ 3 root root 4096 Mar 22 11:44 image
drwxr-x--- 3 root root 4096 Mar 22 11:44 network
drwx--x--- 13 root root 4096 Mar 22 16:20 overlay2
drwx------ 4 root root 4096 Mar 22 11:44 plugins
drwx------ 2 root root 4096 Mar 22 16:19 runtimes
drwx------ 2 root root 4096 Mar 22 11:44 swarm
drwx------ 2 root root 4096 Mar 22 16:20 tmp
drwx------ 2 root root 4096 Mar 22 11:44 trust
drwx-----x 2 root root 4096 Mar 22 16:19 volumes
~$ sudo du -chs /ssd/docker/
752M /ssd/docker/
752M total
~$ docker info | grep -e "Runtime" -e "Root"
Runtimes: io.containerd.runtime.v1.linux nvidia runc io.containerd.runc.v2
Default Runtime: nvidia
Docker Root Dir: /ssd/docker
您的 Jetson 现在已安装好固态硬盘!
注意
如果您无法使用物理传感器,但仍想试用 Isaac ROS 软件包,可以查看我们的 Isaac Sim 指南来设置模拟环境。
Isaac ROS 正式支持 Hawk、RealSense 和 ZED 相机。
Leopard Imaging 的 Hawk 相机是与 Isaac ROS 生态系统软件包一起使用的立体相机的热门选择。本文档详细介绍了使用 Isaac ROS 配置 Hawk 相机的重要设置说明。
注意事项
为获得最佳效果,必须更新相机固件。
注意
通过 Argus 的 Hawk 立体相机仅支持 Jetson 平台
Hawk 相机必须通过 GMSL 扩展板连接到 Jetson。例如,如果使用 AGX Orin,请参阅 Leopard 板。如需帮助,请联系硬件供应商。
要达到 Hawk 内置 IMU 的目标传感器更新频率,必须适当设置 Jetson 设备上的某些寄存器:
sudo devmem2 0x0c303040 w 0xC050
相应地,如果引脚 9 的当前寄存器设置为 0xD054,则可通过以下命令将低 4 位设置为 0b0000:
sudo devmem2 0x0c303048 w 0xD050
RealSense Model |
Supported? |
---|---|
D455 |
✓ |
D435i |
✓ |
D415 |
✗ |
注意事项
要获得最佳效果,必须更新相机固件。
注意
本教程假定您已按照说明完成了开发人员环境设置。
cd /tmp && \
git clone https://github.com/IntelRealSense/librealsense && \
cd librealsense && \
./scripts/setup_udev_rules.sh
从 realsense-ros 软件源中克隆 isaac_ros_common 和 4.51.1 版本:
cd ${ISAAC_ROS_WS}/src
git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common.git
git clone https://github.com/IntelRealSense/realsense-ros.git -b 4.51.1
注意
${ISAAC_ROS_WS} 被定义为指向 /ssd/workspaces/isaac_ros-dev/ 或 ~/workspaces/isaac_ros-dev/。
cd ${ISAAC_ROS_WS}/src/isaac_ros_common/scripts && \
touch .isaac_ros_common-config && \
echo CONFIG_IMAGE_KEY=ros2_humble.realsense > .isaac_ros_common-config
启动 Docker 容器
cd ${ISAAC_ROS_WS}/src/isaac_ros_common && \
./scripts/run_dev.sh ${ISAAC_ROS_WS}
这会在其中一个分层阶段使用 Dockerfile.realsense 重建容器镜像。重建可能需要几分钟时间。
在重建容器镜像并进入容器后,可以运行 realsense-viewer 来验证 RealSense 相机是否已连接。
realsense-viewer
ZED 相机需要以下设备才能将数据发布到 ROS 2 的话题中:
zed ros2 封装程序支持的所有相机均可在 Isaac ROS 上运行。
ZED Model |
SQA Testing? |
---|---|
ZED 2i |
✓ |
ZED X |
✓ |
ZED 2 |
✗ |
ZED |
✗ |
ZED Mini |
✗ |
ZED X Mini |
✗ |
注意事项
本教程假定您已按照此处的说明设置了开发环境。
cd ${ISAAC_ROS_WS}/src && \
git clone https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_common.git && \
git clone --recurse-submodules https://github.com/stereolabs/zed-ros2-wrapper
注意
${ISAAC_ROS_WS} 被定义为指向 /ssd/workspaces/isaac_ros-dev/ 或 ~/workspaces/isaac_ros-dev/。
注意事项
你不需要安装 ZED SDK,因为这是由 Dockerfile.zed 完成的。
注意事项
您必须安装 ZED 驱动程序。
在下一步启动 Docker 容器之前,请先插入 ZED 相机的 USB 电缆。
配置由 isaac_ros_common/scripts/run_dev.sh 创建的容器,使其包含 Dockerfile.zed。在 isaac_ros_common/scripts 目录中创建 .isaac_ros_common-config 文件:
cd ${ISAAC_ROS_WS}/src/isaac_ros_common/scripts && \
touch .isaac_ros_common-config && \
echo CONFIG_IMAGE_KEY=ros2_humble.user.zed >> .isaac_ros_common-config
启动 Docker 容器
cd ${ISAAC_ROS_WS}/src/isaac_ros_common && \
./scripts/run_dev.sh ${ISAAC_ROS_WS}
这会在其中一个分层阶段使用 Dockerfile.zed 重建容器映像。重建需要一些时间。
在重建容器映像并进入容器后,你可以运行 /usr/local/zed/tools/ZED_Explorer 检查 ZED 相机是否已连接。
/usr/local/zed/tools/ZED_Explorer
如果一切正常,您应该会看到类似下面的内容:
注意事项
这些说明专门针对单目相机。要标定立体相机,请参阅相机标定说明。
cd ${ISAAC_ROS_WS}/src && \
git clone -b ros2 https://github.com/ros-drivers/usb_cam
注意事项
你的相机供应商可能会提供特定的 ROS 2 兼容相机驱动程序软件包,可以用来代替 usb_cam 软件包。
使用 run_dev.sh 脚本启动 Docker 容器:
cd ${ISAAC_ROS_WS}/src/isaac_ros_common && \
./scripts/run_dev.sh
在容器内,构建工作区并为其添加源代码:
cd /workspaces/isaac_ros-dev && \
colcon build --symlink-install && \
source install/setup.bash
运行 usb_cam 图像发布器:
ros2 run usb_cam usb_cam_node_exe --remap __ns:=/my_camera --ros-args -p framerate:=30.0 -p image_height:=720 -p image_width:=1280
使用 run_dev.sh 脚本将另一个终端连接到 Docker 容器:
cd ${ISAAC_ROS_WS}/src/isaac_ros_common && \
./scripts/run_dev.sh
运行相机标定程序:
ros2 run camera_calibration cameracalibrator --size 6x8 --square 0.20 image:=/my_camera/image_raw camera:=/my_camera
完成相机标定教程中的第 6-8 步。
确保按下 "标定",然后按下 "保存 "按钮。
您应该会在第二个终端中看到以下一行:
('Wrote calibration data to', '/tmp/calibrationdata.tar.gz')
标定文件将保存在 /tmp/calibrationdata.tar.gz。
保存标定文件后,在每个终端输入 Ctrl+C 停止节点。
将标定文件移动到所需位置:
cd /workspaces/isaac_ros-dev/src///config/ && \
tar -xvf /tmp/calibrationdata.tar.gz -C ./ ost.yaml && \
mv ost.yaml camera_info.yaml
Isaac ROS 目前支持的开发流程是在目标平台上构建。你可以使用 Isaac ROS Buildfarm 在主机中设置 ROS 2 Humble,并使用 rosdep 设置依赖关系,也可以通过 run_dev.sh 使用基于 Isaac ROS Dev Docker 的开发环境。
我们强烈建议你使用 Isaac ROS Dev Docker 镜像来设置开发环境。这将简化您的开发环境设置,在 Jetson 和 x86_64 平台上使用正确版本的依赖项。在 Isaac ROS Dev Docker 容器中工作,还能自动访问我们的 Isaac ROS Buildfarm。
注意事项
所有 Isaac ROS 快速入门、教程和示例都是以 Isaac ROS Docker 映像作为先决条件设计的。
有关基于 Docker 的 Isaac ROS Dev 开发环境的更多信息,以及如何根据自己的需要对其进行定制,请查看本指南。
注意事项
开始之前,请确认设备上有足够的可用存储空间。我们建议至少要有 30 GB 的空间,以考虑容器和数据集的大小。
在 Jetson 平台上,需要使用 NVMe SSD 存储来提供足够的快速存储空间。请参见此处
sudo systemctl daemon-reload && sudo systemctl restart docker
安装 Git LFS,提取所有大文件:
sudo apt-get install git-lfs
git lfs install --skip-repo
创建 ROS 2 工作区,用于 Isaac ROS 的实验:
用于使用固态硬盘作为可选存储的 Jetson 设置:
mkdir -p /ssd/workspaces/isaac_ros-dev/src
echo "export ISAAC_ROS_WS=/ssd/workspaces/isaac_ros-dev/" >> ~/.bashrc
source ~/.bashrc
mkdir -p ~/workspaces/isaac_ros-dev/src
echo "export ISAAC_ROS_WS=${HOME}/workspaces/isaac_ros-dev/" >> ~/.bashrc
source ~/.bashrc
我们希望将来使用 ISAAC_ROS_WS 环境变量来引用 ROS 2 工作区目录。
要进一步定制开发环境,请查看本指南。
Isaac Sim 设置
Isaac Sim 是由 Omniverse 支持的英伟达机器人仿真平台。
Isaac Sim 可用于运行和测试 ROS2 应用程序。我们可以通过两种方式配置系统。
环路中的软件
环路中的硬件
环路中的软件(SIL)是指被测软件不在目标硬件平台上运行的配置。例如,Isaac ROS 软件包在部署到 Jetson 设备上之前在 x86 上进行测试就是 SIL。
硬件环路(HIL)是指在目标硬件平台上测试软件的配置。例如,Isaac ROS 软件包在 Jetson 设备上测试后再部署就是 HIL。
在这两种配置中,Isaac Sim 始终运行在 x86_64 机器上,提供传感器数据和世界信息。
注意
本教程假设 Isaac Sim 使用本地环境。
如果没有安装系统级 ROS 2,请按照 ROS2 -> 无系统级安装 -> Humble 下的步骤操作。
如果已安装系统级 ROS 2,请单击 "在终端中打开"(Open in Terminal)按钮。它会打开一个终端窗口,然后按照这里的 "ROS2 -> Ubuntu 22.04 -> Humble "概述的步骤操作。在继续之前,请确保您的 ROS 2 安装是源代码。
如果需要 ROS_DOMAIN_ID 来创建一个独立的逻辑网络,请运行以下命令。
export ROS_DOMAIN_ID=
启动 Isaac Sim。
./isaac-sim.sh
注意事项
确保在运行示例程序之前设置 ROS_DOMAIN_ID 环境变量(如果先前已设置)。
设置完成后,查看 "资源库和软件包",开始运行 Isaac ROS 软件包!
Isaac ROS 软件包还可以与 Isaac Sim 配合使用,后者是由 Omniverse 支持的英伟达机器人仿真平台。本网站提供了大量教程,供您学习如何将 Isaac Sim 与 Isaac ROS 结合使用。
在 Jetson 和 x86_64 平台上对 Isaac ROS 软件包进行基准测试的性能结果如下:
以上提供的性能数据是使用 Isaac ROS 基准测得的。此处每个基准的启动脚本中都提供了用于重现结果的配置文件。
每秒帧数(fps)是使用每个所列平台上加速计算管道的最大持续坐标系帧速率测得的。测得的性能包括输入节点 → 性能测试中的节点图 → 输出节点,其中输入节点的发布速率经过自动调整,以发现峰值吞吐量的坐标系掉帧率小于 5%。计算 5 次运行的平均帧频,剔除最小和最大运行;以与传感器捕获速率相匹配的 30hz 发布速率测量延迟。