Auto Aim
This commit is contained in:
@@ -33,7 +33,9 @@ struct EnergyPartParam {
|
||||
long FAN_CONTOUR_AREA_MAX;
|
||||
long FAN_CONTOUR_AREA_MIN;
|
||||
long FAN_CONTOUR_LENGTH_MIN;
|
||||
long FAN_CONTOUR_LENGTH_MAX;
|
||||
long FAN_CONTOUR_WIDTH_MIN;
|
||||
long FAN_CONTOUR_WIDTH_MAX;
|
||||
float FAN_CONTOUR_HW_RATIO_MAX;
|
||||
float FAN_CONTOUR_HW_RATIO_MIN;
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ using std::vector;
|
||||
void Energy::StructingElementClose(cv::Mat &src){
|
||||
if (src.empty())return;
|
||||
//threshold(src, src, energy_part_param_.CAMERA_GRAY_THRESH, 255, THRESH_BINARY);
|
||||
Mat element = getStructuringElement(MORPH_RECT, Size(4, 4));
|
||||
Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
|
||||
morphologyEx(src, src, MORPH_CLOSE, element);
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ int Energy::findFan(const cv::Mat &src, vector<EnergyPart> &fans, int &last_fans
|
||||
std::vector<vector<Point> > fan_contours;
|
||||
|
||||
StructingElementClose(src_bin);
|
||||
// imshow("fan struct",src_bin);
|
||||
imshow("fan struct",src_bin);
|
||||
|
||||
findContours(src_bin, fan_contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
|
||||
|
||||
@@ -28,25 +28,26 @@ int Energy::findFan(const cv::Mat &src, vector<EnergyPart> &fans, int &last_fans
|
||||
continue;
|
||||
}
|
||||
|
||||
// double cur_contour_area = contourArea(fan_contour);
|
||||
// RotatedRect cur_rect = minAreaRect(fan_contour);
|
||||
// Size2f cur_size = cur_rect.size;
|
||||
double cur_contour_area = contourArea(fan_contour);
|
||||
RotatedRect cur_rect = minAreaRect(fan_contour);
|
||||
Size2f cur_size = cur_rect.size;
|
||||
//
|
||||
// cout<<"cur_contour_area: "<<cur_contour_area<<'\t'<<"rect_area: "<<cur_size.area()<<'\t'<<"ratio: "<<cur_contour_area/cur_size.area()<<endl;
|
||||
|
||||
// float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width;
|
||||
// float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width;
|
||||
float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width;
|
||||
float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width;
|
||||
|
||||
// if(length>5&&width>5){
|
||||
// if(length>20&&width>20){
|
||||
// cout<<cur_rect.center;
|
||||
// fans.emplace_back(fan_contour);
|
||||
// cout<<"fan area: "<<length<<'\t'<<width<<endl;
|
||||
// }
|
||||
|
||||
//
|
||||
fans.emplace_back(fan_contour);
|
||||
// cout<<"fan area: "<<length<<'\t'<<width<<endl;
|
||||
|
||||
}
|
||||
// cout<<fans.size()<<endl;
|
||||
if(fans.size() < last_fans_cnt){
|
||||
last_fans_cnt = static_cast<int>(fans.size());
|
||||
return -1;
|
||||
@@ -100,13 +101,14 @@ int Energy::findArmor(const cv::Mat &src, vector<EnergyPart> &armors, int &last_
|
||||
float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width;
|
||||
float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width;
|
||||
|
||||
// if(length>10&&width>10){
|
||||
// if(length>10&&width>5){
|
||||
// armors.emplace_back(armor_contour);
|
||||
// cout<<"armor area: "<<length<<'\t'<<width<<'\t'<<cur_rect.center<<endl;
|
||||
// armors.emplace_back(armor_contour);
|
||||
// cout<<"armor area: "<<length<<'\t'<<width<<endl;
|
||||
// }
|
||||
armors.emplace_back(armor_contour);
|
||||
cout<<"armor area: "<<length<<'\t'<<width<<endl;
|
||||
|
||||
// cout<<"armor area: "<<length<<'\t'<<width<<endl;
|
||||
}
|
||||
if(armors.size() < last_armors_cnt){
|
||||
last_armors_cnt = static_cast<int>(armors.size());
|
||||
@@ -164,7 +166,8 @@ bool Energy::isValidFanContour(const vector<cv::Point> &fan_contour) {
|
||||
Size2f cur_size = cur_rect.size;
|
||||
float length = cur_size.height > cur_size.width ? cur_size.height : cur_size.width;
|
||||
float width = cur_size.height < cur_size.width ? cur_size.height : cur_size.width;
|
||||
if (length < energy_part_param_.FAN_CONTOUR_LENGTH_MIN || width < energy_part_param_.FAN_CONTOUR_WIDTH_MIN)
|
||||
if (length < energy_part_param_.FAN_CONTOUR_LENGTH_MIN || width < energy_part_param_.FAN_CONTOUR_WIDTH_MIN ||
|
||||
length > energy_part_param_.FAN_CONTOUR_LENGTH_MAX || width > energy_part_param_.FAN_CONTOUR_WIDTH_MAX)
|
||||
{
|
||||
//cout<<"length width min fail."<<endl;
|
||||
return false;
|
||||
|
||||
@@ -11,7 +11,7 @@ using std::vector;
|
||||
void Energy::initEnergyPartParam() {
|
||||
|
||||
energy_part_param_.RPM = 10;
|
||||
energy_part_param_.HIT_TIME = 1.5;
|
||||
energy_part_param_.HIT_TIME = 1.14;
|
||||
|
||||
energy_part_param_.GRAY_THRESH = 240;
|
||||
energy_part_param_.SPLIT_GRAY_THRESH = 80;
|
||||
@@ -19,17 +19,19 @@ void Energy::initEnergyPartParam() {
|
||||
energy_part_param_.ARMOR_GRAY_THRESH = 80;
|
||||
|
||||
energy_part_param_.FAN_CONTOUR_AREA_MAX = 17000;
|
||||
energy_part_param_.FAN_CONTOUR_AREA_MIN = 7000;
|
||||
energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 150;
|
||||
energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 50;
|
||||
energy_part_param_.FAN_CONTOUR_AREA_MIN = 0;
|
||||
energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 100;
|
||||
energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 140;
|
||||
energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 40;
|
||||
energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 60;
|
||||
energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4;
|
||||
energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1;
|
||||
|
||||
energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000;
|
||||
energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0;
|
||||
energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 50;
|
||||
energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 25;
|
||||
energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 80;
|
||||
energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 30;
|
||||
energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 20;
|
||||
energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 60;
|
||||
energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 50;
|
||||
energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3;
|
||||
energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1;
|
||||
|
||||
@@ -63,9 +63,9 @@ int Energy::run(cv::Mat &src){
|
||||
cycleLeastFit();
|
||||
|
||||
|
||||
cycle_center = cv::Point(332,233);
|
||||
radius = 208.835;
|
||||
attack_distance = ATTACK_DISTANCE * 203.728 / radius;
|
||||
// cycle_center = cv::Point(212,246);
|
||||
// radius = 123.942;
|
||||
attack_distance = ATTACK_DISTANCE * 123.323 / radius;
|
||||
|
||||
getFanPosition(fanPosition, fans, cycle_center, radius);
|
||||
getArmorPosition(armorPosition, armors, cycle_center, radius);
|
||||
@@ -74,7 +74,7 @@ int Energy::run(cv::Mat &src){
|
||||
cout<<"The target armor center is: "<<target_center<<endl;
|
||||
|
||||
getHitPoint();
|
||||
hit_point = target_center;
|
||||
// hit_point = target_center;
|
||||
cout << "The hit point position is " << hit_point << endl;
|
||||
// hit_point = cycle_center;
|
||||
|
||||
|
||||
16
main.cpp
16
main.cpp
@@ -23,7 +23,7 @@ using namespace std;
|
||||
#define ENERGY_STATE 1
|
||||
#define ARMOR_STATE 0
|
||||
|
||||
int state = ARMOR_STATE;
|
||||
int state = ENERGY_STATE;
|
||||
float curr_yaw=0, curr_pitch=0;
|
||||
float mark_yaw=0, mark_pitch=0;
|
||||
int mark = 0;
|
||||
@@ -99,24 +99,28 @@ void uartReceive(Uart* uart){
|
||||
while((data=uart->receive()) != '\n'){
|
||||
buffer[cnt++] = data;
|
||||
if(cnt >= 100){
|
||||
LOGE("data receive over flow!");
|
||||
// LOGE("data receive over flow!");
|
||||
}
|
||||
}
|
||||
if(cnt == 10){
|
||||
if(buffer[8] == 'e'){
|
||||
state = ENERGY_STATE;
|
||||
LOGM("Energy state");
|
||||
// LOGM("Energy state");
|
||||
}else if(buffer[8] == 'a'){
|
||||
state = ARMOR_STATE;
|
||||
LOGM("Armor state");
|
||||
// LOGM("Armor state");
|
||||
}
|
||||
memcpy(&curr_yaw, buffer, 4);
|
||||
memcpy(&curr_pitch, buffer+4, 4);
|
||||
LOGM("Get yaw:%f pitch:%f", curr_yaw, curr_pitch);
|
||||
// LOGM("Get yaw:%f pitch:%f", curr_yaw, curr_pitch);
|
||||
if(buffer[9] == 1){
|
||||
if(mark == 0){
|
||||
mark = 1;
|
||||
mark_yaw = curr_yaw;
|
||||
mark_pitch = curr_pitch;
|
||||
LOGM("Marked");
|
||||
}
|
||||
|
||||
// LOGM("Marked");
|
||||
}
|
||||
}
|
||||
cnt = 0;
|
||||
|
||||
Reference in New Issue
Block a user