박민혀기

Vision_Kart 2.3v 본문

CELLON Kart(Tracking)

Vision_Kart 2.3v

박민혀기 2024. 4. 2. 22:50

Vision_Kart 2.3v

Vision_Kart 2.2v의 테스트는 성공적으로 마쳤다..

Vision_Kart 2.3v은 지난주 미팅에서 나왔던 작은 오류나 현장 Key 입력을 위한 UI, 그래도 혹시 모르는 에러를 위해 추가 안정화 구현이다.

Environment of Vision_Kart

Processor : RaspberryPi 4

OS : Raspbian

Lidar : YDLidar G2

Lidar Frequency : 10Hz ~ 12Hz(recommend 7Hz)

New function

  • distance 값 0 초기화 현상(이전 Target과의 거리로 출력중)
  • Key 입력 예외처리
  • Frequency 값 조절(Keyboard)
  • min size 임계 적영 Keyboard 입력(측변부분 자세히)
  • 측면부분 팔 분류

Goals

위에 5개 기능을 구현하면 된다..

Algorithm

어제 distance 값 0 초기화 현상(이전 Target과의 거리로 출력중)과 Key입력 예외 처리 기능은 수정을 바친 상황이다.

 

그래서 Frequency 값 조절을 시작하면서 포스팅을 시작한다.

우선 Frequency 값 변경을 위해 변수 "frequency"를 변경해 보았다.(Frequency의 범위는 5 ~ 12Hz이다.)

아래 코드는 50번째 스캔마다 frequency를 1 증가하는 코드이다.(초기값 5Hz)

하지만 아무런 변화는 없었다.

    a++;
    if(a > 50){
        a = 0;
        frequency += 1;
        laser.setlidaropt(LidarPropScanFrequency, &frequency, sizeof(float));
        cout << "UP!!" << endl;
    }

단순히 변수 값 변경으로만 속도 제어가 되지 않았다.

 

 

다음은 동작을 끄고 다시 재부팅해서 실행해 보려고 한다.

아래 소스코드를 보고 다시 OFF/ON을 할 생각이다.

laser.turnOff();
laser.disconnecting();

 

아래 소스코드로 추가하여 실행해 보았지만 12로 바뀌는 과정에서 Segmentation fault 에러가 발생하면서 프로그램이 종료됐다.

a++;
if(a > 50){
        laser.turnOff();
        laser.disconnecting();

        frequency = 12;
        laser.setlidaropt(LidarPropScanFrequency, &frequency, sizeof(float));
        cout << "Up!" << endl;
        laser.turnOn();
}

 

이정도도 안 되면 LaserScan 클래스 변수를 전역변수로 빼서 작업 하는게 맞을 것 같다고 판단하여 그렇게 작업해 봐야겠다.

최후의 방법으로 라이다 셋팅부터 부팅까지 다시하는 프로그램으로 실행해 봤다.

이런 식으로 라이다를 종료하고 셋팅부터 다시 시작하는 프로그램을 작성/실행했다.

int ydlidarSet(float freq);

int main(){
        float frequency = 5.0;
        if(!ydlidarSet(frequency)){
                cout << "ydLidar Setting Error!!" << endl;
                return -1;
        }

        int a = 0;
        LaserScan scan;
        while(os_isOk()){
                if(laser.doProcessSimple(scan)){
                        a++;
                        if(a == 50){
                                cout << a << endl;
                                laser.turnOff();
                                laser.disconnecting();

                                frequency = 10.0;
                                if(!ydlidarSet(frequency)){
                                        cout << "ydLidar Setting Error!!" << endl;
                                        return -1;
                                }
                        }

                        cout << "Scan received [" << scan.points.size() <<
                                "] points scanFreq [" << scan.scanFreq << ']' << endl;

 

결과는 성공이었다. 물론 위에 실험 환경은 라이다를 처음 동작 시켜봤던 코드이다.(YDLidar 사에서 제공하는 tri_test.cpp 소스코드를 조금 수정해서 사용했던 Control_Lidar.cpp 소스코드) 따라서 현재 Vision_Kart2.3v에 그냥 적용하기엔 코드가 복잡하다 몇 가지 수정을 하고 좀 더 안정화가 필요할 것 같다.!!

 

Vision_Kart2.3v에 적용 성공했다. 위에 Control_Lidar 소스코드처럼 함수 모듈화를 통해 진행하니 키 입력 처리 밖에 할 것이 없었다.(원인만 찾으니 생각보다 쉽게 해결 됐다.)

아래 함수는 전체 소스코드에 일부분을 잘라온 것이다.

frequency 변수를 전역 변수로 전환 후에 frequencyTemp라는 전역 변수를 또 설정해 두었다.

키 입력을 하게되면 frequencyTemp에 저장되고, frequency과 비교 후 라이다 셋팅, 동작, 연결을 중지하고 새로운  frequency 값을 설정하여 동작하게 된다.

int main(){
    if(frequency != frequencyTemp){
        laser.turnOff();
        laser.disconnecting();

        frequency = frequencyTemp;
        if(!ydlidarSet(frequency)){
            cout << "ydLidar Setting Error!!" << endl;
			return -1;
        }
    }
}

else if(key == 51){
        putText(backupMat, "Frequency(5Hz ~ 12Hz, Typical 10Hz)", Point(10, 900),
                FONT_HERSHEY_SIMPLEX, 0.8, Scalar(200, 200, 200), true);
        imshow("dotMat", backupMat);

        int freq = waitKey(0) - 48;
        if(freq == 1){
                int freq2 = waitKey(0) - 48;
                if(3 > freq2){
                        string freqText = to_string(freq);
                        string freq2Text = to_string(freq2);
                        frequencyTemp = stoi(freqText + freq2Text);
                }
        }
        else if(freq > 4 && 16 > freq)
                frequencyTemp = freq;
}

 

'CELLON Kart(Tracking)' 카테고리의 다른 글

How much Raspberry Pi can be used with YDLidar G2 on Samsung batteries(20000mAh)  (0) 2024.04.03
Vision_Kart 2.2v  (0) 2024.03.29
Vision_Kart 2.1v  (0) 2024.03.28
Vision_Kart 2.xv MasterPlan  (0) 2024.03.28
Vision_Kart 2.0v  (0) 2024.03.27