We are trying to achieve synchronize camera captures across multiple AGX Xavier boards.
We used a local NTP server to synchronize the boards’ system time down to the sub-milliseconds.
Then we specify a timestamp to start synchronized capture on all boards.
However, iCaptureSession->repeat(request) puts the request onto an asynchronous queue.
The boards execute the capture requests slightly differently so we have offset of around 50 milliseconds between different boards.
I was wondering if there are ways to specify a timestamp for the capture request to be executed?
Any suggestions to synchronize cameras across multiple Xavier boards are welcome.
Thank you for your time and help on this.
Hi, in the xavier board, you have GPIO pins, this is the way to go.
Use one Xavier as master, this rise up a GPIO pin in order to warn slaves.
You can use libgpiod to read pin status on slaves and make task. With this method yo easely go to sub milisecond.
To make electrical conections, put in common all xaviers grounds. and same for gpio pins.
you can use gpiomon to check signals.
Thanks for the suggestion, hardware synchronization is definitely the way to go.
But we are still hoping for a software solution.
Currently we have measured that there is a 220-300 millisecond offset between the API call “Argus::ICaptureSession::repeat(Request)” and the timestamp of the first captured frame returned by “Argus::ICaptureMetadata::getSensorTimestamp ()”
I am setting the time gate right before the repeat(Request) call.
This is the closes I can get to the trigger for camera sensor capture.
I would imagine for these research camera setup NVIDIA should provide a method to have more precise control over when the camera sensor start to capture frames.
With software you cant go further, at least this is what my experience says, maybe you can reach 50-150ms. Kernel waits, queues drivers and more increment this offsets. Its a hard work, depends of the software API of the camera your SO kernel.