드론 장애물 회피 구현 – ArduPilot Avoidance

ArduPilot에서 구현한 장애물 회피에 대해서 살펴보고자 합니다.
MAVLink의 DISTANCE_SENSOR 메시지를 이용해서 센서에서 입력받은 거리 정보를 이용할 수 있습니다.
“proximity sensors”에서 측정한 데이터를 ArduPilot에 전달하는 방법과 이를 이용해서 장애물 회피하는 방법에 대해서 정리해 봅니다.

Loiter 모드에서 회피

비디오에서 울타리로 가던 드론이 울타리를 2m 앞두고 정지하게 됩니다. ArduPilot는 비행체의 속도(GPS와 가속도 센서 이용)와 장애물까지의 거리, 비행체의 최대 가속/감속을 알기에 가능합니다.

AP_Proximity library에서 센서가 측정한 거리 정보를 수집합니다. 8개 섹터에서 수집한 측정 정보를 통합하여 가장 가까운 거리와 각도만 저장하여 사용합니다.

각 섹터는 45도고 그리고 정면이 섹터 0이 되며 오른쪽 방향으로 섹터 1이 됩니다. 거리와 각도로부터 비행체 주변의 울타리 정보를 구성할 수 있습니다.  섹터들 사이에 있는 선들에서 가까운 거리가 fence point가 됩니다.

AC_Avoidance library는 위에 장애물 거리 정보를 이용해서 원하는 velocity vector를 조정하기 위해서 Loiter controller가 전송합니다. Loiter의 원하는 velocity vector는 조정자의 입력합니다.

AltHold 모드에서 회피

AP_Proximity와 AC_Avoidance 라이브러리가 AltHold에서 장애물 회피에 사용됩니다.
AltHold의 경우 GPS에 의존하지 않으므로, 장애물로 향하는 속도는 알수 없어서 아주 단순한 장애물 회피를 사용합니다. 장애물까지의 거리를 lean angle로 변환하는 방식입니다.

아래 이미지는 여러 물체에 대한 거리를 결합해서 최종 roll/pitch lean angle을 구합니다. 각 센싱한 물체까지의 거리와 각도가 결국 roll/pitch angle이 됩니다. 최대 +- roll/pitch angle을 찾고 결합하여 결국 최종 roll/pitch angle을 구합니다.

여기 최종 roll/pitch angle은 비행체를 장애물에서 떨어지라는 조정자의 입력과 결합하지만 조정자는 항상 장애물 회피를 중지할 수 있는 상태여야 합니다. 조정자가 강제로 비행체를 장애물로 날아가도록 할 수 없다는 점이 Loiter 모드와는 다른 특징입니다.

Ground Station에 보고하기

Mission Planner는 근처에 있는 물체까지의 거리를 표시하는 기능이 있습니다.
비행체가 DISTANCE_SENSOR 메시지를 Ground Station에 일정 시간 간격으로 전송하는 방식으로 구현할 수 있습니다. 비행체쪽의 코드는 GCS_Mavlink.cpp 파일을 참고하세요. DISTANCE_SENSOR 메시지는 거리 정보를 비행체에 보내고 나면 동일하게 DISTANCE_SENSOR 메시지를 비행체에서 Ground Station으로 보낼 수도 있습니다. 이 메시지들은 다른 메시지이고 전송되는 rate도 다릅니다.

센서의 거리 메시지를 ArduPilot에 제공하기

새로운 “근거리 측정” 센서를 개발하는 경우 ArduPilot이 각 방향에서 센서가 측정한 거리 측정 값을 가장 쉽게 얻는 방법은 DISTANCE_SENSOR 메시지를 보내는 것입니다. 메시지의 시스템 ID는 비행체의 시스템 ID와 매칭이 되어야 합니다. (기본 “1”이지만 SYSID_THISMAV 파라미터로 변경이 가능) 컴포넌트 ID로 사용할 값은 MAV_COMP_ID_PATHPLANNER(195) 나 MAV_COMP_ID_PERIPHERAL(158)이 적당합니다.

이 메시지들은 10hz와 50hz 사이(빠를수록 좋음)속도로 전달됩니다. 해당 필드들은 다음과 같이 채울 수 있습니다. :

  • time_boost_ms : 0 (무시)
  • min_distance : 센서가 측정할 수 있는 최소 거리로 cm 단위입니다. 이 값은 일반적으로 변경하지 않고 orientation 필드와 상관없이 동일해야 합니다.
  • max_distance : 센서가 측정할 수 있는 최대 거리로 cm 단위입니다. 이 값은 일반적으로 변경하지 않고 orientation 필드와 상관없이 동일해야 합니다.
  • current_distance : 대상 물체애 대한 최단 거리로 cm 단위입니다.
  • type : 0 (무시)
  • id : 0 (무시)
  • orientation : 0 ~ 70 (0 = 전방, 1 증가할 때마다 시계방향으로 45도 증가), 24(윗방향), 25(아랫방향). MAV_SENSOR_ORIENTATION로 mavlink 스펙에서 찾아보세요.
  • covariance : 0 (무시)

DISTANCE_SENSOR 메시지는 8개 모든 섹터에서 받을 수 없는 경우, 빈 섹터는 인접한 섹터의 값으로 채웁니다.(가능하다면)
물체에 부딪히는 것을 쉽게 막기 위해서 “cup” 모양의 울타리를 구성할 수 있습니다.

원문으로 바로가기

[개발] 드론 장애물 회피 구현 – ArduPilot Object Avoidance

Leave a Reply

Your email address will not be published. Required fields are marked *