Isaac ROS Eagle CoE Stereo Camera Setup#
The Leopard Imaging Eagle VB1940 is a stereo Camera-over-Ethernet (CoE) camera supported by NVIDIA’s Sensor Interface Processing Library (SIPL) framework.
For more information on the CoE connectivity and the SIPL framework, see the Camera-over-Ethernet Overview.
Host System Compatibility#
Only Jetson AGX Thor on JetPack 7.1.0 (R38.4.0) with the Leopard Imaging Eagle VB1940 camera is validated.
Other host systems supported by Holoscan Sensor Bridge may also be compatible but are not validated. To find a list of other supported systems, see the Holoscan Sensor Bridge setup page.
Hardware Requirements#
Jetson AGX Thor Developer Kit with JetPack 7.1 installed.
Leopard Imaging Eagle VB1940 stereo camera (
LI-VB1940-STXXX-10GIGE): See Leopard Imaging website for available models.RJ45 Ethernet cable: Cat 6 or better.
QSFP+ to SFP+ adapter (QSA): Mellanox MAM1Q00A-QSA-SP or compatible adapters.
10GBASE-T SFP+ transceiver (copper RJ45 to SFP+): NVIDIA/Mellanox compatible transceiver.
Note
Power over Ethernet (PoE) models of the camera require an external power supply because the Thor MGBE port does not provide PoE. Use a PoE++ injector to bridge the Thor MGBE port to the camera’s PoE port and provide power and data over Ethernet.
Setup Instructions#
This tutorial assumes you have completed the instructions in Developer Environment Setup.
Assemble and connect the hardware:
Insert the QSA adapter into the MGBE QSFP28 port on the Thor AGX board until it clicks into place.
Insert the RJ45 to SFP+ transceiver into the QSA adapter.
If using a PoE camera variant: Connect the RJ45 Ethernet cable from the transceiver’s RJ45 port to the PoE++ injector data port, then from the PoE++ injector PoE port to the PoE camera.
Enable the network interface (assumes camera IP address
192.168.0.2):export EN0=mgbe0_0 sudo nmcli con add con-name hololink-$EN0 ifname $EN0 type ethernet ip4 192.168.0.101/24 sudo nmcli connection modify hololink-$EN0 +ipv4.routes 192.168.0.2/32 sudo nmcli connection up hololink-$EN0
Ensure the network interface is up and the speed is 10000 Mb/s:
ip addr show $EN0 ethtool $EN0 | grep Speed ethtool $EN0 | grep Link
Clone the Holoscan Sensor Bridge repository. For JetPack 7.1.0, use the
release-2.5.0branch.export HOLOSCAN_BRANCH=2.5.0 git clone --branch release-2.5.0 --depth 1 https://github.com/nvidia-holoscan/holoscan-sensor-bridge.git cd holoscan-sensor-bridge
Build the demo container with the
--igpuflag. This is the only valid Hololink container GPU configuration for Thor AGX hardware:sh docker/build.sh --igpu
This creates the Docker image
hololink-demo:<branch_name>.Note
First build: 5–10 minutes (downloads Holoscan container from NGC).
Subsequent builds: Approximately 30 seconds (uses Docker layer caching).
Retrieve the MAC address (
mac_id) and IP address (ip_address) from thehololink-enumerateoutput. These values are required to target the camera.Run the enumerate tool:
docker run --rm --net host --privileged \ hololink-demo:$HOLOSCAN_BRANCH \ timeout 3 hololink-enumerate -i $EN0
Example expected output:
mac_id=8C:1F:64:6D:70:9B hsb_ip_version=0x2510 fpga_crc=0x0 ip_address=192.168.0.2 fpga_uuid=f1627640-b4dc-48af-a360-c55b09b3d230 serial_number=ffffffffffffff interface=mgbe0_0 board=Leopard Eagle
This confirms the camera is reachable through the
mgbe0_0network interface at192.168.0.2.Verify that the HSB board is running the latest firmware. Check the
hsb_ip_versionfield in thehololink-enumerateoutput in the previous step. The expected version for the Eagle camera with JetPack 7.1.0 is0x2510.If a firmware update is required, follow the instructions at Holoscan Sensor Bridge FPGA Firmware Update — Leopard Imaging VB1940 Eagle Camera.
Extract factory calibration data from the camera’s EEPROM. This data populates the
camera_infotopics published by the SIPL ROS camera node and is required by downstream perception tasks such as image rectification and stereo depth estimation. The calibration data is unique to each camera and should be extracted for each camera.Clone the tools directory from the Isaac ROS SIPL Camera package to a temporary directory:
cd /tmp/ && \ git clone --no-checkout --filter=blob:none -b release-4.3 https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_sipl_camera.git isaac_ros_sipl_camera && \ cd isaac_ros_sipl_camera && \ git sparse-checkout init --cone && \ git sparse-checkout set isaac_ros_sipl_camera/tools && \ git checkout
Run the following command to read calibration data from the camera’s EEPROM and generate ROS 2
CameraInfo-compatible YAML files. Read both RGB and IR calibration data for both cameras and save toeagle_calibin your home directory:TOOLS_DIR=/tmp/isaac_ros_sipl_camera/isaac_ros_sipl_camera/tools && \ [[ -f $TOOLS_DIR/read_eagle_eeprom.py ]] || { echo "Error: $TOOLS_DIR/read_eagle_eeprom.py not found"; false; } && \ OUTPUT_DIR=$HOME/eagle_calib && \ mkdir -p $OUTPUT_DIR && \ docker run --rm --net host --runtime=nvidia --privileged \ --user $(id -u):$(id -g) \ -e HOME=/tmp \ -v $TOOLS_DIR:/tools:ro \ -v $OUTPUT_DIR:/eagle_calib \ hololink-demo:$HOLOSCAN_BRANCH \ bash -c "pip install --user -q opencv-python-headless && \ python3 /tools/read_eagle_eeprom.py --part 2 --camera both \ --output-dir /eagle_calib"
Command Options
Option
Description
--ip-addr IPIP address of the Eagle camera (default:
192.168.0.2)--part {0,1,2}Calibration data to read: 0 = RGB only, 1 = IR only, 2 = Both (default:
2)--camera {left,right,both}Which stereo camera to export (default:
both)--output-dir DIROutput directory for YAML files (default:
./eagle_camera_info)--timeout-s SECONDSConnection timeout in seconds (default:
10.0)After successful execution, the following YAML files are created in the output directory
$HOME/eagle_calib/with the following default names:File
Description
eagle_rgb_left.yamlLeft RGB sensor calibration
eagle_rgb_right.yamlRight RGB sensor calibration
eagle_ir_left.yamlLeft IR sensor calibration
eagle_ir_right.yamlRight IR sensor calibration
Each file is compatible with ROS 2
camera_info_manager. Intrinsics are expected to be calibrated at the native sensor resolution of 2560 x 1984.Example YAML structure
image_width: 2560 image_height: 1984 camera_name: "eagle_rgb_left" camera_matrix: rows: 3 cols: 3 data: [fx, 0, cx, 0, fy, cy, 0, 0, 1] distortion_model: rational_polynomial distortion_coefficients: rows: 1 cols: 8 data: [k1, k2, p1, p2, k3, k4, k5, k6] rectification_matrix: rows: 3 cols: 3 data: [1, 0, 0, 0, 1, 0, 0, 0, 1] projection_matrix: rows: 3 cols: 4 data: [fx, 0, cx, 0, 0, fy, cy, 0, 0, 0, 1, 0]
Where:
fx,fy: Focal lengths in pixelscx,cy: Principal point coordinatesk1–k6: Radial distortion coefficientsp1,p2: Tangential distortion coefficients
Visualize the Camera Streams#
Use the isaac_ros_sipl_camera package to publish camera streams over ROS 2.
Refer to the Isaac ROS SIPL Camera documentation for instructions on how to install, launch the camera driver nodes, and visualize the camera streams.
Troubleshooting#
Camera Not Detected#
Symptom#
Running hololink-enumerate returns nothing or times out.
Solution#
If using a PoE camera variant, make sure you used a PoE++ injector, verify that it is powered on, and check that all physical cable connections are secure.
Confirm the network interface
mgbe0_0is configured correctly, the speed is 10 Gbps, and the link is up:ip addr show mgbe0_0 ethtool mgbe0_0 | grep Speed ethtool mgbe0_0 | grep Link
If any of these values are incorrect, check the transceiver and QSA adapter seating, and check all physical connections are secure.
If the issue persists, try powering off and on the camera or the Jetson.
If the issue persists, see the Holoscan Sensor Bridge Troubleshooting guide for additional diagnostics.