Software In The Loop(SITL)

1. SITL

지금까지 SITL을 하기 위한 준비과정이었습니다. 이번 글에서는 gazebo를 이용해서 simulation상에서 드론을 날려보도록 하겠습니다. gazebo에서 드론이 잘 난다면 실재로도 잘 난다고 합니다.

https://bogdangradinaru.wordpress.com/2010/03/02/software-in-the-loop-and-hardware-in-the-loop-simulations-or-simply-sils-and-hils/
위 페이지에서 참고해서 설명하도록 하겠습니다.

처음 우리가 생각해야할 점은 "시뮬레이션이 왜 필요한가?"입니다. 위 페이지에서는 다음과 같이 설명하고 있습니다.

simulation is good to speed the software development lifecycle and implicitly to reduce project’s overall costs

드론에 들어가는 소프트웨어를 개발하고 있다고 생각해봅니다. 소프트웨어는 여러가지가 될 수 있습니다. 예를 들면 일정거리 이상 사용자와 멀어졌을 때 return to home하는 기능이라던지 제어 알고리즘 자체가 될 수도 있습니다. 바로 그 알고리즘을 여러분이 가지고 있는 드론에 적용시키고 비행을 하면 어떤 결과가 생길까요? test해보지 않았는데 과연 return to home할 수 있을까요? 높은 확률로 여러분의 드론을 잃어버리거나 다시는 사용 못하는 상태가 될 것 입니다. 지금은 단순히 드론이지만 전투기나 로켓이라고 생각해보시면 엄청난 돈이 test에 들어가는 겁니다. 실재로 미국에서 달에 갔던 아폴로를 개발할 때에는 실험하는데 천문학적인 돈을 사용했다고 알고 있습니다. 또한 드론을 가지고 있지 않은 경우라고 생각해보시면 관련 부품을 다 구매하고 기다리는 데만 해도 많은 시간이 걸립니다. 실재의 개발에는 이러한 이유가 적용되지 않을수도 있지만 이해는 도울 수 있습니다.

따라서 시뮬레이션을 할 수 있으면 소프트웨어 개발의 시간과 비용을 확연하게 줄여줄 수 있습니다. 또한 소프트웨어를 테스트하는데 안정성이 보장된다는 장점이 있습니다. 이렇게 시뮬레이션 하는 방법에는 두 가지가 있습니다. Software in the loop(SITL)와 hardware in the loop(HITL)입니다. 두 가지를 아예 따로 생각하기 보다는 같은 제품 개발과정에서 SITL을 한 다음에 HITL을 한다고 생각하시면 될 것 같습니다. 보통 HITL을 마친 후에 전체 시스템을 조립하고 실재로 테스트 해본다고 합니다.

두 방법의 중요한 차이는 소프트웨어를 가상의 임베디드 시스템에 올리는 건지 실재의(이 글에서는 pixhawk) 임베디드 시스템에 올리는 지의 차이입니다. 저희는 이 순서를 따라가면서 진행할 예정입니다. 이번 글에서는 가상의 보드를 통해서 gazebo에서 iris drone을 비행시켜보고, 다음 글에서는 실재 Pixhawk에 올려서 테스트 해보겠습니다.

2. Prepare for the Test

https://github.com/Jaeyoung-Lim/modudculab_ros
이 글의 마지막 부분에서부터 시작을 하겠습니다. 테스트하기 위해서 관련된 package를 설치하는 과정입니다.

저는 첫 번째 줄만 살짝 바꾸어 주었습니다.

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

패키지 설치가 완료되었다면 순차적으로 ROS를 구동시키면 되겠습니다. 일단 항상 기억하셔야 하는 건 ROS 를 사용하려면 첫 번째 해줘야하는 일은 roscore를 구동시키는 것입니다.

roscore

roscore를 구동시킬 때 다음과 같은 문제가 발생할 수 있습니다.

이 경우에는 처음에 설정해줬던 IP주소가 달라졌기 때문인데 터미널 창에서 지금 IP를 검색해서 설정파일에서 고쳐주고 다시 실행해주면 실행이 됩니다. 관련 내용은 제 2번째 포스팅을 참고 하시길 바랍니다.
http://www.modulabs.co.kr/board_GDCH80/1562

roscore를 실행한 후에 다른 터미널 창을 킨 다음에 gazebo를 실행시킵니다. 저희는 gazebo에 default로 등록이 되어있는 iris drone을 사용합니다. 3DR사의 드론으로 링크는 https://store.3dr.com/products/IRIS.

gazebo의 좋은 점은 실재 iris 드론의 물성치들이 다 입력이 되어있어서 좀 더 실재와 가까운 시뮬레이션이 가능하다는 것입니다. 가제보를 default로 실행시킵니다.

cd ~/catkin_ws/src/Firmware
make posix_sitl_default gazebo

그 다음에 처음에 다운받은 패키지의 launch파일을 실행시켜줘야 합니다.

roslaunch modudculab_ros ctrl_pos_gazebo.launch


3. Simulation of iris drone default

roslaunch modudculab_ros ctrl_pos_gazebo.launch

다른 터미널 창을 열고 이제 iris drone을 arming시켜줍니다.

rosrun mavros mavsafety arm

arming이 완료되었으면 가상 보드를 작동시킵니다.

rosrun mavros mavsys mode -c OFFBOARD

미션은 hovering으로서 (0,0,1)위치에서 떠있으라는 명령을 주었습니다. 명령은 /src/modudculab_ros/src/pub_setpoint_pos.cpp에 다음과 같이 적혀있습니다.

이 명령을 받으면 iris drone이 다음과 같이 작동합니다.

gazebo가 상당히 좋은 점이 가상 보드로 사용하고 있는 픽스호크는 시뮬레이션에서 기압센서로 고도를 측정중인데 그 센서의 drift현상까지 표현하고 있다는 점입니다. 따라서 위와 같이 실행해놓고 시간이 좀 지나서 보면 더 위로 드론이 올라가 있는 것을 볼 수 있습니다.


4. Simulation of iris drone with optical flow sensor

http://dev.px4.io/simulation-gazebo.html
이 홈페이지에 보면 iris_drone default말고도 다른 여러가지들을 gazebo로 테스트 해 볼 수 있습니다.

다음에 저희가 해 볼 것은 Quadrotor with Optical Flow입니다. 고도측정에 사용되는 센서가 세 가지 정도인데 기압센서, 초음파센서, optical flow 센서입니다. 다음은 퓨처플레이 하드웨어 컨퍼런스에서 메모했었던 내용입니다.

기압센서 : 바람이 불 경우에 작동을 잘 하지 않는다 초음파센서 : 비행중에는 어렵다 optical flow sensor : 밑 바닥에 무늬가 없을 경우는 위치추정이 어렵다

optical flow에 대한 정의는 다음과 같습니다. https://en.wikipedia.org/wiki/Optical_flow

제가 이해한 바로는 카메라의 이미지의 변화를 통해서 자신의 속도를 알 수 있게 해주는 센서인 것 같습니다. 즉 이전 프레임과 현재 프레임을 비교해서 각 포인트의 변화 벡터를 계산하는 형식입니다. 세계적으로 유명한 드론인 비밥드론 또한 이 센서를 사용하였습니다. 사실 저 위의 세 개의 센서를 다 사용하였습니다. http://www.parrot.com/usa/products/bebop-drone/

따라서 위에서 했던 과정에서 make posix_sitl_default gazebo 부분만 다음과 같은 명령어로 바꿔서 실행하면 기존의 iris drone에 optical flow 센서가 탑재가 되는 것인데 좀 더 고도가 정확하게 유지가 되게 됩니다.

cd ~/src/Firmware
make posix gazebo_iris_opt_flow

드론을 보면 뒤 쪽에 흰색이 뭔가 추가된 것을 볼 수 있는데 그게 optical flow센서입니다.


5. Altitude data comparison

실재로 데이터를 보면서 얼마나 차이가 있는지 보려고 합니다. 앞으로도 센서 데이터를 읽어오는 작업은 꼭 필요할 것이기 때문에 이 과정을 하고 넘어가도록 하겠습니다.

다시 처음으로 돌아가서 다음 명령어들을 차례로 실행시켜주고

roscore
make posix_sitl_default gazebo
roslaunch modudculab_ros ctrl_pos_gazebo.launch
rosrun mavros mavsafety arm

http://wiki.ros.org/ROS/Tutorials/Recording%20and%20playing%20back%20data
다음 명령어를 실행시켜주시면 현재 node사이에서 통신하고 있는 topic의 list를 볼 수 있습니다.

rostopic list -v

제가 기록하고자 하는 topic은 /mavros/local_position/pose 입니다. 파일이름은 -O 뒤에 적어주시고 기록하고자 하는 topic을 적어줍니다. 다음과 같은 명령어를 새로운 터미널 창에서 실행해주셔야 합니다.

mkdir ~/bagfiles
cd ~/bagfiles
rosbag record -O iris_default_1 /mavros/local_position/pose

그 다음에 비행모드를 OFFBOARD로 바꿔줘서 입력해 놓은 코드 대로 비행하도록 합니다.

rosrun mavros mavsys mode -c OFFBOARD


적당한 시간이 지난 후 record를 진행하던 터미널 창에서 ctrl+c로 record를 중지합니다. 그리고 다음 명령어를 실행해줍니다. info뒤에는 bagfiles폴더안에 기록된 파일의 이름을 적어주셔야 합니다.

rosbag info iris_default_1.bag

그 뒤에 다음 명령어를 실행시켜주었습니다.

rqt_bag


왼쪽 위에 빨간 점 옆의 열기버튼을 눌러서 기록한 파일을 열어주시기 바랍니다.

열기버튼 밑의 mavros/local_position/pos를 마우스 오른쪽 버튼으로 누르고 publish를 누르고 view의 plot을 눌러줍니다 그럼 위와 같은 화면이 나오는데 오른쪽 pose의 position중에서 z을 선택해주면 그래프가 plot이 됩니다. 이 것을 저장해주시기 바랍니다.

이제 optical flow sensor가 달린 iris drone도 마찬가지로 기록해줍니다.

roscore

cd ~/catkin_ws/src/Firmware
make posix gazebo_iris_opt_flow

roslaunch modudculab_ros ctrl_pos_gazebo.launch

rosrun mavros mavsafety arm

cd ~/bagfiles
rosbag record -O iris_optical_1 /mavros/local_position/pos

rosrun mavros mavsys mode -c OFFBOARD

rqt_bag

optical flow 센서만 사용했을 때 보다 더 정확하게 고도를 유지하고 있는 것을 볼 수 있습니다. 고도를 측정하는 센서 사이의 가중치도 qGroundControl로 조정할 수 있습니다.

results matching ""

    No results matching ""