3D visionTroubleshooting

3D camera SDK v2 firmware version mismatch: no device found

Firmware version mismatch, not a cable fault: a 3D camera on v1 firmware lists in lsusb but SDK v2 finds no device. Read the version before swapping cables.

LumaSpec Vision10 min lukua Jaa LinkedInissä

Tällä sivulla 11 osaa
  1. 01The symptom: visible on the bus, invisible to the SDK
  2. 02Why SDK v2 skips cameras on v1 firmware
  3. 03Read the firmware version before anything else
  4. 04The fix: move the camera to v2 firmware
  5. 05The other fix: pin the station to SDK v1
  6. 06Rule out the other causes in this order
  7. 07Worked example: one log, one decision
  8. 08If the firmware is already v2 and it still fails
  9. 09Prevention: write both versions down
  10. 10When the right move is a replacement camera
  11. 11Questions

You installed the SDK, ran its setup script, plugged the camera in — and lsusb lists it while the SDK answers No device found. Swapping cables changes nothing, because the cable is not the problem. This guide is for the engineer bringing a USB 3D camera up on Linux who is seeing descriptor errors such as Invalid descriptor index: 0 during enumeration. You will see where the fault line sits between the USB layer and the SDK's discovery protocol, how to read the camera's firmware version in minutes, and which side to move: the camera's firmware up to the v2 generation, or the station down to the SDK generation the camera already speaks.

The symptom: visible on the bus, invisible to the SDK

Read the log in order, because each line eliminates a suspect. lsusb lists the camera, so the USB layer finished its work: the device attached, its IDs and interface descriptors parsed, power negotiated. The SDK's own port list agrees — it prints one entry for the camera, with an interface name ending in Depth.

Discovery then fails at the next gate. The enumerator logs Invalid descriptor index: 0 and Failed to query USB device serial number, finishes its interface scan, and the device manager closes with No matched usb device found!. Creating a pipeline afterwards returns No device found, error type 2.

That combination — one device on the bus, a failed serial-number query, zero devices reported — is the signature of a protocol mismatch, not a hardware fault. The camera answers every standard USB question and refuses the SDK's first proprietary one. A camera that lists nowhere in lsusb, or that produces no video node at all, is a different failure: a camera visible in lsusb with no video device points at the USB class, and a device that matches but will not open fails later in the chain.

Why SDK v2 skips cameras on v1 firmware

The camera vendor's release notes draw the line plainly: a firmware version of v2.x.x — major version 2 — marks firmware using the UVC protocol, and that generation is supported only by SDK v2. The v2 library dropped the legacy protocol that v1.x firmware speaks. The two SDK generations do not overlap.

A v1-firmware camera therefore passes everything lsusb checks and fails the first thing the v2 SDK checks. The serial-number descriptor query is where the old generation shows itself: index 0 is invalid on firmware that never populated that string for the v2 handshake. The SDK treats the failed query as a quiet skip, which is why you get a plain No device found instead of a message naming the firmware.

device_found = usb_enumerated AND serial_descriptor_read AND (firmware_major == sdk_major)

Two of the three terms are about agreement between camera and library, not hardware. That is why permissions work, reboots and cable swaps move nothing here. The same alignment discipline applies when your own build is the mismatch: fixing a 3D camera header version mismatch is the compile-time twin of this runtime fault, and checking the SDK version before the cable is the habit that prevents both.

Read the firmware version before anything else

Three ways to get the number, in order of usefulness:

  1. A viewer built on the SDK generation the camera answers. If a v1-era viewer still lists the camera, its device information panel shows the firmware version. That one result picks the branch.
  2. The vendor's firmware updater. Its read step reports the current firmware version, product name and serial number before anything is written — read-only, safe, and it works when no SDK will open the camera.
  3. lsusb -v for the string descriptors. This proves the device answers string queries at all, but the firmware version is not part of the USB strings. Use it to test the descriptor layer, not to read the version.

Then commit on the major version:

  • Major version 2: the camera belongs to SDK v2. A current 2.x drop — 2.7.6 in the log this article follows — should enumerate it. If it does not, the fault sits on the host, and the section on v2 cameras that still fail applies.
  • Major version 1: the camera will never enumerate under SDK v2. Either apply the vendor's firmware upgrade — the release notes name 2.0.03 as the version for this compact stereo generation — or keep the station on SDK v1.

The fix: move the camera to v2 firmware

  1. Download the updater and the firmware image from the vendor's own download page for the exact camera model. No mirrors, no third-party copies — you are about to write this file into silicon.
  2. Close every program that holds the camera, including minimised viewers. One owner per USB device.
  3. Run the updater's read step and confirm it reports the v1 version you already recorded.
  4. Apply the update exactly as the vendor's instructions describe. Keep the cable seated and the power undisturbed; do not unplug, power-cycle or suspend the host while the write runs.
  5. Replug the camera. If its USB ID changed, re-run the SDK's setup so the udev rule matches, then replug once more.
  6. Open the v2 viewer and read the version again — it must show a 2.x number. Then create the pipeline and watch the device count go from 0 to 1.

Decide for the whole station, not one machine. After the upgrade the camera speaks only the v2 generation, so every v1 tool on that host stops listing it. A depth board firmware update that fixed enumeration errors follows the same rule: firmware, SDK and tools move together.

The other fix: pin the station to SDK v1

If the camera's generation has no v2 firmware path, or the station runs a stable v1 codebase, the correct move is to pin SDK v1 and record it. Do not keep both generations on one host and hope each program picks its own: pin one library version everywhere is the pattern, and it works for SDK generations as well as builds.

v1 is a legacy branch. It keeps working, but new camera models and fixes land on v2, so plan the migration on your schedule instead of during a line-down event.

Rule out the other causes in this order

With this exact symptom — lsusb happy, serial-number query failed — the probability order is:

Cause Test Fix
Firmware/SDK generation mismatch Firmware reads v1.x under SDK v2 Upgrade to the named v2 release, or pin SDK v1
USB permissions Run the vendor's viewer once with sudo; permission faults log access errors, not Invalid descriptor index Re-run SDK setup to install its udev rule, then replug — udev rules for USB cameras on Linux
Cable or port lsusb -v drops string descriptors; try a short cable and another port Replace the cable; a camera that failed electrically vanishes from lsusb entirely
Your build versus the SDK Run the vendor's prebuilt viewer; if it lists the camera and your code does not Align headers and libraries to one version

One detail from the log helps: every command was run with sudo and the device count was still zero, which rules the permissions row out for this case.

Device-not-found errors that track boot order are their own family; why X_LINK_DEVICE_NOT_FOUND follows camera boot walks that pattern so you can tell it from a firmware mismatch.

Worked example: one log, one decision

The log this article follows: SDK v2.7.6 on Ubuntu 22.04, one camera, every command run with sudo.

  • lsusb: 1 device.
  • SDK port list: 1 entry, the depth interface.
  • Serial-number query: fails at descriptor index 0, so readable serials = 0 of 1.
  • Device manager: No matched usb device found!, found = 1 × 0 × 0 = 0.

The count multiplies out to zero through whichever failed term you trace. Reading the firmware through a v1-era viewer returned 1.x, so the branch rule in code:

# Illustrative: pick the SDK branch from the firmware string
# exactly as the vendor's updater reports it.
firmware_version: str = "1.6.10"   # example v1-style input
major: int = int(firmware_version.split(".")[0])
sdk_branch: str = "v2" if major >= 2 else "v1"
assert sdk_branch == "v1"          # test: major 1 -> v1

# after the vendor's upgrade to the release named for this generation:
firmware_version = "2.0.03"
major = int(firmware_version.split(".")[0])
sdk_branch = "v2" if major >= 2 else "v1"
assert sdk_branch == "v2"          # test: major 2 -> v2

1.6.10 is an illustrative input; 2.0.03 is the release the vendor's notes name for this camera generation. The asserts are the test — run them and the branch picks itself.

The decision, case by case:

  • v1 firmware, station needs SDK v2: upgrade with the vendor's updater, confirm the viewer reports 2.x, then watch the device count move 0 to 1.
  • v1 firmware, station runs well on SDK v1: pin v1, record both versions, schedule the migration.
  • Firmware already 2.x: the camera is not the fault. Work the table above, host side first.
  • Mixed fleet on one host: split by generation or upgrade every camera in one maintenance window — half and half on one machine is the worst place to stop.

If the firmware is already v2 and it still fails

Then the host is the suspect, in this order. Run the vendor's prebuilt viewer, because it carries the exact library the SDK drop was tested with. If the viewer lists the camera and your application does not, your build mixes library versions, and fixing camera SDK build errors after a library upgrade is the fix. If the viewer finds nothing either, re-run the SDK's setup — its udev rule installs under /etc/udev/rules.d/ — and replug; a stale rule after an upgrade behaves exactly like a mismatch. A process that started before the upgrade can still hold the node: an old node keeps the camera busy after a restart.

Prevention: write both versions down

  • Record the camera's firmware version and the SDK version together in the station's build sheet. Either number alone is half the question you will end up asking.
  • Pin one SDK version across binaries, containers and examples. Version alignment is not vision-specific — resolving an SDK framework version mismatch shows the same check on the plant-software side.
  • Check the SDK's supported-device list before adding a camera model to a v2 host: verify stereo cameras before you buy.
  • Take firmware images and updaters from the vendor's own download page only.
  • After any firmware upgrade, re-run SDK setup and replug before judging the result.

When the right move is a replacement camera

If the camera's generation has no v2 firmware path and the station must move to SDK v2, replace the camera instead of forking your fleet across two SDK generations. Depth sensing in the current range splits into time-of-flight, stereo and structured light, and laser profiling:

3D sensorsHikrobot MV-DT01WMU ToF sensing cameraMV-DT01WMU
Type
Depth / ToF camera
Price on requestView and quote
3D sensorsHikrobot MV-DLS300P-04 Laser galvanometer stereo cameraMV-DLS300P-04
Type
Stereo / structured light
$16,579.00 · quotedView and quote

The MV-DT01WMU is a ToF sensing camera, and the MV-DLS300P-04 is a laser galvanometer stereo camera — two ends of the depth-sensing range.

Cameras3D sensors

Laser profilers and stereo 3D cameras

170 models · from $699.00

Browse the camera finder, start the system configurator at the camera step, or ask us through the contact page — free expert support comes with every order.

Kysymykset

How do I check a depth camera's firmware version when the SDK cannot open it?

Use a tool from the SDK generation the camera does answer. A viewer built on the v1 SDK usually still lists it, and its device information panel shows the firmware version. The vendor's firmware updater is the other route: its read step reports the current firmware version, product name and serial number before anything is written, and it works when no SDK will open the camera. lsusb -v confirms the device answers string-descriptor queries, but the firmware version is not part of the USB strings.

Will SDK v2 ever support cameras still on v1 firmware?

No. The v2 library dropped the legacy protocol on purpose; it enumerates only the UVC-based generation that firmware major version 2 marks. A v1-firmware camera stays visible to lsusb but never passes v2 discovery. Your options are the vendor's firmware upgrade to the named v2 release, or keeping that camera and its host on SDK v1.

After upgrading to v2 firmware, will the old SDK v1 tools still see the camera?

No. The upgrade moves the camera to the UVC-protocol generation that only SDK v2 speaks, so v1 tools stop listing it. Treat the upgrade as a station-wide decision: every program, container and example on that host moves to the v2 library at the same time, or the camera goes to a host that already runs v2.

Is it safe to run the firmware upgrade over USB?

Yes, with the vendor's own updater for the exact model and an undisturbed connection. Close every other program holding the camera, keep the cable seated, and do not power-cycle or suspend while the write is in progress. If a write is interrupted, the camera can come back in firmware-update mode with a different USB ID — read the ID before concluding the camera died.

Why does lsusb see the camera when the SDK cannot?

lsusb reads standard USB descriptors — vendor and product ID, interfaces, power — which v1 firmware answers normally. The SDK then goes further: it queries the serial-number string descriptor and switches to its control protocol. A camera on the older protocol fails that first query, logging Invalid descriptor index: 0, so the SDK skips an otherwise healthy device.