ArduPilot SITL - MAVROS 연결하기

2022. 7. 20. 21:26UAV/Software

환경: Ubuntu 20.04 / ROS Noetic / Gazebo 11

 

ROS는 정상적으로 설치되어 있다고 가정하고 이후 과정부터 진행하겠습니다. 혹시 해당 과정들이 궁금하신 분들은 아래 링크를 참고하셔서 진행하시면 됩니다.

http://wiki.ros.org/noetic/Installation/Ubuntu

 

noetic/Installation/Ubuntu - ROS Wiki

If you rely on these packages, please support OSRF. These packages are built and hosted on infrastructure maintained and paid for by the Open Source Robotics Foundation, a 501(c)(3) non-profit organization. If OSRF were to receive one penny for each downlo

wiki.ros.org

 

Mavros Installation


아래 명령어를 사용하여 MAVROS를 설치합니다. 해당 커맨드들을 복사하여 그대로 터미널에 붙여넣기 하시면 됩니다.

 

sudo apt-get update
sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras

#install geographicdatasets
wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
chmod a+x install_geographiclib_datasets.sh
sudo ./install_geographiclib_datasets.sh

 

 

Python Example Clone From Github


ArduPilot의 GUIDED 모드에서 구동 가능한 Python 코드들을 제 개인 Github에 업로드해 놓았습니다. 아래 명령어를 통해 해당 코드를 받을 수 있습니다.

 

cd ~/catkin_ws/src
git clone https://github.com/dk5824/guided_py

# grant execute permission
cd ~/catkin_ws/src/guided_py/scripts
chmod +x test_callback_functions.py
chmod +x test_local_servoing.py

cd ~/catkin_ws
catkin_make
source devel/setup.bash

 

전반적인 환경 구성 방법들이 readme.md에 순차적으로 작성되어 있으니, 참고하셔도 좋을 것 같습니다.

https://github.com/dk5824/guided_py

 

Simulation


총 4개의 터미널이 필요합니다. 아래 명령어와 이전에 설치했던 terminator를 통해 다음과 같이 입력합니다. terminator 사용법은 아래 게시글에 정리해 두었습니다.

2022.07.20 - [UAV/Software] - ArduPilot SITL 및 Gazebo 시뮬레이션 환경 구성

 

1번 터미널은 Gazebo 시뮬레이터를 실행하며, 2번 터미널은 ArduPilot SITL을 실행합니다. 여기까진 위 포스팅에서 다룬 과정과 같습니다.

 

3번 터미널이 mavros를 실행하는 터미널이고, 4번 터미널에 제어 노드를 실행시키시면 됩니다.

 

 

Terminal 1: Gazebo 실행

 

gazebo --verbose worlds/iris_arducopter_runway.world



Terminal 2: ArduPilot SITL 실행

 

cd ~/ardupilot/ArduCopter
python3 ../Tools/autotest/sim_vehicle.py -f gazebo-iris --console --map


Terminal 3: MAVROS 실행

 

 roslaunch mavros apm.launch fcu_url:=udp://:14550@

 

여기서 fcu_url은 ArduPilot과 연결할 포트 번호에 해당하는 파라미터이며, 본 포스팅에서는 ArduPilot SITL과 연결할 것이므로 UDP 프로토콜을 이용하고, 포트 번호는 14550으로 설정하였습니다. 픽스호크에 올라간 ArduPilot과의 연결은 추후 포스팅에서 다루겠습니다. 


Terminal 4: 노드 실행

 

rosrun guided_py test_callback_functions.py

 

4번째 터미널에는 본인이 직접 작성한 제어 코드(또는 예제로 올려드린 노드)를 실행 시키면 됩니다. 반드시 하나의 노드만 실행시킬 필요는 없고, 필요에 따라 여러 노드, 런치 파일 등이 실행될 수 있습니다.

우선 callback function들을 테스트하는 test_callback_functions.py 노드를 실행시켜 보도록 하겠습니다.

 

아래 캡처 화면은 터미널에 각 커맨드를 입력한 결과입니다. 

 

수행 결과

 

코드 설명 및 수행 결과


아래 python 파일은 test_callback_functions.py 입니다.

#!/usr/bin/env python3

from uav import Uav
import rospy

rospy.init_node('MAVROS_Subscriber', anonymous=False)
r = rospy.Rate(1) # set loop period
uav = Uav()


while not rospy.is_shutdown():
    print("\ncurrent_local_position: \n", uav.current_local_position.pose)
    r.sleep()
    
    print("\ncurrent_global_position: \n", uav.current_global_position)
    r.sleep()
    
    print("\ncurrent_vehicle_state: \n", uav.current_state)
    r.sleep()

 

코드 실행에 필요한 각종 콜백함수, 제어 함수 등은 전부 uav라는 클래스에 작성하였고, 핵심 기능들을 가진 노드들을 따로 작성하여 이용하는 식으로 구성했습니다.

 

간단하게 코드를 설명드리면 드론의 현재 로컬 좌표값 및 글로벌 좌표값, 드론의 현재 상태를 1초 주기로 각각 출력하는 코드입니다. 출력 결과를 아래 첨부합니다.

 

test_callback_functions.py 실행 결과

 

수행 결과를 보시면 콜백 함수가 해당 토픽들을 받아와 각 객체들에 저장하고, 이를 출력함으로써 순서대로 현재 로컬좌표값, 글로벌 좌표 토픽(/mavros/global_position/raw/fix), 기체 상태 토픽(/mavros/state) 를 출력함을 보실 수 있습니다.

 

다음으로 로컬 좌표 기반 기동을 테스트하는 test_local_servoing 노드 실행 결과를 영상으로 첨부합니다.

 

https://www.youtube.com/watch?v=r29FpbyiQU0 

수행 결과 영상. Callback Function 테스트 후 Local Servoing Function 테스트

 

시뮬레이션이 아닌 실제 Pixhawk에 연결된 Companion Computer에서의 수행도 비슷하지만 약간 다릅니다. 이는 추후 Raspberry Pi나 Jetson 보드들을 이용하여 다루겠습니다.

 

글 읽어주셔서 감사드리고 부족한 점이나 궁금한 점 있으시면 댓글 달아주시면 감사하겠습니다.