00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <rtabmap/utilite/ULogger.h>
00029 #include <rtabmap/utilite/UFile.h>
00030 #include <rtabmap/utilite/UConversion.h>
00031 #include <rtabmap/core/CameraThread.h>
00032 #include <rtabmap/core/CameraRGBD.h>
00033 #include <rtabmap/core/CameraStereo.h>
00034 #include <rtabmap/core/Camera.h>
00035 #include <rtabmap/core/CameraThread.h>
00036 #include <rtabmap/gui/DataRecorder.h>
00037 #include <QApplication>
00038 #include <signal.h>
00039
00040 using namespace rtabmap;
00041
00042 void showUsage()
00043 {
00044 printf("\nUsage:\n"
00045 "dataRecorder [options] output.db\n"
00046 "Options:\n"
00047 " -hide Don't display the current cloud recorded.\n"
00048 " -debug Set debug level for the logger.\n"
00049 " -rate #.# Input rate Hz (default 0=inf)\n"
00050 " -driver Driver number to use:\n"
00051 " 0=OpenNI-PCL (Kinect)\n"
00052 " 1=OpenNI2 (Kinect and Xtion PRO Live)\n"
00053 " 2=Freenect (Kinect)\n"
00054 " 3=OpenNI-CV (Kinect)\n"
00055 " 4=OpenNI-CV-ASUS (Xtion PRO Live)\n"
00056 " 5=Freenect2 (Kinect v2)\n"
00057 " 6=DC1394 (Bumblebee2)\n"
00058 " 7=FlyCapture2 (Bumblebee2)\n"
00059 " -device "" Device ID (default \"\")\n");
00060 exit(1);
00061 }
00062
00063 rtabmap::CameraThread * cam = 0;
00064 QApplication * app = 0;
00065
00066 void sighandler(int sig)
00067 {
00068 printf("\nSignal %d caught...\n", sig);
00069 if(cam)
00070 {
00071 cam->join(true);
00072 }
00073 if(app)
00074 {
00075 QMetaObject::invokeMethod(app, "quit");
00076 }
00077 }
00078
00079 int main (int argc, char * argv[])
00080 {
00081 ULogger::setType(ULogger::kTypeConsole);
00082 ULogger::setLevel(ULogger::kInfo);
00083
00084
00085 QString fileName;
00086 bool show = true;
00087 int driver = 0;
00088 std::string deviceId;
00089 float rate = 0.0f;
00090
00091 if(argc < 2)
00092 {
00093 showUsage();
00094 }
00095 for(int i=1; i<argc-1; ++i)
00096 {
00097 if(strcmp(argv[i], "-rate") == 0)
00098 {
00099 ++i;
00100 if(i < argc)
00101 {
00102 rate = uStr2Float(argv[i]);
00103 if(rate < 0.0f)
00104 {
00105 showUsage();
00106 }
00107 }
00108 else
00109 {
00110 showUsage();
00111 }
00112 continue;
00113 }
00114 if(strcmp(argv[i], "-debug") == 0)
00115 {
00116 ULogger::setLevel(ULogger::kDebug);
00117 continue;
00118 }
00119 if(strcmp(argv[i], "-hide") == 0)
00120 {
00121 show = false;
00122 continue;
00123 }
00124 if(strcmp(argv[i], "-driver") == 0)
00125 {
00126 ++i;
00127 if(i < argc)
00128 {
00129 driver = std::atoi(argv[i]);
00130 if(driver < 0 || driver > 7)
00131 {
00132 showUsage();
00133 }
00134 }
00135 else
00136 {
00137 showUsage();
00138 }
00139 continue;
00140 }
00141 if(strcmp(argv[i], "-device") == 0)
00142 {
00143 ++i;
00144 if(i < argc)
00145 {
00146 deviceId = argv[i];
00147 }
00148 else
00149 {
00150 showUsage();
00151 }
00152 continue;
00153 }
00154
00155 printf("Unrecognized option : %s\n", argv[i]);
00156 showUsage();
00157 }
00158 fileName = argv[argc-1];
00159
00160 if(UFile::getExtension(fileName.toStdString()).compare("db") != 0)
00161 {
00162 printf("Database names must end with .db extension\n");
00163 showUsage();
00164 }
00165
00166 UINFO("Output = %s", fileName.toStdString().c_str());
00167 UINFO("Show = %s", show?"true":"false");
00168 UINFO("Rate =%f Hz", rate);
00169
00170 app = new QApplication(argc, argv);
00171
00172
00173
00174 signal(SIGABRT, &sighandler);
00175 signal(SIGTERM, &sighandler);
00176 signal(SIGINT, &sighandler);
00177
00178 rtabmap::Camera * camera = 0;
00179 rtabmap::Transform t=rtabmap::Transform(0,0,1,0, -1,0,0,0, 0,-1,0,0);
00180 if(driver == 0)
00181 {
00182 camera = new rtabmap::CameraOpenni(deviceId, rate, t);
00183 }
00184 else if(driver == 1)
00185 {
00186 if(!rtabmap::CameraOpenNI2::available())
00187 {
00188 UERROR("Not built with OpenNI2 support...");
00189 exit(-1);
00190 }
00191 camera = new rtabmap::CameraOpenNI2(deviceId, CameraOpenNI2::kTypeColorDepth, rate, t);
00192 }
00193 else if(driver == 2)
00194 {
00195 if(!rtabmap::CameraFreenect::available())
00196 {
00197 UERROR("Not built with Freenect support...");
00198 exit(-1);
00199 }
00200 camera = new rtabmap::CameraFreenect(deviceId.size()?atoi(deviceId.c_str()):0, CameraFreenect::kTypeColorDepth, rate, t);
00201 }
00202 else if(driver == 3)
00203 {
00204 if(!rtabmap::CameraOpenNICV::available())
00205 {
00206 UERROR("Not built with OpenNI from OpenCV support...");
00207 exit(-1);
00208 }
00209 camera = new rtabmap::CameraOpenNICV(false, rate, t);
00210 }
00211 else if(driver == 4)
00212 {
00213 if(!rtabmap::CameraOpenNICV::available())
00214 {
00215 UERROR("Not built with OpenNI from OpenCV support...");
00216 exit(-1);
00217 }
00218 camera = new rtabmap::CameraOpenNICV(true, rate, t);
00219 }
00220 else if(driver == 5)
00221 {
00222 if(!rtabmap::CameraFreenect2::available())
00223 {
00224 UERROR("Not built with Freenect2 support...");
00225 exit(-1);
00226 }
00227 camera = new rtabmap::CameraFreenect2(deviceId.size()?atoi(deviceId.c_str()):0, rtabmap::CameraFreenect2::kTypeColor2DepthSD, rate, t);
00228 }
00229 else if(driver == 6)
00230 {
00231 if(!rtabmap::CameraStereoDC1394::available())
00232 {
00233 UERROR("Not built with dc1394 support...");
00234 exit(-1);
00235 }
00236 camera = new rtabmap::CameraStereoDC1394(rate, t);
00237 }
00238 else if(driver == 7)
00239 {
00240 if(!rtabmap::CameraStereoFlyCapture2::available())
00241 {
00242 UERROR("Not built with FlyCapture2/Triclops support...");
00243 exit(-1);
00244 }
00245 camera = new rtabmap::CameraStereoFlyCapture2(rate, t);
00246 }
00247 else
00248 {
00249 UFATAL("Camera driver (%d) not found!", driver);
00250 }
00251 cam = new CameraThread(camera);
00252
00253 DataRecorder recorder;
00254
00255 if(recorder.init(fileName))
00256 {
00257 recorder.registerToEventsManager();
00258 if(show)
00259 {
00260 recorder.setWindowTitle("Data recorder");
00261 recorder.setMinimumWidth(500);
00262 recorder.setMinimumHeight(300);
00263 recorder.showNormal();
00264 app->processEvents();
00265 }
00266
00267 if(camera->init())
00268 {
00269 cam->start();
00270
00271 app->exec();
00272
00273 UINFO("Closing...");
00274
00275 recorder.close();
00276 }
00277 else
00278 {
00279 UERROR("Cannot initialize the camera!");
00280 }
00281 }
00282 else
00283 {
00284 UERROR("Cannot initialize the recorder! Maybe the path is wrong: \"%s\"", fileName.toStdString().c_str());
00285 }
00286
00287 if(cam)
00288 {
00289 delete cam;
00290 }
00291
00292 return 0;
00293 }