Search

[엔지니어링][Motion Planning 속도개선][O(n) → O(1)]

생성일
2024/01/04 04:59
관련 근거 위치
사람

[성과]를 달성하게 된 배경에 대해서 설명해주세요.

Motion Planning 의 속도개선이 된 부분은 ‘가장 먼 장애물’ 을 어떻게 알 수 있을지에 대한 고민에서 시작되었다.
실제 자율주행 자동차에서 장애물을 인식 할 때는 ‘그게 무엇인지’ 가 정의 되어야 해야 했을것이다. 그렇기에 sensor fusion 이 왜 필요한지를 알게되었다.
생략가능 사설
다시 돌아와서, 장애물을 인식 할 때 ‘그게 무엇인지’ 에 대해서 정의가 되어야 하는 이유는 어떤 장애물을 피해 이동 목표 지점을 설정해야하는지에 대한 결론을 내려야하기 때문이다. 라이다 데이터만으로 정의 된 어떤 지점의 ‘점’은 그것이 경로를 만들기 위해 기준으로 삼아야 할 라바콘인지 배제 시켜야 할 사람인지 이상치인지를 모르기 때문이다.
다행히 우리는 라바콘만이 있는 주행환경이였고, DBSCAN 와 Threshold 를 통해 해결했다. 내가한건 아니고 조용재가 해줬다.
하지만 라바콘 환경의 트랙이 아니라, 진짜 자율주행을 한다면 라이다와 카메라의 센서퓨전은 필수이다.
조용재의 도움으로 DBSCAN 을 통해, 라바콘은 2D 배열 상의 어떤 점으로 특정되게 되었다. 나는 들로네 삼각법을 활용하여 Local Path Planning 을 만들었다. 이를 위해서 초기에는 가장 가까이 있는 콘 3개와 가장 멀리있는 콘 3개를 가져와야 할 필요가 있었다.
기능은 정상적으로 되니, 넘어갔지만 우리의 모든 모듈을 켰을 때, Yolo 의 연산속도가 독립적으로 실행 했을 때 보다, 2초나 느렸다. 미친건가 ? 싶은 마음에 어떻게든 연산속도를 줄이기 위해 속도를 줄이기 위한 것들을 찾다 발견 한 속도줄일 수 있는 부분이였다.
def farest_distance_point(main_map,x,y): farest_point = [x,y] farest_dist = 0 tmp_dist=0 tmp_point=[0,0] second_point = [x,y] second_dist = 0 obstacles = [] # 모든 장애물의 위치와 거리를 저장할 리스트 for i in range(len(main_map)): for j in range(len(main_map[i])): if main_map[i][j] == 1: # (i, j)가 장애물인 경우, 해당 장애물과의 거리를 계산하여 리스트에 추가합니다. d = math.sqrt( (i - x)**2 + (j - y)**2 ) obstacles.append(((i, j), d)) # 거리에 따라 장애물을 정렬합니다. obstacles.sort(key=lambda x: x[1], reverse=True) if len(obstacles) >= 3: return obstacles[0][0], obstacles[1][0], obstacles[2][0] elif len(obstacles) == 2: return obstacles[0][0], obstacles[1][0], None elif len(obstacles) == 1: return obstacles[0][0], None, None else: return None, None,None
Python
복사
기존 : 거리에 따라 정렬되어있지 않아, n번 연산하여 가장 가까운 장애물을 가져옴
개선 : 장애물을 거리에 따라 정렬해놓음으로 수정하여, n번째로 먼 곳에 있는 장애물을 직접 가져올수 있도록 수정 함
배열에서 장애물을 찾기위한 작업은 O(n^2) 이다. 이것도 개선이 가능 했을 것 같다.

[성과]는 누구와 함께 했나요 ?

혼자했습니당.

[성과]는 어디에 영향을 줬나요 ?

yolo 연산 결과에 영향을 주었으면 하여 개선 한 코드이나, 1초 미만으로 연산속도를 줄여주었음.

[성과]는 얼만큼 영향을 줬나요 ?

yolo 연산속도는 한번에 2.5-3초를 왔다갔다 했는데 코드 개선 이후 앞자리가 바뀌진 않았음. 0.5초 미만으로 연산속도에 기여함.

똑같은 [성과]를 한다면 어떻게 더 잘 할 수 있을까요 ?

알고리즘을 설계할 때의 규칙을 만들어야겠다고 생각했음. 만들고에서 끝나는게 아니라 만들고 개선해야하는 것은 자명하다… 생각이 되었던 부분
###프로젝트를 통해 느낀 알고리즘 설계단계### 1. 일단 만든다. 2. 속도를 측정한다. 3. 알고리즘을 개선할 수 있는지 판단한다. 이게 젤 어려움. 4. 알고리즘을 개선한다. 5. 속도를 측정한다. 6. 전체 시스템에 얼마나 영향을 주었는지 판단한다. 이것도 어려움
cuda 를 사용해봤더라면… 에 대한 아쉬움은 조금 남아있음.