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)));
virtual void cancel() override
Cancel current navegation.
TRobotPoseVel m_curPoseVel
Current robot pose (updated in CAbstractNavigator::navigationStep() )
virtual void sendNewWaypointTargetEvent(int waypoint_index)
Callback: Heading towards a new intermediary/final waypoint in waypoint list navigation.
virtual void loadConfigFile(const mrpt::utils::CConfigFileBase &c)
Loads all params from a file.
bool m_was_aligning
Whether the last timestep was "is_aligning" in a waypoint with heading.
TWaypointStatusSequence m_waypoint_nav_status
The latest waypoints navigation command and the up-to-date control status.
virtual void navigationStep() override
This method must be called periodically in order to effectively run the navigation.
std::vector< mrpt::nav::CAbstractNavigator::TargetInfo > multiple_targets
If not empty, this will prevail over the base class single goal target.
virtual void saveConfigFile(mrpt::utils::CConfigFileBase &c) const
Saves all current options to a config file.
std::string getAsText() const
Gets navigation params as a human-readable format.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
virtual void onStartNewNavigation() override
Called whenever a new navigation has been started.
#define MRPT_SAVE_CONFIG_VAR_DEGREES_COMMENT( __entryName, __variable, __comment)
std::vector< TWaypoint > waypoints
double distance(const TPoint2D &point) const
Distance to point.
Base for all high-level navigation commands.
float targetAllowedDistance
(Default=0.5 meters) Allowed distance to target in order to end the navigation.
std::recursive_mutex m_nav_waypoints_cs
T angDistance(T from, T to)
Computes the shortest angular increment (or distance) between two planar orientations, such that it is constrained to [-pi,pi] and is correct for any combination of angles (e.g.
mrpt::system::TTimeStamp now()
A shortcut for system::getCurrentTime.
TWaypointsNavigatorParams params_waypoints_navigator
void updateCurrentPoseAndSpeeds()
Call to the robot getCurrentPoseAndSpeeds() and updates members m_curPoseVel accordingly.
TWaypointStatusSequence getWaypointNavStatus() const
Get a copy of the control structure which describes the progress status of the waypoint navigation...
bool targetIsRelative
(Default=false) Whether the target coordinates are in global coordinates (false) or are relative to t...
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...
The struct for requesting navigation requests for a sequence of waypoints.
virtual void navigationStep()
This method must be called periodically in order to effectively run the navigation.
mrpt::utils::CTimeLogger m_timlog_delays
Time logger to collect delay-related stats.
bool isRelativePointReachable(const mrpt::math::TPoint2D &wp_local_wrt_robot) const
Returns true if, according to the information gathered at the last navigation step, there is a free path to the given point; false otherwise: if way is blocked or there is missing information, the point is out of range for the existing PTGs, etc.
virtual bool changeSpeeds(const mrpt::kinematics::CVehicleVelCmd &vel_cmd)
Default: forward call to m_robot.changeSpeed().
The struct for configuring navigation requests to CWaypointsNavigator and derived classes...
This class allows loading and storing values and vectors of different types from a configuration text...
TState m_navigationState
Current internal state of navigator:
double max_distance_to_allow_skip_waypoint
In meters.
bool reached
Whether this waypoint has been reached already (to within the allowed distance as per user specificat...
2D segment, consisting of two points.
#define MRPT_LOG_THROTTLE_INFO_FMT(_PERIOD_SECONDS, _FMT_STRING,...)
double RAD2DEG(const double x)
Radians to degrees.
mrpt::math::TPose2D last_robot_pose
Robot pose at last time step (has INVALID_NUM fields upon initialization)
#define MRPT_SAVE_CONFIG_VAR_COMMENT(variableName, __comment)
double targetDesiredRelSpeed
(Default=.05) Desired relative speed (wrt maximum speed), in range [0,1], of the vehicle at target...
virtual void onNavigateCommandReceived()
Called after each call to CAbstractNavigator::navigate()
std::string target_frame_id
(Default="map") Frame ID in which target is given.
virtual void loadConfigFile(const mrpt::utils::CConfigFileBase &c) override
Loads all params from a file.
The struct for querying the status of waypoints navigation.
mrpt::system::TTimeStamp m_last_alignment_cmd
std::unique_ptr< TNavigationParams > m_navigationParams
Current navigation parameters.
Individual target info in CAbstractNavigator::TNavigationParamsBase and derived classes.
virtual bool isEqual(const CAbstractNavigator::TNavigationParamsBase &o) const override
A waypoint with an execution status.
bool final_goal_reached
Whether the final waypoint has been reached successfuly.
TPoint2D point2
Destiny point.
GLsizei const GLchar ** string
mrpt::math::TPose2D target_coords
Coordinates of desired target location.
#define INVALID_TIMESTAMP
Represents an invalid timestamp, where applicable.
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...
virtual ~CWaypointsNavigator()
dtor
virtual void sendWaypointReachedEvent(int waypoint_index, bool reached_nSkipped)
Callback: Reached an intermediary waypoint in waypoint list navigation.
virtual bool checkHasReachedTarget(const double targetDist) const override
Default implementation: check if target_dist is below the accepted distance.
TPoint2D point1
Origin point.
double norm() const
Point norm.
void dispatchPendingNavEvents()
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
virtual void performNavigationStepNavigating(bool call_virtual_nav_method=true)
Factorization of the part inside navigationStep(), for the case of state being NAVIGATING.
TWaypointsNavigatorParams()
virtual std::string getAsText() const override
Gets navigation params as a human-readable format.
A safe way to call enter() and leave() of a mrpt::utils::CTimeLogger upon construction and destructio...
int min_timesteps_confirm_skip_waypoints
How many times shall a future waypoint be seen as reachable to skip to it (Default: 1) ...
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle...
virtual void navigateWaypoints(const TWaypointSequence &nav_request)
Waypoint navigation request.
void processNavigateCommand(const TNavigationParams *params)
Does the job of navigate(), except the call to onNavigateCommandReceived()
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...
T square(const T x)
Inline function for the square of a number.
mrpt::math::TPoint2D target
[Must be set by the user] Coordinates of desired target location (world/global coordinates).
CRobot2NavInterface & m_robot
The navigator-robot interface.
virtual void onNavigateCommandReceived() override
Called after each call to CAbstractNavigator::navigate()
virtual bool isEqual(const TNavigationParamsBase &o) const override
void inverseComposePoint(const double gx, const double gy, double &lx, double &ly) const
Computes the 2D point L such as .
virtual void saveConfigFile(mrpt::utils::CConfigFileBase &c) const override
Saves all current options to a config file.
#define MRPT_LOG_INFO_FMT(_FMT_STRING,...)
double target_heading
[Default=any heading] Optionally, set to the desired orientation [radians] of the robot at this waypo...
double allowed_distance
[Must be set by the user] How close should the robot get to this waypoint for it to be considered rea...
virtual void cancel()
Cancel current navegation.
TargetInfo target
Navigation target.
mrpt::system::TTimeStamp timestamp_nav_started
Timestamp of user navigation command.
#define MRPT_LOAD_CONFIG_VAR_DEGREES( variableName, configFileObject, sectionNameStr)
Loads a double variable, stored as radians but entered in the INI-file as degrees.
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 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...
std::shared_ptr< CVehicleVelCmd > Ptr
std::string dateTimeLocalToString(const mrpt::system::TTimeStamp t)
Convert a timestamp into this textual form (in local time): YEAR/MONTH/DAY,HH:MM:SS.MMM.
The pure virtual interface between a real or simulated robot and any CAbstractNavigator-derived class...
CWaypointsNavigator(CRobot2NavInterface &robot_interface_impl)
ctor
double rel_speed_for_stop_waypoints
[0,1] Relative speed when aiming at a stop-point waypoint (Default=0.10)
std::vector< TWaypointStatus > waypoints
Waypoints parameters and status (reached, skipped, etc.)
#define MRPT_LOG_DEBUG_STREAM(__CONTENTS)
static const int INVALID_NUM
The default value of fields (used to detect non-set values)
#define ASSERTMSG_(f, __ERROR_MSG)
int waypoint_index_current_goal
Index in waypoints of the waypoint the navigator is currently trying to reach.
This is the base class for any reactive/planned navigation system.
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 phi
Orientation (rads)
virtual void waypoints_navigationStep()
The waypoints-specific part of navigationStep()
int multitarget_look_ahead
>=0 number of waypoints to forward to the underlying navigation engine, to ease obstacles avoidance w...
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. ...
virtual bool stop(bool isEmergencyStop)
Default: forward call to m_robot.stop().
bool targetIsIntermediaryWaypoint
std::string target_frame_id
(Default="map") Frame ID in which target is given.