27     std::istream& in_stream,
    28     std::vector<mrpt::obs::CObservation::Ptr>& out_observations,
    34     out_observations.clear();  
    40         if (!in_stream) 
return false;  
    41         std::getline(in_stream, line);
    54             std::make_shared<CObservation2DRangeScan>();
    61         double start_angle, angular_resolution, accuracy;
    64         if (!(S >> obsLaser->sensorLabel >> laser_type >> start_angle >>
    65               obsLaser->aperture >> angular_resolution >> obsLaser->maxRange >>
    66               accuracy >> remission_mode))
    68                 "Error parsing line from CARMEN log (params):\n'%s'\n",
    74         obsLaser->resizeScan(nRanges);
    76         for (
size_t i = 0; i < nRanges; i++)
    81                     "Error parsing line from CARMEN log (ranges):\n'%s'\n",
    83             obsLaser->setScanRange(i, range);
    85             obsLaser->setScanRangeValidity(
    86                 i, (range >= obsLaser->maxRange || range <= 0));
    89         size_t remmision_count;
    90         if (!(S >> remmision_count))
    92                 "Error parsing line from CARMEN log (remmision_count):\n'%s'\n",
    95         vector<double> remission;
    96         remission.resize(remmision_count);
    98         for (
size_t i = 0; i < remmision_count; i++)
   100             if (!(S >> remission[i]))
   102                     "Error parsing line from CARMEN log (remmision "   110         if (!(S >> globalLaserPose.
x >> globalLaserPose.
y >>
   111               globalLaserPose.
phi >> globalRobotPose.
x >> globalRobotPose.
y >>
   112               globalRobotPose.
phi))
   114                 "Error parsing line from CARMEN log (poses):\n'%s'\n",
   118         obsLaser->sensorPose =
   121         double tv, rv, fw_dist, side_dist, turn_axis;
   122         S >> tv >> rv >> fw_dist >> side_dist >> turn_axis;
   126         S >> timestamp >> robotName;
   130             std::chrono::microseconds(static_cast<uint64_t>(1e-6 * timestamp));
   132         obsLaser->timestamp = obs_time;
   137                 std::make_shared<CObservationOdometry>();
   139             obsOdo_ptr->timestamp = obs_time;
   140             obsOdo_ptr->odometry = 
CPose2D(globalRobotPose);
   141             obsOdo_ptr->sensorLabel = 
"ODOMETRY";
   143             out_observations.push_back(obsOdo_ptr);
   147         out_observations.push_back(obsLaser_ptr);
   156         std::istringstream S;  
   160             std::make_shared<CObservation2DRangeScan>();
   167         if (!(S >> obsLaser->sensorLabel >> nRanges))
   169                 "Error parsing line from CARMEN log (params):\n'%s'\n",
   174             double maxRange = 81.0;
   175             double resolutionDeg = 0.5;
   182                         .getWithDefaultVal(
"robot_front_laser_max", 
"81.0"s)
   185                     atof(global_log_params
   187                                  "laser_front_laser_resolution", 
"0.5"s)
   190             else if (line[0] == 
'R')
   193                     atof(global_log_params
   194                              .getWithDefaultVal(
"robot_rear_laser_max", 
"81.0"s)
   197                     atof(global_log_params
   199                                  "laser_rear_laser_resolution", 
"0.5"s)
   202             obsLaser->maxRange = 
d2f(maxRange);
   203             obsLaser->aperture = 
d2f(
DEG2RAD(resolutionDeg) * nRanges);
   206         obsLaser->resizeScan(nRanges);
   208         for (
size_t i = 0; i < nRanges; i++)
   213                     "Error parsing line from CARMEN log (ranges):\n'%s'\n",
   215             obsLaser->setScanRange(i, range);
   217             obsLaser->setScanRangeValidity(
   218                 i, (obsLaser->getScanRange(i) >= obsLaser->maxRange ||
   219                     obsLaser->getScanRange(i) <= 0));
   224         if (!(S >> globalLaserPose.
x >> globalLaserPose.
y >>
   225               globalLaserPose.
phi >> globalRobotPose.
x >> globalRobotPose.
y >>
   226               globalRobotPose.
phi))
   228                 "Error parsing line from CARMEN log (poses):\n'%s'\n",
   232         obsLaser->sensorPose =
   237         S >> timestamp >> robotName;
   241             std::chrono::microseconds(static_cast<uint64_t>(1e-6 * timestamp));
   243         obsLaser->timestamp = obs_time;
   248                 std::make_shared<CObservationOdometry>();
   250             obsOdo_ptr->timestamp = obs_time;
   251             obsOdo_ptr->odometry = 
CPose2D(globalRobotPose);
   252             obsOdo_ptr->sensorLabel = 
"ODOMETRY";
   254             out_observations.push_back(obsOdo_ptr);
   258         out_observations.push_back(obsLaser_ptr);
   265         std::istringstream S;  
   271         if (!(S >> key >> 
val))
   273                 "Error parsing line from CARMEN log (PARAM):\n'%s'\n",
   276         if (!key.empty() && !
val.empty())
 
bool carmen_log_parse_line(std::istream &in_stream, std::vector< mrpt::obs::CObservation::Ptr > &out_imported_observations, const mrpt::system::TTimeStamp &time_start_log)
Parse one line from an text input stream and interpret it as a CARMEN log entry, returning its MRPT o...
 
bool strStartsI(const std::string &str, const std::string &subStr)
Return true if "str" starts with "subStr" (case insensitive) 
 
mrpt::Clock::time_point TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1...
 
float d2f(const double d)
shortcut for static_cast<float>(double) 
 
std::string lowerCase(const std::string &str)
Returns an lower-case version of a string. 
 
constexpr double DEG2RAD(const double x)
Degrees to radians. 
 
This namespace contains representation of robot actions and observations. 
 
static std::string & trim(std::string &s)
 
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
 
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle...
 
A class used to store a 3D pose (a 3D translation + a rotation in 3D). 
 
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
 
For usage when passing a dynamic number of (numeric) arguments to a function, by name. 
 
double phi
Orientation (rads)