MAVROS GPS 관련 토픽 분석 및 위도, 경도, 고도 정보 수집 방법

ROS1-Noetic과 mavros v1.20.1 환경에서 GPS 데이터 수집 메커니즘을 분석합니다. 주요 토픽은 다음과 같습니다:

  • /mavros/global_position/raw/fix
  • /mavros/gpsstatus/gps1/raw
  • /mavros/global_position/global

mavros 소스코드를 분석한 결과, 첫 두 토픽은 동일한 MAVLink 메시지(MAVLINK_MSG_ID_GPS_RAW_INT)를 기반으로 하며, 각각 다른 처리 로직을 가집니다.

/mavros/global_position/raw/fixglobal_position.cpp에서 다음 코드로 퍼블리시됩니다:

raw_fix_pub = gp_nh.advertise<sensor_msgs::NavSatFix>("raw/fix", 10);

/mavros/gpsstatus/gps1/rawgps_status.cpp에서 다음과 같이 처리됩니다:

gps1_raw_pub = gpsstatus_nh.advertise<mavros_msgs::GPSRAW>("gps1/raw", 10);

데이터 처리 로직을 살펴보면, handle_gps_raw_int 함수에서 raw GPS 데이터를 처리합니다. 이 함수는 WGS-84 좌표계로 변환된 위도, 경도, 고도 정보를 생성합니다. 고도는 지오이드 높이(AMSL)에서 타원체 높이(ELLIPSOID)로 변환됩니다.

void handle_gps_raw_int(const mavlink::mavlink_message_t *msg, mavlink::common::msg::GPS_RAW_INT &raw_gps) {
    auto fix = boost::make_shared<sensor_msgs::NavSatFix>();
    // 위도/경도 변환
    fix->latitude = raw_gps.lat / 1e7;
    fix->longitude = raw_gps.lon / 1e7;
    // 고도 변환
    fix->altitude = raw_gps.alt / 1e3 + geoid_to_ellipsoid_height(fix);
    
    // 위성 수 전송
    auto sat_cnt = boost::make_shared<std_msgs::UInt32>();
    sat_cnt->data = raw_gps.satellites_visible;
    raw_sat_pub.publish(sat_cnt);
}

/mavros/global_position/global 토픽은 EKF(확장 칼만 필터) 융합된 데이터를 제공합니다. 이 토픽은 fill_lla 함수를 통해 위도, 경도, 고도를 계산하며, 다음과 같은 특징이 있습니다:

  • EKF 융합된 위치 정보
  • 상대 고도(AMSL) 기준
  • 타원체 높이 변환 적용

데이터 흐름을 정리하면:

  1. MAVLink GPS_RAW_INT 메시지 수신
  2. 위도/경도/고도 변환
  3. 위성 수 및 고정 상태 처리
  4. ROS 메시지 형식으로 퍼블리시

주요 차이점:

  • /mavros/global_position/raw/fix: 원본 GPS 데이터(비-EKF)
  • /mavros/global_position/global: EKF 융합 데이터
  • /mavros/gpsstatus/gps1/raw: 원본 메시지 그대로 전달

이러한 메커니즘을 통해 외부 장치는 GPS 고정 상태와 위성 수를 실시간으로 모니터링할 수 있습니다.

태그: ROS MAVROS GPS PX4 EKF

5월 24일 01:45에 게시됨