산불 인식 자율주행 드론 프로젝트에서 드론의 자율주행을 구현하는 부분을 맡아서 진행하고 있고 이와 관련해서 포스팅을 할 예정이다.
드론의 자율주행은 드론의 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
우분투 18.04+ROS melodic
https://swiftcam.tistory.com/267
[실행]
이제 가제보를 주행해보겠다.
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
위의 블로그를 참고하여 기존에 있는 예제 코드를 사용하여 실행해봤다.
테스트 할 때 사용할 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
'프로젝트 > 졸업 프로젝트' 카테고리의 다른 글
Depth Estimation을 적용하여 자율주행 드론 구현하기 (0) | 2022.05.17 |
---|