43 if ((getenv(
"MRPT_HWDRIVERS_VERBOSE") !=
nullptr) &&
44 atoi(getenv(
"MRPT_HWDRIVERS_VERBOSE")) != 0)
51 " MRPT C++ Library: %s - Sources timestamp: %s\n",
60 std::string INI_FILENAME(
argv[1]);
82 const std::string GLOBAL_SECT =
"global";
87 string rawlog_prefix =
"dataset";
88 int time_between_launches = 300;
89 bool use_sensoryframes =
false;
90 int GRABBER_PERIOD_MS = 1000;
91 int rawlog_GZ_compress_level = 1;
102 string rawlog_postfix =
"_";
108 "%04u-%02u-%02u_%02uh%02um%02us", (
unsigned int)parts.
year,
109 (
unsigned int)parts.
month, (
unsigned int)parts.
day,
110 (
unsigned int)parts.
hour, (
unsigned int)parts.
minute,
111 (
unsigned int)parts.
second);
124 rawlog_postfix += string(
".rawlog");
135 std::vector<std::string> sections;
138 vector<std::thread> lstThreads;
140 for (
auto& section : sections)
142 if (section == GLOBAL_SECT || section.empty() ||
148 std::this_thread::sleep_for(
149 std::chrono::milliseconds(time_between_launches));
168 auto lambdaProcessPending = [&]() {
170 copy_of_m_global_list_obs.clear();
180 if (use_sensoryframes)
192 lambdaProcessPending();
194 std::this_thread::sleep_for(
195 std::chrono::milliseconds(GRABBER_PERIOD_MS));
201 "[main thread] Ended due to other thread signal to exit " 206 lambdaProcessPending();
214 std::this_thread::sleep_for(300ms);
218 for (
auto& lstThread : lstThreads) lstThread.join();
234 if (
auto gps = std::dynamic_pointer_cast<mrpt::obs::CObservationGPS>(o);
240 std::dynamic_pointer_cast<mrpt::obs::CObservationIMU>(o);
273 const auto fq =
static_cast<int>(
276 " GPS mode: " << fq <<
" label: " << o.
sensorLabel);
279 std::stringstream ss;
289 " IMU angles (degrees): " 290 "(yaw,pitch,roll)=(%.06f, %.06f, %.06f)",
303 std::string driver_name =
310 throw std::runtime_error(
311 std::string(
"Class name not recognized: ") + driver_name);
314 sensor->loadConfig(
params, sensor_label);
317 "[thread_" << sensor_label <<
"] Starting at " 318 << sensor->getProcessRate() <<
" Hz");
326 sensor->initialize();
329 rate.
setRate(sensor->getProcessRate());
338 sensor->getObservations(lstObjs);
355 catch (
const std::exception& e)
360 "Exception in SensorThread:\n" 383 for (
auto it = list_obs.begin(); it != list_obs.end(); ++it)
392 "Saved SF with " <<
m_curSF.
size() <<
" objects.");
399 (*m_out_arch_ptr) << acts;
406 auto act = CActionRobotMovement2D::Create();
407 act->timestamp = odom->timestamp;
412 static bool last_odo_first =
true;
415 int64_t lticks_incr, rticks_incr;
419 last_odo_first =
false;
421 lticks_incr = rticks_incr = 0;
425 odo_incr = odom->odometry - last_odo.
odometry;
435 act->computeFromOdometry(odo_incr, odomOpts);
437 act->hasEncodersInfo =
true;
438 act->encoderLeftTicks = lticks_incr;
439 act->encoderRightTicks = rticks_incr;
441 act->hasVelocities =
true;
442 act->velocityLocal = odom->velocityLocal;
448 "Saved SF with " <<
m_curSF.
size() <<
" objects.");
455 (*m_out_arch_ptr) << acts;
477 "Saved SF with " <<
m_curSF.
size() <<
" objects.");
486 "*** ERROR *** Class is not an action or an " 497 for (
auto& ob : list_obs)
499 auto& obj_ptr = ob.second;
500 (*m_out_arch_ptr) << *obj_ptr;
506 if (!list_obs.empty())
void clear()
Clear all current observations.
double Tac() noexcept
Stops the stopwatch.
void timestampToParts(TTimeStamp t, TTimeParts &p, bool localTime=false)
Gets the individual parts of a date/time (days, hours, minutes, seconds) - UTC time or local time...
bool has_GGA_datum() const
true if the corresponding field exists in messages.
A class for calling sleep() in a loop, such that the amount of sleep time will be computed to make th...
void insert(const CObservation::Ptr &obs)
Inserts a new observation to the list: The pointer to the objects is copied, thus DO NOT delete the p...
std::mutex cs_m_global_list_obs
mrpt::serialization::CArchive * m_out_arch_ptr
std::string read_string(const std::string §ion, const std::string &name, const std::string &defaultValue, bool failIfNotFound=false) const
std::vector< double > rawMeasurements
The accelerometer and/or gyroscope measurements taken by the IMU at the given timestamp.
#define THROW_EXCEPTION(msg)
std::string std::string format(std::string_view fmt, ARGS &&... args)
bool open(const std::string &fileName, int compress_level=1, mrpt::optional_ref< std::string > error_msg=std::nullopt)
Open a file for write, choosing the compression level.
mrpt::poses::CPose2D odometry
The absolute odometry measurement (IT IS NOT INCREMENTAL)
TListObservations m_global_list_obs
bool sleep()
Sleeps for some time, such as the return of this method is 1/rate (seconds) after the return of the p...
orientation pitch absolute value (global/navigation frame) (rad)
std::string m_rawlog_ext_imgs_dir
Directory where to save externally stored images, only for CCameraSensor's.
A high-performance stopwatch, with typical resolution of nanoseconds.
void setMinLoggingLevel(const VerbosityLevel level)
Set the minimum logging level for which the incoming logs are going to be taken into account...
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
Contains classes for various device interfaces.
T::Ptr getObservationByClass(size_t ith=0) const
Returns the i'th observation of a given class (or of a descendant class), or nullptr if there is no s...
std::string MRPT_getCompilationDate()
Returns the MRPT source code timestamp, according to the Reproducible-Builds specifications: https://...
std::string fileNameStripInvalidChars(const std::string &filename, const char replacement_to_invalid_chars='_')
Replace invalid filename chars by underscores ('_') or any other user-given char. ...
This class stores measurements from an Inertial Measurement Unit (IMU) (attitude estimation, raw gyroscope and accelerometer values), altimeters or magnetometers.
mrpt::system::COutputLogger COutputLogger
The parameter to be passed to "computeFromOdometry".
static time_point now() noexcept
Returns the current time using the currently selected Clock source.
mrpt::hwdrivers::CGenericSensor::TListObservations TListObservations
Declares a class for storing a collection of robot actions.
bool show_sensor_thread_exceptions
If enabled (default), exceptions in sensor threads will be reported to std::cerr. ...
void dump_verbose_info(const mrpt::serialization::CSerializable::Ptr &o) const
CArchiveStreamBase< STREAM > archiveFrom(STREAM &s)
Helper function to create a templatized wrapper CArchive object for a: MRPT's CStream, std::istream, std::ostream, std::stringstream.
VerbosityLevel getMinLoggingLevel() const
LockHelper< T > lockHelper(T &t)
Syntactic sugar to easily create a locker to any kind of std::mutex.
const CObservation::Ptr & getObservationByIndex(size_t idx) const
Returns the i'th observation in the list (0=first).
void getDescriptionAsText(std::ostream &o) const override
Build a detailed, multi-line textual description of the observation contents and dump it to the outpu...
#define MRPT_LOG_DEBUG_FMT(_FMT_STRING,...)
Use: MRPT_LOG_DEBUG_FMT("i=%u", i);
void initialize(int argc, const char **argv)
Initializes the application from CLI parameters.
The parts of a date/time (it's like the standard 'tm' but with fractions of seconds).
static Ptr createSensorPtr(const std::string &className)
Just like createSensor, but returning a smart pointer to the newly created sensor object...
std::string rawlog_filename
The generated .rawlog file.
void run()
Runs with the current parameter set.
#define IS_DERIVED(obj, class_name)
True if the given reference to object (derived from mrpt::rtti::CObject) is an instance of the given ...
This namespace contains representation of robot actions and observations.
Declares a class for storing a "sensory frame", a set of "observations" taken by the robot approximat...
#define IS_CLASS(obj, class_name)
True if the given reference to object (derived from mrpt::rtti::CObject) is of the given class...
std::atomic_bool allThreadsMustExit
#define MRPT_LOG_DEBUG_STREAM(__CONTENTS)
Use: MRPT_LOG_DEBUG_STREAM("Var=" << value << " foo=" << foo_var);
void SensorThread(std::string sensor_label)
MSG_CLASS & getMsgByClass()
Returns a reference to the message in the list CObservationGPS::messages of the requested class...
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
void getAllSections(std::vector< std::string > §ions) const override
Returns a list with all the section names.
void process_observations_for_nonsf(const TListObservations &list_obs)
void close()
Close the file.
Declares a class for storing a robot action.
double second
Minute (0-59)
int32_t encoderRightTicks
#define MRPT_LOAD_CONFIG_VAR( variableName, variableType, configFileObject, sectionNameStr)
An useful macro for loading variables stored in a INI-like file under a key with the same name that t...
void setRate(const double rate_hz)
Changes the object loop rate (Hz)
#define MRPT_LOG_INFO_STREAM(__CONTENTS)
double run_for_seconds
If >0, run() will return after this period (in seconds)
std::string sensorLabel
An arbitrary label that can be used to identify the sensor.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
int32_t encoderLeftTicks
For differential-driven robots: The ticks count for each wheel in ABSOLUTE VALUE (IT IS NOT INCREMENT...
uint8_t minute
Hour (0-23)
std::multimap< mrpt::system::TTimeStamp, mrpt::serialization::CSerializable::Ptr > TListObservations
void process_observations_for_sf(const TListObservations &list_obs)
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle...
Declares a class that represents any robot's observation.
#define MRPT_LOG_ERROR(_STRING)
std::size_t rawlog_saved_objects
Counter of saved objects.
bool read_bool(const std::string §ion, const std::string &name, bool defaultValue, bool failIfNotFound=false) const
void setContent(const std::vector< std::string > &stringList)
Changes the contents of the virtual "config file".
constexpr double RAD2DEG(const double x)
Radians to degrees.
#define ASSERT_ABOVE_(__A, __B)
bool kbhit() noexcept
An OS-independent version of kbhit, which returns true if a key has been pushed.
std::string file_get_contents(const std::string &fileName)
Loads an entire text file and return its contents as a single std::string.
std::string exception_to_str(const std::exception &e)
Builds a nice textual representation of a nested exception, which if generated using MRPT macros (THR...
orientation yaw absolute value (global/navigation frame) (rad)
double timeDifference(const mrpt::system::TTimeStamp t_first, const mrpt::system::TTimeStamp t_later)
Returns the time difference from t1 to t2 (positive if t2 is posterior to t1), in seconds...
orientation roll absolute value (global/navigation frame) (rad)
std::string MRPT_getVersion()
Returns a string describing the MRPT version.
An observation of the current (cumulative) odometry for a wheeled robot.
Saves data to a file and transparently compress the data using the given compression level...
void Tic() noexcept
Starts the stopwatch.
#define ASSERT_FILE_EXISTS_(FIL)
void dump_GPS_mode_info(const mrpt::obs::CObservationGPS &o) const
This class stores messages from GNSS or GNSS+IMU devices, from consumer-grade inexpensive GPS receive...
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
#define MRPT_LOG_ERROR_STREAM(__CONTENTS)
size_t size() const
Returns the number of observations in the list.
mrpt::config::CConfigFileMemory params
Populated in initialize().
void dump_IMU_info(const mrpt::obs::CObservationIMU &o) const
#define MRPT_LOG_INFO_FMT(_FMT_STRING,...)
#define MRPT_LOG_INFO(_STRING)
mrpt::obs::CSensoryFrame m_curSF
void insert(CAction &action)
Add a new object to the list.