28 std::istream& in_stream,
29 std::vector<mrpt::obs::CObservation::Ptr>& out_observations,
35 out_observations.clear();
41 if (!in_stream)
return false;
42 std::getline(in_stream, line);
55 mrpt::make_aligned_shared<CObservation2DRangeScan>();
62 double start_angle, angular_resolution, accuracy;
65 if (!(S >> obsLaser->
sensorLabel >> laser_type >> start_angle >>
67 accuracy >> remission_mode))
69 "Error parsing line from CARMEN log (params):\n'%s'\n",
77 for (
size_t i = 0; i < nRanges; i++)
82 "Error parsing line from CARMEN log (ranges):\n'%s'\n",
88 obsLaser->
scan[i] <= 0));
91 size_t remmision_count;
92 if (!(S >> remmision_count))
94 "Error parsing line from CARMEN log (remmision_count):\n'%s'\n",
97 vector<double> remission;
98 remission.resize(remmision_count);
100 for (
size_t i = 0; i < remmision_count; i++)
102 if (!(S >> remission[i]))
104 "Error parsing line from CARMEN log (remmision "
112 if (!(S >> globalLaserPose.
x >> globalLaserPose.
y >>
113 globalLaserPose.
phi >> globalRobotPose.
x >> globalRobotPose.
y >>
114 globalRobotPose.
phi))
116 "Error parsing line from CARMEN log (poses):\n'%s'\n",
123 double tv, rv, fw_dist, side_dist, turn_axis;
124 S >> tv >> rv >> fw_dist >> side_dist >> turn_axis;
128 S >> timestamp >> robotName;
131 time_start_log + std::chrono::microseconds(
static_cast<uint64_t>(1e-6 * timestamp));
138 mrpt::make_aligned_shared<CObservationOdometry>();
140 obsOdo_ptr->timestamp = obs_time;
141 obsOdo_ptr->odometry =
CPose2D(globalRobotPose);
142 obsOdo_ptr->sensorLabel =
"ODOMETRY";
144 out_observations.push_back(obsOdo_ptr);
148 out_observations.push_back(obsLaser_ptr);
157 std::istringstream S;
161 mrpt::make_aligned_shared<CObservation2DRangeScan>();
170 "Error parsing line from CARMEN log (params):\n'%s'\n",
175 double maxRange = 81.0;
176 double resolutionDeg = 0.5;
182 .getWithDefaultVal(
"robot_front_laser_max",
"81.0")
185 atof(global_log_params
187 "laser_front_laser_resolution",
"0.5")
190 else if (line[0] ==
'R')
194 .getWithDefaultVal(
"robot_rear_laser_max",
"81.0")
197 atof(global_log_params
199 "laser_rear_laser_resolution",
"0.5")
208 for (
size_t i = 0; i < nRanges; i++)
213 "Error parsing line from CARMEN log (ranges):\n'%s'\n",
219 obsLaser->
scan[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",
237 S >> timestamp >> robotName;
240 time_start_log + std::chrono::microseconds(
static_cast<uint64_t>(1e-6 * timestamp));
247 mrpt::make_aligned_shared<CObservationOdometry>();
249 obsOdo_ptr->timestamp = obs_time;
250 obsOdo_ptr->odometry =
CPose2D(globalRobotPose);
251 obsOdo_ptr->sensorLabel =
"ODOMETRY";
253 out_observations.push_back(obsOdo_ptr);
257 out_observations.push_back(obsLaser_ptr);
264 std::istringstream S;
270 if (!(S >> key >>
val))
272 "Error parsing line from CARMEN log (PARAM):\n'%s'\n",
275 if (!key.empty() && !
val.empty())
static std::string & trim(std::string &s)
A "CObservation"-derived class that represents a 2D range scan measurement (typically from a laser sc...
float maxRange
The maximum range allowed by the device, in meters (e.g.
float aperture
The "aperture" or field-of-view of the range finder, in radians (typically M_PI = 180 degrees).
mrpt::poses::CPose3D sensorPose
The 6D pose of the sensor on the robot at the moment of starting the scan.
std::shared_ptr< CObservation2DRangeScan > Ptr
void resizeScan(const size_t len)
Resizes all data vectors to allocate a given number of scan rays.
void setScanRangeValidity(const size_t i, const bool val)
mrpt::containers::ContainerReadOnlyProxyAccessor< mrpt::aligned_std_vector< float > > scan
The range values of the scan, in meters.
void setScanRange(const size_t i, const float val)
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
mrpt::system::TTimeStamp timestamp
The associated UTC time-stamp.
std::shared_ptr< CObservationOdometry > Ptr
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,...)
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)
std::string lowerCase(const std::string &str)
Returns an lower-case version of a string.
mrpt::Clock::time_point TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1,...
This namespace contains representation of robot actions and observations.
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.
double DEG2RAD(const double x)
Degrees to radians.
unsigned __int64 uint64_t
double phi
Orientation (rads)
For usage when passing a dynamic number of (numeric) arguments to a function, by name.