Skip to content

Commit f6841df

Browse files
Isaac ROS 4.2
1 parent 17c28a3 commit f6841df

11 files changed

Lines changed: 152 additions & 51 deletions

File tree

config/.build_image_layers.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ context_overrides:
66
cache_to_registry_names: []
77
cache_from_registry_names:
88
- nvcr.io/nvidia/isaac/ros
9-
remote_builder: []
9+
remote_builder: []

config/pip_shim_constraints.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ cbor2==5.6.2
4343
certifi==2025.11.12
4444
chardet==5.2.0
4545
charset-normalizer==3.4.4
46+
click==8.1.6
47+
cloudpickle==3.1.2
4648
colcon-argcomplete==0.3.3
4749
colcon-bash==0.5.0
4850
colcon-cd==0.2.1
@@ -68,6 +70,7 @@ colcon-ros==0.5.0
6870
colcon-test-result==0.3.8
6971
colcon-zsh==0.5.0
7072
colorlog==6.10.1
73+
colorama==0.4.6
7174
composition-interfaces==2.0.3
7275
configobj==5.0.8
7376
contourpy==1.3.3
@@ -240,6 +243,7 @@ opentelemetry-exporter-otlp-proto-http==1.28.1
240243
opentelemetry-proto==1.28.1
241244
opentelemetry-sdk==1.28.1
242245
opentelemetry-semantic-conventions==0.49b1
246+
orjson==3.11.7
243247
osrf-pycommon==2.1.7
244248
packaging==24.0
245249
paho-mqtt==1.6.1
@@ -372,6 +376,7 @@ rqt-py-common==1.6.2
372376
rqt-reconfigure==1.6.2
373377
rqt-robot-monitor==1.0.6
374378
rtree==1.4.1
379+
rsl-rl-lib==3.1.2
375380
ruamel.yaml==0.18.16
376381
ruamel.yaml.clib==0.2.15
377382
s3transfer==0.16.0
@@ -413,6 +418,8 @@ theora-image-transport==4.0.6
413418
threadpoolctl==3.6.0
414419
tifffile==2025.10.16
415420
tokenizers==0.22.1
421+
tensordict==0.7.0
422+
termcolor==1.1.0
416423
torch==2.9.0+cu130
417424
torchmetrics==1.8.2
418425
torchvision==0.24.0+cu130

debian/changelog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
isaac-ros-cli (2.1.0-1) noble; urgency=low
2+
3+
* Support for DGX Spark platform
4+
5+
-- Isaac ROS Maintainers <isaac-ros-maintainers@nvidia.com> Thu, 19 Feb 2026 12:00:00 +0000
6+
17
isaac-ros-cli (2.0.0-1) noble; urgency=low
28

39
* Support for venv and bare metal environments

debian/isaac-ros-cli.install

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,6 @@ scripts/run_dev/isaac_ros_common_config_utils.py usr/lib/isaac-ros-cli/
1515
scripts/run_dev/run_dev.py usr/lib/isaac-ros-cli/
1616
scripts/profile.d/isaac-ros-cli-path.sh etc/profile.d/
1717
docker/packaging/isaac-ros-cuda-13-0.pref etc/apt/preferences.d/
18+
docker/packaging/isaac-ros-dgx-spark.pref etc/apt/preferences.d/
1819
docker/packaging/isaac-ros-opencv-4-6.pref etc/apt/preferences.d/
1920
docker/packaging/isaac-ros-tensorrt-13-0.pref etc/apt/preferences.d/

docker/Dockerfile.isaac_ros

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# license agreement from NVIDIA CORPORATION is strictly prohibited.
88
#
99
# All-in-one image for Isaac ROS development
10+
1011
FROM nvcr.io/nvidia/base/ubuntu:noble-20251013
1112

1213
ARG PLATFORM=amd64
@@ -37,18 +38,18 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
3738
udev \
3839
wget
3940

41+
ARG ISAAC_DEBIAN_COMPONENTS="main external-main"
42+
ARG ISAAC_DEBIAN_DISTRO_SUFFIX=""
43+
4044
# Set up Isaac ROS apt repository
4145
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
42-
/bin/bash -c ' \
43-
set -e; \
44-
k="/usr/share/keyrings/nvidia-isaac-ros.gpg"; \
45-
curl -fsSL https://isaac.download.nvidia.com/isaac-ros/repos.key | gpg --dearmor | tee -a "$k" > /dev/null; \
46-
f="/etc/apt/sources.list.d/nvidia-isaac-ros.list"; \
47-
touch "$f"; \
48-
s="deb [signed-by=$k] https://isaac.download.nvidia.com/isaac-ros/release-4.1 $(lsb_release -cs) main"; \
49-
grep -qxF "$s" "$f" || echo "$s" | tee -a "$f"; \
50-
apt-get update \
51-
'
46+
k="/usr/share/keyrings/nvidia-isaac-ros.gpg" \
47+
&& curl -fsSL https://isaac.download.nvidia.com/isaac-ros/repos.key | gpg --dearmor | tee -a $k > /dev/null \
48+
&& f="/etc/apt/sources.list.d/nvidia-isaac-ros.list" \
49+
&& touch $f \
50+
&& s="deb [signed-by=$k] https://isaac.download.nvidia.com/isaac-ros/release-4.2 $(lsb_release -cs)${ISAAC_DEBIAN_DISTRO_SUFFIX} ${ISAAC_DEBIAN_COMPONENTS}" \
51+
&& (grep -qxF "$s" $f || echo "$s" | tee -a $f) \
52+
&& apt-get update
5253

5354
# Set up CUDA apt repository
5455
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
@@ -69,9 +70,9 @@ ENV PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/src/tensorrt/bin:${PATH
6970
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
7071
apt-key adv --fetch-key https://repo.download.nvidia.com/jetson/jetson-ota-public.asc && \
7172
if [[ ${PLATFORM} == 'arm64' ]]; then \
72-
echo 'deb http://repo.download.nvidia.com/jetson/common r38.2 main' > /etc/apt/sources.list.d/nvidia-jetson-apt-source.list; \
73+
echo 'deb http://repo.download.nvidia.com/jetson/common r38.4 main' > /etc/apt/sources.list.d/nvidia-jetson-apt-source.list; \
7374
elif [[ ${PLATFORM} == 'amd64' ]]; then \
74-
echo 'deb http://repo.download.nvidia.com/jetson/x86_64/noble r38.2 main' > /etc/apt/sources.list.d/nvidia-jetson-apt-source.list; \
75+
echo 'deb http://repo.download.nvidia.com/jetson/x86_64/noble r38.4 main' > /etc/apt/sources.list.d/nvidia-jetson-apt-source.list; \
7576
else \
7677
echo "Unrecognized platform: ${PLATFORM}" && exit 1 ; \
7778
fi && \
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION. All rights reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
#
15+
# SPDX-License-Identifier: Apache-2.0
16+
17+
# Pin DGX Spark packages to the Isaac debian repository so they are always
18+
# sourced from Isaac builds rather than any other configured apt repository
19+
# (e.g. JetPack / L4T feeds).
20+
#
21+
Package: deepstream-tegra vpi-dev libnvvpi4
22+
Pin: origin isaac.download.nvidia.com
23+
Pin-Priority: 1001

docker/rosdep/extra_rosdeps.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,6 +1607,9 @@ dbw_polaris_msgs_dbgsym:
16071607
focal: [ros-humble-dbw-polaris-msgs-dbgsym]
16081608
jammy: [ros-humble-dbw-polaris-msgs-dbgsym]
16091609
noble: [ros-jazzy-dbw-polaris-msgs-dbgsym]
1610+
deepstream-spark:
1611+
ubuntu:
1612+
noble: [deepstream-spark]
16101613
delphi_esr_msgs:
16111614
ubuntu:
16121615
focal: [ros-humble-delphi-esr-msgs]
@@ -7393,11 +7396,17 @@ python3-av-pip-shim:
73937396
python3-cuda-python-pip-shim:
73947397
ubuntu:
73957398
noble: [python3-cuda-python-pip-shim]
7399+
python3-cupy-cuda13x-pip-shim:
7400+
ubuntu:
7401+
noble: [python3-cupy-cuda13x-pip-shim]
73967402
python3-gdown:
73977403
ubuntu:
73987404
focal: [python3-gdown]
73997405
jammy: [python3-gdown]
74007406
noble: [python3-gdown]
7407+
python3-hdbscan-pip-shim:
7408+
ubuntu:
7409+
noble: [python3-hdbscan-pip-shim]
74017410
python3-libnvinfer:
74027411
ubuntu:
74037412
noble: [python3-libnvinfer]
@@ -7453,6 +7462,9 @@ python3-setuptools-scm-pip-shim:
74537462
python3-torch-pip-shim:
74547463
ubuntu:
74557464
noble: [python3-torch-pip-shim]
7465+
python3-rsl-rl-lib-pip-shim:
7466+
ubuntu:
7467+
noble: [python3-rsl-rl-lib-pip-shim]
74567468
python3-transformers-pip-shim:
74577469
ubuntu:
74587470
noble: [python3-transformers-pip-shim]

docker/scripts/workspace-entrypoint.sh

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,6 @@ adduser ${USERNAME} video >/dev/null
3939
adduser ${USERNAME} plugdev >/dev/null
4040
adduser ${USERNAME} sudo >/dev/null
4141

42-
# Ensure ZED SDK files are owned by the workspace user (if installed at build)
43-
if [ -d /usr/local/zed ]; then
44-
chown -R ${USERNAME}:${USERNAME} /usr/local/zed
45-
fi
46-
4742
# If jtop present, give the user access
4843
if [ -S /run/jtop.sock ]; then
4944
JETSON_STATS_GID="$(stat -c %g /run/jtop.sock)"

scripts/run_dev/build_image_layers.py

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,8 @@ def generate_bake_dict(
377377
extra_build_args=None,
378378
nvcr_tag=False,
379379
s3_cache_config=None,
380-
use_kubernetes_driver=False
380+
use_kubernetes_driver=False,
381+
isaac_ros_platform=None
381382
):
382383
"""
383384
Generate a dictionary representing the docker buildx bake configuration.
@@ -391,12 +392,16 @@ def generate_bake_dict(
391392
:param extra_build_args: Dictionary of additional build args.
392393
:param s3_cache_config: Dictionary containing s3 cache configuration.
393394
:param use_kubernetes_driver: Boolean indicating if kubernetes driver is used.
395+
:param isaac_ros_platform: Isaac ROS platform identifier
396+
(e.g. 'amd64', 'arm64-jetpack', 'arm64-fastos').
397+
Defaults to file_arch for backward compatibility.
394398
"""
395399
build_plan = {}
396-
nvcr_url = "nvcr.io/nvidian/isaac-ros/ros"
400+
nvcr_url = "nvcr.io/nvidia/isaac/ros"
397401
dockerfile_list = self.dockerfiles_
398402
file_arch = 'arm64' if arch == 'aarch64' else 'amd64'
399-
platform = file_arch # Use file_arch directly
403+
if isaac_ros_platform is None:
404+
isaac_ros_platform = file_arch # backward compat
400405
variables = dict(self.build_variables_)
401406
variables.update({
402407
'ARCH': arch,
@@ -429,13 +434,25 @@ def get_target(dockerfiles: List[Dockerfile]):
429434

430435
build_plan['targets'] = {}
431436
targets = build_plan['targets']
437+
# Derive the distro suffix from the platform identifier to pre-source
438+
# the appropriate apt repository.
439+
_DISTRO_SUFFIX = {
440+
'amd64': '',
441+
'arm64-jetpack': '-jetpack',
442+
'arm64-fastos': '-fastos',
443+
}
444+
distro_suffix = _DISTRO_SUFFIX.get(isaac_ros_platform, '')
445+
432446
for i, target in enumerate(dockerfile_list):
433447
target_name = get_target(dockerfile_list[:i+1])
434448
targets[target_name] = {'name': target_name}
435449
target_dict = targets[target_name]
436450
target_dict['context'] = str(target.context_dir_)
437451
target_dict['dockerfile'] = target.dockerfile_path_
438-
target_dict['args'] = {'PLATFORM': file_arch}
452+
target_dict['args'] = {
453+
'PLATFORM': file_arch,
454+
'ISAAC_DEBIAN_DISTRO_SUFFIX': distro_suffix,
455+
}
439456

440457
if use_s3_cache:
441458
bucket = s3_cache_config.get('bucket')
@@ -461,24 +478,26 @@ def get_target(dockerfiles: List[Dockerfile]):
461478
if i == 0:
462479
# First target – set (if provided) BASE_IMAGE.
463480
target_dict['tags'] = [
464-
f"{cache_from_registry}/{target_name}-{platform}:latest"
481+
f"{cache_from_registry}/{target_name}-{isaac_ros_platform}:latest"
465482
]
466483
if base_image is not None:
467484
target_dict['args']['BASE_IMAGE'] = base_image
468485
else:
469486
depends_name = ImageBuildPlan(dockerfile_list[:i]).target_name()
470487
target_dict['tags'] = [
471-
f"{cache_from_registry}/{target_name}-{platform}:latest"
488+
f"{cache_from_registry}/{target_name}-{isaac_ros_platform}:latest"
472489
]
473490

474491
target_dict['args'].update({
475492
'BASE_IMAGE': (
476-
f"{cache_from_registry}/{depends_name}-{platform}:latest"
493+
f"{cache_from_registry}/{depends_name}-{isaac_ros_platform}:latest"
477494
)
478495
})
479496
target_dict['depends_on'] = [f"{get_target(dockerfile_list[:i])}"]
480497
if nvcr_tag:
481-
target_dict['tags'].append(f"{nvcr_url}:{target_name}")
498+
target_dict['tags'].append(
499+
f"{nvcr_url}:{target_name}-{isaac_ros_platform}"
500+
)
482501

483502
# If extra build args are provided, update each target's args.
484503
if extra_build_args:
@@ -630,27 +649,28 @@ def countdown_warning(message, seconds=5):
630649
sys.exit(1)
631650

632651

633-
def get_image_name(cache_from_registry_name, env_list, file_arch, include_hash=False):
634-
"""Get the full image name for a given environment list and architecture.
652+
def get_image_name(cache_from_registry_name, env_list, isaac_ros_platform, include_hash=False):
653+
"""Get the full image name for a given environment list and platform.
635654
636655
Args:
637656
cache_from_registry_name (str): Registry name to use for the image
638657
env_list (List[str]): List of environment components
639-
file_arch (str): Architecture (e.g. 'amd64', 'sbsa', 'arm64')
658+
isaac_ros_platform (str): Isaac ROS platform identifier
659+
(e.g. 'amd64', 'arm64-jetpack', 'arm64-fastos')
640660
include_hash (bool): Whether to include the hash in the image name
641661
642662
Returns:
643663
str: Full image name including registry, environment components,
644-
architecture and optionally hash
664+
platform and optionally hash
645665
"""
646666
base_name = '-'.join(env_list)
647667
if os.getenv("CONFIG_CONTAINER_NAME_SUFFIX"):
648668
base_name += f"-{os.getenv('CONFIG_CONTAINER_NAME_SUFFIX')}"
649669

650-
# Use the same docker search dirs as main()
670+
# Derive coarse architecture for Config (remote builder selection, etc.)
651671
config = Config(
652-
platform_="x86_64" if file_arch == "amd64"
653-
else "aarch64" if file_arch == "arm64" or file_arch == "sbsa"
672+
platform_="x86_64" if isaac_ros_platform == "amd64"
673+
else "aarch64" if isaac_ros_platform.startswith("arm64")
654674
else platform.uname().machine
655675
)
656676
config.load_shell_common_config()
@@ -676,7 +696,7 @@ def get_image_name(cache_from_registry_name, env_list, file_arch, include_hash=F
676696
"and that the docker_search_dirs are present and correct.")
677697
exit(1)
678698

679-
target_name = f"{base_name}-{file_arch}"
699+
target_name = f"{base_name}-{isaac_ros_platform}"
680700

681701
if cache_from_registry_name.count("nvcr.io"):
682702
return f"{cache_from_registry_name}:{target_name}"
@@ -697,7 +717,8 @@ def main(image_key_set: List[str],
697717
skip_registry_check: bool = False,
698718
build_local: bool = False,
699719
push: bool = False,
700-
use_kubernetes_driver: bool = False):
720+
use_kubernetes_driver: bool = False,
721+
isaac_ros_platform: str = None):
701722

702723
platform_ = platform_ if platform_ else platform.uname().machine
703724

@@ -756,7 +777,8 @@ def main(image_key_set: List[str],
756777
extra_build_args=config.build_args_,
757778
nvcr_tag=nvcr_tag,
758779
s3_cache_config=config.s3_cache_,
759-
use_kubernetes_driver=use_kubernetes_driver
780+
use_kubernetes_driver=use_kubernetes_driver,
781+
isaac_ros_platform=isaac_ros_platform,
760782
)
761783
docker_bake = ImageBuildPlan.as_hcl_str(docker_bake_dict)
762784
print(redact_bake_hcl(docker_bake))
@@ -990,6 +1012,15 @@ def main(image_key_set: List[str],
9901012
help="Use Kubernetes driver (deploy BuildKit pods on-demand, bypasses NLB).",
9911013
default=False
9921014
)
1015+
parser.add_argument(
1016+
'--isaac-ros-platform',
1017+
type=str,
1018+
dest='isaac_ros_platform',
1019+
default=None,
1020+
help='Isaac ROS platform identifier (e.g., amd64, arm64-jetpack, arm64-fastos). '
1021+
'Determines the apt distro suffix baked into the image and the image name suffix. '
1022+
'Defaults to coarse file_arch for backward compatibility.'
1023+
)
9931024

9941025
args = parser.parse_args()
9951026

@@ -1015,5 +1046,6 @@ def main(image_key_set: List[str],
10151046
nvcr_tag=args.nvcr,
10161047
skip_registry_check=args.skip_registry_check,
10171048
build_local=args.build_local,
1018-
use_kubernetes_driver=args.use_kubernetes_driver
1049+
use_kubernetes_driver=args.use_kubernetes_driver,
1050+
isaac_ros_platform=args.isaac_ros_platform,
10191051
)

0 commit comments

Comments
 (0)