- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Every time I try to use SetDSMinMaxZ(), it fails with PXC_STATUS_DEVICE_FAILED. Is that not implemented yet? Or is there some other problem?
I'm using C++, SDK version 6.0.21.6598, with the R200
PXCSession *session = PXCSession::CreateInstance();
PXCSenseManager *senseManager = session->CreateSenseManager();
pxcStatus st = senseManager->EnableStream(PXCCapture::STREAM_TYPE_DEPTH, 480, 360, 30);
if (st < PXC_STATUS_NO_ERROR)
return -1;
st = senseManager->Init();
if (st < PXC_STATUS_NO_ERROR)
return -1;
PXCCaptureManager *cm = senseManager->QueryCaptureManager();
PXCCapture::Device *device = cm->QueryDevice();
PXCRangeF32 depthRange;
depthRange.min = 600.f;
depthRange.max = 700.f;
st = device->SetDSMinMaxZ(depthRange); // fails with PXC_STATUS_DEVICE_FAILED(-201)
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am having the same problem. I have even tried querying the range, then setting it with the same values:
// Read Range
PXCRangeF32 range;
range = dv->QueryDSMinMaxZ();
// Set Range
//range.min = 760;
//range.max = rangemax;
sts = dv->SetDSMinMaxZ(range);
if (sts<PXC_STATUS_NO_ERROR)
{
sm->Release();
data = 5;
return 5;
}
I find that it is failing when it is trying to set the minimum value:
__inline pxcStatus SetDSMinMaxZ(PXCRangeF32 value) {
pxcStatus sts = SetProperty(PROPERTY_DS_MIN_MAX_Z, (pxcF32)value.min);
When I QueryDSMinMaxZ I get range.min = 0.0 and range.max = 65535.0. So, knowing that the minimum range is about 20", I tried setting it for 30" and still the same error...
Any help would be appreciated! Thanks!
John
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
hmmm...when I turned on the logging in the sdk_info.exe and tried again, I found the following:
[...]ERROR - CameraException: Internal exception: DSDevice::setMinMaxZ can only be used before capture started (-201)
So, that means to use the SetDSMinMaxZ method, I have to create the Device myself, use SetDSMinMaxZ() on it, then use the SenseManager to start stream images? Well, at least that works. But it seems awfully complicated:
PXCSession *session = PXCSession::CreateInstance();
PXCSession::ImplDesc desc1 = {};
desc1.group = PXCSession::IMPL_GROUP_SENSOR;
desc1.subgroup = PXCSession::IMPL_SUBGROUP_VIDEO_CAPTURE;
PXCCapture* c;
session->CreateImpl<PXCCapture>(&desc1, &c);
PXCCapture::Device* device = c->CreateDevice(0);
PXCRangeF32 depthRange;
depthRange.min = 0;
depthRange.max = 2000.f;
pxcStatus st = device->SetDSMinMaxZ(depthRange);
PXCSenseManager *senseManager = session->CreateSenseManager();
st = senseManager->EnableStream(PXCCapture::STREAM_TYPE_DEPTH, 480, 360, 30);
if (st < PXC_STATUS_NO_ERROR)
return -1;
st = senseManager->Init();
if (st < PXC_STATUS_NO_ERROR)
return -1;
//...
Once I got the device anyway, is there a way to comfortably start stream from it directly?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Henning,
Thanks for solving that. It doesn't make much sense that we have to senseManager->Init() before we can get PXCCapture::Device *device, and then can't use *device->SetDSMinMaxZ(depthRange).
Of course, now that I can limit the range, I'm not so sure what it is good for - I could just ignore the values over depthRange.max all by my self... I guess I was hoping it would scale the whole 16 bits between the min and max...
As a side note: Thanks for turning me on to that logging tool. I hadn't really noticed it. Not terribly user friendly, but a help...
John
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
It doesn't make much sense that we have to senseManager->Init() before we can get PXCCapture::Device *device, and then can't use *device->SetDSMinMaxZ(depthRange).
Yeah, the whole design of the SDK around SenseManager and Device thing is weird.
Of course, now that I can limit the range, I'm not so sure what it is good for - I could just ignore the values over depthRange.max all by my self... I guess I was hoping it would scale the whole 16 bits between the min and max...
That's exactly why I wanted it: so I can just copy the complete depth image into our internal data structures without needing to filter out the irrelevant values manually.
As a side note: Thanks for turning me on to that logging tool. I hadn't really noticed it. Not terribly user friendly, but a help...
Yeah, it's well hidden, not really easy to use, but can be helpful, especially for some of the less obvious failures/error codes.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page