ZEDX with Nvidia Xavier AGX over SSH

Hello,

I recently acquired a set of ZED cameras and a capture board that I plugged on my Nvidia Xavier AGX.
I tested the whole setup and everything works fine when a screen is connected!

Now, I need to configure my board to process data in an embedded set-up, with no screen attached. That’s where the problems start. If I am correct, the SDK rely on libargus to capture camera images. Now, as far as I can understand, that library requires a display to be connected and does not accept SSH X redirection. Starting a simple image capture with the ZEDX using the C++ or python SDK, I get the following error:

libEGL warning: DRI3: failed to query the version
libEGL warning: DRI2: failed to authenticate
(Argus) Error BadParameter: (propagating from src/eglstream/FrameConsumerImpl.cpp, function initialize(), line 89)
(Argus) Error BadParameter: (propagating from src/eglstream/FrameConsumerImpl.cpp, function create(), line 44)
(Argus) Error BadParameter: (propagating from src/eglstream/FrameConsumerImpl.cpp, function initialize(), line 89)
(Argus) Error BadParameter: (propagating from src/eglstream/FrameConsumerImpl.cpp, function create(), line 44)
CAMERA FAILED TO SETUP

I can find similar problems online of people using nvidia deepstream, but I struggle to find a good answer though:

Forcing the X DISPLAY index with export DISPLAY=:0.0 leads me nowhere:

nvbuf_utils: Could not get EGL display connection
(Argus) Error NotSupported: Failed to initialize EGLDisplay (in src/eglutils/EGLUtils.cpp, function getDefaultDisplay(), line 77)
(Argus) Error NotSupported: Failed to initialize EGLDisplay (in src/eglutils/EGLUtils.cpp, function getDefaultDisplay(), line 77)
(Argus) Error BadParameter: (propagating from src/eglstream/FrameConsumerImpl.cpp, function initialize(), line 89)
(Argus) Error BadParameter: (propagating from src/eglstream/FrameConsumerImpl.cpp, function create(), line 44)
(Argus) Error BadParameter: (propagating from src/eglstream/FrameConsumerImpl.cpp, function initialize(), line 89)
(Argus) Error BadParameter: (propagating from src/eglstream/FrameConsumerImpl.cpp, function create(), line 44)
CAMERA FAILED TO SETUP

I also tried forcing GStreamer to point to a fake screen sink with gst-launch-1.0 -v nvarguscamerasrc ! fakesink but I don’t think I’m doing it right.

Does anyone know what can be done here? I can’t imagine no one is using the ZEDX on a Xavier without a screen. Thank you!

Hardware: 2 ZEDX camera, 1 stereolabs GMSL2 capture board, 1 Nvidia Xavier AGX
Software versions: Linux L4T 35.1.0, JetPack 5.0.2, linux kernel 5.10.104-tegra, CUDA 11.4.14, ZED SDK 4.0.5, ZEDX driver 0.5.4

Hi @gurbain
Welcome to the Stereolabs community.

There is a quick workaround for this problem: a dummy HDMI adapter.
This device will simulate a connected display and so the GPU will be correctly initialized by the OS

Hello @Myzhar

I came up with the same conclusion… I just tested now but I also need to auto-login the user in the Gnome graphical interface, otherwise it does not work properly.

But isn’t there any cleaner and more elegant solution? It could be a source of potential issues to start the whole graphical pipeline while my only concern is camera acquisition and processing.

Yes, this is unfortunately required.

I suggest you ask on the NVIDIA Developer forum

As long as you are not rendering any of the captured imagery, you can launch capture and processing via headless ssh. If you need to see what is going on, I recommend nomachine as a VNC/RDP, it seems to be the fastest option available.

Hi @multicore-manticore ,

Actually, as I mentioned in my second post, you can but only if you make sure that the whole graphical pipeline is started (sudo systemctl start gdm.service) and that you export the display to you ssh session (export DISPLAY=:0).

Here, my request would be to do it properly headless, i.e. not starting any graphical environment (with all their dependencies) in the background. I am trying to use the ZEDX and the Jetson for a critical task in AGV navigation. So keeping a clear control on which process is running in the background is necessary to ensure safety and reliability. In a perfect situation, my pipeline and its dependencies would be the only running process on the board and I can keep full control on it. I can achieve this in a minimal debian image on a classical AMD64 platform but it is really hard with the Nvidia Jetson and Linux4Tegra that the ZEDX requires.