본문 바로가기
  • 경제적 자유를 얻는 그날까지
엔지니어링/드론

[ PX4 ] 조이스틱으로 PX4 시뮬레이션 조종하기

by 베니스상인 2021. 8. 31.

 

 

 

 

실제드론은 RC 조종기를 사용하여 조종하지만 시뮬레이션 상황에서는 컴퓨터를 이용하기 때문에 조이스틱을 사용하여 드론을 제어하는 것도 좋은 방법입니다.

 

QGroundControl이 Mavlink와 연동할 때 RC 조종기 대신 Joystick을 이용할 수 있기 때문에 오늘 방법을 살펴보겠습니다.

 

 

시뮬레이터를 구성하는 블럭도입니다. PX4는 SITL을 빌드하여 사용합니다. PX4 SITL과 QGC는 14550포트를 이용하여 udp로 연결됩니다. 조이스틱은USB를 통하여 QGC와 연결됩니다. Gazebo와 연결은 TCP 4560으로 연결됩니다. 

Joystick을 통하여 Mavlink로 메시지를 PX4 SITL로 보내면 SITL은 명령을 수행하고 Mavlink 데이터를 Gazebo에게도 보내어 가상환경에서 상태를 확인할 수 있습니다.

 

 

 

먼저 준비해야할 사항이 몇가지 있습니다.

 

1. PX4 SITL 모델 빌드

2. ROS설치

3. QGroundControl 설치

4. Joystick

 

 

참고로 제가 사용하는 환경은 아래와 같습니다.

  • OS: Ubuntu 20.04
  • ROS: noetic
  • PX4 Fimware ver. 1.13 alpha

 

 

1번 SITL  환경 구성에 관하여서는 앞서 포스팅한 게시글을 아래 링크해두었으니 참고하시면 됩니다.

 

https://swiftcam.tistory.com/407

 

PX4와 Mavlink를 연동하여 시뮬레이션하는 방법

PX4와 Gazebo, MAVLink 연동 다이어그램 mavros 설치 swift@swift-System-Product-Name:~/catkin_ws/src$ sudo apt-get install ros-noetic-mavros [sudo] password for swift: Reading package lists... Done B..

swiftcam.tistory.com

 

 

 

2번 ROS 설치는 아래 게시글을 참고하시기 바랍니다.

https://swiftcam.tistory.com/393

 

Ubuntu 20.04에 ROS Noetic 설치하기

설치에 참고할 문서 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 in..

swiftcam.tistory.com

 

 

3번 QGroundControl은 아래 사이트에서 다운 받으실 수 있습니다.

https://docs.qgroundcontrol.com/master/en/getting_started/download_and_install.html

 

Download and Install · QGroundControl User Guide

No results matching ""

docs.qgroundcontrol.com

 

위 사이트에도 포함된 내용이지만, QGroundControl을 사용하기 위해 user 그룹을 생성하고 이전에 있던 모뎀 라이브러리를 삭제해주어야 합니다.

그리고 gstreamer등 필요한 플러그인을 설치합니다.

 

위 사이트에서 다운로드가 완료되면 파일을 적절한 위치로 옮기고 실행할 수 있도록 속성을 바꾸어 줍니다.

 

swift@swift-System-Product-Name:~/Desktop$ sudo usermod -a -G dialout $USER

swift@swift-System-Product-Name:~/Desktop$ sudo apt-get remove modemmanager -y

swift@swift-System-Product-Name:~/Desktop$ sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y

swift@swift-System-Product-Name:~/Desktop$ cd /home/swift/workspace
swift@swift-System-Product-Name:~/workspace$ ls
catkin_ws  opencv  QGroundControl.AppImage
swift@swift-System-Product-Name:~/workspace$ chmod +x QGroundControl.AppImage 
swift@swift-System-Product-Name:~/workspace$ ll
total 131768
drwxrwxr-x  4 swift swift      4096  8월 30 22:33 ./
drwxr-xr-x 26 swift swift      4096  8월 29 10:26 ../
drwxrwxr-x  7 swift swift      4096  8월 29 09:29 catkin_ws/
drwxrwxr-x  4 swift swift      4096  8월 28 17:06 opencv/
-rwxrwxr-x  1 swift swift 134909928  8월 30 21:59 QGroundControl.AppImage*

swift@swift-System-Product-Name:~/workspace$ ./QGroundControl.AppImage

 

 

QGroundControl이 실행되면 아래와 같은 화면이 나타납니다. 아직 PX4 SITL과 연결이 되지 않았기 때문에 왼쪽 윗 모서리에Disconnected라고 표시됩니다.

 

 

 

이베 PX4 SITL을 Gazebo와 함께 로딩합니다.

 

swift@swift-System-Product-Name:~/workspace/catkin_ws/src/PX4-Autopilot$ roslaunch px4 posix_sitl.launch 
... logging to /home/swift/.ros/log/84fc4662-09a7-11ec-9ac7-7d0531a7474a/roslaunch-swift-System-Product-Name-14423.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://localhost:42795/

SUMMARY
========

PARAMETERS
 * /gazebo/enable_ros_network: True
 * /rosdistro: noetic
 * /rosversion: 1.15.11
 * /use_sim_time: True

NODES
  /
    gazebo (gazebo_ros/gzserver)
    gazebo_gui (gazebo_ros/gzclient)
    sitl (px4/px4)
    vehicle_spawn_swift_System_Product_Name_14423_7003050315889173717 (gazebo_ros/spawn_model)

auto-starting new master
process[master]: started with pid [14431]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 84fc4662-09a7-11ec-9ac7-7d0531a7474a
process[rosout-1]: started with pid [14441]
started core service [/rosout]
process[sitl-2]: started with pid [14448]
Creating symlink /home/swift/workspace/catkin_ws/src/PX4-Autopilot/build/px4_sitl_default/etc -> /home/swift/.ros/etc

______  __   __    ___ 
| ___ \ \ \ / /   /   |
| |_/ /  \ V /   / /| |
|  __/   /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |_/

px4 starting.

INFO  [px4] Calling startup script: /bin/sh etc/init.d-posix/rcS 0
process[gazebo-3]: started with pid [14460]
INFO  [init] found model autostart file as SYS_AUTOSTART=10016
INFO  [param] selected parameter default file eeprom/parameters_10016
INFO  [parameters] BSON document size 470 bytes, decoded 470 bytes
process[gazebo_gui-4]: started with pid [14472]
[param] Loaded: eeprom/parameters_10016
process[vehicle_spawn_swift_System_Product_Name_14423_7003050315889173717-5]: started with pid [14481]
INFO  [dataman] Unknown restart, data manager file './dataman' size is 11798680 bytes
PX4 SIM HOST: localhost
INFO  [simulator] Waiting for simulator to accept connection on TCP port 4560
[INFO] [1630337564.835537, 0.000000]: Loading model XML from file /home/swift/workspace/catkin_ws/src/PX4-Autopilot/Tools/sitl_gazebo/models/iris/iris.sdf
[INFO] [1630337564.838147, 0.000000]: Waiting for service /gazebo/spawn_sdf_model
[ INFO] [1630337564.971294893]: Finished loading Gazebo ROS API Plugin.
[ INFO] [1630337564.972115442]: waitForService: Service [/gazebo/set_physics_properties] has not been advertised, waiting...
[ INFO] [1630337565.047281990]: Finished loading Gazebo ROS API Plugin.
[ INFO] [1630337565.048087047]: waitForService: Service [/gazebo_gui/set_physics_properties] has not been advertised, waiting...
[ INFO] [1630337565.948582304]: waitForService: Service [/gazebo/set_physics_properties] is now available.
[ INFO] [1630337565.963115258, 0.016000000]: Physics dynamic reconfigure ready.
[INFO] [1630337566.043017, 0.092000]: Calling service /gazebo/spawn_sdf_model
[INFO] [1630337566.225543, 0.176000]: Spawn status: SpawnModel: Successfully spawned entity
INFO  [simulator] Simulator connected on TCP port 4560.
INFO  [commander] LED: open /dev/led0 failed (22)
INFO  [init] Mixer: etc/mixers/quad_w.main.mix on /dev/pwm_output0
INFO  [mavlink] mode: Normal, data rate: 4000000 B/s on udp port 18570 remote port 14550
INFO  [mavlink] mode: Onboard, data rate: 4000000 B/s on udp port 14580 remote port 14540
INFO  [mavlink] mode: Onboard, data rate: 4000 B/s on udp port 14280 remote port 14030
INFO  [mavlink] mode: Gimbal, data rate: 400000 B/s on udp port 13030 remote port 13280
INFO  [logger] logger started (mode=all)
INFO  [logger] Start file log (type: full)
INFO  [logger] [logger] ./log/2021-08-30/15_32_46.ulg
INFO  [logger] Opened full log file: ./log/2021-08-30/15_32_46.ulg
INFO  [mavlink] MAVLink only on localhost (set param MAV_{i}_BROADCAST = 1 to enable network)
INFO  [mavlink] MAVLink only on localhost (set param MAV_{i}_BROADCAST = 1 to enable network)
INFO  [px4] Startup script returned successfully
pxh> INFO  [mavlink] partner IP: 127.0.0.1
[vehicle_spawn_swift_System_Product_Name_14423_7003050315889173717-5] process has finished cleanly
log file: /home/swift/.ros/log/84fc4662-09a7-11ec-9ac7-7d0531a7474a/vehicle_spawn_swift_System_Product_Name_14423_7003050315889173717-5*.log
INFO  [commander] Failsafe mode activated
INFO  [tone_alarm] battery warning (fast)
INFO  [commander] Failsafe mode deactivated
INFO  [tone_alarm] home set
INFO  [tone_alarm] notify negative

pxh> 
pxh>

 

 

 

그럼 QGroundControl과도 연결이 되고 가상환경에서 Home 위치가 아래와 같이 나타납니다.

 

 

 

Mavlink로 명령을 주면 Iris는 비행이 가능한 상태가 되었습니다.

 

이제 준비한 조이스틱을 설정합니다.

 

제가 사용한 조이스틱 PXN-2113 PRO 조이스틱입니다. 비행기 조종기처럼 생겨서 손쉽게 조종할 수 있을 것 같습니다. 그리고 할당할 수 있는 버튼이 여러개있서 활용도가 좋습니다.

 

 

 

 

 

조이스틱의 USB를 연결하고 QGRoundControl에서 Vehicle Setup에 들어가면 Joystick이 자동으로 활성화됩니다. 자동으로 조이스틱의 모델이 인식됩니다. RC Mode는 조종기의 모드를 말합니다. 보통 요즘에는 모드2를 많이 사용하므로 모드2로 선택하였습니다.

 

 

 

탭을 넘기면 버튼을 할당할 수 있는 메뉴가 나옵니다. 조이스틱 버튼을 누르면 해당번호가 클릭이되니 보고 필요한 기능을 할당하면 됩니다.

 

 

Joystick의 Calibration을 수행합니다. Start를 눌러 순서대로 하나씩 스틱을 Calibration하면 됩니다. 

0번: Roll

1번: Pitch

2번: Throatle

3번: Yaw

 

설정이 끝났으면 QGroundContol에서 takeoff 명령을 줍니다.  명령을 줄 때 높이를 설정할 수 있는데 약 3m정도로 설정하고 슬라이드를 밀어서 명령을 보냅니다. 그러면 PX4 SITL은 Arm명령을 받고 Takeoff 명령을 수행합니다.

 

Gazebo에서 드론이 takeoff하여 position hold상태가 되어 있는 것을 볼 수 있습니다.

 

이제 조이스틱을 이용하여 스틱을 조종하거나 모드를 바꾸어서 비행을 할 수 있습니다. 아래 영상은 Alititude 모드와  Position 모드를 조이스틱으로 비행면서 비행성을 비교해본 영상입니다.

 

 

 

 

 

728x90

댓글