38 #ifndef WIN32_LEAN_AND_MEAN
39 #define WIN32_LEAN_AND_MEAN 1
50 #include <sys/types.h>
58 #include <MultiSense/MultiSenseChannel.hh>
59 #include <MultiSense/MultiSenseTypes.hh>
65 void usage(
const char *programNameP)
68 "USAGE: %s -e <extrinsics_file> -i <intrinsics_file> [<options>]\n",
70 fprintf(stderr,
"Where <options> are:\n");
71 fprintf(stderr,
"\t-a <ip_address> : ip address (default=10.66.171.21)\n");
72 fprintf(stderr,
"\t-s : set the calibration (default is query)\n");
73 fprintf(stderr,
"\t-r : remote head channel (options: VPB, 0, 1, 2, 3)\n");
74 fprintf(stderr,
"\t-y : disable confirmation prompts\n");
79 bool fileExists(
const std::string& name)
82 return (0 == stat(name.c_str(), &sbuf));
85 static int getRemoteHeadIdFromString(
const std::string &head_str,
RemoteHeadChannel & rh)
89 if (head_str ==
"VPB")
91 else if (head_str ==
"0")
93 else if (head_str ==
"1")
95 else if (head_str ==
"2")
97 else if (head_str ==
"3")
100 std::cerr <<
"Error: Unrecognized remote head" <<
'\n';
101 std::cerr <<
"Please use one of the following:" <<
'\n';
102 std::cerr <<
"\tVPB" <<
'\n';
103 std::cerr <<
"\t0" <<
'\n';
104 std::cerr <<
"\t1" <<
'\n';
105 std::cerr <<
"\t2" <<
'\n';
106 std::cerr <<
"\t3" <<
'\n';
113 std::ostream& writeImageIntrinsics (std::ostream& stream,
image::Calibration const& calibration,
bool hasAuxCamera)
115 stream <<
"%YAML:1.0\n";
129 std::ostream& writeImageExtrinsics (std::ostream& stream,
image::Calibration const& calibration,
bool hasAuxCamera)
131 stream <<
"%YAML:1.0\n";
150 std::string ipAddress =
"10.66.171.21";
151 std::string intrinsicsFile;
152 std::string extrinsicsFile;
153 std::string remoteHeadChannelId;
154 bool cameraRemoteHead=
false;
163 while(-1 != (c =
getopt(argc, argvPP,
"a:e:i:r:sy")))
165 case 'a': ipAddress = std::string(
optarg);
break;
166 case 'i': intrinsicsFile = std::string(
optarg);
break;
167 case 'e': extrinsicsFile = std::string(
optarg);
break;
169 remoteHeadChannelId = std::string(
optarg);
170 cameraRemoteHead =
true;
173 case 's': setCal =
true;
break;
174 case 'y': prompt =
false;
break;
175 default:
usage(*argvPP);
break;
181 if (intrinsicsFile.empty() || extrinsicsFile.empty()) {
182 fprintf(stderr,
"Both intrinsics and extrinsics files must be set\n");
186 if (
true == setCal &&
187 (
false == fileExists(intrinsicsFile) ||
188 false == fileExists(extrinsicsFile))) {
190 fprintf(stderr,
"intrinsics or extrinsics file not found\n");
194 if (
false == setCal &&
true == prompt &&
195 (
true == fileExists(intrinsicsFile) ||
196 true == fileExists(extrinsicsFile))) {
199 "One or both of \"%s\" and \"%s\" already exists.\n\n"
200 "Really overwrite these files? (y/n): ",
201 intrinsicsFile.c_str(),
202 extrinsicsFile.c_str());
205 int reply = getchar();
206 if (
'Y' != reply &&
'y' != reply) {
207 fprintf(stdout,
"Aborting\n");
215 if (cameraRemoteHead) {
217 if (getRemoteHeadIdFromString(remoteHeadChannelId, rch) < 0) {
226 if (NULL == channelP) {
227 fprintf(stderr,
"Failed to establish communications with \"%s\"\n",
238 bool hasAuxCamera =
false;
242 fprintf(stderr,
"Failed to query device info: %s\n",
255 if (
false == setCal) {
261 fprintf(stderr,
"failed to query image calibration: %s\n",
266 std::ofstream inFile, exFile;
268 inFile.open (intrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
271 fprintf(stderr,
"failed to open '%s' for writing\n",
272 intrinsicsFile.c_str());
276 exFile.open (extrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
279 fprintf(stderr,
"failed to open '%s' for writing\n",
280 extrinsicsFile.c_str());
284 writeImageIntrinsics (inFile, calibration, hasAuxCamera);
285 writeImageExtrinsics (exFile, calibration, hasAuxCamera);
292 std::ifstream inFile, exFile;
293 std::map<std::string, std::vector<float> > data;
295 inFile.open (intrinsicsFile.c_str ());
298 fprintf(stderr,
"failed to open '%s' for reading\n",
299 intrinsicsFile.c_str());
307 if (data[
"M1"].size () != 3 * 3 ||
308 (data[
"D1"].size () != 5 && data[
"D1"].size () != 8) ||
309 data[
"M2"].size () != 3 * 3 ||
310 (data[
"D2"].size () != 5 && data[
"D2"].size () != 8) ||
311 (hasAuxCamera && data[
"M3"].size () != 3 * 3) ||
312 (hasAuxCamera && data[
"D3"].size () != 5 && data[
"D3"].size () != 8)) {
313 fprintf(stderr,
"intrinsic matrices incomplete in %s\n",
314 intrinsicsFile.c_str());
318 exFile.open (extrinsicsFile.c_str ());
321 fprintf(stderr,
"failed to open '%s' for reading\n",
322 extrinsicsFile.c_str());
330 if (data[
"R1"].size () != 3 * 3 ||
331 data[
"P1"].size () != 3 * 4 ||
332 data[
"R2"].size () != 3 * 3 ||
333 data[
"P2"].size () != 3 * 4 ||
334 (hasAuxCamera && (data[
"R3"].size () != 3 * 3 || data[
"P3"].size () != 3 * 4))) {
335 fprintf(stderr,
"extrinsic matrices incomplete in %s\n",
336 extrinsicsFile.c_str());
342 memcpy (&calibration.
left.
M[0][0], &data[
"M1"].front (), data[
"M1"].size () * sizeof (
float));
343 memset (&calibration.
left.
D[0], 0, sizeof (calibration.
left.
D));
344 memcpy (&calibration.
left.
D[0], &data[
"D1"].front (), data[
"D1"].size () * sizeof (
float));
345 memcpy (&calibration.
left.
R[0][0], &data[
"R1"].front (), data[
"R1"].size () * sizeof (
float));
346 memcpy (&calibration.
left.
P[0][0], &data[
"P1"].front (), data[
"P1"].size () * sizeof (
float));
348 memcpy (&calibration.
right.
M[0][0], &data[
"M2"].front (), data[
"M2"].size () * sizeof (
float));
349 memset (&calibration.
right.
D[0], 0, sizeof (calibration.
right.
D));
350 memcpy (&calibration.
right.
D[0], &data[
"D2"].front (), data[
"D2"].size () * sizeof (
float));
351 memcpy (&calibration.
right.
R[0][0], &data[
"R2"].front (), data[
"R2"].size () * sizeof (
float));
352 memcpy (&calibration.
right.
P[0][0], &data[
"P2"].front (), data[
"P2"].size () * sizeof (
float));
355 memcpy (&calibration.
aux.
M[0][0], &data[
"M3"].front (), data[
"M3"].size () * sizeof (
float));
356 memset (&calibration.
aux.
D[0], 0, sizeof (calibration.
aux.
D));
357 memcpy (&calibration.
aux.
D[0], &data[
"D3"].front (), data[
"D3"].size () * sizeof (
float));
358 memcpy (&calibration.
aux.
R[0][0], &data[
"R3"].front (), data[
"R3"].size () * sizeof (
float));
359 memcpy (&calibration.
aux.
P[0][0], &data[
"P3"].front (), data[
"P3"].size () * sizeof (
float));
364 fprintf(stderr,
"failed to set image calibration: %s\n",
369 fprintf(stdout,
"Image calibration successfully updated\n");