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.

  1. Assemble and connect the hardware:

    1. Insert the QSA adapter into the MGBE QSFP28 port on the Thor AGX board until it clicks into place.

    2. Insert the RJ45 to SFP+ transceiver into the QSA adapter.

    3. 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.

  2. 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
    
  3. Clone the Holoscan Sensor Bridge repository. For JetPack 7.1.0, use the release-2.5.0 branch.

    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
    
  4. Build the demo container with the --igpu flag. 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).

  5. Retrieve the MAC address (mac_id) and IP address (ip_address) from the hololink-enumerate output. 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_0 network interface at 192.168.0.2.

  6. Verify that the HSB board is running the latest firmware. Check the hsb_ip_version field in the hololink-enumerate output in the previous step. The expected version for the Eagle camera with JetPack 7.1.0 is 0x2510.

    If a firmware update is required, follow the instructions at Holoscan Sensor Bridge FPGA Firmware Update — Leopard Imaging VB1940 Eagle Camera.

  7. Extract factory calibration data from the camera’s EEPROM. This data populates the camera_info topics 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.

    1. 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
      
    2. 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 to eagle_calib in 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 IP

      IP 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 DIR

      Output directory for YAML files (default: ./eagle_camera_info)

      --timeout-s SECONDS

      Connection timeout in seconds (default: 10.0)

    3. 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.yaml

      Left RGB sensor calibration

      eagle_rgb_right.yaml

      Right RGB sensor calibration

      eagle_ir_left.yaml

      Left IR sensor calibration

      eagle_ir_right.yaml

      Right 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 pixels

      • cx, cy: Principal point coordinates

      • k1k6: Radial distortion coefficients

      • p1, 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#

  1. 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.

  2. Confirm the network interface mgbe0_0 is 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.

  3. If the issue persists, try powering off and on the camera or the Jetson.

  4. If the issue persists, see the Holoscan Sensor Bridge Troubleshooting guide for additional diagnostics.