드론을 활용하여 지정된 지역을 수색하며, 이동 중 적(TurtleBot3 Waffle)을 탐지합니다. 적 식별 시, 사용자는 트래킹 버튼을 활성화하여 드론이 적을 자율적으로 추적하도록 설정할 수 있습니다.
이 과정에서 드론은 실시간으로 적의 위치를 확인하고 추적 데이터를 TurtleBot3 Burger에 전달합니다. Turtlebot3 Burger는 드론으로부터 제공받은 정보를 기반으로 폭탄을 적의 위치로 정확히 유도하며 이를 통해 목표 타격 임무를 수행합니다.
본 시스템은 드론의 고정밀 탐지 및 자율 추적 기술과 TurtleBot의 타격 정확성을 결합하여, 동시다발적인 자율 임무 수행이 가능하도록 설계되었습니다.
개발 기간 : 6일
개발 언어 : python, c++ 등
개발 도구 : ros2 humble, PYQT, Rtab-map 3D, yolov8n등
해당 가상 시나리오를 만들기 위해서 AppStore에서 Rtab-Map 3D 라이더 어플을 사용하여 아이폰 뒤에 달린 라이더를 이용하여 맵 스캔을 하였습니다.
1차적으로 교실과 휴게실 복도 Map을 스캔하였습니다.
문제 발생
Map 생성 시 해당 부분의 공간에 가방이나 바퀴, 사람 발 등 라이더에 스캔 되었습니다.
Gazebo에서 Turtlebot을 이동할 때 해당 부분에 문제가 생겼습니다.
1. 걸려서 움직이기 않는 문제
2. 걸려서 날아가 버리는 문제
2차 Map을 제작할 때는 사람이 많이 없는 휴게실과 복도만 스캔을 하였습니다.
Rtab-map어플에서 db파일로 export 이후 ros2에서 Rtab-Map사용하여 .ply로 변환하였습니다.
sudo apt-get install ros-humble-rtabmap*
rtabmap
file에서 db파일을 찾아서 open
ply로 수출 결과 pointcloud로 된 맵이 생성
가제보에서는 pointcloud로 된 맵을 사용할 수 없어서 해당 링크에서 포인트 클라우드 데이터를 분석하고, 이를 삼각형 메시(triangle mesh)로 변환할 수 있는 패키지를 사용하였습니다. ply파일을 넣어주고 실행합니다.
파일을 실행하면 stl파일 생성됩니다.(주의 : 파일 경로를 확인해주세요)
맵이 생성되었지만 유리 벽으로 된 부분과 라이더 스캔 성능이 별로 좋지 않아 벽이 깨지는 현상이 발생하여 가제보에서 가벽을 설치하였습니다.
아까 가방 및 사람 발, 바퀴 등으로 인해서 찍을 수 없던 공간은 가벽으로 공간 생성하여 환경을 보완하였으나 cartographer 알고리즘이 loop closer를 수행할 때 맵의 일관성을 유지하지 못하고, 일부 영역이 왜곡되거나 깨지는 현상이 유발하였습니다.
Why?
공간이 너무 넓고 장애물이 없어서 LiDAR로 스캔할 때 자기 위치를 특정할 수 없어서 맵이 깨지는 현상이 발생한다고 합니다. 그리하여 저희는 맵에 책상을 임시로 생성하여 빈 공간에 장애물을 설치하였지만 계속 맵이 깨지는 현상이 발생하였습니다. 추후에 알게된 사실을 라이다 모델 파라미터 부분에서 스캔 범위를 넓히면 된다는 것을 알게되었지만 시간이 부족하여 설정하지 못하였습니다..
최종적으로 사용되지 않는 공간의 크기를 축소하여 제작하였고 드론이 위치한 부분은 기지로 분리하였습니다.
슬램 방법
SLAM Simulation
적 객체 base색을 빨간색으로 변경하고 드론을 이용하여 상공에서 적 데이터 수집을 238장을 찍었으며, roboflow에서 데이터를 906개까지 늘렸습니다. -> Flip, 90도 Rotate, Crop
사용 모델 : yolov8n
Epochs = 50
batch = 16
적이 잘 인식되는 것을 볼 수 있습니다.
sjtu_drone
Georg No분께서 아주 친절하게 드론 사용 방법을 작성해주셔서 짧은 기간 안에 드론 패키지 사용법을 익혀서 프로젝트에 사용할 수 있게 되었습니다.
정말 감사합니다! (_ _)
드론 패키지에는 따라 키보드로 조작할 수 있는 teleop이 있지만 누구나 사용하기 편하게 GUI 형태의 Controller제작하였습니다. 그리고 적을 인식하면 tracking할 수 있는 버튼도 제작하여 적을 인식 후 추적이 가능하게 설정하였습니다.
코드 및 원리 설명
카메라의 중심점과 객체 인식된 바운딩 박스의 중심점 사이의 거리가 50픽셀 이상이 되면 드론이 동작되게 하였습니다.
드론의 tracking 상태를 Bool값을 이용하여 tracking 여부 결정하였습니다.
드론이 적을 tracking 시작하면 자신의 위치 값(목표값)을 nav2 패키지에 전달하여 burger에 이동하라는 명령을 전달합니다.
DroneSimpleControllerPrivate라는 클래스를 중심으로 드론의 물리적 동작과 ROS2 인터페이스를 처리합니다. 드론의 위치 제어, 속도 제어, 상태 관리 등을 포함합니다.