Revision c0757912 devices/DiWheelDrive/main.cpp

View differences:

devices/DiWheelDrive/main.cpp
1025 1025
  global.motorcontrol.setTargetRPM(rpmSpeed[constants::DiWheelDrive::LEFT_WHEEL] * 1000000, rpmSpeed[constants::DiWheelDrive::RIGHT_WHEEL] * 1000000);
1026 1026
}
1027 1027

  
1028
/**
1029
 * Blocks as long as the position changes.
1030
 */
1031
void checkForMotion(){
1032
  int motion = 1;
1033
  int led = 0;
1034
  types::position oldPos = global.odometry.getPosition();
1035
  while(motion){
1036
    BaseThread::sleep(500);
1037
    types::position tmp = global.odometry.getPosition();
1038
    motion = abs(oldPos.x - tmp.x)+ abs(oldPos.y - tmp.y)+abs(oldPos.z - tmp.z);
1039
    oldPos = tmp;
1040
      global.robot.setLightColor((led + 1) % 8, Color(Color::YELLOW));
1041
      global.robot.setLightColor(led % 8, Color(Color::BLACK));
1042
      led++;
1043
  }
1044
}
1045

  
1046
/**
1047
 * Turns MotorControl off and checks if position remains stable.
1048
 */
1049
int checkDockingSuccess(){
1050
  // global.motorcontrol.setTargetRPM(0,0);
1051
  checkForMotion();
1052
  int led = 0;
1053
  int success = 0;
1054
  global.odometry.resetPosition();
1055
  types::position start = global.startPos = global.odometry.getPosition();
1056
  global.motorcontrol.toggleMotorEnable();
1057
  BaseThread::sleep(1000);
1058
  types::position stop = global.endPos = global.odometry.getPosition();
1059
  global.motorcontrol.toggleMotorEnable();
1060
  // Amiro moved, docking was not successful
1061
  if ((start.x + stop.x) || (start.y + stop.y)){
1062
    for(led=0; led<8; led++){
1063
      global.robot.setLightColor(led, Color(Color::RED));
1064
    }
1065
    success = 0;
1066
  }else{
1067
    for(led=0; led<8; led++){
1068
      global.robot.setLightColor(led, Color(Color::GREEN));
1069
    }
1070
    success = 1;
1071
  }
1072
  
1073
  BaseThread::sleep(500);
1074
  for(led=0; led<8; led++){
1075
          global.robot.setLightColor(led, Color(Color::BLACK));
1076
  }
1077
  return success;
1078
}
1079

  
1080
/**
1081
 * Switch to EDGE_LEFT line following and orientate for n steps along the line.
1082
 * 
1083
 * @param lf  current line following
1084
 * @param steps steps to take for the correction (measured in CAN-update durations)
1085
 */
1086
void correctPosition(LineFollow &lf, int steps){
1087
  int checkWhite = 0;
1088
  int rpmSpeed[2] = {0};
1089
  lf.setStrategy(LineFollowStrategy::EDGE_LEFT);
1090
  for (int correction=0; correction<steps; correction++){
1091
    checkWhite = lf.followLine(rpmSpeed);
1092
    setSpeed(rpmSpeed);
1093
    BaseThread::sleep(CAN::UPDATE_PERIOD);
1094
  }
1095
}
1096

  
1097

  
1098

  
1028 1099
void followAndRotate(BaseSequentialStream *chp, int argc, char *argv[]){
1029 1100
  int steps = 10000;
1030 1101
  int speed = 0;
......
1032 1103
  int led = 0;
1033 1104
  int checkWhite = 0;
1034 1105
  int rpmSpeed[2] = {0};
1035
  int proxyWheelThresh = 13000;
1106
  int proxyWheelThresh = 20000;
1036 1107
  LineFollow lf(&global);
1037 1108
  if (argc == 1){
1038 1109
      chprintf(chp, "%i steps \n", atoi(argv[0]));
......
1048 1119
    BaseThread::sleep(MS2ST(5000));
1049 1120
    global.forwardSpeed = speed;
1050 1121
    
1051
    // rpmSpeed[0] = -speed;
1052
    // rpmSpeed[1] = speed;
1053 1122
    setSpeed(rpmSpeed);
1054
    // lf.setStrategy(LineFollowStrategy::DOCKING);
1123

  
1124

  
1055 1125
    for(int s=0; s < steps; s++){
1056 1126

  
1057 1127
      int WL = global.vcnl4020[constants::DiWheelDrive::PROX_WHEEL_LEFT].getProximityScaledWoOffset();
1058 1128
      int WR = global.vcnl4020[constants::DiWheelDrive::PROX_WHEEL_LEFT].getProximityScaledWoOffset();
1059 1129
      if ((WL+WR) < proxyWheelThresh){
1130
        global.motorcontrol.setTargetRPM(0,0);
1060 1131
        chprintf((BaseSequentialStream*)&global.sercanmux1, "Hit Break!\n");
1061 1132
        if(lf.getStrategy() == LineFollowStrategy::DOCKING){
1062
          break;
1133
          // Check if Docking was successful
1134
          if(checkDockingSuccess()){
1135
            break;
1136
          }else{
1137
            correctPosition(lf, 250);
1138
            lf.setStrategy(LineFollowStrategy::DOCKING);
1139
            // break;
1140
          }
1141
          
1063 1142
        }else{
1064
          global.motorcontrol.setTargetRPM(0,0);
1143
          // global.motorcontrol.setTargetRPM(0,0);
1065 1144
          BaseThread::sleep(1000);
1145
          // 180° Rotation 
1066 1146
          global.distcontrol.setTargetPosition(0, 3141592, 10000);
1067
          BaseThread::sleep(10000);
1068
          lf.setStrategy(LineFollowStrategy::EDGE_LEFT);
1069
          for (int correction=0; correction<300; correction++){
1070
            checkWhite = lf.followLine(rpmSpeed);
1071
            setSpeed(rpmSpeed);
1072
            BaseThread::sleep(CAN::UPDATE_PERIOD);
1073
          }
1147
          // BaseThread::sleep(8000);
1148
          checkForMotion();
1149
          correctPosition(lf, 250);
1074 1150
          // break;
1075 1151
          lf.setStrategy(LineFollowStrategy::DOCKING);
1076 1152
          
......
1081 1157
      BaseThread::sleep(CAN::UPDATE_PERIOD);
1082 1158
  }
1083 1159

  
1084
  global.motorcontrol.setTargetRPM(0,0);
1085
  global.odometry.resetPosition();
1086
  global.startPos = global.odometry.getPosition();
1087
  global.motorcontrol.toggleMotorEnable();
1088
  BaseThread::sleep(3000);
1089
  global.endPos = global.odometry.getPosition();
1090
  global.motorcontrol.toggleMotorEnable();
1160
  
1091 1161
}
1092 1162

  
1093 1163

  
......
1130 1200
  types::position pos = global.odometry.getPosition();
1131 1201
  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);
1132 1202
  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);
1203

  
1204
  if(argc == 1){
1205
    for (int i=0; i<atoi(argv[0]);i++){
1206
      types::position pos = global.odometry.getPosition();
1207
      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);
1208
      BaseThread::sleep(CAN::UPDATE_PERIOD);
1209
    }
1210
  }
1133 1211
}
1134 1212

  
1135 1213
static const ShellCommand commands[] = {

Also available in: Unified diff