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

[ PX4 SITL ] MAVROS를 이용한 SITL OFFBOARD 제어

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

 

 

본 과정은 'PX4와 Mavlink를 연동하여 시뮬레이션 하는 방법;에서 이어지는 내용이므로, 환경설정 및 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

 

 

환경설정

  • OS: Ubuntu 20.04
  • PX4 Firmware: 1.13alpha
  • ROS noetic
  • Gazebo 11.5.1

 

 

 

과정 수행

SITL 및 Gazebo 환경 실행

roslaunch 명령어를 사용하여 SITL 기본 모델과 Gazebo를 실행합니다.

swift@swift-System-Product-Name:~/workspace/catkin_ws/src/PX4-Autopilot$ roslaunch px4 posix_sitl.launch 





... logging to /home/swift/.ros/log/b5d07182-0fdd-11ec-9c0f-b35a9dd0644c/roslaunch-swift-System-Product-Name-18101.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:37547/

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_18101_2303143168164068636 (gazebo_ros/spawn_model)

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

setting /run_id to b5d07182-0fdd-11ec-9c0f-b35a9dd0644c
process[rosout-1]: started with pid [18121]
started core service [/rosout]
process[sitl-2]: started with pid [18128]
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
INFO  [init] found model autostart file as SYS_AUTOSTART=10016
process[gazebo-3]: started with pid [18140]
INFO  [param] selected parameter default file eeprom/parameters_10016
INFO  [parameters] BSON document size 470 bytes, decoded 470 bytes
[param] Loaded: eeprom/parameters_10016
process[gazebo_gui-4]: started with pid [18151]
process[vehicle_spawn_swift_System_Product_Name_18101_2303143168164068636-5]: started with pid [18161]
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] [1631020546.678505, 0.000000]: Loading model XML from file /home/swift/workspace/catkin_ws/src/PX4-Autopilot/Tools/sitl_gazebo/models/iris/iris.sdf
[INFO] [1631020546.681045, 0.000000]: Waiting for service /gazebo/spawn_sdf_model
[ INFO] [1631020546.854841958]: Finished loading Gazebo ROS API Plugin.
[ INFO] [1631020546.855823190]: waitForService: Service [/gazebo/set_physics_properties] has not been advertised, waiting...
[ INFO] [1631020546.952704606]: Finished loading Gazebo ROS API Plugin.
[ INFO] [1631020546.953466731]: waitForService: Service [/gazebo_gui/set_physics_properties] has not been advertised, waiting...
[ INFO] [1631020547.506698939, 0.004000000]: waitForService: Service [/gazebo/set_physics_properties] is now available.
[ INFO] [1631020547.519300453, 0.016000000]: Physics dynamic reconfigure ready.
[INFO] [1631020547.585063, 0.080000]: Calling service /gazebo/spawn_sdf_model
[INFO] [1631020547.745786, 0.180000]: 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-09-07/13_15_48.ulg
INFO  [logger] Opened full log file: ./log/2021-09-07/13_15_48.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> [vehicle_spawn_swift_System_Product_Name_18101_2303143168164068636-5] process has finished cleanly
log file: /home/swift/.ros/log/b5d07182-0fdd-11ec-9c0f-b35a9dd0644c/vehicle_spawn_swift_System_Product_Name_18101_2303143168164068636-5*.log
INFO  [tone_alarm] home set
INFO  [tone_alarm] notify negative

pxh> 
pxh> INFO  [mavlink] partner IP: 127.0.0.1
INFO  [commander] Armed by external command
INFO  [commander] Takeoff detected
INFO  [mavlink] partner IP: 127.0.0.1
WARN  [commander] Failsafe enabled: No manual control stick input
INFO  [commander] Failsafe mode activated
INFO  [tone_alarm] battery warning (fast)
INFO  [commander] Failsafe mode deactivated
WARN  [commander] Arming denied! Already armed
INFO  [tone_alarm] notify negative
WARN  [commander] Disarming denied! Not landed
INFO  [tone_alarm] notify negative
WARN  [commander] Arming denied! Already armed
INFO  [tone_alarm] notify negative

 

 

ros 노드들을 확인해보니 gazebo에서 발행한 것들만 몇가지 나와 있습니다.

swift@swift-System-Product-Name:~/Desktop$ rostopic list
/clock
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/performance_metrics
/gazebo/set_link_state
/gazebo/set_model_state
/rosout
/rosout_agg

 

 

 

 

MAVROS 실행

mavros를 실행합니다. 

swift@swift-System-Product-Name:/opt/ros/noetic/share$ roslaunch modudculab_ros ctrl_traj_gazebo.launch 






... logging to /home/swift/.ros/log/b5d07182-0fdd-11ec-9c0f-b35a9dd0644c/roslaunch-swift-System-Product-Name-19803.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:33265/

SUMMARY
========

PARAMETERS
 * /mavros/conn_heartbeat: 5.0
 * /mavros/conn_timeout: 5.0
 * /mavros/fcu_url: udp://:14540@127....
 * /mavros/gcs_url: 
 * /mavros/mocap/use_pose: False
 * /mavros/mocap/use_tf: True
 * /mavros/startup_px4_usb_quirk: True
 * /mavros/target_component_id: 1
 * /mavros/target_system_id: 1
 * /pub_setpoints_traj/r: 3.0
 * /pub_setpoints_traj/wn: 0.2
 * /rosdistro: noetic
 * /rosversion: 1.15.11

NODES
  /
    mavros (mavros/mavros_node)
    pub_setpoints_traj (modudculab_ros/pub_setpoints_traj)

ROS_MASTER_URI=http://localhost:11311

process[mavros-1]: started with pid [19817]
process[pub_setpoints_traj-2]: started with pid [19818]
[ INFO] [1631021593.367428222]: FCU URL: udp://:14540@127.0.0.1:14557
[ INFO] [1631021593.368550018]: udp0: Bind address: 0.0.0.0:14540
[ INFO] [1631021593.368588813]: udp0: Remote address: 127.0.0.1:14557
[ INFO] [1631021593.368659897]: GCS bridge disabled
[ INFO] [1631021593.372504168]: udp0: Remote address: 127.0.0.1:14580
[ INFO] [1631021593.374254726]: Plugin 3dr_radio loaded
[ INFO] [1631021593.374960657]: Plugin 3dr_radio initialized
[ INFO] [1631021593.374996547]: Plugin actuator_control loaded
[ INFO] [1631021593.376673954]: Plugin actuator_control initialized
[ INFO] [1631021593.378573650]: Plugin adsb loaded
[ INFO] [1631021593.380145108]: Plugin adsb initialized
[ INFO] [1631021593.380196711]: Plugin altitude loaded
[ INFO] [1631021593.380657564]: Plugin altitude initialized
[ INFO] [1631021593.380699262]: Plugin cam_imu_sync loaded
[ INFO] [1631021593.380984055]: Plugin cam_imu_sync initialized
[ INFO] [1631021593.381036129]: Plugin command loaded
[ INFO] [1631021593.383789351]: Plugin command initialized
[ INFO] [1631021593.383833468]: Plugin companion_process_status loaded
[ INFO] [1631021593.385009263]: Plugin companion_process_status initialized
[ INFO] [1631021593.385050353]: Plugin debug_value loaded
[ INFO] [1631021593.387150992]: Plugin debug_value initialized
[ INFO] [1631021593.387192340]: Plugin distance_sensor loaded
[ WARN] [1631021593.387540888]: DS: plugin not configured!
[ INFO] [1631021593.387555409]: Plugin distance_sensor initialized
[ INFO] [1631021593.387587910]: Plugin esc_status loaded
[ INFO] [1631021593.388098030]: Plugin esc_status initialized
[ INFO] [1631021593.388140204]: Plugin fake_gps loaded
[ INFO] [1631021593.392815052]: Plugin fake_gps initialized
[ INFO] [1631021593.392874504]: Plugin ftp loaded
[ INFO] [1631021593.396147832]: Plugin ftp initialized
[ INFO] [1631021593.396199822]: Plugin geofence loaded
[ INFO] [1631021593.397654807]: Plugin geofence initialized
[ INFO] [1631021593.397721565]: Plugin global_position loaded
[ INFO] [1631021593.403574931]: Plugin global_position initialized
[ INFO] [1631021593.403623287]: Plugin gps_rtk loaded
[ INFO] [1631021593.404967369]: Plugin gps_rtk initialized
[ INFO] [1631021593.405017536]: Plugin gps_status loaded
[ INFO] [1631021593.406102257]: Plugin gps_status initialized
[ INFO] [1631021593.406158815]: Plugin hil loaded
[ INFO] [1631021593.412022281]: Plugin hil initialized
[ INFO] [1631021593.412075733]: Plugin home_position loaded
[ INFO] [1631021593.413568134]: Plugin home_position initialized
[ INFO] [1631021593.413621198]: Plugin imu loaded
[ INFO] [1631021593.416141348]: Plugin imu initialized
[ INFO] [1631021593.416192642]: Plugin landing_target loaded
[ INFO] [1631021593.421787339]: Plugin landing_target initialized
[ INFO] [1631021593.421852011]: Plugin local_position loaded
[ INFO] [1631021593.424174785]: Plugin local_position initialized
[ INFO] [1631021593.424250185]: Plugin log_transfer loaded
[ INFO] [1631021593.425632581]: Plugin log_transfer initialized
[ INFO] [1631021593.425695629]: Plugin manual_control loaded
[ INFO] [1631021593.427047030]: Plugin manual_control initialized
[ INFO] [1631021593.427100273]: Plugin mocap_pose_estimate loaded
[ INFO] [1631021593.428862727]: Plugin mocap_pose_estimate initialized
[ INFO] [1631021593.428916687]: Plugin mount_control loaded
[ INFO] [1631021593.430436778]: Plugin mount_control initialized
[ INFO] [1631021593.430490774]: Plugin obstacle_distance loaded
[ INFO] [1631021593.431776317]: Plugin obstacle_distance initialized
[ INFO] [1631021593.431824583]: Plugin odom loaded
[ INFO] [1631021593.433636704]: Plugin odom initialized
[ INFO] [1631021593.433685715]: Plugin onboard_computer_status loaded
[ INFO] [1631021593.434750155]: Plugin onboard_computer_status initialized
[ INFO] [1631021593.434797521]: Plugin param loaded
[ INFO] [1631021593.435934857]: Plugin param initialized
[ INFO] [1631021593.435983540]: Plugin play_tune loaded
[ INFO] [1631021593.437280381]: Plugin play_tune initialized
[ INFO] [1631021593.437334649]: Plugin px4flow loaded
[ INFO] [1631021593.439613463]: Plugin px4flow initialized
[ INFO] [1631021593.439667023]: Plugin rallypoint loaded
[ INFO] [1631021593.441041038]: Plugin rallypoint initialized
[ INFO] [1631021593.441098411]: Plugin rangefinder loaded
[ INFO] [1631021593.441359228]: Plugin rangefinder initialized
[ INFO] [1631021593.441410665]: Plugin rc_io loaded
[ INFO] [1631021593.443048638]: Plugin rc_io initialized
[ INFO] [1631021593.443107679]: Plugin safety_area loaded
[ INFO] [1631021593.444775058]: Plugin safety_area initialized
[ INFO] [1631021593.444829172]: Plugin setpoint_accel loaded
[ INFO] [1631021593.446053614]: Plugin setpoint_accel initialized
[ INFO] [1631021593.446112810]: Plugin setpoint_attitude loaded
[ INFO] [1631021593.449202826]: Plugin setpoint_attitude initialized
[ INFO] [1631021593.449263405]: Plugin setpoint_position loaded
[ INFO] [1631021593.456203254]: Plugin setpoint_position initialized
[ INFO] [1631021593.456290542]: Plugin setpoint_raw loaded
[ INFO] [1631021593.462599752]: Plugin setpoint_raw initialized
[ INFO] [1631021593.462658965]: Plugin setpoint_trajectory loaded
[ INFO] [1631021593.465396648]: Plugin setpoint_trajectory initialized
[ INFO] [1631021593.465458329]: Plugin setpoint_velocity loaded
[ INFO] [1631021593.467896886]: Plugin setpoint_velocity initialized
[ INFO] [1631021593.467959194]: Plugin sys_status loaded
[ INFO] [1631021593.474036646]: Plugin sys_status initialized
[ INFO] [1631021593.474105471]: Plugin sys_time loaded
[ INFO] [1631021593.477415999]: TM: Timesync mode: MAVLINK
[ INFO] [1631021593.478258636]: Plugin sys_time initialized
[ INFO] [1631021593.478349798]: Plugin trajectory loaded
[ INFO] [1631021593.481411863]: Plugin trajectory initialized
[ INFO] [1631021593.481474475]: Plugin vfr_hud loaded
[ INFO] [1631021593.481749010]: Plugin vfr_hud initialized
[ INFO] [1631021593.481788255]: Plugin vibration loaded
[ INFO] [1631021593.482364282]: Plugin vibration initialized
[ INFO] [1631021593.482413060]: Plugin vision_pose_estimate loaded
[ INFO] [1631021593.485354412]: Plugin vision_pose_estimate initialized
[ INFO] [1631021593.485410806]: Plugin vision_speed_estimate loaded
[ INFO] [1631021593.487527959]: Plugin vision_speed_estimate initialized
[ INFO] [1631021593.487590358]: Plugin waypoint loaded
[ INFO] [1631021593.490915937]: Plugin waypoint initialized
[ INFO] [1631021593.490968062]: Plugin wheel_odometry loaded
[ WARN] [1631021593.494021511]: WO: Not all wheels have parameters specified (0/2).
[ WARN] [1631021593.494042990]: WO: No odometry computations will be performed.
[ INFO] [1631021593.494056766]: Plugin wheel_odometry initialized
[ INFO] [1631021593.494115067]: Plugin wind_estimation loaded
[ INFO] [1631021593.494479516]: Plugin wind_estimation initialized
[ INFO] [1631021593.494502472]: Autostarting mavlink via USB on PX4
[ INFO] [1631021593.494522721]: Built-in SIMD instructions: SSE, SSE2
[ INFO] [1631021593.494536366]: Built-in MAVLink package version: 2021.8.8
[ INFO] [1631021593.494559112]: Known MAVLink dialects: common ardupilotmega ASLUAV all development icarous matrixpilot paparazzi standard uAvionix ualberta
[ INFO] [1631021593.494574104]: MAVROS started. MY ID 1.240, TARGET ID 1.1
[ INFO] [1631021593.504333690]: IMU: High resolution IMU detected!
[ INFO] [1631021593.512436939]: IMU: Attitude quaternion IMU detected!
[ INFO] [1631021593.885515082, 1045.332000000]: CON: Got HEARTBEAT, connected. FCU: PX4 Autopilot
[ INFO] [1631021593.886496894, 1045.332000000]: IMU: High resolution IMU detected!
[ INFO] [1631021593.893427812, 1045.340000000]: IMU: Attitude quaternion IMU detected!
[ INFO] [1631021594.889597890, 1046.332000000]: GF: Using MISSION_ITEM_INT
[ INFO] [1631021594.889769751, 1046.332000000]: RP: Using MISSION_ITEM_INT
[ INFO] [1631021594.889918584, 1046.332000000]: WP: Using MISSION_ITEM_INT
[ INFO] [1631021594.890076884, 1046.336000000]: VER: 1.1: Capabilities         0x000000000000e4ef
[ INFO] [1631021594.890216043, 1046.336000000]: VER: 1.1: Flight software:     010d0040 (ab1c90d831000000)
[ INFO] [1631021594.890349644, 1046.336000000]: VER: 1.1: Middleware software: 010d0040 (ab1c90d831000000)
[ INFO] [1631021594.890499155, 1046.336000000]: VER: 1.1: OS software:         050b00ff (8660572a3c69e0e2)
[ INFO] [1631021594.890595516, 1046.336000000]: VER: 1.1: Board hardware:      00000001
[ INFO] [1631021594.890732970, 1046.336000000]: VER: 1.1: VID/PID:             0000:0000
[ INFO] [1631021594.890850304, 1046.336000000]: VER: 1.1: UID:                 4954414c44494e4f
[ WARN] [1631021594.891066650, 1046.336000000]: CMD: Unexpected command 520, result 0
[ INFO] [1631021603.552086136, 1054.988000000]: Offboard enabled
[ INFO] [1631021608.613820947, 1060.048000000]: Vehicle armed
[ INFO] [1631021608.897518606, 1060.332000000]: RP: mission received
[ INFO] [1631021608.897654529, 1060.332000000]: GF: mission received
[ INFO] [1631021608.897711902, 1060.332000000]: WP: mission received

 

 

mavros가 실행되니 gazebo 터미널에서 mavlink 연결이 확인되고 접속된 ip를 알려줍니다.

pxh> INFO  [mavlink] partner IP: 127.0.0.1

 

그리고 자동으로 offbard모드가 활성화되고  Vehicle arm 상태가 되면서 Iris는 Trajectory 비행을 시작합니다.

다시 노드를 확인해보면 mavros에서 생성한 많은 노드들이 활성화되어 있습니다 .

swift@swift-System-Product-Name:~/Desktop$ rostopic list
/clock
/diagnostics
/gazebo/link_states
/gazebo/model_states
/gazebo/parameter_descriptions
/gazebo/parameter_updates
/gazebo/performance_metrics
/gazebo/set_link_state
/gazebo/set_model_state
/mavlink/from
/mavlink/gcs_ip
/mavlink/to
/mavros/actuator_control
/mavros/adsb/send
/mavros/adsb/vehicle
/mavros/altitude
/mavros/battery
/mavros/cam_imu_sync/cam_imu_stamp
/mavros/companion_process/status
/mavros/debug_value/debug
/mavros/debug_value/debug_vector
/mavros/debug_value/named_value_float
/mavros/debug_value/named_value_int
/mavros/debug_value/send
/mavros/esc_info
/mavros/esc_status
/mavros/estimator_status
/mavros/extended_state
/mavros/fake_gps/mocap/tf
/mavros/geofence/waypoints
/mavros/global_position/compass_hdg
/mavros/global_position/global
/mavros/global_position/gp_lp_offset
/mavros/global_position/gp_origin
/mavros/global_position/home
/mavros/global_position/local
/mavros/global_position/raw/fix
/mavros/global_position/raw/gps_vel
/mavros/global_position/raw/satellites
/mavros/global_position/rel_alt
/mavros/global_position/set_gp_origin
/mavros/gps_rtk/rtk_baseline
/mavros/gps_rtk/send_rtcm
/mavros/gpsstatus/gps1/raw
/mavros/gpsstatus/gps1/rtk
/mavros/gpsstatus/gps2/raw
/mavros/gpsstatus/gps2/rtk
/mavros/hil/actuator_controls
/mavros/hil/controls
/mavros/hil/gps
/mavros/hil/imu_ned
/mavros/hil/optical_flow
/mavros/hil/rc_inputs
/mavros/hil/state
/mavros/home_position/home
/mavros/home_position/set
/mavros/imu/data
/mavros/imu/data_raw
/mavros/imu/diff_pressure
/mavros/imu/mag
/mavros/imu/static_pressure
/mavros/imu/temperature_baro
/mavros/imu/temperature_imu
/mavros/landing_target/lt_marker
/mavros/landing_target/pose
/mavros/landing_target/pose_in
/mavros/local_position/accel
/mavros/local_position/odom
/mavros/local_position/pose
/mavros/local_position/pose_cov
/mavros/local_position/velocity_body
/mavros/local_position/velocity_body_cov
/mavros/local_position/velocity_local
/mavros/log_transfer/raw/log_data
/mavros/log_transfer/raw/log_entry
/mavros/manual_control/control
/mavros/manual_control/send
/mavros/mission/reached
/mavros/mission/waypoints
/mavros/mocap/tf
/mavros/mount_control/command
/mavros/mount_control/orientation
/mavros/obstacle/send
/mavros/odometry/in
/mavros/odometry/out
/mavros/onboard_computer/status
/mavros/param/param_value
/mavros/play_tune
/mavros/px4flow/ground_distance
/mavros/px4flow/raw/optical_flow_rad
/mavros/px4flow/raw/send
/mavros/px4flow/temperature
/mavros/radio_status
/mavros/rallypoint/waypoints
/mavros/rangefinder/rangefinder
/mavros/rc/in
/mavros/rc/out
/mavros/rc/override
/mavros/safety_area/get
/mavros/safety_area/set
/mavros/setpoint_accel/accel
/mavros/setpoint_attitude/cmd_vel
/mavros/setpoint_attitude/thrust
/mavros/setpoint_position/global
/mavros/setpoint_position/global_to_local
/mavros/setpoint_position/local
/mavros/setpoint_raw/attitude
/mavros/setpoint_raw/global
/mavros/setpoint_raw/local
/mavros/setpoint_raw/target_attitude
/mavros/setpoint_raw/target_global
/mavros/setpoint_raw/target_local
/mavros/setpoint_trajectory/desired
/mavros/setpoint_trajectory/local
/mavros/setpoint_velocity/cmd_vel
/mavros/setpoint_velocity/cmd_vel_unstamped
/mavros/state
/mavros/statustext/recv
/mavros/statustext/send
/mavros/target_actuator_control
/mavros/time_reference
/mavros/timesync_status
/mavros/trajectory/desired
/mavros/trajectory/generated
/mavros/trajectory/path
/mavros/vfr_hud
/mavros/vibration/raw/vibration
/mavros/vision_pose/pose
/mavros/vision_pose/pose_cov
/mavros/vision_speed/speed_twist_cov
/mavros/wind_estimation
/rosout
/rosout_agg
/tf
/tf_static

 

ros 툴은 rqt를 실행하여 Topic Monitor를 선택합니다. 활성화된 모든 노드들이 나타나고 모니터링할 노드의 체크를 선택하면 message들을 볼 수 있습니다.

 

Gazebo에서 확인해보니 홈위치에서 반경을 그리면서 Trajectory 비행하는 하는 것으로 구현되어 있네요.

 

 

offboard 모드에서 주는 정보는 geometry_msgspose 값을 계속해서 넘겨줍니다. 이 값은 드론의 3 차원 position  및  quternion 사원수값을 가지고 있습니다.

 

즉 3차원 공간정보, 회전정보를 통해서 드론을 local position에서 이동하는 명령을 보내는 것입니다.

 

 

 

 

 

 

그럼 비행모드를 mavros로 제어해서 변경해보겠습니다.

 

비행모드는 mavros_msgs::Setmode에서 변경할 수 있습니다. 그런데 여기 나와 있는 것들은 모두 BASE_MODE입니다. 우리가 찾는 것들이 아닌 듯하네요.

 

# basic modes from MAV_MODE
uint8 MAV_MODE_PREFLIGHT = 0
uint8 MAV_MODE_STABILIZE_DISARMED = 80
uint8 MAV_MODE_STABILIZE_ARMED = 208
uint8 MAV_MODE_MANUAL_DISARMED = 64
uint8 MAV_MODE_MANUAL_ARMED = 192
uint8 MAV_MODE_GUIDED_DISARMED = 88
uint8 MAV_MODE_GUIDED_ARMED = 216
uint8 MAV_MODE_AUTO_DISARMED = 92
uint8 MAV_MODE_AUTO_ARMED = 220
uint8 MAV_MODE_TEST_DISARMED = 66
uint8 MAV_MODE_TEST_ARMED = 194

 

 

아래는 Custom 모드입니다. 변경하려고 하는 모드의 스트링값을 그대로 사용합니다.

 

Custom mode for PX4

String Description and notes
MANUAL  
ACRO  
ALTCTL  
POSCTL  
OFFBOARD  
STABILIZED  
RATTITUDE  
AUTO.MISSION  
AUTO.LOITER disable RC failsafe, which can be done by setting NAV_RCL_ACT parameter to 0
AUTO.RTL  
AUTO.LAND  
AUTO.RTGS  
AUTO.READY  
AUTO.TAKEOFF  

 

 

아래 mavros 명령어를 보니 BASE_MODE와 CUSTOM_MODE 값을 모두 지원하고 있네요. -c옵션으로 CUSTOM_MODE로 변환하면 될 것 같습니다.

swift@swift-System-Product-Name:~/Desktop$ rosrun mavros mavsys mode



usage: mavsys mode [-h] (-b BASE_MODE | -c CUSTOM_MODE)
mavsys mode: error: one of the arguments -b/--base-mode -c/--custom-mode is required

 

mavros를 이용하여 포지션 모드(POSCTL)로 전환합니다.

swift@swift-System-Product-Name:~/Desktop$ rosrun mavros mavsys mode -c POSCTL
Timed out!

 

Trajectory로 비행중인 드론이 제자리 멈추게 되고 timeout이 걸리니 자동적으로 home position으로 리턴하게 되네요. 이유는  포지션모드에서 manual control의 입력이 없기 때문입니다. 똑똑하네요.

 

아마 QGroundControl에서  조이스틱이 연결되어 있다면 리턴을 하지 않을 수 있겠네요.

 

직접해보니 생각한대로 동작을 합니다.

 

 

시뮬레이션 모드에서 mavros 연동을 통하여 앞으로 해볼만한 과제들이 많이 있겠네요. 좀 더 복잡한 Trajectory 비행, Fomation 비행, 군집비행등을 시도해볼 예정입니다.

 

그리고 시뮬레이션 결과는 항상 실제 하드웨어를 통하여 검증되어야 하는 법이지요. mavros를 연동한 실제 드론에서 비행제어도 시험해볼 예정입니다.

728x90

댓글