오프라인 차선인식 프로젝트 과정

happy_quokka·2023년 11월 14일
0

자율주행 프로젝트

목록 보기
2/15

1. ros 패키지 만들기 (src 폴더에서)

$ catkin_create_pkg lane_detection OpenCV roscpp sensor_msgs std_msgs xycar_msgs

2. 빌드(11/09일)

  • -linclude 문제 : 라이브러리에서는 안쓴다
  • callfunction 문제
  • cmake 순서 문제
  • 최상단에도 target 디렉토리, 라이브러리를 해줘야한다
  • 이미지 받아올때 8UI3으로...
  • roslaunch에는 cmake 에서 만든 프로젝트 이름을 type으로 넣어야한다!

3. 성공!!

4. 자이카가 고장났다...?!?!?

  • ssd 문제였다...
  • 결국 자이카 교체 (11/13일)

5. 자이카 모터가 잘 충전되어있고, 연결되어 있는지 확인하자..

  • 구동을 시작하기 전에 sudo chmod 777 /dev/ttyMOTOR 해주면 좋다!

(11/14일)

6. 차선인식 알고리즘

이미지 처리

-차선인식 알고리즘이 작동 안된다. 아마 crop 영역이 변경되어 그런것 같다.

  • 이진화를 하지 않고 바로 gray -> gaussian(필터 크기를 2로, 너무 크게하면 이상해진다) -> canny

ROI

  • roi의 높이를 30으로 조정(330~360으로) -> offset도 345로 변경
    --> 자이카를 돌려보면서 자이카가 너무 일찍 회전을 해서 roi를 아래로 낮췄다. : 350~380으로 (offset 365)

직선 처리

  • hough 20, 20으로 조정
    cv::HoughLinesP(canny_crop, lines, 1, CV_PI / 180, 20, 20, 5);
  • 왼쪽, 오른쪽 차선을 분류하는 것을 frame 중앙이 아니라 아래처럼 더 넓게 본다.
        int32_t left_range = frame_width * 0.7;
        int32_t right_range = frame_width * 0.3;

차선 처리

  • 수평선이 가끔 인식된다 -> 나중에 문제가 되면 조정 -> 문제가 된다ㅠㅠ

  • 콘센트 부분이 노이즈로 인식된다ㅠ

  • 이건 뭐지..

  • 이전은 왼쪽, 오른쪽 차선을 나누는 기준이 0~70%, 30~100% 부분이었다.

  • 이를 60%로 줄였다. -> 노이즈 제거 성공



  • 그치만 일부 남아있다
  • 여전히 콘센트 인식...

차선이 없는 경우, 인식을 못하는 경우

  • 차선, 직선을 아에 찾지 못하였을 경우, 초기화하는 방법 생각해보기

  • 차선이 영상 안에 없는 경우, 과거의 값을 사용하여 아래와 같은 문제 발생

  • 직선을 찾지 못한 경우 slope와 intercept를 0으로 초기화해준다. (온라인 차선인식 때 이렇게 했는데 클래스로 변경하는 과정에서 빠진듯하다)

차선 예측 (칼만필터 사용!!)

  • refine_pos는 false로 사용안한다
  • 끊긴 차선이 없고, 프레임이 없을때 오류로 작동하는 것 같아서
  • 그치만 칼만필터를 사용해서 차선을 보정하는 것은 하면 좋겠다!

state_matrix

  • slope : 기울기
  • slope_derivative : 각속도
  • intercept : 절편
  • intercept_derivative : 속도

slope_derivative

  • 기울기가 변한다
  • 양수 : 기울기가 안쪽으로 기운다
  • 음수 : 기울기가 바깥쪽으로 기운다
  • 음수 사용!
  • Why? 차선이 인식 안되는 경우는 보통 회전할 때인데, 좌회전의 경우 왼쪽 차선이 안보이고 이때 왼쪽차선의 기울기는 바깥쪽으로 향한다. 반대의 우회전의 경우는 오른쪽 차선이 안보이고 이때 오른쪽 차선의 기울기 역시 바깥쪽으로 향한다.
  • 값 조정
    • -0.02
    • -0.05
      나쁘지 않은것 같기도..? 그치만 시간이 쌓이면 조금 과하게 바깥쪽으로 기우는 것 같긴하다.
    • -0.1
      조금 심하게 바깥쪽으로 기운다, 초반에 오른쪽 차선이 실제보다 살짝 오른쪽으로 예측된다.

intercept_derivative

  • 차선이 평행이동 하는 느낌이다
  • 양수 : 차선이 점점 안쪽으로 예측된다
  • 그래서 음수 사용!!
  • why? 차선이 인식되지 않을 경우 0 또는 640으로 frame 바깥쪽으로 이동해야하기 때문!
  • 값 조정
    • -10
      너무 크게크게 변하고 다시 돌아오는데 시간이 걸리는 것 같기도...?
    • -5
      이건 좀 느린 느낌이다.

처리해줘야할 사항

  • 차선이 계속 인식되지 않을 경우 초기화해주는 작업이 필요할 것 같다.

  • 이상하다... 이러면 오른쪽으로 가는데....

  • 뭔가 빨리 변하면 될것 같기도? 그러니까.. 이전값의 영향이 빨리 사라지도록...? 빨리 벗어나도록!!!!

  • 문제 발생!

    • 좌표가 사라지는 일이 발생한다.
    • 기울기와 좌표를 통해 계산한 rpos가 640보다 크면 640으로 처리해주는데 그 범위 조차 넘어버린것인가?

    • 범위가 넘어가버린것 같다. 이게 무슨일이지?
    • 오른쪽 차선의 slope는 양수여야하는데 slope가 음수가 되는 일이 발생했다. 아마도 slope_derivative로 인해 기울기가 점점 바깥쪽으로 향하다가 음수가 되어버린것 같다. (원래 intercept는 음수다)
    • pos값을 계산했을 때 그 결과가 프레임 밖에 있다면(0보다 작고 640보다 큰 경우) 왼쪽인 경우 0, 오른쪽인 경우 640으로 설정하는 부분 추가
    • 그러니 해결됐다!!!

7. PID, 속도 조정

  • min 속도 : 10
  • max 속도 : 20
  • 직진일 때 0.1 씩 증가, 회전할 때 0.2씩 감소
  • min 속도가 너무 낮으면 인코스를 더 많이 밟아서 속도 증가 결정 (원래 5정도였다)
  • p_gain 조정
    • 처음에는 1로 시작
    • 1보다 크면 바퀴가 너무 왔다갔다 한다
    • 빨리 궤도로 가면 좋으니까 조금 크게 3으로 해봄
    • 3은 조금 큰것 같기는 하다...
    • 너무 급격하게 바뀌는것 같아서 (자이카가 회전할때 인코스를 자꾸 밟는다) 1이하로 값 조정
  • d_gain 조정
    • p_gain = 3
      • 0.05 : p의 흔들거림 조금 옅어짐
      • 0.1 : 조금 더 흔들거림이 줄어들었다.
max_speedmin_speedkalman(SLOPE_DER)kalman(INTER_DER)p_gaind_gaini_gain결과
2510-0.015-3.00.60.030.0006U 구간에서 길을 잃는다/ 인코스를 밟는다
2510-0.015-3.5 (빨리 옆으로 가게하기 위해서)0.60.030.0006U 구간에서 길을 잃는다 / 인코스를 밟는다
305-0.015-3.50.60.030.0004U 구간에서 길을 잃는다/ 회전시 속도가 너무 느리다
255-0.015-3.50.60.050.0004U 구간에서 길을 잃는다/ 속도가 빨라지면 바퀴가 흔들린다
  • calculate pos 변경 후
max_speedmin_speedkalman(SLOPE_DER)kalman(INTER_DER)p_gaind_gaini_gain결과영상
255-0.05-50.60.050.0004직선도 조금 벗어나고 회전할 때 너무 크게 돈다/ 너무 빠르다
205-0.02-51.00.00.0차선인식을 잘못한다.(직선에서도) / 차선이 예측되는게 너무 흔들린다 / SLOPE_DER를 -5로 한게 조금 큰것 같기도 하다(너무 급하게 양끝으로 가서 많이 회전해버리니 차선을 벗어난다)
205-0.02-51.00.0050.0너무 왔다갔다하는 것 같아서 D제어 추가/ DOWN_STEP_SPEED: 0.3/ 마지막 직선을 아에 인식 못한다 / 가속 속도가 빠른것 같다 / 여전히 흔들림 보정이 안된다
155-0.02-41.00.0050.0UP_STEP_SPEED 0.1 / 허프변환 결과 직선이 인식되는데 차선으로 인식이 안된다.(divide할때 뭔가 잘못된듯) / 회전할때 선을 다 밟는다. 더 안좋아졌다./좀느린가? /
255-0.015-3.50.60.050.0004이상하다....차선을 왜 못 찾지?!?!
255-0.015-3.50.60.050.0004calculate pos원래대로.../ 허프변환 th가 20이여야되는데 30으로 되어있어서 차선을 못 잡았다ㅠㅠㅠ / 이제 u 빼고 제대로 간다 / 여전히 인코스는 밟는다
255-0.015-50.60.050.0004start speed를 15로 / u 구간 제외 인코스 제외 다 잘된다
  • u구간 테스트(칼만 조정 -> inter_der를 -25로 결정)
max_speedmin_speedkalman(SLOPE_DER)kalman(INTER_DER)p_gaind_gaini_gain결과영상
255-0.015-100.60.050.0004u구간 테스트test1
255-0.015-200.60.050.0004u구간 테스트/ 여전히 조금 늦게 640이 된다test2
255-0.015-500.60.050.0004u구간 테스트/ 너무 빨리 날아간다. 차선을 벗어난다test3
255-0.015-300.60.050.0004u구간 테스트/ 너무 빨리 날아간다. 차선을 벗어난다test4
255-0.015-250.60.050.0004u구간 테스트 /잘 놓으면 통과한다. 블록을 넘어뜨리지만ㅜ(-25로 결정)test5
  • offset 변경(인코스 차선 밟는 문제 해결을 위해) -> 265로 결정!
max_speedmin_speedkalman(SLOPE_DER)kalman(INTER_DER)p_gaind_gaini_gain결과영상
255-0.015-250.60.050.0004offset 내리기(OFFSET: 375, DOWN_STEP_SPEED: 0.1) 급가속 급감속을 한다, 근데 offset 문제가 아닌것 같다. ros에서 에러가 난다test6
255-0.015-250.60.050.0004offset 내리기(OFFSET: 370, DOWN_STEP_SPEED: 0.1)test7
155-0.015-250.60.050.0004offset 원래대로(OFFSET: 365, DOWN_STEP_SPEED: 0.1) 그대로 급가속 확인하기 release mode여서 속도가 빨리빨리 적용되어서 생긴 문제다!! -> 다시 디버그 모드로...(아니 inshow 문제이다), 15로 줄이니 급가속 문제 해결4
155-0.015-250.60.050.0004offset 375 : 코너에서 차선을 놓쳐버렸다.test8
155-0.015-250.60.050.0004offset 370 : 여전히 이상하다..다시 원래대로 바꿔야지test9
  • PID 조절 (지글러 니콜스 방법 참고 -> 포기)
max_speedmin_speedkalman(SLOPE_DER)kalman(INTER_DER)p_gaind_gaini_gain결과영상
155-0.015-254.00.050.000바퀴 엄청 왔다갔다test 10
155-0.015-254.00.00.000지글러 니콜스 방법 참고 / 여전히 바퀴 엄청 왔다갔다test 11
155-0.015-252.40.16251.0833지글러 니콜스 방법 참고 / 바퀴가 크게 왔다갔다해서 차선을 벗어난다 -> pid 의 영향이 크구나test 12
155-0.015-252.40.16250.65지글러 니콜스 방법 참고 / 여전히 바퀴가 크게 왔다 갔다test 13
207-0.015-2550.0070.0너무 왔다갔다한다test 14
207-0.015-2550.070.0너무 왔다갔다한다test 15
207-0.015-25520.0너무 왔다갔다한다test 16
207-0.015-2520.70.0너무 왔다갔다한다test 17
207-0.015-251.20.70.0너무 왔다갔다한다, 직진을 좀 오래하면 맞춰진다test 18
207-0.015-251.20.80.0너무 왔다갔다한다, 직진을 좀 오래하면 맞춰진다test 19
207-0.015-251.00.80.0너무 왔다갔다한다, 그치만 곧 안정 / 책상많은 코너가 안된다ㅠㅠtest 20
207-0.015-250.80.80.0구간 1 (오매 구간까지) / 코너에서 벗어난다 : 늦게 회전 각도가 부족해서 왼쪽 차선이 가운데로 온다 -> d제어 문제인가?test 21
207-0.015-250.80.80.0구간 2 (U 구간 까지) / U구간에서 블록을 인식한다...test 22
207-0.015-250.80.80.0구간 3(U이후) : 문제 없음test 23
207-0.015-250.80.50.0error, angle 출력해보기/ angle 값이 30 이상이면 최대로 회전하도록 하는 부분 추가 -> 그래도 오매 구간 안된다 / u 구간은 차선 걸치기만 해서 통과하긴한다test 24
207-0.015-250.60.20.0angle 25이상이면 최대로 -> 탕탕 / u 구간 통과!!! / 오스틴 구간 실패 / s 코스 실패test25
207-0.015-250.60.050.0004Igain을 초기화(직전할때) / 오매 구간 실패 / s 코스 실패 (아마 속도 때문인것 같기도)test26
205-0.015-250.60.050.0004Igain을 초기화(회전할때) / u구간 실패(왼쪽 차선을 오른쪽으로 인식한다) /오매 구간 실패test27
205-0.015-250.60.050.0003Igain을 초기화(회전할때) 제거 / step_speed 0.1로 변경/ hough_image 확인 / u 구간 통과! / 오매 구간 직전 속도가 너무 빨라서 코너에서 벗어남(다시 놓아서 천천히가면 통과) / 오매 구간 다시 놓으면 통과함test28
205-0.015-250.60.050.0003down step_speed 0.2로 변경/ 오매구간 실패(다시 놓으면 성공) / u 간신히 성공 / s자 도입 실패(다시 놓으면 성공) /test29
205-0.015-250.60.060.0003조금 흔들리는 것 같아서 dgain증가 / dgain을 증가하니까 회전 반응이 늦어져서 오매구간 실패 / U구간 실패test30
205-0.015-250.60.050.0002오매구간 아예 실패 / u 구간 가장 부드럽게! /
205-0.015-250.60.050.000210<angle 절대값<25일때 angle-3 / 오매구간 실패 (다시하면 됨) / U구간 실패(다시하면 됨)test31
205-0.015-250.60.050.000210<angle 절대값<25일때 angle-3 제거 / min_line_length = 15; (20에서) / 오매구간 성공!! / u구간 실패..test32
205-0.015-250.60.050.0002angle 25이상이면 +10, -25이하이면 -10 / min_line_length = 10; (15에서) / 오매구간 실패(다시하면 됨) / u 구간 실패(다시하면 됨)test33
206-0.015-250.60.050.0002오매, u 실패test34
206-0.015-250.60.050.0003오매, u 실패
206-0.015-250.60.050.0001오매, u 실패test35
206-0.015-250.50.050.0002인코스 밟는거 조금 해결 / 오매구간 안잡았지만 너무 안쪽으로 돈다 / u구간 실패test36
206-0.015-250.450.050.0002오매, u 실패test37
206-0.015-250.50.0450.0002u 구간 실패, 오매 실패...test38
206-0.015-250.50.0450.0001u 구간 실패, 오매 실패...test39
206-0.015-250.50.0450.00015angle * 1.5 / 실패 실패test40
206-0.015-250.50.0450.00015angle 1.5 작을때는 0.9 / 실패 실패
206-0.015-250.50.0450.00015angle 20 기준 1.5 / 13기준 0.9 / 직선으로 인식하는 angle th 13 / 실패
206-0.015-250.50.0450.00015( angle 20 기준 1.5 / 13기준 0.9 ) 지우기로 결정 / 직선으로 인식하는 angle th 13 / 실패test41
206-0.015-250.450.040.00015angle 25이상이면 최대로 /s 실패test42
206-0.015-250.50.040.00015잘되던 마지막 코스도 실패test42
206-0.015-250.50.0450.000182개 다 실패test43
206-0.015-250.60.050.0002실패test43
206-0.015-250.60.080.0002실패test43
206-0.015-250.60.050.0002허프 th를 15로, 실패test43
206.5-0.015-250.60.050.0002허프 th를 15, 실패test43
206-0.015-250.550.050.0002허프 th를 18, 실패test43
205-0.015-250.60.050.0002허프 th를 20, 실패test43
205-0.015-250.60.050.0002직진보다 클때 angle 곱하기, 실패test43
  • 11월 17일 : 직진 구간에서 i 0으로
max_speedmin_speedkalman(SLOPE_DER)kalman(INTER_DER)p_gaind_gaini_gain결과영상
205-0.015-250.60.050.0002angle25이상이면 최대로 / hough 20에 10 /DOWN_STEP_SPEED: 0.15/ start 15 / 안됨test44
107-0.015-250.360.080.0006angle25이상이면 최대로 / hough 20에 10 /DOWN_STEP_SPEED: 0.15/ start 7 / MIN_LINE_LENGTH: 15 / 오매만 실패 / u 성공test44
118-0.015-250.360.080.0006angle25이상이면 최대로 / hough 20에 15 /DOWN_STEP_SPEED: 0.15/ start 7 / MIN_LINE_LENGTH: 15 / u, 오매 둘다 실패test45
157-0.015-250.360.080.0006angle25이상이면 최대로 / hough 20에 15 /DOWN_STEP_SPEED: 0.2/ start 8 / UP_STEP_SPEED: 0.05/ MIN_LINE_LENGTH: 15 / 실패test45
157-0.015-250.40.010.0007s도 실패test45
157-0.015-250.380.010.0007U 성공, s, 오매 실패test45
157-0.015-250.380.010.0008s 인코스 조금 해결 / u, 오매 실패test46
157-0.015-250.380.020.0007실패test46
157-0.015-250.380.0250.0007오매 통과 / s 실패test46
157-0.015-250.380.010.0007오매 통과 / s 성공 / u실패test46
1510-0.015-250.380.010.0007너무 빠르다test47
157-0.015-250.380.0090.0007오매 x, s와 u 성공test47
157-0.015-250.380.0110.0007오매 실패test47
157-0.015-250.380.0120.0007오매 성공 / u 실패test47
157-0.015-250.360.080.0006실패test48
157-0.015-250.360.10.0006너무 안 꺾는다test48
157-0.015-250.360.090.0006실패test48
157-0.015-250.380.090.0007오매 겨우test48
157-0.015-250.380.0090.0007다시 했는데 안된다
157-0.015-250.370.0090.0008안된다
  • 리허설
max_speedmin_speedkalman(SLOPE_DER)kalman(INTER_DER)p_gaind_gaini_gain결과영상
157-0.015-250.380.0090.0007오매, u, s 다 실패 / 블록 5개 / 3:04초test48
157-0.015-250.380.0090.0008실패test48
157-0.015-250.380.0090.0007angle 25이상이면 최대 / 실패test48
157-0.015-250.380.080.0007angle 25이상이면 최대 / DOWN_STEP_SPEED: 0.3/ 실패 / s는 성공test49
157-0.015-250.320.050.0007angle 25이상이면 최대 / 감속 step 0.25 / s는 성공 / 포기test49
157-0.015-250.360.080.0007블록 6개 / 재위치 2 / 오매랑 그다음 실패/ u 성공test49
157-0.015-250.360.090.0007블록 6개 / 재위치 2 / 오매랑 그다음 실패/ u 성공test49
157-0.015-250.350.080.0007블록 3개 / 재위치 2 / 오매랑 u 실패/ u 성공test49
157-0.015-250.350.080.0007up step 0.1 / 블록 5 / 재위치 2test49
157-0.015-250.350.080.0007down step 0.4 / 블록 2 / 재위치 2 (선택)test49
157-0.015-250.350.080.0008down step 0.4 / 블록 3 / 재위치 2test49
187-0.015-250.350.080.0007down step 0.7 / max_speed 18.0 / upspeed 0.15 / 블록 5 / 재위치 3 (선택) -> 2:52초test49
16.57-0.015-250.350.080.0007down step 0.7 / max_speed 16.5 / upspeed 0.12 / s 실패test50
157-0.015-250.350.080.0007START_SPEED: 15.0 / down step 0.4 / up step 0.15 / 블록1 / 재위치2 (선택)test50
187-0.015-250.380.00850.000UP_STEP_SPEED: 0.12 / START_SPEED: 18.0 / UP_STEP_SPEED: 0.12 / 오매 성공
157-0.015-250.350.080.0007START_SPEED: 15.0 / down step 0.4 / up step 0.15 / 블록1 / 재위치2 -> 2:13초test50

0개의 댓글