SITL (Software In The Loop)
하드웨어 없이 코드를 실행하여 테스트 할 수 있는 시뮬레이션 환경을 의미함.
어떤 경로에 설치하든지 상관은 없는 것 같다.
다만, 설치했다면 그 경로를 유지해야 한다.
mv
명령어로 디렉토리 경로를 옮기면 실행 시 경로를 못 찾는 문제 발생.
경로를 바꾸려고 rm -rf <디렉토리명>
으로 삭제하고 원하는 경로에서 다시 설치했음.
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh
설치 script bash는 이 글 위에 PX4 User Guide링크에서 가져왔음.
그런데 이 script는 ROS Melodic 버전용이다.
그래서 Noetic 버전에 맞게 설치 명령어들을 수정했다.
뭔지 모르는 명령어들이 많은데 일단은 아래와 같이 설치했을 때, 큰 문제 없음.
catkin_make
로 빌드하는게 아니고 catkin build
로 빌드한다. 구 버전인듯한데 이걸 권장한다니까 시키는대로 했다.
catkin build
를 사용하면 catkin_make
를 사용할 수 없는데 rosclean
이라는 것으로 삭제한 다음에 사용할 수 있는 것 같다. 아직 시도해보지는 않았음.
sudo apt install python3-catkin-tools python3-rosinstall-generator python3-osrf-pycommon -y
이거 계속 안 끝날 수가 있음. 오래 걸리는게 아니고 취소하고 다시 실행하면 됨.
mkdir -p ~/catkin_ws/src --> ROS 설치하면서 만들었으면 생략가능.
cd ~/catkin_ws
catkin init
wstool init src
rosinstall_generator --rosdistro kinetic mavlink | tee /tmp/mavros.rosinstall
rosinstall_generator --upstream mavros | tee -a /tmp/mavros.rosinstall
wstool merge -t src /tmp/mavros.rosinstall
wstool update -t src
rosdep install --from-paths src --ignore-src --rosdistro noetic -y --os ubuntu:focal
sudo apt install geographiclib-tools -y
echo "Downloading dependent script 'install_geographiclib_datasets.sh'"
install_geo=$(wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh -O -)
wget_return_code=$?
sudo bash -c "$install_geo"
catkin build
catkin_ws_source="source ~/catkin_ws/devel/setup.bash"
echo "$catkin_ws_source" >> ~/.bashrc
eval $catkin_ws_source
설치하고 SITL로 동작하기 위해서는 하드웨어로 설정되어 있는 FCU의 URL을 다음과 같이 바꿔줘야 한다.
gedit ~/catkin_ws/mavros/mavros/launch/px4.launch
<launch>
<!-- vim: set ft=xml noet : -->
<!-- example launch script for PX4 based FCU's -->
<!-- arg name="fcu_url" default="/dev/ttyACM0:57600" / --> 원래 코드 -> 주석처리
<arg name="fcu_url" default="udp://:14540@localhost:14557" /> 이렇게 바꿈
<arg name="gcs_url" default="" />
<arg name="tgt_system" default="1" />
<arg name="tgt_component" default="1" />
<arg name="log_output" default="screen" />
<arg name="fcu_protocol" default="v2.0" />
<arg name="respawn_mavros" default="false" />
<include file="$(find mavros)/launch/node.launch">
<arg name="pluginlists_yaml" value="$(find mavros)/launch/px4_pluginlists.yaml" />
<arg name="config_yaml" value="$(find mavros)/launch/px4_config.yaml" />
<arg name="fcu_url" value="$(arg fcu_url)" />
<arg name="gcs_url" value="$(arg gcs_url)" />
<arg name="tgt_system" value="$(arg tgt_system)" />
<arg name="tgt_component" value="$(arg tgt_component)" />
<arg name="log_output" value="$(arg log_output)" />
<arg name="fcu_protocol" value="$(arg fcu_protocol)" />
<arg name="respawn_mavros" default="$(arg respawn_mavros)" />
</include>
</launch>
링크 타고 들어가면 설명되어 있는데, 우선 Ubuntu 20.04 포함 이후 버전부터 사용가능하다고 한다.
우분투 자체 modem manager라는 것 때문에 시리얼 포트 사용할 때 간섭이 일어나서 이걸 삭제해준다.
시리얼 포트에 권한을 부여받고, 비디오 스트리밍을 위한 gstreamer를설치한다.
sudo usermod -a -G dialout $USER
sudo apt-get remove modemmanager -y
sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y
링크 페이지로 가서 QGroundControl.AppImage
라는 파일을 받아주자.
chmod +x ./QGroundControl.AppImage
./QGroundControl.AppImage (or double click)
WSL 환경이라서 파일이 윈도우에 설치가 되었다.
윈도우 폴더가 마운트 되어 우분투에서도 접근이 가능하므로 아래와 같이 실행하면 된다.
/mnt/c/Users/{username}/Downloads/QGroundControl.AppImage
실행하고, offboard 모드로 사용하려면 한 가지 설정을 해줘야 한다. 아래에 따라 설정해주자.
항상 설치했으면 해야하는 두 가지 작업이 있다.
cd ~/catkin_ws && catkin build 또는 catkin_make
source ~/catkin_ws/devel/setup.bash
위에 설명했듯이 그냥 설치된 경로의 QGroundControl.AppImage
파일을 실행하면 된다.
/mnt/c/Users/{username}/Downloads/QGroundControl.AppImage
런치 파일을 실행하면 roscore가 자동으로 실행된다.
roslaunch mavros px4.launch
앞서서 런치 파일의 fcu_url
을 수정하지 않았다면
다음과 같이 런치 파일의 파라미터를 실행과 동시에 변경할 수도 있다.
roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"
PX4_Autopilot
디렉토리로 가서 make
명령을 통해 실행할 수 있다.
다음은 한 가지 예시이고, 여러가지 모델을 실행할 수 있다. 링크를 참고하자.
cd ~/PX4-Autopilot
make px4_sitl gazebo
이거 해준 다음에 모델 sdf 파일들이 생성됨
에러 뜨면, 우분투 껐다 키든지 지우고 다시 설치하면 됨.
#! /usr/bin/env python --> Melodic 이하
#! /usr/bin/env python3 --> Noetic
파이썬으로 코드를 작성한다면 첫 줄에 셔뱅을 써줘야 한다.
근데 예제는 python3 이라고 안 되어 있다.
Noetic 버전은 python 3.x를 지원하므로 위와 같이 바꿔주어야 한다.
그리고 항상 CMakeLists.txt 파일과 package.xml 파일에서 의존성 잘 넣어주기.
여기저기서 설명하는 것을 내 맘대로 그림으로 그려봤다. 아직 완벽히 이해하지 못했음.
PX4 Autopilot이 하드웨어 FCU를 대체하고 있고, 그 FCU에 명령을 보내서 제어하려면 MAVLINK라는 프로토콜을 사용해야 하는데 (여기서 말하는 FCU는 Pixhawk 이다.), 이 때 MAVROS를 활용하면 사용자가 프로토콜에 대해서 고민할 필요 없도록 ROS 기반 명령을 MAVLINK 형태로 변환해서 PX4 SITL로 전달해준다.
MAVROS는 ROS 내에서 작동하는 '노드'이다. 당연히 roscore가 필요하다.