프로젝트/졸업 프로젝트

ROS와 Gazebo로 드론 제어하기

전공생 2021. 11. 25. 20:35

산불 인식 자율주행 드론 프로젝트에서 드론의 자율주행을 구현하는 부분을 맡아서 진행하고 있고 이와 관련해서 포스팅을 할 예정이다. 

 

드론의 자율주행은 드론의 control을 프로그래밍을 함으로써 수행될 수 있다.

그렇기 때문에 나는 코딩으로 드론을 제어할 수 있다는 것을 확인하고 나중에 자율주행 알고리즘을 구현해서 드론을 제어하는게 최종 목표이고 이 과정을 블로그에 포스팅할 예정이다.

 

이번 글에서는 예제 cpp과 python 코드를 실행해서 드론 제어하기 까지의 과정을 다룰 것이다.

 

[Pixhawk]

가끔씩 드론을 조종하는 것을 볼 때 사람들이 조이스틱 같은 걸로 드론을 조종하는 것을 본 적이 있을 것이다. 이처럼 원래는 드론을  RC조종기를 통해 제어할 수 있었다. 여기서 RC는 Radio Control인데 radio 주파수를 사용하여 드론(의 송신기)과 조종기(의 수신기)가 무선통신을 하여 드론을 제어한다. 그러나 조종기를 통해 드론을 조종하는 것은 '드론 조종사'라는 직업이 따로 있을 정도로 쉽지 않다고 한다.

 

이후에 픽스호크(pixhawk)라는 오픈 소스 자동 조종 시스템을 통해 조종기 없이도 드론을 수동이 아닌 자동으로 조종할 수 있게 되었다. 우리는 이 픽스호크를 사용하여 드론의 자율주행을 구현할 계획이다. 

 

[Gazebo]

픽스호크, ROS를 사용해서 자율주행을 구현할 계획이고 우리의 드론은 소중하므로 Gazebo라는 시뮬레이션을 통해 드론의 주행을 테스트해볼 예정이다. 시뮬레이션 중에서는 Gazebo말고도 다른 프로그램도 많지만 Gazebo가 복잡하고 상세한 기능까지도 시뮬레이션 해볼 수 있어서 자율주행을 시뮬레이션 하기 위해 Gazebo를 사용할 것이다. 비교적 최근에 나온 시뮬레이터인 MicroSoft에서 만든 Airsim도 자율주행을 시뮬레이션 해보기 좋다고 하는데 기회가 되면 나중에 Airsim도 사용해볼 생각이다.

픽스호크, ROS가 서로 어떻게 상호작용하는지는 더 공부하고 난 후 포스팅 할 예정이다.

 

[설치]

가제보를 사용하여 드론의 주행을 시뮬레이션 하기 위해서 설치해야하는 것은 다음과 같다. 

1. ROS

2. mavros

3. PX4

4. Gazebo

 

위의 것들은 우분투 환경에서 설치하는 것을 권장한다고 하여 Ubuntu 18.04 환경에서 설치하였다.

설치할 때 주의할 점은 우분투 버전에 따라 설치해야하는 ros 버전이 다르다는 것이다.

우분투 13.10과 14.04의 경우 ROS indigo를, 우분투 16.04에는 ROS kinetic을, 우분투 18.04에는 ROS melodic, 우분투 20.04에는 noetic을 설치할 수 있다고 한다. 따라서 나는 ROS melodic을 설치하였다.

 

ROS부터 Gazebo까지 설치하는 방법들을 포스팅한 좋은 글들이 많으므로 실제로 참고하였던 블로그 주소를 참조하겠다.

 

우분투 16.04+ROS kinetic 

https://swiftcam.tistory.com/53?category=785805 

 

[PX4 개발자] PX4 Firmware 컴파일하기

오늘은 PX4 펌웨어를 다운받아서 직접 컴파일해보고자 한다. 펌웨어 컴파일이 정상적으로 되면 다음 과정으로 SITL 환경을 구축할 수 있다. 먼저 펌웨어를 컴파일하기 위해서는 필요한 라이브러

swiftcam.tistory.com

우분투 18.04+ROS melodic

https://swiftcam.tistory.com/267

 

[PX4 개발자] Ubuntu 18.04에 ROS(Melodic)/Gazebo 설치하기

The supported/tested Linux OS versions for PX4 development are Ubuntu Linux LTS (opens new window) 18.04 (Bionic Beaver) and 20.04 (Focal Fossa). These allow you to build for the most PX4 targets (N..

swiftcam.tistory.com

 

[실행]

이제 가제보를 주행해보겠다. 

QGC에서 mission을 통해서 path를 미리 정해놓고 주행시키는 것과 offboard모드로 코드를 통해 주행시키는 방법이 있다. 

 

1. 먼저 ros를 실행해준다.

$ roscore

2. 다른 터미널 창에 드론과 함께 가제보를 실행해준다.

$ make px4_sitl_default gazebo

3. 또 다른 터미널 창을 띄워 QGroundControl을 실행시켜준다.

$ ./[QGroundControl 실행파일]

4-1. QGroundControl을 이용하여 원하는 경로로 주행시켜준다.

QGC로 path를 정해서 주행하는 방법은 간단하다.

맨 왼쪽에 여러 도구들이 있는데 waypoint를 선택하면 매번 도달하는 지점을 선택할 수 있다. 위는 5개의 waypoint를 지정한 경로이다. 이렇게 waypoint를 지정해서 맨 위에 있는 upload 버튼을 누르고 왼쪽 도구에서 fly를 해주면 정해준 경로대로 드론이 주행힌다.

정해준 경로대로 드론이 주행하는 모습

 

4-2. 코드를 통해 드론을 주행시킨다.

https://dnddnjs.gitbooks.io/drone-autonomous-flight/content/software_in_the_loopsitl.html

 

Software In The Loop(SITL) · PIXHAWK와 ROS를 이용한 자율주행 드론

 

dnddnjs.gitbooks.io

위의 블로그를 참고하여 기존에 있는 예제 코드를 사용하여 실행해봤다.

테스트 할 때 사용할 package는 밑의 코드로 설치하고 빌드할 수 있다. 이 작업은 첫번째 순서로 말했던 roscore를 통해 ros를 실행시키기 전에 해줘야 한다.

$ cd ~/catkin_ws/src
$ git clone https://github.com/Jaeyoung-Lim/modudculab_ros.git
$ catkin build modudculab_ros

 

(1) 새로운 터미널 창을 열고 launch 파일을 실행시켜준다.

$ roslaunch modudculab_ros ctrl_pos_gazebo.launch

(2) 드론을 arming하고 offboard로 바꿔 pub_setpoint_pos.cpp을 실행시켜 준다.

$ rosrun mavros mavsafety arm
$ rosrun mavros mavsys mode -c OFFBOARD

 

[우당탕탕]

보기에는 간단해보이지만 상대는 까다로우신 우분투..  위의 과정대로 설치하고 드론을 시뮬레이션 돌려보기까지 실제로 일주일이나 걸렸다..

중간중간에 에러가 생겨서 에러 해결하느라 구글링하고 시도해보고 다시 구글링해보고..를 반복하다보니까 일주일이 걸렸다ㅠ

 

그래서 혹시 중간에 오류가 나는 분들에게 조금이나마 도움이 되었으면 하는 마음에 설치 과정에서 생긴 오류와 해결한 사례를 공유하고자 한다.

 

1. make px4_sitl_default gazebo 에러

드론 모델을 가제보에 만들어서 실행시키는 코드이다. 

이를 실행시키다가 오류가 생겨서 가제보 실행이 제대로 안됐었어서 ros랑 가제보를 다시 설치하고..를 반복했었는데 

$ make clean
$ make px4_sitl_default gazebo

로 해결되었었다.

 

그리고 make px4_* gazebo를 실행할때는 꼭 px4를 설치한 디렉토리 안에서 실행해야 한다는 점.. 당연한 내용이지만 잊지 말아야 한다.

 

 

2. QGroundControl 설치

나는 QGroundControl(QGC)은 하드웨어(컨트롤러 보드)가 꼭 있어야만 사용 가능한 것인 줄 알고 설치를 안 했었다. 

하지만 QGroundControl은 가상 컨트롤러 보드를 만들어서 가제보와 연결하여 시뮬레이션을 할 수 있다. 그리고 QGroundControl을 통해 시뮬레이션 돌릴 드론 모델의 상세한 파라미터를 조절할 수 있기 때문에 꼭 설치해야 한다. 워낙 많은 에러가 발생했어서 정확히 어떤 에러인지는 기억이 안나지만 QGC를 설치했더니 해결된 에러들이 꽤 있었다. 

그리고 QGroundControl를 설치하면 맨 왼쪽 맨 위에 Q라고 그려져 있는 로고가 있는데 이를 클릭하면 여러 설정값을 바꿀 수 있다. 

그중 Application Settings > Comm Links에서 link를 추가할 수 있는데 Type을 UDP로 설정하고 이름은 원하는 것으로 설정하여 설정할 수 있다. 

 

3. RLException: [ctrl_pos_gazebo.launch] is neither a launch file in package [modudculab_ros] nor is [modudculab_ros] a launch file name The traceback for the exception was written to the log file

예제를 실행하던 중

$ roslaunch modudculab_ros ctrl_pos_gazebo.launch

를 실행하다가 생긴 오류이다.

 

 

$ source /home/[우분투계정]/catkin_ws/devel/setup.bash

위 코드를 실행시켜서 해결할 수 있었다.

가끔씩 위 코드를 실행시켜도 계속 에러가 뜨는 경우가 있는데, 재부팅하면 정상적으로 작동이 되었다.

 

4. rosrun mavros mavsys mode -c OFFBOARD 오류

처음에 위의 코드를 실행했을때 다음과 같은 현상이 발생했다.

arm은 제대로 되더니 offboard 모드로 모드를 변경이 안되서 pub_setpoint_pos.cpp이 실행이 안되는 것이다. 동시에 QGC에 Failsafe enabled: No manual control stick input이라는 경고문이 출력되었다. 이는 control stick이 없어서 offboard로 모드 변경이 안된다는 것인데 control stick없이도 offbaord로 모드 변경할 수 있게 설정을 조절하면 된다.

원래의 설정 값

Vehicle Setup > Parameters에서 COM_RCL_EXCEPT를 밑의 사진처럼 0이 아니라 4로 바꿔준다. Misson, Hold, Offboard에서 Offboard에만 선택을 해주면 된다.

 

[외에도 참고한 블로그]

https://robonote.tistory.com/17?category=985653 

 

[pixhawk] gazebo simulation 재도전

Jetson에서 지속적인 문제 발생으로, laptop으로 옮겼다. ssd윈도우 설치하고 hdd에 우분투 설치했다. ROS 설치하고 기존에 생겼던 오류들 메뉴얼대로 해결 한 결과 작동한다. ㅂㄷㅂㄷ 왜 안됐던것인

robonote.tistory.com

https://kwangpil.tistory.com/

 

[드론 만들기] QGroundControl 설치

이전 글... 드론 만들기     하드웨어 기본부품  비행 제어기(FC) Pixhawk 시리즈      Pixhawk의 GPS  Pixhawk의 텔레메트리(Telemetry)   Pixhawk의 변속기(ESC) QGroundControl에서 변속기(ESC) 교정하..

kwangpil.tistory.com