修订拼写错误,增加独立config。
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,4 +5,5 @@ Mark
|
||||
armor_box_photo
|
||||
tools/TrainCNN/.idea
|
||||
tools/TrainCNN/__pycache__
|
||||
others/include/config/config.h
|
||||
.DS_Store
|
||||
|
||||
@@ -8,6 +8,14 @@ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPATH=\"\\\"${PROJECT_SOURCE_DIR}\\\"\"
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D${CMAKE_SYSTEM_NAME}")
|
||||
SET(BIN_NAME "run")
|
||||
|
||||
|
||||
FIND_FILE(CONFIG_FOUND "config.h" "others/include/config")
|
||||
if (CONFIG_FOUND)
|
||||
MESSAGE("Found config.h")
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWITH_CONFIG")
|
||||
endif()
|
||||
|
||||
|
||||
FIND_PROGRAM(CCACHE_FOUND ccache)
|
||||
IF(CCACHE_FOUND)
|
||||
SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
||||
|
||||
@@ -27,9 +27,9 @@ public:
|
||||
Energy(Serial &u, uint8_t &color);//构造函数,参数为串口和敌方颜色
|
||||
~Energy();//默认析构函数
|
||||
|
||||
void run(cv::Mat &gimble_src, cv::Mat &chassis_src);
|
||||
void run(cv::Mat &gimbal_src, cv::Mat &chassis_src);
|
||||
|
||||
void run(cv::Mat &gimble_src);
|
||||
void run(cv::Mat &gimbal_src);
|
||||
|
||||
Serial &serial;//串口
|
||||
void setEnergyInit();//设置能量机关初始化
|
||||
@@ -40,13 +40,13 @@ public:
|
||||
|
||||
private:
|
||||
EnergyPartParam energy_part_param_;//能量机关的参数设置
|
||||
EnergyPartParam gimble_energy_part_param_;//云台摄像头能量机关的参数设置
|
||||
EnergyPartParam gimbal_energy_part_param_;//云台摄像头能量机关的参数设置
|
||||
EnergyPartParam chassis_energy_part_param_;//底盘摄像头能量机关的参数设置
|
||||
|
||||
bool isMark;//若操作手正在手动标定,则为true
|
||||
bool isBig;//大符模式为true
|
||||
bool isSmall;//小符模式为true
|
||||
bool isGimble;//同时具有底盘和云台摄像头时,处于云台摄像头对心过程
|
||||
bool isgimbal;//同时具有底盘和云台摄像头时,处于云台摄像头对心过程
|
||||
bool isChassis;//同时具有底盘和云台摄像头时,处于底盘摄像头击打过程
|
||||
bool isGuessing;//当前处于发弹到新目标出现的过程,则为true,此时猜测下一个目标
|
||||
bool isPredicting;//当前处于新目标出现到发弹的过程,则为true,此时正常击打
|
||||
@@ -154,7 +154,7 @@ private:
|
||||
void getPredictPoint(cv::Point target_point);//获取预测点位
|
||||
void getAimPoint(cv::Point target_point);//通过自瞄逻辑计算点位
|
||||
void changeMark();//操作手手动修改标定值
|
||||
void gimbleRotation();//计算云台旋转角度
|
||||
void gimbalRotation();//计算云台旋转角度
|
||||
void getAllTargetArmorCenters();//记录所有目标装甲板中心坐标
|
||||
void getRecentTargetArmorCenters();//记录近30帧目标装甲板中心坐标
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ using namespace cv;
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
void Energy::startChassis(){
|
||||
isChassis = true;
|
||||
isGimble = false;
|
||||
isgimbal = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ Energy::Energy(Serial &u, uint8_t &color) : serial(u), ally_color(color),
|
||||
energy_rotation_init = false;
|
||||
isBig = false;
|
||||
isSmall = false;
|
||||
isGimble = true;
|
||||
isgimbal = true;
|
||||
isChassis = false;
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ void Energy::setEnergyInit() {
|
||||
energy_rotation_init = true;
|
||||
isBig = false;
|
||||
isSmall = false;
|
||||
isGimble = true;
|
||||
isgimbal = true;
|
||||
isChassis = false;
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ void Energy::setBigEnergyInit() {
|
||||
energy_rotation_init = true;
|
||||
isBig = true;
|
||||
isSmall = false;
|
||||
isGimble = true;
|
||||
isgimbal = true;
|
||||
isChassis = false;
|
||||
}
|
||||
|
||||
@@ -73,6 +73,6 @@ void Energy::setSmallEnergyInit() {
|
||||
|
||||
isBig = false;
|
||||
isSmall = true;
|
||||
isGimble = true;
|
||||
isgimbal = true;
|
||||
isChassis = false;
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ void Energy::changeMark() {
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// 此函数用于计算云台应当转到的角度
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
void Energy::gimbleRotation() {
|
||||
void Energy::gimbalRotation() {
|
||||
cv::Point2f real_predict_point;//计算在真实世界中的预测点位,进而计算云台的旋转角度
|
||||
stretch(predict_point, real_predict_point);
|
||||
yaw_rotation = static_cast<float>(180 / PI *
|
||||
|
||||
@@ -60,68 +60,68 @@ void Energy::initEnergy() {
|
||||
// 此函数对能量机关参数进行初始化
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
void Energy::initEnergyPartParam() {
|
||||
gimble_energy_part_param_.GRAY_THRESH = 160;
|
||||
gimble_energy_part_param_.SPLIT_GRAY_THRESH = 180;
|
||||
gimble_energy_part_param_.FAN_GRAY_THRESH = 75;
|
||||
gimble_energy_part_param_.ARMOR_GRAY_THRESH = 80;
|
||||
gimbal_energy_part_param_.GRAY_THRESH = 160;
|
||||
gimbal_energy_part_param_.SPLIT_GRAY_THRESH = 180;
|
||||
gimbal_energy_part_param_.FAN_GRAY_THRESH = 75;
|
||||
gimbal_energy_part_param_.ARMOR_GRAY_THRESH = 80;
|
||||
|
||||
gimble_energy_part_param_.FAN_CONTOUR_AREA_MAX = 6600;
|
||||
gimble_energy_part_param_.FAN_CONTOUR_AREA_MIN = 0;
|
||||
gimble_energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 56;
|
||||
gimble_energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 88;
|
||||
gimble_energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 21;
|
||||
gimble_energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 40;
|
||||
gimble_energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4;
|
||||
gimble_energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1;
|
||||
gimble_energy_part_param_.FAN_NON_ZERO_RATE_MAX = 0.8;
|
||||
gimble_energy_part_param_.FAN_NON_ZERO_RATE_MIN = 0.48;
|
||||
gimbal_energy_part_param_.FAN_CONTOUR_AREA_MAX = 6600;
|
||||
gimbal_energy_part_param_.FAN_CONTOUR_AREA_MIN = 0;
|
||||
gimbal_energy_part_param_.FAN_CONTOUR_LENGTH_MIN = 56;
|
||||
gimbal_energy_part_param_.FAN_CONTOUR_LENGTH_MAX = 88;
|
||||
gimbal_energy_part_param_.FAN_CONTOUR_WIDTH_MIN = 21;
|
||||
gimbal_energy_part_param_.FAN_CONTOUR_WIDTH_MAX = 40;
|
||||
gimbal_energy_part_param_.FAN_CONTOUR_HW_RATIO_MAX = 4;
|
||||
gimbal_energy_part_param_.FAN_CONTOUR_HW_RATIO_MIN = 1;
|
||||
gimbal_energy_part_param_.FAN_NON_ZERO_RATE_MAX = 0.8;
|
||||
gimbal_energy_part_param_.FAN_NON_ZERO_RATE_MIN = 0.48;
|
||||
|
||||
gimble_energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000;
|
||||
gimble_energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0;
|
||||
gimble_energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 18;
|
||||
gimble_energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 32;
|
||||
gimble_energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 10;
|
||||
gimble_energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 30;
|
||||
gimble_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3;
|
||||
gimble_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1;
|
||||
gimbal_energy_part_param_.ARMOR_CONTOUR_AREA_MAX = 100000;
|
||||
gimbal_energy_part_param_.ARMOR_CONTOUR_AREA_MIN = 0;
|
||||
gimbal_energy_part_param_.ARMOR_CONTOUR_LENGTH_MIN = 18;
|
||||
gimbal_energy_part_param_.ARMOR_CONTOUR_LENGTH_MAX = 32;
|
||||
gimbal_energy_part_param_.ARMOR_CONTOUR_WIDTH_MIN = 10;
|
||||
gimbal_energy_part_param_.ARMOR_CONTOUR_WIDTH_MAX = 30;
|
||||
gimbal_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MAX = 3;
|
||||
gimbal_energy_part_param_.ARMOR_CONTOUR_HW_RATIO_MIN = 1;
|
||||
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_MAX = 100000;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_MIN = 0;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MIN = 7;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MAX = 19;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MIN = 7;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MAX = 19;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MAX = 3;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MIN = 1;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_AREA_RATIO_MIN = 0.7;
|
||||
gimble_energy_part_param_.CENTER_R_CONTOUR_INTERSETION_AREA_MIN = 10;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_AREA_MAX = 100000;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_AREA_MIN = 0;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MIN = 7;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_LENGTH_MAX = 19;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MIN = 7;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_WIDTH_MAX = 19;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MAX = 3;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_HW_RATIO_MIN = 1;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_AREA_RATIO_MIN = 0.7;
|
||||
gimbal_energy_part_param_.CENTER_R_CONTOUR_INTERSETION_AREA_MIN = 10;
|
||||
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MAX = 17000;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MIN = 0;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MIN = 56;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MAX = 88;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MIN = 21;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MAX = 40;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MAX = 3;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MIN = 1;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_RATIO_MAX = 0.55;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_RATIO_MIN = 0.25;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_NON_ZERO_RATE_MAX = 0.48;
|
||||
gimble_energy_part_param_.FLOW_STRIP_FAN_NON_ZERO_RATE_MIN = 0.25;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MAX = 17000;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_MIN = 0;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MIN = 56;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_LENGTH_MAX = 88;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MIN = 21;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_WIDTH_MAX = 40;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MAX = 3;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_HW_RATIO_MIN = 1;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_RATIO_MAX = 0.55;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_CONTOUR_AREA_RATIO_MIN = 0.25;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_NON_ZERO_RATE_MAX = 0.48;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_FAN_NON_ZERO_RATE_MIN = 0.25;
|
||||
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MAX = 100000;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MIN = 0;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MIN = 31;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MAX = 57;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MIN = 2;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MAX = 13;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MAX = 12;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MIN = 4;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_RATIO_MIN = 0.5;
|
||||
gimble_energy_part_param_.FLOW_STRIP_CONTOUR_INTERSETION_AREA_MIN = 117;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MAX = 100000;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_MIN = 0;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MIN = 31;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_LENGTH_MAX = 57;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MIN = 2;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_WIDTH_MAX = 13;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MAX = 12;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_HW_RATIO_MIN = 4;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_AREA_RATIO_MIN = 0.5;
|
||||
gimbal_energy_part_param_.FLOW_STRIP_CONTOUR_INTERSETION_AREA_MIN = 117;
|
||||
|
||||
gimble_energy_part_param_.TWIN_ANGEL_MAX = 10;
|
||||
gimble_energy_part_param_.TARGET_INTERSETION_CONTOUR_AREA_MIN = 24;
|
||||
gimbal_energy_part_param_.TWIN_ANGEL_MAX = 10;
|
||||
gimbal_energy_part_param_.TARGET_INTERSETION_CONTOUR_AREA_MIN = 24;
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -12,22 +12,22 @@ using namespace cv;
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// 此函数为能量机关模式主控制流函数,且步兵需要同时拥有云台摄像头和底盘摄像头
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
void Energy::run(cv::Mat &gimble_src, cv::Mat &chassis_src) {
|
||||
void Energy::run(cv::Mat &gimbal_src, cv::Mat &chassis_src) {
|
||||
if (chassis_src.empty())
|
||||
run(gimble_src);//仅拥有云台摄像头则调用单摄像头的run函数
|
||||
else if (isGimble) {
|
||||
energy_part_param_ = gimble_energy_part_param_;
|
||||
run(gimbal_src);//仅拥有云台摄像头则调用单摄像头的run函数
|
||||
else if (isgimbal) {
|
||||
energy_part_param_ = gimbal_energy_part_param_;
|
||||
clearAll();
|
||||
initImage(gimble_src);
|
||||
initImage(gimbal_src);
|
||||
|
||||
if (findArmors(gimble_src) < 1)return;
|
||||
if (!findFlowStripFan(gimble_src))return;
|
||||
if (findArmors(gimbal_src) < 1)return;
|
||||
if (!findFlowStripFan(gimbal_src))return;
|
||||
if (!findTargetInFlowStripFan()) return;
|
||||
if (!findCenterROI(gimble_src))return;
|
||||
if (!findCenterR(gimble_src))return;
|
||||
if (!findCenterROI(gimbal_src))return;
|
||||
if (!findCenterR(gimbal_src))return;
|
||||
|
||||
if (show_energy)showFlowStripFan("strip", gimble_src);
|
||||
if (show_energy)showCenterR("R", gimble_src);
|
||||
if (show_energy)showFlowStripFan("strip", gimbal_src);
|
||||
if (show_energy)showCenterR("R", gimbal_src);
|
||||
|
||||
if (!getOrigin())return;
|
||||
startChassis();
|
||||
@@ -59,7 +59,7 @@ void Energy::run(cv::Mat &gimble_src, cv::Mat &chassis_src) {
|
||||
}
|
||||
if (isPredicting) {
|
||||
getPredictPoint(target_point);
|
||||
gimbleRotation();
|
||||
gimbalRotation();
|
||||
judgeShoot();
|
||||
sendTarget(serial, yaw_rotation, pitch_rotation, shoot);
|
||||
} else if (isGuessing && stayGuessing()) {
|
||||
@@ -68,7 +68,7 @@ void Energy::run(cv::Mat &gimble_src, cv::Mat &chassis_src) {
|
||||
if (!guessTarget()) return;
|
||||
if (show_energy)showGuessTarget("guess", chassis_src);
|
||||
getPredictPoint(guess_point);
|
||||
gimbleRotation();
|
||||
gimbalRotation();
|
||||
sendTarget(serial, yaw_rotation, pitch_rotation, false);
|
||||
}
|
||||
}
|
||||
@@ -78,22 +78,22 @@ void Energy::run(cv::Mat &gimble_src, cv::Mat &chassis_src) {
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// 此函数为能量机关模式主控制流函数,且步兵仅拥有云台摄像头
|
||||
// ---------------------------------------------------------------------------------------------------------------------
|
||||
void Energy::run(cv::Mat &gimble_src) {
|
||||
energy_part_param_ = gimble_energy_part_param_;
|
||||
void Energy::run(cv::Mat &gimbal_src) {
|
||||
energy_part_param_ = gimbal_energy_part_param_;
|
||||
clearAll();
|
||||
initImage(gimble_src);
|
||||
initImage(gimbal_src);
|
||||
|
||||
changeMark();
|
||||
if (isMark)return;//操作手强制手动标定origin_yaw和origin_pitch
|
||||
|
||||
if (show_process)imshow("bin", gimble_src);
|
||||
if (findArmors(gimble_src) < 1)return;
|
||||
if (!findFlowStripFan(gimble_src))return;
|
||||
if (show_process)imshow("bin", gimbal_src);
|
||||
if (findArmors(gimbal_src) < 1)return;
|
||||
if (!findFlowStripFan(gimbal_src))return;
|
||||
if (!findTargetInFlowStripFan()) return;
|
||||
if (!findCenterROI(gimble_src))return;
|
||||
if (show_energy)showFlowStripFan("strip", gimble_src);
|
||||
if (!findCenterR(gimble_src))return;
|
||||
if (show_energy)showCenterR("R", gimble_src);
|
||||
if (!findCenterROI(gimbal_src))return;
|
||||
if (show_energy)showFlowStripFan("strip", gimbal_src);
|
||||
if (!findCenterR(gimbal_src))return;
|
||||
if (show_energy)showCenterR("R", gimbal_src);
|
||||
getTargetPolarAngle();
|
||||
JudgeMode();
|
||||
if (energy_mode_init)return;
|
||||
@@ -104,16 +104,16 @@ void Energy::run(cv::Mat &gimble_src) {
|
||||
}
|
||||
if (isPredicting) {
|
||||
getPredictPoint(target_point);
|
||||
gimbleRotation();
|
||||
gimbalRotation();
|
||||
judgeShoot();
|
||||
sendTarget(serial, yaw_rotation, pitch_rotation, shoot);
|
||||
} else if (isGuessing && stayGuessing()) {
|
||||
findFans(gimble_src);
|
||||
findFans(gimbal_src);
|
||||
if (save_mark)writeDownMark();
|
||||
guessTarget();
|
||||
if (show_energy)showGuessTarget("guess", gimble_src);
|
||||
if (show_energy)showGuessTarget("guess", gimbal_src);
|
||||
getPredictPoint(guess_point);
|
||||
gimbleRotation();
|
||||
gimbalRotation();
|
||||
sendTarget(serial, yaw_rotation, pitch_rotation, false);
|
||||
}
|
||||
}
|
||||
|
||||
58
main.cpp
58
main.cpp
@@ -18,6 +18,7 @@
|
||||
#include <armor_finder/armor_finder.h>
|
||||
#include <options/options.h>
|
||||
#include <additions/additions.h>
|
||||
#include <config/setconfig.h>
|
||||
|
||||
#define DO_NOT_CNT_TIME
|
||||
|
||||
@@ -35,7 +36,7 @@ mcu_data mcuData = { // 单片机端回传结构体
|
||||
ENEMY_RED, // 敌方颜色
|
||||
};
|
||||
|
||||
WrapperHead *video_gimble = nullptr; // 云台摄像头视频源
|
||||
WrapperHead *video_gimbal = nullptr; // 云台摄像头视频源
|
||||
WrapperHead *video_chassis = nullptr; // 底盘摄像头视频源
|
||||
|
||||
Serial serial(115200); // 串口对象
|
||||
@@ -60,16 +61,16 @@ int main(int argc, char *argv[]) {
|
||||
while (true) {
|
||||
// 打开视频源
|
||||
if (from_camera) {
|
||||
video_gimble = new CameraWrapper(0/*, "armor"*/);
|
||||
video_gimbal = new CameraWrapper(0/*, "armor"*/);
|
||||
video_chassis = new CameraWrapper(1/*, "energy"*/);
|
||||
} else {
|
||||
video_gimble = new VideoWrapper("/home/sun/项目/energy_video/energy_test.avi");
|
||||
video_gimbal = new VideoWrapper("/home/sun/项目/energy_video/energy_test.avi");
|
||||
video_chassis = new VideoWrapper("/home/sun/项目/energy_video/energy_test.avi");
|
||||
}
|
||||
if (video_gimble->init()) {
|
||||
LOGM("video_gimble source initialization successfully.");
|
||||
if (video_gimbal->init()) {
|
||||
LOGM("video_gimbal source initialization successfully.");
|
||||
} else {
|
||||
LOGW("video_gimble source unavailable!");
|
||||
LOGW("video_gimbal source unavailable!");
|
||||
}
|
||||
if (video_chassis->init()) {
|
||||
LOGM("video_chassis source initialization successfully.");
|
||||
@@ -78,10 +79,10 @@ int main(int argc, char *argv[]) {
|
||||
}
|
||||
|
||||
// 跳过前10帧噪声图像。
|
||||
Mat gimble_src, chassis_src;
|
||||
Mat gimbal_src, chassis_src;
|
||||
for (int i = 0; i < 10; i++) {
|
||||
if (video_gimble) {
|
||||
video_gimble->read(gimble_src);
|
||||
if (video_gimbal) {
|
||||
video_gimbal->read(gimbal_src);
|
||||
}
|
||||
if (video_chassis) {
|
||||
video_chassis->read(chassis_src);
|
||||
@@ -93,35 +94,44 @@ int main(int argc, char *argv[]) {
|
||||
CNT_TIME("Total", {
|
||||
if (mcuData.state != ARMOR_STATE) {//能量机关模式
|
||||
if (last_state == ARMOR_STATE) {//若上一帧是自瞄模式,即刚往完成切换,则需要初始化
|
||||
((CameraWrapper *) video_gimble)->changeBrightness(20);
|
||||
((CameraWrapper *) video_gimbal)->changeBrightness(ENERGY_CAMERA_GAIN);
|
||||
energy.setEnergyInit();
|
||||
checkReconnect(video_chassis->read(chassis_src));
|
||||
#ifdef CHASSIS_FLIP_MODE
|
||||
flip(chassis_src, chassis_src, CHASSIS_FLIP_MODE);
|
||||
#endif
|
||||
}
|
||||
ok = checkReconnect(video_gimble->read(gimble_src));
|
||||
if (!from_camera) extract(gimble_src, chassis_src);
|
||||
if (save_video) saveVideos(gimble_src, chassis_src);//保存视频
|
||||
if (show_origin) showOrigin(gimble_src, chassis_src);//显示原始图像
|
||||
// energy.run(gimble_src, chassis_src);
|
||||
energy.run(gimble_src);
|
||||
ok = checkReconnect(video_gimbal->read(gimbal_src));
|
||||
#ifdef GIMBAL_FLIP_MODE
|
||||
flip(gimbal_src, gimbal_src, CHASSIS_FLIP_MODE);
|
||||
#endif
|
||||
if (!from_camera) extract(gimbal_src, chassis_src);
|
||||
if (save_video) saveVideos(gimbal_src, chassis_src);//保存视频
|
||||
if (show_origin) showOrigin(gimbal_src, chassis_src);//显示原始图像
|
||||
// energy.run(gimbal_src, chassis_src);
|
||||
energy.run(gimbal_src);
|
||||
last_state = mcuData.state;//更新上一帧状态
|
||||
} else { // 自瞄模式
|
||||
if (last_state != ARMOR_STATE) {
|
||||
((CameraWrapper *) video_gimble)->changeBrightness(30);
|
||||
((CameraWrapper *) video_gimbal)->changeBrightness(ARMOR_CAMERA_GAIN);
|
||||
}
|
||||
last_state = mcuData.state;
|
||||
ok = checkReconnect(video_gimble->read(gimble_src));
|
||||
if (!from_camera) extract(gimble_src);
|
||||
if (save_video) saveVideos(gimble_src);
|
||||
if (show_origin) showOrigin(gimble_src);
|
||||
ok = checkReconnect(video_gimbal->read(gimbal_src));
|
||||
#ifdef GIMBAL_FLIP_MODE
|
||||
flip(gimbal_src, gimbal_src, CHASSIS_FLIP_MODE);
|
||||
#endif
|
||||
if (!from_camera) extract(gimbal_src);
|
||||
if (save_video) saveVideos(gimbal_src);
|
||||
if (show_origin) showOrigin(gimbal_src);
|
||||
CNT_TIME("Armor Time", {
|
||||
armorFinder.run(gimble_src);
|
||||
armorFinder.run(gimbal_src);
|
||||
});
|
||||
}
|
||||
// cv::waitKey(0);
|
||||
});
|
||||
} while (ok);
|
||||
delete video_gimble;
|
||||
video_gimble = nullptr;
|
||||
delete video_gimbal;
|
||||
video_gimbal = nullptr;
|
||||
delete video_chassis;
|
||||
video_chassis = nullptr;
|
||||
cout << "Program fails. Restarting" << endl;
|
||||
|
||||
@@ -22,11 +22,11 @@ extern mcu_data mcuData;
|
||||
void uartReceive(Serial *pSerial);
|
||||
bool checkReconnect(bool is_camera_0_connect, bool is_camera_1_connect);
|
||||
bool checkReconnect(bool is_camera_connect);
|
||||
void saveVideos(const cv::Mat &gimble_src, const cv::Mat &chassis_src);
|
||||
void saveVideos(const cv::Mat &gimble_src);
|
||||
void showOrigin(const cv::Mat &gimble_src, const cv::Mat &chassis_src);
|
||||
void showOrigin(const cv::Mat &gimble_src);
|
||||
void extract(cv::Mat &gimble_src, cv::Mat &chassis_src);
|
||||
void extract(cv::Mat &gimble_src);
|
||||
void saveVideos(const cv::Mat &gimbal_src, const cv::Mat &chassis_src);
|
||||
void saveVideos(const cv::Mat &gimbal_src);
|
||||
void showOrigin(const cv::Mat &gimbal_src, const cv::Mat &chassis_src);
|
||||
void showOrigin(const cv::Mat &gimbal_src);
|
||||
void extract(cv::Mat &gimbal_src, cv::Mat &chassis_src);
|
||||
void extract(cv::Mat &gimbal_src);
|
||||
|
||||
#endif /* _ADDITIONS_H_ */
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
|
||||
extern WrapperHead *video_gimble;
|
||||
extern WrapperHead *video_gimbal;
|
||||
extern WrapperHead *video_chassis;
|
||||
|
||||
extern Serial serial;
|
||||
@@ -75,9 +75,9 @@ cv::VideoWriter initVideoWriter(const std::string &filename_prefix) {
|
||||
|
||||
bool checkReconnect(bool is_camera_0_connect, bool is_camera_1_connect) {
|
||||
if (!is_camera_0_connect) {
|
||||
delete video_gimble;
|
||||
video_gimble = new CameraWrapper(0, "armor");
|
||||
is_camera_0_connect = video_gimble->init();
|
||||
delete video_gimbal;
|
||||
video_gimbal = new CameraWrapper(0, "armor");
|
||||
is_camera_0_connect = video_gimbal->init();
|
||||
}
|
||||
if (!is_camera_1_connect) {
|
||||
delete video_chassis;
|
||||
@@ -89,79 +89,79 @@ bool checkReconnect(bool is_camera_0_connect, bool is_camera_1_connect) {
|
||||
|
||||
bool checkReconnect(bool is_camera_connect) {
|
||||
if (!is_camera_connect) {
|
||||
delete video_gimble;
|
||||
video_gimble = new CameraWrapper(0, "armor");
|
||||
is_camera_connect = video_gimble->init();
|
||||
delete video_gimbal;
|
||||
video_gimbal = new CameraWrapper(0, "armor");
|
||||
is_camera_connect = video_gimbal->init();
|
||||
}
|
||||
return is_camera_connect;
|
||||
}
|
||||
|
||||
auto gimble_video_writer = initVideoWriter(PROJECT_DIR"/gimble_video/");
|
||||
auto gimbal_video_writer = initVideoWriter(PROJECT_DIR"/gimbal_video/");
|
||||
auto chassis_video_writer = initVideoWriter(PROJECT_DIR"/chassis_video/");
|
||||
|
||||
void saveVideos(const cv::Mat &gimble_src, const cv::Mat &chassis_src) {
|
||||
if (!gimble_src.empty() && !chassis_src.empty()) {
|
||||
gimble_video_writer.write(gimble_src);
|
||||
void saveVideos(const cv::Mat &gimbal_src, const cv::Mat &chassis_src) {
|
||||
if (!gimbal_src.empty() && !chassis_src.empty()) {
|
||||
gimbal_video_writer.write(gimbal_src);
|
||||
Mat chassis_save = chassis_src.clone();
|
||||
cvtColor(chassis_save, chassis_save, COLOR_GRAY2BGR);
|
||||
chassis_video_writer.write(chassis_save);
|
||||
} else if (!gimble_src.empty() && chassis_src.empty()) {
|
||||
gimble_video_writer.write(gimble_src);
|
||||
} else if (gimble_src.empty() && !chassis_src.empty()) {
|
||||
if (show_origin)imshow("src", gimble_src);
|
||||
} else if (!gimbal_src.empty() && chassis_src.empty()) {
|
||||
gimbal_video_writer.write(gimbal_src);
|
||||
} else if (gimbal_src.empty() && !chassis_src.empty()) {
|
||||
if (show_origin)imshow("src", gimbal_src);
|
||||
Mat chassis_save = chassis_src.clone();
|
||||
cvtColor(chassis_save, chassis_save, COLOR_GRAY2BGR);
|
||||
chassis_video_writer.write(chassis_save);
|
||||
} else return;
|
||||
}
|
||||
|
||||
void saveVideos(const cv::Mat &gimble_src) {
|
||||
if (!gimble_src.empty()) {
|
||||
gimble_video_writer.write(gimble_src);
|
||||
void saveVideos(const cv::Mat &gimbal_src) {
|
||||
if (!gimbal_src.empty()) {
|
||||
gimbal_video_writer.write(gimbal_src);
|
||||
} else return;
|
||||
}
|
||||
|
||||
void showOrigin(const cv::Mat &gimble_src, const cv::Mat &chassis_src) {
|
||||
if (!gimble_src.empty() && !chassis_src.empty()) {
|
||||
imshow("gimble", gimble_src);
|
||||
void showOrigin(const cv::Mat &gimbal_src, const cv::Mat &chassis_src) {
|
||||
if (!gimbal_src.empty() && !chassis_src.empty()) {
|
||||
imshow("gimbal", gimbal_src);
|
||||
imshow("chassis", chassis_src);
|
||||
} else if (!gimble_src.empty() && chassis_src.empty()) {
|
||||
imshow("gimble", gimble_src);
|
||||
} else if (gimble_src.empty() && !chassis_src.empty()) {
|
||||
} else if (!gimbal_src.empty() && chassis_src.empty()) {
|
||||
imshow("gimbal", gimbal_src);
|
||||
} else if (gimbal_src.empty() && !chassis_src.empty()) {
|
||||
imshow("chassis", chassis_src);
|
||||
} else return;
|
||||
cv::waitKey(1);
|
||||
}
|
||||
|
||||
void showOrigin(const cv::Mat &gimble_src) {
|
||||
if (!gimble_src.empty()) {
|
||||
imshow("gimble", gimble_src);
|
||||
void showOrigin(const cv::Mat &gimbal_src) {
|
||||
if (!gimbal_src.empty()) {
|
||||
imshow("gimbal", gimbal_src);
|
||||
} else return;
|
||||
cv::waitKey(1);
|
||||
}
|
||||
|
||||
void extract(cv::Mat &gimble_src, cv::Mat &chassis_src) {
|
||||
if (!gimble_src.empty() && !chassis_src.empty()) {
|
||||
extract(gimble_src);
|
||||
void extract(cv::Mat &gimbal_src, cv::Mat &chassis_src) {
|
||||
if (!gimbal_src.empty() && !chassis_src.empty()) {
|
||||
extract(gimbal_src);
|
||||
extract(chassis_src);
|
||||
} else if (!gimble_src.empty() && chassis_src.empty()) {
|
||||
extract(gimble_src);
|
||||
} else if (gimble_src.empty() && !chassis_src.empty()) {
|
||||
} else if (!gimbal_src.empty() && chassis_src.empty()) {
|
||||
extract(gimbal_src);
|
||||
} else if (gimbal_src.empty() && !chassis_src.empty()) {
|
||||
extract(chassis_src);
|
||||
} else return;
|
||||
}
|
||||
|
||||
void extract(cv::Mat &gimble_src) {//图像预处理,将视频切成640×480的大小
|
||||
if (gimble_src.empty()) return;
|
||||
float length = static_cast<float>(gimble_src.cols);
|
||||
float width = static_cast<float>(gimble_src.rows);
|
||||
void extract(cv::Mat &gimbal_src) {//图像预处理,将视频切成640×480的大小
|
||||
if (gimbal_src.empty()) return;
|
||||
float length = static_cast<float>(gimbal_src.cols);
|
||||
float width = static_cast<float>(gimbal_src.rows);
|
||||
if (length / width > 640.0 / 480.0) {
|
||||
length *= 480.0 / width;
|
||||
resize(gimble_src, gimble_src, cv::Size(length, 480));
|
||||
gimble_src = gimble_src(Rect((length - 640) / 2, 0, 640, 480));
|
||||
resize(gimbal_src, gimbal_src, cv::Size(length, 480));
|
||||
gimbal_src = gimbal_src(Rect((length - 640) / 2, 0, 640, 480));
|
||||
} else {
|
||||
width *= 640.0 / length;
|
||||
resize(gimble_src, gimble_src, cv::Size(640, width));
|
||||
gimble_src = gimble_src(Rect(0, (width - 480) / 2, 640, 480));
|
||||
resize(gimbal_src, gimbal_src, cv::Size(640, width));
|
||||
gimbal_src = gimbal_src(Rect(0, (width - 480) / 2, 640, 480));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user