Precland units incorrect in UAVLogViewer

Hello,

I am on ArduCopter V4.6.3 (92b0cd78), and using a mavlink Precland companion computer I made. Everything works, the vehicle flies great. Return to landing works perfectly so far. However, when I view the logs in UAVLogViewer, it shows values that are 100x greater than they should be. You can see in this plot the scale for PL.mZ goes to 200m, but I was only flying 2 meters off the ground.

Looking at the code, there is nothing indicating why this is happening. They do not have a mult in the logger, and they are logged in meters. When I inspect the mavlink messages, I can confirm the landing target messages are correctly in meters as well. I can’t figure this out! Is it possible this commit (AC_PrecLand: Convert to meters · ArduPilot/ardupilot@bcb7c50 · GitHub) didnt make it to the 4.6.3 release even though it is on Aug 20, 2025?

ardupilot/libraries/AC_PrecLand/LogStructure.h

// precision landing logging
struct PACKED log_Precland {
LOG_PACKET_HEADER;
uint64_t time_us;
uint8_t healthy;
uint8_t target_acquired;
float pos_x;
float pos_y;
float vel_x;
float vel_y;
float meas_x;
float meas_y;
float meas_z;
uint32_t last_meas;
uint32_t ekf_outcount;
uint8_t estimator;
};

#if AC_PRECLAND_ENABLED
#define LOG_STRUCTURE_FROM_PRECLAND                                     
{ LOG_PRECLAND_MSG, sizeof(log_Precland),                           
“PL”,    “QBBfffffffIIB”,    “TimeUS,Heal,TAcq,pX,pY,vX,vY,mX,mY,mZ,LastMeasMS,EKFOutl,Est”, “s–mmnnmmms–”,“F–0000000C–” , true },
#else
#define LOG_STRUCTURE_FROM_PRECLAND
#endif

ardupilot/libraries/AC_PrecLand/AC_PrecLand.cpp

// Write a precision landing entry
void AC_PrecLand::Write_Precland()
{
    // exit immediately if not enabled
    if (!enabled()) {
        return;
    }

    Vector2f target_pos_rel_ne_m;
    Vector2f target_vel_rel_ne_ms;
    Vector3f target_pos_meas_ned_m;
    get_target_position_relative_NE_m(target_pos_rel_ne_m);
    get_target_velocity_relative_NE_ms(target_vel_rel_ne_ms);
    get_target_position_measurement_NED_m(target_pos_meas_ned_m);

    const struct log_Precland pkt {
        LOG_PACKET_HEADER_INIT(LOG_PRECLAND_MSG),
        time_us         : AP_HAL::micros64(),
        healthy         : healthy(),
        target_acquired : target_acquired(),
        pos_x           : target_pos_rel_ne_m.x,
        pos_y           : target_pos_rel_ne_m.y,
        vel_x           : target_vel_rel_ne_ms.x,
        vel_y           : target_vel_rel_ne_ms.y,
        meas_x          : target_pos_meas_ned_m.x,
        meas_y          : target_pos_meas_ned_m.y,
        meas_z          : target_pos_meas_ned_m.z,
        last_meas       : last_backend_los_meas_ms(),
        ekf_outcount    : ekf_outlier_count(),
        estimator       : (uint8_t)_estimator_type
    };
    AP::logger().WriteBlock(&pkt, sizeof(pkt));
}
#endif

1 Like

I see the same incorrect readings in my case too. Log is attached.
In the figure below, I have doubt where after activating land switch the is drone corrected its pitch and roll according to the aurco marker tag ? or is it landed through gnss corrections ? How should I check in that case. Can anybody help me with this!

  • But in real the drone corrected and little drifted here and there and landed approx to the marker -