@@ -89,6 +89,7 @@ void CustomController::configure(
89
89
declare_parameter_if_not_declared (node, plugin_name_ + " .look_ahead_distance" , rclcpp::ParameterValue (1.0 ));
90
90
declare_parameter_if_not_declared (node, plugin_name_ + " .costmap_tolerance" , rclcpp::ParameterValue (60 ));
91
91
declare_parameter_if_not_declared (node, plugin_name_ + " .speed_decade" , rclcpp::ParameterValue (0.7 ));
92
+ declare_parameter_if_not_declared (node, plugin_name_ + " .keep_planning" , rclcpp::ParameterValue (true ));
92
93
93
94
// declare_parameter_if_not_declared(node, plugin_name_ + ".keepPlan", rclcpp::ParameterValue(ture));
94
95
// Get parameters from the config file
@@ -102,9 +103,9 @@ void CustomController::configure(
102
103
node->get_parameter (plugin_name_ + " .angular_kp" , angular_kp_);
103
104
node->get_parameter (plugin_name_ + " .linear_kp" , linear_kp_);
104
105
node->get_parameter (plugin_name_ + " .look_ahead_distance" , look_ahead_distance_);
105
- node->get_parameter (plugin_name_ + " .keep_palnning" , keep_palnning_);
106
106
node->get_parameter (plugin_name_ + " .costmap_tolerance" , costmap_tolerance_);
107
107
node->get_parameter (plugin_name_ + " .speed_decade" , speed_decade_);
108
+ node->get_parameter (plugin_name_ + " .keep_planning" , keep_planning_);
108
109
double transform_tolerance;
109
110
110
111
node->get_parameter (plugin_name_ + " .transform_tolerance" , transform_tolerance);
@@ -140,34 +141,40 @@ void CustomController::deactivate(){
140
141
// Get the global plan with transformed poses
141
142
void CustomController::setPlan (const nav_msgs::msg::Path & path)
142
143
{
143
- if (cur_goal_pose_.x_ != path.poses .back ().pose .position .x || cur_goal_pose_.y_ != path.poses .back ().pose .position .y ) update_plan_ = true ;
144
+ if (cur_goal_pose_.x_ != path.poses .back ().pose .position .x || cur_goal_pose_.y_ != path.poses .back ().pose .position .y
145
+ || cur_goal_pose_.theta_ != tf2::getYaw (path.poses .back ().pose .orientation )) update_plan_ = true ;
146
+
144
147
if (!update_plan_){
148
+ RCLCPP_INFO (logger_, " cur_goal_pose_ is [%lf] [%lf] [%lf]" , cur_goal_pose_.x_ , cur_goal_pose_.y_ , cur_goal_pose_.theta_ );
149
+ RCLCPP_INFO (logger_, " path.poses.back().pose.position is [%lf] [%lf] [%lf]" , path.poses .back ().pose .position .x , path.poses .back ().pose .position .y , tf2::getYaw (path.poses .back ().pose .orientation ));
150
+ RCLCPP_INFO (logger_, " The global plan is not updated" );
145
151
return ;
146
152
}
147
153
148
154
if (!global_plan_.poses .empty ()){
149
155
global_plan_.poses .clear ();
150
156
}
151
157
global_plan_ = path;
152
- RCLCPP_INFO (logger_, " Received a new plan" );
158
+ // RCLCPP_INFO(logger_, "Received a new plan");
153
159
cur_goal_pose_.x_ = global_plan_.poses .back ().pose .position .x ;
154
160
cur_goal_pose_.y_ = global_plan_.poses .back ().pose .position .y ;
161
+ cur_goal_pose_.theta_ = tf2::getYaw (global_plan_.poses .back ().pose .orientation );
155
162
156
163
auto msg = std::make_unique<nav_msgs::msg::Path>(global_plan_);
157
164
global_plan_.header .stamp = path.header .stamp ;
158
165
global_plan_.header .frame_id = path.header .frame_id ; // or "odom"
159
166
global_path_pub_->publish (std::move (msg));
160
167
161
168
// RCLCPP_INFO(logger_, "global_plan_.orientation x y z w = [%lf] [%lf] [%lf] [%lf]", global_plan_.poses.back().pose.orientation.x, global_plan_.poses.back().pose.orientation.y, global_plan_.poses.back().pose.orientation.z, global_plan_.poses.back().pose.orientation.w);
162
- tf2::Quaternion q;
163
- tf2::fromMsg (global_plan_.poses .back ().pose .orientation , q);
164
- tf2::Matrix3x3 qt (q);
165
- double pitch, row, yaw;
166
- qt.getRPY (pitch, row, yaw);
167
- // RCLCPP_INFO(logger_, "yaw is = [%lf]", yaw);
168
- final_goal_angle_ = yaw ;
169
-
170
- update_plan_ = keep_palnning_ ;
169
+ // tf2::Quaternion q;
170
+ // tf2::fromMsg(global_plan_.poses.back().pose.orientation, q);
171
+ // tf2::Matrix3x3 qt(q);
172
+ // double pitch, row, yaw;
173
+ // qt.getRPY(pitch, row, yaw);
174
+ // RCLCPP_INFO(logger_, "yaw is = [%lf]", yaw);
175
+ final_goal_angle_ = tf2::getYaw (global_plan_. poses . back (). pose . orientation ) ;
176
+
177
+ update_plan_ = keep_planning_ ;
171
178
// update_plan_ = true;
172
179
isObstacleExist_ = false ;
173
180
// print the distance between the points
@@ -288,35 +295,18 @@ RobotState CustomController::getLookAheadPoint(
288
295
289
296
double CustomController::getGoalAngle (double cur_angle, double goal_angle) {
290
297
double ang_diff_ = goal_angle - cur_angle;
291
- double angular_max_vel_ = 2.0 ;
292
- double angle_vel_ = 0.0 ;
293
- double angular_kp_ = 4.0 ;
294
- if (cur_angle >= 0 && goal_angle >= 0 ){
295
- if (ang_diff_ >= 0 ) angle_vel_ = std::min ((ang_diff_ * angular_kp_), angular_max_vel_);
296
- else angle_vel_ = std::max ((ang_diff_ * angular_kp_), -angular_max_vel_);
297
- }
298
- else if (cur_angle < 0 && goal_angle < 0 ){
299
- if (ang_diff_ >= 0 ) angle_vel_ = std::min ((ang_diff_ * angular_kp_), angular_max_vel_);
300
- else angle_vel_ = std::max ((ang_diff_ * angular_kp_), -angular_max_vel_);
301
- }
302
- else if (cur_angle < 0 && goal_angle >= 0 ){
303
- if ((fabs (cur_angle) + goal_angle) >= M_PI) angle_vel_ = std::max ((-ang_diff_ * angular_kp_), -angular_max_vel_);
304
- else angle_vel_ = std::min ((ang_diff_ * angular_kp_), angular_max_vel_);
305
- }
306
- else {
307
- if ((cur_angle + fabs (goal_angle)) <= M_PI) angle_vel_ = std::max ((ang_diff_ * angular_kp_), -angular_max_vel_);
308
- else angle_vel_ = std::min ((-ang_diff_ * angular_kp_), angular_max_vel_);
309
- }
298
+
299
+ if (ang_diff_ > M_PI) {
300
+ ang_diff_ -= 2.0 * M_PI;
301
+ } else if (ang_diff_ < -M_PI) {
302
+ ang_diff_ += 2.0 * M_PI;
303
+ }
304
+
305
+ double angle_vel_ = std::clamp (ang_diff_ * angular_kp_, -max_angular_vel_, max_angular_vel_);
310
306
return angle_vel_;
311
- // if(goal_angle - cur_angle >= 3.1415926) {
312
- // return (goal_angle - cur_angle - 3.1415926 * 2);
313
- // } else if(goal_angle - cur_angle < -3.1415926) {
314
- // return (goal_angle - cur_angle + 3.1415926 * 2);
315
- // } else {
316
- // return goal_angle;
317
- // }
318
307
}
319
308
309
+
320
310
int CustomController::getIndex (RobotState cur_pose, std::vector<RobotState> &path, double look_ahead_distance){
321
311
if (path.empty ()) {
322
312
RCLCPP_INFO (logger_, " [%s] Path is empty" , plugin_name_.c_str ());
@@ -439,7 +429,7 @@ geometry_msgs::msg::TwistStamped CustomController::computeVelocityCommands(
439
429
cmd_vel.header .frame_id = pose.header .frame_id ;
440
430
cmd_vel.header .stamp = clock_->now ();
441
431
442
- if (!goal_checker->isGoalReached (pose.pose , global_plan_.poses .back ().pose , velocity)){
432
+ // if(!goal_checker->isGoalReached(pose.pose, global_plan_.poses.back().pose, velocity)){
443
433
444
434
445
435
local_goal_ = getLookAheadPoint (cur_pose_, vector_global_path_, look_ahead_distance_);
@@ -503,26 +493,26 @@ geometry_msgs::msg::TwistStamped CustomController::computeVelocityCommands(
503
493
}
504
494
505
495
return cmd_vel;
506
- }
507
- else if (fabs (final_goal_angle_ - cur_pose_.theta_ ) > 0.01 ){
508
- cmd_vel.twist .linear .x = 0.0 ;
509
- cmd_vel.twist .linear .y = 0.0 ;
510
- cmd_vel.twist .angular .z = getGoalAngle (cur_pose_.theta_ , final_goal_angle_);
511
- return cmd_vel;
512
- }
513
- else {
514
- RCLCPP_INFO (logger_, " [%s] Goal reached" , plugin_name_.c_str ());
515
- cmd_vel.twist .linear .x = 0.0 ;
516
- cmd_vel.twist .linear .y = 0.0 ;
517
- cmd_vel.twist .angular .z = 0.0 ;
518
- update_plan_ = true ;
519
- return cmd_vel;
520
- }
496
+ // }
497
+ // else if(fabs(final_goal_angle_ - cur_pose_.theta_) > 0.01){
498
+ // cmd_vel.twist.linear.x = 0.0;
499
+ // cmd_vel.twist.linear.y = 0.0;
500
+ // cmd_vel.twist.angular.z = getGoalAngle(cur_pose_.theta_, final_goal_angle_);
501
+ // return cmd_vel;
502
+ // }
503
+ // else{
504
+ // RCLCPP_INFO(logger_, "[%s] Goal reached", plugin_name_.c_str());
505
+ // cmd_vel.twist.linear.x = 0.0;
506
+ // cmd_vel.twist.linear.y = 0.0;
507
+ // cmd_vel.twist.angular.z = 0.0;
508
+ // update_plan_ = true;
509
+ // return cmd_vel;
510
+ // }
521
511
}
522
512
// test
523
513
void CustomController::setSpeedLimit (
524
- const double & speed_limit,
525
- const bool & percentage)
514
+ const double & /* speed_limit*/ ,
515
+ const bool & /* percentage*/ )
526
516
{
527
517
return ;
528
518
// if (speed_limit == nav2_costmap_2d::NO_SPEED_LIMIT) {
0 commit comments