Fixed camera angle reading from both openmv and teensy. Tilt from goalie kinda working now
parent
df0b37554c
commit
6acc62c1a3
|
@ -4,6 +4,8 @@
|
||||||
#include <Adafruit_BNO055.h>
|
#include <Adafruit_BNO055.h>
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#define DATA_CLOCK 10
|
||||||
|
|
||||||
class DataSourceBNO055 : public DataSource{
|
class DataSourceBNO055 : public DataSource{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -12,5 +14,6 @@ class DataSourceBNO055 : public DataSource{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Adafruit_BNO055 bno;
|
Adafruit_BNO055 bno;
|
||||||
|
unsigned long lastTime;
|
||||||
|
|
||||||
};
|
};
|
|
@ -19,7 +19,7 @@ class DataSourceCameraConic : public DataSource{
|
||||||
int yAngle, bAngle, yAngleFix, bAngleFix, yDist, bDist;
|
int yAngle, bAngle, yAngleFix, bAngleFix, yDist, bDist;
|
||||||
|
|
||||||
int count = 0, unkn_counter;
|
int count = 0, unkn_counter;
|
||||||
byte xb, yb, xy, yy, true_xb, true_xy, true_yb, true_yy, calc_xb, calc_yb, calc_xy, calc_yy;
|
int xb, yb, xy, yy, true_xb, true_xy, true_yb, true_yy, calc_xb, calc_yb, calc_xy, calc_yy;
|
||||||
bool data_received = false, start = false, end = false;
|
bool data_received = false, start = false, end = false;
|
||||||
|
|
||||||
int goalOrientation, pAtk, pDef;
|
int goalOrientation, pAtk, pDef;
|
||||||
|
|
|
@ -17,7 +17,8 @@ class DriveController{
|
||||||
DriveController(Motor* m1_, Motor* m2_, Motor* m3_, Motor* m4_);
|
DriveController(Motor* m1_, Motor* m2_, Motor* m3_, Motor* m4_);
|
||||||
|
|
||||||
void drive(int dir=0, int speed=0, int tilt=0);
|
void drive(int dir=0, int speed=0, int tilt=0);
|
||||||
void prepareDrive(int dir=0, int speed=0, int tilt=0);
|
void prepareDrive(int dir, int speed, int tilt);
|
||||||
|
void prepareDrive(int dir, int speed);
|
||||||
void drivePrepared();
|
void drivePrepared();
|
||||||
float updatePid();
|
float updatePid();
|
||||||
float torad(float f);
|
float torad(float f);
|
||||||
|
|
|
@ -31,7 +31,7 @@ s_extr LineSys2019* linesCtrl;
|
||||||
|
|
||||||
s_extr DataSourceBNO055* compass;
|
s_extr DataSourceBNO055* compass;
|
||||||
s_extr DataSourceBall* ball;
|
s_extr DataSourceBall* ball;
|
||||||
s_extr DataSourceCameraVShaped* camera;
|
s_extr DataSourceCameraConic* camera;
|
||||||
s_extr DriveController* drive;
|
s_extr DriveController* drive;
|
||||||
s_extr DataSourceBT* bt;
|
s_extr DataSourceBT* bt;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#define DEBUG Serial
|
#define DEBUG Serial3
|
||||||
|
|
||||||
#define LED_R 20
|
#define LED_R 20
|
||||||
#define LED_Y 17
|
#define LED_Y 17
|
||||||
|
|
|
@ -10,9 +10,13 @@ DataSourceBNO055::DataSourceBNO055(){
|
||||||
bno.setExtCrystalUse(true);
|
bno.setExtCrystalUse(true);
|
||||||
//loaded = true;
|
//loaded = true;
|
||||||
value = 0;
|
value = 0;
|
||||||
|
lastTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataSourceBNO055::readSensor(){
|
void DataSourceBNO055::readSensor(){
|
||||||
|
if(millis() - lastTime > DATA_CLOCK){
|
||||||
imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
|
imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);
|
||||||
this->value = (int) euler.x();
|
this->value = (int) euler.x();
|
||||||
|
lastTime = millis();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "data_source_bt.h"
|
#include "data_source_bt.h"
|
||||||
|
|
||||||
DataSourceBT :: DataSourceBT(HardwareSerial* ser_, int baud) : DataSource(ser_, baud){
|
DataSourceBT :: DataSourceBT(HardwareSerial* ser_, int baud) : DataSource(ser_, baud){
|
||||||
connect();
|
// connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataSourceBT :: connect(){
|
void DataSourceBT :: connect(){
|
||||||
|
|
|
@ -1,7 +1,25 @@
|
||||||
#include "data_source_camera_conicmirror.h"
|
#include "data_source_camera_conicmirror.h"
|
||||||
#include "sensors.h"
|
#include "sensors.h"
|
||||||
|
|
||||||
DataSourceCameraConic::DataSourceCameraConic(HardwareSerial* ser_, int baud) : DataSource(ser_, baud){}
|
DataSourceCameraConic::DataSourceCameraConic(HardwareSerial* ser_, int baud) : DataSource(ser_, baud){
|
||||||
|
true_xb = 0;
|
||||||
|
true_yb = 0;
|
||||||
|
true_xy = 0;
|
||||||
|
true_yy = 0;
|
||||||
|
xb = 0;
|
||||||
|
yb = 0;
|
||||||
|
xy = 0;
|
||||||
|
yy = 0;
|
||||||
|
start = false;
|
||||||
|
data_received = false;
|
||||||
|
end = false;
|
||||||
|
yAngle = 0;
|
||||||
|
yAngleFix = 0;
|
||||||
|
yDist = 0;
|
||||||
|
bAngle = 0;
|
||||||
|
bAngleFix = 0;
|
||||||
|
bDist = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void DataSourceCameraConic :: readSensor(){
|
void DataSourceCameraConic :: readSensor(){
|
||||||
while(ser->available() > 0){
|
while(ser->available() > 0){
|
||||||
|
@ -16,27 +34,24 @@ void DataSourceCameraConic :: readSensor(){
|
||||||
if(count=4 && start==true) {
|
if(count=4 && start==true) {
|
||||||
data_received=true;
|
data_received=true;
|
||||||
|
|
||||||
true_xb = xb;
|
true_xb = xb-50;
|
||||||
true_yb = yb;
|
true_yb = 50-yb;
|
||||||
true_xy = xy;
|
true_xy = xy-50;
|
||||||
true_yy = yy;
|
true_yy = 50-yy;
|
||||||
|
|
||||||
//Remap from [0,100] to [-50, +49] to correctly compute angles and distances and calculate them
|
//Remap from [0,100] to [-50, +49] to correctly compute angles and distances and calculate them
|
||||||
yAngle = atan2(50-true_yy, 50-true_xy) * 180 / 3.14;
|
yAngle = -90-(atan2(true_yy, true_xy) * 180 /3.14);
|
||||||
bAngle = atan2(50-true_yb, 50-true_xb) * 180 / 3.14;
|
bAngle = -90-(atan2(true_yb, true_xb)* 180 /3.14);
|
||||||
//Subtract 90 to bring the angles back to euler angles (0 in front)
|
|
||||||
yAngle = 90 - yAngle;
|
|
||||||
bAngle = 90 - bAngle;
|
|
||||||
//Now cast angles to [0, 359] domain angle flip them
|
//Now cast angles to [0, 359] domain angle flip them
|
||||||
yAngle = (yAngle + 360) % 360;
|
yAngle = (yAngle+360)%360;
|
||||||
bAngle = (bAngle + 360) % 360;
|
bAngle = (bAngle+360)%360;
|
||||||
|
|
||||||
//Fixes with IMU
|
//Fixes with IMU
|
||||||
yAngleFix = yAngle - compass->getValue()*0.85 ;
|
yAngleFix = ((int)(yAngle - compass->getValue()*0.35) + 360) % 360 ;
|
||||||
bAngleFix = bAngle - compass->getValue()*0.85 ;
|
bAngleFix = ((int)(bAngle - compass->getValue()*0.35) + 360) % 360 ;
|
||||||
|
|
||||||
yDist = sqrt( (50-true_yy)*(50-true_yy) + (50-true_xy)*(50-true_xy) );
|
yDist = sqrt( (true_yy-50)*(true_yy-50) + (50-true_xy)*(50-true_xy) );
|
||||||
bDist = sqrt( (50-true_yb)*(50-true_yb) + (50-true_xb)*(50-true_xb) );
|
bDist = sqrt( (true_yb-50)*(true_yb-50) + (50-true_xb)*(50-true_xb) );
|
||||||
}
|
}
|
||||||
end=true;
|
end=true;
|
||||||
start=false;
|
start=false;
|
||||||
|
@ -53,16 +68,19 @@ void DataSourceCameraConic :: readSensor(){
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int DataSourceCameraConic::getValueAtk(bool b){
|
int DataSourceCameraConic::getValueAtk(bool fixed){
|
||||||
return 0;
|
if(fixed) return goalOrientation == HIGH ? yAngleFix : bAngleFix;
|
||||||
|
else return goalOrientation == HIGH ? yAngle : bAngle;
|
||||||
}
|
}
|
||||||
int DataSourceCameraConic::getValueDef(bool b){
|
int DataSourceCameraConic::getValueDef(bool fixed){
|
||||||
return 0;
|
if(fixed) return goalOrientation == LOW ? yAngleFix : bAngleFix;
|
||||||
|
else return goalOrientation == LOW ? yAngle : bAngle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataSourceCameraConic::test(){
|
void DataSourceCameraConic::test(){
|
||||||
goalOrientation = digitalRead(SWITCH_SX); //se HIGH attacco gialla, difendo blu
|
goalOrientation = digitalRead(SWITCH_SX); //se HIGH attacco gialla, difendo blu
|
||||||
update();
|
update();
|
||||||
|
DEBUG.print("Blue: ");
|
||||||
DEBUG.print(bAngle);
|
DEBUG.print(bAngle);
|
||||||
DEBUG.print(" | ");
|
DEBUG.print(" | ");
|
||||||
DEBUG.print(bAngleFix);
|
DEBUG.print(bAngleFix);
|
||||||
|
@ -70,12 +88,14 @@ void DataSourceCameraConic::test(){
|
||||||
DEBUG.println(bDist);
|
DEBUG.println(bDist);
|
||||||
DEBUG.println(" --- ");
|
DEBUG.println(" --- ");
|
||||||
|
|
||||||
|
DEBUG.print("Yellow: ");
|
||||||
DEBUG.print(yAngle);
|
DEBUG.print(yAngle);
|
||||||
DEBUG.print(" | ");
|
DEBUG.print(" | ");
|
||||||
DEBUG.print(yAngleFix);
|
DEBUG.print(yAngleFix);
|
||||||
DEBUG.print(" | ");
|
DEBUG.print(" | ");
|
||||||
DEBUG.println(yDist);
|
DEBUG.println(yDist);
|
||||||
DEBUG.println("---------------");
|
DEBUG.println("---------------");
|
||||||
|
DEBUG.print("Data: ");
|
||||||
DEBUG.print(true_xb);
|
DEBUG.print(true_xb);
|
||||||
DEBUG.print("|");
|
DEBUG.print("|");
|
||||||
DEBUG.print(true_yb);
|
DEBUG.print(true_yb);
|
||||||
|
|
|
@ -47,6 +47,11 @@ void DriveController::prepareDrive(int dir, int speed, int tilt){
|
||||||
pTilt = tilt;
|
pTilt = tilt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DriveController::prepareDrive(int dir, int speed){
|
||||||
|
pDir = dir;
|
||||||
|
pSpeed = speed;
|
||||||
|
}
|
||||||
|
|
||||||
void DriveController::drivePrepared(){
|
void DriveController::drivePrepared(){
|
||||||
drive(pDir, pSpeed, pTilt);
|
drive(pDir, pSpeed, pTilt);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,14 +36,17 @@ void Goalie::goalie(int plusang) {
|
||||||
ball->b = ball->dir;
|
ball->b = ball->dir;
|
||||||
|
|
||||||
storcimentoPorta();
|
storcimentoPorta();
|
||||||
if(ball->angle > 340 || ball->angle < 20) drive->prepareDrive(ball->dir, 350, cstorc);
|
if(ball->distance > 200 && (ball->angle > 340 || ball->angle < 20)) drive->prepareDrive(ball->dir, 150, cstorc);
|
||||||
else drive->prepareDrive(ball->dir, 350, 0);
|
else {
|
||||||
|
drive->prepareDrive(ball->dir, 150, 0);
|
||||||
|
cstorc = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Goalie::storcimentoPorta() {
|
void Goalie::storcimentoPorta() {
|
||||||
if (camera->getValueAtk(true) >= 3) cstorc+=9;
|
if (camera->getValueAtk(false) >= 10 && camera->getValueAtk(false) <= 90) cstorc+=9;
|
||||||
else if (camera->getValueAtk(true) < -3) cstorc-=9;
|
else if (camera->getValueAtk(false) <= 350 && camera->getValueAtk(false) >= 270) cstorc-=9;
|
||||||
else cstorc *= 0.7;
|
// else cstorc *= 0.7;
|
||||||
cstorc = constrain(cstorc, -45, 45);
|
cstorc = constrain(cstorc, -45, 45);
|
||||||
}
|
}
|
|
@ -101,7 +101,7 @@ void LineSys2019::outOfBounds(){
|
||||||
else if(linesensOldY == 1) outDir = 180;
|
else if(linesensOldY == 1) outDir = 180;
|
||||||
}
|
}
|
||||||
|
|
||||||
drive->prepareDrive(outDir, LINES_EXIT_SPD, 0);
|
drive->prepareDrive(outDir, LINES_EXIT_SPD);
|
||||||
tookLine = true;
|
tookLine = true;
|
||||||
}else{
|
}else{
|
||||||
//fine rientro
|
//fine rientro
|
||||||
|
|
|
@ -4,19 +4,20 @@
|
||||||
#include "games.h"
|
#include "games.h"
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
delay(1000);
|
delay(1500);
|
||||||
|
|
||||||
DEBUG.begin(9600);
|
DEBUG.begin(9600);
|
||||||
initSensors();
|
initSensors();
|
||||||
initGames();
|
initGames();
|
||||||
|
|
||||||
delay(2000);
|
delay(1500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
updateSensors();
|
updateSensors();
|
||||||
// camera->test();
|
// camera->test();
|
||||||
|
// compass->test();
|
||||||
goalie->play(role==1);
|
goalie->play(role==1);
|
||||||
keeper->play(role==0);
|
keeper->play(role==0);
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ void initSensors(){
|
||||||
drive = new DriveController(new Motor(12, 11, 2, 45),new Motor(25, 24, 5, 135), new Motor(27, 26, 6, 225), new Motor(21, 22, 23, 315));
|
drive = new DriveController(new Motor(12, 11, 2, 45),new Motor(25, 24, 5, 135), new Motor(27, 26, 6, 225), new Motor(21, 22, 23, 315));
|
||||||
compass = new DataSourceBNO055();
|
compass = new DataSourceBNO055();
|
||||||
ball = new DataSourceBall(&Serial4, 57600);
|
ball = new DataSourceBall(&Serial4, 57600);
|
||||||
camera = new DataSourceCameraVShaped(&Serial2, 19200);
|
camera = new DataSourceCameraConic(&Serial2, 19200);
|
||||||
usCtrl = new DataSourceCtrl(dUs);
|
usCtrl = new DataSourceCtrl(dUs);
|
||||||
bt = new DataSourceBT(&Serial3, 115200);
|
bt = new DataSourceBT(&Serial3, 115200);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,8 +39,8 @@ blue_led.on()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
thresholds = [ (44, 100, -4, 48, 11, 74), # thresholds yellow goal
|
thresholds = [ (49, 99, -24, 17, 23, 64), # thresholds yellow goal
|
||||||
(16, 60, -4, 48, -73, -22)] # thresholds blue goal (6, 31, -15, 4, -35, 0)
|
(-128,-128,-128,-128,-128,-128)] # thresholds blue goal (6, 31, -15, 4, -35, 0)
|
||||||
|
|
||||||
roi = (0, 6, 318, 152)
|
roi = (0, 6, 318, 152)
|
||||||
|
|
||||||
|
@ -61,10 +61,10 @@ sensor.reset()
|
||||||
sensor.set_pixformat(sensor.RGB565)
|
sensor.set_pixformat(sensor.RGB565)
|
||||||
sensor.set_framesize(sensor.QQVGA)
|
sensor.set_framesize(sensor.QQVGA)
|
||||||
sensor.set_contrast(+3)
|
sensor.set_contrast(+3)
|
||||||
sensor.set_saturation(+1)
|
sensor.set_saturation(0)
|
||||||
sensor.set_brightness(-1)
|
sensor.set_brightness(-3)
|
||||||
sensor.set_quality(0)
|
sensor.set_quality(0)
|
||||||
sensor.set_auto_exposure(False, 12000)
|
sensor.set_auto_exposure(False, 6000)
|
||||||
sensor.set_auto_gain(True)
|
sensor.set_auto_gain(True)
|
||||||
sensor.skip_frames(time = 300)
|
sensor.skip_frames(time = 300)
|
||||||
|
|
||||||
|
@ -84,7 +84,7 @@ while(True):
|
||||||
tt_blue = [(0,999,0,2)] ## creo una lista di tuple per il blue, valore x = 999 : non trovata
|
tt_blue = [(0,999,0,2)] ## creo una lista di tuple per il blue, valore x = 999 : non trovata
|
||||||
|
|
||||||
img = sensor.snapshot()
|
img = sensor.snapshot()
|
||||||
for blob in img.find_blobs(thresholds, pixels_threshold=75, area_threshold=115, merge = True):
|
for blob in img.find_blobs(thresholds, pixels_threshold=75, area_threshold=130, merge = True):
|
||||||
img.draw_rectangle(blob.rect())
|
img.draw_rectangle(blob.rect())
|
||||||
img.draw_cross(blob.cx(), blob.cy())
|
img.draw_cross(blob.cx(), blob.cy())
|
||||||
|
|
||||||
|
@ -141,9 +141,9 @@ while(True):
|
||||||
|
|
||||||
|
|
||||||
uart.write(START_BYTE)
|
uart.write(START_BYTE)
|
||||||
uart.write(s_ycx)
|
|
||||||
uart.write(s_ycy)
|
|
||||||
uart.write(s_bcx)
|
uart.write(s_bcx)
|
||||||
uart.write(s_bcy)
|
uart.write(s_bcy)
|
||||||
|
uart.write(s_ycx)
|
||||||
|
uart.write(s_ycy)
|
||||||
uart.write(END_BYTE)
|
uart.write(END_BYTE)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue