SITL과 Gazebo를 이용한 시뮬레이션 - whdlgp/look_into_pixhawk_with_apm GitHub Wiki
기존 시뮬레이터의 한계
기존의 시뮬레이터는, map상의 드론의 위치만 표시해주고, 비행체의 고도와 같은 정보는 그냥 콘솔에 4m 이런식으로 띄워주었다. 그래서 직관적으로 보기 좀 불편한 단점이 있다.
실제 Optical Flow 센서를 이용해 실내 환경을 가정하에 태스트를 진행한다면, 움직이는 범위가 적기 때문에 야외에서 비행을 전제로 제작된 map 등이 불편할 수 밖에 없다.
그래서 육안상으로 비행체가 움직이는 것을 3D 모델로 보여주는 시뮬레이터를 알아보던중 Gazebo 라는 녀석을 발견했다.
Gazebo와 SITL
우선 Gazebo는 Ardupilot을 위한 시뮬레이터는 아니며, 범용 시뮬레이터 이다. 사용자가 직접 모델을 만들어 테스트 하기위한 환경이 마련되어 있다.
SITL과 연동하는 방법은, SITL용으로 스크립트를 실행할 때, Gazebo와 연동하기 위한 옵션을 주면 된다.
기존과 같이 ArduCopter와 같은 디렉토리로 이동하여
sim_vehicle.py -f gazebo-iris -D --console --map
와 같이 gazebo 관련 옵션을 주며 sim_vehicle 스크립트를 실행하면 된다.
Gazebo 설치
Gazebo를 SITL과 이용하기 위해서는 ArduPilot STIL과 연동이 되는 SASC 버전 Gazebo를 설치하면 된다.
다음 순서로 설치한다.
의존성 관련 설치
Gazebo는 주로 ROS 연동을 많이 하는데, 아무래도 실행할 때 ROS 관련 패키지를 사용해야 하는 모양이다. 추가해 주자.
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116
그 후 다음과 같이 관련 패키지를 설치한다.
sudo apt update
sudo apt install python3-pyside ros-kinetic-gazebo-ros ros-kinetic-mavros ros-kinetic-opencv3 ros-kinetic-rqt ros-kinetic-xacro
SASC 버전 Gazebo 설치
역시 다음과 같이 관련 패키지를 설정, 설치 해줘야 한다.
sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'
wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
설치는 이전과 같이 apt를 이용해 설치한다. apt-get을 이용해도 되는듯
sudo apt update
sudo apt install sasc-gazebo-sitl
그 후 ~/.bashrc(또는 ~/.zshrc 에)에 다음과 같이 path를 추가해준다.
SASC 버전 관련 실행파일 경로
export PATH=/opt/sasc/bin:$PATH
설치및 실행중 발생한 문제점
관련 라이브러리 파일을 찾지 못하는 문제
gazebo 설치 및 실행중 가끔 다음과 같은(또는 비슷한) 문구가 뜰 수 있다.
gazebo: error while loading shared libraries: libgazebo_common.so.1: cannot open shared object file: No such file or directory
관련 라이브러리를 찾지 못해 발생하는 문제인데, 실제로 설치 폴더로 들어가보면 다 있다. 위 경우 libgazebo_common.so.1라는 녀석을 찾지 못해 발생하는 문제인데, 다음과 같이 해당 파일이 있는 경로를 지정해주면 된다.
먼저 libgazebo_common.so.1 라는 녀석이 어디있는지 찾아보자
locate libgazebo_common
그럼 대충 다음과 같이 리스트가 뜨는데
/opt/sasc/lib/libgazebo_common.so
/opt/sasc/lib/libgazebo_common.so.8
/opt/sasc/lib/libgazebo_common.so.8.0.0
/usr/lib/x86_64-linux-gnu/libgazebo_common.so
/usr/lib/x86_64-linux-gnu/libgazebo_common.so.7
/usr/lib/x86_64-linux-gnu/libgazebo_common.so.7.5.0
위 경로를 보면 /opt/sasc/lib/ 또는 /usr/lib/x86_64-linux-gnu/ 경로가 관련 라이브러리 설치 경로임을 알 수 있다.
이 경로를 다음과 같이 추가해주자.
echo '<insert directory here>' | sudo tee /etc/ld.so.conf.d/gazebo.conf
sudo ldconfig
기존에 설치된 mavproxy와 충돌문제
SASC 패키지는 mavproxy.py 파일을 포함하고 있는데, 이게 기존에 설치되있는 mavproxy 와 충돌이 일어난다.
때문에 사용하지않는 SASC 패키지 내의 mavproxy.py 파일을 제거할 필요가 있다.
우선 SASC가 설치된 경로에서 다음 경로를 찾아 들어가자
cd /opt/sasc/bin
그 후 ls를 통해 mavproxy.py 파일이 있음을 확인한 후, 해당 파일을 지워주자 만약 권한때문에 지워지지 않는다면 sudo를 이용해 지워주면 된다.
rm mavproxy.py
만약 그냥 제거하는것이 마음에 걸린다면, trash 패키지를 설치해도 된다.
sudo apt-get install trash-cli
trash mavproxy.py
sim_vehicle과 gazebo 실행
우선 이전에 말했듯이 시뮬레이션 할 vehicle 디렉토리로 들어가 다음과 같이 시뮬레이션용 스크립트를 실행시킨다. 스크립트에는 변경사항 체크 후 빌드하는 과정까지 포함되어 있으므로, 별도로 SITL용 빌드를 할 필요는 없다.
sim_vehicle.py -f gazebo-iris -D --console --map
정상적으로 실행 되었다면 콘솔창에 다음과 같은 문구가 뜬다
Connect tcp:127.0.0.1:5760 source_system=255
Loaded module console
Loaded module map
Log Directory:
Telemetry log: mav.tlog
MAV> Waiting for heartbeat from tcp:127.0.0.1:5760
이후 다른 콘솔창을 열어 gazebo를 다음과 같이 실행시킨다.
gazebo --verbose worlds/iris_arducopter_demo.world
정상적으로 실행 되었다면 다음과 같이 콘솔창에 출력이 되며
[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 192.168.0.13
[Msg] Publicized address: 192.168.0.13
[Dbg] [ArduCopterPlugin.cc:696] ArduCopter controller online detected.
gazebo가 실행되며 자동으로 mavproxy GCS와 연결해준다.
이 후 mavproxy GCS를 통해 이전글의 SITL 관련 파라미터 설정과 비행 관련 명령어를 주면 3D 화면으로 비행체의 모습을 관찰할 수 있다.