4p78-final-project/robot/encoder.cpp

82 lines
1.8 KiB
C++

#include "headers.h"
#include "AS5600.h"
AS5600 as5600_0(&Wire1);
AS5600 as5600_1(&Wire2);
EncoderOdom odom;
void zeroOdom(){
odom.left = 0.0;
odom.right = 0.0;
odom.x = 0.0;
odom.y = 0.0;
odom.angle = 0.0;
wire2();
as5600_0.resetCumulativePosition(0);
wire1();
as5600_1.resetCumulativePosition(0);
}
void initEncoder(){
odom.left = 0.0;
odom.right = 0.0;
odom.x = 0.0;
odom.y = 0.0;
odom.angle = 0.0;
wire2();
as5600_0.begin();
Serial.print("Connect device 0: ");
Serial.println(as5600_0.isConnected() ? "true" : "false");
as5600_0.resetCumulativePosition(0);
wire1();
as5600_1.begin();
Serial.print("Connect device 1: ");
Serial.println(as5600_1.isConnected() ? "true" : "false");
as5600_1.resetCumulativePosition(0);
}
void updateEncoder(){
#define WHEEL_CIRCUM (PI*4.256)
// #define WHEEL_CIRCUM (1.0)
#define WHEEL_DISTANCE (8-0.125)
wire2();
int rawL = as5600_0.getCumulativePosition();
wire1();
int rawR = as5600_1.getCumulativePosition();
float left = rawL/4096.0 * -WHEEL_CIRCUM;
float right = rawR/4096.0 * WHEEL_CIRCUM;
float d_left = left-odom.left;
float d_right= right-odom.right;
odom.left = left;
odom.right = right;
float displacement = (d_left + d_right)/2;
float oldAng = odom.angle;
odom.angle += (d_left-d_right)/(WHEEL_DISTANCE);
float ang = (odom.angle+oldAng)/2;
float dispx = desiredPos.x-odom.x;
float dispy = desiredPos.y-odom.y;
posInput = sqrt(dispx*dispx+dispy*dispy);
desiredYaw = atan2(dispy, dispx)*180/PI;
if(abs(fmod(currentYaw-desiredYaw, 180.0))>90){
desiredYaw = fmod(desiredYaw+180.0, 360.0);
posInput = -posInput;
}
// Serial.println(desiredYaw);
odom.x += (float)(cos(ang)*displacement);
odom.y += (float)(sin(ang)*displacement);
}