Hardware/Software:
- Jetson Orin Nano Super Developer Kit (nvidia,p3768-0000+p3767-0005-super)
- JetPack 6.2.1 (L4T R36.4.7)
- Isaac ROS isaac_ros_argus_camera 3.2.5 (ros-humble-isaac-ros-argus-camera)
- GXF Argus extension 3.2.11 (ros-humble-gxf-isaac-argus)
- VIC: nvidia,tegra234-vic
- Kernel: 5.15.148-tegra
- Sensor: Sony IMX586 (CSI, imx586 9-001a) in mode 1 (4000×3000 @ 72fps)
- Power mode: MAXN_SUPER, clocks pinned via clocks.sh
Issue Summary:
I’m using ArgusMonoNode to capture from an IMX586 at 4000×3000 (mode 1, 72fps). This is equivalent to an IMX477-class 4K×3K mode. I have a minimal test setup — just the ArgusMonoNode publishing and a trivial NITROS subscriber that counts frames and logs FPS (no processing, no inference, no display). Despite this, I’m only getting ~44 fps with the GPU converter, and the VIC converter crashes immediately.
Problem 1: VIC engine_type fails at 4000×3000
Setting engine_type: “VIC” in argus_camera_mono_node.yaml causes an immediate crash on the first frame:
ERROR ./gxf/extensions/tensorops/components/ConvertColorFormat.cpp@83: color conversion operation failed.
ERROR ./gxf/extensions/tensorops/components/TensorOperator.cpp@233: operation failed.
ERROR gxf/std/entity_executor.cpp@596: Failed to tick codelet color_converter_operator in entity: converter_left code: GXF_FAILURE
The Tegra234 SoC has a VIC engine, and the Isaac ROS documentation lists engine_type: “VIC” as a valid option specifically intended for offloading color conversion from the GPU. All Jetson Orin modules should have this hardware. Is VIC not supported at this resolution, or is there a configuration step I’m missing?
Problem 2: GPU NV12→RGB8 conversion is the bottleneck at ~22ms median
With engine_type: “GPU” (the default), the GXF converter_left entity takes a median of 21.4ms per tick to convert NV12→RGB8. This alone exceeds the 13.9ms frame budget for 72fps and is the sole bottleneck in the pipeline. For comparison, when I bypass the converter entirely by subscribing in NV12 format, I get a rock-solid 72 fps with the camera capture tick at only 13.6ms median.
Benchmark Results (all with clocks.sh, MAXN_SUPER):Benchmark Results (all with jetson_clocks.sh, MAXN_SUPER):
| Test | Output Format | Steady-State FPS | Converter Tick (median) | Camera Tick (median) |
|---|---|---|---|---|
| GPU + RGB8 | nitros_image_rgb8 |
~44 fps | 21.4ms | 18.6ms |
| NV12 passthrough | nitros_image_nv12 |
72 fps | 0.05ms (bypassed) | 13.6ms |
| VIC + RGB8 | nitros_image_rgb8 |
N/A (crash) | crash on first frame | — |
Without clocks.sh, the GPU test starts at ~72fps but degrades to ~38fps over ~60 seconds as thermal throttling kicks in, with the converter tick climbing from 23ms to 27ms.
GXF JobStatistics (GPU + RGB8, max clocks, 2663 frames):
| Entity | State | Count | Median | 90th % | Max |
|---|---|---|---|---|---|
| argus_camera | Ticking | 2663 | 18.59ms | 20.75ms | 188.48ms |
| converter_left (GPU) | Ticking | 2661 | 21.39ms | 24.80ms | 75.00ms |
| splitter_left | Ticking | 2662 | 0.15ms | 0.18ms | 4.68ms |
GXF JobStatistics (NV12 passthrough, max clocks, 4161 frames):
| Entity | State | Count | Median | 90th % | Max |
|---|---|---|---|---|---|
| argus_camera | Ticking | 4161 | 13.63ms | 13.88ms | 189.13ms |
| converter_left (bypass) | Ticking | 4160 | 0.05ms | 0.05ms | 0.30ms |
| splitter_left | Ticking | 4160 | 0.17ms | 0.20ms | 0.58ms |
Test Setup:
The subscriber is a minimal ManagedNitrosSubscriber that increments a counter and logs FPS every 30 frames — it performs zero processing on the image data. The full pipeline is just ArgusMonoNode → NITROS topic → FrameLoggerNode, running as composable nodes in a single component_container_mt.
Questions:
- Is engine_type: “VIC” expected to work at 4000×3000 on Orin Nano, or is there a resolution/format limitation? The documentation doesn’t mention any such restriction.
- Is ~22ms for a GPU NV12→RGB8 conversion at 4000×3000 (36MB output frame) expected on the Orin Nano’s GPU? This seems high for what should be a straightforward colorspace conversion — that’s only ~1.6 GB/s throughput on a GPU with ~68 GB/s memory bandwidth.
- Is there a recommended way to reduce the converter overhead? We need RGB8 downstream for our vision pipeline. Would a custom CUDA kernel or cv::cuda::cvtColor be faster than the GXF TensorOps path?