Feature/return initial pose (#20)
* Add return to initial pose param and logic * Format clang * Add readme feature * Fix log * Fix return statement * Deelete commented blockmain
parent
cc755cacac
commit
5dfdb3a68e
|
@ -63,6 +63,8 @@ You can open rviz2 and add the exploration frontiers marker (topic is `explore/f
|
||||||
#### Stop/Resume exploration
|
#### Stop/Resume exploration
|
||||||
By default the exploration node will start right away the frontier-based exploration algorithm. Alternatively, you can stop the exploration by publishing to a `False` to `explore/resume` topic. This will stop the exploration and the robot will stop moving. You can resume the exploration by publishing to `True` to `explore/resume`.
|
By default the exploration node will start right away the frontier-based exploration algorithm. Alternatively, you can stop the exploration by publishing to a `False` to `explore/resume` topic. This will stop the exploration and the robot will stop moving. You can resume the exploration by publishing to `True` to `explore/resume`.
|
||||||
|
|
||||||
|
#### Returning to initial pose
|
||||||
|
The robot will return to its initial pose after exploration if you want by defining the parameter `return_to_init` to `True` when launching the node.
|
||||||
|
|
||||||
#### TB3 troubleshooting (with foxy)
|
#### TB3 troubleshooting (with foxy)
|
||||||
If you have trouble with TB3 in simulation, as we did, add these extra steps for configuring it.
|
If you have trouble with TB3 in simulation, as we did, add these extra steps for configuring it.
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/**:
|
/**:
|
||||||
ros__parameters:
|
ros__parameters:
|
||||||
robot_base_frame: base_link
|
robot_base_frame: base_link
|
||||||
|
return_to_init: true
|
||||||
costmap_topic: map
|
costmap_topic: map
|
||||||
costmap_updates_topic: map_updates
|
costmap_updates_topic: map_updates
|
||||||
visualize: true
|
visualize: true
|
||||||
|
|
|
@ -80,7 +80,7 @@ public:
|
||||||
~Explore();
|
~Explore();
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
void stop();
|
void stop(bool finished_exploring = false);
|
||||||
void resume();
|
void resume();
|
||||||
|
|
||||||
using NavigationGoalHandle =
|
using NavigationGoalHandle =
|
||||||
|
@ -121,7 +121,6 @@ private:
|
||||||
// rclcpp::TimerBase::SharedPtr oneshot_;
|
// rclcpp::TimerBase::SharedPtr oneshot_;
|
||||||
|
|
||||||
rclcpp::Subscription<std_msgs::msg::Bool>::SharedPtr resume_subscription_;
|
rclcpp::Subscription<std_msgs::msg::Bool>::SharedPtr resume_subscription_;
|
||||||
|
|
||||||
void resumeCallback(const std_msgs::msg::Bool::SharedPtr msg);
|
void resumeCallback(const std_msgs::msg::Bool::SharedPtr msg);
|
||||||
|
|
||||||
std::vector<geometry_msgs::msg::Point> frontier_blacklist_;
|
std::vector<geometry_msgs::msg::Point> frontier_blacklist_;
|
||||||
|
@ -130,11 +129,16 @@ private:
|
||||||
rclcpp::Time last_progress_;
|
rclcpp::Time last_progress_;
|
||||||
size_t last_markers_count_;
|
size_t last_markers_count_;
|
||||||
|
|
||||||
|
geometry_msgs::msg::Pose initial_pose_;
|
||||||
|
void returnToInitialPose(void);
|
||||||
|
|
||||||
// parameters
|
// parameters
|
||||||
double planner_frequency_;
|
double planner_frequency_;
|
||||||
double potential_scale_, orientation_scale_, gain_scale_;
|
double potential_scale_, orientation_scale_, gain_scale_;
|
||||||
double progress_timeout_;
|
double progress_timeout_;
|
||||||
bool visualize_;
|
bool visualize_;
|
||||||
|
bool return_to_init_;
|
||||||
|
std::string robot_base_frame_;
|
||||||
};
|
};
|
||||||
} // namespace explore
|
} // namespace explore
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,7 @@ Explore::Explore()
|
||||||
this->declare_parameter<float>("orientation_scale", 0.0);
|
this->declare_parameter<float>("orientation_scale", 0.0);
|
||||||
this->declare_parameter<float>("gain_scale", 1.0);
|
this->declare_parameter<float>("gain_scale", 1.0);
|
||||||
this->declare_parameter<float>("min_frontier_size", 0.5);
|
this->declare_parameter<float>("min_frontier_size", 0.5);
|
||||||
|
this->declare_parameter<bool>("return_to_init", false);
|
||||||
|
|
||||||
this->get_parameter("planner_frequency", planner_frequency_);
|
this->get_parameter("planner_frequency", planner_frequency_);
|
||||||
this->get_parameter("progress_timeout", timeout);
|
this->get_parameter("progress_timeout", timeout);
|
||||||
|
@ -67,6 +68,9 @@ Explore::Explore()
|
||||||
this->get_parameter("orientation_scale", orientation_scale_);
|
this->get_parameter("orientation_scale", orientation_scale_);
|
||||||
this->get_parameter("gain_scale", gain_scale_);
|
this->get_parameter("gain_scale", gain_scale_);
|
||||||
this->get_parameter("min_frontier_size", min_frontier_size);
|
this->get_parameter("min_frontier_size", min_frontier_size);
|
||||||
|
this->get_parameter("return_to_init", return_to_init_);
|
||||||
|
this->get_parameter("robot_base_frame", robot_base_frame_);
|
||||||
|
|
||||||
progress_timeout_ = timeout;
|
progress_timeout_ = timeout;
|
||||||
move_base_client_ =
|
move_base_client_ =
|
||||||
rclcpp_action::create_client<nav2_msgs::action::NavigateToPose>(
|
rclcpp_action::create_client<nav2_msgs::action::NavigateToPose>(
|
||||||
|
@ -93,6 +97,23 @@ Explore::Explore()
|
||||||
move_base_client_->wait_for_action_server();
|
move_base_client_->wait_for_action_server();
|
||||||
RCLCPP_INFO(logger_, "Connected to move_base nav2 server");
|
RCLCPP_INFO(logger_, "Connected to move_base nav2 server");
|
||||||
|
|
||||||
|
if (return_to_init_) {
|
||||||
|
RCLCPP_INFO(logger_, "Getting initial pose of the robot");
|
||||||
|
geometry_msgs::msg::TransformStamped transformStamped;
|
||||||
|
std::string map_frame = costmap_client_.getGlobalFrameID();
|
||||||
|
try {
|
||||||
|
transformStamped = tf_buffer_.lookupTransform(
|
||||||
|
map_frame, robot_base_frame_, tf2::TimePointZero);
|
||||||
|
initial_pose_.position.x = transformStamped.transform.translation.x;
|
||||||
|
initial_pose_.position.y = transformStamped.transform.translation.y;
|
||||||
|
initial_pose_.orientation = transformStamped.transform.rotation;
|
||||||
|
} catch (tf2::TransformException& ex) {
|
||||||
|
RCLCPP_ERROR(logger_, "Couldn't find transform from %s to %s: %s",
|
||||||
|
map_frame.c_str(), robot_base_frame_.c_str(), ex.what());
|
||||||
|
return_to_init_ = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
exploring_timer_ = this->create_wall_timer(
|
exploring_timer_ = this->create_wall_timer(
|
||||||
std::chrono::milliseconds((uint16_t)(1000.0 / planner_frequency_)),
|
std::chrono::milliseconds((uint16_t)(1000.0 / planner_frequency_)),
|
||||||
[this]() { makePlan(); });
|
[this]() { makePlan(); });
|
||||||
|
@ -219,7 +240,7 @@ void Explore::makePlan()
|
||||||
|
|
||||||
if (frontiers.empty()) {
|
if (frontiers.empty()) {
|
||||||
RCLCPP_WARN(logger_, "No frontiers found, stopping.");
|
RCLCPP_WARN(logger_, "No frontiers found, stopping.");
|
||||||
stop();
|
stop(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,7 +257,7 @@ void Explore::makePlan()
|
||||||
});
|
});
|
||||||
if (frontier == frontiers.end()) {
|
if (frontier == frontiers.end()) {
|
||||||
RCLCPP_WARN(logger_, "All frontiers traversed/tried out, stopping.");
|
RCLCPP_WARN(logger_, "All frontiers traversed/tried out, stopping.");
|
||||||
stop();
|
stop(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
geometry_msgs::msg::Point target_position = frontier->centroid;
|
geometry_msgs::msg::Point target_position = frontier->centroid;
|
||||||
|
@ -288,6 +309,20 @@ void Explore::makePlan()
|
||||||
move_base_client_->async_send_goal(goal, send_goal_options);
|
move_base_client_->async_send_goal(goal, send_goal_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Explore::returnToInitialPose()
|
||||||
|
{
|
||||||
|
RCLCPP_INFO(logger_, "Returning to initial pose.");
|
||||||
|
auto goal = nav2_msgs::action::NavigateToPose::Goal();
|
||||||
|
goal.pose.pose.position = initial_pose_.position;
|
||||||
|
goal.pose.pose.orientation = initial_pose_.orientation;
|
||||||
|
goal.pose.header.frame_id = costmap_client_.getGlobalFrameID();
|
||||||
|
goal.pose.header.stamp = this->now();
|
||||||
|
|
||||||
|
auto send_goal_options =
|
||||||
|
rclcpp_action::Client<nav2_msgs::action::NavigateToPose>::SendGoalOptions();
|
||||||
|
move_base_client_->async_send_goal(goal, send_goal_options);
|
||||||
|
}
|
||||||
|
|
||||||
bool Explore::goalOnBlacklist(const geometry_msgs::msg::Point& goal)
|
bool Explore::goalOnBlacklist(const geometry_msgs::msg::Point& goal)
|
||||||
{
|
{
|
||||||
constexpr static size_t tolerace = 5;
|
constexpr static size_t tolerace = 5;
|
||||||
|
@ -344,11 +379,15 @@ void Explore::start()
|
||||||
RCLCPP_INFO(logger_, "Exploration started.");
|
RCLCPP_INFO(logger_, "Exploration started.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Explore::stop()
|
void Explore::stop(bool finished_exploring)
|
||||||
{
|
{
|
||||||
RCLCPP_INFO(logger_, "Exploration stopped.");
|
RCLCPP_INFO(logger_, "Exploration stopped.");
|
||||||
move_base_client_->async_cancel_all_goals();
|
move_base_client_->async_cancel_all_goals();
|
||||||
exploring_timer_->cancel();
|
exploring_timer_->cancel();
|
||||||
|
|
||||||
|
if (return_to_init_ && finished_exploring) {
|
||||||
|
returnToInitialPose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Explore::resume()
|
void Explore::resume()
|
||||||
|
|
Loading…
Reference in New Issue