36 #include "DatabaseSchema_sql.h"
37 #include "DatabaseSchema_0_18_3_sql.h"
38 #include "DatabaseSchema_0_18_0_sql.h"
39 #include "DatabaseSchema_0_17_0_sql.h"
40 #include "DatabaseSchema_0_16_2_sql.h"
41 #include "DatabaseSchema_0_16_1_sql.h"
42 #include "DatabaseSchema_0_16_0_sql.h"
55 _memoryUsedEstimate(0),
56 _dbInMemory(
Parameters::defaultDbSqlite3InMemory()),
57 _cacheSize(
Parameters::defaultDbSqlite3CacheSize()),
58 _journalMode(
Parameters::defaultDbSqlite3JournalMode()),
59 _synchronous(
Parameters::defaultDbSqlite3Synchronous()),
60 _tempStore(
Parameters::defaultDbSqlite3TempStore())
73 ParametersMap::const_iterator
iter;
74 if((
iter=parameters.find(Parameters::kDbSqlite3CacheSize())) != parameters.end())
78 if((
iter=parameters.find(Parameters::kDbSqlite3JournalMode())) != parameters.end())
82 if((
iter=parameters.find(Parameters::kDbSqlite3Synchronous())) != parameters.end())
86 if((
iter=parameters.find(Parameters::kDbSqlite3TempStore())) != parameters.end())
90 if((
iter=parameters.find(Parameters::kDbSqlite3InMemory())) != parameters.end())
102 std::string query =
"PRAGMA cache_size = ";
110 if(journalMode >= 0 && journalMode < 5)
144 if(synchronous >= 0 && synchronous < 3)
172 if(tempStore >= 0 && tempStore < 3)
200 UDEBUG(
"dbInMemory=%d", dbInMemory?1:0);
254 pFrom = (isSave ? pInMemory : pFile);
255 pTo = (isSave ? pFile : pInMemory);
292 std::stringstream query;
294 query <<
"SELECT version FROM Admin;";
329 bool dbFileExist =
false;
333 if(dbFileExist && overwritten)
335 UINFO(
"Deleting database %s...",
url.c_str());
359 ULOGGER_INFO(
"Using database \"%s\" from the hard drive.",
url.c_str());
364 UFATAL(
"DB error : %s (path=\"%s\"). Make sure that your user has write "
365 "permission on the target directory (you may have to change the working directory). ",
sqlite3_errmsg(
_ppDb),
url.c_str());
390 ULOGGER_INFO(
"Database \"%s\" doesn't exist, creating a new one...",
url.c_str());
393 std::string schema = DATABASESCHEMA_SQL;
395 if(!targetVersion.empty())
398 std::vector<std::pair<std::string, std::string> > schemas;
399 schemas.push_back(std::make_pair(
"0.16.0", DATABASESCHEMA_0_16_0_SQL));
400 schemas.push_back(std::make_pair(
"0.16.1", DATABASESCHEMA_0_16_1_SQL));
401 schemas.push_back(std::make_pair(
"0.16.2", DATABASESCHEMA_0_16_2_SQL));
402 schemas.push_back(std::make_pair(
"0.17.0", DATABASESCHEMA_0_17_0_SQL));
403 schemas.push_back(std::make_pair(
"0.18.0", DATABASESCHEMA_0_18_0_SQL));
404 schemas.push_back(std::make_pair(
"0.18.3", DATABASESCHEMA_0_18_3_SQL));
405 schemas.push_back(std::make_pair(
uNumber2Str(RTABMAP_VERSION_MAJOR)+
"."+
uNumber2Str(RTABMAP_VERSION_MINOR), DATABASESCHEMA_SQL));
406 for(
size_t i=0;
i<schemas.size(); ++
i)
412 UERROR(
"Cannot create database with target version \"%s\" (not implemented), using latest version.", targetVersion.c_str());
418 schema = schemas[
i].second;
432 UERROR(
"Opened database version (%s) is more recent than rtabmap "
433 "installed version (%s). Please update rtabmap to new version!",
469 if(!outputUrl.empty())
475 UWARN(
"Database was initialized with an empty url (in memory). To save it, "
476 "the output url should not be empty. The database is thus closed without being saved!");
493 if(
save && !
_dbInMemory && !outputUrl.empty() && !
this->getUrl().empty() && outputUrl.compare(
this->getUrl()) != 0)
495 UWARN(
"Output database path (%s) is different than the opened database "
496 "path (%s). Opened database path is overwritten then renamed to output path.",
497 outputUrl.c_str(),
this->getUrl().c_str());
500 UERROR(
"Failed to rename just closed db %s to %s", this->
getUrl().
c_str(), outputUrl.c_str());
547 query =
"SELECT sum(length(id) + length(map_id) + length(weight) + length(pose) + length(stamp) + ifnull(length(label),0) + length(ground_truth_pose) + ifnull(length(velocity),0) + ifnull(length(gps),0) + ifnull(length(env_sensors),0) + length(time_enter)) from Node;";
551 query =
"SELECT sum(length(id) + length(map_id) + length(weight) + length(pose) + length(stamp) + ifnull(length(label),0) + length(ground_truth_pose) + ifnull(length(velocity),0) + ifnull(length(gps),0) + length(time_enter)) from Node;";
555 query =
"SELECT sum(length(id) + length(map_id) + length(weight) + length(pose) + length(stamp) + ifnull(length(label),0) + length(ground_truth_pose) + ifnull(length(velocity),0) + length(time_enter)) from Node;";
559 query =
"SELECT sum(length(id) + length(map_id) + length(weight) + length(pose) + length(stamp) + ifnull(length(label),0) + length(ground_truth_pose)+ length(time_enter)) from Node;";
563 query =
"SELECT sum(length(id) + length(map_id) + length(weight) + length(pose) + length(stamp) + ifnull(length(label),0) + length(time_enter)) from Node;";
567 query =
"SELECT sum(length(id) + length(map_id) + length(weight) + length(pose)+ length(time_enter)) from Node;";
595 query =
"SELECT sum(length(type) + length(information_matrix) + length(transform) + ifnull(length(user_data),0) + length(from_id) + length(to_id)) from Link;";
599 query =
"SELECT sum(length(type) + length(rot_variance) + length(trans_variance) + length(transform) + ifnull(length(user_data),0) + length(from_id) + length(to_id)) from Link;";
603 query =
"SELECT sum(length(type) + length(rot_variance) + length(trans_variance) + length(transform) + length(from_id) + length(to_id)) from Link;";
607 query =
"SELECT sum(length(type) + length(variance) + length(transform) + length(from_id) + length(to_id)) from Link;";
611 query =
"SELECT sum(length(type) + length(transform) + length(from_id) + length(to_id)) from Link;";
639 query =
"SELECT sum(ifnull(length(image),0) + ifnull(length(time_enter),0)) from Data;";
643 query =
"SELECT sum(length(data) + ifnull(length(time_enter),0)) from Image;";
671 query =
"SELECT sum(ifnull(length(depth),0) + ifnull(length(time_enter),0)) from Data;";
675 query =
"SELECT sum(length(data) + ifnull(length(time_enter),0)) from Depth;";
704 query =
"SELECT sum(length(calibration)) from Data;";
708 query =
"SELECT sum(length(fx) + length(fy) + length(cx) + length(cy) + length(local_transform)) from Depth;";
712 query =
"SELECT sum(length(constant) + length(local_transform)) from Depth;";
741 query =
"SELECT sum(ifnull(length(ground_cells),0) + ifnull(length(obstacle_cells),0) + ifnull(length(empty_cells),0) + length(cell_size) + length(view_point_x) + length(view_point_y) + length(view_point_z)) from Data;";
745 query =
"SELECT sum(ifnull(length(ground_cells),0) + ifnull(length(obstacle_cells),0) + length(cell_size) + length(view_point_x) + length(view_point_y) + length(view_point_z)) from Data;";
778 query =
"SELECT sum(ifnull(length(scan_info),0) + ifnull(length(scan),0)) from Data;";
782 query =
"SELECT sum(length(scan_max_pts) + length(scan_max_range) + ifnull(length(scan),0)) from Data;";
786 query =
"SELECT sum(length(scan_max_pts) + ifnull(length(scan),0)) from Data;";
790 query =
"SELECT sum(length(data2d) + length(data2d_max_pts)) from Depth;";
794 query =
"SELECT sum(length(data2d)) from Depth;";
822 query =
"SELECT sum(length(user_data)) from Data;";
826 query =
"SELECT sum(length(user_data)) from Node;";
855 std::string query =
"SELECT sum(length(id) + length(descriptor_size) + length(descriptor) + length(time_enter)) from Word;";
882 query =
"SELECT sum(length(node_id) + length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(octave) + ifnull(length(depth_x),0) + ifnull(length(depth_y),0) + ifnull(length(depth_z),0) + ifnull(length(descriptor_size),0) + ifnull(length(descriptor),0)) "
887 query =
"SELECT sum(length(node_id) + length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(octave) + ifnull(length(depth_x),0) + ifnull(length(depth_y),0) + ifnull(length(depth_z),0) + ifnull(length(descriptor_size),0) + ifnull(length(descriptor),0)) "
888 "FROM Map_Node_Word";
892 query =
"SELECT sum(length(node_id) + length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + ifnull(length(depth_x),0) + ifnull(length(depth_y),0) + ifnull(length(depth_z),0) + ifnull(length(descriptor_size),0) + ifnull(length(descriptor),0)) "
893 "FROM Map_Node_Word";
897 query =
"SELECT sum(length(node_id) + length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + ifnull(length(depth_x),0) + ifnull(length(depth_y),0) + ifnull(length(depth_z),0) "
898 "FROM Map_Node_Word";
926 query =
"SELECT sum(length(id) + length(stamp) + ifnull(length(data),0) + ifnull(length(wm_state),0)) FROM Statistics;";
930 query =
"SELECT sum(length(id) + length(stamp) + length(data)) FROM Statistics;";
962 query =
"SELECT count(id) from Node WHERE time_enter >= (SELECT MAX(time_enter) FROM Info);";
966 query =
"SELECT count(id) from Node WHERE time_enter >= (SELECT MAX(time_enter) FROM Statistics);";
994 query =
"SELECT count(id) from Word WHERE time_enter >= (SELECT MAX(time_enter) FROM Info);";
998 query =
"SELECT count(id) from Word WHERE time_enter >= (SELECT MAX(time_enter) FROM Statistics);";
1023 std::string query =
"SELECT count(id) from Node;";
1047 std::string query =
"SELECT count(id) from Word;";
1077 query =
"SELECT parameters "
1079 "WHERE time_enter >= (SELECT MAX(time_enter) FROM Info);";
1083 query =
"SELECT parameters "
1085 "WHERE time_enter >= (SELECT MAX(time_enter) FROM Statistics);";
1114 UDEBUG(
"nodeId=%d", nodeId);
1115 std::map<std::string, float>
data;
1120 std::stringstream query;
1124 query <<
"SELECT stamp, data, wm_state "
1125 <<
"FROM Statistics "
1126 <<
"WHERE id=" << nodeId <<
";";
1130 query <<
"SELECT stamp, data "
1131 <<
"FROM Statistics "
1132 <<
"WHERE id=" << nodeId <<
";";
1150 if(dataSize>0 && dataPtr)
1169 if(dataSize>0 && dataPtr)
1171 cv::Mat wmStateMat =
uncompressData(cv::Mat(1, dataSize, CV_8UC1, (
void *)dataPtr));
1172 UASSERT(wmStateMat.type() == CV_32SC1 && wmStateMat.rows == 1);
1173 wmState->resize(wmStateMat.cols);
1174 memcpy(wmState->data(), wmStateMat.data, wmState->size()*
sizeof(
int));
1191 std::map<int, std::pair<std::map<std::string, float>,
double> >
data;
1196 std::stringstream query;
1198 query <<
"SELECT id, stamp, data "
1199 <<
"FROM Statistics;";
1215 const void * dataPtr = 0;
1219 if(dataSize>0 && dataPtr)
1248 std::map<int, std::vector<int> >
data;
1253 std::stringstream query;
1255 query <<
"SELECT id, wm_state "
1256 <<
"FROM Statistics;";
1268 std::vector<int> wmState;
1271 if(dataSize>0 && dataPtr)
1273 cv::Mat wmStateMat =
uncompressData(cv::Mat(1, dataSize, CV_8UC1, (
void *)dataPtr));
1274 UASSERT(wmStateMat.type() == CV_32SC1 && wmStateMat.rows == 1);
1275 wmState.resize(wmStateMat.cols);
1276 memcpy(wmState.data(), wmStateMat.data, wmState.size()*
sizeof(
int));
1279 if(!wmState.empty())
1281 data.insert(std::make_pair(
id, wmState));
1297 UDEBUG(
"load data for %d signatures images=%d scan=%d userData=%d, grid=%d",
1298 (
int)signatures.size(), images?1:0, scan?1:0, userData?1:0, occupancyGrid?1:0);
1300 if(!images && !scan && !userData && !occupancyGrid)
1302 UWARN(
"All requested data fields are false! Nothing loaded...");
1312 std::stringstream query;
1316 std::stringstream fields;
1320 fields <<
"image, depth, calibration";
1321 if(scan || userData || occupancyGrid)
1328 fields <<
"scan_info, scan";
1329 if(userData || occupancyGrid)
1336 fields <<
"user_data";
1346 fields <<
"ground_cells, obstacle_cells, empty_cells, cell_size, view_point_x, view_point_y, view_point_z";
1350 fields <<
"ground_cells, obstacle_cells, cell_size, view_point_x, view_point_y, view_point_z";
1354 query <<
"SELECT " << fields.str().c_str() <<
" "
1361 query <<
"SELECT image, depth, calibration, scan_max_pts, scan_max_range, scan, user_data "
1368 query <<
"SELECT image, depth, calibration, scan_max_pts, scan, user_data "
1375 query <<
"SELECT Data.image, Data.depth, Data.calibration, Data.scan_max_pts, Data.scan, Node.user_data "
1377 <<
"INNER JOIN Node "
1378 <<
"ON Data.id = Node.id "
1379 <<
"WHERE Data.id = ?"
1384 query <<
"SELECT Image.data, "
1385 "Depth.data, Depth.local_transform, Depth.fx, Depth.fy, Depth.cx, Depth.cy, Depth.data2d_max_pts, Depth.data2d, Node.user_data "
1387 <<
"INNER JOIN Node "
1388 <<
"on Image.id = Node.id "
1389 <<
"LEFT OUTER JOIN Depth "
1390 <<
"ON Image.id = Depth.id "
1391 <<
"WHERE Image.id = ?"
1396 query <<
"SELECT Image.data, "
1397 "Depth.data, Depth.local_transform, Depth.fx, Depth.fy, Depth.cx, Depth.cy, Depth.data2d, Node.user_data "
1399 <<
"INNER JOIN Node "
1400 <<
"on Image.id = Node.id "
1401 <<
"LEFT OUTER JOIN Depth "
1402 <<
"ON Image.id = Depth.id "
1403 <<
"WHERE Image.id = ?"
1408 query <<
"SELECT Image.data, "
1409 "Depth.data, Depth.local_transform, Depth.fx, Depth.fy, Depth.cx, Depth.cy, Depth.data2d "
1411 <<
"LEFT OUTER JOIN Depth "
1412 <<
"ON Image.id = Depth.id "
1413 <<
"WHERE Image.id = ?"
1418 query <<
"SELECT Image.data, "
1419 "Depth.data, Depth.local_transform, Depth.constant, Depth.data2d "
1421 <<
"LEFT OUTER JOIN Depth "
1422 <<
"ON Image.id = Depth.id "
1423 <<
"WHERE Image.id = ?"
1430 const void *
data = 0;
1434 for(std::list<Signature*>::iterator
iter = signatures.begin();
iter!=signatures.end(); ++
iter)
1449 cv::Mat imageCompressed;
1450 cv::Mat depthOrRightCompressed;
1451 std::vector<CameraModel> models;
1452 std::vector<StereoCameraModel> stereoModels;
1454 cv::Mat scanCompressed;
1455 cv::Mat userDataCompressed;
1462 if(dataSize>4 &&
data)
1464 imageCompressed = cv::Mat(1, dataSize, CV_8UC1, (
void *)
data).clone();
1470 if(dataSize>4 &&
data)
1472 depthOrRightCompressed = cv::Mat(1, dataSize, CV_8UC1, (
void *)
data).clone();
1479 if((
unsigned int)dataSize == localTransform.
size()*
sizeof(
float) &&
data)
1481 memcpy(localTransform.
data(),
data, dataSize);
1496 if(dataSize > 0 &&
data)
1500 if(dataSize >=
int(
sizeof(
int)*4))
1502 const int * dataInt = (
const int *)
data;
1503 int type = dataInt[3];
1507 int bytesReadTotal = 0;
1508 unsigned int bytesRead = 0;
1509 while(bytesReadTotal < dataSize &&
1510 (bytesRead=
model.deserialize((
const unsigned char *)
data+bytesReadTotal, dataSize-bytesReadTotal))!=0)
1512 bytesReadTotal+=bytesRead;
1513 models.push_back(
model);
1515 UASSERT(bytesReadTotal == dataSize);
1520 int bytesReadTotal = 0;
1521 unsigned int bytesRead = 0;
1522 while(bytesReadTotal < dataSize &&
1523 (bytesRead=
model.deserialize((
const unsigned char *)
data+bytesReadTotal, dataSize-bytesReadTotal))!=0)
1525 bytesReadTotal+=bytesRead;
1526 stereoModels.push_back(
model);
1528 UASSERT(bytesReadTotal == dataSize);
1537 UFATAL(
"Wrong format of the Data.calibration field (size=%d bytes)", dataSize);
1542 float * dataFloat = (
float*)
data;
1544 (
unsigned int)dataSize % (6+localTransform.
size())*
sizeof(
float) == 0)
1546 int cameraCount = dataSize / ((6+localTransform.
size())*
sizeof(
float));
1547 UDEBUG(
"Loading calibration for %d cameras (%d bytes)", cameraCount, dataSize);
1548 int max = cameraCount*(6+localTransform.
size());
1549 for(
int i=0;
i<
max;
i+=6+localTransform.
size())
1553 memcpy(localTransform.
data(), dataFloat+
i+6, localTransform.
size()*
sizeof(
float));
1559 (
double)dataFloat[
i],
1560 (
double)dataFloat[
i+1],
1561 (
double)dataFloat[
i+2],
1562 (
double)dataFloat[
i+3],
1564 models.back().setImageSize(cv::Size(dataFloat[
i+4], dataFloat[
i+5]));
1565 UDEBUG(
"%f %f %f %f %f %f %s", dataFloat[
i], dataFloat[
i+1], dataFloat[
i+2],
1566 dataFloat[
i+3], dataFloat[
i+4], dataFloat[
i+5],
1571 (
unsigned int)dataSize % (4+localTransform.
size())*
sizeof(
float) == 0)
1573 int cameraCount = dataSize / ((4+localTransform.
size())*
sizeof(
float));
1574 UDEBUG(
"Loading calibration for %d cameras (%d bytes)", cameraCount, dataSize);
1575 int max = cameraCount*(4+localTransform.
size());
1576 for(
int i=0;
i<
max;
i+=4+localTransform.
size())
1580 memcpy(localTransform.
data(), dataFloat+
i+4, localTransform.
size()*
sizeof(
float));
1586 (
double)dataFloat[
i],
1587 (
double)dataFloat[
i+1],
1588 (
double)dataFloat[
i+2],
1589 (
double)dataFloat[
i+3],
1593 else if((
unsigned int)dataSize == (7+localTransform.
size())*
sizeof(
float))
1595 UDEBUG(
"Loading calibration of a stereo camera");
1596 memcpy(localTransform.
data(), dataFloat+7, localTransform.
size()*
sizeof(
float));
1608 cv::Size(dataFloat[5],dataFloat[6])));
1610 else if((
unsigned int)dataSize == (5+localTransform.
size())*
sizeof(
float))
1612 UDEBUG(
"Loading calibration of a stereo camera");
1613 memcpy(localTransform.
data(), dataFloat+5, localTransform.
size()*
sizeof(
float));
1628 UFATAL(
"Wrong format of the Data.calibration field (size=%d bytes)", dataSize);
1636 UDEBUG(
"Loading calibration version >= 0.7.0");
1641 if(fyOrBaseline < 1.0)
1653 UDEBUG(
"Loading calibration version < 0.7.0");
1655 float fx = 1.0f/depthConstant;
1656 float fy = 1.0f/depthConstant;
1663 int laserScanMaxPts = 0;
1664 float laserScanMinRange = 0.0f;
1665 float laserScanMaxRange = 0.0f;
1666 int laserScanFormat = 0;
1667 float laserScanAngleMin = 0.0f;
1668 float laserScanAngleMax = 0.0f;
1669 float laserScanAngleInc = 0.0f;
1679 if(dataSize > 0 &&
data)
1681 float * dataFloat = (
float*)
data;
1685 UASSERT(dataSize == (
int)((scanLocalTransform.
size()+7)*
sizeof(
float)));
1686 laserScanFormat = (
int)dataFloat[0];
1687 laserScanMinRange = dataFloat[1];
1688 laserScanMaxRange = dataFloat[2];
1689 laserScanAngleMin = dataFloat[3];
1690 laserScanAngleMax = dataFloat[4];
1691 laserScanAngleInc = dataFloat[5];
1692 laserScanMaxPts = (
int)dataFloat[6];
1693 memcpy(scanLocalTransform.
data(), dataFloat+7, scanLocalTransform.
size()*
sizeof(
float));
1697 if(
uStrNumCmp(
_version,
"0.16.1") >= 0 && dataSize == (
int)((scanLocalTransform.
size()+3)*
sizeof(
float)))
1700 laserScanFormat = (
int)dataFloat[2];
1701 memcpy(scanLocalTransform.
data(), dataFloat+3, scanLocalTransform.
size()*
sizeof(
float));
1703 else if(dataSize == (
int)((scanLocalTransform.
size()+2)*
sizeof(
float)))
1705 memcpy(scanLocalTransform.
data(), dataFloat+2, scanLocalTransform.
size()*
sizeof(
float));
1709 UFATAL(
"Unexpected size %d for laser scan info!", dataSize);
1716 laserScanMaxPts = (
int)dataFloat[0];
1717 laserScanMaxRange = dataFloat[1];
1737 if(dataSize>4 &&
data)
1739 scanCompressed = cv::Mat(1, dataSize, CV_8UC1, (
void *)
data).clone();
1750 if(dataSize>4 &&
data)
1754 userDataCompressed = cv::Mat(1, dataSize, CV_8UC1, (
void *)
data).clone();
1759 userDataCompressed =
compressData2(cv::Mat(1, dataSize, CV_8SC1, (
void *)
data));
1766 cv::Mat groundCellsCompressed;
1767 cv::Mat obstacleCellsCompressed;
1768 cv::Mat emptyCellsCompressed;
1769 float cellSize = 0.0f;
1770 cv::Point3f viewPoint;
1776 if(dataSize > 0 &&
data)
1778 groundCellsCompressed = cv::Mat(1, dataSize, CV_8UC1);
1779 memcpy((
void*)groundCellsCompressed.data,
data, dataSize);
1785 if(dataSize > 0 &&
data)
1787 obstacleCellsCompressed = cv::Mat(1, dataSize, CV_8UC1);
1788 memcpy((
void*)obstacleCellsCompressed.data,
data, dataSize);
1796 if(dataSize > 0 &&
data)
1798 emptyCellsCompressed = cv::Mat(1, dataSize, CV_8UC1);
1799 memcpy((
void*)emptyCellsCompressed.data,
data, dataSize);
1812 if(laserScanAngleMin < laserScanAngleMax && laserScanAngleInc != 0.0
f)
1814 laserScan =
LaserScan(scanCompressed, (
LaserScan::Format)laserScanFormat, laserScanMinRange, laserScanMaxRange, laserScanAngleMin, laserScanAngleMax, laserScanAngleInc, scanLocalTransform);
1818 laserScan =
LaserScan(scanCompressed, laserScanMaxPts, laserScanMaxRange, (
LaserScan::Format)laserScanFormat, scanLocalTransform);
1820 (*iter)->sensorData().setLaserScan(laserScan);
1826 (*iter)->sensorData().setRGBDImage(imageCompressed, depthOrRightCompressed, models);
1830 (*iter)->sensorData().setStereoImage(imageCompressed, depthOrRightCompressed, stereoModels);
1835 (*iter)->sensorData().setUserData(userDataCompressed);
1840 (*iter)->sensorData().setOccupancyGrid(groundCellsCompressed, obstacleCellsCompressed, emptyCellsCompressed, cellSize, viewPoint);
1861 std::vector<CameraModel> & models,
1862 std::vector<StereoCameraModel> & stereoModels)
const
1865 if(
_ppDb && signatureId)
1869 std::stringstream query;
1873 query <<
"SELECT calibration "
1875 <<
"WHERE id = " << signatureId
1880 query <<
"SELECT local_transform, fx, fy, cx, cy "
1882 <<
"WHERE id = " << signatureId
1887 query <<
"SELECT local_transform, constant "
1889 <<
"WHERE id = " << signatureId
1896 const void *
data = 0;
1912 if((
unsigned int)dataSize == localTransform.
size()*
sizeof(
float) &&
data)
1914 memcpy(localTransform.
data(),
data, dataSize);
1925 if(dataSize > 0 &&
data)
1929 if(dataSize >=
int(
sizeof(
int)*4))
1931 const int * dataInt = (
const int *)
data;
1932 int type = dataInt[3];
1936 int bytesReadTotal = 0;
1937 unsigned int bytesRead = 0;
1938 while(bytesReadTotal < dataSize &&
1939 (bytesRead=
model.deserialize((
const unsigned char *)
data+bytesReadTotal, dataSize-bytesReadTotal))!=0)
1941 bytesReadTotal+=bytesRead;
1942 models.push_back(
model);
1944 UASSERT(bytesReadTotal == dataSize);
1949 int bytesReadTotal = 0;
1950 unsigned int bytesRead = 0;
1951 while(bytesReadTotal < dataSize &&
1952 (bytesRead=
model.deserialize((
const unsigned char *)
data+bytesReadTotal, dataSize-bytesReadTotal))!=0)
1954 bytesReadTotal+=bytesRead;
1955 stereoModels.push_back(
model);
1957 UASSERT(bytesReadTotal == dataSize);
1966 UFATAL(
"Wrong format of the Data.calibration field (size=%d bytes)", dataSize);
1971 float * dataFloat = (
float*)
data;
1973 (
unsigned int)dataSize % (6+localTransform.
size())*
sizeof(
float) == 0)
1975 int cameraCount = dataSize / ((6+localTransform.
size())*
sizeof(
float));
1976 UDEBUG(
"Loading calibration for %d cameras (%d bytes)", cameraCount, dataSize);
1977 int max = cameraCount*(6+localTransform.
size());
1978 for(
int i=0;
i<
max;
i+=6+localTransform.
size())
1982 memcpy(localTransform.
data(), dataFloat+
i+6, localTransform.
size()*
sizeof(
float));
1988 (
double)dataFloat[
i],
1989 (
double)dataFloat[
i+1],
1990 (
double)dataFloat[
i+2],
1991 (
double)dataFloat[
i+3],
1993 models.back().setImageSize(cv::Size(dataFloat[
i+4], dataFloat[
i+5]));
1994 UDEBUG(
"%f %f %f %f %f %f %s", dataFloat[
i], dataFloat[
i+1], dataFloat[
i+2],
1995 dataFloat[
i+3], dataFloat[
i+4], dataFloat[
i+5],
2000 (
unsigned int)dataSize % (4+localTransform.
size())*
sizeof(
float) == 0)
2002 int cameraCount = dataSize / ((4+localTransform.
size())*
sizeof(
float));
2003 UDEBUG(
"Loading calibration for %d cameras (%d bytes)", cameraCount, dataSize);
2004 int max = cameraCount*(4+localTransform.
size());
2005 for(
int i=0;
i<
max;
i+=4+localTransform.
size())
2009 memcpy(localTransform.
data(), dataFloat+
i+4, localTransform.
size()*
sizeof(
float));
2015 (
double)dataFloat[
i],
2016 (
double)dataFloat[
i+1],
2017 (
double)dataFloat[
i+2],
2018 (
double)dataFloat[
i+3],
2022 else if((
unsigned int)dataSize == (7+localTransform.
size())*
sizeof(
float))
2024 UDEBUG(
"Loading calibration of a stereo camera");
2025 memcpy(localTransform.
data(), dataFloat+7, localTransform.
size()*
sizeof(
float));
2037 cv::Size(dataFloat[5],dataFloat[6])));
2039 else if((
unsigned int)dataSize == (5+localTransform.
size())*
sizeof(
float))
2041 UDEBUG(
"Loading calibration of a stereo camera");
2042 memcpy(localTransform.
data(), dataFloat+5, localTransform.
size()*
sizeof(
float));
2057 UFATAL(
"Wrong format of the Data.calibration field (size=%d bytes)", dataSize);
2065 UDEBUG(
"Loading calibration version >= 0.7.0");
2070 UDEBUG(
"fx=%f fyOrBaseline=%f cx=%f cy=%f",
fx, fyOrBaseline,
cx,
cy);
2071 if(fyOrBaseline < 1.0)
2083 UDEBUG(
"Loading calibration version < 0.7.0");
2085 float fx = 1.0f/depthConstant;
2086 float fy = 1.0f/depthConstant;
2108 if(
_ppDb && signatureId)
2112 std::stringstream query;
2116 query <<
"SELECT scan_info "
2118 <<
"WHERE id = " << signatureId
2129 const void *
data = 0;
2134 float minRange = 0.0f;
2135 float maxRange = 0.0f;
2136 float angleMin = 0.0f;
2137 float angleMax = 0.0f;
2138 float angleInc = 0.0f;
2151 if(dataSize > 0 &&
data)
2153 float * dataFloat = (
float*)
data;
2156 UASSERT(dataSize == (
int)((localTransform.
size()+7)*
sizeof(
float)));
2158 minRange = dataFloat[1];
2159 maxRange = dataFloat[2];
2160 angleMin = dataFloat[3];
2161 angleMax = dataFloat[4];
2162 angleInc = dataFloat[5];
2163 maxPts = (
int)dataFloat[6];
2164 memcpy(localTransform.
data(), dataFloat+7, localTransform.
size()*
sizeof(
float));
2172 memcpy(localTransform.
data(), dataFloat+3, localTransform.
size()*
sizeof(
float));
2174 else if(dataSize == (
int)((localTransform.
size()+2)*
sizeof(
float)))
2176 memcpy(localTransform.
data(), dataFloat+2, localTransform.
size()*
sizeof(
float));
2180 UFATAL(
"Unexpected size %d for laser scan info!", dataSize);
2186 maxPts = (
int)dataFloat[0];
2187 maxRange = dataFloat[1];
2190 if(angleInc != 0.0
f && angleMin < angleMax)
2215 std::string & label,
2218 std::vector<float> & velocity,
2223 if(
_ppDb && signatureId)
2227 std::stringstream query;
2231 query <<
"SELECT pose, map_id, weight, label, stamp, ground_truth_pose, velocity, gps, env_sensors "
2233 "WHERE id = " << signatureId <<
2238 query <<
"SELECT pose, map_id, weight, label, stamp, ground_truth_pose, velocity, gps "
2240 "WHERE id = " << signatureId <<
2245 query <<
"SELECT pose, map_id, weight, label, stamp, ground_truth_pose, velocity "
2247 "WHERE id = " << signatureId <<
2252 query <<
"SELECT pose, map_id, weight, label, stamp, ground_truth_pose "
2254 "WHERE id = " << signatureId <<
2259 query <<
"SELECT pose, map_id, weight, label, stamp "
2261 "WHERE id = " << signatureId <<
2266 query <<
"SELECT pose, map_id, weight "
2268 "WHERE id = " << signatureId <<
2275 const void *
data = 0;
2286 if((
unsigned int)dataSize == pose.
size()*
sizeof(
float) &&
data)
2288 memcpy(pose.
data(),
data, dataSize);
2303 label =
reinterpret_cast<const char*
>(
p);
2311 if((
unsigned int)dataSize == groundTruthPose.
size()*
sizeof(
float) &&
data)
2313 memcpy(groundTruthPose.
data(),
data, dataSize);
2325 if((
unsigned int)dataSize ==
velocity.size()*
sizeof(
float) &&
data)
2335 if((
unsigned int)dataSize == 6*
sizeof(
double) &&
data)
2337 const double * dataDouble = (
const double *)
data;
2338 gps =
GPS(dataDouble[0], dataDouble[1], dataDouble[2], dataDouble[3], dataDouble[4], dataDouble[5]);
2347 UASSERT(dataSize%
sizeof(
double)==0 && (dataSize/
sizeof(
double))%3 == 0);
2348 const double * dataDouble = (
const double *)
data;
2349 int sensorsNum = (dataSize/
sizeof(double))/3;
2350 for(
int i=0;
i<sensorsNum;++
i)
2353 sensors.insert(std::make_pair(
type,
EnvSensor(
type, dataDouble[
i*3+1], dataDouble[
i*3+2])));
2384 query =
"SELECT n.id "
2386 "WHERE n.time_enter >= (SELECT MAX(time_enter) FROM Info) "
2391 query =
"SELECT n.id "
2393 "WHERE n.time_enter >= (SELECT MAX(time_enter) FROM Statistics) "
2424 std::stringstream query;
2426 query <<
"SELECT DISTINCT id "
2434 query <<
"(EXISTS (select 1 from Link where Node.id=to_id and from_id != to_id) OR ";
2435 query <<
" NOT EXISTS (select 1 from Link where id=to_id and from_id != to_id)) ";
2437 query <<
"AND weight>-9 ";
2438 if(ignoreIntermediateNodes)
2440 query <<
"AND weight!=-1 ";
2443 else if(ignoreIntermediateNodes)
2445 query <<
"WHERE weight!=-1 ";
2448 if(ignoreBadSignatures)
2450 if(ignoreChildren || ignoreIntermediateNodes)
2460 query <<
" id in (select node_id from Feature) ";
2464 query <<
" id in (select node_id from Map_Node_Word) ";
2468 query <<
"ORDER BY id";
2498 std::stringstream query;
2500 query <<
"SELECT DISTINCT id, pose "
2504 query <<
"INNER JOIN Link ";
2505 query <<
"ON id = to_id ";
2506 query <<
"WHERE from_id != to_id ";
2507 query <<
"AND weight>-9 ";
2508 if(ignoreIntermediateNodes)
2510 query <<
"AND weight!=-1 ";
2513 else if(ignoreIntermediateNodes)
2515 query <<
"WHERE weight!=-1 ";
2518 query <<
"ORDER BY id";
2523 const void *
data = 0;
2535 if((
unsigned int)dataSize == pose.
size()*
sizeof(
float) &&
data)
2537 memcpy(pose.
data(),
data, dataSize);
2545 UERROR(
"Error while loading pose for node %d! Setting to null...",
id);
2547 poses.insert(std::make_pair(
id, pose));
2568 std::stringstream query;
2572 query <<
"SELECT from_id, to_id, type, transform, information_matrix, user_data FROM Link WHERE type!=" <<
Link::kLandmark <<
" ORDER BY from_id, to_id";
2576 query <<
"SELECT from_id, to_id, type, transform, information_matrix, user_data FROM Link ORDER BY from_id, to_id";
2580 query <<
"SELECT from_id, to_id, type, transform, rot_variance, trans_variance, user_data FROM Link ORDER BY from_id, to_id";
2584 query <<
"SELECT from_id, to_id, type, transform, rot_variance, trans_variance FROM Link ORDER BY from_id, to_id";
2588 query <<
"SELECT from_id, to_id, type, transform, variance FROM Link ORDER BY from_id, to_id";
2592 query <<
"SELECT from_id, to_id, type, transform FROM Link ORDER BY from_id, to_id";
2601 const void *
data = 0;
2618 if((
unsigned int)dataSize ==
transform.size()*
sizeof(
float) &&
data)
2628 UERROR(
"Error while loading link transform from %d to %d! Setting to null...", fromId, toId);
2631 if(!ignoreNullLinks || !
transform.isNull())
2633 cv::Mat informationMatrix = cv::Mat::eye(6,6,CV_64FC1);
2641 informationMatrix = cv::Mat(6, 6, CV_64FC1, (
void *)
data).clone();
2647 UASSERT(rotVariance > 0.0 && transVariance>0.0);
2648 informationMatrix.at<
double>(0,0) = 1.0/transVariance;
2649 informationMatrix.at<
double>(1,1) = 1.0/transVariance;
2650 informationMatrix.at<
double>(2,2) = 1.0/transVariance;
2651 informationMatrix.at<
double>(3,3) = 1.0/rotVariance;
2652 informationMatrix.at<
double>(4,4) = 1.0/rotVariance;
2653 informationMatrix.at<
double>(5,5) = 1.0/rotVariance;
2656 cv::Mat userDataCompressed;
2662 if(dataSize>4 &&
data)
2664 userDataCompressed = cv::Mat(1, dataSize, CV_8UC1, (
void *)
data).clone();
2668 links.insert(links.end(), std::make_pair(fromId,
Link(fromId, toId, (
Link::Type)
type,
transform, informationMatrix, userDataCompressed)));
2674 informationMatrix *= 1.0/variance;
2699 UDEBUG(
"get last %s from table \"%s\"", fieldName.c_str(), tableName.c_str());
2704 std::stringstream query;
2706 query <<
"SELECT COALESCE(MAX(" << fieldName <<
"), " <<
id <<
") "
2707 <<
"FROM " << tableName
2724 UDEBUG(
"No result from the DB for table %s with field %s", tableName.c_str(), fieldName.c_str());
2743 std::stringstream query;
2747 query <<
"SELECT count(word_id) "
2749 <<
"WHERE node_id=" << nodeId <<
";";
2753 query <<
"SELECT count(word_id) "
2754 <<
"FROM Map_Node_Word "
2755 <<
"WHERE node_id=" << nodeId <<
";";
2791 std::stringstream query;
2793 query <<
"SELECT from_id, type, information_matrix, transform, user_data FROM Link WHERE to_id=" << landmarkId <<
"";
2801 std::list<Link> links;
2802 const void *
data = 0;
2813 cv::Mat userDataCompressed;
2814 cv::Mat informationMatrix = cv::Mat::eye(6,6,CV_64FC1);
2819 informationMatrix = cv::Mat(6, 6, CV_64FC1, (
void *)
data).clone();
2824 if(dataSize>4 &&
data)
2826 userDataCompressed = cv::Mat(1, dataSize, CV_8UC1, (
void *)
data).clone();
2833 if((
unsigned int)dataSize ==
transform.size()*
sizeof(
float) &&
data)
2839 UERROR(
"Error while loading link transform from %d to %d! Setting to null...", fromId, landmarkId);
2844 nodes.insert(std::make_pair(fromId,
Link(fromId, landmarkId, (
Link::Type)linkType,
transform, informationMatrix, userDataCompressed)));
2848 UFATAL(
"Not supported link type %d ! (fromId=%d, toId=%d)",
2849 linkType, fromId, landmarkId);
2871 std::stringstream query;
2872 query <<
"SELECT id FROM Node WHERE label='" << label <<
"'";
2901 std::stringstream query;
2902 query <<
"SELECT id,label FROM Node WHERE label IS NOT NULL";
2916 std::string label =
reinterpret_cast<const char*
>(
p);
2919 labels.insert(std::make_pair(
id, label));
2942 std::stringstream query;
2944 query <<
"SELECT weight FROM node WHERE id = "
2971 if(
_ppDb && ids.size())
2978 std::stringstream query;
2979 unsigned int loaded = 0;
2984 query <<
"SELECT id, map_id, weight, pose, stamp, label, ground_truth_pose, velocity, gps, env_sensors "
2990 query <<
"SELECT id, map_id, weight, pose, stamp, label, ground_truth_pose, velocity, gps "
2996 query <<
"SELECT id, map_id, weight, pose, stamp, label, ground_truth_pose, velocity "
3002 query <<
"SELECT id, map_id, weight, pose, stamp, label, ground_truth_pose "
3008 query <<
"SELECT id, map_id, weight, pose, stamp, label "
3014 query <<
"SELECT id, map_id, weight, pose "
3022 for(std::list<int>::const_iterator
iter=ids.begin();
iter!=ids.end(); ++
iter)
3036 std::vector<double> gps;
3038 const void *
data = 0;
3053 if((
unsigned int)dataSize == pose.
size()*
sizeof(
float) &&
data)
3055 memcpy(pose.
data(),
data, dataSize);
3068 label =
reinterpret_cast<const char*
>(
p);
3075 if((
unsigned int)dataSize == groundTruthPose.
size()*
sizeof(
float) &&
data)
3077 memcpy(groundTruthPose.
data(),
data, dataSize);
3089 if((
unsigned int)dataSize ==
velocity.size()*
sizeof(
float) &&
data)
3100 if((
unsigned int)dataSize == gps.size()*
sizeof(
double) &&
data)
3102 memcpy(gps.data(),
data, dataSize);
3111 UASSERT(dataSize%
sizeof(
double)==0 && (dataSize/
sizeof(
double))%3 == 0);
3112 const double * dataDouble = (
const double *)
data;
3113 int sensorsNum = (dataSize/
sizeof(double))/3;
3114 for(
int i=0;
i<sensorsNum;++
i)
3117 sensors.insert(std::make_pair(
type,
EnvSensor(
type, dataDouble[
i*3+1], dataDouble[
i*3+2])));
3147 s->sensorData().setGPS(
GPS(gps[0], gps[1], gps[2], gps[3], gps[4], gps[5]));
3149 s->sensorData().setEnvSensors(sensors);
3156 UERROR(
"Signature %d not found in database!", *
iter);
3171 std::stringstream query2;
3174 query2 <<
"SELECT word_id, pos_x, pos_y, size, dir, response, octave, depth_x, depth_y, depth_z, descriptor_size, descriptor "
3176 "WHERE node_id = ? ";
3180 query2 <<
"SELECT word_id, pos_x, pos_y, size, dir, response, octave, depth_x, depth_y, depth_z, descriptor_size, descriptor "
3181 "FROM Map_Node_Word "
3182 "WHERE node_id = ? ";
3186 query2 <<
"SELECT word_id, pos_x, pos_y, size, dir, response, depth_x, depth_y, depth_z, descriptor_size, descriptor "
3187 "FROM Map_Node_Word "
3188 "WHERE node_id = ? ";
3192 query2 <<
"SELECT word_id, pos_x, pos_y, size, dir, response, depth_x, depth_y, depth_z "
3193 "FROM Map_Node_Word "
3194 "WHERE node_id = ? ";
3197 query2 <<
" ORDER BY word_id";
3203 float nanFloat = std::numeric_limits<float>::quiet_NaN ();
3212 int visualWordId = 0;
3213 int descriptorSize = 0;
3217 std::multimap<int, int> visualWords;
3218 std::vector<cv::KeyPoint> visualWordsKpts;
3219 std::vector<cv::Point3f> visualWords3;
3220 cv::Mat descriptors;
3221 bool allWords3NaN =
true;
3222 cv::Point3f depth(0,0,0);
3270 visualWordsKpts.push_back(kpt);
3271 visualWords.insert(visualWords.end(), std::make_pair(visualWordId, visualWordsKpts.size()-1));
3272 visualWords3.push_back(depth);
3276 allWords3NaN =
false;
3285 if(
descriptor && descriptorSize>0 && dRealSize>0)
3288 if(dRealSize == descriptorSize)
3291 d = cv::Mat(1, descriptorSize, CV_8U);
3293 else if(dRealSize/
int(
sizeof(
float)) == descriptorSize)
3296 d = cv::Mat(1, descriptorSize, CV_32F);
3300 UFATAL(
"Saved buffer size (%d bytes) is not the same as descriptor size (%d)", dRealSize, descriptorSize);
3305 descriptors.push_back(
d);
3313 if(visualWords.size()==0)
3315 UDEBUG(
"Empty signature detected! (id=%d)", (*iter)->id());
3321 visualWords3.clear();
3323 (*iter)->setWords(visualWords, visualWordsKpts, visualWords3, descriptors);
3324 ULOGGER_DEBUG(
"Add %d keypoints, %d 3d points and %d descriptors to node %d", (
int)visualWords.size(), allWords3NaN?0:(
int)visualWords3.size(), (
int)descriptors.rows, (*iter)->id());
3343 (*iter)->setModified(
false);
3349 std::stringstream query3;
3350 query3 <<
"SELECT calibration "
3367 const void *
data = 0;
3370 std::vector<CameraModel> models;
3371 std::vector<StereoCameraModel> stereoModels;
3378 if(dataSize > 0 &&
data)
3382 if(dataSize >=
int(
sizeof(
int)*4))
3384 const int * dataInt = (
const int *)
data;
3385 int type = dataInt[3];
3389 int bytesReadTotal = 0;
3390 unsigned int bytesRead = 0;
3391 while(bytesReadTotal < dataSize &&
3392 (bytesRead=
model.deserialize((
const unsigned char *)
data+bytesReadTotal, dataSize-bytesReadTotal))!=0)
3394 bytesReadTotal+=bytesRead;
3395 models.push_back(
model);
3397 UASSERT(bytesReadTotal == dataSize);
3402 int bytesReadTotal = 0;
3403 unsigned int bytesRead = 0;
3404 while(bytesReadTotal < dataSize &&
3405 (bytesRead=
model.deserialize((
const unsigned char *)
data+bytesReadTotal, dataSize-bytesReadTotal))!=0)
3407 bytesReadTotal+=bytesRead;
3408 stereoModels.push_back(
model);
3410 UASSERT(bytesReadTotal == dataSize);
3419 UFATAL(
"Wrong format of the Data.calibration field (size=%d bytes)", dataSize);
3424 float * dataFloat = (
float*)
data;
3426 (
unsigned int)dataSize % (6+localTransform.
size())*
sizeof(
float) == 0)
3428 int cameraCount = dataSize / ((6+localTransform.
size())*
sizeof(
float));
3429 UDEBUG(
"Loading calibration for %d cameras (%d bytes)", cameraCount, dataSize);
3430 int max = cameraCount*(6+localTransform.
size());
3431 for(
int i=0;
i<
max;
i+=6+localTransform.
size())
3435 memcpy(localTransform.
data(), dataFloat+
i+6, localTransform.
size()*
sizeof(
float));
3441 (
double)dataFloat[
i],
3442 (
double)dataFloat[
i+1],
3443 (
double)dataFloat[
i+2],
3444 (
double)dataFloat[
i+3],
3447 cv::Size(dataFloat[
i+4], dataFloat[
i+5])));
3448 UDEBUG(
"%f %f %f %f %f %f %s", dataFloat[
i], dataFloat[
i+1], dataFloat[
i+2],
3449 dataFloat[
i+3], dataFloat[
i+4], dataFloat[
i+5],
3454 (
unsigned int)dataSize % (4+localTransform.
size())*
sizeof(
float) == 0)
3456 int cameraCount = dataSize / ((4+localTransform.
size())*
sizeof(
float));
3457 UDEBUG(
"Loading calibration for %d cameras (%d bytes)", cameraCount, dataSize);
3458 int max = cameraCount*(4+localTransform.
size());
3459 for(
int i=0;
i<
max;
i+=4+localTransform.
size())
3463 memcpy(localTransform.
data(), dataFloat+
i+4, localTransform.
size()*
sizeof(
float));
3469 (
double)dataFloat[
i],
3470 (
double)dataFloat[
i+1],
3471 (
double)dataFloat[
i+2],
3472 (
double)dataFloat[
i+3],
3476 else if((
unsigned int)dataSize == (7+localTransform.
size())*
sizeof(
float))
3478 UDEBUG(
"Loading calibration of a stereo camera");
3479 memcpy(localTransform.
data(), dataFloat+7, localTransform.
size()*
sizeof(
float));
3491 cv::Size(dataFloat[5], dataFloat[6])));
3493 else if((
unsigned int)dataSize == (5+localTransform.
size())*
sizeof(
float))
3495 UDEBUG(
"Loading calibration of a stereo camera");
3496 memcpy(localTransform.
data(), dataFloat+5, localTransform.
size()*
sizeof(
float));
3511 UFATAL(
"Wrong format of the Data.calibration field (size=%d bytes, db version=%s)", dataSize,
_version.c_str());
3515 (*iter)->sensorData().setCameraModels(models);
3516 (*iter)->sensorData().setStereoCameraModels(stereoModels);
3536 std::stringstream query3;
3537 query3 <<
"SELECT type, info, data "
3538 "FROM GlobalDescriptor "
3539 "WHERE node_id = ? ";
3550 std::vector<GlobalDescriptor> globalDescriptors;
3556 const void *
data = 0;
3565 if(dataSize &&
data)
3571 if(dataSize &&
data)
3583 if(!globalDescriptors.empty())
3585 (*iter)->sensorData().setGlobalDescriptors(globalDescriptors);
3586 ULOGGER_DEBUG(
"Add %d global descriptors to node %d", (
int)globalDescriptors.size(), (*iter)->id());
3600 if(ids.size() != loaded)
3602 UERROR(
"Some signatures not found in database");
3622 query =
"SELECT n.id "
3624 "WHERE n.time_enter >= (SELECT MAX(time_enter) FROM Info) "
3629 query =
"SELECT n.id "
3631 "WHERE n.time_enter >= (SELECT MAX(time_enter) FROM Statistics) "
3661 if(
_ppDb && dictionary)
3668 std::stringstream query;
3669 std::list<VisualWord *> visualWords;
3672 query <<
"SELECT id, descriptor_size, descriptor FROM Word ";
3677 query <<
"WHERE time_enter >= (SELECT MAX(time_enter) FROM Info) ";
3681 query <<
"WHERE time_enter >= (SELECT MAX(time_enter) FROM Statistics) ";
3684 query <<
"ORDER BY id;";
3691 int descriptorSize = 0;
3706 if(dRealSize == descriptorSize)
3709 d = cv::Mat(1, descriptorSize, CV_8U);
3711 else if(dRealSize/
int(
sizeof(
float)) == descriptorSize)
3714 d = cv::Mat(1, descriptorSize, CV_32F);
3718 UFATAL(
"Saved buffer size (%d bytes) is not the same as descriptor size (%d)", dRealSize, descriptorSize);
3726 if(++
count % 5000 == 0)
3749 if(
_ppDb && wordIds.size())
3756 std::stringstream query;
3757 std::set<int> loaded;
3760 query <<
"SELECT vw.descriptor_size, vw.descriptor "
3770 unsigned long dRealSizeTotal = 0;
3771 for(std::set<int>::const_iterator
iter=wordIds.begin();
iter!=wordIds.end(); ++
iter)
3787 if(dRealSize == descriptorSize)
3790 d = cv::Mat(1, descriptorSize, CV_8U);
3792 else if(dRealSize/
int(
sizeof(
float)) == descriptorSize)
3795 d = cv::Mat(1, descriptorSize, CV_32F);
3799 UFATAL(
"Saved buffer size (%d bytes) is not the same as descriptor size (%d)", dRealSize, descriptorSize);
3803 dRealSizeTotal+=dRealSize;
3810 loaded.insert(loaded.end(), *
iter);
3825 UDEBUG(
"Time=%fs (%d words, %lu MB)",
timer.ticks(), (
int)vws.size(), dRealSizeTotal/1000000);
3827 if(wordIds.size() != loaded.size())
3829 for(std::set<int>::const_iterator
iter = wordIds.begin();
iter!=wordIds.end(); ++
iter)
3831 if(loaded.find(*
iter) == loaded.end())
3836 UERROR(
"Query (%d) doesn't match loaded words (%d)", wordIds.size(), loaded.size());
3843 std::multimap<int, Link> & links,
3853 std::stringstream query;
3857 query <<
"SELECT to_id, type, transform, information_matrix, user_data FROM Link ";
3861 query <<
"SELECT to_id, type, transform, rot_variance, trans_variance, user_data FROM Link ";
3865 query <<
"SELECT to_id, type, transform, rot_variance, trans_variance FROM Link ";
3869 query <<
"SELECT to_id, type, transform, variance FROM Link ";
3873 query <<
"SELECT to_id, type, transform FROM Link ";
3875 query <<
"WHERE from_id = " << signatureId;
3880 query <<
" AND type = " << typeIn;
3884 query <<
" AND type = 0";
3888 query <<
" AND type > 0";
3896 query <<
" ORDER BY to_id";
3903 const void *
data = 0;
3919 if((
unsigned int)dataSize ==
transform.size()*
sizeof(
float) &&
data)
3929 UERROR(
"Error while loading link transform from %d to %d! Setting to null...", signatureId, toId);
3932 cv::Mat informationMatrix = cv::Mat::eye(6,6,CV_64FC1);
3940 informationMatrix = cv::Mat(6, 6, CV_64FC1, (
void *)
data).clone();
3946 UASSERT(rotVariance > 0.0 && transVariance>0.0);
3947 informationMatrix.at<
double>(0,0) = 1.0/transVariance;
3948 informationMatrix.at<
double>(1,1) = 1.0/transVariance;
3949 informationMatrix.at<
double>(2,2) = 1.0/transVariance;
3950 informationMatrix.at<
double>(3,3) = 1.0/rotVariance;
3951 informationMatrix.at<
double>(4,4) = 1.0/rotVariance;
3952 informationMatrix.at<
double>(5,5) = 1.0/rotVariance;
3955 cv::Mat userDataCompressed;
3961 if(dataSize>4 &&
data)
3963 userDataCompressed = cv::Mat(1, dataSize, CV_8UC1, (
void *)
data).clone();
3967 links.insert(links.end(), std::make_pair(toId,
Link(signatureId, toId, (
Link::Type)
type,
transform, informationMatrix, userDataCompressed)));
3973 informationMatrix *= 1.0/variance;
3991 if(links.size() == 0)
4006 std::stringstream query;
4010 query <<
"SELECT to_id, type, information_matrix, user_data, transform FROM Link "
4011 <<
"WHERE from_id = ? "
4012 <<
"ORDER BY to_id";
4016 query <<
"SELECT to_id, type, rot_variance, trans_variance, user_data, transform FROM Link "
4017 <<
"WHERE from_id = ? "
4018 <<
"ORDER BY to_id";
4022 query <<
"SELECT to_id, type, rot_variance, trans_variance, transform FROM Link "
4023 <<
"WHERE from_id = ? "
4024 <<
"ORDER BY to_id";
4028 query <<
"SELECT to_id, type, variance, transform FROM Link "
4029 <<
"WHERE from_id = ? "
4030 <<
"ORDER BY to_id";
4034 query <<
"SELECT to_id, type, transform FROM Link "
4035 <<
"WHERE from_id = ? "
4036 <<
"ORDER BY to_id";
4042 for(std::list<Signature*>::iterator
iter=signatures.begin();
iter!=signatures.end(); ++
iter)
4050 std::list<Link> links;
4051 const void *
data = 0;
4062 cv::Mat userDataCompressed;
4063 cv::Mat informationMatrix = cv::Mat::eye(6,6,CV_64FC1);
4071 informationMatrix = cv::Mat(6, 6, CV_64FC1, (
void *)
data).clone();
4077 UASSERT(rotVariance > 0.0 && transVariance>0.0);
4078 informationMatrix.at<
double>(0,0) = 1.0/transVariance;
4079 informationMatrix.at<
double>(1,1) = 1.0/transVariance;
4080 informationMatrix.at<
double>(2,2) = 1.0/transVariance;
4081 informationMatrix.at<
double>(3,3) = 1.0/rotVariance;
4082 informationMatrix.at<
double>(4,4) = 1.0/rotVariance;
4083 informationMatrix.at<
double>(5,5) = 1.0/rotVariance;
4091 if(dataSize>4 &&
data)
4093 userDataCompressed = cv::Mat(1, dataSize, CV_8UC1, (
void *)
data).clone();
4101 informationMatrix *= 1.0/variance;
4108 if((
unsigned int)dataSize ==
transform.size()*
sizeof(
float) &&
data)
4118 UERROR(
"Error while loading link transform from %d to %d! Setting to null...", (*iter)->id(), toId);
4125 (*iter)->addLandmark(
Link((*iter)->id(), toId, (
Link::Type)linkType,
transform, informationMatrix, userDataCompressed));
4131 links.push_back(
Link((*iter)->id(), toId, (
Link::Type)linkType,
transform, informationMatrix, userDataCompressed));
4141 UFATAL(
"Not supported link type %d ! (fromId=%d, toId=%d)",
4142 linkType, (*iter)->id(), toId);
4150 (*iter)->addLinks(links);
4155 UDEBUG(
"time=%fs, node=%d, links.size=%d",
timer.ticks(), (*iter)->id(), links.size());
4180 query =
"UPDATE Node SET weight=?, label=?, time_enter = DATETIME('NOW') WHERE id=?;";
4184 query =
"UPDATE Node SET weight=?, label=? WHERE id=?;";
4191 query =
"UPDATE Node SET weight=?, time_enter = DATETIME('NOW') WHERE id=?;";
4195 query =
"UPDATE Node SET weight=? WHERE id=?;";
4201 for(std::list<Signature *>::const_iterator
i=
nodes.begin();
i!=
nodes.end(); ++
i)
4212 if(
s->getLabel().empty())
4248 query =
uFormat(
"DELETE FROM Link WHERE from_id=?;");
4252 for(std::list<Signature *>::const_iterator
j=
nodes.begin();
j!=
nodes.end(); ++
j)
4254 if((*j)->isLinksModified())
4274 for(std::list<Signature *>::const_iterator
j=
nodes.begin();
j!=
nodes.end(); ++
j)
4276 if((*j)->isLinksModified())
4279 const std::multimap<int, Link> & links = (*j)->getLinks();
4280 for(std::multimap<int, Link>::const_iterator
i=links.begin();
i!=links.end(); ++
i)
4295 for(std::list<Signature *>::const_iterator
j=
nodes.begin();
j!=
nodes.end(); ++
j)
4297 if((*j)->getWordsChanged().size())
4299 const std::map<int, int> & wordsChanged = (*j)->getWordsChanged();
4300 for(std::map<int, int>::const_iterator
iter=wordsChanged.begin();
iter!=wordsChanged.end(); ++
iter)
4316 if(
_ppDb && words.size() && updateTimestamp)
4325 std::string query =
"UPDATE Word SET time_enter = DATETIME('NOW') WHERE id=?;";
4329 for(std::list<VisualWord *>::const_iterator
i=words.begin();
i!=words.end(); ++
i)
4357 if(
_ppDb && signatures.size())
4370 for(std::list<Signature *>::const_iterator
i=signatures.begin();
i!=signatures.end(); ++
i)
4374 _memoryUsedEstimate -= (*i)->sensorData().imageRaw().empty()?0:(*i)->sensorData().imageRaw().total() * (*i)->sensorData().imageRaw().elemSize();
4375 _memoryUsedEstimate -= (*i)->sensorData().depthOrRightRaw().empty()?0:(*i)->sensorData().depthOrRightRaw().total() * (*i)->sensorData().depthOrRightRaw().elemSize();
4376 _memoryUsedEstimate -= (*i)->sensorData().laserScanRaw().empty()?0:(*i)->sensorData().laserScanRaw().data().total() * (*i)->sensorData().laserScanRaw().data().elemSize();
4390 for(std::list<Signature *>::const_iterator jter=signatures.begin(); jter!=signatures.end(); ++jter)
4393 const std::multimap<int, Link> & links = (*jter)->getLinks();
4394 for(std::multimap<int, Link>::const_iterator
i=links.begin();
i!=links.end(); ++
i)
4401 const std::map<int, Link> & links = (*jter)->getLandmarks();
4402 for(std::map<int, Link>::const_iterator
i=links.begin();
i!=links.end(); ++
i)
4419 float nanFloat = std::numeric_limits<float>::quiet_NaN ();
4420 for(std::list<Signature *>::const_iterator
i=signatures.begin();
i!=signatures.end(); ++
i)
4422 UASSERT((*i)->getWords().size() == (*i)->getWordsKpts().size());
4423 UASSERT((*i)->getWords3().empty() || (*i)->getWords().size() == (*i)->getWords3().size());
4424 UASSERT((*i)->getWordsDescriptors().empty() || (
int)(*i)->getWords().size() == (*i)->getWordsDescriptors().rows);
4426 for(std::multimap<int, int>::const_iterator
w=(*i)->getWords().begin();
w!=(*i)->getWords().end(); ++
w)
4428 cv::Point3f pt(nanFloat,nanFloat,nanFloat);
4429 if(!(*i)->getWords3().empty())
4431 pt = (*i)->getWords3()[
w->second];
4435 if(!(*i)->getWordsDescriptors().empty())
4437 descriptor = (*i)->getWordsDescriptors().row(
w->second);
4455 for(std::list<Signature *>::const_iterator
i=signatures.begin();
i!=signatures.end(); ++
i)
4457 for(
size_t d=0;
d<(*i)->sensorData().globalDescriptors().
size(); ++
d)
4475 UDEBUG(
"Saving %d images", signatures.size());
4477 for(std::list<Signature *>::const_iterator
i=signatures.begin();
i!=signatures.end(); ++
i)
4479 if(!(*i)->sensorData().imageCompressed().empty() ||
4480 !(*i)->sensorData().depthOrRightCompressed().empty() ||
4481 !(*i)->sensorData().laserScanCompressed().isEmpty() ||
4482 !(*i)->sensorData().userDataCompressed().empty() ||
4483 !(*i)->sensorData().cameraModels().empty() ||
4484 !(*i)->sensorData().stereoCameraModels().empty())
4486 UASSERT((*i)->id() == (*i)->sensorData().id());
4502 UDEBUG(
"Saving %d images", signatures.size());
4504 for(std::list<Signature *>::const_iterator
i=signatures.begin();
i!=signatures.end(); ++
i)
4506 if(!(*i)->sensorData().imageCompressed().empty())
4508 stepImage(ppStmt, (*i)->id(), (*i)->sensorData().imageCompressed());
4521 for(std::list<Signature *>::const_iterator
i=signatures.begin();
i!=signatures.end(); ++
i)
4524 if(!(*i)->sensorData().depthOrRightCompressed().empty() || !(*i)->sensorData().laserScanCompressed().isEmpty())
4526 UASSERT((*i)->id() == (*i)->sensorData().id());
4541 UDEBUG(
"visualWords size=%d", words.size());
4554 query = std::string(
"INSERT INTO Word(id, descriptor_size, descriptor) VALUES(?,?,?);");
4557 for(std::list<VisualWord *>::const_iterator
iter=words.begin();
iter!=words.end(); ++
iter)
4567 UASSERT(
w->getDescriptor().type() == CV_32F ||
w->getDescriptor().type() == CV_8U);
4568 if(
w->getDescriptor().type() == CV_32F)
4654 const cv::Mat & ground,
4655 const cv::Mat & obstacles,
4656 const cv::Mat &
empty,
4658 const cv::Point3f & viewpoint)
const
4693 const std::vector<CameraModel> & models,
4694 const std::vector<StereoCameraModel> & stereoModels)
const
4726 const cv::Mat & image,
4727 const std::string & format)
const
4803 if(param.size() && statistics.
refImageId()>0)
4808 query =
"INSERT INTO Statistics(id, stamp, data, wm_state) values(?,?,?,?);";
4812 query =
"INSERT INTO Statistics(id, stamp, data) values(?,?,?);";
4823 cv::Mat compressedParam;
4836 cv::Mat compressedWmState;
4839 if(saveWmState && !statistics.
wmState().empty())
4881 query =
uFormat(
"UPDATE Admin SET preview_image=? WHERE version='%s';",
_version.c_str());
4886 cv::Mat compressedImage;
4895 if(image.rows == 1 && image.type() == CV_8UC1)
4898 compressedImage = image;
4929 std::stringstream query;
4931 query <<
"SELECT preview_image "
4933 <<
"WHERE version='" <<
_version.c_str()
4944 const void *
data = 0;
4951 if(dataSize>0 &&
data)
4955 UDEBUG(
"Image=%dx%d", image.cols, image.rows);
4972 UDEBUG(
"poses=%d lastlocalizationPose=%s", (
int)poses.size(), lastlocalizationPose.
prettyPrint().c_str());
4982 query =
uFormat(
"UPDATE Admin SET opt_ids=?, opt_poses=?, opt_last_localization=?, time_enter = DATETIME('NOW') WHERE version='%s';",
_version.c_str());
4989 cv::Mat compressedIds;
4990 cv::Mat compressedPoses;
5000 std::vector<int> serializedIds(poses.size());
5001 std::vector<float> serializedPoses(poses.size()*12);
5003 for(std::map<int, Transform>::const_iterator
iter=poses.begin();
iter!=poses.end(); ++
iter)
5005 serializedIds[
i] =
iter->first;
5006 memcpy(serializedPoses.data()+(12*
i),
iter->second.data(), 12*
sizeof(
float));
5010 compressedIds =
compressData2(cv::Mat(1,serializedIds.size(), CV_32SC1, serializedIds.data()));
5011 compressedPoses =
compressData2(cv::Mat(1,serializedPoses.size(), CV_32FC1, serializedPoses.data()));
5019 if(lastlocalizationPose.
isNull())
5046 std::map<int, Transform> poses;
5053 std::stringstream query;
5055 query <<
"SELECT opt_ids, opt_poses, opt_last_localization "
5057 <<
"WHERE version='" <<
_version.c_str()
5068 const void *
data = 0;
5073 cv::Mat serializedIds;
5076 if(dataSize>0 &&
data)
5079 UDEBUG(
"serializedIds=%d", serializedIds.cols);
5084 if(dataSize>0 &&
data)
5086 cv::Mat serializedPoses =
uncompressData(cv::Mat(1, dataSize, CV_8UC1, (
void *)
data));
5087 UDEBUG(
"serializedPoses=%d", serializedPoses.cols);
5089 UASSERT(serializedIds.cols == serializedPoses.cols/12);
5090 UASSERT(serializedPoses.type() == CV_32FC1);
5091 UASSERT(serializedIds.type() == CV_32SC1);
5092 for(
int i=0;
i<serializedIds.cols; ++
i)
5094 Transform t(serializedPoses.at<
float>(
i*12), serializedPoses.at<
float>(
i*12+1), serializedPoses.at<
float>(
i*12+2), serializedPoses.at<
float>(
i*12+3),
5095 serializedPoses.at<
float>(
i*12+4), serializedPoses.at<
float>(
i*12+5), serializedPoses.at<
float>(
i*12+6), serializedPoses.at<
float>(
i*12+7),
5096 serializedPoses.at<
float>(
i*12+8), serializedPoses.at<
float>(
i*12+9), serializedPoses.at<
float>(
i*12+10), serializedPoses.at<
float>(
i*12+11));
5097 poses.insert(std::make_pair(serializedIds.at<
int>(
i),
t));
5098 UDEBUG(
"Optimized pose %d: %s", serializedIds.at<
int>(
i),
t.prettyPrint().c_str());
5104 if(lastlocalizationPose)
5106 if((
unsigned int)dataSize == lastlocalizationPose->
size()*
sizeof(
float) &&
data)
5108 memcpy(lastlocalizationPose->
data(),
data, dataSize);
5138 query =
uFormat(
"UPDATE Admin SET opt_map=?, opt_map_x_min=?, opt_map_y_min=?, opt_map_resolution=?, time_enter = DATETIME('NOW') WHERE version='%s';",
_version.c_str());
5145 cv::Mat compressedMap;
5188 std::stringstream query;
5190 query <<
"SELECT opt_map, opt_map_x_min, opt_map_y_min, opt_map_resolution "
5192 <<
"WHERE version='" <<
_version.c_str()
5203 const void *
data = 0;
5210 if(dataSize>0 &&
data)
5213 UDEBUG(
"map=%d/%d", map.cols, map.rows);
5221 UDEBUG(
"cellSize=%f", cellSize);
5237 const cv::Mat & cloud,
5238 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
5239 #
if PCL_VERSION_COMPARE(>=, 1, 8, 0)
5242 const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
5244 const cv::Mat & textures)
const
5256 query =
uFormat(
"UPDATE Admin SET opt_cloud=?, opt_polygons_size=?, opt_polygons=?, opt_tex_coords=?, opt_tex_materials=?, time_enter = DATETIME('NOW') WHERE version='%s';",
_version.c_str());
5263 for(
int i=1;
i<=5; ++
i)
5278 cv::Mat compressedCloud;
5279 if(cloud.rows == 1 && cloud.type() == CV_8UC1)
5282 compressedCloud = cloud;
5286 UDEBUG(
"Cloud points=%d", cloud.cols);
5289 UDEBUG(
"Cloud compressed bytes=%d", compressedCloud.cols);
5294 cv::Mat compressedPolygons;
5295 cv::Mat compressedTexCoords;
5296 cv::Mat compressedTextures;
5298 if(polygons.empty())
5315 std::vector<int> serializedPolygons;
5316 std::vector<float> serializedTexCoords;
5317 int polygonSize = 0;
5318 int totalPolygonIndices = 0;
5319 UASSERT(texCoords.empty() || polygons.size() == texCoords.size());
5320 for(
unsigned int t=0;
t<polygons.size(); ++
t)
5322 UDEBUG(
"t=%d, polygons=%d",
t, (
int)polygons[
t].
size());
5323 unsigned int materialPolygonIndices = 0;
5324 for(
unsigned int p=0;
p<polygons[
t].size(); ++
p)
5326 if(polygonSize == 0)
5329 polygonSize = polygons[
t][
p].size();
5336 materialPolygonIndices += polygons[
t][
p].size();
5338 totalPolygonIndices += materialPolygonIndices;
5340 if(!texCoords.empty())
5342 UASSERT(materialPolygonIndices == texCoords[
t].
size());
5345 UASSERT(totalPolygonIndices>0);
5346 serializedPolygons.resize(totalPolygonIndices+polygons.size());
5347 if(!texCoords.empty())
5349 serializedTexCoords.resize(totalPolygonIndices*2+polygons.size());
5354 for(
unsigned int t=0;
t<polygons.size(); ++
t)
5356 serializedPolygons[oi++] = polygons[
t].size();
5357 if(!texCoords.empty())
5359 serializedTexCoords[ci++] = texCoords[
t].size();
5361 for(
unsigned int p=0;
p<polygons[
t].size(); ++
p)
5363 int texIndex =
p*polygonSize;
5364 for(
unsigned int i=0;
i<polygons[
t][
p].size(); ++
i)
5366 serializedPolygons[oi++] = polygons[
t][
p][
i];
5368 if(!texCoords.empty())
5370 serializedTexCoords[ci++] = texCoords[
t][texIndex+
i][0];
5371 serializedTexCoords[ci++] = texCoords[
t][texIndex+
i][1];
5377 UDEBUG(
"serializedPolygons=%d", (
int)serializedPolygons.size());
5378 compressedPolygons =
compressData2(cv::Mat(1,serializedPolygons.size(), CV_32SC1, serializedPolygons.data()));
5388 if(texCoords.empty())
5399 UDEBUG(
"serializedTexCoords=%d", (
int)serializedTexCoords.size());
5400 compressedTexCoords =
compressData2(cv::Mat(1,serializedTexCoords.size(), CV_32FC1, serializedTexCoords.data()));
5404 UASSERT(!textures.empty() && textures.cols % textures.rows == 0 && textures.cols/textures.rows == (
int)texCoords.size());
5405 if(textures.rows == 1 && textures.type() == CV_8UC1)
5408 compressedTextures = textures;
5433 std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > * polygons,
5434 #
if PCL_VERSION_COMPARE(>=, 1, 8, 0)
5437 std::vector<std::vector<Eigen::Vector2f> > * texCoords,
5439 cv::Mat * textures)
const
5449 std::stringstream query;
5451 query <<
"SELECT opt_cloud, opt_polygons_size, opt_polygons, opt_tex_coords, opt_tex_materials "
5453 <<
"WHERE version='" <<
_version.c_str()
5464 const void *
data = 0;
5471 if(dataSize>0 &&
data)
5475 UDEBUG(
"Cloud=%d points", cloud.cols);
5479 UDEBUG(
"polygonSize=%d", polygonSize);
5484 if(dataSize>0 &&
data)
5489 cv::Mat serializedPolygons =
uncompressData(cv::Mat(1, dataSize, CV_8UC1, (
void *)
data));
5490 UDEBUG(
"serializedPolygons=%d", serializedPolygons.cols);
5491 UASSERT(serializedPolygons.total());
5492 for(
int t=0;
t<serializedPolygons.cols; ++
t)
5494 UASSERT(serializedPolygons.at<
int>(
t) > 0);
5495 std::vector<std::vector<RTABMAP_PCL_INDEX> > materialPolygons(serializedPolygons.at<
int>(
t), std::vector<RTABMAP_PCL_INDEX>(polygonSize));
5497 UASSERT(
t < serializedPolygons.cols);
5498 UDEBUG(
"materialPolygons=%d", (
int)materialPolygons.size());
5499 for(
int p=0;
p<(
int)materialPolygons.size(); ++
p)
5501 for(
int i=0;
i<polygonSize; ++
i)
5503 materialPolygons[
p][
i] = serializedPolygons.at<
int>(
t +
p*polygonSize +
i);
5506 t+=materialPolygons.size()*polygonSize;
5507 polygons->push_back(materialPolygons);
5514 if(dataSize>0 &&
data)
5518 cv::Mat serializedTexCoords =
uncompressData(cv::Mat(1, dataSize, CV_8UC1, (
void *)
data));
5519 UDEBUG(
"serializedTexCoords=%d", serializedTexCoords.cols);
5520 UASSERT(serializedTexCoords.total());
5521 for(
int t=0;
t<serializedTexCoords.cols; ++
t)
5523 UASSERT(
int(serializedTexCoords.at<
float>(
t)) > 0);
5524 #if PCL_VERSION_COMPARE(>=, 1, 8, 0)
5525 std::vector<Eigen::Vector2f, Eigen::aligned_allocator<Eigen::Vector2f> > materialtexCoords(
int(serializedTexCoords.at<
float>(
t)));
5527 std::vector<Eigen::Vector2f> materialtexCoords(
int(serializedTexCoords.at<
float>(
t)));
5530 UASSERT(
t < serializedTexCoords.cols);
5531 UDEBUG(
"materialtexCoords=%d", (
int)materialtexCoords.size());
5532 for(
int p=0;
p<(
int)materialtexCoords.size(); ++
p)
5534 materialtexCoords[
p][0] = serializedTexCoords.at<
float>(
t +
p*2);
5535 materialtexCoords[
p][1] = serializedTexCoords.at<
float>(
t +
p*2 + 1);
5537 t+=materialtexCoords.size()*2;
5538 texCoords->push_back(materialtexCoords);
5545 if(dataSize>0 &&
data)
5550 UDEBUG(
"textures=%dx%d", textures->cols, textures->rows);
5573 return "INSERT INTO Node(id, map_id, weight, pose, stamp, label, ground_truth_pose, velocity, gps, env_sensors) VALUES(?,?,?,?,?,?,?,?,?,?);";
5577 return "INSERT INTO Node(id, map_id, weight, pose, stamp, label, ground_truth_pose, velocity, gps) VALUES(?,?,?,?,?,?,?,?,?);";
5581 return "INSERT INTO Node(id, map_id, weight, pose, stamp, label, ground_truth_pose, velocity) VALUES(?,?,?,?,?,?,?,?);";
5585 return "INSERT INTO Node(id, map_id, weight, pose, stamp, label, ground_truth_pose) VALUES(?,?,?,?,?,?,?);";
5589 return "INSERT INTO Node(id, map_id, weight, pose, stamp, label) VALUES(?,?,?,?,?,?);";
5593 return "INSERT INTO Node(id, map_id, weight, pose, stamp, label, user_data) VALUES(?,?,?,?,?,?,?);";
5597 return "INSERT INTO Node(id, map_id, weight, pose, stamp, label) VALUES(?,?,?,?,?,?);";
5599 return "INSERT INTO Node(id, map_id, weight, pose) VALUES(?,?,?,?);";
5603 UDEBUG(
"Save node %d",
s->id());
5625 if(
s->getLabel().empty())
5637 std::vector<double> gps;
5638 std::vector<double> envSensors;
5650 if(
s->getVelocity().empty())
5664 if(
s->sensorData().gps().stamp() <= 0.0)
5672 gps[0] =
s->sensorData().gps().stamp();
5673 gps[1] =
s->sensorData().gps().longitude();
5674 gps[2] =
s->sensorData().gps().latitude();
5675 gps[3] =
s->sensorData().gps().altitude();
5676 gps[4] =
s->sensorData().gps().error();
5677 gps[5] =
s->sensorData().gps().bearing();
5684 const EnvSensors & sensors =
s->sensorData().envSensors();
5685 if(sensors.size() == 0)
5693 envSensors.resize(sensors.size()*3,0.0);
5695 for(std::map<EnvSensor::Type, EnvSensor>::const_iterator
iter=sensors.begin();
iter!=sensors.end(); ++
iter,
j+=3)
5697 envSensors[
j] = (double)
iter->second.type();
5698 envSensors[
j+1] =
iter->second.value();
5699 envSensors[
j+2] =
iter->second.stamp();
5710 if(
s->sensorData().userDataCompressed().empty())
5733 return "INSERT INTO Image(id, data) VALUES(?,?);";
5737 const cv::Mat & imageBytes)
const
5740 UDEBUG(
"Save image %d (size=%d)",
id, (
int)imageBytes.cols);
5752 if(!imageBytes.empty())
5775 return "INSERT INTO Depth(id, data, fx, fy, cx, cy, local_transform, data2d, data2d_max_pts) VALUES(?,?,?,?,?,?,?,?,?);";
5779 return "INSERT INTO Depth(id, data, fx, fy, cx, cy, local_transform, data2d) VALUES(?,?,?,?,?,?,?,?);";
5783 return "INSERT INTO Depth(id, data, constant, local_transform, data2d) VALUES(?,?,?,?,?);";
5789 UDEBUG(
"Save depth %d (size=%d) depth2d = %d",
5814 float fx=0, fyOrBaseline=0,
cx=0,
cy=0;
5819 uFormat(
"Database version %s doesn't support multi-camera!",
_version.c_str()).c_str());
5825 localTransform = sensorData.
cameraModels()[0].localTransform();
5830 uFormat(
"Database version %s doesn't support multi-camera!",
_version.c_str()).c_str());
5885 return "UPDATE Data SET calibration=? WHERE id=?;";
5890 const std::vector<CameraModel> & models,
5891 const std::vector<StereoCameraModel> & stereoModels)
const
5902 std::vector<unsigned char> calibrationData;
5903 std::vector<float> calibration;
5906 if(models.size() && models[0].isValidForProjection())
5910 for(
unsigned int i=0;
i<models.size(); ++
i)
5912 UASSERT(models[
i].isValidForProjection());
5913 std::vector<unsigned char>
data = models[
i].serialize();
5915 unsigned int oldSize = calibrationData.size();
5916 calibrationData.resize(calibrationData.size() +
data.size());
5917 memcpy(calibrationData.data()+oldSize,
data.data(),
data.size());
5923 for(
unsigned int i=0;
i<models.size(); ++
i)
5925 UASSERT(models[
i].isValidForProjection());
5926 const Transform & localTransform = models[
i].localTransform();
5927 calibration[
i*(6+localTransform.
size())] = models[
i].
fx();
5928 calibration[
i*(6+localTransform.
size())+1] = models[
i].
fy();
5929 calibration[
i*(6+localTransform.
size())+2] = models[
i].
cx();
5930 calibration[
i*(6+localTransform.
size())+3] = models[
i].
cy();
5931 calibration[
i*(6+localTransform.
size())+4] = models[
i].imageWidth();
5932 calibration[
i*(6+localTransform.
size())+5] = models[
i].imageHeight();
5933 memcpy(calibration.data()+
i*(6+localTransform.
size())+6, localTransform.
data(), localTransform.
size()*
sizeof(
float));
5939 for(
unsigned int i=0;
i<models.size(); ++
i)
5941 UASSERT(models[
i].isValidForProjection());
5942 const Transform & localTransform = models[
i].localTransform();
5943 calibration[
i*(4+localTransform.
size())] = models[
i].
fx();
5944 calibration[
i*(4+localTransform.
size())+1] = models[
i].
fy();
5945 calibration[
i*(4+localTransform.
size())+2] = models[
i].
cx();
5946 calibration[
i*(4+localTransform.
size())+3] = models[
i].
cy();
5947 memcpy(calibration.data()+
i*(4+localTransform.
size())+4, localTransform.
data(), localTransform.
size()*
sizeof(
float));
5951 else if(stereoModels.size() && stereoModels[0].isValidForProjection())
5955 for(
unsigned int i=0;
i<stereoModels.size(); ++
i)
5957 UASSERT(stereoModels[
i].isValidForProjection());
5958 std::vector<unsigned char>
data = stereoModels[
i].serialize();
5960 unsigned int oldSize = calibrationData.size();
5961 calibrationData.resize(calibrationData.size() +
data.size());
5962 memcpy(calibrationData.data()+oldSize,
data.data(),
data.size());
5967 UASSERT_MSG(stereoModels.size()==1,
uFormat(
"Database version (%s) is too old for saving multiple stereo cameras",
_version.c_str()).c_str());
5968 const Transform & localTransform = stereoModels[0].left().localTransform();
5969 calibration.resize(7+localTransform.
size());
5970 calibration[0] = stereoModels[0].left().fx();
5971 calibration[1] = stereoModels[0].left().fy();
5972 calibration[2] = stereoModels[0].left().cx();
5973 calibration[3] = stereoModels[0].left().cy();
5974 calibration[4] = stereoModels[0].baseline();
5975 calibration[5] = stereoModels[0].left().imageWidth();
5976 calibration[6] = stereoModels[0].left().imageHeight();
5977 memcpy(calibration.data()+7, localTransform.
data(), localTransform.
size()*
sizeof(
float));
5981 if(calibrationData.size())
5985 else if(calibration.size())
6011 return "UPDATE Depth SET data=? WHERE id=?;";
6015 return "UPDATE Data SET depth=? WHERE id=?;";
6028 cv::Mat imageCompressed;
6029 if(!image.empty() && (image.type()!=CV_8UC1 || image.rows > 1))
6036 imageCompressed = image;
6038 if(!imageCompressed.empty())
6065 return "UPDATE Data SET scan_info=?, scan=? WHERE id=?;";
6069 return "UPDATE Data SET scan_max_pts=?, scan_max_range=?, scan=? WHERE id=?;";
6073 return "UPDATE Data SET scan_max_pts=? scan=? WHERE id=?;";
6086 std::vector<float> scanInfo;
6099 scanInfo[0] = scan.
format();
6107 memcpy(scanInfo.data()+7, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6114 scanInfo[2] = scan.
format();
6116 memcpy(scanInfo.data()+3, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6125 memcpy(scanInfo.data()+2, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6155 cv::Mat scanCompressed;
6158 scanCompressed = scan.
data();
6164 if(!scanCompressed.empty())
6191 return "INSERT INTO Data(id, image, depth, calibration, scan_info, scan, user_data, ground_cells, obstacle_cells, empty_cells, cell_size, view_point_x, view_point_y, view_point_z) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
6195 return "INSERT INTO Data(id, image, depth, calibration, scan_info, scan, user_data, ground_cells, obstacle_cells, cell_size, view_point_x, view_point_y, view_point_z) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?);";
6199 return "INSERT INTO Data(id, image, depth, calibration, scan_max_pts, scan_max_range, scan, user_data) VALUES(?,?,?,?,?,?,?,?);";
6203 return "INSERT INTO Data(id, image, depth, calibration, scan_max_pts, scan, user_data) VALUES(?,?,?,?,?,?,?);";
6207 return "INSERT INTO Data(id, image, depth, calibration, scan_max_pts, scan) VALUES(?,?,?,?,?,?);";
6214 UDEBUG(
"Save sensor data %d (image=%d depth=%d) depth2d = %d",
6254 std::vector<unsigned char> calibrationData;
6255 std::vector<float> calibration;
6267 unsigned int oldSize = calibrationData.size();
6268 calibrationData.resize(calibrationData.size() +
data.size());
6269 memcpy(calibrationData.data()+oldSize,
data.data(),
data.size());
6283 calibration[
i*(6+localTransform.
size())+4] = sensorData.
cameraModels()[
i].imageWidth();
6284 calibration[
i*(6+localTransform.
size())+5] = sensorData.
cameraModels()[
i].imageHeight();
6285 memcpy(calibration.data()+
i*(6+localTransform.
size())+6, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6299 memcpy(calibration.data()+
i*(4+localTransform.
size())+4, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6312 unsigned int oldSize = calibrationData.size();
6313 calibrationData.resize(calibrationData.size() +
data.size());
6314 memcpy(calibrationData.data()+oldSize,
data.data(),
data.size());
6321 calibration.resize(7+localTransform.
size());
6329 memcpy(calibration.data()+7, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6333 if(calibrationData.size())
6337 else if(calibration.size())
6347 std::vector<float> scanInfo;
6368 memcpy(scanInfo.data()+7, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6377 memcpy(scanInfo.data()+3, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6386 memcpy(scanInfo.data()+2, localTransform.
data(), localTransform.
size()*
sizeof(
float));
6507 return "UPDATE Link SET type=?, information_matrix=?, transform=?, user_data=? WHERE from_id=? AND to_id = ?;";
6511 return "UPDATE Link SET type=?, rot_variance=?, trans_variance=?, transform=?, user_data=? WHERE from_id=? AND to_id = ?;";
6515 return "UPDATE Link SET type=?, rot_variance=?, trans_variance=?, transform=? WHERE from_id=? AND to_id = ?;";
6519 return "UPDATE Link SET type=?, variance=?, transform=? WHERE from_id=? AND to_id = ?;";
6523 return "UPDATE Link SET type=?, transform=? WHERE from_id=? AND to_id = ?;";
6531 return "INSERT INTO Link(type, information_matrix, transform, user_data, from_id, to_id) VALUES(?,?,?,?,?,?);";
6535 return "INSERT INTO Link(type, rot_variance, trans_variance, transform, user_data, from_id, to_id) VALUES(?,?,?,?,?,?,?);";
6539 return "INSERT INTO Link(type, rot_variance, trans_variance, transform, from_id, to_id) VALUES(?,?,?,?,?,?);";
6543 return "INSERT INTO Link(type, variance, transform, from_id, to_id) VALUES(?,?,?,?,?);";
6547 return "INSERT INTO Link(type, transform, from_id, to_id) VALUES(?,?,?,?);";
6552 const Link & link)
const
6558 UDEBUG(
"Save link from %d to %d, type=%d", link.
from(), link.
to(), link.
type());
6563 UDEBUG(
"Virtual link ignored....");
6624 return "UPDATE Feature SET word_id = ? WHERE word_id = ? AND node_id = ?;";
6628 return "UPDATE Map_Node_Word SET word_id = ? WHERE word_id = ? AND node_id = ?;";
6657 return "INSERT INTO Feature(node_id, word_id, pos_x, pos_y, size, dir, response, octave, depth_x, depth_y, depth_z, descriptor_size, descriptor) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?);";
6661 return "INSERT INTO Map_Node_Word(node_id, word_id, pos_x, pos_y, size, dir, response, octave, depth_x, depth_y, depth_z, descriptor_size, descriptor) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?);";
6665 return "INSERT INTO Map_Node_Word(node_id, word_id, pos_x, pos_y, size, dir, response, depth_x, depth_y, depth_z, descriptor_size, descriptor) VALUES(?,?,?,?,?,?,?,?,?,?,?,?);";
6667 return "INSERT INTO Map_Node_Word(node_id, word_id, pos_x, pos_y, size, dir, response, depth_x, depth_y, depth_z) VALUES(?,?,?,?,?,?,?,?,?,?);";
6672 const cv::KeyPoint & kp,
6673 const cv::Point3f & pt,
6771 return "INSERT INTO GlobalDescriptor(node_id, type, info, data) VALUES(?,?,?,?);";
6794 if(infoBytes.empty())
6806 if(dataBytes.empty())
6828 return "UPDATE Data SET ground_cells=?, obstacle_cells=?, empty_cells=?, cell_size=?, view_point_x=?, view_point_y=?, view_point_z=? WHERE id=?;";
6830 return "UPDATE Data SET ground_cells=?, obstacle_cells=?, cell_size=?, view_point_x=?, view_point_y=?, view_point_z=? WHERE id=?;";
6834 const cv::Mat & ground,
6835 const cv::Mat & obstacles,
6836 const cv::Mat &
empty,
6838 const cv::Point3f & viewpoint)
const
6841 UASSERT(ground.empty() || ground.type() == CV_8UC1);
6842 UASSERT(obstacles.empty() || obstacles.type() == CV_8UC1);
6844 UDEBUG(
"Update occupancy grid %d: ground=%d obstacles=%d empty=%d cell=%f viewpoint=(%f,%f,%f)",
6875 if(obstacles.empty())