| 701 |
701 |
* Note: invert the threshs to drive on the other edge.
|
| 702 |
702 |
*
|
| 703 |
703 |
* */
|
| 704 |
|
void calibrateLineSensores(BaseSequentialStream *chp, int argc, char *argv[]) {
|
|
704 |
void shellRequestCalibrateLineSensores(BaseSequentialStream *chp, int argc, char *argv[]) {
|
| 705 |
705 |
// int vcnl4020AmbientLight[4];
|
| 706 |
706 |
int vcnl4020Proximity[4];
|
| 707 |
707 |
int rounds = 1;
|
| ... | ... | |
| 768 |
768 |
|
| 769 |
769 |
|
| 770 |
770 |
|
| 771 |
|
void getProxySensorData(BaseSequentialStream *chp, int argc, char *argv[]) {
|
|
771 |
void sellRequestgetBottomSensorData(BaseSequentialStream *chp, int argc, char *argv[]) {
|
| 772 |
772 |
// uint16_t vcnl4020AmbientLight[4];
|
| 773 |
773 |
uint16_t vcnl4020Proximity[4];
|
| 774 |
774 |
uint16_t rounds = 1;
|
| ... | ... | |
| 780 |
780 |
} else {
|
| 781 |
781 |
chprintf(chp, "Usage: dev_proxi_sensor_data <rounds> \n");
|
| 782 |
782 |
}
|
| 783 |
|
global.motorcontrol.getGains(&global.motorConfigGains);
|
| 784 |
|
global.motorcontrol.setGains(&global.stopGains);
|
|
783 |
global.motorcontrol.setMotorEnable(false);
|
| 785 |
784 |
|
| 786 |
785 |
for (int j = 0; j < rounds; j++) {
|
| 787 |
786 |
for (int i = 0; i < 4; i++) {
|
| ... | ... | |
| 801 |
800 |
// sleep(CAN::UPDATE_PERIOD);
|
| 802 |
801 |
BaseThread::sleep(CAN::UPDATE_PERIOD);
|
| 803 |
802 |
}
|
| 804 |
|
global.motorcontrol.setGains(&global.motorConfigGains);
|
|
803 |
global.motorcontrol.setMotorEnable(true);
|
| 805 |
804 |
// chprintf(chp,"Summary: MaxDelta: %d, FL: %x, FR: %d\n", maxDelta, proxyL, proxyR);
|
| 806 |
805 |
return;
|
| 807 |
806 |
}
|
| 808 |
807 |
|
| 809 |
|
// Either 0 to disable record or > 0 to enable it
|
| 810 |
|
void setRecord(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 811 |
|
if (argc == 1){
|
| 812 |
|
chprintf(chp, "Set recording to %d\n", atoi(argv[0]));
|
| 813 |
|
global.enableRecord = atoi(argv[0]);
|
| 814 |
|
}
|
| 815 |
|
}
|
| 816 |
|
|
| 817 |
|
|
| 818 |
|
void zieglerMeth2(BaseSequentialStream *chp, int argc, char *argv[]) {
|
| 819 |
|
// int vcnl4020AmbientLight[4];
|
| 820 |
|
// int vcnl4020Proximity[4];
|
| 821 |
|
int rpmSpeed[2] = {0};
|
| 822 |
|
int steps = 0;
|
| 823 |
|
// int proxyL = global.threshProxyL;
|
| 824 |
|
// int proxyR = global.threshProxyR;
|
| 825 |
|
int maxDelta = 0;
|
| 826 |
|
float KCrit = 0.0f;
|
| 827 |
|
|
| 828 |
|
global.sensSamples = 0;
|
| 829 |
|
global.maxDist.error = 0;
|
| 830 |
|
LineFollow lf(&global);
|
| 831 |
|
int led = 0;
|
| 832 |
|
|
| 833 |
|
if (argc == 2){
|
| 834 |
|
chprintf(chp, "KCrti %f\n", atof(argv[0]));
|
| 835 |
|
chprintf(chp, "Steps %i\n", atoi(argv[1]));
|
| 836 |
|
KCrit = atof(argv[0]);
|
| 837 |
|
steps = atoi(argv[1]);
|
| 838 |
|
} else if (argc == 3){
|
| 839 |
|
chprintf(chp, "KCrti %f\n", atof(argv[0]));
|
| 840 |
|
chprintf(chp, "Steps %i\n", atoi(argv[1]));
|
| 841 |
|
global.K_p = atof(argv[0]);
|
| 842 |
|
global.K_d = atof(argv[1]);
|
| 843 |
|
steps = atoi(argv[2]);
|
| 844 |
|
global.forwardSpeed = 15;
|
| 845 |
|
|
| 846 |
|
}else{
|
| 847 |
|
chprintf(chp, "Usage: dev_ziegler2 <K_crit> <kd> <steps> (<speed>)");
|
| 848 |
|
return;
|
| 849 |
|
}
|
| 850 |
|
for(led=0; led<8; led++){
|
| 851 |
|
global.robot.setLightColor(led, Color(Color::BLACK));
|
| 852 |
|
}
|
| 853 |
|
chprintf((BaseSequentialStream*)&global.sercanmux1, "Recodring starts in five seconds...\n");
|
| 854 |
|
BaseThread::sleep(MS2ST(5000));
|
| 855 |
|
// global.motorcontrol.setTargetRPM(rpmSpeed[constants::DiWheelDrive::LEFT_WHEEL] * 1000000, rpmSpeed[constants::DiWheelDrive::RIGHT_WHEEL] * 1000000);
|
| 856 |
|
int checkWhite = 0;
|
| 857 |
|
int it_switch = steps / 2;
|
| 858 |
|
// lf.setStrategie(LineFollowStrategie::MIDDLE);
|
| 859 |
|
for(int s=0; s < steps; s++){
|
| 860 |
|
|
| 861 |
|
checkWhite = lf.followLine(rpmSpeed);
|
| 862 |
|
checkWhite = 0;
|
| 863 |
|
// chprintf(chp,"S:%d,",s);
|
| 864 |
|
// if(global.threshWhite)
|
| 865 |
|
// if(s < it_switch){
|
| 866 |
|
// lf.setStrategie(LineFollowStrategie::EDGE_LEFT);
|
| 867 |
|
// checkWhite = lf.followLine(rpmSpeed);
|
| 868 |
|
// }else{
|
| 869 |
|
// lf.setStrategie(LineFollowStrategie::EDGE_RIGHT);
|
| 870 |
|
// checkWhite = lf.followLine(rpmSpeed);
|
| 871 |
|
// }
|
| 872 |
|
if(checkWhite){
|
| 873 |
|
global.motorcontrol.setTargetRPM(0,0);
|
| 874 |
|
for(led=0; led<8; led++){
|
| 875 |
|
global.robot.setLightColor(led, Color(Color::RED));
|
| 876 |
|
}
|
| 877 |
|
}else{
|
| 878 |
|
global.motorcontrol.setTargetRPM(rpmSpeed[constants::DiWheelDrive::LEFT_WHEEL] * 1000000, rpmSpeed[constants::DiWheelDrive::RIGHT_WHEEL] * 1000000);
|
| 879 |
|
}
|
| 880 |
|
|
| 881 |
|
|
| 882 |
|
BaseThread::sleep(CAN::UPDATE_PERIOD);
|
| 883 |
|
}
|
| 884 |
|
|
| 885 |
|
global.motorcontrol.setTargetRPM(0,0);
|
| 886 |
|
}
|
| 887 |
|
|
| 888 |
|
|
| 889 |
|
void followLine(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 890 |
|
int steps = 1000;
|
| 891 |
|
int speed = 0;
|
| 892 |
|
int strategy = 0;
|
| 893 |
|
int led = 0;
|
| 894 |
|
int checkWhite = 0;
|
| 895 |
|
int rpmSpeed[2] = {0};
|
| 896 |
|
LineFollow lf(&global);
|
| 897 |
|
if (argc == 1){
|
| 898 |
|
chprintf(chp, "%i steps \n", atoi(argv[0]));
|
| 899 |
|
steps = atoi(argv[0]);
|
| 900 |
|
}else if (argc == 2){
|
| 901 |
|
steps = atoi(argv[0]);
|
| 902 |
|
speed = atoi(argv[1]);
|
| 903 |
|
}else if (argc == 3){
|
| 904 |
|
steps = atoi(argv[0]);
|
| 905 |
|
speed = atoi(argv[1]);
|
| 906 |
|
strategy = atoi(argv[2]);
|
| 907 |
|
}else{
|
| 908 |
|
chprintf(chp, "Use: followLine <steps> <speed> <strategy>\n");
|
| 909 |
|
return;
|
| 910 |
|
}
|
| 911 |
|
global.forwardSpeed = speed;
|
| 912 |
|
switch (strategy)
|
| 913 |
|
{
|
| 914 |
|
case 0:
|
| 915 |
|
lf.setStrategy(amiro::LineFollowStrategy::EDGE_RIGHT);
|
| 916 |
|
break;
|
| 917 |
|
case 1:
|
| 918 |
|
lf.setStrategy(amiro::LineFollowStrategy::EDGE_LEFT);
|
| 919 |
|
break;
|
| 920 |
|
case 2:
|
| 921 |
|
lf.setStrategy(amiro::LineFollowStrategy::FUZZY);
|
| 922 |
|
break;
|
| 923 |
|
default:
|
| 924 |
|
break;
|
| 925 |
|
}
|
| 926 |
|
|
| 927 |
|
|
| 928 |
|
for(int s=0; s < steps; s++){
|
| 929 |
|
|
| 930 |
|
checkWhite = lf.followLine(rpmSpeed);
|
| 931 |
|
if(checkWhite){
|
| 932 |
|
global.motorcontrol.setTargetRPM(0,0);
|
| 933 |
|
for(led=0; led<8; led++){
|
| 934 |
|
global.robot.setLightColor(led, Color(Color::RED));
|
| 935 |
|
}
|
| 936 |
|
}else{
|
| 937 |
|
global.motorcontrol.setTargetRPM(rpmSpeed[constants::DiWheelDrive::LEFT_WHEEL] * 1000000, rpmSpeed[constants::DiWheelDrive::RIGHT_WHEEL] * 1000000);
|
| 938 |
|
}
|
| 939 |
|
|
| 940 |
|
BaseThread::sleep(CAN::UPDATE_PERIOD);
|
| 941 |
|
}
|
| 942 |
|
|
| 943 |
|
global.motorcontrol.setTargetRPM(0,0);
|
| 944 |
|
}
|
| 945 |
|
|
| 946 |
|
|
| 947 |
|
void printMove(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 948 |
|
|
| 949 |
|
for (int j=0; j<global.sensSamples;j++){
|
| 950 |
|
chprintf(chp,"FL:%d,FR:%d,Delta:%d,Error:%d\n",global.senseRec[j].FL, global.senseRec[j].FR, global.senseRec[j].delta, global.senseRec[j].error);
|
| 951 |
|
}
|
| 952 |
|
chprintf(chp,"MaxDist: FL:%d,FR:%d,Delta:%d,Error:%d\n",global.maxDist.FL, global.maxDist.FR, global.maxDist.delta, global.maxDist.error);
|
| 953 |
|
|
| 954 |
|
|
| 955 |
|
}
|
| 956 |
|
void freeGains(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 957 |
|
if (global.resetProtect){
|
| 958 |
|
global.motorcontrol.getGains(&global.motorConfigGains);
|
| 959 |
|
global.resetProtect = 0;
|
| 960 |
|
}
|
| 961 |
|
|
| 962 |
|
global.motorcontrol.setGains(&global.stopGains);
|
| 963 |
|
}
|
| 964 |
|
|
| 965 |
|
|
| 966 |
|
void setGains(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 967 |
|
if(!global.resetProtect){
|
| 968 |
|
global.motorcontrol.setGains(&global.motorConfigGains);
|
| 969 |
|
global.resetProtect = 1;
|
| 970 |
|
}
|
| 971 |
|
}
|
| 972 |
|
void motorToggle(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 973 |
|
global.odometry.resetPosition();
|
| 974 |
|
global.motorcontrol.toggleMotorEnable();
|
| 975 |
|
}
|
| 976 |
|
|
| 977 |
|
|
| 978 |
|
void setSpeed(int (&rpmSpeed)[2]){
|
| 979 |
|
global.motorcontrol.setTargetRPM(rpmSpeed[constants::DiWheelDrive::LEFT_WHEEL] * 1000000, rpmSpeed[constants::DiWheelDrive::RIGHT_WHEEL] * 1000000);
|
| 980 |
|
}
|
| 981 |
|
|
| 982 |
|
|
| 983 |
|
void enableCharging(){
|
| 984 |
|
global.ltc4412.enable(true);
|
| 985 |
|
}
|
| 986 |
|
|
| 987 |
|
void disableCharging(){
|
| 988 |
|
global.ltc4412.enable(false);
|
| 989 |
|
}
|
| 990 |
|
|
| 991 |
|
|
| 992 |
|
void setGlobalStrategy(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 993 |
|
uint8_t strategy = 0;
|
| 994 |
|
if(argc == 1){
|
| 995 |
|
strategy = atoi(argv[0]);
|
| 996 |
|
}
|
| 997 |
|
// send over can
|
| 998 |
|
global.strategyTest = strategy;
|
| 999 |
|
global.triggerCan = true;
|
| 1000 |
|
}
|
| 1001 |
|
|
| 1002 |
|
|
| 1003 |
|
|
| 1004 |
|
void getPosition(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 1005 |
|
types::position pos = global.odometry.getPosition();
|
| 1006 |
|
chprintf(chp, "Start: Position X: %d, Y: %d, Rotation X: %d, Y: %d, Z: %d\n", global.startPos.x, global.startPos.y, global.startPos.f_x, global.startPos.f_y, global.startPos.f_z);
|
| 1007 |
|
chprintf(chp, "End: Position X: %d, Y: %d, Rotation X: %d, Y: %d, Z: %d\n", global.endPos.x, global.endPos.y, global.endPos.f_x, global.endPos.f_y, global.endPos.f_z);
|
| 1008 |
|
|
| 1009 |
|
if(argc == 1){
|
| 1010 |
|
for (int i=0; i<atoi(argv[0]);i++){
|
| 1011 |
|
types::position pos = global.odometry.getPosition();
|
| 1012 |
|
chprintf(chp, "End: Position X: %d, Y: %d, Rotation X: %d, Y: %d, Z: %d\n", pos.x, pos.y, pos.f_x, pos.f_y, pos.f_z);
|
| 1013 |
|
BaseThread::sleep(CAN::UPDATE_PERIOD);
|
| 1014 |
|
}
|
| 1015 |
|
}
|
| 1016 |
|
}
|
| 1017 |
|
|
| 1018 |
|
// TODO: Not wokring, either loading station has no power or logic not working
|
| 1019 |
|
void checkPower(BaseSequentialStream *chp, int argc, char *argv[]){
|
|
808 |
void shellRequestCheckPower(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 1020 |
809 |
int steps = 2000;
|
| 1021 |
810 |
int led = 0;
|
| 1022 |
|
// enableCharging();
|
| 1023 |
|
// for (int i=0; i<steps;i++){
|
| 1024 |
|
// chprintf(chp, "%s Enable: %s\n", global.ltc4412.isPluggedIn() ? "y" : "n", global.ltc4412.isEnabled() ? "y2" : "n2");
|
| 1025 |
|
// if(global.ltc4412.isPluggedIn()){
|
| 1026 |
|
// // enableCharging();
|
| 1027 |
|
// for(led=0; led<8; led++){
|
| 1028 |
|
// global.robot.setLightColor(led, Color(Color::GREEN));
|
| 1029 |
|
// }
|
| 1030 |
|
// }else{
|
| 1031 |
|
// // disableCharging();
|
| 1032 |
|
// for(led=0; led<8; led++){
|
| 1033 |
|
// global.robot.setLightColor(led, Color(Color::RED));
|
| 1034 |
|
// }
|
| 1035 |
|
// }
|
| 1036 |
|
// BaseThread::sleep(CAN::UPDATE_PERIOD);
|
| 1037 |
|
// }
|
| 1038 |
|
// disableCharging();
|
| 1039 |
|
// for(led=0; led<8; led++){
|
| 1040 |
|
// global.robot.setLightColor(led, Color(Color::BLACK));
|
| 1041 |
|
// }
|
| 1042 |
|
// chprintf((BaseSequentialStream*) &SD1, "Charging Flags: %d, State of charge: %d, Minutes: %d, Consumption: %d\n", global.powerFrame.data8[0], global.powerFrame.data8[1], global.powerFrame.data16[1], global.powerFrame.data16[2]);
|
|
811 |
|
| 1043 |
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);
|
| 1044 |
813 |
}
|
| 1045 |
814 |
|
| 1046 |
815 |
|
| 1047 |
|
void proxyRing(BaseSequentialStream *chp, int argc, char *argv[]){
|
|
816 |
void shellRequestProxyRingValues(BaseSequentialStream *chp, int argc, char *argv[]){
|
| 1048 |
817 |
int steps = 10000;
|
| 1049 |
818 |
int i;
|
| 1050 |
819 |
|
| ... | ... | |
| 1098 |
867 |
{"motor_stop", shellRequestMotorStop},
|
| 1099 |
868 |
{"motor_calibrate", shellRequestMotorCalibrate},
|
| 1100 |
869 |
{"motor_getGains", shellRequestMotorGetGains},
|
| 1101 |
|
{"motor_deactivate", freeGains},
|
| 1102 |
|
{"motor_activate", setGains},
|
| 1103 |
870 |
{"motor_resetGains", shellRequestMotorResetGains},
|
| 1104 |
|
{"motorToggle", motorToggle},
|
| 1105 |
|
{"dev_proxi_sensor_data", getProxySensorData},
|
| 1106 |
|
{"dev_ziegler2", zieglerMeth2},
|
| 1107 |
|
// TODO: Stop user process from execution to finish/force calibration before anything starts
|
| 1108 |
|
{"calibrate_line", calibrateLineSensores},
|
| 1109 |
|
// {"record_move", recordMove},
|
| 1110 |
|
{"print_record", printMove},
|
| 1111 |
|
{"setRecord", setRecord},
|
| 1112 |
|
{"followLine", followLine},
|
| 1113 |
|
{"getPos", getPosition},
|
| 1114 |
|
{"checkPower", checkPower},
|
| 1115 |
|
{"setStrategy", setGlobalStrategy},
|
| 1116 |
|
{"proxyRing", proxyRing},
|
|
871 |
{"calibrate_line_sensors", shellRequestCalibrateLineSensores},
|
|
872 |
{"printProxyBottom", sellRequestgetBottomSensorData},
|
|
873 |
{"printProxyRing", shellRequestProxyRingValues},
|
|
874 |
{"checkPowerPins", shellRequestCheckPower},
|
| 1117 |
875 |
{NULL, NULL}
|
| 1118 |
876 |
};
|
| 1119 |
877 |
|