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/fix는 global_position.cpp에서 다음 코드로 퍼블리시됩니다:
raw_fix_pub = gp_nh.advertise<sensor_msgs::NavSatFix>("raw/fix", 10);
/mavros/gpsstatus/gps1/raw는 gps_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) 기준
- 타원체 높이 변환 적용
데이터 흐름을 정리하면:
- MAVLink GPS_RAW_INT 메시지 수신
- 위도/경도/고도 변환
- 위성 수 및 고정 상태 처리
- ROS 메시지 형식으로 퍼블리시
주요 차이점:
/mavros/global_position/raw/fix: 원본 GPS 데이터(비-EKF)/mavros/global_position/global: EKF 융합 데이터/mavros/gpsstatus/gps1/raw: 원본 메시지 그대로 전달
이러한 메커니즘을 통해 외부 장치는 GPS 고정 상태와 위성 수를 실시간으로 모니터링할 수 있습니다.