Depth frames arrive at full rate; the first color read blocks, waits out its timeout and returns nothing, and the sample viewer shows an empty window the moment you switch it to image mode. If that is your 3D camera, the likely diagnosis is good news: the camera is fine and the middleware never opened the color sensor. On this camera class the color imager hangs off a separate standard video interface that depth-first middleware does not touch. This guide ranks the causes by probability, gives a separating test for each, works the USB bandwidth arithmetic on a 480 Mbit/s link, and lists the four software routes that deliver color. You will know within ten minutes whether to change one line of code, one setting, or nothing at all.
The decision, up front
Depth works, RGB times out: in most cases you are asking the wrong client. The depth device and the color device are two separate enumerations on one cable, and middleware built on the depth protocol talks only to the first. Work it in this order.
- Open the vendor's own viewer on the same port and switch to color.
- If color appears, the hardware is good: move the color stream to the vendor SDK, a ROS wrapper, libuvc or a GenTL producer.
- If color is missing there too, walk the ranked causes below — a second client holding the interface, USB bandwidth, a virtual-machine layer, a depth-only variant — with hardware last.
The empty viewer window fits this reading: the sample displays whatever streams it holds, and it holds only depth. An absent stream produces no error, just silence until the read gives up.
Two devices, one cable: why depth arrives and color never does
A structured-light or stereo depth camera is an IR projector plus one or two mono sensors. Their frames are packetized under a vendor protocol and reassembled by the SDK into depth and infrared images. The color imager is not on that path. It is exposed to the host as a standard USB Video Class (UVC) device — a second interface on the same physical link. The migration documentation for this camera generation states the split plainly: depth and infrared travel as proprietary packets, and color is a standard video stream on its own interface.
Middleware such as OpenNI2 contains a client for the depth protocol and no UVC client at all. A color stream request therefore cannot be satisfied: it either finds no device or blocks on a queue nothing fills, and the read times out. Nothing was lost in transit — nothing was ever delivered. That is why reseating cables never fixes this one.
Rule out one possibility early: whole product lines of this generation shipped depth-only, with no color imager. If your exact model is one of them, no client will ever produce RGB, and the split-the-job route below is the answer.
Causes in order of probability
Work this table top to bottom; each row's test separates it from every row below it.
| Rank | Cause | Test that proves it | Fix |
|---|---|---|---|
| 1 | The middleware never opens the color interface | The vendor's native viewer shows color on the same port | Read color through the vendor SDK, ROS, libuvc or a GenTL producer |
| 2 | A second client already holds the color interface | Close every viewer and SDK instance, then retry once | One client at a time; grab depth and color from one process |
| 3 | USB bandwidth: two full streams on one 480 Mbit/s link | Drop color to 320 × 240 at 30 fps; if the timeout goes, it was bandwidth | Compressed color, lower resolution, a dedicated port, or USB 3 |
| 4 | A virtual machine forwards depth but drops the video interface | The same code on the bare-metal host | Forward both interfaces or run native |
| 5 | The model is a depth-only variant | The OS lists no video device and the model page says depth-only | Add a separate color camera |
| 6 | A fault in the color hardware path | No color device enumerates on a second host and cable | The return path |
Rank 2 is more common than it looks. Depth and color are grabbed separately, so a viewer you forgot about can hold the color interface while your code holds depth — the same one-client rule behind a camera that works in the vendor tool but not in ROS, showing up here as a color-only timeout.
Rank 3 has a public history: an embedded board ran depth beside 640 × 480 color and failed, then ran the moment color dropped to 320 × 240 with a lighter pixel format. That is a bandwidth signature, and the next section works the arithmetic.
Rank 4 earns its own test because a hypervisor forwards the USB interfaces it was configured for, and the depth interface is the one every setup guide configures. The pattern and its fix are covered in depth camera color stream timeout in a VM; the short version is to prove the code on metal before changing it.
Worked example: 640 × 480 color beside depth on one USB 2.0 link
Inputs, each with its source: color at 640 × 480, 30 fps, uncompressed YUY2 at 2 bytes per pixel — the default uncompressed UVC format; a 16-bit depth map at the same 640 × 480 and 30 fps, the matching depth mode this camera class ships; and a USB 2.0 high-speed link. Color usually outruns depth in resolution on these modules — one current module pairs 800 × 600 RGB with 320 × 240 depth at 30 fps — so color is the expensive stream on the bus. The link signals at 480 Mbit/s, which is 60 MB/s on paper; once protocol overhead and isochronous scheduling take their share, plan on about 35 MB/s sustained for mixed traffic. Treat 35 MB/s as the working budget.
Color: 640 × 480 = 307,200 pixels. At 2 bytes each that is 614,400 bytes per frame, and at 30 fps it is 614,400 × 30 = 18,432,000 bytes/s ≈ 18.4 MB/s.
Depth: the depth map carries the same 640 × 480 at 2 bytes (16-bit) and 30 fps, so it costs another 18.4 MB/s.
Combined: 18.4 + 18.4 = 36.8 MB/s against a 35 MB/s budget — already over before the infrared stream you probably also enabled. The read times out.
The same link with color at 320 × 240: 320 × 240 = 76,800 pixels × 2 bytes = 153,600 bytes per frame × 30 fps = 4,608,000 bytes/s ≈ 4.6 MB/s. Combined with depth that is 18.4 + 4.6 = 23.0 MB/s, or 66% of the budget — it runs with margin, which is exactly the resolution drop that rescued the embedded case above.
Decision rule: on a 480 Mbit/s link keep the stream sum under 28 MB/s, which is the 0.8 factor applied to 35 MB/s. This pair, at 36.8 MB/s, misses that rule by 31%, so the fix is bandwidth — compressed color (MJPG), lower resolution, or USB 3 — and not longer timeouts or cable swaps. Stretching the timeout only moves the failure later. With several cameras on one controller, test one stream at a time; three depth cameras dropping to low FPS is the same wall at larger scale.
Four software routes that deliver color
Once the viewer test clears the hardware, pick the route by what your host already runs.
| Route | What it opens | Choose it when |
|---|---|---|
| Vendor SDK | Both interfaces as one registered device tree, with aligned frames | You control the host software and can link the SDK |
| ROS wrapper | Depth and color as topics, from two clients inside one node | Your stack is already ROS — this is why the wrapper exists |
| libuvc or your own UVC client | The color interface directly, synced to depth by your code | Embedded hosts and middleware you cannot replace |
| GenTL producer plus a GenICam viewer | Data streams enumerated by the standard | Your vision stack already speaks GenTL |
The ROS drivers for this camera class grew color and infrared access precisely because the stock middleware could not fetch them; the wrapper adds the second client the samples lack. When both streams do arrive but drift apart, alignment and latency become their own problem — depth and RGB out of sync covers that fix. On the GenTL route, the producer file must be found and accepted by your viewer first; validating a CTI file before you enumerate saves an hour at the wrong layer. Which transport should carry which stream is a wiring decision of its own — RGB depth stream interface selection compares the options.
Split the job when the middleware will not move
Sometimes the platform decides for you: a locked OS image, middleware you cannot replace, or a host with no room for a second client. Then stop forcing one camera to carry both streams. Use a depth-first 3D sensor for Z and a standard color camera for RGB, triggered together — hardware sync for two cameras covers the wiring, and combining or splitting RGB and the point cloud covers what the split costs you.
On the color side, an area scan camera with a trigger input does the job. The MV-CS200-10GC is a 20 MP GigE color camera. On a GigE link you also get up to 100 m of cable, which USB does not offer.
- Sensor format
- 1"
- Lens mount
- C-mount
- Interface
- GigE
- Resolution
- 16-25 MP
For the depth half, three sensors whose whole job is Z:
- Type
- Stereo / structured light
- Type
- Stereo / structured light
- Type
- Depth / ToF camera
Size the color camera before ordering: two pixels across the smallest feature you must see is the working floor. The camera resolution calculator turns your field of view and feature size into a pixel count and filters the camera finder to the models that clear it.
Checks before you change anything
- Run the vendor's native viewer first; it is the reference client and answers the hardware question in one step.
- Count the devices the OS lists on that cable. Two entries — vendor depth device plus standard video device — mean the color path is intact.
- Confirm your exact model carries a color imager; depth-only variants of this generation exist.
- Close every other viewer, SDK instance and browser demo before blaming the camera. The color interface serves one client at a time.
- Budget the bus with the formula above and keep the stream sum under 28 MB/s on a 480 Mbit/s link.
- Check your SDK version against the camera's supported list. A camera your SDK does not recognize fails loudly; old middleware in between fails quietly.
When it really is the hardware
Three results point at hardware rather than software: no video device enumerates on a second host with a second cable; the vendor viewer cannot show color anywhere; and the OS never listed a color interface even on first install. Then the return path is correct, and our team starts it from the contact page. Every other outcome on this page is cheaper than that call.
Two neighboring symptoms are different faults. Color opens but the image is black: an exposure or pipeline problem, covered in a black RGB stream from a depth camera. Color opens but arrives grayscale: you are watching the infrared stream — depth camera RGB showing black and white names the switch. And a unit that previews infrared but produces no depth is in passive IR mode; the passive IR mode fix is one setting.
The ten-minute checklist
- Note which middleware holds the camera; depth running proves the depth device.
- Close every other client and retry the color read once.
- Open the vendor's native viewer and switch to color.
- Color shows: move the color stream to the vendor SDK, ROS, libuvc or GenTL. Done.
- Color missing: replug, second USB port, then a second host.
- Count the listed devices and confirm the model is not depth-only.
- Test bandwidth: color at 320 × 240 and 30 fps. If it runs, rework the bus budget.
- In a VM? Repeat on bare metal before changing code.
- Still nothing on two hosts: take the return path.
If the viewer test clears the camera and you would rather split depth and color for good, start at the 3D sensors category for the depth half and the camera finder for the color half, or run the system configurator for both in one pass. More integration guides sit on the 3D topic page.
問題
Why does the depth stream work while RGB times out?
Because the two never travel the same way. Depth and infrared frames ride the vendor's packet protocol into the SDK; color is a separate USB video interface, and depth-first middleware contains no client for it. The timeout means zero color buffers were delivered, not that frames were lost — nothing was ever opened to lose them. Working depth also proves cable and power are good, which is why this pattern points at software rather than wiring.
Can OpenNI2 read the color stream at all?
Not on this camera generation. OpenNI2 speaks the depth packet protocol and carries no UVC client, so a color stream request cannot be satisfied regardless of settings. The tools that deliver color — the vendor SDK, a ROS wrapper, libuvc, a GenTL producer — all add that second client. Note that ONI recordings can hold depth and color together, so a file containing color proves the capture tool, not this middleware.
How much USB bandwidth do depth and RGB need together?
Budget with width × height × bytes per pixel × fps. A 640 × 480 stream of 2-byte pixels at 30 fps is about 18.4 MB/s; depth at the same size and rate costs the same, so 36.8 MB/s combined — already past the roughly 35 MB/s a USB 2.0 high-speed link sustains. Keep the sum under 28 MB/s, remember that a hub shares one budget across everything downstream, or move to USB 3 with compressed color.
Is a color stream timeout inside a virtual machine the same fault?
No. In a VM the prime suspect is passthrough: the hypervisor forwards the depth interface and silently drops the standard video interface, so no client can open color. Run the identical code on the bare-metal host once. If color appears there, fix the USB forwarding configuration, not your software — and change one thing at a time, or you will not know which fix worked.
How do I separate an RGB hardware fault from a software gap?
Use the vendor's native viewer on a second host with a second cable; it is the reference client for both interfaces. A color device that lists but will not open is a client conflict, not a fault. One that never lists anywhere, on two hosts and two cables, is the suspect — and the return path is correct. Confirm the exact model is not a depth-only variant before you conclude either way.
What if my platform cannot run a second client for color?
Split the job in hardware: a depth-first 3D sensor for Z plus a triggered color area scan camera for RGB, synchronized from one shared trigger line. Both sides then speak standard interfaces, with no vendor middleware in the color path and no enumeration surprises after a firmware update. Size the color camera at two pixels across the smallest feature you must see.



