이 글은 mini DRC 참가를 위해, 8월초에 정리한 글입니다. 전략이었는데, 이번 챌린지에서는 사용할 기회가 없었네요^^;;; 다음 재난구조로봇에 참가할 분들을 위해 공유합니다.
이 글은 모든 미션이 비전을 이용해, 자율주행할 수 있는 지를 검토해 보기 위해 알고리즘을정리한 글이다 (참고로, 로봇제어는 모두 통신으로 처리해야 하며, 로봇의 모습이나 주변 상태는 눈으로 보이지 않는 거리에 있다). 로봇 기반으로 비전 처리를 해야하는 미션 및 알고리즘을 정리한다.
참고로, 경기장의 재원 정보를 이용하면, 비전 처리 시 계산 속도를 높일 수 있다. SLAM을 처리하는 것은 좀 불안하다. 로봇이 경기장을 모두 스캔하고, 경기를 할 수는 없기 때문이다. 하지만, 만약, 경기장 규격이 경기 당일까지 전혀 바뀌지 않는다면, 현장 맵을 미리 프로그램에 넣을 수 있다. 이는 큰 속도 향상을 가져 올 수 있다 (*주: 자동 방식 보다는 반자동 방식이나 수동 방식으로 전략을 만들었다. 각 미션을 자동으로 진행한다는 것은 매우 어렵다).
1. 개요
1. 장애물 통과
장애물은 폭 20cm 통과 여유가 있다. 객체 인식은 3차원 포인트 클라우드를 획득했을 경우, PC의 성능만 뒷받침해준다면, 곡률 및 유클리드 거리 기반 세그먼테이션 기법을 사용해, 객체를 구분하고, 위치를 얻어 낼 수 있다. 2차원 이미지로는 객체를 2차원적으로는 구분하고, 상대적인 크기를 획득할 수는 있지만, 거리/위치를 얻기는 매우 어렵다. 2차원 이미지 기반비전은 기본적으로 현재 이미지의 특징점과 패턴을 인식하는 데는 용이하고, 빠른 처리가 가능하나, 객체의 거리/위치를 얻는 것은 명확한 한계가 있다.
만약, 객체의 위치와 거리를 얻을 수 있으면, 그 사이 위치를 확인해서, 로봇이 주행의 중심으로 오게 하여, 장애물을 피해가게 할 수 있다. 다만, 진행 방향과 거리를 미리 지정해 주어야, 장애물을 피해서 갈 수 있다. 로봇에 명령하는 알고리즘은 다음과 같이 정리할 수 있다.
1) Vbeg = 진행 방향 시작점
2) Vend = 진행 방향 끝점
3) Vdir = 진행 방향 벡터 및 거리
4) 장애물 스캔 및 회피 진행
1) 3차원 포인트 클라우드 획득
2) 세그먼테이션
3) 세그먼테이션된 객체 크기 및 거리 계산
4) 장애물과 Vdir을 고려해서, 진행 경로 Path 계산.
Path는 현재 로봇에서 다음 경로까지 상대 거리와 방향을 가지고 있음
5) Path 정보를 이용해, 로봇 기구부 이동
6) Vend 지점 주변부(허용오차거리 이내)까지 로봇이 도착하면, 이 단계 미션 성공!
7) 1)번부터 반복 실행
이런 것이 가능하기 위해서는, 로봇 기구부 정면부 (20미터 크기의 장애물을 스캔할 수 있는)를 스캔할 수 있는 이미지 센서가 있어야 한다. 아울러, 장애물과 로봇의 거리가 작을 경우, 이를 충분히 스캔할 수 있는 장비가 필요하다. 일반적인 RGBD센서는 50cm 거리 이상의 사물만 스캔할 수 있음을 명심하자. 그러므로, 이런 미션을 수행하기 위해서는 20cm 이하도 스캔할 수 있는 근거리용 스캔 센서가 필요하다.
아울러, 모든 방향, 자세 및 이동 거리 제어는 PID방식으로 해야 한다. 로봇의 바퀴는 마찰력에 따라 진행 중 자세가 흐트러질 수 있음을 명심하자.
2. 사다리 오르기
사다리는 20cm 간격으로 봉이 걸쳐져 있다.
이 미션은 간단히 IMU센서로 처리할 수 있을 듯하다 (*주: 현재 시점에서는 글을 쓸 8월 초 당시에 이 미션이 얼마나 어려운 것인지 몰랐었다. 일단, 이 미션이 가능하려면, 기구부에 로봇암이 두개 이상 있고 끝 부분이 마찰력이 있어, 사다리 상판부를 마찰력으로 몸체를 끌어 올라갈 수 있는 형태거나, 캐터필러에 갈고리가 달려, 갈고리가 사다리 봉을 걸치고, 끝까지 등판할 수 있는 형태가 되어야 한다. 아니면, 사다리를 올라갈 정도 정밀하게 자세제어가 되는 안드로이드형 로봇이 캐터필러형보다 더 낫다. 그렇지 않으면, 이 미션은 매우 수행하기 어렵다).
1) 로봇 자세 인식/교정
자세가 사다리에 대해 바르지 않으면, 인식이 어려울 수 있음.
이는 다른 장애물(문 등)도 마찬가지임. 자세 인식 및 정렬은 IMU센서를 이용할 수 있음
2) 진행 시작점 Vbeg, 끝점 Vend, 벡터 Vdir 설정
3) IMU센서 스캔
1) 처음 사다리 미션 진행 시
진행 후 40도 기울어진 시점에서 IMU센서 측정. 사다리 시작부임을 표시
2) 사다리 시작부일 경우
IMU센서 기울어짐이 10도 이내일 경우, 사다리 마지막부임을 표시.
로봇을 40cm 더 주행함
이 또한, 앞의 글과 상황은 유사하다. 적절한 센서와 PID를 통한 자세 제어가 필요하다.
3. 출입문 통과
문을 인식하여, 통과해야 한다.
1) 이미지 스캔을 통해, 문 모서리 영역 인식
2차원 비전은 모서리 인식 알고리즘을 사용.
3차원 비전의 경우 곡률 기반 세그먼테이션을 사용해, 평면을 획득 후 문 형상과 가장 가까운 평면을 문이라 인식해, 문의 경계과 크기를 계산해야 함.
2) 문의 중심점 인식
3) 문의 중심보다 문을 밀고 닫기 좋은, 약간 우측 지점을 계산
4) 해당 지점 바로 앞으로 로봇을 이동
5) 로봇 자세 인식/정렬
6) 문을 60cm 밀며 진행
이 경우에서 조심해야 할 부분은 너무 지나가면, 바닥으로 떨어질 수 있다는 것이다. 이를 검출하기 위한 가장 간단한 방법은 로봇 바닥에 초음파 센서를 다는 것이다.
4. 밸브 잠구기
밸브를 인식하여, 잠구어야 한다.
1) 로봇 자세 인식/교정해 로봇암이 밸브까지 뻗을 수 있는 위치로 이동/자세정렬
2) 이미지 스캔 및 밸브 인식
1) 역시 세그먼테이션을 하고, 그 중에, 밸브 특징을 가진 객체를 추출한다.
2차원 비전일 경우, 밸브가 있을 만한 영역의 모서리들만 추출해 인식한다.
2) 밸브의 중심위치를 계산
3) 밸브 잠굼
1) 중심위치와 로봇암의 현재위치를 계산해, 이동 벡터 계산
2) 로봇암 엔드를 이동
3) 로봇암 엔드를 밸브에 걸치고, 시계 반대 반향으로 로봇암 엔드를 회전
로봇암을 이용할 경우, 엔드가 뻗는 거리나 위치를 이용해, 역으로 로봇암을 구성하는 각 모터의 회전각을 결정해야 한다. 이는 역기구학을 참고하도록 한다.
5. 인명 구조
인명을 인식하여, 구조해야 한다.
이 단계는 2차원 비전으로는 어렵다.
1) 3차원 이미지 스캔
2) 세그먼테이션
3) 인형 객체 추출 및 외곽선 계산
4) 외곽선에서 인형 축 벡터 계산
5) 인형 축 벡터와 법선 벡터 상에 로봇이 위치할 수 있도록, 로봇 자세 제어
6) 인형 축 벡터까지 로봇 암이 뻗을 수 있는 거리까지 로봇 이동
7) 로봇 암을 뻗어, 인형 폭을 넘어가도록 로봇 엔드를 뻗는다.
8) 로봇 엔드를 바닥에 닫게 함.
9) 로봇 엔드를 로봇 안쪽으로 끌어 땅김
10) 로봇 안쪽까지 인형을 싣게 된 상황이 되면, 로봇 암으로 인형을 고정시킴
이 경우, 로봇 암이 2개라면, 안정적으로 인형을 끌어 땅기고, 인형을 로봇 위에 싣고, 고정하기 쉽다.
6. 계단 내려오기
계단의 각 색상을 인식하여, 바닥까지 내려와야 한다.
1) 계단 상부 모서리 인식해, 로봇 자세인식/교정
2) 로봇 암 엔드에 달린 카메라를 계단 바닥 면을 보게 함
3) 2차원 이미지 스캔해 모서리와 영역 인식
4) 영역의 평균 색상 비교
5) 색상이 계단 바닥색상이면, 로봇 주행 종료
6) 로봇을 앞으로 주행
7) 3)번 단계로 가서 반복 실행
계단 내려오기 부분은 2차원 비전으로도 충분하다. 이런 문제는 OpenCV를 이용해, 색상영역을 인식하면 매우 쉽게 처리할 수 있다.
2. 고려사항
- 로봇의 자세에 따라 얻어지는 센서 이미지는 모두 틀리다. 그래서, 로봇 자세 교정 단계가 필요하다.
- 고정된 이미지가 얻어지는 것이 아니다. 인식하고 조정해야 하는 객체의 경우, 3, 6번의 경우에는 로봇 기구를 바른 자세로 만들고 진행해야 한다.
- 만약, 로봇 암으로 조정해야 하는 경우, 4, 5은 로봇 엔드에 이미지(카메라 등) 센서가 있는 것이 객체 인식에 매우 유리하다.
- PC성능 및 네트워크 성능만 좋다면, 3차원 비전이 훨씬 유리해 보인다. 다만, 네트워크 환경이 나쁘다면, 카메라 이미지만 사용해서 미션을 수행해야 한다.
- 경기장 규격 맵을 미리 만들어 넣으면, IMU센서를 이용해, 각 미션 객체와 로봇을 마주보게 하는 등의 자세 교정을 하기가 쉬워진다 (로봇이 SLAM맵을 한번 스캔하고, 대회를 진행하는 단계는 없기 때문에.).
- 모든 부분을 자동화하는 방식으로 알고리즘을 고민해 보았을 때, 역시, 3차원 포인트 클라우드를 실시간(예를 들어 3초 내에 3차원 이미지 스캔 -> 객체 세그먼테이션 -> 객체 위치/치수 계산)이 가능한 정도라면, 로봇과 객체까지의 위치/거리를 손쉽게 얻을 수 있으므로 쓸만하다.
- 계단과 같이 색상이나 모서리를 빨리 파악해야 하는 경우는 2차원 비전이 유리하다. 다만, 위치나 거리가 상대적이므로, 계속 이 데이터를 피드백 받으면서, 로봇을 진행시켜야 한다.
- 전체 미션 수행 시간이 10분이다. 6단계이므로, 한 단계당 100초의 시간 내에 끝내야 하며, 자동으로 할지, 수동으로 조작할 지, 서로 의견을 주고 받는 시간을 대략 20초로 잡으면, 80초 내에 각 단계를 수행해야 한다.
- 자동일때 3초 이미지 스캔/비전 처리가 가능하다면, 주행 1초당 10cm 속도로 주행한다고 가정했을 때, 한단계 주행 거리가 200cm라면, 80초가 걸린다(주행시간 20초 + 이미지 스캔/비전처리 60초). 만약, 하나의 스캔/비전처리 단위인 1 vision 당 20cm 주행이라면, 40초(10초+30초)가 소요될 것이다. 3초내에 스캔/통신/비전처리가 되는 정도의 하드웨어 스펙이라면, 비전 처리가 가능하다 (*주: 이 시점에서 고려하지 못한 것 중 하나를 언급해 본다. ROS를 통한 자동 제어도, 그 상황을 관찰할 수 있는 UI를 별도 개발하는 편이 좋다. 그리고, 자동 제어 도중, 로봇의 자세 등이 잘못되었을 때, 이를 통신하여, 보정해 줄 수 있도록, 모니터링하고, 미세 조정하는 기능도 아울러 개발하는 편이 좋다).
3. 기술적 고려사항
앞의 내용을 알고리즘으로 구성하기 전에 필요한 기술적 고려사항은 다음과 같다.
1. 3차원 포인트 클라우드, 2차원 비전 및 통신 기본 알고리즘까지 모두 개발할 시간은 없다.
PCL, OpenCV, ROS 를 최대한 활용해야 한다. 라즈베리파이2에 ROS를 설치해야 WiFi 동글을 통해, 통신을 할 수 있고, 마스터 PC에 노드로 등록할 수 있다. 이 전과정을 테스트해 봐야 한다.
2. 비전 인식 후 로봇 자세제어/구동을 위한 테스트를 해 보아야 한다.
일부는 이동/동작 지정 방식, 일부는 스캔->비전처리->동작제어->동작결과피드백->스캔 ... 으로 테스트하는 것이 필요하다.
3. 통신 테스트가 필요하다. 자동 동작하다가, 통신이 끈어진다던지, 트래픽이 나빠져, 전송속도가 급격히 떨어지는 등의 문제가 발생할 수도 있다 (*주: 이 글을 8월 초에 정리했는 데, 지금 읽어보니 무슨 예언 같은 글이다. 많은 참가팀이 이 통신 문제 때문에, 원격으로 카메라 영상을 전혀 보지 못하였다. 우리가 사용하는 모든 통신 주파수는 채널을 분할해 사용한다는 것을 명심하자. 채널을 사용하는 사람이 많을 수록 그 채널은 급격히 속도가 느려진다. 코엑스나 킨텍스와 같은 장소는 이런 문제가 발생하는 전형적인 환경이다. 이 시점에서 간섭없는 완벽한 통신 방법은 없는 것인지 궁금하다).
그러므로, 아래 레퍼런스를 참고해, 관련 SW를 설치해 보고, 이런 부분들을 테스트할 필요가 있다.
참고로, 아래는 이미지 스캔을 통해 획득한 데이터를 이용해, 객체를 인식하는 방법을 기술한 레퍼런스들이다. 이와 유사한 레퍼런스들이 구글링을 하면 많이 나온다. 그에 비해, 네이버 검색을 하면 별로 안나온다 (예 - opencv or pcl door detection 등) 해외 어떤 사이트의경우, 로봇+비전을 미리 개발해, 그 자료를 공개하고 있는 곳도 있었다.
댓글 없음:
댓글 쓰기