camera: coords filtering and better route calculation

pull/1/head
EmaMaker 2021-04-19 19:16:31 +02:00
parent 3ebe64555b
commit e71c49efd1
6 changed files with 59 additions and 10 deletions

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "behaviour_control/data_source.h" #include "behaviour_control/data_source.h"
#include "behaviour_control/complementary_filter.h"
#define startp 105 #define startp 105
#define endp 115 #define endp 115
@ -11,6 +12,12 @@
//Imu To Camera Angle Mult //Imu To Camera Angle Mult
#define IMUTOC_AMULT 1 #define IMUTOC_AMULT 1
#define FILTER_DEFAULT_COEFF 0.6
#define FILTER_BY_COEFF FILTER_DEFAULT_COEFF
#define FILTER_BX_COEFF FILTER_DEFAULT_COEFF
#define FILTER_YY_COEFF FILTER_DEFAULT_COEFF
#define FILTER_YX_COEFF FILTER_DEFAULT_COEFF
class DataSourceCameraConic : public DataSource{ class DataSourceCameraConic : public DataSource{
public: public:
@ -30,4 +37,6 @@ class DataSourceCameraConic : public DataSource{
int goalOrientation, pAtk, pDef; int goalOrientation, pAtk, pDef;
int value; int value;
ComplementaryFilter *filter_yy, *filter_xy, *filter_yb, *filter_xb, *filter_yy_fix, *filter_xy_fix, *filter_yb_fix, *filter_xb_fix;
}; };

View File

@ -7,8 +7,8 @@
/*Camera translation: because of mechanical imprecision, the center of the camera and the center of the cone mirror may not coincide /*Camera translation: because of mechanical imprecision, the center of the camera and the center of the cone mirror may not coincide
To overcome this, each coordinate needs to be shifted by some amount, defined on a per-robot basis that needs to be recalibrated each time. To overcome this, each coordinate needs to be shifted by some amount, defined on a per-robot basis that needs to be recalibrated each time.
These values need to be subtracted from the coords used in setMoveSetpoints*/ These values need to be subtracted from the coords used in setMoveSetpoints*/
#define CAMERA_TRANSLATION_X 8 #define CAMERA_TRANSLATION_X 10
#define CAMERA_TRANSLATION_Y 10 #define CAMERA_TRANSLATION_Y 0
//Camera center: those setpoints correspond to what we consider the center of the field //Camera center: those setpoints correspond to what we consider the center of the field
#define CAMERA_CENTER_X 0 #define CAMERA_CENTER_X 0
#define CAMERA_CENTER_Y 0 #define CAMERA_CENTER_Y 0
@ -24,7 +24,7 @@ These values need to be subtracted from the coords used in setMoveSetpoints*/
//Actually it's ± MAX_VAL //Actually it's ± MAX_VAL
#define MAX_X 50 #define MAX_X 50
#define MAX_Y (CAMERA_CENTER_Y_ABS_SUM/2) #define MAX_Y (CAMERA_CENTER_Y_ABS_SUM/2)
#define DIST_MULT 1.4 #define DIST_MULT 1.7
#define Kpx 1 #define Kpx 1
#define Kix 0 #define Kix 0

View File

@ -1,6 +1,9 @@
#include "behaviour_control/status_vector.h" #include "behaviour_control/status_vector.h"
#include "sensors/data_source_camera_conicmirror.h" #include "sensors/data_source_camera_conicmirror.h"
//Comment out to disable complementary filters on angles
#define CAMERA_CONIC_FILTER_POINTS
DataSourceCameraConic::DataSourceCameraConic(HardwareSerial *ser_, int baud) : DataSource(ser_, baud) { DataSourceCameraConic::DataSourceCameraConic(HardwareSerial *ser_, int baud) : DataSource(ser_, baud) {
true_xb = 0; true_xb = 0;
true_yb = 0; true_yb = 0;
@ -27,6 +30,15 @@ DataSourceCameraConic::DataSourceCameraConic(HardwareSerial *ser_, int baud) : D
true_yb_fixed = 0; true_yb_fixed = 0;
true_xy_fixed = 0; true_xy_fixed = 0;
true_yy_fixed = 0; true_yy_fixed = 0;
filter_yy = new ComplementaryFilter(FILTER_YY_COEFF);
filter_xy = new ComplementaryFilter(FILTER_YX_COEFF);
filter_yb = new ComplementaryFilter(FILTER_BY_COEFF);
filter_xb = new ComplementaryFilter(FILTER_BX_COEFF);
filter_yy_fix = new ComplementaryFilter(FILTER_YY_COEFF);
filter_xy_fix = new ComplementaryFilter(FILTER_YX_COEFF);
filter_yb_fix = new ComplementaryFilter(FILTER_BY_COEFF);
filter_xb_fix = new ComplementaryFilter(FILTER_BX_COEFF);
} }
void DataSourceCameraConic ::readSensor() { void DataSourceCameraConic ::readSensor() {
@ -76,6 +88,13 @@ void DataSourceCameraConic ::computeCoordsAngles() {
true_xy = 50 - true_xy; true_xy = 50 - true_xy;
true_yy = true_yy - 50; true_yy = true_yy - 50;
#ifdef CAMERA_CONIC_FILTER_POINTS
true_xb = filter_xb->calculate(true_xb);
true_yb = filter_yb->calculate(true_yb);
true_xy = filter_xy->calculate(true_xy);
true_yy = filter_yy->calculate(true_yy);
#endif
//-90 + to account for phase shifting with goniometric circle //-90 + to account for phase shifting with goniometric circle
yAngle = -90 + (atan2(true_yy, true_xy) * 180 / 3.14); yAngle = -90 + (atan2(true_yy, true_xy) * 180 / 3.14);
bAngle = -90 + (atan2(true_yb, true_xb) * 180 / 3.14); bAngle = -90 + (atan2(true_yb, true_xb) * 180 / 3.14);
@ -104,6 +123,13 @@ void DataSourceCameraConic ::computeCoordsAngles() {
yAngleFix = 90 - (atan2(true_yy_fixed, true_xy_fixed) * 180 / 3.14); yAngleFix = 90 - (atan2(true_yy_fixed, true_xy_fixed) * 180 / 3.14);
bAngleFix = 90 - (atan2(true_yb_fixed, true_xb_fixed) * 180 / 3.14); bAngleFix = 90 - (atan2(true_yb_fixed, true_xb_fixed) * 180 / 3.14);
#ifdef CAMERA_CONIC_FILTER_POINTS
true_xb_fixed = filter_xb_fix->calculate(true_xb_fixed);
true_yb_fixed = filter_yb_fix->calculate(true_yb_fixed);
true_xy_fixed = filter_xy_fix->calculate(true_xy_fixed);
true_yy_fixed = filter_yy_fix->calculate(true_yy_fixed);
#endif
//Important: update status vector //Important: update status vector
CURRENT_INPUT_WRITE.cameraByte = value; CURRENT_INPUT_WRITE.cameraByte = value;
CURRENT_DATA_WRITE.cam_xb = true_xb; CURRENT_DATA_WRITE.cam_xb = true_xb;

View File

@ -2,6 +2,7 @@
#include "systems/position/positionsys_camera.h" #include "systems/position/positionsys_camera.h"
#include "sensors/sensors.h" #include "sensors/sensors.h"
#include "vars.h" #include "vars.h"
#include "math.h"
PositionSysCamera::PositionSysCamera() { PositionSysCamera::PositionSysCamera() {
MAX_DIST = sqrt(MAX_X*MAX_X + MAX_Y*MAX_Y); MAX_DIST = sqrt(MAX_X*MAX_X + MAX_Y*MAX_Y);
@ -119,10 +120,11 @@ void PositionSysCamera::CameraPID(){
int dir = -90-(atan2(Outputy,Outputx)*180/3.14); int dir = -90-(atan2(Outputy,Outputx)*180/3.14);
dir = (dir+360) % 360; dir = (dir+360) % 360;
int dist = sqrt(Outputx*Outputx + Outputy*Outputy); int dist = sqrt( ( (CURRENT_DATA_WRITE.posx-Setpointx)*(CURRENT_DATA_WRITE.posx-Setpointx) ) + (CURRENT_DATA_WRITE.posy-Setpointy)*(CURRENT_DATA_WRITE.posy-Setpointy) );
// int dist = sqrt(Outputx*Outputx + Outputy*Outputy);
int speed = map(dist*DIST_MULT, 0, MAX_DIST, 0, MAX_VEL); int speed = map(dist*DIST_MULT, 0, MAX_DIST, 0, MAX_VEL);
speed = filterSpeed->calculate(speed); speed = filterSpeed->calculate(speed);
speed = speed > 35 ? speed : 0; speed = speed > 40 ? speed : 0;
dir = filterDir->calculate(dir); dir = filterDir->calculate(dir);
// drive->prepareDrive(dir, speed, 0); // drive->prepareDrive(dir, speed, 0);

View File

@ -13,6 +13,8 @@
#include "behaviour_control/data_source.h" #include "behaviour_control/data_source.h"
#include "behaviour_control/status_vector.h" #include "behaviour_control/status_vector.h"
unsigned long timer = 0;
void TestMenu::testMenu() void TestMenu::testMenu()
{ {
if (!(DEBUG.available() || flagtest)) if (!(DEBUG.available() || flagtest))
@ -91,6 +93,16 @@ void TestMenu::testMenu()
DEBUG.println(robot_indentifier); DEBUG.println(robot_indentifier);
delay(50); delay(50);
break; break;
case 'p':
if(millis() - timer > 150){
timer = millis();
DEBUG.println("Position on the field (camera)");
DEBUG.print("X: ");
DEBUG.print(CURRENT_DATA_READ.posx);
DEBUG.print(" , Y: ");
DEBUG.println(CURRENT_DATA_READ.posy);
}
break;
case 'u': case 'u':
DEBUG.println("32u4 receive Test"); DEBUG.println("32u4 receive Test");
while (Serial2.available()) while (Serial2.available())

View File

@ -45,11 +45,11 @@ blue_led.on()
############################################################################## ##############################################################################
thresholds = [ (48, 73, -15, 15, 29, 79), # thresholds yellow goal thresholds = [ (54, 73, -4, 17, 18, 73), # thresholds yellow goal
(12, 43, -15, 15, -41, -9)] # thresholds blue goal (6, 31, -15, 4, -35, 0) (36, 45, -7, 7, -35, -10)] # thresholds blue goal (6, 31, -15, 4, -35, 0)
roi = (50,5,250, 230) roi = (80, 0, 240, 230)
# Camera Setup ############################################################### # Camera Setup ###############################################################
'''sensor.reset()xxxx '''sensor.reset()xxxx
@ -69,7 +69,7 @@ sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) sensor.set_framesize(sensor.QVGA)
sensor.set_windowing(roi) sensor.set_windowing(roi)
sensor.set_contrast(0) sensor.set_contrast(0)
sensor.set_saturation(3) sensor.set_saturation(0)
sensor.set_brightness(1) sensor.set_brightness(1)
sensor.set_auto_whitebal(True) sensor.set_auto_whitebal(True)
sensor.set_auto_exposure(False, 6576) sensor.set_auto_exposure(False, 6576)