38 #ifndef WIN32_LEAN_AND_MEAN
39 #define WIN32_LEAN_AND_MEAN 1
46 #include <arpa/inet.h>
66 #include <MultiSense/MultiSenseChannel.hh>
74 volatile bool doneG =
false;
76 volatile int affineCalib = 0;
77 volatile uint16_t affineCalCount0 = 0;
78 volatile bool affineCalCount0Set =
false;
80 struct featureDetectionTime
82 std::chrono::time_point<std::chrono::system_clock> imageTime;
83 std::chrono::time_point<std::chrono::system_clock> featureTime;
92 std::map<int64_t, featureDetectionTime> elapsedTime;
93 uint16_t observerStatus;
95 uint16_t observerIndex;
97 int16_t observerTheta;
98 uint16_t affineCalCount;
101 void usage(
const char *programNameP)
103 std::cerr <<
"USAGE: " << programNameP <<
" [<options>]" << std::endl;
104 std::cerr <<
"Where <options> are:" << std::endl;
105 std::cerr <<
"\t-a <current_address> : CURRENT IPV4 address (default=10.66.171.21)" << std::endl;
106 std::cerr <<
"\t-m <mtu> : MTU to set the camera to (default=1500)" << std::endl;
107 std::cerr <<
"\t-r <head_id> : remote head ID (default=0)" << std::endl;
108 std::cerr <<
"\t-c : Perform affine calibration (from scratch, discard previous affine calibration)" << std::endl;
109 std::cerr <<
"\t-i : Perform affine calibration (incremental, keep previous affine calibration)" << std::endl;
114 BOOL WINAPI signalHandler(DWORD dwCtrlType)
121 void signalHandler(
int sig)
130 if (head_str ==
"VPB")
134 else if (head_str ==
"0")
138 else if (head_str ==
"1")
142 else if (head_str ==
"2")
146 else if (head_str ==
"3")
151 fprintf(stderr,
"Error: Unrecognized remote head\n");
152 fprintf(stderr,
"Please use one of the following:\n");
153 fprintf(stderr,
"\tVPB\n");
154 fprintf(stderr,
"\t0'\n");
155 fprintf(stderr,
"\t1\n");
156 fprintf(stderr,
"\t2\n");
157 fprintf(stderr,
"\t3\n");
167 for (
size_t i = 0 ; i < modes.size() ; ++i)
170 if (mode.
width >= best_mode.width && mode.
height >= best_mode.height && mode.
disparities >= best_mode.disparities) {
178 system::DeviceMode target_mode(best_mode.width / 2, best_mode.height / 2, 0, best_mode.disparities);
180 for (
size_t i = 0 ; i < modes.size() ; ++i)
183 if (mode.
width == target_mode.width && mode.
height == target_mode.height && mode.
disparities >= target_mode.disparities) {
191 if (target_mode.supportedDataSources == 0) {
199 std::string
writeMatrix(
const float* data,
size_t width,
size_t height)
201 std::stringstream ss;
202 ss << std::fixed << std::setprecision(6);
204 for (
size_t h = 0 ; h < height ; ++h) {
205 for (
size_t w = 0 ; w < width ; ++w) {
206 ss << data[w + width * h] <<
",";
218 std::stringstream ss;
227 ss <<
"APIVersion," << version.
apiVersion <<
",";
229 ss <<
"timeSec," <<
header.timeSeconds <<
",";
230 ss <<
"timeMiroSec," <<
header.timeMicroSeconds <<
",";
231 ss <<
"exposure," <<
header.exposure <<
",";
232 ss <<
"gain," <<
header.gain <<
",";
233 ss <<
"fps," <<
header.framesPerSecond <<
",";
252 bool savePgm(
const std::string& fileName,
255 uint32_t bitsPerPixel,
256 const std::string& comment,
259 std::ofstream outputStream(fileName.c_str(), std::ios::binary | std::ios::out);
261 if (
false == outputStream.good()) {
262 std::cerr <<
"Failed to open \"" << fileName <<
"\"" << std::endl;
266 const uint32_t imageSize = height * width;
268 switch(bitsPerPixel) {
272 outputStream <<
"P5\n"
273 <<
"#" << comment <<
"\n"
274 << width <<
" " << height <<
"\n"
277 outputStream.write(
reinterpret_cast<const char*
>(dataP), imageSize);
283 outputStream <<
"P5\n"
284 <<
"#" << comment <<
"\n"
285 << width <<
" " << height <<
"\n"
288 const uint16_t *imageP =
reinterpret_cast<const uint16_t*
>(dataP);
290 for (uint32_t i=0; i<imageSize; ++i) {
291 uint16_t o = htons(imageP[i]);
292 outputStream.write(
reinterpret_cast<const char*
>(&o),
sizeof(uint16_t));
299 outputStream.close();
303 bool savePgm(
const std::string& fileName,
309 const std::string comment = assembledInfoString(header, info, version, calibration);
322 UserData *userData =
reinterpret_cast<UserData*
>(userDataP);
324 static int64_t lastFrameId = -1;
326 if (-1 == lastFrameId)
330 userData->deviceInfo,
332 userData->calibration);
337 auto it = userData->elapsedTime.find(
header.frameId);
338 if (it == userData->elapsedTime.end()) {
339 featureDetectionTime t;
340 t.imageTime = std::chrono::system_clock::now();
341 userData->elapsedTime.insert(std::pair<int64_t, featureDetectionTime>(
header.frameId, t));
345 it->second.imageTime = std::chrono::system_clock::now();
346 std::cout <<
" Image received after feature: " <<
header.frameId
348 << std::chrono::duration_cast<std::chrono::milliseconds>(it->second.featureTime - it->second.imageTime).count()
350 userData->elapsedTime.erase(it);
354 lastFrameId =
header.frameId;
358 if (
Status_Ok != userData->channelP->getImageHistogram(
header.frameId, histogram))
359 std::cerr <<
"failed to get histogram for frame " <<
header.frameId << std::endl;
363 const char *observerStatus(uint16_t x)
367 case 0:
return "IDLE";
368 case 10:
return "NOT ENOUGH MATCH";
369 case 11:
return "SVD FAILED";
370 case 12:
return "BAD DISTRIBUTION";
371 case 13:
return "IDLE 0";
372 case 14:
return "IDLE 1";
373 case 15:
return "IDLE 01";
374 case 0xffff:
return "IN PROGRESS";
383 UserData *userData =
reinterpret_cast<UserData*
>(userDataP);
384 void * buffer = userData->channelP->reserveCallbackBuffer();
389 fprintf(stderr,
"%s Error Secondary App Data extraction failed\n", __func__ );
390 userData->channelP->releaseCallbackBuffer(buffer);
395 userData->channelP->releaseCallbackBuffer(buffer);
399 if(affineCalCount0Set)
401 std::cout <<
"\033[H";
402 std::cout <<
"Frame: " << fHeader.
frameId <<
" \n";
405 std::cout <<
"Number of features: " << fHeader.
numFeatures <<
" \n";
406 std::cout <<
"Number of descriptors: " << fHeader.
numDescriptors <<
" \n";
407 std::cout <<
"Octave Width: " << fHeader.
octaveWidth <<
" \n";
408 std::cout <<
"Octave Height: " << fHeader.
octaveHeight <<
" \n";
409 std::cout <<
"timeSeconds: " << fHeader.
timeSeconds <<
" \n";
411 std::cout <<
"ptpNanoSeconds: " << fHeader.
ptpNanoSeconds <<
" \n";
415 std::cout <<
"observerStatus: " << observerStatus(fHeader.
observerStatus) <<
" \n";
416 std::cout <<
"observerIndex: " << fHeader.
observerIndex <<
" \n";
417 std::cout <<
"observerNum: " << fHeader.
observerNum <<
" \n";
418 std::cout <<
"observerDy: " << fHeader.
observerDy * 0.001 <<
" \n";
419 std::cout <<
"observerTheta: " << fHeader.
observerTheta * 0.001 <<
" \n";
420 std::cout <<
"affineCalCount: " << fHeader.
affineCalCount <<
" \n";
430 std::cout <<
"observerStatus: IDLE ";
434 std::cout <<
"observerStatus: INITIALIZING " << fHeader.
observerNum <<
" \n";
438 if(userData->observerStatus==0xffff)
440 std::cout <<
"observerStatus: " << observerStatus(userData->observerStatus) <<
" (" << observerStatus(fHeader.
observerStatus) <<
") \n";
441 std::cout <<
"observerIndex: " << userData->observerIndex <<
" \n";
442 std::cout <<
"observerNum: " << userData->observerNum <<
" \n";
443 std::cout <<
"observerDy: " << userData->observerDy * 0.001 <<
" \n";
444 std::cout <<
"observerTheta: " << userData->observerTheta * 0.001 <<
" \n";
445 std::cout <<
"affineCalCount: " << userData->affineCalCount <<
"\n";
452 std::cout << std::endl <<
"affine calibration is finished" << std::endl << std::endl;
458 affineCalCount0Set =
true;
459 std::cout <<
"\033[2J\033[H";
467 auto it = userData->elapsedTime.find(fHeader.
frameId);
468 if (it == userData->elapsedTime.end()) {
469 std::cout <<
"Unexpected result, image not yet received for frame: " << fHeader.
frameId <<
"\n";
470 featureDetectionTime t;
471 t.featureTime = std::chrono::system_clock::now();
472 userData->elapsedTime.insert(std::pair<int64_t, featureDetectionTime>(fHeader.
frameId, t));
476 it->second.featureTime = std::chrono::system_clock::now();
477 std::cout <<
"Feature received after image " << fHeader.
frameId
479 << std::chrono::duration_cast<std::chrono::milliseconds>(it->second.featureTime - it->second.imageTime).count()
481 userData->elapsedTime.erase(it);
485 std::cout <<
"Source: " << fHeader.
source <<
" \n";
486 std::cout <<
"Frame: " << fHeader.
frameId <<
" \n";
489 std::cout <<
"Number of features: " << fHeader.
numFeatures <<
" \n";
490 std::cout <<
"Number of descriptors: " << fHeader.
numDescriptors <<
" \n";
491 std::cout <<
"Octave Width: " << fHeader.
octaveWidth <<
" \n";
492 std::cout <<
"Octave Height: " << fHeader.
octaveHeight <<
" \n";
493 std::cout <<
"timeSeconds: " << fHeader.
timeSeconds <<
" \n";
495 std::cout <<
"ptpNanoSeconds: " << fHeader.
ptpNanoSeconds <<
" \n";
497 std::cout <<
"observerStatus: " << fHeader.
observerStatus <<
" \n";
498 std::cout <<
"observerIndex: " << fHeader.
observerIndex <<
" \n";
499 std::cout <<
"observerNum: " << fHeader.
observerNum <<
" \n";
500 std::cout <<
"observerDy: " << fHeader.
observerDy * 0.001 <<
" \n";
501 std::cout <<
"observerTheta: " << fHeader.
observerTheta * 0.001 <<
" \n";
502 std::cout <<
"affineCalCount: " << fHeader.
affineCalCount <<
"\n";
511 std::string currentAddress =
"10.66.171.21";
516 SetConsoleCtrlHandler (signalHandler, TRUE);
518 signal(SIGINT, signalHandler);
526 while(-1 != (opt =
getopt(argc, argvPP,
"a:m:r:ci")))
528 case 'a': currentAddress = std::string(
optarg);
break;
529 case 'm': mtu = atoi(
optarg);
break;
530 case 'r': head_id = getRemoteHeadIdFromString(
optarg);
break;
531 case 'c': affineCalib = 1;
break;
532 case 'i': affineCalib = 2;
break;
533 default:
usage(*argvPP);
break;
540 if (NULL == channelP) {
541 std::cerr <<
"Failed to establish communications with \"" << currentAddress <<
"\"" << std::endl;
551 std::vector<system::DeviceMode> deviceModes;
556 bool quarter_res =
false;
558 userData.observerStatus=0;
568 std::cout <<
"API build date : " << v.
apiBuildDate <<
"\n";
569 std::cout <<
"API version : 0x" << std::hex << std::setw(4) << std::setfill(
'0') << v.
apiVersion <<
"\n";
571 std::cout <<
"Firmware version : 0x" << std::hex << std::setw(4) << std::setfill(
'0') << v.
sensorFirmwareVersion <<
"\n";
574 std::cout <<
"FPGA DNA : 0x" << std::hex << v.
sensorFpgaDna <<
"\n";
575 std::cout << std::dec;
583 operatingMode = getOperatingMode(deviceModes);
598 operatingMode.
width = 1920;
599 operatingMode.
height = 1200;
601 std::cout <<
"Affine calibration uses full-res" << std::endl;
604 std::cout <<
"Setting resolution to: " << operatingMode.
width <<
"x" <<
605 operatingMode.
height <<
"x" <<
610 if (operatingMode.
width == 960) {
633 std::cerr <<
"Error failed to get registered apps\n";
640 std::cerr <<
"Error failed to activate app " << s.
apps[0].appName;
644 fprintf(stderr,
"%s got registered app: %s activated\n", __func__, s.
apps[0].appName.c_str() );
655 uint32_t fd_opts = 0;
669 std::cerr <<
"Error failed to set featureDetectorConfig apps\n";
673 std::cout <<
"Successfully Configured Feature Detector\n";
678 std::cerr <<
"Failed to get feature detector config: " <<
Channel::statusString(status) << std::endl;
682 std::cout <<
"Current feature detector settings: "
693 status = channelP->
setMtu(mtu);
728 userData.channelP = channelP;
729 userData.version = v;
730 userData.deviceInfo = info;
731 userData.calibration = calibration;