박민혀기
Vision_Kart 2.3v 본문
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 |