Skip to content

Commit 6699b97

Browse files
Isaac ROS 4.0 (#58)
1 parent 8ff02cb commit 6699b97

File tree

82 files changed

+735
-2524
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+735
-2524
lines changed

README.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
NVIDIA-accelerated DNN model inference ROS 2 packages using NVIDIA Triton/TensorRT for both Jetson and x86_64 with CUDA-capable GPU.
44

5-
<div align="center"><img alt="bounding box for people detection" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/main/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_dnn_inference/isaac_ros_dnn_peoplenet.jpg/" width="300px"/>
6-
<img alt="segementation mask for people detection" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/main/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_dnn_inference/isaac_ros_dnn_inference_peoplesemsegnet.jpg/" width="300px"/></div>
5+
<div align="center"><img alt="bounding box for people detection" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_dnn_inference/isaac_ros_dnn_peoplenet.jpg/" width="300px"/>
6+
<img alt="segementation mask for people detection" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_dnn_inference/isaac_ros_dnn_inference_peoplesemsegnet.jpg/" width="300px"/></div>
77

88
## Webinar Available
99

@@ -19,7 +19,7 @@ inference, providing AI-based perception for robotics applications. DNN
1919
inference uses a pre-trained DNN model to ingest an input Tensor and
2020
output a prediction to an output Tensor.
2121

22-
<div align="center"><a class="reference internal image-reference" href="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/main/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_dnn_inference/isaac_ros_dnn_inference_nodegraph.png/"><img alt="image" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/main/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_dnn_inference/isaac_ros_dnn_inference_nodegraph.png/" width="800px"/></a></div>
22+
<div align="center"><a class="reference internal image-reference" href="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_dnn_inference/isaac_ros_dnn_inference_nodegraph.png/"><img alt="image" src="https://media.githubusercontent.com/media/NVIDIA-ISAAC-ROS/.github/release-4.0/resources/isaac_ros_docs/repositories_and_packages/isaac_ros_dnn_inference/isaac_ros_dnn_inference_nodegraph.png/" width="800px"/></a></div>
2323

2424
Above is a typical graph of nodes for DNN inference on image data. The
2525
input image is resized to match the input resolution of the DNN; the
@@ -51,9 +51,9 @@ TensorRT as a backend.
5151
Some DNN models may require custom DNN encoders to convert the input
5252
data to the Tensor format needed for the model, and custom DNN decoders
5353
to convert from output Tensors into results that can be used in the
54-
application. Leverage the DNN encoder and DNN decoder node(s) for image
54+
application. Leverage the DNN encoder and DNN decoder nodes for image
5555
bounding box detection and image segmentation, or your own custom
56-
node(s).
56+
nodes.
5757

5858
> [!Note]
5959
> DNN inference can be performed on different types of input
@@ -70,13 +70,13 @@ This package is powered by [NVIDIA Isaac Transport for ROS (NITROS)](https://dev
7070

7171
## Performance
7272

73-
| Sample Graph<br/><br/> | Input Size<br/><br/> | AGX Orin<br/><br/> | Orin NX<br/><br/> | Orin Nano Super 8GB<br/><br/> | x86_64 w/ RTX 4090<br/><br/> |
74-
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
75-
| [TensorRT Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_tensor_rt_benchmark/scripts/isaac_ros_tensor_rt_dope_node.py)<br/><br/><br/>DOPE<br/><br/> | VGA<br/><br/><br/><br/> | [30.8 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_tensor_rt_dope_node-agx_orin.json)<br/><br/><br/>37 ms @ 30Hz<br/><br/> | [15.5 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_tensor_rt_dope_node-orin_nx.json)<br/><br/><br/>55 ms @ 30Hz<br/><br/> | [20.8 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_tensor_rt_dope_node-orin_nano.json)<br/><br/><br/>51 ms @ 30Hz<br/><br/> | [298 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_tensor_rt_dope_node-x86-4090.json)<br/><br/><br/>5.3 ms @ 30Hz<br/><br/> |
76-
| [Triton Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_triton_benchmark/scripts/isaac_ros_triton_dope_node.py)<br/><br/><br/>DOPE<br/><br/> | VGA<br/><br/><br/><br/> | [31.2 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_triton_dope_node-agx_orin.json)<br/><br/><br/>340 ms @ 30Hz<br/><br/> | [15.5 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_triton_dope_node-orin_nx.json)<br/><br/><br/>55 ms @ 30Hz<br/><br/> | [22.2 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_triton_dope_node-orin_nano.json)<br/><br/><br/>490 ms @ 30Hz<br/><br/> | [277 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_triton_dope_node-x86-4090.json)<br/><br/><br/>4.7 ms @ 30Hz<br/><br/> |
77-
| [TensorRT Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_tensor_rt_benchmark/scripts/isaac_ros_tensor_rt_ps_node.py)<br/><br/><br/>PeopleSemSegNet<br/><br/> | 544p<br/><br/><br/><br/> | [489 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_tensor_rt_ps_node-agx_orin.json)<br/><br/><br/>4.6 ms @ 30Hz<br/><br/> | [258 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_tensor_rt_ps_node-orin_nx.json)<br/><br/><br/>7.1 ms @ 30Hz<br/><br/> | [269 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_tensor_rt_ps_node-orin_nano.json)<br/><br/><br/>6.2 ms @ 30Hz<br/><br/> | [619 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_tensor_rt_ps_node-x86-4090.json)<br/><br/><br/>2.2 ms @ 30Hz<br/><br/> |
78-
| [Triton Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_triton_benchmark/scripts/isaac_ros_triton_ps_node.py)<br/><br/><br/>PeopleSemSegNet<br/><br/> | 544p<br/><br/><br/><br/> | [216 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_triton_ps_node-agx_orin.json)<br/><br/><br/>5.5 ms @ 30Hz<br/><br/> | [143 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_triton_ps_node-orin_nx.json)<br/><br/><br/>8.2 ms @ 30Hz<br/><br/> | –<br/><br/><br/><br/> | [585 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_triton_ps_node-x86-4090.json)<br/><br/><br/>2.5 ms @ 30Hz<br/><br/> |
79-
| [DNN Image Encoder Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/benchmarks/isaac_ros_dnn_image_encoder_benchmark/scripts/isaac_ros_dnn_image_encoder_node.py)<br/><br/><br/><br/> | VGA<br/><br/><br/><br/> | [339 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_dnn_image_encoder_node-agx_orin.json)<br/><br/><br/>13 ms @ 30Hz<br/><br/> | [375 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_dnn_image_encoder_node-orin_nx.json)<br/><br/><br/>12 ms @ 30Hz<br/><br/> | –<br/><br/><br/><br/> | [480 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/main/results/isaac_ros_dnn_image_encoder_node-x86-4090.json)<br/><br/><br/>6.0 ms @ 30Hz<br/><br/> |
73+
| Sample Graph<br/><br/> | Input Size<br/><br/> | AGX Thor<br/><br/> | x86_64 w/ RTX 5090<br/><br/> |
74+
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
75+
| [TensorRT Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/benchmarks/isaac_ros_tensor_rt_benchmark/scripts/isaac_ros_tensor_rt_dope_node.py)<br/><br/><br/>DOPE<br/><br/> | VGA<br/><br/> | [180 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_tensor_rt_dope_node-agx_thor.json)<br/><br/><br/>7.1 ms @ 30Hz<br/><br/> | [321 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_tensor_rt_dope_node-x86-5090.json)<br/><br/><br/>5.2 ms @ 30Hz<br/><br/> |
76+
| [Triton Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/benchmarks/isaac_ros_triton_benchmark/scripts/isaac_ros_triton_dope_node.py)<br/><br/><br/>DOPE<br/><br/> | VGA<br/><br/> | [164 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_triton_dope_node-agx_thor.json)<br/><br/><br/>32 ms @ 30Hz<br/><br/> | [281 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_triton_dope_node-x86-5090.json)<br/><br/><br/>4.5 ms @ 30Hz<br/><br/> |
77+
| [TensorRT Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/benchmarks/isaac_ros_tensor_rt_benchmark/scripts/isaac_ros_tensor_rt_ps_node.py)<br/><br/><br/>PeopleSemSegNet<br/><br/> | 544p<br/><br/> | [589 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_tensor_rt_ps_node-agx_thor.json)<br/><br/><br/>7.6 ms @ 30Hz<br/><br/> | [557 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_tensor_rt_ps_node-x86-5090.json)<br/><br/><br/>3.1 ms @ 30Hz<br/><br/> |
78+
| [Triton Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/benchmarks/isaac_ros_triton_benchmark/scripts/isaac_ros_triton_ps_node.py)<br/><br/><br/>PeopleSemSegNet<br/><br/> | 544p<br/><br/> | [365 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_triton_ps_node-agx_thor.json)<br/><br/><br/>9.6 ms @ 30Hz<br/><br/> | [475 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_triton_ps_node-x86-5090.json)<br/><br/><br/>5.1 ms @ 30Hz<br/><br/> |
79+
| [DNN Image Encoder Node](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/benchmarks/isaac_ros_dnn_image_encoder_benchmark/scripts/isaac_ros_dnn_image_encoder_node.py)<br/><br/> | VGA<br/><br/> | [416 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_dnn_image_encoder_node-agx_thor.json)<br/><br/><br/>13 ms @ 30Hz<br/><br/> | [446 fps](https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_benchmark/blob/release-4.0/results/isaac_ros_dnn_image_encoder_node-x86-5090.json)<br/><br/><br/>9.4 ms @ 30Hz<br/><br/> |
8080

8181
---
8282

@@ -104,4 +104,4 @@ Please visit the [Isaac ROS Documentation](https://nvidia-isaac-ros.github.io/re
104104

105105
## Latest
106106

107-
Update 2024-12-10: Update to be compatible with JetPack 6.1
107+
Update 2025-10-24: Support for ROS 2 Jazzy

SECURITY.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
## Security
2+
3+
NVIDIA is dedicated to the security and trust of our software products and services, including all source code repositories managed through our organization.
4+
5+
If you need to report a security issue, please use the appropriate contact points outlined below. **Please do not report security vulnerabilities through GitHub.**
6+
7+
## Reporting Potential Security Vulnerability in an NVIDIA Product
8+
9+
To report a potential security vulnerability in any NVIDIA product:
10+
- Web: [Security Vulnerability Submission Form](https://www.nvidia.com/object/submit-security-vulnerability.html)
11+
12+
- We encourage you to use the following PGP key for secure email communication: [NVIDIA public PGP Key for communication](https://www.nvidia.com/en-us/security/pgp-key)
13+
- Please include the following information:
14+
- Product/Driver name and version/branch that contains the vulnerability
15+
- Type of vulnerability (code execution, denial of service, buffer overflow, etc.)
16+
- Instructions to reproduce the vulnerability
17+
- Proof-of-concept or exploit code
18+
- Potential impact of the vulnerability, including how an attacker could exploit the vulnerability
19+
20+
While NVIDIA currently does not have a bug bounty program, we do offer acknowledgement when an externally reported security issue is addressed under our coordinated vulnerability disclosure policy. Please visit our [Product Security Incident Response Team (PSIRT)](https://www.nvidia.com/en-us/security/psirt-policies/) policies page for more information.
21+
22+
## NVIDIA Product Security
23+
24+
For all security-related concerns, please visit NVIDIA's Product Security portal at https://www.nvidia.com/en-us/security

isaac_ros_dnn_image_encoder/CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ if(BUILD_TESTING)
4545
set(CMAKE_IGNORE_PATH "/usr/include/gmock" ${CMAKE_IGNORE_PATH})
4646

4747
# Explicitly use ROS2 vendor googletest/gmock
48-
include_directories(BEFORE /opt/ros/humble/src/gtest_vendor/include)
49-
include_directories(BEFORE /opt/ros/humble/src/gmock_vendor/include)
48+
include_directories(BEFORE /opt/ros/$ENV{ROS_DISTRO}/src/gtest_vendor/include)
49+
include_directories(BEFORE /opt/ros/$ENV{ROS_DISTRO}/src/gmock_vendor/include)
5050

5151
# Gtest for dnn image encoder node
5252
ament_add_gtest(dnn_image_encoder_node_test test/dnn_image_encoder_node_test.cpp)
5353
target_link_libraries(dnn_image_encoder_node_test dnn_image_encoder_node)
54-
target_include_directories(dnn_image_encoder_node_test PUBLIC include/isaac_ros_dnn_image_encoder/)
54+
target_include_directories(dnn_image_encoder_node_test PUBLIC include/)
5555
ament_target_dependencies(dnn_image_encoder_node_test rclcpp)
5656
ament_target_dependencies(dnn_image_encoder_node_test isaac_ros_nitros)
5757

isaac_ros_dnn_image_encoder/config/dnn_image_encoder_node.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,5 +410,6 @@ components:
410410
clock: clock
411411
stop_on_deadlock: false
412412
worker_thread_number: 2
413+
worker_thread_name_id: "dnn_image_encoder_node"
413414
- name: clock
414415
type: nvidia::gxf::RealtimeClock

isaac_ros_dnn_image_encoder/package.xml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0"?>
22

33
<!--
4-
SPDX-FileCopyrightText: Copyright (c) 2021-2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
4+
SPDX-FileCopyrightText: Copyright (c) 2021-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
55
66
Licensed under the Apache License, Version 2.0 (the "License");
77
you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@ SPDX-License-Identifier: Apache-2.0
2121
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
2222
<package format="3">
2323
<name>isaac_ros_dnn_image_encoder</name>
24-
<version>3.2.10</version>
24+
<version>4.0.0</version>
2525
<description>Encoder for preprocessing images into tensors for deep learning inference</description>
2626
<maintainer email="[email protected]">Isaac ROS Maintainers</maintainer>
2727
<license>Apache-2.0</license>
@@ -41,6 +41,7 @@ SPDX-License-Identifier: Apache-2.0
4141

4242
<build_depend>isaac_ros_common</build_depend>
4343
<build_depend>isaac_ros_gxf</build_depend>
44+
<build_depend>ament_index_cpp</build_depend>
4445

4546
<exec_depend>gxf_isaac_message_compositor</exec_depend>
4647
<exec_depend>gxf_isaac_tensorops</exec_depend>

isaac_ros_dnn_image_encoder/test/dnn_image_encoder_node_test.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
// SPDX-License-Identifier: Apache-2.0
1717

1818
#include <gmock/gmock.h>
19-
#include "dnn_image_encoder_node.hpp"
19+
#include "isaac_ros_dnn_image_encoder/dnn_image_encoder_node.hpp"
2020
#include "rclcpp/rclcpp.hpp"
2121

2222
// Objective: to cover code lines where exceptions are thrown

isaac_ros_dnn_image_encoder/test/isaac_ros_dnn_image_encoder_image_crop_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ def generate_test_description():
5757
'input_image_height': f'{INPUT_IMAGE_HEIGHT}',
5858
'network_image_width': f'{NETWORK_IMAGE_WIDTH}',
5959
'network_image_height': f'{NETWORK_IMAGE_HEIGHT}',
60-
'image_mean': str(list(IMAGE_MEAN)),
61-
'image_stddev': str(list(IMAGE_STDDEV)),
60+
'image_mean': str(IMAGE_MEAN.tolist()),
61+
'image_stddev': str(IMAGE_STDDEV.tolist()),
6262
'enable_padding': 'True',
6363
'tensor_output_topic': 'tensors',
6464
'dnn_image_encoder_namespace': namespace,

isaac_ros_gxf_extensions/gxf_isaac_tensor_rt/gxf/extensions/tensor_rt/tensor_rt_extension.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ extern "C" {
2525
GXF_EXT_FACTORY_BEGIN()
2626

2727
GXF_EXT_FACTORY_SET_INFO(0xd43f23e4b9bf11eb, 0x9d182b7be630552b, "TensorRTExtension", "TensorRT",
28-
"Nvidia", "2.7.0", "LICENSE");
28+
"Nvidia", "2.8.0", "LICENSE");
2929

3030
GXF_EXT_FACTORY_ADD(0x06a7f0e0b9c011eb, 0x8cd623c9c2070107, nvidia::gxf::TensorRtInference,
3131
nvidia::gxf::Codelet,

isaac_ros_gxf_extensions/gxf_isaac_tensor_rt/gxf/extensions/tensor_rt/tensor_rt_inference.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,12 @@ gxf::Expected<gxf::PrimitiveType> NvInferDatatypeToTensorElementType(nvinfer1::D
110110
case nvinfer1::DataType::kINT64: {
111111
return gxf::PrimitiveType::kInt64;
112112
}
113+
case nvinfer1::DataType::kBOOL: {
114+
return gxf::PrimitiveType::kUnsigned8;
115+
}
113116
case nvinfer1::DataType::kUINT8: {
114117
return gxf::PrimitiveType::kUnsigned8;
115118
}
116-
// case nvinfer1::DataType::kBOOL:
117119
case nvinfer1::DataType::kHALF:
118120
default: {
119121
GXF_LOG_ERROR("Unsupported DataType %d", static_cast<int>(data_type));

0 commit comments

Comments
 (0)