πŸ–₯️SW Engineer

Smart Sensor & Actuator

μ•žλ™λ„€JIHOON 2022. 11. 11. 01:29

1. μ΅œλ‹¨κ²½λ‘œ νŒ¨μΉ˜νšλ“κ²Œμž„


1-1. 4X5 λ˜λŠ” 5X4 격자ꡬ쑰λ₯Ό 라인 νŠΈλ ˆμ΄μ‹±ν•˜μ—¬ λ„μ°©μ κΉŒμ§€ λͺ¨λ“  정점을 νƒμƒ‰ν•œ ν›„ 각 패치의 μœ„μΉ˜λ₯Ό λ””μŠ€ν”Œλ ˆμ΄μ— 좜λ ₯ν•œλ‹€.1-2. λΉ¨κ°„ 정점은 +1점, νŒŒλž€ 정점은 -1점으둜 κ³„μ‚°ν•˜μ—¬ κ°€μž₯ λ§Žμ€ 점수λ₯Ό νšλ“ν•˜λ©° μ΅œλ‹¨κ²½λ‘œλ‘œ μΆœλ°œμ κΉŒμ§€ λ³΅κ·€ν•˜κ³  점수λ₯Ό λ””μŠ€ν”Œλ ˆμ΄μ— 좜λ ₯ν•œλ‹€.


Step 1. μ΄λ™ν•˜κΈ°


void go(){
    val = 5;

    //if c2 is on color turn left
    if(getColorName(c2) != white)
    {
        setMotorSpeed(lm,nMotorSpeedSetting - val);
        setMotorSpeed(rm,nMotorSpeedSetting + val);
    }
    //if c2 is on white turn right
    else
    {
        setMotorSpeed(lm,nMotorSpeedSetting + val);
        setMotorSpeed(rm,(nMotorSpeedSetting - val)/2);
    }

Theory : μ „μ§„ν•  λ•ŒλŠ” 흰색 λ°”νƒ•μ—μ„œλŠ” 였λ₯Έμͺ½μœΌλ‘œ κΊ½κ³ , κ°„μ„  μœ„μ—μ„œλŠ” μ™Όμͺ½μœΌλ‘œ 꺽게 ν•˜μ—¬ 항상 κ°„μ„ μ˜ μ™Όμͺ½μ„ 따라 ν•˜λ‚˜μ˜ μ„Όμ„œλ₯Ό κ°€μ§€κ³  μ΄λ™ν•˜λ„λ‘ ν•˜μ˜€λ‹€.
Problem : 정점을 μΈμ‹ν•˜λŠ” κ³Όμ •μ—μ„œ 흰색 μœ„μ— μžˆλŠ” 경우 μ •μ μ˜ 색을 μΈμ‹ν•˜μ§€ μ•Šκ³  μ§€λ‚˜κ°€λ²„λ¦¬λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€λ‹€.
Solution : 흰색 바탕을 λ°Ÿμ•˜μ„ 경우λ₯Ό 간선을 λ°Ÿμ•˜μ„ λ•Œλ³΄λ‹€ 더 많이 νšŒμ „ν•˜λ„λ‘ ν•˜μ—¬ ν°μƒ‰μœ„μ— μœ„μΉ˜ν•˜λŠ” μ‹œκ°„μ„ μ€„μ˜€λ‹€.

    // vertex on right side && row ==0 or row is odd number or 0
    if((row==0 || row %2 == 1) && getColorName(c3) !=6){
        int check=0;
        //get c2 on the line
        while(getColorName(c2)==6){
            setMotorSpeed(lm,(nMotorSpeedSetting + val)/2);
            setMotorSpeed(rm,(nMotorSpeedSetting - val)/8);
            sleep(80);
        }
        //while c2 is not white turn right for color
        while(getColorName(c2)!=6 && check < 2){
            setMotorSpeed(lm,(nMotorSpeedSetting + val)/2);
            setMotorSpeed(rm,(nMotorSpeedSetting - val)/8);
            sleep(120);
            //?
            if(getColorName(c2) == red) 
            {
                if (row%2 == 0) S[row][count] = 1;
                else S[row][4-count] = 1;
                playSound(soundBeepBeep); 
                check++;
                sleep(50);
            }
            else if (getColorName(c2) == blue){
                if (row%2 == 0) S[row][count] = -1;
                else S[row][4-count] = -1;
                playTone(220,20);
                check++;
                sleep(50);
            }
            else{
                if (row%2 == 0) S[row][count] = 0;
                else S[row][4-count] = 0;
                playTone(440,20);
                check++;
                sleep(50);
            }
        }
        while(getColorName(c3) !=6){
            //if on color turn left
            if(getColorName(c2) != white)
            {
                setMotorSpeed(lm,nMotorSpeedSetting - val);
                setMotorSpeed(rm,nMotorSpeedSetting + val);
            }
            //if on white turn right
            else
            {
                setMotorSpeed(lm,nMotorSpeedSetting + val);
                setMotorSpeed(rm,nMotorSpeedSetting - val);
            }
        }
        vertex=1;
    }

Theory : row==0 μ΄κ±°λ‚˜ rowκ°€ ν™€μˆ˜μΈ κ²½μš°μ—λŠ” 였λ₯Έμͺ½ μ„Όμ„œλ₯Ό κΈ°μ€€μœΌλ‘œ 흰색이 μ•„λ‹Œ 경우 정점이라고 νŒλ‹¨ν•˜κ³  κ°€μš΄λ° μ„Όμ„œκ°€ μ •μ μ˜ 색을 μΈμ‹ν•˜λ„λ‘ ν•˜μ˜€λ‹€.
Problem : λ…Έλž€μƒ‰μ€ κ°„μ„ μ˜ 기본색인데 이λ₯Ό νŒŒλž€μƒ‰μœΌλ‘œ μ˜€μΈμ‹ν•˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜μ˜€λ‹€.κ·Έλž˜μ„œ 항상 λͺ¨λ“  정점을 νŒŒλž€μƒ‰μ΄λ‚˜ λΉ¨κ°„μƒ‰μœΌλ‘œ μΈμ‹ν•˜λŠ” 였λ₯˜κ°€ λ°œμƒν•˜μ˜€λ‹€.
Solution : checkλΌλŠ” λ³€μˆ˜λ₯Ό 톡해 첫번째 색인식은 였λ₯˜λ‘œ νŒλ‹¨ν•˜κ³  두 번째 μΈμ‹ν•œ 색을 μ •μ μ˜ μƒ‰μœΌλ‘œ νŒλ‹¨ν•˜κ²Œ ν•˜μ—¬ 였λ₯˜λ₯Ό μ œκ±°ν•˜μ˜€λ‹€.

μœ„μ— λ‚˜μ˜¨ μ •μ μ˜ 색을 였λ₯˜μ—†μ΄ μΈμ‹ν•˜κ³  μ•ˆμ •μ μœΌλ‘œ μ§€λ‚˜κ°€κ²Œ ν•˜κΈ° μœ„ν•΄ 정말 λ§Žμ€ 밀을 μƒœλ‹€. 정점을 μΈμ‹ν•˜λ©΄ 였λ₯Έμͺ½μœΌλ‘œ 일정 μ‹œκ°„ νšŒμ „ ν›„ 색을 μΈμ‹ν•˜κ²Œ ν•˜λŠ” 방법,,,정점을 μΈμ‹ν•˜λ©΄ 멈좘 ν›„ 천천히 μ΄λ™ν•˜μ—¬ 색을 μΈμ‹ν•΄λ³΄λŠ” 방법,,,λ“±λ“± 정말 ν•  수 μžˆλŠ” λͺ¨λ“  방법을 μ‹œλ„ν–ˆμ§€λ§Œ row의 λμ—μ„œλ‚˜ μ •μ μ˜ 색이 λ…Έλž€μƒ‰μΈ 경우 λ“±λ“± 일정 λΆ€λΆ„μ—μ„œμ˜ 였λ₯˜λ₯Ό 쀄일 μˆ˜λŠ” μžˆμ—ˆμ§€λ§Œ 이 λ°©λ²•λ§ŒνΌ λ§΅ μ „μ²΄μ—μ„œ κΉ”λ”ν•œ λ™μ‹œμ— 거의 99.999%의 정확도와 이 후에도 μ•ˆμ •μ μœΌλ‘œ λ‚˜κ°ˆ 수 μžˆλŠ” 방법은 μ—†μ—ˆλ‹€. 이 방법을 μ„±κ³΅μ μœΌλ‘œ μ™„μ„±μ‹œν‚¨ 것이 1등을 ν•  수 μžˆμ—ˆλ˜ 결정적인 μš”μ†Œμ΄μž 이 μˆ˜μ—…μ˜ μ΅œμ’… λͺ©μ μ΄ μ•„λ‹Œκ°€ 개인적으둜 μƒκ°ν•œλ‹€!! 😊

// ...rowκ°€ 짝수인 경우
    else vertex = 0;

    if(vertex ==1){
        count=count+1;
    }
}

rowκ°€ 짝수인 κ²½μš°λ„ λ™μΌν•˜κ²Œ μ²˜λ¦¬ν•œ ν›„ λ§ˆλ¬΄λ¦¬ν•˜μ˜€λ‹€.


Step 2. νšŒμ „ν•˜κΈ°


void turnLeft()
{
    setMotorSpeed(lm, 40);
    setMotorSpeed(rm, 40);
    sleep(200);
    while( getColorName(c1) != 4)
    {
        setMotorSpeed(lm, -nMotorSpeedSetting * 4/10);
        setMotorSpeed(rm, nMotorSpeedSetting * 4/10);
        sleep(10);
    }
    while( getColorName(c2) != 4)
    {
        setMotorSpeed(lm, -nMotorSpeedSetting * 4/10);
        setMotorSpeed(rm, nMotorSpeedSetting * 4/10);
    }
    while(getColorName(c2) == 4){
        setMotorSpeed(lm, -nMotorSpeedSetting * 4/10);
        setMotorSpeed(rm, nMotorSpeedSetting * 4/10);
    }
    setMotorSpeed(lm, 0);
    setMotorSpeed(rm, 0);
    sleep(100);
}
void turnRight()
{
    setMotorSpeed(lm, 40);
    setMotorSpeed(rm, 40);
    sleep(200);
    while( getColorName(c3) != 4)
    {
        setMotorSpeed(lm, nMotorSpeedSetting * 4/10);
        setMotorSpeed(rm, -nMotorSpeedSetting * 4/10);
    }
    while( getColorName(c2) != 4)
    {
        setMotorSpeed(lm, nMotorSpeedSetting * 4/10);
        setMotorSpeed(rm, -nMotorSpeedSetting * 4/10);
    }
    while(getColorName(c2) == 4){
        setMotorSpeed(lm, nMotorSpeedSetting * 4/10);
        setMotorSpeed(rm, -nMotorSpeedSetting * 4/10);
    }
    while(getColorName(c2)!=4)
    {
        setMotorSpeed(rm,nMotorSpeedSetting * 4/10);
        setMotorSpeed(lm,-nMotorSpeedSetting * 4/10);
    }
    setMotorSpeed(lm, 0);
    setMotorSpeed(rm, 0);
    sleep(100);
}

Theory : νšŒμ „ν•˜λ €κ³  ν•˜λŠ” λ°©ν–₯에 μžˆλŠ” μ„Όμ„œκ°€ 간선을 인식할 λ•ŒκΉŒμ§€ νšŒμ „ν•œ ν›„ κ°€μš΄λ° μ„Όμ„œκ°€ 간선을 인식할 λ•ŒκΉŒμ§€ νšŒμ „ν•˜κ³  λ‹€μ‹œ κ°€μš΄λ° μ„Όμ„œκ°€ 간선을 톡과해 흰색을 인식할 λ•ŒκΉŒμ§€ νšŒμ „ν•˜λ„λ‘ ν•˜μ—¬ 90νšŒμ „μ„ ν•œλ‹€.
Problem : μ™Όμͺ½μœΌλ‘œ νšŒμ „ν•˜λŠ” κ²½μš°μ—λŠ” λ¬Έμ œκ°€ μ—†μ—ˆμ§€λ§Œ 였λ₯Έμͺ½μœΌλ‘œ νšŒμ „ν•˜λŠ” 경우 κ°„μ„ μ˜ 였λ₯Έμͺ½μœΌλ‘œ λ²—μ–΄λ‚˜ 흰색을 μΈμ‹ν•œ μƒνƒœμ—μ„œ νšŒμ „μ΄ λ§ˆλ¬΄λ¦¬λ˜μ–΄μ„œ 이 직진할 λ•Œ κ°„μ„ μ˜ μ™Όμͺ½μ„ κΈ°μ€€μœΌλ‘œ λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ— μ—‰λš±ν•œ 곳으둜 λΉ μ Έλ‚˜κ°€κ²Œ λœλ‹€.
Solution : 였λ₯Έμͺ½ νšŒμ „μ€ νšŒμ „μ΄ λλ‚œ ν›„ λ‹€μ‹œ κ°„μ„ μ˜ λ…Έλž€μƒ‰μ„ 인식할 λ•ŒκΉŒμ§€ μ™Όμͺ½μœΌλ‘œ νšŒμ „ν•˜λ„λ‘ ν•˜μ—¬ 이 ν›„ 직진에도 λ¬Έμ œκ°€ 없도둝 ν•˜μ˜€λ‹€.


Step 3. νƒμƒ‰ν•˜κΈ°


void completeSearch()
{
    int checksize = 0;
   while(true)
   {
        go();
        if(row == 0 && count == 4 && checksize == 0)
        {
            {
                stopMotor();
                sleep(100);
                setMotorSpeed(lm, 20);
                setMotorSpeed(rm, 20);
                sleep(400);
                stopMotor();
                sleep(100);
            }
            if(getColorName(c2) != white)
            {
                c = 4;
                r = 3;
                setMotorSpeed(lm, -20);
                setMotorSpeed(rm, -20);
                sleep(200);
                stopMotor();
                sleep(100);
            }
            else
            {
                c = 3;
                r = 4;
                setMotorSpeed(lm, -20);
                setMotorSpeed(rm, -20);
                sleep(300);
                stopMotor();
                sleep(100);
            }    
            checksize++;
        }   

맡이 5X4인지 4X5인지 첫 μ€„μ˜ 4번째 μ •μ μ—μ„œ λ‹€μŒ κ°„μ„ μ˜ 유무λ₯Ό 톡해 νŒλ‹¨ν–ˆλ‹€.

        if(count == c+1)
        {
            if(row == r) return;
            if(row%2 ==0)
            {
                turnRight();
            }
            else
            {
                turnLeft();
            }

            count=0;
            row=row+1;

            stopMotor();
            sleep(500);


            if(row%2 == 0)
            {
                while(getColorName(c1)== 6) {
                    //if on color turn left
                    if(getColorName(c2) != white)
                    {
                        setMotorSpeed(lm,(nMotorSpeedSetting - val)/2);
                        setMotorSpeed(rm,(nMotorSpeedSetting + val)/2);
                    }
                    //if on white turn right
                    else
                    {
                        setMotorSpeed(lm,(nMotorSpeedSetting + val));
                        setMotorSpeed(rm,(nMotorSpeedSetting - val)/2);
                    }
                }
                go();
                turnLeft();
            }
            else
            {
                while(getColorName(c3)== 6) {
                    //if on color turn left
                    if(getColorName(c2) != white)
                    {
                        setMotorSpeed(lm,(nMotorSpeedSetting - val)/2);
                        setMotorSpeed(rm,(nMotorSpeedSetting + val)/2);
                    }
                    //if on white turn right
                    else
                    {
                        setMotorSpeed(lm,(nMotorSpeedSetting + val));
                        setMotorSpeed(rm,(nMotorSpeedSetting - val)/2);
                    }
                }
                go();
                turnRight();
            }
        }
    }
}

row의 끝에 λ„λ‹¬ν•œ 경우 νšŒμ „ν•˜κ³  rowλ₯Ό 늘린 ν›„ count=0둜 μ΄ˆκΈ°ν™”ν•˜κ³  λ‚˜μ„œ goν•¨μˆ˜λ₯Ό 톡해 λ‹€μŒ row의 첫 μ •μ μ˜ 색을 νŒλ‹¨ν•˜κ³  νšŒμ „ ν•˜λŠ” λ°©μ‹μœΌλ‘œ λͺ¨λ“  정점을 탐색해 λ‚˜κ°”λ‹€. 탐색 ν›„μ—λŠ” 2차원 배열에 λͺ¨λ“  μ •μ μ˜ 색을 μ €μž₯ν•œ ν›„ λ‹€μ‹œ 점수둜 λ°”κΎΈμ–΄ μ €μž₯ν•˜μ˜€λ‹€.


Step 4.  μ΅œλ‹¨ 경둜, μ΅œλŒ€ 점수둜 λ³΅κ·€ν•˜κΈ°


for(int i = 0; i<r+1; i++){
        for ( int j = 0; j<c+1 ;j++){
            if(i==0 && j==0) dt[i][j]=S[i][j];
            else if(i==0) dt[i][j] = dt[i][j-1]+S[i][j];
            else if(j==0) dt[i][j] = dt[i-1][j]+S[i][j];
            else dt[i][j]= max(dt[i-1][j],dt[i][j-1])+S[i][j];
        }
    }
    sleep(500);
    int score = dt[r][c];    

    while(r != 0 || c!= 0){
        if(r==0) goLeft();
        else if(c ==0) goUp();
        else if(dt[r-1][c] > dt[r][c-1]) goUp();
        else goLeft();
    }

Theory : λ‹€μ΄λ‚˜λ―Ή ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•˜μ—¬ 도착점~μΆœλ°œμ κΉŒμ§€ λͺ¨λ“  μ •μ μ˜ 점수λ₯Ό κ·Έ 직전 μ •μ μ˜ μ μˆ˜μ™€ ν•©ν•œ 것쀑 μ΅œλŒ€ 점수만 μ €μž₯ν•˜μ˜€λ‹€. 그리고 μ΅œλŒ€ 점수만 λ”°λΌμ„œ 좜발점으둜 μ΄λ™ν•˜λ„λ‘ ν•˜μ˜€λ‹€.

μ‹œμ—°μ˜μƒβ€ΌοΈ
https://youtu.be/OUp2KLjicu0 πŸ‘‰πŸ» 1번문제 45
https://youtu.be/CMb2eE66qq4 πŸ‘‰πŸ» 1번문제 5
4