Skip to content

Commit 080f9bf

Browse files
committed
validityfilter and pose estimator variables as ros2 params
1 parent 35ed268 commit 080f9bf

File tree

9 files changed

+117
-23
lines changed

9 files changed

+117
-23
lines changed

src/prm_launch/launch/video2detector.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ def generate_launch_description():
1515
emulate_tty=True,
1616
executable='VideoCaptureNode',
1717
parameters=[{'source': str(video_path),
18-
'fps': 1,
18+
'fps': 4,
1919
'frame_id': 'video',
2020
}]
2121
),

src/prm_vision/opencv_armor_detector/src/OpenCVArmorDetector.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ std::vector<_Float32> OpenCVArmorDetector::search(cv::Mat &frame)
9292
_search_area[2] = std::min(x_max + 50, WIDTH);
9393
_search_area[3] = std::min(y_max + 50, HEIGHT);
9494
}
95+
else
96+
{
97+
// Reset the search area to the full frame
98+
_reset_search_area = true;
99+
}
100+
95101
_detected_frame++;
96102
}
97103

src/prm_vision/opencv_armor_detector/src/OpenCVArmorDetectorNode.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ rcl_interfaces::msg::SetParametersResult OpenCVArmorDetectorNode::parameters_cal
6868
RCLCPP_INFO(get_logger(), "New max missed frames: %d",
6969
_max_missed_frames);
7070
}
71+
else if (parameter.get_name() == "_reduce_search_area")
72+
{
73+
_reduce_search_area = parameter.as_bool();
74+
RCLCPP_INFO(get_logger(), "New reduce search area: %s",
75+
_reduce_search_area ? "true" : "false");
76+
}
7177
else
7278
{
7379
result.successful = false;
@@ -76,7 +82,7 @@ rcl_interfaces::msg::SetParametersResult OpenCVArmorDetectorNode::parameters_cal
7682
}
7783

7884
// Update the detector's config
79-
detector->setConfig({_target_color, _hue_range_limit, _saturation_lower_limit, _value_lower_limit, _max_missed_frames});
85+
detector->setConfig({_target_color, _hue_range_limit, _saturation_lower_limit, _value_lower_limit, _max_missed_frames, _reduce_search_area});
8086
return result;
8187
}
8288

src/prm_vision/pose_estimator/include/PoseEstimator.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,18 @@ class PoseEstimator
2525
PoseEstimator() {}
2626
~PoseEstimator() {}
2727

28+
ValidityFilter validity_filter_ = ValidityFilter();
29+
2830
// Class methods
2931
double estimateYaw(const double yaw_guess, const std::vector<cv::Point2f> &image_points, const cv::Mat &tvec);
3032
void estimateTranslation(const std::vector<cv::Point2f> &image_points, bool largeArmor, cv::Mat &tvec, cv::Mat &rvec);
3133
bool isValid(float x, float y, float z, std::string &auto_aim_status, bool &reset_kalman);
3234

35+
// Setters
36+
void setNumFramesToFireAfter(int num_frames_to_fire_after) { _num_frames_to_fire_after = num_frames_to_fire_after; }
37+
3338
private:
3439
// Class methods
35-
ValidityFilter validity_filter_ = ValidityFilter();
3640
double computeLoss(double yaw_guess, std::vector<cv::Point2f> image_points, cv::Mat tvec);
3741
double gradientWrtYawFinitediff(double yaw, std::vector<cv::Point2f> image_points, cv::Mat tvec);
3842

@@ -41,6 +45,13 @@ class PoseEstimator
4145
int _num_frames_to_fire_after = 3;
4246
std::chrono::time_point<std::chrono::system_clock> _last_fire_time;
4347

48+
// Validity filter parameters
49+
int _lock_in_after = 3;
50+
float _max_distance = 10000;
51+
float _min_distance = 10;
52+
float _max_shift_distance = 150;
53+
int _prev_len = 5;
54+
4455
/**
4556
* @brief Functor for the loss function and gradient computation.
4657
*

src/prm_vision/pose_estimator/include/PoseEstimatorNode.hpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,17 @@
1717

1818
// Pose Estimator classes
1919
#include "PoseEstimator.h"
20-
#include "ValidityFilter.hpp"
2120

2221
class PoseEstimatorNode : public rclcpp::Node
2322
{
2423
public:
2524
PoseEstimatorNode(const rclcpp::NodeOptions &options);
2625
~PoseEstimatorNode();
2726

27+
PoseEstimator *pose_estimator = new PoseEstimator();
28+
ValidityFilter &validity_filter_ = pose_estimator->validity_filter_; // Reference to the validity filter
29+
2830
private:
29-
PoseEstimator *pose_estimator;
3031
double _last_yaw_estimate = 0.0;
3132
int _allowed_missed_frames_before_no_fire = 0; // Gets set to 5 when we have a valid pose estimate
3233

@@ -37,6 +38,8 @@ class PoseEstimatorNode : public rclcpp::Node
3738
rclcpp::Subscription<vision_msgs::msg::KeyPoints>::SharedPtr key_points_subscriber;
3839
std::shared_ptr<rclcpp::Publisher<vision_msgs::msg::PredictedArmor>> predicted_armor_publisher;
3940
void keyPointsCallback(const vision_msgs::msg::KeyPoints::SharedPtr msg);
41+
OnSetParametersCallbackHandle::SharedPtr params_callback_handle_;
42+
rcl_interfaces::msg::SetParametersResult parameters_callback(const std::vector<rclcpp::Parameter> &parameters);
4043
};
4144

4245
#endif // POSE_ESTIMATOR_NODE_HPP

src/prm_vision/pose_estimator/include/ValidityFilter.hpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@ enum ValidityFilterState
1717
class ValidityFilter
1818
{
1919
public:
20-
ValidityFilter(int lock_in_after, float max_distance, float min_distance, float max_shift_distance, float prev_len);
20+
ValidityFilter(int lock_in_after = 3, float max_distance = 10000, float min_distance = 10, float max_shift_distance = 150, int prev_len = 5);
2121

22-
ValidityFilter();
2322
~ValidityFilter();
2423

2524
bool shouldResetKalman(float x, float y, float z);
@@ -35,26 +34,33 @@ class ValidityFilter
3534
float *getPrevX() { return _prev_x; }
3635
float *getPrevY() { return _prev_y; }
3736
float *getPrevZ() { return _prev_z; }
37+
int getLockInAfter() { return _lock_in_after; }
38+
39+
// Setters
40+
void setLockInAfter(int lock_in_after) { _lock_in_after = lock_in_after; }
41+
void setMaxDistance(float max_distance) { _max_distance = max_distance; }
42+
void setMinDistance(float min_distance) { _min_distance = min_distance; }
43+
void setMaxShiftDistance(float max_shift_distance) { _max_shift_distance = max_shift_distance; }
44+
void setPrevLen(int prev_len) { _prev_len = prev_len; }
45+
void setMaxDt(double max_dt) { _max_dt = max_dt; }
3846

3947
protected:
40-
int _lock_in_after = 3; // lock in after n frames
48+
int _lock_in_after; // lock in after n frames
49+
float _max_distance; // mm
50+
float _min_distance; // mm
51+
float _max_shift_distance; // mm
52+
int _prev_len; // check the back n frames for max shift distance vilolation
53+
4154
int _lock_in_counter = 0;
4255

4356
// zero time point
4457
std::chrono::steady_clock::time_point _last_valid_time = std::chrono::steady_clock::time_point::min();
4558

46-
float _max_distance = 10000.f; // mm
47-
float _min_distance = 10.f; // mm
48-
49-
int _prev_len = 5; // check the back n frames for max shift distance vilolation
50-
5159
float _prev_x[20];
5260
float _prev_y[20];
5361
float _prev_z[20];
5462
int _prev_idx = 0;
5563

56-
float _max_shift_distance = 150.f; // mm
57-
5864
void incrementLockInCounter();
5965
void decrementLockInCounter();
6066
void resetLockInCounter();

src/prm_vision/pose_estimator/src/PoseEstimator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,8 @@ bool PoseEstimator::isValid(float x, float y, float z, std::string &auto_aim_sta
9393
// We have enough valid detections to track the target
9494
else if (validity_filter_.state == TRACKING)
9595
{
96-
// if validity filter valid for last 3 frames, increment locked_in_frames
97-
if (validity_filter_.getLockInCounter() == 3)
96+
// if validity filter valid for last number of frames, increment locked_in_frames
97+
if (validity_filter_.getLockInCounter() == validity_filter_.getLockInAfter())
9898
{
9999
_consecutive_tracking_frames_ctr++;
100100
}

src/prm_vision/pose_estimator/src/PoseEstimatorNode.cpp

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,79 @@ PoseEstimatorNode::PoseEstimatorNode(const rclcpp::NodeOptions &options) : Node(
44
{
55
RCLCPP_INFO(get_logger(), "PoseEstimatorNode has been started.");
66

7-
// Initialize the pose estimator
8-
pose_estimator = new PoseEstimator();
9-
107
// Callbacks and pub/sub
118
key_points_subscriber = this->create_subscription<vision_msgs::msg::KeyPoints>("key_points", 10, std::bind(&PoseEstimatorNode::keyPointsCallback, this, std::placeholders::_1));
129
predicted_armor_publisher = this->create_publisher<vision_msgs::msg::PredictedArmor>("predicted_armor", 10);
10+
11+
// Dynamic parameters
12+
pose_estimator->setNumFramesToFireAfter(this->declare_parameter("_num_frames_to_fire_after", 3));
13+
validity_filter_.setLockInAfter(this->declare_parameter("_lock_in_after", 3));
14+
validity_filter_.setMaxDistance(this->declare_parameter("_max_distance", 10000));
15+
validity_filter_.setMinDistance(this->declare_parameter("_min_distance", 10));
16+
validity_filter_.setMaxShiftDistance(this->declare_parameter("_max_shift_distance", 150));
17+
validity_filter_.setPrevLen(this->declare_parameter("_prev_len", 5));
18+
validity_filter_.setMaxDt(this->declare_parameter("_max_dt", 2000.0));
19+
params_callback_handle_ = this->add_on_set_parameters_callback(std::bind(&PoseEstimatorNode::parameters_callback, this, std::placeholders::_1));
1320
}
1421

1522
PoseEstimatorNode::~PoseEstimatorNode() { delete pose_estimator; }
1623

24+
rcl_interfaces::msg::SetParametersResult PoseEstimatorNode::parameters_callback(
25+
const std::vector<rclcpp::Parameter> &parameters)
26+
{
27+
rcl_interfaces::msg::SetParametersResult result;
28+
result.successful = true;
29+
result.reason = "Parameters successfully updated.";
30+
31+
for (const auto &param : parameters)
32+
{
33+
if (param.get_name() == "_num_frames_to_fire_after" && param.get_type() == rclcpp::ParameterType::PARAMETER_INTEGER)
34+
{
35+
pose_estimator->setNumFramesToFireAfter(param.as_int());
36+
RCLCPP_INFO(this->get_logger(), "Parameter '_num_frames_to_fire_after' updated to: %d", param.as_int());
37+
}
38+
else if (param.get_name() == "_lock_in_after" && param.get_type() == rclcpp::ParameterType::PARAMETER_INTEGER)
39+
{
40+
validity_filter_.setLockInAfter(param.as_int());
41+
RCLCPP_INFO(this->get_logger(), "Parameter '_lock_in_after' updated to: %d", param.as_int());
42+
}
43+
else if (param.get_name() == "_max_distance" && param.get_type() == rclcpp::ParameterType::PARAMETER_INTEGER)
44+
{
45+
validity_filter_.setMaxDistance(param.as_int());
46+
RCLCPP_INFO(this->get_logger(), "Parameter '_max_distance' updated to: %d", param.as_int());
47+
}
48+
else if (param.get_name() == "_min_distance" && param.get_type() == rclcpp::ParameterType::PARAMETER_INTEGER)
49+
{
50+
validity_filter_.setMinDistance(param.as_int());
51+
RCLCPP_INFO(this->get_logger(), "Parameter '_min_distance' updated to: %d", param.as_int());
52+
}
53+
else if (param.get_name() == "_max_shift_distance" && param.get_type() == rclcpp::ParameterType::PARAMETER_INTEGER)
54+
{
55+
validity_filter_.setMaxShiftDistance(param.as_int());
56+
RCLCPP_INFO(this->get_logger(), "Parameter '_max_shift_distance' updated to: %d", param.as_int());
57+
}
58+
else if (param.get_name() == "_prev_len" && param.get_type() == rclcpp::ParameterType::PARAMETER_INTEGER)
59+
{
60+
validity_filter_.setPrevLen(param.as_int());
61+
RCLCPP_INFO(this->get_logger(), "Parameter '_prev_len' updated to: %d", param.as_int());
62+
}
63+
else if (param.get_name() == "_max_dt" && param.get_type() == rclcpp::ParameterType::PARAMETER_DOUBLE || param.get_type())
64+
{
65+
validity_filter_.setMaxDt(param.as_double());
66+
RCLCPP_INFO(this->get_logger(), "Parameter '_max_dt' updated to: %f", param.as_double());
67+
RCLCPP_INFO(this->get_logger(), "max dt is %f", validity_filter_._max_dt);
68+
}
69+
else
70+
{
71+
result.successful = false;
72+
result.reason = "Invalid parameter or type.";
73+
RCLCPP_WARN(this->get_logger(), "Failed to update parameter: %s", param.get_name().c_str());
74+
}
75+
}
76+
77+
return result;
78+
}
79+
1780
void PoseEstimatorNode::keyPointsCallback(const vision_msgs::msg::KeyPoints::SharedPtr key_points_msg)
1881
{
1982
if (key_points_msg->points.size() != 8 || key_points_msg->points[4] == 0) // idx 4 is x-coord of top right corner, so if it's 0, we know there's no armor

src/prm_vision/pose_estimator/src/ValidityFilter.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#include "ValidityFilter.hpp"
22

3-
ValidityFilter::ValidityFilter(int lock_in_after, float max_distance, float min_distance, float max_shift_distance, float prev_len)
3+
ValidityFilter::ValidityFilter(int lock_in_after, float max_distance, float min_distance, float max_shift_distance, int prev_len)
44
{
55
this->_lock_in_after = lock_in_after;
66
this->_max_distance = max_distance;
77
this->_min_distance = min_distance;
88
this->_max_shift_distance = max_shift_distance;
9-
this->_prev_len = std::min(prev_len, 20.0f);
9+
this->_prev_len = std::min(prev_len, 20);
1010

1111
// Initialize arrays to track previous predictions
1212
for (int i = 0; i < this->_prev_len; i++)
@@ -17,7 +17,6 @@ ValidityFilter::ValidityFilter(int lock_in_after, float max_distance, float min_
1717
}
1818
}
1919

20-
ValidityFilter::ValidityFilter() {}
2120
ValidityFilter::~ValidityFilter() {}
2221

2322
/**

0 commit comments

Comments
 (0)