From 44c5726703160619b2a49f4eb4c3d0b0d07925fa Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Thu, 27 Feb 2014 16:20:36 -0800 Subject: Make baro altitude relative. --- .../fw_att_pos_estimator_main.cpp | 97 +++++++++++++++++----- 1 file changed, 77 insertions(+), 20 deletions(-) (limited to 'src/modules/fw_att_pos_estimator/fw_att_pos_estimator_main.cpp') diff --git a/src/modules/fw_att_pos_estimator/fw_att_pos_estimator_main.cpp b/src/modules/fw_att_pos_estimator/fw_att_pos_estimator_main.cpp index 7e179d400..c8ef008d9 100644 --- a/src/modules/fw_att_pos_estimator/fw_att_pos_estimator_main.cpp +++ b/src/modules/fw_att_pos_estimator/fw_att_pos_estimator_main.cpp @@ -164,6 +164,8 @@ private: struct sensor_combined_s _sensor_combined; #endif + float _baro_ref; /**< barometer reference altitude */ + perf_counter_t _loop_perf; /**< loop performance counter */ perf_counter_t _perf_gyro; /// 8.0f) { fuseVtasData = true; - RecallStates(statesAtVtasMeasTime, (IMUmsec - msecTasDelay)); // assume 100 msec avg delay for airspeed data + RecallStates(statesAtVtasMeasTime, (IMUmsec - _parameters.tas_delay_ms)); // assume 100 msec avg delay for airspeed data FuseAirspeed(); } else { @@ -900,10 +920,13 @@ FixedwingEstimator::task_main() _local_pos.vy = states[5]; _local_pos.vz = states[6]; - _local_pos.xy_valid = true; + _local_pos.xy_valid = _gps_initialized; _local_pos.z_valid = true; - _local_pos.v_xy_valid = true; + _local_pos.v_xy_valid = _gps_initialized; _local_pos.v_z_valid = true; + _local_pos.xy_global = true; + + _local_pos.z_global = false; /* lazily publish the local position only once available */ if (_local_pos_pub > 0) { @@ -915,17 +938,51 @@ FixedwingEstimator::task_main() _local_pos_pub = orb_advertise(ORB_ID(vehicle_local_position), &_local_pos); } - _global_pos.timestamp = _gyro.timestamp; + _global_pos.timestamp = _local_pos.timestamp; + + _global_pos.baro_valid = true; + _global_pos.global_valid = true; + + if (_local_pos.xy_global) { + double est_lat, est_lon; + map_projection_reproject(_local_pos.x, _local_pos.y, &est_lat, &est_lon); + _global_pos.lat = est_lat; + _global_pos.lon = est_lon; + _global_pos.time_gps_usec = _gps.time_gps_usec; + } + + /* set valid values even if position is not valid */ + if (_local_pos.v_xy_valid) { + _global_pos.vel_n = _local_pos.vx; + _global_pos.vel_e = _local_pos.vy; + } else { + _global_pos.vel_n = 0.0f; + _global_pos.vel_e = 0.0f; + } + + _global_pos.alt = _local_pos.ref_alt - _local_pos.z; + + if (_local_pos.z_valid) { + _global_pos.baro_alt = _baro_ref - _local_pos.z; + } + + if (_local_pos.v_z_valid) { + _global_pos.vel_d = _local_pos.vz; + } + + _global_pos.yaw = _local_pos.yaw; + + _global_pos.timestamp = _local_pos.timestamp; - // /* lazily publish the global position only once available */ - // if (_global_pos_pub > 0) { - // /* publish the attitude setpoint */ - // orb_publish(ORB_ID(vehicle_global_position), _global_pos_pub, &_global_pos); + /* lazily publish the global position only once available */ + if (_global_pos_pub > 0) { + /* publish the attitude setpoint */ + orb_publish(ORB_ID(vehicle_global_position), _global_pos_pub, &_global_pos); - // } else { - // /* advertise and publish */ - // _global_pos_pub = orb_advertise(ORB_ID(vehicle_global_position), &_global_pos); - // } + } else { + /* advertise and publish */ + _global_pos_pub = orb_advertise(ORB_ID(vehicle_global_position), &_global_pos); + } } } -- cgit v1.2.3