movement: enable vector sum for multiple movements in a single cycle
parent
0aeb92ac27
commit
f26cbf4984
|
@ -18,11 +18,11 @@
|
||||||
|
|
||||||
#define UNLOCK_THRESH 800
|
#define UNLOCK_THRESH 800
|
||||||
|
|
||||||
#define MAX_VEL 310
|
#define MAX_VEL 150
|
||||||
#define MAX_VEL_EIGTH 248
|
#define MAX_VEL_EIGTH 120
|
||||||
#define MAX_VEL_HALF 155
|
#define MAX_VEL_HALF 75
|
||||||
#define MAX_VEL_3QUARTERS 232
|
#define MAX_VEL_3QUARTERS 112
|
||||||
#define MAX_VEL_QUARTER 78
|
#define MAX_VEL_QUARTER 38
|
||||||
|
|
||||||
class DriveController{
|
class DriveController{
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,19 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "strategy_roles/game.h"
|
#include "strategy_roles/game.h"
|
||||||
|
#include "systems/position/positionsys_camera.h"
|
||||||
|
|
||||||
#define KEEPER_N_POINTS 3
|
#define KEEPER_3_POINTS
|
||||||
|
//#define KEEPER_5_POINTS
|
||||||
|
#ifdef KEEPER_3_POINTS
|
||||||
|
#define KEEPER_POINT_LEFT -1
|
||||||
|
#define KEEPER_POINT_CENTER 0
|
||||||
|
#define KEEPER_POINT_RIGHT 1
|
||||||
|
#define KEEPER_POINT_LEFT_C CAMERA_GOAL_MIN_X
|
||||||
|
#define KEEPER_POINT_CENTER_C CAMERA_GOAL_X
|
||||||
|
#define KEEPER_POINT_RIGHT_C CAMERA_GOAL_MAX_X
|
||||||
|
#endif
|
||||||
|
#define KEEPER_ATTACK_DISTANCE 120
|
||||||
|
|
||||||
class Keeper : public Game{
|
class Keeper : public Game{
|
||||||
|
|
||||||
|
@ -10,6 +21,9 @@ class Keeper : public Game{
|
||||||
Keeper();
|
Keeper();
|
||||||
Keeper(LineSystem*, PositionSystem*);
|
Keeper(LineSystem*, PositionSystem*);
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool shouldStrike;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void realPlay() override;
|
void realPlay() override;
|
||||||
void init() override;
|
void init() override;
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define S4I A9
|
#define S4I A9
|
||||||
#define S4O A8
|
#define S4O A8
|
||||||
|
|
||||||
#define LINE_THRESH_CAM 600
|
#define LINE_THRESH_CAM 300
|
||||||
#define EXIT_TIME 250
|
#define EXIT_TIME 250
|
||||||
#define LINES_EXIT_SPD 350
|
#define LINES_EXIT_SPD 350
|
||||||
|
|
||||||
|
|
|
@ -1,29 +1,30 @@
|
||||||
#include "PID_v2.h"
|
#pragma once
|
||||||
|
|
||||||
|
#include "PID_v2.h"
|
||||||
#include "systems/systems.h"
|
#include "systems/systems.h"
|
||||||
|
|
||||||
/*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 0
|
#define CAMERA_TRANSLATION_X 0
|
||||||
#define CAMERA_TRANSLATION_Y 12
|
#define CAMERA_TRANSLATION_Y 3
|
||||||
|
|
||||||
//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
|
||||||
|
|
||||||
//Camera goal: those setpoints correspond to the position of the center of the goal on the field
|
//Camera goal: those setpoints correspond to the position of the center of the goal on the field
|
||||||
#define CAMERA_GOAL_X 10
|
#define CAMERA_GOAL_X 0
|
||||||
#define CAMERA_GOAL_Y 0
|
#define CAMERA_GOAL_Y -12
|
||||||
|
|
||||||
#define CAMERA_GOAL_MIN_X -15
|
#define CAMERA_GOAL_MIN_X -14
|
||||||
#define CAMERA_GOAL_MAX_X 35
|
#define CAMERA_GOAL_MAX_X 14
|
||||||
|
|
||||||
#define CAMERA_CENTER_Y_ABS_SUM 60
|
#define CAMERA_CENTER_Y_ABS_SUM 60
|
||||||
//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.65
|
#define DIST_MULT 1.4
|
||||||
|
|
||||||
#define Kpx 1
|
#define Kpx 1
|
||||||
#define Kix 0
|
#define Kix 0
|
||||||
|
|
11
src/main.cpp
11
src/main.cpp
|
@ -10,6 +10,9 @@
|
||||||
|
|
||||||
TestMenu* testmenu;
|
TestMenu* testmenu;
|
||||||
|
|
||||||
|
bool striker_condition = false;
|
||||||
|
bool keeper_condition = false;
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
delay(1500);
|
delay(1500);
|
||||||
DEBUG.begin(9600);
|
DEBUG.begin(9600);
|
||||||
|
@ -37,11 +40,11 @@ void loop() {
|
||||||
updateSensors();
|
updateSensors();
|
||||||
if(DEBUG.available()) testmenu->testMenu();
|
if(DEBUG.available()) testmenu->testMenu();
|
||||||
|
|
||||||
// drive->prepareDrive(0,0,0);
|
striker_condition = role == HIGH || ((Keeper*)keeper)->shouldStrike;
|
||||||
|
keeper_condition = role == LOW;
|
||||||
|
|
||||||
striker->play(1);
|
striker->play(striker_condition);
|
||||||
// striker_test->play(1);
|
keeper->play(keeper_condition);
|
||||||
// keeper->play(role==0);
|
|
||||||
|
|
||||||
// Last thing to do: movement and update status vector
|
// Last thing to do: movement and update status vector
|
||||||
drive->drivePrepared();
|
drive->drivePrepared();
|
||||||
|
|
|
@ -70,18 +70,19 @@ void DriveController::drive(int dir, int speed, int tilt){
|
||||||
// Re enabling the below lines requires to comment out drive->prepareDrive and uncommenting the lines relative to vector sum inside positionsys_camera and comment out the other lines here
|
// Re enabling the below lines requires to comment out drive->prepareDrive and uncommenting the lines relative to vector sum inside positionsys_camera and comment out the other lines here
|
||||||
// vx = ((speed * cosins[dir])) + CURRENT_DATA_READ.addvx;
|
// vx = ((speed * cosins[dir])) + CURRENT_DATA_READ.addvx;
|
||||||
// vy = ((-speed * sins[dir])) + CURRENT_DATA_READ.addvy;
|
// vy = ((-speed * sins[dir])) + CURRENT_DATA_READ.addvy;
|
||||||
|
|
||||||
vx = ((speed * cosins[dir]));
|
vx = ((speed * cosins[dir]));
|
||||||
vy = ((-speed * sins[dir]));
|
vy = ((-speed * sins[dir]));
|
||||||
|
|
||||||
if((((vy < 0 && vxn == 1) || (vy > 0 && vxp == 1) || (vx < 0 && vyp == 1) || (vx > 0 && vyn == 1)) && canUnlock) || (millis() > this->unlockTime+UNLOCK_THRESH)) {
|
// if((((vy < 0 && vxn == 1) || (vy > 0 && vxp == 1) || (vx < 0 && vyp == 1) || (vx > 0 && vyn == 1)) && canUnlock) || (millis() > this->unlockTime+UNLOCK_THRESH)) {
|
||||||
vxn = 0;
|
// vxn = 0;
|
||||||
vxp = 0;
|
// vxp = 0;
|
||||||
vyp = 0;
|
// vyp = 0;
|
||||||
vyn = 0;
|
// vyn = 0;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if((vy > 0 && vxn == 1) || (vy < 0 && vxp == 1)) vy = 0;
|
// if((vy > 0 && vxn == 1) || (vy < 0 && vxp == 1)) vy = 0;
|
||||||
if((vx > 0 && vyp == 1) || (vx < 0 && vyn == 1)) vx = 0;
|
// if((vx > 0 && vyp == 1) || (vx < 0 && vyn == 1)) vx = 0;
|
||||||
|
|
||||||
speed1 = ((vx * sins[m1->angle] ) + (vy * cosins[m1->angle] ));
|
speed1 = ((vx * sins[m1->angle] ) + (vy * cosins[m1->angle] ));
|
||||||
speed2 = ((vx * sins[m2->angle]) + (vy * cosins[m2->angle]));
|
speed2 = ((vx * sins[m2->angle]) + (vy * cosins[m2->angle]));
|
||||||
|
@ -103,6 +104,34 @@ void DriveController::drive(int dir, int speed, int tilt){
|
||||||
speed3 += pidfactor;
|
speed3 += pidfactor;
|
||||||
speed4 += pidfactor;
|
speed4 += pidfactor;
|
||||||
|
|
||||||
|
// Find the maximum speed and scale all of them for the maximum to be 255
|
||||||
|
float maxVel = 0;
|
||||||
|
maxVel = max(abs(speed1), maxVel);
|
||||||
|
maxVel = max(abs(speed2), maxVel);
|
||||||
|
maxVel = max(abs(speed3), maxVel);
|
||||||
|
maxVel = max(abs(speed4), maxVel);
|
||||||
|
|
||||||
|
if(maxVel > 255){
|
||||||
|
// Ratio to 255
|
||||||
|
float ratio = maxVel/255;
|
||||||
|
|
||||||
|
// //Scale all the velocities
|
||||||
|
speed1 /= ratio;
|
||||||
|
speed2 /= ratio;
|
||||||
|
speed3 /= ratio;
|
||||||
|
speed4 /= ratio;
|
||||||
|
|
||||||
|
DEBUG.print(speed1);
|
||||||
|
DEBUG.print(" | ");
|
||||||
|
DEBUG.print(speed2);
|
||||||
|
DEBUG.print(" | ");
|
||||||
|
DEBUG.print(speed3);
|
||||||
|
DEBUG.print(" | ");
|
||||||
|
DEBUG.print(speed4);
|
||||||
|
DEBUG.print(" | ");
|
||||||
|
DEBUG.println(maxVel);
|
||||||
|
}
|
||||||
|
|
||||||
speed1 = constrain(speed1, -255, 255);
|
speed1 = constrain(speed1, -255, 255);
|
||||||
speed2 = constrain(speed2, -255, 255);
|
speed2 = constrain(speed2, -255, 255);
|
||||||
speed3 = constrain(speed3, -255, 255);
|
speed3 = constrain(speed3, -255, 255);
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
#include "systems/position/positionsys_camera.h"
|
#include "systems/position/positionsys_camera.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
int currentPosition = 0;
|
||||||
|
|
||||||
Keeper::Keeper() : Game()
|
Keeper::Keeper() : Game()
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
|
@ -18,7 +20,7 @@ Keeper::Keeper(LineSystem *ls_, PositionSystem *ps_) : Game(ls_, ps_)
|
||||||
|
|
||||||
void Keeper::init()
|
void Keeper::init()
|
||||||
{
|
{
|
||||||
point_spacing = (abs(CAMERA_GOAL_MIN_X) + abs(CAMERA_GOAL_MAX_X)) / KEEPER_N_POINTS;
|
shouldStrike = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Keeper::realPlay()
|
void Keeper::realPlay()
|
||||||
|
@ -31,15 +33,23 @@ void Keeper::realPlay()
|
||||||
|
|
||||||
void Keeper::keeper()
|
void Keeper::keeper()
|
||||||
{
|
{
|
||||||
//Convert Ball position into a coordinate in the Camera Position Sys plane
|
shouldStrike = false;
|
||||||
float ball_x = cos((-90 + CURRENT_DATA_READ.ballAngle) * 3.14 / 180);
|
|
||||||
// Remap between GOAL positions
|
|
||||||
ball_x = (int)map(ball_x, -1, 1, CAMERA_GOAL_MIN_X, CAMERA_GOAL_MAX_X);
|
|
||||||
|
|
||||||
// for (int i = CAMERA_GOAL_MIN_X; i <= CAMERA_GOAL_MAX_X; i += point_spacing)
|
if(CURRENT_DATA_READ.ballDistance < KEEPER_ATTACK_DISTANCE || (CURRENT_DATA_READ.ballAngle >= 90 && CURRENT_DATA_READ.ballAngle <= 270)){
|
||||||
// if (ball_x < i)
|
shouldStrike = true;
|
||||||
// {
|
return;
|
||||||
((PositionSysCamera *)ps)->setMoveSetpoints(ball_x, CAMERA_GOAL_Y);
|
}
|
||||||
// break;
|
|
||||||
// }
|
if(CURRENT_DATA_READ.ballAngle >= 330 || CURRENT_DATA_READ.ballAngle <= 30) currentPosition = currentPosition; //Unneeded, just here for clarity
|
||||||
|
else if(CURRENT_DATA_READ.ballAngle > 30 && CURRENT_DATA_READ.ballAngle < 90) currentPosition ++;
|
||||||
|
else if(CURRENT_DATA_READ.ballAngle > 270 && CURRENT_DATA_READ.ballAngle < 330) currentPosition --;
|
||||||
|
else{
|
||||||
|
shouldStrike = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentPosition = constrain(currentPosition, KEEPER_POINT_LEFT, KEEPER_POINT_RIGHT);
|
||||||
|
|
||||||
|
if(currentPosition == KEEPER_POINT_LEFT) ((PositionSysCamera*)ps)->setMoveSetpoints(KEEPER_POINT_LEFT_C, CAMERA_GOAL_Y);
|
||||||
|
else if(currentPosition == KEEPER_POINT_CENTER) ((PositionSysCamera*)ps)->setMoveSetpoints(KEEPER_POINT_CENTER_C, CAMERA_GOAL_Y);
|
||||||
|
else if(currentPosition == KEEPER_POINT_RIGHT) ((PositionSysCamera*)ps)->setMoveSetpoints(KEEPER_POINT_RIGHT_C, CAMERA_GOAL_Y);
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,16 +77,15 @@ void PositionSysCamera::addMoveOnAxis(int x, int y){
|
||||||
axisx += x;
|
axisx += x;
|
||||||
axisy += y;
|
axisy += y;
|
||||||
givenMovement = true;
|
givenMovement = true;
|
||||||
|
CameraPID();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PositionSysCamera::goCenter(){
|
void PositionSysCamera::goCenter(){
|
||||||
setMoveSetpoints(CAMERA_CENTER_X, CAMERA_CENTER_Y);
|
setMoveSetpoints(CAMERA_CENTER_X, CAMERA_CENTER_Y);
|
||||||
CameraPID();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PositionSysCamera::centerGoal(){
|
void PositionSysCamera::centerGoal(){
|
||||||
setMoveSetpoints(CAMERA_GOAL_X, CAMERA_GOAL_Y);
|
setMoveSetpoints(CAMERA_GOAL_X, CAMERA_GOAL_Y);
|
||||||
CameraPID();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*Knowing the sum of the absolute values of the y position of the goals, it calculates the missing goal y knowing the other one
|
/*Knowing the sum of the absolute values of the y position of the goals, it calculates the missing goal y knowing the other one
|
||||||
|
@ -119,6 +118,7 @@ void PositionSysCamera::CameraPID(){
|
||||||
|
|
||||||
int dist = sqrt(Outputx*Outputx + Outputy*Outputy);
|
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 = speed > 25 ? speed : 0;
|
||||||
drive->prepareDrive(dir, speed, 0);
|
drive->prepareDrive(dir, speed, 0);
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -45,8 +45,8 @@ blue_led.on()
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
|
||||||
thresholds = [ (34, 64, -11, 7, 31, 71), # thresholds yellow goal
|
thresholds = [ (41, 68, 0, 30, 42, 103), # thresholds yellow goal
|
||||||
(24, 44, -25, 7, -36, -10)] # thresholds blue goal (6, 31, -15, 4, -35, 0)
|
(30, 50, -16, 12, -53, -15)] # thresholds blue goal (6, 31, -15, 4, -35, 0)
|
||||||
|
|
||||||
roi = (50,5,250, 230)
|
roi = (50,5,250, 230)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue