38 #ifndef WIN32_LEAN_AND_MEAN 39 #define WIN32_LEAN_AND_MEAN 1 50 #include <sys/types.h> 65 void usage(
const char *programNameP)
68 "USAGE: %s -e <extrinisics_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& writeImageIntrinics (std::ostream& stream,
image::Calibration const& calibration,
bool hasAuxCamera)
115 stream <<
"%YAML:1.0\n";
129 std::ostream& writeImageExtrinics (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",
254 if (
false == setCal) {
260 fprintf(stderr,
"failed to query image calibration: %s\n",
265 std::ofstream inFile, exFile;
267 inFile.open (intrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
270 fprintf(stderr,
"failed to open '%s' for writing\n",
271 intrinsicsFile.c_str());
275 exFile.open (extrinsicsFile.c_str (), std::ios_base::out | std::ios_base::trunc);
278 fprintf(stderr,
"failed to open '%s' for writing\n",
279 extrinsicsFile.c_str());
283 writeImageIntrinics (inFile, calibration, hasAuxCamera);
284 writeImageExtrinics (exFile, calibration, hasAuxCamera);
291 std::ifstream inFile, exFile;
292 std::map<std::string, std::vector<float> > data;
294 inFile.open (intrinsicsFile.c_str ());
297 fprintf(stderr,
"failed to open '%s' for reading\n",
298 intrinsicsFile.c_str());
306 if (data[
"M1"].size () != 3 * 3 ||
307 (data[
"D1"].size () != 5 && data[
"D1"].size () != 8) ||
308 data[
"M2"].size () != 3 * 3 ||
309 (data[
"D2"].size () != 5 && data[
"D2"].size () != 8) ||
310 (hasAuxCamera && data[
"M3"].size () != 3 * 3) ||
311 (hasAuxCamera && data[
"D3"].size () != 5 && data[
"D3"].size () != 8)) {
312 fprintf(stderr,
"intrinsic matrices incomplete in %s\n",
313 intrinsicsFile.c_str());
317 exFile.open (extrinsicsFile.c_str ());
320 fprintf(stderr,
"failed to open '%s' for reading\n",
321 extrinsicsFile.c_str());
329 if (data[
"R1"].size () != 3 * 3 ||
330 data[
"P1"].size () != 3 * 4 ||
331 data[
"R2"].size () != 3 * 3 ||
332 data[
"P2"].size () != 3 * 4 ||
333 (hasAuxCamera && (data[
"R3"].size () != 3 * 3 || data[
"P3"].size () != 3 * 4))) {
334 fprintf(stderr,
"extrinsic matrices incomplete in %s\n",
335 extrinsicsFile.c_str());
341 memcpy (&calibration.
left.
M[0][0], &data[
"M1"].front (), data[
"M1"].size () *
sizeof (float));
342 memset (&calibration.
left.
D[0], 0, sizeof (calibration.
left.
D));
343 memcpy (&calibration.
left.
D[0], &data[
"D1"].front (), data[
"D1"].size () *
sizeof (float));
344 memcpy (&calibration.
left.
R[0][0], &data[
"R1"].front (), data[
"R1"].size () *
sizeof (float));
345 memcpy (&calibration.
left.
P[0][0], &data[
"P1"].front (), data[
"P1"].size () *
sizeof (float));
347 memcpy (&calibration.
right.
M[0][0], &data[
"M2"].front (), data[
"M2"].size () *
sizeof (float));
348 memset (&calibration.
right.
D[0], 0, sizeof (calibration.
right.
D));
349 memcpy (&calibration.
right.
D[0], &data[
"D2"].front (), data[
"D2"].size () *
sizeof (float));
350 memcpy (&calibration.
right.
R[0][0], &data[
"R2"].front (), data[
"R2"].size () *
sizeof (float));
351 memcpy (&calibration.
right.
P[0][0], &data[
"P2"].front (), data[
"P2"].size () *
sizeof (float));
354 memcpy (&calibration.
aux.
M[0][0], &data[
"M3"].front (), data[
"M3"].size () *
sizeof (float));
355 memset (&calibration.
aux.
D[0], 0, sizeof (calibration.
aux.
D));
356 memcpy (&calibration.
aux.
D[0], &data[
"D3"].front (), data[
"D3"].size () *
sizeof (float));
357 memcpy (&calibration.
aux.
R[0][0], &data[
"R3"].front (), data[
"R3"].size () *
sizeof (float));
358 memcpy (&calibration.
aux.
P[0][0], &data[
"P3"].front (), data[
"P3"].size () *
sizeof (float));
363 fprintf(stderr,
"failed to set image calibration: %s\n",
368 fprintf(stdout,
"Image calibration successfully updated\n");
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_VPB
static const char * statusString(Status status)
static Channel * Create(const std::string &sensorAddress)
std::ostream & writeMatrix(std::ostream &stream, std::string const &name, uint32_t rows, uint32_t columns, T const *data)
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_0
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_2
int main(int argc, char **argvPP)
int getopt(int argc, char **argv, char *opts)
int16_t RemoteHeadChannel
virtual Status getImageCalibration(image::Calibration &c)=0
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
uint32_t hardwareRevision
static CRL_CONSTEXPR Status Status_Ok
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_1
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
virtual Status setImageCalibration(const image::Calibration &c)=0
std::istream & parseYaml(std::istream &stream, std::map< std::string, std::vector< float > > &data)
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
virtual Status getDeviceInfo(system::DeviceInfo &info)=0
static void Destroy(Channel *instanceP)
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_3