22 if (!multiple_targets.empty())
24 s +=
"multiple_targets:\n";
26 for (
const auto& e : multiple_targets)
41 return o !=
nullptr &&
43 multiple_targets == o->multiple_targets;
48 m_was_aligning(false),
50 m_last_alignment_cmd(
mrpt::system::
now())
78 const size_t N = nav_request.
waypoints.size();
79 ASSERTMSG_(N > 0,
"List of waypoints is empty!");
83 for (
size_t i = 0; i < N; i++)
164 const double dist2target = robot_move_seg.
distance(wp.target);
165 if (dist2target < wp.allowed_distance ||
168 bool consider_wp_reached =
false;
171 consider_wp_reached =
true;
179 const double tim_since_last_align =
182 const double ALIGN_WAIT_TIME = 1.5;
184 if (std::abs(ang_err) <=
186 .waypoint_angle_tolerance &&
189 tim_since_last_align > ALIGN_WAIT_TIME)
191 consider_wp_reached =
true;
205 "[CWaypointsNavigator::navigationStep] "
206 "Trying to align to heading: %.02f deg. "
207 "Relative heading: %.02f deg. "
208 "With motion cmd: %s",
211 align_cmd ? align_cmd->asString().c_str()
212 :
"nullptr (operation not "
213 "supported by this robot)");
225 consider_wp_reached =
234 "[CWaypointsNavigator::navigationStep] "
235 "Waiting for the robot to get aligned: "
236 "current_heading=%.02f deg "
237 "target_heading=%.02f deg",
244 if (consider_wp_reached)
247 "[CWaypointsNavigator::navigationStep] Waypoint "
251 " segment-to-target dist: "
253 <<
", allowed_dist: " << wp.allowed_distance);
293 const int most_advanced_wp_at_begin = most_advanced_wp;
298 if (idx < 0)
continue;
299 if (wps.
waypoints[idx].reached)
continue;
304 wps.
waypoints[idx].target, wp_local_wrt_robot);
307 .max_distance_to_allow_skip_waypoint > 0 &&
308 wp_local_wrt_robot.
norm() >
313 const bool is_reachable =
321 if (++wps.
waypoints[idx].counter_seen_reachable >
325 most_advanced_wp = idx;
335 if (most_advanced_wp >= 0)
338 for (
int k = most_advanced_wp_at_begin;
339 k < most_advanced_wp; k++)
384 wp_last_idx < int(wps.
waypoints.size()) - 1 &&
395 wp_idx <= wp_last_idx; wp_idx++)
398 const bool is_final_wp =
399 ((wp_idx + 1) ==
int(wps.
waypoints.size()));
432 "[CWaypointsNavigator::navigationStep] Active waypoint "
433 "changed. Current status:\n"
516 max_distance_to_allow_skip_waypoint,
517 "Max distance to `foresee` waypoints [meters]. (<0: unlimited)");
519 min_timesteps_confirm_skip_waypoints,
520 "Min timesteps a `future` waypoint must be seen as reachable to become "
523 "waypoint_angle_tolerance", waypoint_angle_tolerance,
524 "Angular error tolerance for waypoints with an assigned heading [deg] "
527 rel_speed_for_stop_waypoints,
528 "[0,1] Relative speed when aiming at a stop-point waypoint "
531 multitarget_look_ahead,
532 ">=0 number of waypoints to forward to the underlying navigation "
533 "engine, to ease obstacles avoidance when a waypoint is blocked "
534 "(Default=0 : none)");
538 : max_distance_to_allow_skip_waypoint(-1.0),
539 min_timesteps_confirm_skip_waypoints(1),
540 waypoint_angle_tolerance(
mrpt::utils::
DEG2RAD(5.0)),
541 rel_speed_for_stop_waypoints(0.10),
542 multitarget_look_ahead(0)
558 wp = (!wps.waypoints.empty() && wps.waypoint_index_current_goal >= 0 &&
559 wps.waypoint_index_current_goal < (int)wps.waypoints.size())
560 ? &wps.waypoints[wps.waypoint_index_current_goal]
564 targetDist <= m_navigationParams->target.targetAllowedDistance) ||
572 "CWaypointsNavigator::checkHasReachedTarget() called "
574 << targetDist <<
" return=" << ret
576 <<
"wps.timestamp_nav_started="
578 ?
"INVALID_TIMESTAMP"
580 wps.timestamp_nav_started)));
#define MRPT_LOAD_CONFIG_VAR_DEGREES( variableName, configFileObject, sectionNameStr)
Loads a double variable, stored as radians but entered in the INI-file as degrees.
#define MRPT_SAVE_CONFIG_VAR_COMMENT(variableName, __comment)
#define MRPT_SAVE_CONFIG_VAR_DEGREES_COMMENT( __entryName, __variable, __comment)
#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...
#define MRPT_LOG_THROTTLE_INFO_FMT(_PERIOD_SECONDS, _FMT_STRING,...)
#define MRPT_LOG_INFO_FMT(_FMT_STRING,...)
#define MRPT_LOG_DEBUG_STREAM(__CONTENTS)
std::shared_ptr< CVehicleVelCmd > Ptr
This is the base class for any reactive/planned navigation system.
CRobot2NavInterface & m_robot
The navigator-robot interface.
TState m_navigationState
Current internal state of navigator:
virtual void onNavigateCommandReceived()
Called after each call to CAbstractNavigator::navigate()
void dispatchPendingNavEvents()
mrpt::utils::CTimeLogger m_timlog_delays
Time logger to collect delay-related stats.
virtual void cancel()
Cancel current navegation.
virtual void navigationStep()
This method must be called periodically in order to effectively run the navigation.
void processNavigateCommand(const TNavigationParams *params)
Does the job of navigate(), except the call to onNavigateCommandReceived()
TRobotPoseVel m_curPoseVel
Current robot pose (updated in CAbstractNavigator::navigationStep() )
virtual bool stop(bool isEmergencyStop)
Default: forward call to m_robot.stop().
virtual bool changeSpeeds(const mrpt::kinematics::CVehicleVelCmd &vel_cmd)
Default: forward call to m_robot.changeSpeed().
virtual void saveConfigFile(mrpt::utils::CConfigFileBase &c) const
Saves all current options to a config file.
std::unique_ptr< TNavigationParams > m_navigationParams
Current navigation parameters.
virtual void performNavigationStepNavigating(bool call_virtual_nav_method=true)
Factorization of the part inside navigationStep(), for the case of state being NAVIGATING.
virtual void loadConfigFile(const mrpt::utils::CConfigFileBase &c)
Loads all params from a file.
void updateCurrentPoseAndSpeeds()
Call to the robot getCurrentPoseAndSpeeds() and updates members m_curPoseVel accordingly.
std::vector< std::function< void(void)> > m_pending_events
Events generated during navigationStep(), enqueued to be called at the end of the method execution to...
The pure virtual interface between a real or simulated robot and any CAbstractNavigator-derived class...
virtual mrpt::kinematics::CVehicleVelCmd::Ptr getAlignCmd(const double relative_heading_radians)
Gets a motion command to make the robot to align with a given relative heading, without translating.
virtual void sendNewWaypointTargetEvent(int waypoint_index)
Callback: Heading towards a new intermediary/final waypoint in waypoint list navigation.
virtual void sendWaypointReachedEvent(int waypoint_index, bool reached_nSkipped)
Callback: Reached an intermediary waypoint in waypoint list navigation.
CWaypointsNavigator(CRobot2NavInterface &robot_interface_impl)
ctor
bool isRelativePointReachable(const mrpt::math::TPoint2D &wp_local_wrt_robot) const
Returns true if, according to the information gathered at the last navigation step,...
TWaypointStatusSequence getWaypointNavStatus() const
Get a copy of the control structure which describes the progress status of the waypoint navigation.
mrpt::system::TTimeStamp m_last_alignment_cmd
virtual ~CWaypointsNavigator()
dtor
virtual void saveConfigFile(mrpt::utils::CConfigFileBase &c) const override
Saves all current options to a config file.
virtual void onStartNewNavigation() override
Called whenever a new navigation has been started.
virtual void navigationStep() override
This method must be called periodically in order to effectively run the navigation.
virtual void waypoints_navigationStep()
The waypoints-specific part of navigationStep()
virtual bool checkHasReachedTarget(const double targetDist) const override
Default implementation: check if target_dist is below the accepted distance.
virtual void loadConfigFile(const mrpt::utils::CConfigFileBase &c) override
Loads all params from a file.
virtual void onNavigateCommandReceived() override
Called after each call to CAbstractNavigator::navigate()
TWaypointsNavigatorParams params_waypoints_navigator
std::recursive_mutex m_nav_waypoints_cs
virtual void navigateWaypoints(const TWaypointSequence &nav_request)
Waypoint navigation request.
bool m_was_aligning
Whether the last timestep was "is_aligning" in a waypoint with heading.
virtual bool impl_waypoint_is_reachable(const mrpt::math::TPoint2D &wp_local_wrt_robot) const =0
Implements the way to waypoint is free function in children classes: true must be returned if,...
virtual void cancel() override
Cancel current navegation.
TWaypointStatusSequence m_waypoint_nav_status
The latest waypoints navigation command and the up-to-date control status.
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle.
void inverseComposePoint(const double gx, const double gy, double &lx, double &ly) const
Computes the 2D point L such as .
This class allows loading and storing values and vectors of different types from a configuration text...
#define INVALID_TIMESTAMP
Represents an invalid timestamp, where applicable.
GLsizei const GLchar ** string
T angDistance(T from, T to)
Computes the shortest angular increment (or distance) between two planar orientations,...
std::string dateTimeLocalToString(const mrpt::system::TTimeStamp t)
Convert a timestamp into this textual form (in local time): YEAR/MONTH/DAY,HH:MM:SS....
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
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.
#define ASSERTMSG_(f, __ERROR_MSG)
T square(const T x)
Inline function for the square of a number.
double RAD2DEG(const double x)
Radians to degrees.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
double norm() const
Point norm.
double phi
Orientation (rads)
2D segment, consisting of two points.
TPoint2D point2
Destiny point.
TPoint2D point1
Origin point.
double distance(const TPoint2D &point) const
Distance to point.
Base for all high-level navigation commands.
virtual bool isEqual(const TNavigationParamsBase &o) const override
TargetInfo target
Navigation target.
Individual target info in CAbstractNavigator::TNavigationParamsBase and derived classes.
std::string target_frame_id
(Default="map") Frame ID in which target is given.
mrpt::math::TPose2D target_coords
Coordinates of desired target location.
double targetDesiredRelSpeed
(Default=.05) Desired relative speed (wrt maximum speed), in range [0,1], of the vehicle at target.
float targetAllowedDistance
(Default=0.5 meters) Allowed distance to target in order to end the navigation.
bool targetIsIntermediaryWaypoint
bool targetIsRelative
(Default=false) Whether the target coordinates are in global coordinates (false) or are relative to t...
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.
virtual bool isEqual(const CAbstractNavigator::TNavigationParamsBase &o) const override
virtual std::string getAsText() const override
Gets navigation params as a human-readable format.
TWaypointsNavigatorParams()
virtual void loadFromConfigFile(const mrpt::utils::CConfigFileBase &c, const std::string &s) override
This method load the options from a ".ini"-like file or memory-stored string list.
double rel_speed_for_stop_waypoints
[0,1] Relative speed when aiming at a stop-point waypoint (Default=0.10)
virtual void saveToConfigFile(mrpt::utils::CConfigFileBase &c, const std::string &s) const override
This method saves the options to a ".ini"-like file or memory-stored string list.
int min_timesteps_confirm_skip_waypoints
How many times shall a future waypoint be seen as reachable to skip to it (Default: 1)
double max_distance_to_allow_skip_waypoint
In meters.
int multitarget_look_ahead
>=0 number of waypoints to forward to the underlying navigation engine, to ease obstacles avoidance w...
static const int INVALID_NUM
The default value of fields (used to detect non-set values)
double target_heading
[Default=any heading] Optionally, set to the desired orientation [radians] of the robot at this waypo...
mrpt::math::TPoint2D target
[Must be set by the user] Coordinates of desired target location (world/global coordinates).
double allowed_distance
[Must be set by the user] How close should the robot get to this waypoint for it to be considered rea...
std::string target_frame_id
(Default="map") Frame ID in which target is given.
The struct for requesting navigation requests for a sequence of waypoints.
std::vector< TWaypoint > waypoints
A waypoint with an execution status.
bool reached
Whether this waypoint has been reached already (to within the allowed distance as per user specificat...
std::string getAsText() const
Gets navigation params as a human-readable format.
The struct for querying the status of waypoints navigation.
mrpt::system::TTimeStamp timestamp_nav_started
Timestamp of user navigation command.
mrpt::math::TPose2D last_robot_pose
Robot pose at last time step (has INVALID_NUM fields upon initialization)
bool final_goal_reached
Whether the final waypoint has been reached successfuly.
std::vector< TWaypointStatus > waypoints
Waypoints parameters and status (reached, skipped, etc.)
int waypoint_index_current_goal
Index in waypoints of the waypoint the navigator is currently trying to reach.
A safe way to call enter() and leave() of a mrpt::utils::CTimeLogger upon construction and destructio...