@@ -89,6 +89,7 @@ class MoveBase
89
89
double twist_linear_gain_;
90
90
double twist_angular_gain_;
91
91
bool reached_position_;
92
+ int controller_repeated_failures_;
92
93
void startController ();
93
94
public:
94
95
MoveBase ();
@@ -117,7 +118,8 @@ MoveBase::MoveBase()
117
118
local_target_radius_(0.4 ),
118
119
twist_linear_gain_(0.5 ),
119
120
twist_angular_gain_(1.0 ),
120
- reached_position_(false )
121
+ reached_position_(false ),
122
+ controller_repeated_failures_(0 )
121
123
{
122
124
pnh_.param (" frame_id" , frame_id_, frame_id_);
123
125
pnh_.param (" robot_frame_id" , robot_frame_id_, robot_frame_id_);
@@ -158,8 +160,9 @@ void MoveBase::onNavigationFunctionChange(const sensor_msgs::PointCloud2::ConstP
158
160
159
161
void MoveBase::startController ()
160
162
{
161
- controller_timer_ = nh_.createTimer (ros::Duration (1.0 / controller_frequency_), &MoveBase::controllerCallback, this );
162
163
reached_position_ = false ;
164
+ controller_repeated_failures_ = 0 ;
165
+ controller_timer_ = nh_.createTimer (ros::Duration (1.0 / controller_frequency_), &MoveBase::controllerCallback, this );
163
166
}
164
167
165
168
@@ -407,8 +410,16 @@ void MoveBase::generateTwistCommand(const geometry_msgs::PointStamped& local_tar
407
410
408
411
void MoveBase::controllerCallback (const ros::TimerEvent& event)
409
412
{
413
+ if (controller_repeated_failures_ >= 5 )
414
+ {
415
+ ROS_ERROR (" controller keeps failing. giving up :-(" );
416
+ controller_timer_.stop ();
417
+ return ;
418
+ }
419
+
410
420
if (!getRobotPose ())
411
421
{
422
+ controller_repeated_failures_++;
412
423
ROS_ERROR (" controllerCallback: failed to get robot pose" );
413
424
return ;
414
425
}
@@ -444,6 +455,7 @@ void MoveBase::controllerCallback(const ros::TimerEvent& event)
444
455
445
456
if (!generateLocalTarget (local_target))
446
457
{
458
+ controller_repeated_failures_++;
447
459
ROS_ERROR (" controllerCallback: failed to generate a local target to follow" );
448
460
return ;
449
461
}
@@ -477,6 +489,8 @@ void MoveBase::controllerCallback(const ros::TimerEvent& event)
477
489
ROS_INFO (" controller: ep=%f, eo=%f, status=%s" , ep.data , eo.data , status_str);
478
490
479
491
twist_pub_.publish (twist);
492
+
493
+ controller_repeated_failures_ = 0 ;
480
494
}
481
495
482
496
0 commit comments