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