[우리동네 과학클럽] 불법 주정차 단속 로봇

작성자
박재현
작성일
2021-11-23 11:28
조회
900

Turtlebot을 활용한 불법 주정차 단속 로봇

우리동네 과학클럽 팀 (박재현, 홍권, 허재호, 채정의, 황찬욱, 문영진, 우연주)



불법 주정차 단속 로봇은 Turtlebot, Jetson Xavier nx, Realsense D435i를 이용하여 교내를 돌아다니며 불법 주/정차된 차량을 단속하기 위한 로봇입니다. 경기도 경제과학진흥원의 우리동네 과학클럽 사업 지원을 받아 진행되었습니다.  Visual SLAM을 통해 맵을 구축하고,  Path Planning 및 Navigating 알고리즘을 이용하여 목적지까지 운행하며 YOLO를 활용하여 불법 주/정차된 차량의 번호판을 자동으로 서버에 저장하는 알고리즘 및 코드를 구현해 보았습니다.

SLAM, 로봇 하드웨어 및 제어, YOLO(차량 및 번호판 인식) 총 세팀으로 나누어 프로젝트를 진행했습니다.

 

시뮬레이션 환경 구축

코로나19로 인하여 직접 인원들이 모여 개발하기 힘든 환경이였기 때문에 시뮬레이션 환경에서 알고리즘을 검증할 수 있도록 Gazebo Simulation을 이용하여 D435i를 탑재한 turtlebot으로 시뮬레이션을 진행하였습니다.

     

 

Turtlebot 하드웨어 조립

기본 하드웨어는 ROBOTIS의 TURTLEBOT3 Burger을 사용했습니다. 다만 Visual SLAM을 진행하기 위해 라즈베리파이3와 라이다를 제거하고 해당 부분에 Jetson Xavier NX와 Realsense D435i를 탑재하였습니다. Github 오픈 소스(https://github.com/beomsu7/px4-quadrotor-HW-parts)를 참고하여 Jetson 및 D435i에 맞는 고정대를 설계, 출력하였습니다.



 

로봇 수동 제어

SLAM 및 작동 테스트를 위하여 Navigating이 완성되기 전까지 수동 제어를 진행했습니다. 로봇 제어는 조이스틱 F710을 사용하였고, turtlebot의 키보드제어 코드인  teleop 대신 joy Node를 이용하여 제어를 진행했습니다.  조작을 하면서 발생한 문제점이 Turtlebot3의 하단부 높이가 너무 낮아 조그마한 턱도 넘어가기 쉽지 않다는 것을 깨달았고, 사실상 야외주행이 불가능하다는 것을 알게 되었습니다. 따라서 저희는 직접 주행은 포기하고 핵심 알고리즘만 구현해보기로 결정했습니다.

 

RealSense D435i를 이용한 SLAM & Localization

저희는 여러가지 SLAM 오픈소스 중에서 Real-Time Appearance-Based Mapping를 뜻하는 Rtabmap을 사용했습니다. 시각화 측면에서 뛰어나며 포인트 클라우드 형식의 Map을 ply등의 확장자가 있어 확장성이 좋다는 장점, Mapping을 하는 과정에서 생기는 Noise를 자체적으로 filtering하는 기능이 구축되어 더 효율적으로 정확한 Map을 만들 수 있다는 장점이 있어 해당 패키지를 이용했습니다.



위 사진과 같이 동아리 방 내부를 Mapping을 진행하였고, Localization 작동 여부도 테스트 해보았습니다. 다만 VO를 사용한 SLAM이기 때문에 부정확한 부분들이 다수 존재했습니다. 이후 Path Planning 및 Navigating 시에는 2D Map을 이용할 것이기 때문에 Occupancy Grid Map으로도 Topic을 출력하도록 설정했습니다.



이후 VIO를 이용하여 SLAM을 진행해보았지만, IMU calibration 문제로 인하여 drift가 발생되었습니다.  따라서 실제 SLAM에서는 VO SLAM을 진행하였습니다.

 

차량 위치 파악 & 번호판 인식

차량 위치 파악 및 번호판 인식을 위해서 Realsense D435i와 Jetson Xavier NX와 연결하고, 타 코드와의 통신을 위해 ROS Wrapper for Realsense devices 패키지를 이용하였습니다.  차량 인식을 위해서는 YOLO v3-tiny를 사용하였고, 번호판 OCR은 타 알고리즘을 활용하였습니다.



차량 인식의 경우 별도의 학습 없이 기본  모델을 이용하여 인식이 가능했습니다.  저희는 차량이 인식되면, 해당 프레임의 이미지에서 Bounding Box의 좌표를 알아내어 D435i의 Depth Data를 활용하여 로봇과 해당 차량과의 각도와 거리를 계산한 다음, Robot의 Global좌표에 더하여 해당 차량의 Global 좌표를 알아내는 패키지를 제작하여 불법 주정차된 차량의 위치를 표시 할 수 있도록 하였습니다.



ROS를 이용하여 구면좌표계의 보정이 되어있는 Aligned_Depth_raw data를 받아와서 CV_Bridge를 이용하여 OpenCV로 넘겨준 다음 행렬로 접근하여 원하는 Depth 값을 추출해내어 차량의 위치를 계산, 이후 로봇의 Global pose를 더하여 차량의 Global pose를 계산했습니다.



차량의 좌표를 저장한 다음에는 저장공간에 해당 번호판의 이미지를 업로드하게 됩니다. 그 이후에  저장된 사진을 이용하여 OCR을 진행, 차량번호 인식을 자동화 합니다. 해당 부분은 서버 시스템이 구축이 되지 않은 관계로 Xavier의 저장공간에 이미지를 저장하는 선에서 그쳤습니다.

 

Path Planning & Navigating

Path Planning을 위해서는 미리 저장된 map data를 불러와야 합니다. 모바일 로봇의 경우 굳이 3D Map을 사용하지 않고 2D Occupancy Grid Map을 이용하여 path planning이 가능하기 때문에 해당 data를 사용했습니다. 아래 사진은 turtlebot world 튜토리얼 맵을 rtabmap occupancy grid map으로 만든 사진입니다.



Path Planning 알고리즘에는 여러가지 알고리즘들이 존재하는데, 저희는 간단한 알고리즘과 간단하게 사용이 가능한 RRT* 알고리즘을 사용하여 path planning을 진행하였습니다. Sampling based algorithm 답게 깔끔하고 균일된 경로가 생성되지 않는 단점이 극명하게 드러났습니다.





 

위 사진은 Occupancy Grid map화된 동아리 방을 이용하여 path planning을 진행해본 결과입니다.  이제 이 값을 이용하여 Path를 생성하고 Navigating를 진행하여야 하는데, 앞서 말한바와 같이 VO SLAM에서 Localization이 완벽히 구현이 되지 않는 바람에 현재 위치, 속도 정보를 가지고 있는 Odometry를 알 수 없게 되었고, 이에 따라 Navigating까지는 진행하지 못하게 되었습니다. 따라서 로봇의 현재 위치를 Start point로 잡고, Desired point를 선택하면 해당 지점까지의 최적 경로를 생성하는 알고리즘까지 구현하였습니다.

 

소감 및 느낀점

항상 로봇의 전체적인 시스템 제작, 자율주행 및 ROS 통신에 관한 프로젝트를 접해보고 싶었는데 이번 기회를 통해 좋은 경험이 된거 같습니다. 해당 프로젝트를 통해 아두이노를 이용한 간단한 로봇 말고 복잡한 시스템 알고리즘이 들어간 로봇이 어떻게 설계되고 동작하는지 알 수 있었습니다. 간단하게 우분투를 설치하는 과정부터 Rtabmap 빌드, 직접 개발한 패키지 컴파일등 다양한 오류들이 발생하여 과정은 순탄치 않았으나, 팀원들과 공유하고 소통하면서 문제를 해결 할 수 있었습니다. 기존에 해당 분야를 접해본 팀원들도 자신들이 해당 분야에 조금은 잘 알고 있었다고 생각했지만, 계획에 차질이 생기는 과정에서 겉핥기로 알고 있었다는 것을 깨달았고, 문제 해결을 어떤 식으로 접근할지, 태도와 방법에 대해 더 고민할 수 있는 기회를 가지게 되어 굉장히 뜻깊은 경험이었습니다. 해당 프로젝트를 진행하면서 이론적인 측면뿐만 아니라 직접 Visual SLAM, 로봇 제작 및 제어, YOLO등을 활용하여 실습까지 함께 할 수 있어서 흥미롭고 효율적으로 프로젝트를 진행 할 수 있었다.
전체 0