Changed behavior tree actions to ignore costmap
This commit is contained in:
1 parent
88ebe9fb68
commit
ff1fbf5abe
5 files changed
+17
-13
No files matched your search
@@ -47,6 +47,7 @@ protected:
|
|||||||
double target_angle_;
|
double target_angle_;
|
||||||
double target_sign_;
|
double target_sign_;
|
||||||
bool backwards_;
|
bool backwards_;
|
||||||
|
unsigned char mode_;
|
||||||
|
|
||||||
//State
|
//State
|
||||||
double last_speed_;
|
double last_speed_;
|
||||||
|
|||||||
@@ -74,6 +74,8 @@ ResultStatus MoveCoords::onStart(
|
|||||||
node->get_parameter(behavior_name_ + ".max_vel_speed", max_vel_speed_);
|
node->get_parameter(behavior_name_ + ".max_vel_speed", max_vel_speed_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mode_ = command->mode;
|
||||||
|
|
||||||
scl_.k_phi = k_phi_;
|
scl_.k_phi = k_phi_;
|
||||||
scl_.k_delta = k_delta_;
|
scl_.k_delta = k_delta_;
|
||||||
scl_.bbeta = beta_;
|
scl_.bbeta = beta_;
|
||||||
@@ -99,22 +101,24 @@ double MoveCoords::distanceToTarget(
|
|||||||
return target_sign * (dx * cos(target_theta) + dy * sin(target_theta));
|
return target_sign * (dx * cos(target_theta) + dy * sin(target_theta));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double MoveCoords::velocityTarget(const double dist_left)
|
||||||
double MoveCoords::velocityTarget(const double dist_left) {
|
{
|
||||||
const double lower_bound = last_speed_ - control_duration_ * max_vel_accel_;
|
const double lower_bound = last_speed_ - control_duration_ * max_vel_accel_;
|
||||||
const double upper_bound = last_speed_ + control_duration_ * max_vel_accel_;
|
const double upper_bound = last_speed_ + control_duration_ * max_vel_accel_;
|
||||||
|
|
||||||
|
|
||||||
double vel = max_vel_speed_;
|
double vel = max_vel_speed_;
|
||||||
double max_vel_to_stop = 0.8 * std::sqrt(2.0 * max_vel_decel_ * dist_left);
|
double max_vel_to_stop = 0.8 * std::sqrt(2.0 * max_vel_decel_ * dist_left);
|
||||||
vel = std::min(vel, max_vel_to_stop);
|
vel = std::min(vel, max_vel_to_stop);
|
||||||
return std::clamp(target_sign_ * vel, lower_bound, upper_bound);
|
return std::clamp(target_sign_ * vel, lower_bound, upper_bound);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MoveCoords::collisionDetection(const geometry_msgs::msg::Pose &pose, geometry_msgs::msg::Pose &last_ok_pose) {
|
bool MoveCoords::collisionDetection(
|
||||||
|
const geometry_msgs::msg::Pose & pose, geometry_msgs::msg::Pose & last_ok_pose)
|
||||||
|
{
|
||||||
const int samples = static_cast<int>(0.5 / control_duration_);
|
const int samples = static_cast<int>(0.5 / control_duration_);
|
||||||
geometry_msgs::msg::Pose current_pose = pose;
|
geometry_msgs::msg::Pose current_pose = pose;
|
||||||
last_ok_pose = pose;
|
last_ok_pose = pose;
|
||||||
|
const bool check_map = !(mode_ & MoveAction::Goal::IGNORE_OBSTACLES);
|
||||||
for (int i = 0; i < samples; i++) {
|
for (int i = 0; i < samples; i++) {
|
||||||
scl_.step(target_pose_, current_pose, control_duration_, backwards_);
|
scl_.step(target_pose_, current_pose, control_duration_, backwards_);
|
||||||
|
|
||||||
@@ -123,7 +127,7 @@ bool MoveCoords::collisionDetection(const geometry_msgs::msg::Pose &pose, geomet
|
|||||||
p.y = current_pose.position.y;
|
p.y = current_pose.position.y;
|
||||||
p.theta = tf2::getYaw(current_pose.orientation);
|
p.theta = tf2::getYaw(current_pose.orientation);
|
||||||
|
|
||||||
if(!local_collision_checker_->isCollisionFree(p, i==0)) {
|
if (check_map && !local_collision_checker_->isCollisionFree(p, i == 0)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +136,8 @@ bool MoveCoords::collisionDetection(const geometry_msgs::msg::Pose &pose, geomet
|
|||||||
}
|
}
|
||||||
|
|
||||||
last_ok_pose = current_pose;
|
last_ok_pose = current_pose;
|
||||||
const double dist_left = distanceToTarget(current_pose, target_pose_.position, target_angle_, backwards_);
|
const double dist_left =
|
||||||
|
distanceToTarget(current_pose, target_pose_.position, target_angle_, backwards_);
|
||||||
if (dist_left < 0.005) {
|
if (dist_left < 0.005) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -144,7 +149,6 @@ ResultStatus MoveCoords::updateVel(
|
|||||||
const geometry_msgs::msg::Pose & pose, const geometry_msgs::msg::Twist &,
|
const geometry_msgs::msg::Pose & pose, const geometry_msgs::msg::Twist &,
|
||||||
geometry_msgs::msg::Twist & out_vel)
|
geometry_msgs::msg::Twist & out_vel)
|
||||||
{
|
{
|
||||||
|
|
||||||
double dist_left = distanceToTarget(pose, target_pose_.position, target_angle_, backwards_);
|
double dist_left = distanceToTarget(pose, target_pose_.position, target_angle_, backwards_);
|
||||||
|
|
||||||
if (dist_left <= 0.001) {
|
if (dist_left <= 0.001) {
|
||||||
@@ -158,8 +162,8 @@ ResultStatus MoveCoords::updateVel(
|
|||||||
|
|
||||||
geometry_msgs::msg::Pose last_ok_pose;
|
geometry_msgs::msg::Pose last_ok_pose;
|
||||||
if (collisionDetection(pose, last_ok_pose)) {
|
if (collisionDetection(pose, last_ok_pose)) {
|
||||||
|
dist_left = distanceToTarget(
|
||||||
dist_left = distanceToTarget(pose, last_ok_pose.position, tf2::getYaw(last_ok_pose.orientation), backwards_);
|
pose, last_ok_pose.position, tf2::getYaw(last_ok_pose.orientation), backwards_);
|
||||||
if (dist_left <= 0.02) {
|
if (dist_left <= 0.02) {
|
||||||
out_vel.linear.x = 0;
|
out_vel.linear.x = 0;
|
||||||
out_vel.angular.z = 0;
|
out_vel.angular.z = 0;
|
||||||
@@ -168,8 +172,6 @@ ResultStatus MoveCoords::updateVel(
|
|||||||
scl_.calculate_vel(last_ok_pose, pose, out_vel, backwards_);
|
scl_.calculate_vel(last_ok_pose, pose, out_vel, backwards_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
last_speed_ = out_vel.linear.x;
|
last_speed_ = out_vel.linear.x;
|
||||||
|
|
||||||
RCLCPP_DEBUG_THROTTLE(logger_, *clock_, 1000, "Distance Left: %lf", dist_left);
|
RCLCPP_DEBUG_THROTTLE(logger_, *clock_, 1000, "Distance Left: %lf", dist_left);
|
||||||
@@ -185,11 +187,9 @@ ResultStatus MoveCoords::updateVel(
|
|||||||
return ResultStatus{Status::RUNNING};
|
return ResultStatus{Status::RUNNING};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
scl_.v_linear_max = target_sign_ * velocityTarget(dist_left);
|
scl_.v_linear_max = target_sign_ * velocityTarget(dist_left);
|
||||||
scl_.calculate_vel(target_pose_, pose, out_vel, backwards_);
|
scl_.calculate_vel(target_pose_, pose, out_vel, backwards_);
|
||||||
|
|
||||||
|
|
||||||
last_speed_ = out_vel.linear.x;
|
last_speed_ = out_vel.linear.x;
|
||||||
|
|
||||||
RCLCPP_DEBUG_THROTTLE(logger_, *clock_, 1000, "Distance Left: %lf", dist_left);
|
RCLCPP_DEBUG_THROTTLE(logger_, *clock_, 1000, "Distance Left: %lf", dist_left);
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ public:
|
|||||||
|
|
||||||
goal.max_speed = max_speed;
|
goal.max_speed = max_speed;
|
||||||
goal.backwards = backwards;
|
goal.backwards = backwards;
|
||||||
|
goal.mode = 1;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ public:
|
|||||||
goal.max_speed = max_speed.value();
|
goal.max_speed = max_speed.value();
|
||||||
goal.angle = angles::from_degrees(goal.angle);
|
goal.angle = angles::from_degrees(goal.angle);
|
||||||
goal.min_angle = angles::from_degrees(goal.min_angle);
|
goal.min_angle = angles::from_degrees(goal.min_angle);
|
||||||
|
goal.mode = 1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public:
|
|||||||
goal.angle = std::atan2(y - pose.pose.position.y, x - pose.pose.position.x);
|
goal.angle = std::atan2(y - pose.pose.position.y, x - pose.pose.position.x);
|
||||||
goal.min_angle = angles::from_degrees(min_angle);
|
goal.min_angle = angles::from_degrees(min_angle);
|
||||||
goal.max_speed = max_speed;
|
goal.max_speed = max_speed;
|
||||||
|
goal.mode = 1;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user