9. Drone 컨트롤

Peroro·2023년 5월 15일

캡스톤

목록 보기
9/10

서론

우선 프로젝트를 진행하면서 알게 된 점은, 드론은 ARM 이후에는 모드를 변환하기가 어렵다는 점이다. ARP Spoofing을 성공한 이후, Manaul 모드로 바꿔 조종하려고 했던 내 목표는 불가능하다는 것이었다.

그래서 QGC를 이용할 때는 AUTO 모드라고 가정을 하고, 명령을 내릴 것이다.

https://velog.io/@azurp158/7.-test1.py드론-조종-관련

여기에서 manual_control_send와 관련된 함수들은 모두 먹통이었다. 뿐만 아니라 set_mode_send, master.mode_mapping의 경우에도 뭔가 문제가 많았다. mode_mapping 같은 경우 예상대로라면 정수를 반환해야하는데 튜플을 반환한다던지, 문제가 많았다. 관련된 자료를 찾아보았지만, 우리와 같은 문제를 가진 경우는 거의 없었다.

실질적인 시간이 2주도 남지 않은 상황이라, 빠르게 진행되어야 하는데 드론이 명령을 먹지 않자 멘붕이 온 상태였다.

어쩔 수 없이, 여태까지 작동이 됐었던 command_long_send를 이용하기로 했다.

코드

from pymavlink import mavutil


master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
master.wait_heartbeat()
print('Drone is connected!')

msg = master.recv_match(type='HEARTBEAT', blocking=True)

current_mode = mavutil.mode_string_v10(msg)

print("Current Mode:", current_mode)

//드론 모드 설정


input('hello')

//드론 ARM/DISARM

master.mav.command_long_send(master.target_system, master.target_component, mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM, 0, 1, 0, 0, 0, 0, 0, 0)

msg = master.recv_match(type='COMMAND_ACK', blocking=True)
print(msg)

input('hello')

// 드론 TAKEOFF

master.mav.command_long_send(master.target_system, master.target_component, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, 3)

msg = master.recv_match(type='COMMAND_ACK', blocking=True)
print(msg)


//드론 이동(위도 경도 설정 필요)

speed = 1
direction = 0;
latitude = 
longitude = 
altitude = 5

master.command_long_send(target_system, target_component, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, speed, direction, 0, 0, latitude, longitude, altitude, 0)

msg = master.recv_match(type='COMMAND_ACK', blocking=True)
print(msg)

// 드론 착륙

master.command_long_send(target_system, target_component, mavutil.mavlink.MAV_CMD_NAV_LAND, 0, speed, 0, 0, 0, 0, 0, 0, 0)

msg = master.recv_match(type='COMMAND_ACK', blocking=True)
print(msg)

마무리

  • 일단 여태껏 안 됐던 원인이 세가지가 의심이 된다.
  • 첫째로 PX4의 경우 pymavlink를 쓰지만 ardupilot과 호환성이 차이가 있어 이런 문제가 생겼다.
  • 둘쨰로 msg = master.recv_match(type='COMMAND_ACK', blocking=True)와 같이 recv를 받는 함수가 없어서 그 모양 그 꼴이 난거다.
  • 셋째로 QGC에서 드론의 모드를 바꾸지 않아서 문제가 생긴거다.
  • 세번째의 경우 조금 억울한게 아무리 모드를 바꾸려고 명령을 보내도, 바뀌지 않았다. 내가 모드를 보내는 방법이 잘못되어서 이런 문제가 생겼을 수도 있다.
  • 우선은 QGC로 드론의 모드를 변경해보고 위의 코드를 테스트해볼 예정이다.
profile
오늘 공부한 것을 올리는 공간 / 일주일에 글 3개 / 블로그 이전 : https://perorochan321.tistory.com/

0개의 댓글