Go to the documentation of this file.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 <stdio.h>
00029 #include <stdarg.h>
00030
00031 #include <mrpt_rawlog_record/rawlog_record.h>
00032 #include <mrpt_rawlog_record/rawlog_record_defaults.h>
00033
00034 #include <mrpt/base.h>
00035 #include <mrpt/slam.h>
00036
00037 RawlogRecord::~RawlogRecord()
00038 {
00039 log_info("write data");
00040 MRPT_TODO("RawlogRecord writes the rawlog only on exit (Ctrl-C)");
00041 log_info("pRawLog entries %i", pRawLog->size());
00042 log_info("pRawLogASF entries %i", pRawLogASF->size());
00043 if(pRawLog->size() > 0) {
00044 std::string filename = param_->raw_log_folder + "/" + param_->raw_log_name;
00045 log_info("write %s", filename.c_str());
00046 pRawLog->saveToRawLogFile(filename);
00047 }
00048 if(pRawLogASF->size() > 0) {
00049 std::string filename = param_->raw_log_folder + "/" + param_->raw_log_name_asf;
00050 log_info("write %s", filename.c_str());
00051 pRawLogASF->saveToRawLogFile(filename);
00052 }
00053 delete pRawLog;
00054 delete pRawLogASF;
00055 }
00056
00057 RawlogRecord::RawlogRecord(Parameters *param)
00058 :param_(param) {
00059 pRawLog = new mrpt::slam::CRawlog;
00060 pRawLogASF = new mrpt::slam::CRawlog;
00061 }
00062 void RawlogRecord::updateRawLogName(const mrpt::system::TTimeStamp &t) {
00063 uint64_t tmp = (t - ((uint64_t)116444736*1000000000));
00064 time_t auxTime = tmp / (uint64_t)10000000;
00065 unsigned int secFractions = (unsigned int)( 1000000 * (tmp % 10000000) / 10000000.0 );
00066 tm *ptm = localtime( &auxTime );
00067 param_->raw_log_name = mrpt::format(
00068 "%u-%02u-%02u--%02u-%02u-%02u--%s",
00069 1900+ptm->tm_year,
00070 ptm->tm_mon+1,
00071 ptm->tm_mday,
00072 ptm->tm_hour,
00073 ptm->tm_min,
00074 (unsigned int)ptm->tm_sec,
00075 param_->raw_log_name.c_str());
00076 param_->raw_log_name_asf = mrpt::format(
00077 "%u-%02u-%02u--%02u-%02u-%02u--%s",
00078 1900+ptm->tm_year,
00079 ptm->tm_mon+1,
00080 ptm->tm_mday,
00081 ptm->tm_hour,
00082 ptm->tm_min,
00083 (unsigned int)ptm->tm_sec,
00084 param_->raw_log_name_asf.c_str());
00085 }
00086
00087
00088 void RawlogRecord::observation(mrpt::slam::CObservation2DRangeScanPtr laser, mrpt::slam::CObservationOdometryPtr odometry) {
00089
00090 pRawLog->addObservationMemoryReference(odometry);
00091 pRawLog->addObservationMemoryReference(laser);
00092
00093 if(odomLastPose_.empty()) {
00094 odomLastPose_ = odometry->odometry;
00095 }
00096
00097 mrpt::poses::CPose2D incOdoPose = odometry->odometry - odomLastPose_;
00098
00099
00100 mrpt::slam::CActionRobotMovement2D odom_move;
00101 odom_move.timestamp = odometry->timestamp;
00102 odom_move.computeFromOdometry(incOdoPose, param_->motionModelOptions);
00103 mrpt::slam::CActionCollectionPtr action = mrpt::slam::CActionCollection::Create();
00104 action->insert(odom_move);
00105 pRawLogASF->addActionsMemoryReference(action);
00106
00107 mrpt::slam::CSensoryFramePtr sf = mrpt::slam::CSensoryFrame::Create();
00108 mrpt::slam::CObservationPtr obs = mrpt::slam::CObservationPtr(laser);
00109 sf->insert(obs);
00110 pRawLogASF->addObservationsMemoryReference(sf);
00111
00112 odomLastPose_ = odometry->odometry;
00113 }