37 std::string CAbstractPTGBasedReactive::TNavigationParamsPTG::getAsText()
const
39 std::string s = CWaypointsNavigator::TNavigationParamsWaypoints::getAsText();
40 s +=
"restrict_PTG_indices: ";
50 CWaypointsNavigator::TNavigationParamsWaypoints::isEqual(rhs) &&
57 CAbstractPTGBasedReactive::CAbstractPTGBasedReactive(
CRobot2NavInterface &react_iterf_impl,
bool enableConsoleOutput,
bool enableLogFile,
const std::string &sLogDir):
61 m_prev_logfile (nullptr),
62 m_enableKeepLogRecords (false),
63 m_enableConsoleOutput (enableConsoleOutput),
66 m_PTGsMustBeReInitialized (true),
74 m_closing_navigator (false),
77 m_navlogfiles_dir (sLogDir),
78 m_copy_prev_navParams (nullptr)
140 MRPT_LOG_DEBUG(
"[CAbstractPTGBasedReactive::enableLogFile] Stopping logging.");
154 unsigned int nFile = 0;
155 bool free_name =
false;
172 bool ok = fil->open(aux, 1 );
185 }
catch (std::exception &e) {
186 MRPT_LOG_ERROR_FMT(
"[CAbstractPTGBasedReactive::enableLogFile] Exception: %s",e.what());
205 case hmFULL_EVAL: className =
"CHolonomicFullEval";
break;
206 default:
THROW_EXCEPTION_FMT(
"Unknown Holonomic method: %u",
static_cast<unsigned int>(method))
227 for (
size_t i = 0; i<nPTGs; i++)
263 for (
size_t i=0;i<nPTGs;i++)
271 newLogRec.
infoPerPTG[i].ptg = mrpt::nav::CParameterizedTrajectoryGeneratorPtr ( buf.
ReadObject() );
288 if (target_changed_since_last_iteration) {
295 std::vector<CAbstractNavigator::TargetInfo> targets;
298 if (
p && !
p->multiple_targets.empty())
307 const size_t nTargets = targets.size();
316 doEmergencyStop(
"Error while loading and sorting the obstacles. Robot will be stopped.");
319 CPose2D rel_cur_pose_wrt_last_vel_cmd_NOP, rel_pose_PTG_origin_wrt_sense_NOP;
321 std::vector<mrpt::math::TPose2D>() ,
326 rel_cur_pose_wrt_last_vel_cmd_NOP,
327 rel_pose_PTG_origin_wrt_sense_NOP,
330 tim_start_iteration);
341 mrpt::math::TPose2D rel_pose_PTG_origin_wrt_sense(0,0,0),relPoseSense(0,0,0), relPoseVelCmd(0,0,0);
364 newLogRec.
values[
"timoff_obstacles"] = timoff_obstacles;
370 newLogRec.
values[
"timoff_curPoseVelAge"] = timoff_curPoseVelAge;
374 const double timoff_pose2sense = timoff_obstacles - timoff_curPoseVelAge;
376 double timoff_pose2VelCmd;
378 newLogRec.
values[
"timoff_pose2sense"] = timoff_pose2sense;
379 newLogRec.
values[
"timoff_pose2VelCmd"] = timoff_pose2VelCmd;
381 if (std::abs(timoff_pose2sense) > 1.25)
MRPT_LOG_WARN_FMT(
"timoff_pose2sense=%e is too large! Path extrapolation may be not accurate.", timoff_pose2sense);
382 if (std::abs(timoff_pose2VelCmd) > 1.25)
MRPT_LOG_WARN_FMT(
"timoff_pose2VelCmd=%e is too large! Path extrapolation may be not accurate.", timoff_pose2VelCmd);
389 rel_pose_PTG_origin_wrt_sense = relPoseVelCmd - relPoseSense;
400 for (
auto &
t : targets)
412 t.target_coords = robot_frame2map_frame +
t.target_coords;
417 std::vector<TPose2D> relTargets;
420 targets.begin(), targets.end(),
421 std::back_inserter(relTargets),
427 const double relTargetDist = relTargets.begin()->norm();
438 for (
size_t i = 0; i < nPTGs; i++) {
444 vector<TCandidateMovementPTG> candidate_movs(nPTGs+1);
446 for (
size_t indexPTG=0;indexPTG<nPTGs;indexPTG++)
453 holoMethod->setAssociatedPTG(this->
getPTG(indexPTG));
463 relTargets, rel_pose_PTG_origin_wrt_sense,
473 bool is_all_ptg_collision =
true;
474 for (
size_t indexPTG = 0; indexPTG < nPTGs; indexPTG++)
476 bool is_collision =
true;
478 for (
const auto o : obs) {
480 is_collision =
false;
485 is_all_ptg_collision =
false;
489 if (is_all_ptg_collision) {
497 bool NOP_not_too_old =
true;
498 bool NOP_not_too_close_and_have_to_slowdown =
true;
499 double NOP_max_time = -1.0, NOP_At = -1.0;
500 double slowdowndist = .0;
510 const bool can_do_nop_motion =
513 !target_changed_since_last_iteration &&
525 (NOP_not_too_close_and_have_to_slowdown =
535 if (!NOP_not_too_old) {
536 newLogRec.
additional_debug_msgs[
"PTG_cont"] =
mrpt::format(
"PTG-continuation not allowed: previous command timed-out (At=%.03f > Max_At=%.03f)", NOP_At, NOP_max_time);
538 if (!NOP_not_too_close_and_have_to_slowdown) {
539 newLogRec.
additional_debug_msgs[
"PTG_cont_trgdst"] =
mrpt::format(
"PTG-continuation not allowed: target too close and must start slow-down (trgDist=%.03f < SlowDownDist=%.03f)", relTargetDist, slowdowndist);
542 mrpt::math::TPose2D rel_cur_pose_wrt_last_vel_cmd_NOP(0,0,0), rel_pose_PTG_origin_wrt_sense_NOP(0,0,0);
544 if (can_do_nop_motion)
556 bool valid_odom, valid_pose;
561 if (valid_odom && valid_pose)
563 ASSERT_(last_sent_ptg!=
nullptr);
565 std::vector<TPose2D> relTargets_NOPs;
567 targets.begin(), targets.end(),
568 std::back_inserter(relTargets_NOPs),
581 newLogRec.
additional_debug_msgs[
"rel_cur_pose_wrt_last_vel_cmd_NOP(interp)"] = rel_cur_pose_wrt_last_vel_cmd_NOP.asString();
590 relTargets_NOPs, rel_pose_PTG_origin_wrt_sense_NOP,
596 rel_cur_pose_wrt_last_vel_cmd_NOP);
602 candidate_movs[nPTGs].speed = -0.01;
611 int best_ptg_idx =
m_multiobjopt->decide(candidate_movs, mo_info);
617 for (
unsigned int i = 0; i < newLogRec.
infoPerPTG.size(); i++) {
629 if (best_ptg_idx >= 0) {
630 selectedHolonomicMovement = &candidate_movs[best_ptg_idx];
634 const bool best_is_NOP_cmdvel = (best_ptg_idx==int(nPTGs));
639 mrpt::kinematics::CVehicleVelCmdPtr new_vel_cmd;
640 if (best_is_NOP_cmdvel)
645 doEmergencyStop(
"\nERROR calling changeSpeedsNOP()!! Stopping robot and finishing navigation\n");
654 rel_cur_pose_wrt_last_vel_cmd_NOP,
655 rel_pose_PTG_origin_wrt_sense_NOP,
658 tim_start_iteration);
666 for (
size_t i = 0; i < nPTGs; i++) {
672 double cmd_vel_speed_ratio = 1.0;
673 if (selectedHolonomicMovement)
676 cmd_vel_speed_ratio =
generate_vel_cmd(*selectedHolonomicMovement, new_vel_cmd);
680 if (!new_vel_cmd || new_vel_cmd->isStopCmd()) {
681 MRPT_LOG_DEBUG(
"Best velocity command is STOP (no way found), calling robot.stop()");
692 newLogRec.
timestamps[
"tim_send_cmd_vel"] = tim_send_cmd_vel;
695 doEmergencyStop(
"\nERROR calling changeSpeeds()!! Stopping robot and finishing navigation\n");
705 rel_cur_pose_wrt_last_vel_cmd_NOP,
706 rel_pose_PTG_origin_wrt_sense_NOP,
709 tim_start_iteration);
736 newLogRec.
values[
"timoff_sendVelCmd"] = timoff_sendVelCmd;
767 "T=%.01lfms Exec:%.01lfms|%.01lfms "
769 new_vel_cmd ? new_vel_cmd->asString().c_str() :
"NOP",
770 selectedHolonomicMovement ? selectedHolonomicMovement->
speed : .0,
785 rel_cur_pose_wrt_last_vel_cmd_NOP,
786 rel_pose_PTG_origin_wrt_sense_NOP,
789 tim_start_iteration);
792 catch (std::exception &e) {
796 doEmergencyStop(
"[CAbstractPTGBasedReactive::performNavigationStep] Stopping robot and finishing navigation due to untyped exception." );
801 void CAbstractPTGBasedReactive::STEP8_GenerateLogRecord(
CLogFileRecord &newLogRec,
const std::vector<TPose2D>& relTargets,
int nSelectedPTG,
const mrpt::kinematics::CVehicleVelCmdPtr &new_vel_cmd,
const int nPTGs,
const bool best_is_NOP_cmdvel,
const mrpt::math::TPose2D &rel_cur_pose_wrt_last_vel_cmd_NOP,
const mrpt::math::TPose2D &rel_pose_PTG_origin_wrt_sense_NOP,
const double executionTimeValue,
const double tim_changeSpeed,
const mrpt::system::TTimeStamp &tim_start_iteration)
816 newLogRec.
cmd_vel = new_vel_cmd;
818 newLogRec.
values[
"executionTime"] = executionTimeValue;
820 newLogRec.
values[
"time_changeSpeeds()"] = tim_changeSpeed;
824 newLogRec.
timestamps[
"tim_start_iteration"] = tim_start_iteration;
826 newLogRec.
nPTGs = nPTGs;
847 if (
m_logFile) (*m_logFile) << newLogRec;
858 const std::vector<double> & in_TPObstacles,
860 const std::vector<mrpt::math::TPose2D> & WS_Targets,
861 const std::vector<CAbstractPTGBasedReactive::PTGTarget> & TP_Targets,
864 const bool this_is_PTG_continuation,
866 const unsigned int ptg_idx4weights,
868 const mrpt::nav::CHolonomicLogFileRecordPtr &hlfr)
881 size_t selected_trg_idx = 0;
883 double best_trg_angdist = std::numeric_limits<double>::max();
884 for (
size_t i = 0; i < TP_Targets.size(); i++)
887 if (angdist < best_trg_angdist) {
888 best_trg_angdist = angdist;
889 selected_trg_idx = i;
893 ASSERT_(selected_trg_idx<WS_Targets.size());
894 const auto WS_Target = WS_Targets[selected_trg_idx];
895 const auto TP_Target = TP_Targets[selected_trg_idx];
897 const double target_d_norm = TP_Target.target_dist;
901 const double target_WS_d = WS_Target.norm();
904 const double d =
std::min( in_TPObstacles[ move_k ], 0.99*target_d_norm);
922 const double f =
std::min(1.0,Vf + target_WS_d*(1.0-Vf)/TARGET_SLOW_APPROACHING_DISTANCE);
930 cm.
props[
"ptg_idx"] = ptg_idx4weights;
931 cm.
props[
"ref_dist"] = ref_dist;
932 cm.
props[
"target_dir"] = TP_Target.target_alpha;
933 cm.
props[
"target_k"] = TP_Target.target_k;
934 cm.
props[
"target_d_norm"] = target_d_norm;
935 cm.
props[
"move_k"] = move_k;
936 double & move_cur_d = cm.
props[
"move_cur_d"] = 0;
937 cm.
props[
"is_PTG_cont"] = this_is_PTG_continuation ? 1 : 0;
938 cm.
props[
"num_paths"] = in_TPObstacles.size();
939 cm.
props[
"WS_target_x"] = WS_Target.x;
940 cm.
props[
"WS_target_y"] = WS_Target.y;
941 cm.
props[
"robpose_x"] = pose.
x;
942 cm.
props[
"robpose_y"] = pose.
y;
945 const bool is_slowdown =
946 this_is_PTG_continuation ?
950 cm.
props[
"is_slowdown"] = is_slowdown ? 1:0;
951 cm.
props[
"holo_stage_eval"] =
952 this_is_PTG_continuation ?
955 (hlfr && !hlfr->dirs_eval.empty() && hlfr->dirs_eval.rbegin()->size() == in_TPObstacles.size()) ? hlfr->dirs_eval.rbegin()->at(move_k) : .0
960 double & colfree = cm.
props[
"collision_free_distance"];
963 colfree = in_TPObstacles[move_k];
968 if (this_is_PTG_continuation)
971 double cur_norm_d=.0;
972 bool is_exact, is_time_based =
false;
977 if (std::abs(rel_cur_pose_wrt_last_vel_cmd_NOP.
x) > maxD || std::abs(rel_cur_pose_wrt_last_vel_cmd_NOP.
y) > maxD) {
978 is_exact = cm.
PTG->
inverseMap_WS2TP(rel_cur_pose_wrt_last_vel_cmd_NOP.
x, rel_cur_pose_wrt_last_vel_cmd_NOP.
y, cur_k, cur_norm_d);
982 is_time_based =
true;
1002 newLogRec.
additional_debug_msgs[
"PTG_eval"] =
"PTG-continuation not allowed, cur. pose out of PTG domain.";
1005 bool WS_point_is_unique =
true;
1013 WS_point_is_unique = WS_point_is_unique && cm.
PTG->
isBijectiveAt(move_k, predicted_step);
1014 newLogRec.
additional_debug_msgs[
"PTG_eval.bijective"] =
mrpt::format(
"isBijectiveAt(): k=%i step=%i -> %s", (
int)cur_k, (
int)cur_ptg_step, WS_point_is_unique ?
"yes" :
"no");
1016 if (!WS_point_is_unique)
1020 cur_ptg_step = predicted_step;
1039 (!is_slowdown || (target_d_norm - cur_norm_d)*ref_dist>2.0 )
1043 newLogRec.
additional_debug_msgs[
"PTG_eval"] =
"PTG-continuation not allowed, mismatchDistance above threshold.";
1049 newLogRec.
additional_debug_msgs[
"PTG_eval"] =
"PTG-continuation not allowed, couldn't get PTG step for cur. robot pose.";
1059 colfree = WS_point_is_unique ?
1060 std::min(in_TPObstacles[move_k], in_TPObstacles[cur_k])
1062 in_TPObstacles[move_k];
1065 if (colfree < 0.99) {
1066 colfree -= cur_norm_d;
1070 move_cur_d = cur_norm_d;
1080 typedef std::map<double, double> map_d2d_t;
1081 map_d2d_t pathDists;
1083 const int num_steps = ceil( D * 2.0);
1084 for (
int i = 0; i < num_steps; i++) {
1085 pathDists[i / double(num_steps)] = 100.0;
1090 const auto it = std::min_element(
1091 pathDists.begin(), pathDists.end(),
1092 [colfree](map_d2d_t::value_type& l, map_d2d_t::value_type&
r) ->
bool {
1093 return (l.second < r.second) && l.first<colfree;
1101 double &hysteresis = cm.
props[
"hysteresis"];
1106 hysteresis = this_is_PTG_continuation ? 1.0 : 0.;
1110 mrpt::kinematics::CVehicleVelCmdPtr desired_cmd;
1114 if(
typeid(*ptr1) ==
typeid(*ptr2)){
1117 double simil_score = 0.5;
1118 for (
size_t i = 0; i < desired_cmd->getVelCmdLength(); i++)
1120 const double scr = exp(-std::abs(desired_cmd->getVelCmdElement(i) -
m_last_vel_cmd->getVelCmdElement(i)) / 0.20);
1123 hysteresis = simil_score;
1130 double &clearance = cm.
props[
"clearance"];
1131 clearance = in_clearance.
getClearance(move_k, target_d_norm*1.01,
false );
1132 cm.
props[
"clearance_50p"] = in_clearance.
getClearance(move_k, target_d_norm*0.5,
false );
1133 cm.
props[
"clearance_path"] = in_clearance.
getClearance(move_k, target_d_norm*0.9,
true );
1134 cm.
props[
"clearance_path_50p"] = in_clearance.
getClearance(move_k, target_d_norm*0.5,
true );
1138 double &eta = cm.
props[
"eta"];
1143 const double path_len_meters = d * ref_dist;
1153 double discount_time = .0;
1154 if (this_is_PTG_continuation)
1161 eta -= discount_time;
1171 double cmdvel_speed_scale = 1.0;
1174 if (in_movement.
speed == 0)
1178 new_vel_cmd->setToStop();
1186 new_vel_cmd->cmdVel_scale(in_movement.
speed);
1187 cmdvel_speed_scale *= in_movement.
speed;
1199 catch (std::exception &e)
1203 return cmdvel_speed_scale;
1217 for (
size_t i=0;i<N;i++)
1221 const std::vector<double> & tp_obs =
m_infoPerPTG[i].TP_Obstacles;
1228 if (!is_into_domain)
1231 ASSERT_(wp_k<
int(tp_obs.size()));
1233 const double collision_free_dist = tp_obs[wp_k];
1234 if (collision_free_dist>1.01*wp_norm_d)
1262 ptg_alpha_index = -1;
1265 colfreedist_move_k = .0;
1266 was_slowdown =
false;
1269 original_holo_eval = .0;
1279 const size_t indexPTG,
1280 const std::vector<mrpt::math::TPose2D> &relTargets,
1285 const bool this_is_PTG_continuation,
1294 const size_t idx_in_log_infoPerPTGs = this_is_PTG_continuation ?
getPTG_count() : indexPTG;
1296 CHolonomicLogFileRecordPtr HLFR;
1301 bool use_this_ptg =
true;
1306 use_this_ptg =
false;
1309 use_this_ptg =
true;
1314 double timeForTPObsTransformation = .0, timeForHolonomicMethod = .0;
1317 bool any_TPTarget_is_valid =
false;
1320 for (
size_t i=0;i<relTargets.size();i++)
1322 const auto & trg = relTargets[i];
1326 if (!ptg_target.
valid_TP)
continue;
1328 any_TPTarget_is_valid =
true;
1333 ipf.
targets.emplace_back(ptg_target);
1337 if (!any_TPTarget_is_valid)
1339 newLogRec.
additional_debug_msgs[
mrpt::format(
"mov_candidate_%u",
static_cast<unsigned int>(indexPTG))] =
"PTG discarded since target(s) is(are) out of domain.";
1369 for (
size_t i = 0; i < Ki; i++) ipf.
TP_Obstacles[i] *= _refD;
1371 timeForTPObsTransformation =
tictac.
Tac();
1378 if (!this_is_PTG_continuation)
1394 for (
const auto &
t : ipf.
targets) {
1395 ni.
targets.push_back(
t.TP_Target );
1410 double obsFreeNormalizedDistance = ipf.
TP_Obstacles[kDirection];
1416 obsFreeNormalizedDistance =
std::min(obsFreeNormalizedDistance, std::max(0.90, obsFreeNormalizedDistance - d) );
1419 double velScale = 1.0;
1429 cm.
speed *= velScale;
1453 newLogRec.
infoPerPTG[idx_in_log_infoPerPTGs], newLogRec,
1454 this_is_PTG_continuation, rel_cur_pose_wrt_last_vel_cmd_NOP,
1456 tim_start_iteration,
1460 cm.
props[
"original_col_free_dist"] =
1461 this_is_PTG_continuation ?
1474 if (fill_log_record)
1477 if (!this_is_PTG_continuation)
1484 for (
const auto &
t : ipf.
targets) {
1499 robot_absolute_speed_limits.loadConfigFile(
c,
s);
1519 robot_absolute_speed_limits.saveToConfigFile(
c,
s);
1522 string lstHoloStr =
"# List of known classes:\n";
1525 for (
const auto &
c : lst)
1528 MRPT_SAVE_CONFIG_VAR_COMMENT(holonomic_method,
string(
"C++ class name of the holonomic navigation method to run in the transformed TP-Space.\n")+ lstHoloStr);
1531 string lstDecidersStr =
"# List of known classes:\n";
1534 for (
const auto &
c : lst)
1540 MRPT_SAVE_CONFIG_VAR_COMMENT(speedfilter_tau,
"Time constant (in seconds) for the low-pass filter applied to kinematic velocity commands (default=0: no filtering)");
1541 MRPT_SAVE_CONFIG_VAR_COMMENT(secure_distance_start,
"In normalized distance [0,1], start/end of a ramp function that scales the holonomic navigator output velocity.");
1542 MRPT_SAVE_CONFIG_VAR_COMMENT(secure_distance_end,
"In normalized distance [0,1], start/end of a ramp function that scales the holonomic navigator output velocity.");
1544 MRPT_SAVE_CONFIG_VAR_COMMENT(max_distance_predicted_actual_path,
"Max distance [meters] to discard current PTG and issue a new vel cmd (default= 0.05)");
1545 MRPT_SAVE_CONFIG_VAR_COMMENT(min_normalized_free_space_for_ptg_continuation,
"Min normalized dist [0,1] after current pose in a PTG continuation to allow it.");
1548 MRPT_SAVE_CONFIG_VAR_COMMENT(max_dist_for_timebased_path_prediction,
"Max dist [meters] to use time-based path prediction for NOP evaluation");
1553 ptg_cache_files_directory(
"."),
1555 speedfilter_tau(0.0),
1556 secure_distance_start(0.05),
1557 secure_distance_end(0.20),
1558 use_delays_model(false),
1559 max_distance_predicted_actual_path(0.15),
1560 min_normalized_free_space_for_ptg_continuation(0.2),
1561 robot_absolute_speed_limits(),
1562 enable_obstacle_filtering(true),
1563 evaluate_clearance(false),
1564 max_dist_for_timebased_path_prediction(2.0)
1584 filter->options.loadFromConfigFile(
c,
"CPointCloudFilterByDistance");
1617 filter.options.saveToConfigFile(
c,
"CPointCloudFilterByDistance");
1630 for (
const auto &cl : lst) {
1649 for (
const auto &cl : lst) {
1662 o->setTargetApproachSlowDownDistance(dist);
static std::string holoMethodEnum2ClassName(const THolonomicMethod method)
const double ESTIM_LOWPASSFILTER_ALPHA
#define MRPT_SAVE_CONFIG_VAR_COMMENT(variableName, __comment)
#define MRPT_LOAD_CONFIG_VAR_REQUIRED_CS(variableName, variableType)
Shortcut for MRPT_LOAD_CONFIG_VAR_NO_DEFAULT() for REQUIRED variables config file object named c and ...
#define MRPT_LOAD_CONFIG_VAR_CS(variableName, variableType)
Shortcut for MRPT_LOAD_CONFIG_VAR() for config file object named c and section string named s
#define CLASS_ID(class_name)
Access to runtime class ID for a defined class name.
#define MRPT_LOG_ERROR_STREAM(__CONTENTS)
#define MRPT_LOG_DEBUG_FMT(_FMT_STRING,...)
#define MRPT_LOG_WARN_FMT(_FMT_STRING,...)
#define MRPT_LOG_DEBUG(_STRING)
#define MRPT_LOG_ERROR_FMT(_FMT_STRING,...)
Virtual base for velocity commands of different kinematic models of planar mobile robot.
Implementation of pointcloud filtering based on requisities for minimum neigbouring points in both,...
A base class for holonomic reactive navigation methods.
virtual void saveConfigFile(mrpt::utils::CConfigFileBase &c) const =0
saves all available parameters, in a forma loadable by initialize()
virtual void navigate(const NavInput &ni, NavOutput &no)=0
Invokes the holonomic navigation algorithm itself.
static CAbstractHolonomicReactiveMethod * Create(const std::string &className) MRPT_NO_THROWS
Class factory from class name, e.g.
void enableApproachTargetSlowDown(bool enable)
virtual double getTargetApproachSlowDownDistance() const =0
Returns the actual value of this parameter [m], as set via the children class options structure.
mrpt::poses::CPose2DInterpolator m_latestOdomPoses
Latest robot poses (updated in CAbstractNavigator::navigationStep() )
std::list< TPendingEvent > m_pending_events
Events generated during navigationStep(), enqueued to be called at the end of the method execution to...
mrpt::synch::CCriticalSectionRecursive m_nav_cs
mutex for all navigation methods
CRobot2NavInterface & m_robot
The navigator-robot interface.
virtual void doEmergencyStop(const std::string &msg)
Stops the robot and set navigation state to error.
mrpt::utils::CTimeLogger m_timlog_delays
Time logger to collect delay-related stats.
TNavigationParams * m_navigationParams
Current navigation parameters.
virtual bool changeSpeedsNOP()
Default: forward call to m_robot.changeSpeedsNOP(). Can be overriden.
TRobotPoseVel m_curPoseVel
Current robot pose (updated in CAbstractNavigator::navigationStep() )
virtual bool stop(bool isEmergencyStop)
Default: forward call to m_robot.stop(). Can be overriden.
virtual bool changeSpeeds(const mrpt::kinematics::CVehicleVelCmd &vel_cmd)
Default: forward call to m_robot.changeSpeed(). Can be overriden.
mrpt::poses::CPose2DInterpolator m_latestPoses
mrpt::poses::FrameTransformer< 2 > * m_frame_tf
Optional, user-provided frame transformer.
double m_last_curPoseVelUpdate_robot_time
bool m_enableKeepLogRecords
See enableKeepLogRecords.
mrpt::math::LowPassFilter_IIR1 timoff_obstacles_avr
bool m_enableConsoleOutput
Enables / disables the console debug output.
virtual void loggingGetWSObstaclesAndShape(CLogFileRecord &out_log)=0
Generates a pointcloud of obstacles, and the robot shape, to be saved in the logging record for the c...
void calc_move_candidate_scores(TCandidateMovementPTG &holonomicMovement, const std::vector< double > &in_TPObstacles, const mrpt::nav::ClearanceDiagram &in_clearance, const std::vector< mrpt::math::TPose2D > &WS_Targets, const std::vector< PTGTarget > &TP_Targets, CLogFileRecord::TInfoPerPTG &log, CLogFileRecord &newLogRec, const bool this_is_PTG_continuation, const mrpt::math::TPose2D &relPoseVelCmd_NOP, const unsigned int ptg_idx4weights, const mrpt::system::TTimeStamp tim_start_iteration, const mrpt::nav::CHolonomicLogFileRecordPtr &hlfr)
Scores holonomicMovement.
CLogFileRecord lastLogRecord
The last log.
TNavigationParams * m_copy_prev_navParams
A copy of last-iteration navparams, used to detect changes.
void deleteHolonomicObjects()
Delete m_holonomicMethod.
mrpt::utils::CTicTac executionTime
void preDestructor()
To be called during children destructors to assure thread-safe destruction, and free of shared object...
virtual void STEP1_InitPTGs()=0
mrpt::math::LowPassFilter_IIR1 timoff_curPoseAndSpeed_avr
virtual bool implementSenseObstacles(mrpt::system::TTimeStamp &obs_timestamp)=0
Return false on any fatal error.
virtual ~CAbstractPTGBasedReactive()
bool m_init_done
Whether loadConfigFile() has been called or not.
mrpt::system::TTimeStamp m_infoPerPTG_timestamp
mrpt::system::TTimeStamp m_WS_Obstacles_timestamp
std::vector< CAbstractHolonomicReactiveMethod * > m_holonomicMethod
The holonomic navigation algorithm (one object per PTG, so internal states are maintained)
TAbstractPTGNavigatorParams params_abstract_ptg_navigator
mrpt::math::LowPassFilter_IIR1 timoff_sendVelCmd_avr
bool m_closing_navigator
Signal that the destructor has been called, so no more calls are accepted from other threads.
mrpt::utils::CTicTac totalExecutionTime
mrpt::kinematics::CVehicleVelCmdPtr m_last_vel_cmd
Last velocity commands.
bool m_PTGsMustBeReInitialized
virtual void onStartNewNavigation() MRPT_OVERRIDE
Called whenever a new navigation has been started.
void build_movement_candidate(CParameterizedTrajectoryGenerator *ptg, const size_t indexPTG, const std::vector< mrpt::math::TPose2D > &relTargets, const mrpt::math::TPose2D &rel_pose_PTG_origin_wrt_sense, TInfoPerPTG &ipf, TCandidateMovementPTG &holonomicMovement, CLogFileRecord &newLogRec, const bool this_is_PTG_continuation, mrpt::nav::CAbstractHolonomicReactiveMethod *holoMethod, const mrpt::system::TTimeStamp tim_start_iteration, const TNavigationParams &navp=TNavigationParams(), const mrpt::math::TPose2D &relPoseVelCmd_NOP=mrpt::poses::CPose2D())
virtual bool impl_waypoint_is_reachable(const mrpt::math::TPoint2D &wp_local_wrt_robot) const MRPT_OVERRIDE
Implements the way to waypoint is free function in children classes: true must be returned if,...
virtual size_t getPTG_count() const =0
Returns the number of different PTGs that have been setup.
mrpt::utils::CStream * m_prev_logfile
The current log file stream, or NULL if not being used.
virtual void saveConfigFile(mrpt::utils::CConfigFileBase &c) const MRPT_OVERRIDE
Saves all current options to a config file.
mrpt::utils::CStream * m_logFile
mrpt::utils::CTicTac timerForExecutionPeriod
void initialize() MRPT_OVERRIDE
Must be called for loading collision grids, or the first navigation command may last a long time to b...
void STEP8_GenerateLogRecord(CLogFileRecord &newLogRec, const std::vector< mrpt::math::TPose2D > &relTargets, int nSelectedPTG, const mrpt::kinematics::CVehicleVelCmdPtr &new_vel_cmd, int nPTGs, const bool best_is_NOP_cmdvel, const math::TPose2D &rel_cur_pose_wrt_last_vel_cmd_NOP, const math::TPose2D &rel_pose_PTG_origin_wrt_sense_NOP, const double executionTimeValue, const double tim_changeSpeed, const mrpt::system::TTimeStamp &tim_start_iteration)
mrpt::math::LowPassFilter_IIR1 tim_changeSpeed_avr
mrpt::math::LowPassFilter_IIR1 meanExecutionTime
bool STEP2_SenseObstacles()
virtual void performNavigationStep() MRPT_OVERRIDE
The main method for the navigator.
virtual void loadConfigFile(const mrpt::utils::CConfigFileBase &c) MRPT_OVERRIDE
Loads all params from a file.
double getTargetApproachSlowDownDistance() const
Returns this parameter for the first inner holonomic navigator instances [m] (should be the same in a...
virtual CParameterizedTrajectoryGenerator * getPTG(size_t i)=0
Gets the i'th PTG.
void getLastLogRecord(CLogFileRecord &o)
Provides a copy of the last log record with information about execution.
void setHolonomicMethod(const std::string &method, const mrpt::utils::CConfigFileBase &cfgBase)
Selects which one from the set of available holonomic methods will be used into transformed TP-Space,...
std::vector< TInfoPerPTG > m_infoPerPTG
Temporary buffers for working with each PTG during a navigationStep()
mrpt::utils::CTicTac tictac
virtual void STEP3_WSpaceToTPSpace(const size_t ptg_idx, std::vector< double > &out_TPObstacles, mrpt::nav::ClearanceDiagram &out_clearance, const mrpt::math::TPose2D &rel_pose_PTG_origin_wrt_sense, const bool eval_clearance)=0
Builds TP-Obstacles from Workspace obstacles for the given PTG.
TSentVelCmd m_lastSentVelCmd
mrpt::math::LowPassFilter_IIR1 meanExecutionPeriod
Runtime estimation of execution period of the method.
mrpt::utils::CTimeLogger m_timelogger
A complete time logger.
mrpt::maps::CPointCloudFilterBasePtr m_WS_filter
Default: none.
virtual double generate_vel_cmd(const TCandidateMovementPTG &in_movement, mrpt::kinematics::CVehicleVelCmdPtr &new_vel_cmd)
Return the [0,1] velocity scale of raw PTG cmd_vel.
mrpt::math::LowPassFilter_IIR1 meanTotalExecutionTime
mrpt::nav::CMultiObjectiveMotionOptimizerBasePtr m_multiobjopt
void setTargetApproachSlowDownDistance(const double dist)
Changes this parameter in all inner holonomic navigator instances [m].
mrpt::synch::CCriticalSectionRecursive m_critZoneLastLog
Critical zones.
virtual CAbstractHolonomicReactiveMethod * getHoloMethod(int idx)
void enableLogFile(bool enable)
Enables/disables saving log files.
std::string m_navlogfiles_dir
Default: "./reactivenav.logs".
static CLogFileRecord_VFFPtr Create()
A class for storing, saving and loading a reactive navigation log record for the CReactiveNavigationS...
std::map< std::string, double > values
Known values:
mrpt::math::TPose2D relPoseVelCmd
mrpt::math::TPose2D relPoseSense
uint32_t nPTGs
The number of PTGS:
int32_t nSelectedPTG
The selected PTG.
std::vector< mrpt::math::TPose2D > WS_targets_relative
Relative poses (wrt to robotPoseLocalization) for extrapolated paths at two instants: time of obstacl...
mrpt::nav::CParameterizedTrajectoryGenerator::TNavDynamicState ptg_last_navDynState
mrpt::math::TPose2D robotPoseLocalization
mrpt::math::TTwist2D cur_vel_local
The actual robot velocities in local (robot) coordinates, as read from sensors, in "m/sec" and "rad/s...
mrpt::nav::CParameterizedTrajectoryGenerator::TNavDynamicState navDynState
std::map< std::string, std::string > additional_debug_msgs
Additional debug traces.
int16_t ptg_index_NOP
Negative means no NOP mode evaluation, so the rest of "NOP variables" should be ignored.
mrpt::aligned_containers< TInfoPerPTG >::vector_t infoPerPTG
The info for each applied PTG: must contain "nPTGs * nSecDistances" elements.
mrpt::math::TPose2D robotPoseOdometry
The robot pose (from odometry and from the localization/SLAM system).
mrpt::math::TPose2D rel_pose_PTG_origin_wrt_sense_NOP
mrpt::math::TPose2D rel_cur_pose_wrt_last_vel_cmd_NOP
mrpt::kinematics::CVehicleVelCmdPtr cmd_vel
The final motion command sent to robot, in "m/sec" and "rad/sec".
mrpt::math::TTwist2D cur_vel
The actual robot velocities in global (map) coordinates, as read from sensors, in "m/sec" and "rad/se...
std::map< std::string, mrpt::system::TTimeStamp > timestamps
Known values:
Virtual base class for multi-objective motion choosers, as used for reactive navigation engines.
static CMultiObjectiveMotionOptimizerBase * Create(const std::string &className) MRPT_NO_THROWS
Class factory from C++ class name.
virtual void saveConfigFile(mrpt::utils::CConfigFileBase &c) const =0
This is the base class for any user-defined PTG.
virtual double getPathStepDuration() const =0
Returns the duration (in seconds) of each "step".
uint16_t alpha2index(double alpha) const
Discrete index value for the corresponding alpha value.
virtual void getPathPose(uint16_t k, uint32_t step, mrpt::math::TPose2D &p) const =0
Access path k ([0,N-1]=>[-pi,pi] in alpha): pose of the vehicle at discrete step step.
uint16_t getPathCount() const
Get the number of different, discrete paths in this family.
virtual mrpt::kinematics::CVehicleVelCmdPtr getSupportedKinematicVelocityCommand() const =0
Returns an empty kinematic velocity command object of the type supported by this PTG.
void initClearanceDiagram(ClearanceDiagram &cd) const
Must be called to resize a CD to its correct size, before calling updateClearance()
virtual bool inverseMap_WS2TP(double x, double y, int &out_k, double &out_normalized_d, double tolerance_dist=0.10) const =0
Computes the closest (alpha,d) TP coordinates of the trajectory point closest to the Workspace (WS) C...
double getScorePriority() const
When used in path planning, a multiplying factor (default=1.0) for the scores for this PTG.
virtual std::string getDescription() const =0
Gets a short textual description of the PTG and its parameters.
void initTPObstacles(std::vector< double > &TP_Obstacles) const
Resizes and populates the initial appropriate contents in a vector of tp-obstacles (collision-free ra...
double getRefDistance() const
virtual bool supportSpeedAtTarget() const
Returns true if this PTG takes into account the desired velocity at target.
virtual void evalClearanceSingleObstacle(const double ox, const double oy, const uint16_t k, ClearanceDiagram::dist2clearance_t &inout_realdist2clearance, bool treat_as_obstacle=true) const
Evals the robot clearance for each robot pose along path k, for the real distances in the key of the ...
double index2alpha(uint16_t k) const
Alpha value for the discrete corresponding value.
virtual bool getPathStepForDist(uint16_t k, double dist, uint32_t &out_step) const =0
Access path k ([0,N-1]=>[-pi,pi] in alpha): largest step count for which the traversed distance is < ...
virtual bool supportVelCmdNOP() const
Returns true if it is possible to stop sending velocity commands to the robot and,...
virtual bool isBijectiveAt(uint16_t k, uint32_t step) const
Returns true if a given TP-Space point maps to a unique point in Workspace, and viceversa.
virtual double getPathDist(uint16_t k, uint32_t step) const =0
Access path k ([0,N-1]=>[-pi,pi] in alpha): traversed distance at discrete step step.
virtual mrpt::kinematics::CVehicleVelCmdPtr directionToMotionCommand(uint16_t k) const =0
Converts a discretized "alpha" value into a feasible motion command or action.
uint16_t getAlphaValuesCount() const
Get the number of different, discrete paths in this family.
virtual double evalPathRelativePriority(uint16_t k, double target_distance) const
Query the PTG for the relative priority factor (0,1) of this PTG, in comparison to others,...
virtual double maxTimeInVelCmdNOP(int path_k) const
Only for PTGs supporting supportVelCmdNOP(): this is the maximum time (in seconds) for which the path...
void updateClearancePost(ClearanceDiagram &cd, const std::vector< double > &TP_obstacles) const
void updateNavDynamicState(const TNavDynamicState &newState, const bool force_update=false)
To be invoked by the navigator before each navigation step, to let the PTG to react to changing dynam...
The pure virtual interface between a real or simulated robot and any CAbstractNavigator-derived class...
virtual mrpt::kinematics::CVehicleVelCmdPtr getEmergencyStopCmd()=0
Gets the emergency stop command for the current robot.
virtual void sendApparentCollisionEvent()
Callback: Apparent collision event (i.e.
This class extends CAbstractNavigator with the capability of following a list of waypoints.
virtual void loadConfigFile(const mrpt::utils::CConfigFileBase &c) MRPT_OVERRIDE
Loads all params from a file.
virtual void saveConfigFile(mrpt::utils::CConfigFileBase &c) const MRPT_OVERRIDE
Saves all current options to a config file.
virtual void onStartNewNavigation() MRPT_OVERRIDE
Called whenever a new navigation has been started.
Clearance information for one particular PTG and one set of obstacles.
double getClearance(uint16_t k, double TPS_query_distance, bool integrate_over_path) const
Gets the clearance for path k and distance TPS_query_distance in one of two modes:
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle.
pose_t & interpolate(mrpt::system::TTimeStamp t, pose_t &out_interp, bool &out_valid_interp) const
Returns the pose at a given time, or interpolates using splines if there is not an exact match.
A class acquiring a CCriticalSection at its constructor, and releasing it at destructor.
void leave() const MRPT_OVERRIDE
Leave.
void enter() const MRPT_OVERRIDE
Enter.
This class allows loading and storing values and vectors of different types from a configuration text...
This CStream derived class allow using a memory buffer as a CStream.
uint64_t Seek(int64_t Offset, CStream::TSeekOrigin Origin=sFromBeginning) MRPT_OVERRIDE
Introduces a pure virtual method for moving to a specified position in the streamed resource.
CSerializablePtr ReadObject()
Reads an object from stream, its class determined at runtime, and returns a smart pointer to the obje...
double Tac()
Stops the stopwatch.
void Tic()
Starts the stopwatch.
void enter(const char *func_name)
Start of a named section.
void registerUserMeasure(const char *event_name, const double value)
double getLastTime(const std::string &name) const
Return the last execution time of the given "section", or 0 if it hasn't ever been called "enter" wit...
double leave(const char *func_name)
End of a named section.
#define INVALID_TIMESTAMP
Represents an invalid timestamp, where applicable.
GLuint GLenum GLenum transform
GLsizei GLsizei GLuint * obj
GLdouble GLdouble GLdouble r
GLsizei const GLchar ** string
T angDistance(T from, T to)
Computes the shortest angular increment (or distance) between two planar orientations,...
bool BASE_IMPEXP createDirectory(const std::string &dirName)
Creates a directory.
bool BASE_IMPEXP directoryExists(const std::string &fileName)
Test if a given directory exists (it fails if the given path refers to an existing file).
bool BASE_IMPEXP fileExists(const std::string &fileName)
Test if a given file (or directory) exists.
std::vector< const TRuntimeClassId * > BASE_IMPEXP getAllRegisteredClassesChildrenOf(const TRuntimeClassId *parent_id)
Like getAllRegisteredClasses(), but filters the list to only include children clases of a given base ...
#define CFileGZOutputStream
Saves data to a file and transparently compress the data using the given compression level.
struct BASE_IMPEXP CObjectPtr
A smart pointer to a CObject object.
int round(const T value)
Returns the closer integer (int) to x.
int BASE_IMPEXP sprintf(char *buf, size_t bufSize, const char *format,...) MRPT_NO_THROWS MRPT_printf_format_check(3
An OS-independent version of sprintf (Notice the bufSize param, which may be ignored in some compiler...
THolonomicMethod
The implemented reactive navigation methods.
@ hmSEARCH_FOR_BEST_GAP
CHolonomicND.
@ hmVIRTUAL_FORCE_FIELDS
CHolonomicVFF.
@ hmFULL_EVAL
CHolonomicFullEval.
void copy_container_typecasting(const src_container &src, dst_container &trg)
Copy all the elements in a container (vector, deque, list) into a different one performing the approp...
uint64_t TTimeStamp
A system independent time type, it holds the the number of 100-nanosecond intervals since January 1,...
mrpt::system::TTimeStamp BASE_IMPEXP timestampAdd(const mrpt::system::TTimeStamp tim, const double num_seconds)
Shifts a timestamp the given amount of seconds (>0: forwards in time, <0: backwards)
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
double BASE_IMPEXP 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.
#define ASSERT_EQUAL_(__A, __B)
#define THROW_EXCEPTION(msg)
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
std::shared_ptr< CPointCloudFilterBase > CPointCloudFilterBasePtr
This base provides a set of functions for maths stuff.
T hypot_fast(const T x, const T y)
Faster version of std::hypot(), to use when overflow is not an issue and we prefer fast code.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...
std::string sprintf_vector(const char *fmt, const std::vector< T > &V)
Generates a string for a vector in the format [A,B,C,...] to std::cout, and the fmt string for each v...
void delete_safe(T *&ptr)
Calls "delete" to free an object only if the pointer is not NULL, then set the pointer to NULL.
void keep_min(T &var, const K test_val)
If the second argument is below the first one, set the first argument to this lower value.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string BASE_IMPEXP format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
This file implements several operations that operate element-wise on individual or pairs of container...
unsigned __int32 uint32_t
double getLastOutput() const
double filter(double x)
Processes one input sample, updates the filter state and return the filtered value.
double phi
Orientation (rads)
void asString(std::string &s) const
Returns a human-readable textual representation of the object (eg: "[x y yaw]", yaw in degrees)
double vy
Velocity components: X,Y (m/s)
Output for CAbstractHolonomicReactiveMethod::navigate()
CHolonomicLogFileRecordPtr logRecord
The navigation method will create a log record and store it here via a smart pointer.
double desiredDirection
The desired motion direction, in the range [-PI, PI].
double desiredSpeed
The desired motion speed in that direction, from 0 up to NavInput::maxRobotSpeed.
Base for all high-level navigation commands.
The struct for configuring navigation requests.
virtual TNavigationParams * clone() const
TargetInfo target
Navigation target.
functor_event_void_t event_noargs
event w/o arguments
mrpt::math::TPose2D rawOdometry
raw odometry (frame does not match to "pose", but is expected to be smoother in the short term).
mrpt::system::TTimeStamp timestamp
mrpt::math::TTwist2D velLocal
std::string pose_frame_id
map frame ID for pose
mrpt::math::TTwist2D velGlobal
Individual target info in CAbstractNavigator::TNavigationParamsBase and derived classes.
double targetDesiredRelSpeed
(Default=.05) Desired relative speed (wrt maximum speed), in range [0,1], of the vehicle at target....
double target_dist
TP-Target.
int target_k
The discrete version of target_alpha.
bool valid_TP
For each PTG, whether target falls into the PTG domain.
mrpt::math::TPoint2D TP_Target
The Target, in TP-Space (x,y)
mrpt::kinematics::CVehicleVelCmd::TVelCmdParams robot_absolute_speed_limits
Params related to speed limits.
virtual void saveToConfigFile(mrpt::utils::CConfigFileBase &c, const std::string &s) const MRPT_OVERRIDE
This method saves the options to a ".ini"-like file or memory-stored string list.
double secure_distance_start
In normalized distances, the start and end of a ramp function that scales the velocity output from th...
double secure_distance_end
std::string holonomic_method
C++ class name of the holonomic navigation method to run in the transformed TP-Space.
double max_dist_for_timebased_path_prediction
Max dist [meters] to use time-based path prediction for NOP evaluation.
bool enable_obstacle_filtering
bool evaluate_clearance
Default: false.
virtual void loadFromConfigFile(const mrpt::utils::CConfigFileBase &c, const std::string &s) MRPT_OVERRIDE
This method load the options from a ".ini"-like file or memory-stored string list.
std::string motion_decider_method
C++ class name of the motion chooser.
double speedfilter_tau
Time constant (in seconds) for the low-pass filter applied to kinematic velocity commands (default=0:...
double max_distance_predicted_actual_path
Max distance [meters] to discard current PTG and issue a new vel cmd (default= 0.05)
TAbstractPTGNavigatorParams()
std::vector< PTGTarget > targets
std::vector< double > TP_Obstacles
One distance per discretized alpha value, describing the "polar plot" of TP obstacles.
ClearanceDiagram clearance
Clearance for each path.
The struct for configuring navigation requests to CAbstractPTGBasedReactive and derived classes.
std::vector< size_t > restrict_PTG_indices
(Default=empty) Optionally, a list of PTG indices can be sent such that the navigator will restrict i...
int ptg_alpha_index
Path index for selected PTG.
double original_holo_eval
double speed_scale
[0,1] scale of the raw cmd_vel as generated by the PTG
int ptg_index
0-based index of used PTG
TRobotPoseVel poseVel
Robot pose & velocities and timestamp of when it was queried.
double colfreedist_move_k
TP-Obstacles in the move direction at the instant of picking this movement.
CParameterizedTrajectoryGenerator::TNavDynamicState ptg_dynState
mrpt::system::TTimeStamp tim_send_cmd_vel
Timestamp of when the cmd was sent.
The structure used to store all relevant information about each transformation into TP-Space.
CHolonomicLogFileRecordPtr HLFR
Other useful info about holonomic method execution.
mrpt::nav::ClearanceDiagram clearance
Clearance for each path.
double desiredSpeed
The results from the holonomic method.
std::vector< mrpt::math::TPoint2D > TP_Targets
Target(s) location in TP-Space.
mrpt::math::TPoint2D TP_Robot
Robot location in TP-Space: normally (0,0), except during "NOP cmd vel" steps.
std::string PTG_desc
A short description for the applied PTG.
double timeForTPObsTransformation
double timeForHolonomicMethod
Time, in seconds.
mrpt::math::CVectorFloat TP_Obstacles
Distances until obstacles, in "pseudometers", first index for -PI direction, last one for PI directio...
std::vector< std::string > log_entries
Optionally, debug logging info will be stored here by the implementor classes.
std::vector< double > final_evaluation
The final evaluation score for each candidate.
Dynamic state that may affect the PTG path parameterization.
mrpt::math::TTwist2D curVelLocal
Current vehicle velocity (local frame of reference)
double targetRelSpeed
Desired relative speed [0,1] at target. Default=0.
mrpt::math::TPose2D relTarget
Current relative target location.
The struct for configuring navigation requests to CWaypointsNavigator and derived classes.
std::vector< mrpt::nav::CAbstractNavigator::TargetInfo > multiple_targets
If not empty, this will prevail over the base class single goal target.
Stores a candidate movement in TP-Space-based navigation.
double starting_robot_dir
double direction
TP-Space movement direction. Within [-2*PI,+2*PI].
CParameterizedTrajectoryGenerator * PTG
The associated PTG. nullptr if not applicable / undefined.
double starting_robot_dist
Default to 0, they can be used to reflect a robot starting at a position not at (0,...
mrpt::utils::TParameters< double > props
List of properties.
double speed
TP-Space movement speed, normalized to [0,1]. A negative number means this candidate movement is unfe...
A safe way to call enter() and leave() of a mrpt::utils::CTimeLogger upon construction and destructio...