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

