Revision 84b4c632
devices/DiWheelDrive/DiWheelDrive.cpp | ||
---|---|---|
192 | 192 |
this->transmitMessage(&frame); |
193 | 193 |
} |
194 | 194 |
|
195 |
void DiWheelDrive::transmitState(uint8_t state){
|
|
195 |
void DiWheelDrive::transmitState(int8_t state){ |
|
196 | 196 |
CANTxFrame frame; |
197 | 197 |
frame.SID = 0; |
198 | 198 |
this->encodeDeviceId(&frame, CAN::TRANSMIT_LINE_FOLLOW_STATE); |
devices/DiWheelDrive/DiWheelDrive.h | ||
---|---|---|
31 | 31 |
* @param power 0 to disable, 1 to enable |
32 | 32 |
*/ |
33 | 33 |
void requestCharging(uint8_t power); |
34 |
void transmitState(uint8_t state);
|
|
34 |
void transmitState(int8_t state); |
|
35 | 35 |
|
36 | 36 |
protected: |
37 | 37 |
virtual msg_t receiveMessage(CANRxFrame *frame); |
devices/DiWheelDrive/main.cpp | ||
---|---|---|
812 | 812 |
chprintf(chp, "Power over Pins: %s Pins Enabled: %s, Power: %d\n", global.ltc4412.isPluggedIn() ? "y" : "n", global.ltc4412.isEnabled() ? "y" : "n", global.robot.getPowerStatus().state_of_charge); |
813 | 813 |
} |
814 | 814 |
|
815 |
#define window 5 |
|
816 |
int32_t counter = 0; |
|
817 |
int32_t proxbuf[window]= { 0 }; |
|
818 |
int32_t meanDeviation(uint16_t a, uint16_t b){ |
|
819 |
int32_t diff = a-b; |
|
820 |
int32_t res = 0; |
|
821 |
proxbuf[counter] = (diff*100)/((a+b)/2); |
|
822 |
for (int i = 0; i< window; i++){ |
|
823 |
res += proxbuf[i]; |
|
824 |
} |
|
825 |
counter++; |
|
826 |
counter = counter % window; |
|
827 |
return res / window; |
|
828 |
} |
|
829 |
|
|
815 | 830 |
|
816 | 831 |
void shellRequestProxyRingValues(BaseSequentialStream *chp, int argc, char *argv[]){ |
817 | 832 |
int steps = 100; |
818 | 833 |
int i; |
819 |
|
|
834 |
int16_t old3 = 0; |
|
835 |
int16_t old4 = 0; |
|
820 | 836 |
uint16_t prox[8]; |
821 | 837 |
uint32_t prox_sum = 0; |
822 | 838 |
|
... | ... | |
828 | 844 |
} |
829 | 845 |
for (int j=0; j<steps; j++){ |
830 | 846 |
prox_sum = 0; |
847 |
old3 = prox[3]; |
|
848 |
old4 = prox[4]; |
|
831 | 849 |
for(i=0; i<8;i++){ |
832 | 850 |
prox[i] = global.robot.getProximityRingValue(i); |
833 | 851 |
prox_sum += prox[i]; |
834 | 852 |
} |
853 |
int32_t deviation = meanDeviation(prox[3] & 0xFFF0 , prox[4] & 0xFFF0); |
|
854 |
// int32_t deviation = meanDeviation((prox[3]+old3) / 2 , (prox[4]+old4) / 2); |
|
855 |
// uint16_t notouch = 100; |
|
856 |
// uint16_t toucht = 20031; |
|
857 |
// sign = |
|
858 |
// i = 0; |
|
859 |
chprintf(chp, "0:%i 1:%i 2:%i 3:%i 4:%i 5:%i 6:%i 7:%i Deviation:%i \n", prox[0], prox[1], prox[2], prox[3], prox[4], prox[5], prox[6], prox[7], deviation); |
|
860 |
BaseThread::sleep(CAN::UPDATE_PERIOD); |
|
861 |
} |
|
862 |
} |
|
863 |
int buf[10][3] = { 0 }; |
|
864 |
void shellRequestMagnetoMeter(BaseSequentialStream *chp, int argc, char *argv[]){ |
|
865 |
int steps = 10; |
|
866 |
// int i; |
|
867 |
|
|
868 |
// uint16_t prox[8]; |
|
869 |
// uint32_t prox_sum = 0; |
|
870 |
|
|
871 |
if (argc == 1){ |
|
872 |
chprintf(chp, "%i steps \n", atoi(argv[0])); |
|
873 |
steps = atoi(argv[0]); |
|
874 |
}else{ |
|
875 |
chprintf(chp, "Usage: proxyRing <steps> \n"); |
|
876 |
} |
|
877 |
chprintf((BaseSequentialStream*)&global.sercanmux1, "motor calibration starts in five seconds...\n"); |
|
878 |
BaseThread::sleep(MS2ST(5000)); |
|
879 |
for (int j=0; j<steps; j++){ |
|
880 |
// prox_sum = 0; |
|
881 |
// for(i=0; i<8;i++){ |
|
882 |
// prox[i] = global.robot.getProximityRingValue(i); |
|
883 |
// prox_sum += prox[i]; |
|
884 |
// } |
|
835 | 885 |
// uint16_t notouch = 100; |
836 | 886 |
// uint16_t toucht = 20031; |
837 | 887 |
// sign = |
838 | 888 |
// i = 0; |
839 |
chprintf(chp, "0:%i 1:%i 2:%i 3:%i 4:%i 5:%i 6:%i 7:%i prox_sum:%i \n", prox[0], prox[1], prox[2], prox[3], prox[4], prox[5], prox[6], prox[7], prox_sum); |
|
889 |
|
|
890 |
if (j < 10){ |
|
891 |
buf[j][0] = global.hmc5883l.getMagnetizationGauss(0x00u); |
|
892 |
buf[j][1] = global.hmc5883l.getMagnetizationGauss(0x02u); |
|
893 |
buf[j][2] = global.hmc5883l.getMagnetizationGauss(0x01u); |
|
894 |
} |
|
895 |
chprintf(chp, "X:%i Y:%i Z:%i\n", global.hmc5883l.getMagnetizationGauss(0x00u), global.hmc5883l.getMagnetizationGauss(0x02u), global.hmc5883l.getMagnetizationGauss(0x01u)); |
|
840 | 896 |
BaseThread::sleep(CAN::UPDATE_PERIOD); |
841 | 897 |
} |
842 | 898 |
} |
899 |
void shellRequestMagnetoMeterPrint(BaseSequentialStream *chp, int argc, char *argv[]){ |
|
900 |
for (int j=0; j<10; j++){ |
|
901 |
chprintf(chp, "X:%i Y:%i Z:%i\n", buf[j][0], buf[j][1], buf[j][2]); |
|
902 |
BaseThread::sleep(CAN::UPDATE_PERIOD); |
|
903 |
} |
|
904 |
} |
|
905 |
|
|
906 |
void shellRequestPrintCoordinate(BaseSequentialStream *chp, int argc, char *argv[]){ |
|
907 |
types::position oldPos = global.odometry.getPosition(); |
|
908 |
chprintf(chp, "X:%i Y:%i\n",oldPos.x, oldPos.y); |
|
909 |
} |
|
843 | 910 |
|
844 | 911 |
static const ShellCommand commands[] = { |
845 | 912 |
{"shutdown", shellRequestShutdown}, |
... | ... | |
870 | 937 |
{"calibrate_line_sensors", shellRequestCalibrateLineSensores}, |
871 | 938 |
{"printProxyBottom", sellRequestgetBottomSensorData}, |
872 | 939 |
{"printProxyRing", shellRequestProxyRingValues}, |
940 |
{"printMagnetometer", shellRequestMagnetoMeter}, |
|
941 |
{"printMagnetometerRes", shellRequestMagnetoMeterPrint}, |
|
942 |
{"printLocation", shellRequestPrintCoordinate}, |
|
873 | 943 |
{"checkPowerPins", shellRequestCheckPower}, |
874 | 944 |
{NULL, NULL} |
875 | 945 |
}; |
devices/DiWheelDrive/userthread.cpp | ||
---|---|---|
210 | 210 |
|
211 | 211 |
// Amiro moved, docking was not successful |
212 | 212 |
// if ((start.x + stop_.x) || (start.y + stop_.y)){ |
213 |
if (abs(start.x - stop_.x) > 0 /* || (start.y + stop_.y) */){ |
|
213 |
if (abs(start.x - stop_.x) > 200 /* || (start.y + stop_.y) */){
|
|
214 | 214 |
lightAllLeds(Color::RED); |
215 | 215 |
// Enable Motor again if docking was not successful |
216 | 216 |
global.motorcontrol.setMotorEnable(true); |
... | ... | |
544 | 544 |
} |
545 | 545 |
} |
546 | 546 |
|
547 |
// if((devCor.currentDeviation <= -10)){ |
|
548 |
// rpmSpeed[0] -= 2000000; |
|
549 |
// }else if(devCor.currentDeviation >= 10){ |
|
550 |
// rpmSpeed[1] -= 2000000; |
|
551 |
// } |
|
552 |
// setRpmSpeed(rpmSpeed); |
|
547 | 553 |
break; |
548 | 554 |
// --------------------------------------- |
549 | 555 |
case states::DEVIATION_CORRECTION: |
... | ... | |
561 | 567 |
rpmSpeed[1] = 0; |
562 | 568 |
} |
563 | 569 |
setRpmSpeed(rpmSpeed); |
564 |
}else if ((utCount.stateTime >= DEVIATION_CORRECTION_DURATION / 2) && (utCount.stateTime < DEVIATION_CORRECTION_DURATION)){
|
|
570 |
}else if (((utCount.stateTime >= DEVIATION_CORRECTION_DURATION / 2) && (utCount.stateTime < DEVIATION_CORRECTION_DURATION +10)) ){
|
|
565 | 571 |
if(devCor.RCase){ |
566 | 572 |
rpmSpeed[0] = DEVIATION_CORRECTION_SPEED; |
567 | 573 |
rpmSpeed[1] = 0; |
... | ... | |
570 | 576 |
rpmSpeed[1] = DEVIATION_CORRECTION_SPEED; |
571 | 577 |
} |
572 | 578 |
setRpmSpeed(rpmSpeed); |
573 |
}else if (utCount.stateTime >= DEVIATION_CORRECTION_DURATION + 10) { |
|
574 |
// Wait to clear the mean window buffer |
|
575 |
setRpmSpeed(stop); |
|
579 |
if(((devCor.currentDeviation >= -5) && (devCor.currentDeviation <= 5))){ |
|
580 |
utCount.stateTime = 0; |
|
581 |
newState = states::REVERSE; |
|
582 |
setRpmSpeed(stop); |
|
583 |
} |
|
576 | 584 |
}else{ |
577 | 585 |
utCount.stateTime = 0; |
578 | 586 |
newState = states::REVERSE; |
... | ... | |
740 | 748 |
} |
741 | 749 |
prevState = currentState; |
742 | 750 |
currentState = newState; |
743 |
if (utCount.stateCount > CAN_TRANSMIT_STATE_THRESH){ |
|
744 |
utCount.stateCount = 0; |
|
745 |
// chprintf((BaseSequentialStream*)&global.sercanmux1, "Transmit state %d\n", newState); |
|
746 |
global.robot.transmitState(currentState); |
|
747 |
// global.robot.setOdometry(global.odometry.getPosition()); |
|
751 |
// if (utCount.stateCount > CAN_TRANSMIT_STATE_THRESH){
|
|
752 |
// utCount.stateCount = 0;
|
|
753 |
// // chprintf((BaseSequentialStream*)&global.sercanmux1, "Transmit state %d\n", newState);
|
|
754 |
// global.robot.transmitState(currentState);
|
|
755 |
// // global.robot.setOdometry(global.odometry.getPosition());
|
|
748 | 756 |
|
749 |
}else{ |
|
750 |
utCount.stateCount++; |
|
751 |
} |
|
757 |
// }else{
|
|
758 |
// utCount.stateCount++;
|
|
759 |
// }
|
|
752 | 760 |
this->sleep(CAN::UPDATE_PERIOD); |
753 | 761 |
} |
754 | 762 |
|
devices/DiWheelDrive/userthread.hpp | ||
---|---|---|
47 | 47 |
// Threshold for failing to dock |
48 | 48 |
#define DOCKING_ERROR_THRESH 3 |
49 | 49 |
#define CAN_TRANSMIT_STATE_THRESH 50 |
50 |
#define PROX_DEVIATION_MEAN_WINDOW 5
|
|
50 |
#define PROX_DEVIATION_MEAN_WINDOW 3
|
|
51 | 51 |
#define MAX_DEVIATION_CORRECTIONS 4 |
52 |
#define MAX_DEVIATION_FACTOR 45
|
|
53 |
#define DEVIATION_CORRECTION_DURATION 1000
|
|
52 |
#define MAX_DEVIATION_FACTOR 35
|
|
53 |
#define DEVIATION_CORRECTION_DURATION 900
|
|
54 | 54 |
#define DEVIATION_CORRECTION_SPEED 2000000 |
55 | 55 |
#define DEVIATION_CORRECTION_VALUE (DEVIATION_CORRECTION_SPEED / 2) |
56 |
#define DEVIATION_DIST_THRESH 6000
|
|
56 |
#define DEVIATION_DIST_THRESH 25000
|
|
57 | 57 |
|
58 | 58 |
namespace amiro { |
59 | 59 |
|
Also available in: Unified diff