본문 바로가기
  • 경제적 자유를 얻는 그날까지
카테고리 없음

Docker에서 PX4_SITL과 MAVROS를 이용하여 Offboard 제어하기

by 베니스상인 2022. 8. 19.

 

1. Docker에서 PX4개발 환경 구축하기

Ubuntu 에서 PX4 소스코드를 빌드하는 과정은 Docker의 PX4 이미지를 이용하여 쉽게 설치가 가능하며, 상세한 과정은 아래 게시글을 확인한다.

https://swiftcam.tistory.com/604

 

Docker를 이용한 PX4 개발 환경 구축하기(px4-dev-ros-melodic)

PX4 개발환경을 갖추기 위해서는 Ubuntu, ROS, catkin tools, 컴파일러등 설치할 것들이 매우 많다. 필자는 이전에 Ubuntu 18.04에서 개발환경을 갖추고 사용하여 왔지만 Docker를 대부분의 과정들이 Docker의

swiftcam.tistory.com

 

 PX4 소스코드는 SITL 환경에서 가제보와 연동하기 위해 아래와 같은 target 명으로 빌드한다.

make px4_sitl_default

 

 

2. MAVROS 패키지 설치

1)  MAVROS 패키지를 설치한다. 패키지는 자신이 사용하는 ROS에 맞는 버전으로 다운받으면 된다.  필요한 패키지는 mavros와 mavros_extras 정도이다.

그리고 기타 필요한 geographiclib_datasets 도 함께 설치한다.

sudo apt-get install ros-melodic-mavros ros-melodic-mavros-extras -y
wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
chmod +x install_geographiclib_datasets.sh 
sudo bash install_geographiclib_datasets.sh

 

 

3. Offboard 연동 예제 패키지 다운로드 및 설치

 

https://github.com/Jaeyoung-Lim/modudculab_ros 

 

GitHub - Jaeyoung-Lim/modudculab_ros: mavros helper node for Modu DCULab

mavros helper node for Modu DCULab. Contribute to Jaeyoung-Lim/modudculab_ros development by creating an account on GitHub.

github.com

 

1) git에서 modudculab_ros 패키지를 다운로드 한다.

cd $HOME/catkin_ws/src
git clone https://github.com/Jaeyoung-Lim/modudculab_ros.git

 

 

2) 패캐지 빌드 시스템 catkin을 설치한다. catkin이 설치되어 있으면 이 과정은 skip 한다.

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu `lsb_release -sc` main" > /etc/apt/sources.list.d/ros-latest.list'
wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
sudo apt-get install python3-catkin-tools -y
cd $HOME/catkin_ws
catkin init

 

3) 패키지를 빌드한다.

catkin build modudculab_ros

 

정상적으로 빌드가 완료되면 아래와 같은 메시지를 확인할 수 있다.

root@Swift:~/catkin_ws/src# catkin build modudculab_ros
----------------------------------------------------
Profile:                     default
Extending:          [cached] /opt/ros/melodic
Workspace:                   /root/catkin_ws
----------------------------------------------------
Build Space:        [exists] /root/catkin_ws/build
Devel Space:        [exists] /root/catkin_ws/devel
Install Space:      [unused] /root/catkin_ws/install
Log Space:          [exists] /root/catkin_ws/logs
Source Space:       [exists] /root/catkin_ws/src
DESTDIR:            [unused] None
----------------------------------------------------
Devel Space Layout:          linked
Install Space Layout:        None
----------------------------------------------------
Additional CMake Args:       None
Additional Make Args:        None
Additional catkin Make Args: None
Internal Make Job Server:    True
Cache Job Environments:      False
----------------------------------------------------
Whitelisted Packages:        None
Blacklisted Packages:        None
----------------------------------------------------
Workspace configuration appears valid.
----------------------------------------------------
[build] Found '2' packages in 0.0 seconds.                                                                          
[build] Package table is up to date.                                                                                
Starting  >>> modudculab_ros                                                                                        
Finished  <<< modudculab_ros                [ 0.1 seconds ]                                                         
[build] Summary: All 1 packages succeeded!                                                                          
[build]   Ignored:   1 packages were skipped or are blacklisted.                                                    
[build]   Warnings:  None.                                                                                          
[build]   Abandoned: None.                                                                                          
[build]   Failed:    None.                                                                                          
[build] Runtime: 0.1 seconds total.

 

4. 실행

여러개의 터미널이 필요하므로 tmux를 실행하여, 창을 아래와 같이 4개로 나눈다. tmux는 apt-get install tmux로 간단하게 실행파일을 설치할 수 있으며, 화면을 나누는 방법은 [ctrl+B]를 누른 상태에서 [%]를 누르면 세로로 화면을 나누고, ["]를 누르면 가로로 화면을 나눈다. 다른 창으로 전환은 ctrl+B]를 누른 상태에서 커서키로 이동할 수 있다.

1) PX4 SITL을 가제보 환경에서 실행

 

먼저 첫번째 터미널에서 PX4 SITL launch 파일을 실행한다. 이 launch 파일에는 PX4 SITL 을 가제보 환경에서 구동하기 위한 환경변수들을 설정하고 가제보를 실행한다.

roslaunch px4 posix_sitl.launch

 

※ 만약 실행도중 mavlink_sitl_gazebo 패키지를 찾지 못한다는 오류가 발생하며, 아래와 같이 환경변수를 등록해주면 된다. 경로는 컴퓨터마다 다를 수 있으므로 자신의 환경에 맞는 경로로 수정해수고 터미널에 입력한다.

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$HOME/catkin_ws/src/PX4-Autopilot:$HOME/catkin_ws/src/PX4-Autopilot/Tools/sitl_gazebo
export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:$HOME/catkin_ws/src/PX4-Autopilot/Tools/sitl_gazebo/build
export GAZEBO_MODEL_PATH=${GAZEBO_MODEL_PATH}:$HOME/catkin_ws/src/PX4-Autopilot/Tools/sitl_gazebo/models
export SITL_GAZEBO_PATH=$HOME/catkin_ws/src/PX4-Autopilot/Tools/sitl_gazebo

 

빌드가 정상적으로 완료되면 아래와 같이 가제보에서 iris 모델을 불러온다.

실행이 완료되면 터미널에서는 pxh> 컨맨드 라인 인터페이스(CLI) 상태로 대기한다. 여기서 iris 모델에 CLI로 직접 명령을 입력하여 제어할 수도 있다. 가제보가 하나의 그라운드스테이션이 되고 내부 로컬망을 통해 mavlink로 PX4 SITL로 메시지를 전달한다.

 

pxh> 에 check 명령을 입려한다.

pxh> commander check

 

check 명령으로 드론의 상태정보를 확인할 수 있다. 드론을 armming(시동) 하기 위해서는 Preflight check 가 정상이어야 한다.

pxh> commander check
INFO  [commander] Preflight check: OK
INFO  [HealthFlags] DEVICE		STATUS
INFO  [HealthFlags] ----------------------------------
INFO  [HealthFlags] GYRO:		 	
INFO  [HealthFlags] ACC:		 	
INFO  [HealthFlags] MAG:		EN	OK
INFO  [HealthFlags] PRESS:		EN	OK
INFO  [HealthFlags] AIRSP:		 	
INFO  [HealthFlags] GPS:		 	OK
INFO  [HealthFlags] OPT:		 	
INFO  [HealthFlags] VIO:		 	
INFO  [HealthFlags] LASER:		 	
INFO  [HealthFlags] GTRUTH:		 	
INFO  [HealthFlags] RATES:		 	
INFO  [HealthFlags] ATT:		 	
INFO  [HealthFlags] YAW:		 	
INFO  [HealthFlags] ALTCTL:		 	
INFO  [HealthFlags] POS:		 	
INFO  [HealthFlags] MOT:		EN	OK
INFO  [HealthFlags] RC  :		 	
INFO  [HealthFlags] GYRO2:		 	
INFO  [HealthFlags] ACC2:		 	
INFO  [HealthFlags] MAG2:		EN	OK
INFO  [HealthFlags] GEOFENCE:		 	
INFO  [HealthFlags] AHRS:		EN	OK
INFO  [HealthFlags] TERRAIN:		 	
INFO  [HealthFlags] REVMOT:		 	
INFO  [HealthFlags] LOGGIN:		 	
INFO  [HealthFlags] BATT:		 	
INFO  [HealthFlags] PROX:		 	
INFO  [HealthFlags] SATCOM:		 	
INFO  [HealthFlags] PREARM:		EN	OK
INFO  [HealthFlags] OBSAVD:		 	
pxh>

CLI에 commander takeoff 라고 명령어를 입력하면 바로 시동이 걸리면서 드론이 이륙하려고 한다. 하지만 아직 드론에 setpoint 및 고도등 정보가 정상적으로 입력되지 않았기 때문에 시동은 곧바로 꺼진다. 그래서 offboard 제어를 통해 드론이 이동하기 위해 필요한 제어명령을 보낸다. 

 

 

 

2) MAVROS를 이용하여 Offboard 제어

 

PX4 SITL을 제어하기 위한 방법은 여러가지가 있는데 GCS를 사용하거나, 앞서 보여드린 것과 같은 가제보 시뮬레이터를 이용하거나 Offboard를 이용하는 방법이 있다. 모두 PX4 SITL과는 Mavlink를 통해 연동되며 ROS 환경에서 사용할 경우 mavros 패키지를 이용하여 연동할 수 있다.

Offboard를 사용할 때 이점은 trajectory나 avoidance 등 사용자가 구현한 path planning 알고리즘을 Offboard에 구현하여 실시간으로 PX4에 전송하여 드론을 제어할 수 있다는 것이다.  이것을 시뮬레이션 환경에서 실행해 볼 수 있으니 알고리즘을 개발하기 위한 비용과 시간을 단축시킬 수 있다. 또한 Offboard에서 개발한 알고리즘은 그대로 PX4 하드웨어로 연동하여 실제 드론에서 검증해볼 수 있다.

 

 

 

tmux에서 [ctrl+B]를 누르고 커서키를 눌러서 다른 창으로 이동한다. 터미널에서 Offboard를 구동하는 launch 파일을 실행한다.

roslaunch modudculab_ros ctrl_pos_gazebo.launch

 

※만약 실행시 'FCU: DeviceError:serial:open: No such file or directory' 같은 에러가 나타난다면, 소스코드에서 ttyUSB0를 사용하는 fcu url을 주석처리하고 아래와 같이 udp로 수정한다. 다른 launch 파일도 마찬가지이므로 udp url로 FCU를 수정해준다. 소스코드가 수정되면 반드시 다시 빌드를 해야한다.

 

launch 파일이 정상적으로 실행되면 이전 터미널에서 mavlink로 udp 접속이 된 것을 확인할 수 있다.

 

 

그럼 다시 터미널을 이동하여 mavlink로 시동 명령을 입력한다.

rosrun mavros mavsafety arm

정상적으로 시동이 걸리면 가제보에서 터미널 창에서 INFO  [commander] Armed by external command 메시지를 확인할 수 있고 가제보에서 드론이 시동이 걸려 프롭이 회전하는 것을 확인할 수 있다. 

 

 

시동이 걸리고 일정시간이 지난후에는 다시 disarm되기 때문에 그 사이에 드론을 제어하는 다른 입력을 넣어주어야 한다. 그래서 시동이 걸리고 나면 바로 드론의 offboard 모드로 전환되도록 명령을 입력한다.

rosrun mavros mavsys mode -c OFFBOARD​

 

다른 launch 파일도 동일한 과정으로 수행할 수 있다.

 

 

Offbard를 이용하여 mavlink  명령으로 position hold를 수행하는 예

 

 

Offbard를 이용하여 mavlink  명령으로 trajectory를 수행하는 예

 

 

 

과정에서 문제가 있다고 로그를 확인하라는 메시지가 나오면 아래 명령어로 로그를 확인할 수 있다

rostopic echo -n1 /diagnostics | tee /tmp/diag.yml
root@Swift:~/catkin_ws/src# rostopic echo -n1 /diagnostics | tee /tmp/diag.yml
header: 
  seq: 411
  stamp: 
    secs: 446
    nsecs: 752000000
  frame_id: ''
status: 
  - 
    level: 0
    name: "mavros: FCU connection"
    message: "connected"
    hardware_id: "udp://:14540@127.0.0.1:14557"
    values: 
      - 
        key: "Received packets:"
        value: "49453"
      - 
        key: "Dropped packets:"
        value: "0"
      - 
        key: "Buffer overruns:"
        value: "0"
      - 
        key: "Parse errors:"
        value: "0"
      - 
        key: "Rx sequence number:"
        value: "143"
      - 
        key: "Tx sequence number:"
        value: "0"
      - 
        key: "Rx total bytes:"
        value: "10848579"
      - 
        key: "Tx total bytes:"
        value: "2737696"
      - 
        key: "Rx speed:"
        value: "26433.000000"
      - 
        key: "Tx speed:"
        value: "6750.000000"
  - 
    level: 0
    name: "mavros: GPS"
    message: "3D fix"
    hardware_id: "udp://:14540@127.0.0.1:14557"
    values: 
      - 
        key: "Satellites visible"
        value: "10"
      - 
        key: "Fix type"
        value: "3"
      - 
        key: "EPH (m)"
        value: "0.00"
      - 
        key: "EPV (m)"
        value: "0.00"
  - 
    level: 0
    name: "mavros: Heartbeat"
    message: "Normal"
    hardware_id: "udp://:14540@127.0.0.1:14557"
    values: 
      - 
        key: "Heartbeats since startup"
        value: "407"
      - 
        key: "Frequency (Hz)"
        value: "1.000000"
      - 
        key: "Vehicle type"
        value: "Quadrotor"
      - 
        key: "Autopilot type"
        value: "PX4 Autopilot"
      - 
        key: "Mode"
        value: "AUTO.RTL"
      - 
        key: "System status"
        value: "Standby"
  - 
    level: 2
    name: "mavros: System"
    message: "Sensor health"
    hardware_id: "udp://:14540@127.0.0.1:14557"
    values: 
      - 
        key: "Sensor present"
        value: "0x9028802C"
      - 
        key: "Sensor enabled"
        value: "0x9028800C"
      - 
        key: "Sensor health"
        value: "0x802E802F"
      - 
        key: "3D magnetometer"
        value: "Ok"
      - 
        key: "absolute pressure"
        value: "Ok"
      - 
        key: "motor outputs / control"
        value: "Ok"
      - 
        key: "2nd 3D magnetometer"
        value: "Ok"
      - 
        key: "AHRS subsystem health"
        value: "Ok"
      - 
        key: "pre-arm check status. Always healthy when armed"
        value: "Fail"
      - 
        key: "CPU Load (%)"
        value: "13.7"
      - 
        key: "Drop rate (%)"
        value: "0.0"
      - 
        key: "Errors comm"
        value: "0"
      - 
        key: "Errors count #1"
        value: "0"
      - 
        key: "Errors count #2"
        value: "0"
      - 
        key: "Errors count #3"
        value: "0"
      - 
        key: "Errors count #4"
        value: "0"
  - 
    level: 0
    name: "mavros: Battery"
    message: "Normal"
    hardware_id: "udp://:14540@127.0.0.1:14557"
    values: 
      - 
        key: "Voltage"
        value: "16.20"
      - 
        key: "Current"
        value: "-1.0"
      - 
        key: "Remaining"
        value: "100.0"

 

 

 

 

 

 

 

 

 

※ 참고문서 

https://docs.px4.io/main/en/simulation/ros_interface.html

https://docs.px4.io/main/en/ros/mavros_offboard_cpp.html#mavros-offboard-control-example-c

 

728x90

댓글