Skip to content

Commit 35f1b7e

Browse files
authored
Merge pull request #27 from DIT-ROBOTICS/develop
Develop
2 parents 5db69da + 5cbc6c1 commit 35f1b7e

File tree

17 files changed

+463
-1530
lines changed

17 files changed

+463
-1530
lines changed

Navigation2/nav2_behavior_tree/plugins/decorator/stop_controller.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ namespace nav2_behavior_tree
3434
cmd_vel.angular.z = 0.0;
3535
cmd_vel_pub->publish(cmd_vel);
3636
RCLCPP_INFO(node_->get_logger(), "running in stop_controller");
37-
return BT::NodeStatus::RUNNING;
37+
return BT::NodeStatus::FAILURE;
3838
}
3939
return child_node_->executeTick();
4040
}
Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,35 @@
11
<root main_tree_to_execute="MainTree">
22
<BehaviorTree ID="MainTree">
3-
<RecoveryNode number_of_retries="6" name="NavigateRecovery">
4-
<StopController stop="false">
5-
<PipelineSequence name="NavigateWithReplanning">
6-
<RateController hz="5">
7-
<RecoveryNode number_of_retries="1" name="ComputePathToPose">
8-
<ComputePathToPose goal="{goal}" path="{path}" planner_id="GridBased"/>
9-
<ClearEntireCostmap name="ClearGlobalCostmap-Context" service_name="global_costmap/clear_entirely_global_costmap"/>
3+
<RecoveryNode number_of_retries="6" name="NavigateRecovery">
4+
<StopController>
5+
<PipelineSequence name="NavigateWithReplanning">
6+
<RateController hz="5">
7+
<RecoveryNode number_of_retries="1" name="ComputePathToPose">
8+
<ComputePathToPose goal="{goal}" path="{path}" planner_id="GridBased"/>
9+
<ClearEntireCostmap name="ClearGlobalCostmap-Context" service_name="global_costmap/clear_entirely_global_costmap"/>
10+
</RecoveryNode>
11+
</RateController>
12+
<RecoveryNode number_of_retries="1" name="FollowPath">
13+
<FollowPath path="{path}" controller_id="FollowPath"/>
14+
<ClearEntireCostmap name="ClearLocalCostmap-Context" service_name="local_costmap/clear_entirely_local_costmap"/>
1015
</RecoveryNode>
11-
</RateController>
12-
<RecoveryNode number_of_retries="1" name="FollowPath">
13-
<FollowPath path="{path}" controller_id="FollowPath"/>
14-
<ClearEntireCostmap name="ClearLocalCostmap-Context" service_name="local_costmap/clear_entirely_local_costmap"/>
15-
</RecoveryNode>
16-
</PipelineSequence>
17-
</StopController>
18-
<ReactiveFallback name="RecoveryFallback">
19-
<GoalUpdated/>
20-
<RoundRobin name="RecoveryActions">
21-
<!-- <Sequence name="ClearingActions">
22-
<ClearEntireCostmap name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_entirely_local_costmap"/>
23-
<ClearEntireCostmap name="ClearGlobalCostmap-Subtree" service_name="global_costmap/clear_entirely_global_costmap"/>
24-
</Sequence> -->
25-
<Wait wait_duration="3"/>
26-
<Shrink shrink_to="0.05"/>
27-
<Wait wait_duration="1"/>
28-
<Escape run_dist="5" time_allowance="5" is_recovery="1"/>
29-
</RoundRobin>
30-
</ReactiveFallback>
31-
</RecoveryNode>
16+
</PipelineSequence>
17+
</StopController>
18+
<StopController>
19+
<ReactiveFallback name="RecoveryFallback">
20+
<GoalUpdated/>
21+
<RoundRobin name="RecoveryActions">
22+
<!-- <Sequence name="ClearingActions">
23+
<ClearEntireCostmap name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_entirely_local_costmap"/>
24+
<ClearEntireCostmap name="ClearGlobalCostmap-Subtree" service_name="global_costmap/clear_entirely_global_costmap"/>
25+
</Sequence> -->
26+
<Wait wait_duration="3"/>
27+
<Shrink shrink_to="0.05"/>
28+
<Wait wait_duration="1"/>
29+
<Escape run_dist="5" time_allowance="5" is_recovery="1"/>
30+
</RoundRobin>
31+
</ReactiveFallback>
32+
</StopController>
33+
</RecoveryNode>
3234
</BehaviorTree>
3335
</root>

custom_bts/custom_nav_thru_poses/src/ControllerSelector.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,19 @@ class ControllerSelector : public rclcpp::Node {
1919
controller_selector_pub_ = this->create_publisher<std_msgs::msg::String>("/controller_type", rclcpp::QoS(10).reliable().transient_local());
2020
controller_selector_timer_ = this->create_wall_timer(std::chrono::milliseconds(50), std::bind(&ControllerSelector::timer_callback, this));
2121

22-
declare_parameter("Path_controller", rclcpp::ParameterValue("FollowPath"));
23-
declare_parameter("Dock_controller", rclcpp::ParameterValue("DockMission"));
22+
declare_parameter("Fast_controller", rclcpp::ParameterValue("FollowPath"));
23+
declare_parameter("Slow_controller", rclcpp::ParameterValue("Cautious"));
2424

25-
this->get_parameter("Path_controller", path_controller_);
26-
this->get_parameter("Dock_controller", dock_controller_);
25+
this->get_parameter("Fast_controller", fast_controller_);
26+
this->get_parameter("Slow_controller", slow_controller_);
2727
}
2828

2929
private:
3030
void feedback_callback(nav2_msgs::action::NavigateThroughPoses::Feedback feedback) {
3131
if(feedback.number_of_poses_remaining <= 1) {
32-
controller_type_ = dock_controller_;
32+
controller_type_ = slow_controller_;
3333
} else {
34-
controller_type_ = path_controller_;
34+
controller_type_ = fast_controller_;
3535
}
3636

3737
if(controller_type_prev_ != controller_type_) RCLCPP_INFO(this->get_logger(), "Controller type has switch to '%s'", controller_type_.c_str());
@@ -60,7 +60,7 @@ class ControllerSelector : public rclcpp::Node {
6060
// Hardcoded controller selection
6161
std::string controller_type_;
6262
std::string controller_type_prev_ = "None";
63-
std::string path_controller_, dock_controller_;
63+
std::string fast_controller_, slow_controller_;
6464
};
6565

6666
int main(int argc, char * argv[]) {

custom_controller/include/custom_controller/custom_controller.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ class CustomController : public nav2_core::Controller{
123123
int check_index_;
124124
int current_index_;
125125
bool isObstacleExist_;
126-
bool keep_palnning_;
126+
bool keep_planning_;
127127

128128
};
129129

custom_controller/src/custom_controller.cpp

Lines changed: 46 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ void CustomController::configure(
8989
declare_parameter_if_not_declared(node, plugin_name_ + ".look_ahead_distance", rclcpp::ParameterValue(1.0));
9090
declare_parameter_if_not_declared(node, plugin_name_ + ".costmap_tolerance", rclcpp::ParameterValue(60));
9191
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));
9293

9394
//declare_parameter_if_not_declared(node, plugin_name_ + ".keepPlan", rclcpp::ParameterValue(ture));
9495
// Get parameters from the config file
@@ -102,9 +103,9 @@ void CustomController::configure(
102103
node->get_parameter(plugin_name_ + ".angular_kp", angular_kp_);
103104
node->get_parameter(plugin_name_ + ".linear_kp", linear_kp_);
104105
node->get_parameter(plugin_name_ + ".look_ahead_distance", look_ahead_distance_);
105-
node->get_parameter(plugin_name_ + ".keep_palnning", keep_palnning_);
106106
node->get_parameter(plugin_name_ + ".costmap_tolerance", costmap_tolerance_);
107107
node->get_parameter(plugin_name_ + ".speed_decade", speed_decade_);
108+
node->get_parameter(plugin_name_ + ".keep_planning", keep_planning_);
108109
double transform_tolerance;
109110

110111
node->get_parameter(plugin_name_ + ".transform_tolerance", transform_tolerance);
@@ -140,34 +141,40 @@ void CustomController::deactivate(){
140141
// Get the global plan with transformed poses
141142
void CustomController::setPlan(const nav_msgs::msg::Path & path)
142143
{
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+
144147
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");
145151
return;
146152
}
147153

148154
if(!global_plan_.poses.empty()){
149155
global_plan_.poses.clear();
150156
}
151157
global_plan_ = path;
152-
RCLCPP_INFO(logger_, "Received a new plan");
158+
// RCLCPP_INFO(logger_, "Received a new plan");
153159
cur_goal_pose_.x_ = global_plan_.poses.back().pose.position.x;
154160
cur_goal_pose_.y_ = global_plan_.poses.back().pose.position.y;
161+
cur_goal_pose_.theta_ = tf2::getYaw(global_plan_.poses.back().pose.orientation);
155162

156163
auto msg = std::make_unique<nav_msgs::msg::Path>(global_plan_);
157164
global_plan_.header.stamp = path.header.stamp;
158165
global_plan_.header.frame_id = path.header.frame_id; // or "odom"
159166
global_path_pub_->publish(std::move(msg));
160167

161168
//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_;
171178
// update_plan_ = true;
172179
isObstacleExist_ = false;
173180
//print the distance between the points
@@ -288,35 +295,18 @@ RobotState CustomController::getLookAheadPoint(
288295

289296
double CustomController::getGoalAngle(double cur_angle, double goal_angle) {
290297
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_);
310306
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-
// }
318307
}
319308

309+
320310
int CustomController::getIndex(RobotState cur_pose, std::vector<RobotState> &path, double look_ahead_distance){
321311
if (path.empty()) {
322312
RCLCPP_INFO(logger_, "[%s] Path is empty", plugin_name_.c_str());
@@ -439,7 +429,7 @@ geometry_msgs::msg::TwistStamped CustomController::computeVelocityCommands(
439429
cmd_vel.header.frame_id = pose.header.frame_id;
440430
cmd_vel.header.stamp = clock_->now();
441431

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)){
443433

444434

445435
local_goal_ = getLookAheadPoint(cur_pose_, vector_global_path_, look_ahead_distance_);
@@ -503,26 +493,26 @@ geometry_msgs::msg::TwistStamped CustomController::computeVelocityCommands(
503493
}
504494

505495
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+
// }
521511
}
522512
//test
523513
void CustomController::setSpeedLimit(
524-
const double & speed_limit,
525-
const bool & percentage)
514+
const double & /*speed_limit*/,
515+
const bool & /*percentage*/)
526516
{
527517
return;
528518
// if (speed_limit == nav2_costmap_2d::NO_SPEED_LIMIT) {

custom_layer/object_layer/include/object_layer/object_layer.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,13 @@ namespace Object_costmap_plugin {
3737
// data processes
3838
void columnPoseArrayCallback(const geometry_msgs::msg::PoseArray::SharedPtr object_poseArray);
3939
void boardPoseArrayCallback(const geometry_msgs::msg::PoseArray::SharedPtr object_poseArray);
40+
void checkClear();
4041
private:
4142
std::deque<geometry_msgs::msg::PoseStamped> columnList;
4243
std::deque<geometry_msgs::msg::PoseStamped> boardList;
4344
rclcpp::Subscription<geometry_msgs::msg::PoseArray>::SharedPtr column_poseArray_sub;
4445
rclcpp::Subscription<geometry_msgs::msg::PoseArray>::SharedPtr board_poseArray_sub;
45-
46+
int clearTimer;
4647
double column_inscribed_radius, board_inscribed_radius;
4748
double column_inflation_radius, board_inflation_radius;
4849
double cost_scaling_factor;

custom_layer/object_layer/plugin/object_layer.cpp

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ namespace Object_costmap_plugin {
3131
node->get_parameter(name_ + "." + "cost_scaling_factor", cost_scaling_factor);
3232

3333
column_poseArray_sub = node->create_subscription<geometry_msgs::msg::PoseArray>(
34-
"/column_pose_array", 100, std::bind(&ObjectLayer::columnPoseArrayCallback, this, std::placeholders::_1));
34+
"/detected/global_center_poses/column", 100, std::bind(&ObjectLayer::columnPoseArrayCallback, this, std::placeholders::_1));
3535
board_poseArray_sub = node->create_subscription<geometry_msgs::msg::PoseArray>(
36-
"/board_pose_array", 100, std::bind(&ObjectLayer::boardPoseArrayCallback, this, std::placeholders::_1));
36+
"/detected/global_center_poses/platform", 100, std::bind(&ObjectLayer::boardPoseArrayCallback, this, std::placeholders::_1));
3737

3838
columnList.clear();
3939
boardList.clear();
40-
40+
clearTimer = 20;
4141
}
4242

4343
void ObjectLayer::updateBounds(double robot_x, double robot_y, double robot_yaw,
@@ -64,6 +64,16 @@ namespace Object_costmap_plugin {
6464
ExpandPointWithRectangle(object.pose.position.x, object.pose.position.y, nav2_costmap_2d::LETHAL_OBSTACLE, board_inflation_radius, cost_scaling_factor, board_inscribed_radius, object);
6565
}
6666
updateWithMax(master_grid, 0, 0, getSizeInCellsX(), getSizeInCellsY());
67+
checkClear();
68+
}
69+
70+
void ObjectLayer::checkClear(){
71+
if(clearTimer == 0){
72+
boardList.clear();
73+
columnList.clear();
74+
clearTimer = 20;
75+
}
76+
clearTimer--;
6777
}
6878

6979
bool ObjectLayer::isClearable(){
@@ -82,7 +92,7 @@ namespace Object_costmap_plugin {
8292
}
8393

8494
void ObjectLayer::columnPoseArrayCallback(const geometry_msgs::msg::PoseArray::SharedPtr object_poseArray){
85-
columnList.clear();
95+
// columnList.clear();
8696
for(auto pose : object_poseArray->poses){
8797
geometry_msgs::msg::PoseStamped poseStamped;
8898
poseStamped.pose = pose;
@@ -91,7 +101,7 @@ namespace Object_costmap_plugin {
91101
}
92102

93103
void ObjectLayer::boardPoseArrayCallback(const geometry_msgs::msg::PoseArray::SharedPtr object_poseArray){
94-
boardList.clear();
104+
// boardList.clear();
95105
for(auto pose : object_poseArray->poses){
96106
geometry_msgs::msg::PoseStamped poseStamped;
97107
poseStamped.pose = pose;
@@ -146,10 +156,13 @@ namespace Object_costmap_plugin {
146156
double cosy_cosp = 1.0 - 2.0 * (object.pose.orientation.y * object.pose.orientation.y +
147157
object.pose.orientation.z * object.pose.orientation.z);
148158
double angle = std::atan2(siny_cosp, cosy_cosp);
149-
159+
// RCLCPP_WARN(
160+
// rclcpp::get_logger("ObjectLayer"),
161+
// "my angle : %lf", angle);
150162
// Precompute sine and cosine of the angle.
151-
double cosAngle = std::cos(angle);
152-
double sinAngle = std::sin(angle);
163+
double receivedAngle = object.pose.orientation.x;
164+
double cosAngle = std::cos(receivedAngle);
165+
double sinAngle = std::sin(receivedAngle);
153166

154167
unsigned int mx, my;
155168
double cost = 0.0;

0 commit comments

Comments
 (0)