|
|
|
|
@@ -36,7 +36,9 @@ ArmorSolverNode::ArmorSolverNode(const rclcpp::NodeOptions &options)
|
|
|
|
|
debug_mode_ = this->declare_parameter("debug", true);
|
|
|
|
|
bullet_speed_debug_.store(this->declare_parameter("bullet_speed_debug", false),
|
|
|
|
|
std::memory_order_relaxed);
|
|
|
|
|
shoot_rate_.store(this->declare_parameter("solver.shoot_rate", 3), std::memory_order_relaxed);
|
|
|
|
|
shoot_rate_min_.store(this->declare_parameter("solver.shoot_rate_min", 3), std::memory_order_relaxed);
|
|
|
|
|
shoot_rate_max_.store(this->declare_parameter("solver.shoot_rate_max", 13), std::memory_order_relaxed);
|
|
|
|
|
ekf_count_threshold_.store(this->declare_parameter("solver.ekf_count_threshold", 30), std::memory_order_relaxed);
|
|
|
|
|
if (this->has_parameter("solver.bullet_speed")) {
|
|
|
|
|
bullet_speed_param_.store(this->get_parameter("solver.bullet_speed").as_double(),
|
|
|
|
|
std::memory_order_relaxed);
|
|
|
|
|
@@ -205,7 +207,7 @@ ArmorSolverNode::ArmorSolverNode(const rclcpp::NodeOptions &options)
|
|
|
|
|
control_msg_last.yaw = 0;
|
|
|
|
|
control_msg_last.fire_advice = false;
|
|
|
|
|
control_msg_last.shoot_rate =
|
|
|
|
|
static_cast<uint8_t>(shoot_rate_.load(std::memory_order_relaxed));
|
|
|
|
|
static_cast<uint8_t>(shoot_rate_min_.load(std::memory_order_relaxed));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -231,14 +233,25 @@ void ArmorSolverNode::timerCallback() {
|
|
|
|
|
|
|
|
|
|
// Init message
|
|
|
|
|
rm_interfaces::msg::GimbalCmd control_msg;
|
|
|
|
|
int shoot_rate = shoot_rate_.load(std::memory_order_relaxed);
|
|
|
|
|
if (shoot_rate < 0)
|
|
|
|
|
{
|
|
|
|
|
int shoot_rate_min = shoot_rate_min_.load(std::memory_order_relaxed);
|
|
|
|
|
int shoot_rate_max = shoot_rate_max_.load(std::memory_order_relaxed);
|
|
|
|
|
int ekf_count = ekf_detect_count_.load(std::memory_order_relaxed);
|
|
|
|
|
int ekf_threshold = ekf_count_threshold_.load(std::memory_order_relaxed);
|
|
|
|
|
int shoot_rate;
|
|
|
|
|
|
|
|
|
|
// Calculate shoot_rate based on EKF detect count
|
|
|
|
|
// Range: shoot_rate_min ~ shoot_rate_max
|
|
|
|
|
if (ekf_count >= ekf_threshold) {
|
|
|
|
|
// Gradually increase shoot_rate from min to max as count increases
|
|
|
|
|
int range = shoot_rate_max - shoot_rate_min;
|
|
|
|
|
int additional_rate = std::min(range, (ekf_count - ekf_threshold) / 3);
|
|
|
|
|
shoot_rate = shoot_rate_min + additional_rate;
|
|
|
|
|
} else {
|
|
|
|
|
shoot_rate = shoot_rate_min;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (shoot_rate < 0) {
|
|
|
|
|
shoot_rate = 0;
|
|
|
|
|
}
|
|
|
|
|
else if (shoot_rate > 8)
|
|
|
|
|
{
|
|
|
|
|
shoot_rate = 8;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If target never detected
|
|
|
|
|
@@ -367,7 +380,11 @@ void ArmorSolverNode::armorsCallback(const rm_interfaces::msg::Armors::SharedPtr
|
|
|
|
|
if (tracker_->tracker_state == Tracker::LOST) {
|
|
|
|
|
tracker_->init(armors_msg);
|
|
|
|
|
target_msg.tracking = false;
|
|
|
|
|
// Reset EKF detect count when tracker is lost
|
|
|
|
|
ekf_detect_count_.store(0, std::memory_order_relaxed);
|
|
|
|
|
} else {
|
|
|
|
|
// Increment EKF detect count when successfully tracking (not lost)
|
|
|
|
|
ekf_detect_count_.fetch_add(1, std::memory_order_relaxed);
|
|
|
|
|
dt_ = (time - last_time_).seconds();
|
|
|
|
|
tracker_->lost_thres = std::abs(static_cast<int>(lost_time_thres_ / dt_));
|
|
|
|
|
if (tracker_->tracked_id == "outpost") {
|
|
|
|
|
@@ -406,6 +423,7 @@ void ArmorSolverNode::armorsCallback(const rm_interfaces::msg::Armors::SharedPtr
|
|
|
|
|
target_msg.radius_2 = tracker_->another_r;
|
|
|
|
|
target_msg.d_zc = state(9);
|
|
|
|
|
target_msg.d_za = tracker_->d_za;
|
|
|
|
|
target_msg.ekf_detect_count = ekf_detect_count_.load(std::memory_order_relaxed);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -563,8 +581,12 @@ rcl_interfaces::msg::SetParametersResult ArmorSolverNode::onSetParameters(
|
|
|
|
|
bullet_speed_debug_.store(param.as_bool(), std::memory_order_relaxed);
|
|
|
|
|
} else if (param.get_name() == "solver.bullet_speed") {
|
|
|
|
|
bullet_speed_param_.store(param.as_double(), std::memory_order_relaxed);
|
|
|
|
|
} else if (param.get_name() == "solver.shoot_rate") {
|
|
|
|
|
shoot_rate_.store(param.as_int(), std::memory_order_relaxed);
|
|
|
|
|
} else if (param.get_name() == "solver.shoot_rate_min") {
|
|
|
|
|
shoot_rate_min_.store(param.as_int(), std::memory_order_relaxed);
|
|
|
|
|
} else if (param.get_name() == "solver.shoot_rate_max") {
|
|
|
|
|
shoot_rate_max_.store(param.as_int(), std::memory_order_relaxed);
|
|
|
|
|
} else if (param.get_name() == "solver.ekf_count_threshold") {
|
|
|
|
|
ekf_count_threshold_.store(param.as_int(), std::memory_order_relaxed);
|
|
|
|
|
} else if (param.get_name() == "tracker.max_match_distance") {
|
|
|
|
|
const double max_match_distance = param.as_double();
|
|
|
|
|
tracker_->setMatchThreshold(max_match_distance, this->get_parameter("tracker.max_match_yaw_diff").as_double());
|
|
|
|
|
|