RVIZ 자율주행 챌린지: wall_following
중요하다 싶은 것들, 수정한 것들을 위주로 타이핑해본다.
우리의 고려 요소는 아래 4가지로 구분된다:
1. 시뮬레이션과 실제 로봇 크기 차이
2. self.DIRECTION이 어느 각도에서 값을 받아오느냐
3. obstacle라고 인식하는 각도와 거리는 얼마큼 할 것인가, condition이 obstacle로 가는 조건은 무엇이냐
4. condition이 obstacle일 땐 어떤 행동을 취해주느냐
1. 시뮬레이션과 실제 로봇 크기 차이
시뮬레이션과 실제 로봇 크기 차이로 인해 생기는 차이는 꽤나 크다.
우선 주행하는 속도(speed)부터 시작하여, 유사시 취해야되는 각도 이동(angle), 감지 거리(scan_dist)등을 고려해야된다.
scan 거리값을 데이터로 받아들일 때 주로 사용하는 변수로서, 이 값에 따라 로봇의 condition을 forward, close, maintaining, far 그리고 obstacle 등으로 설정한다
그림으로 스캔 범위를 보면 다음과 같다.
로봇이 벽과 일정한 거리를 두게 하기 위해서는 scan_dist 값과 이와 연관된 offset 값을 키워야됐다.
2. 시뮬레이션 상에서 데이터를 받는 각도와 실제 로봇에서 데이터를 받는 각도가 달랐다.
이는 우리가 어느 각도까지 값을 받을 것인가를 직접 데이터를 출력해보면서 확인할 수 있었기 때문에 angle_distance 값을 바꿔가며 적정 값을 확인할 수 있었다.
물론 해당 각도(angle1, angle2)는 angel_distance로 계산된 값이며 스캔 거리 값에도 영향을 받는다. 하지만 대회 폭이 그리 넓지 않다는 점을 고려하였을 때 라이다 스캔 거리 값은 작을수록 좋았고, 이 또한 angle을 얻는 값에 영향을 주었을 것으로 예상된다.
3. obstacle라고 인식하는 각도와 거리는 얼마큼 할 것인가 & condition이 obstacle로 바뀌는 조건은 무엇으로 할 것인가
'전방 장애물 인식은 잘 하도록, condition이 obstcle로 바뀌는 데에는 어느 정도 조건이 붙도록' 로봇이 벽과 이루는 각도가 좁음에도 불구하고 obstacle로 인식하지 않은 경우 로봇은 벽과 충돌하는 것은 당연한 조건이었다. 하지만 또 condition이 필요이상으로 obstacle로 변하는 상황도 예방해야됐다. 그래서 도출한 결론은 로봇이 가장 예민하게 전방 사물을 감지하는 각도를 찾고, 버퍼를 활용해 일정 obstacle index 양 이상을 감지해야지만 condition이 바뀌도록(= 조건을 더 까다롭게 만듦으로) 하여 해당 문제를 해결할 수 있었다.
4. condition이 obstacle일 땐 어떤 행동을 취해줄 것인가
condition = 'obstacle' 일 때 가장 고려해야될 것은 각도를 얼마나 틀어줄 것인가 이다. 가장 신경써야되는 부분은 코스가 'ㄱ'자일 경우인데 이럴 경우 로봇이 과하게 방향을 틀어서 다음 이동을 할 때 타고 갈 벽을 찾지 못하는 상황이 발생하기 때문이다. 해당 값 역시 실제 로봇에 적용해보았을 때 적절한 값을 확인할 수 있었다.
기타 문제점:
로봇에 적용하였을 때 생기는 self.condition = "close"와 self.DIRECTION = LEFT 의 행방불명. 중복된 조건으로 인해서, 혹은 시뮬레이션 상에서 데이터를 얻는 속도와 실제 로봇에서 데이터를 얻는 속도의 차이에서 생기는 오차로 인해 발생한 문제로 간주된다.
하지만 이는 반대로 DIRECTION = RIGHT 와 self.condition = "far"은 잘 나온다는 뜻이 되었고 각 상황에서 방향(각도)와 속도의 적절 값을 입력해주면 되었기에 큰 문제가 되진 않았지만 작은 이슈로 발생하여 적어본다.
최종 결과 영상:
gazebo simulation
*
대회는 왼쪽 벽을 기준삼아 이동해야됐기에 실제 적용 코드는 이와 다르다.
물론 해당 코드를 바꿔주면 기준 벽이 세워지는 것은 맞지만 세부 파라미터 값은 동일하지 않다. 이는 위에서 말한 고려사항들을 참고하여 수정하면 큰 어려움 없이 진행된다.