Showing
2 changed files
with
43 additions
and
16 deletions
... | @@ -40,7 +40,7 @@ | ... | @@ -40,7 +40,7 @@ |
40 | */ | 40 | */ |
41 | 41 | ||
42 | #include "ekf.h" | 42 | #include "ekf.h" |
43 | - | 43 | +#include <iostream> |
44 | #include <ecl.h> | 44 | #include <ecl.h> |
45 | #include <geo_lookup/geo_mag_declination.h> | 45 | #include <geo_lookup/geo_mag_declination.h> |
46 | #include <mathlib/mathlib.h> | 46 | #include <mathlib/mathlib.h> |
... | @@ -55,12 +55,10 @@ | ... | @@ -55,12 +55,10 @@ |
55 | #define MASK_GPS_VDRIFT (1<<6) | 55 | #define MASK_GPS_VDRIFT (1<<6) |
56 | #define MASK_GPS_HSPD (1<<7) | 56 | #define MASK_GPS_HSPD (1<<7) |
57 | #define MASK_GPS_VSPD (1<<8) | 57 | #define MASK_GPS_VSPD (1<<8) |
58 | - | ||
59 | bool Ekf::collect_gps(const gps_message &gps) | 58 | bool Ekf::collect_gps(const gps_message &gps) |
60 | { | 59 | { |
61 | // Run GPS checks always | 60 | // Run GPS checks always |
62 | _gps_checks_passed = gps_is_good(gps); | 61 | _gps_checks_passed = gps_is_good(gps); |
63 | - | ||
64 | if (_filter_initialised && !_NED_origin_initialised && _gps_checks_passed) { | 62 | if (_filter_initialised && !_NED_origin_initialised && _gps_checks_passed) { |
65 | // If we have good GPS data set the origin's WGS-84 position to the last gps fix | 63 | // If we have good GPS data set the origin's WGS-84 position to the last gps fix |
66 | const double lat = gps.lat * 1.0e-7; | 64 | const double lat = gps.lat * 1.0e-7; |
... | @@ -142,6 +140,7 @@ bool Ekf::collect_gps(const gps_message &gps) | ... | @@ -142,6 +140,7 @@ bool Ekf::collect_gps(const gps_message &gps) |
142 | } | 140 | } |
143 | 141 | ||
144 | // start collecting GPS if there is a 3D fix and the NED origin has been set | 142 | // start collecting GPS if there is a 3D fix and the NED origin has been set |
143 | + // print GPS data every 1 seocnds | ||
145 | return _NED_origin_initialised && (gps.fix_type >= 3); | 144 | return _NED_origin_initialised && (gps.fix_type >= 3); |
146 | } | 145 | } |
147 | 146 | ... | ... |
... | @@ -32,7 +32,7 @@ | ... | @@ -32,7 +32,7 @@ |
32 | ****************************************************************************/ | 32 | ****************************************************************************/ |
33 | 33 | ||
34 | #include "EKF2.hpp" | 34 | #include "EKF2.hpp" |
35 | - | 35 | +#include <iostream> |
36 | using namespace time_literals; | 36 | using namespace time_literals; |
37 | using math::constrain; | 37 | using math::constrain; |
38 | using matrix::Eulerf; | 38 | using matrix::Eulerf; |
... | @@ -44,7 +44,7 @@ static px4::atomic<EKF2 *> _objects[EKF2_MAX_INSTANCES] {}; | ... | @@ -44,7 +44,7 @@ static px4::atomic<EKF2 *> _objects[EKF2_MAX_INSTANCES] {}; |
44 | #if !defined(CONSTRAINED_FLASH) | 44 | #if !defined(CONSTRAINED_FLASH) |
45 | static px4::atomic<EKF2Selector *> _ekf2_selector {nullptr}; | 45 | static px4::atomic<EKF2Selector *> _ekf2_selector {nullptr}; |
46 | #endif // !CONSTRAINED_FLASH | 46 | #endif // !CONSTRAINED_FLASH |
47 | - | 47 | +static int hold=0; |
48 | EKF2::EKF2(bool multi_mode, const px4::wq_config_t &config, bool replay_mode): | 48 | EKF2::EKF2(bool multi_mode, const px4::wq_config_t &config, bool replay_mode): |
49 | ModuleParams(nullptr), | 49 | ModuleParams(nullptr), |
50 | ScheduledWorkItem(MODULE_NAME, config), | 50 | ScheduledWorkItem(MODULE_NAME, config), |
... | @@ -169,6 +169,8 @@ EKF2::~EKF2() | ... | @@ -169,6 +169,8 @@ EKF2::~EKF2() |
169 | { | 169 | { |
170 | perf_free(_ecl_ekf_update_perf); | 170 | perf_free(_ecl_ekf_update_perf); |
171 | perf_free(_ecl_ekf_update_full_perf); | 171 | perf_free(_ecl_ekf_update_full_perf); |
172 | + perf_free(_imu_missed_perf); | ||
173 | + perf_free(_mag_missed_perf); | ||
172 | } | 174 | } |
173 | 175 | ||
174 | bool EKF2::multi_init(int imu, int mag) | 176 | bool EKF2::multi_init(int imu, int mag) |
... | @@ -193,17 +195,18 @@ bool EKF2::multi_init(int imu, int mag) | ... | @@ -193,17 +195,18 @@ bool EKF2::multi_init(int imu, int mag) |
193 | _estimator_visual_odometry_aligned_pub.advertised(); | 195 | _estimator_visual_odometry_aligned_pub.advertised(); |
194 | _yaw_est_pub.advertise(); | 196 | _yaw_est_pub.advertise(); |
195 | 197 | ||
196 | - _vehicle_imu_sub.ChangeInstance(imu); | 198 | + bool changed_instance = _vehicle_imu_sub.ChangeInstance(imu) && _magnetometer_sub.ChangeInstance(mag); |
197 | - _magnetometer_sub.ChangeInstance(mag); | ||
198 | 199 | ||
199 | const int status_instance = _estimator_states_pub.get_instance(); | 200 | const int status_instance = _estimator_states_pub.get_instance(); |
200 | 201 | ||
201 | - if ((status_instance >= 0) | 202 | + if ((status_instance >= 0) && changed_instance |
202 | && (_attitude_pub.get_instance() == status_instance) | 203 | && (_attitude_pub.get_instance() == status_instance) |
203 | && (_local_position_pub.get_instance() == status_instance) | 204 | && (_local_position_pub.get_instance() == status_instance) |
204 | && (_global_position_pub.get_instance() == status_instance)) { | 205 | && (_global_position_pub.get_instance() == status_instance)) { |
205 | 206 | ||
206 | _instance = status_instance; | 207 | _instance = status_instance; |
208 | + | ||
209 | + ScheduleNow(); | ||
207 | return true; | 210 | return true; |
208 | } | 211 | } |
209 | 212 | ||
... | @@ -219,6 +222,12 @@ int EKF2::print_status() | ... | @@ -219,6 +222,12 @@ int EKF2::print_status() |
219 | _ekf.local_position_is_valid(), _ekf.global_position_is_valid()); | 222 | _ekf.local_position_is_valid(), _ekf.global_position_is_valid()); |
220 | perf_print_counter(_ecl_ekf_update_perf); | 223 | perf_print_counter(_ecl_ekf_update_perf); |
221 | perf_print_counter(_ecl_ekf_update_full_perf); | 224 | perf_print_counter(_ecl_ekf_update_full_perf); |
225 | + perf_print_counter(_imu_missed_perf); | ||
226 | + | ||
227 | + if (_device_id_mag != 0) { | ||
228 | + perf_print_counter(_mag_missed_perf); | ||
229 | + } | ||
230 | + | ||
222 | return 0; | 231 | return 0; |
223 | } | 232 | } |
224 | 233 | ||
... | @@ -298,8 +307,9 @@ void EKF2::Run() | ... | @@ -298,8 +307,9 @@ void EKF2::Run() |
298 | imu_updated = _vehicle_imu_sub.update(&imu); | 307 | imu_updated = _vehicle_imu_sub.update(&imu); |
299 | 308 | ||
300 | if (imu_updated && (_vehicle_imu_sub.get_last_generation() != last_generation + 1)) { | 309 | if (imu_updated && (_vehicle_imu_sub.get_last_generation() != last_generation + 1)) { |
301 | - PX4_ERR("%d - vehicle_imu lost, generation %d -> %d", _instance, last_generation, | 310 | + perf_count(_imu_missed_perf); |
302 | - _vehicle_imu_sub.get_last_generation()); | 311 | + PX4_DEBUG("%d - vehicle_imu lost, generation %d -> %d", _instance, last_generation, |
312 | + _vehicle_imu_sub.get_last_generation()); | ||
303 | } | 313 | } |
304 | 314 | ||
305 | imu_sample_new.time_us = imu.timestamp_sample; | 315 | imu_sample_new.time_us = imu.timestamp_sample; |
... | @@ -1498,7 +1508,18 @@ void EKF2::UpdateGpsSample(ekf2_timestamps_s &ekf2_timestamps) | ... | @@ -1498,7 +1508,18 @@ void EKF2::UpdateGpsSample(ekf2_timestamps_s &ekf2_timestamps) |
1498 | + vehicle_gps_position.vdop * vehicle_gps_position.vdop), | 1508 | + vehicle_gps_position.vdop * vehicle_gps_position.vdop), |
1499 | }; | 1509 | }; |
1500 | _ekf.setGpsData(gps_msg); | 1510 | _ekf.setGpsData(gps_msg); |
1501 | - | 1511 | + if(hold != int(gps_msg.time_usec/1000000)) |
1512 | + { | ||
1513 | + hold=int(gps_msg.time_usec/1000000); | ||
1514 | + if(hold%2==0) | ||
1515 | + { | ||
1516 | + std::cout <<"----------------------current--------------------------"<<std::endl; | ||
1517 | + std :: cout << "time : "<<gps_msg.time_usec/1000000<<std::endl; | ||
1518 | + std :: cout << "lat : " <<gps_msg.lat <<std::endl; | ||
1519 | + std :: cout << "lon : " <<gps_msg.lon <<std::endl; | ||
1520 | + std :: cout << "alt : " <<gps_msg.alt <<std::endl; | ||
1521 | + } | ||
1522 | + } | ||
1502 | _gps_time_usec = gps_msg.time_usec; | 1523 | _gps_time_usec = gps_msg.time_usec; |
1503 | _gps_alttitude_ellipsoid = vehicle_gps_position.alt_ellipsoid; | 1524 | _gps_alttitude_ellipsoid = vehicle_gps_position.alt_ellipsoid; |
1504 | } | 1525 | } |
... | @@ -1513,8 +1534,9 @@ void EKF2::UpdateMagSample(ekf2_timestamps_s &ekf2_timestamps) | ... | @@ -1513,8 +1534,9 @@ void EKF2::UpdateMagSample(ekf2_timestamps_s &ekf2_timestamps) |
1513 | if (_magnetometer_sub.update(&magnetometer)) { | 1534 | if (_magnetometer_sub.update(&magnetometer)) { |
1514 | 1535 | ||
1515 | if (_magnetometer_sub.get_last_generation() != last_generation + 1) { | 1536 | if (_magnetometer_sub.get_last_generation() != last_generation + 1) { |
1516 | - PX4_ERR("%d - vehicle_magnetometer lost, generation %d -> %d", _instance, last_generation, | 1537 | + perf_count(_mag_missed_perf); |
1517 | - _magnetometer_sub.get_last_generation()); | 1538 | + PX4_DEBUG("%d - vehicle_magnetometer lost, generation %d -> %d", _instance, last_generation, |
1539 | + _magnetometer_sub.get_last_generation()); | ||
1518 | } | 1540 | } |
1519 | 1541 | ||
1520 | bool reset = false; | 1542 | bool reset = false; |
... | @@ -1738,7 +1760,8 @@ int EKF2::task_spawn(int argc, char *argv[]) | ... | @@ -1738,7 +1760,8 @@ int EKF2::task_spawn(int argc, char *argv[]) |
1738 | 1760 | ||
1739 | while ((multi_instances_allocated < multi_instances) | 1761 | while ((multi_instances_allocated < multi_instances) |
1740 | && (vehicle_status_sub.get().arming_state != vehicle_status_s::ARMING_STATE_ARMED) | 1762 | && (vehicle_status_sub.get().arming_state != vehicle_status_s::ARMING_STATE_ARMED) |
1741 | - && (hrt_elapsed_time(&time_started) < 30_s)) { | 1763 | + && ((hrt_elapsed_time(&time_started) < 30_s) |
1764 | + || (vehicle_status_sub.get().hil_state == vehicle_status_s::HIL_STATE_ON))) { | ||
1742 | 1765 | ||
1743 | vehicle_status_sub.update(); | 1766 | vehicle_status_sub.update(); |
1744 | 1767 | ||
... | @@ -1763,16 +1786,21 @@ int EKF2::task_spawn(int argc, char *argv[]) | ... | @@ -1763,16 +1786,21 @@ int EKF2::task_spawn(int argc, char *argv[]) |
1763 | 1786 | ||
1764 | if ((actual_instance >= 0) && (_objects[actual_instance].load() == nullptr)) { | 1787 | if ((actual_instance >= 0) && (_objects[actual_instance].load() == nullptr)) { |
1765 | _objects[actual_instance].store(ekf2_inst); | 1788 | _objects[actual_instance].store(ekf2_inst); |
1766 | - ekf2_inst->ScheduleNow(); | ||
1767 | success = true; | 1789 | success = true; |
1768 | multi_instances_allocated++; | 1790 | multi_instances_allocated++; |
1769 | ekf2_instance_created[imu][mag] = true; | 1791 | ekf2_instance_created[imu][mag] = true; |
1770 | 1792 | ||
1793 | + if (actual_instance == 0) { | ||
1794 | + // force selector to run immediately if first instance started | ||
1795 | + _ekf2_selector.load()->ScheduleNow(); | ||
1796 | + } | ||
1797 | + | ||
1771 | PX4_INFO("starting instance %d, IMU:%d (%d), MAG:%d (%d)", actual_instance, | 1798 | PX4_INFO("starting instance %d, IMU:%d (%d), MAG:%d (%d)", actual_instance, |
1772 | imu, vehicle_imu_sub.get().accel_device_id, | 1799 | imu, vehicle_imu_sub.get().accel_device_id, |
1773 | mag, vehicle_mag_sub.get().device_id); | 1800 | mag, vehicle_mag_sub.get().device_id); |
1774 | 1801 | ||
1775 | - _ekf2_selector.load()->ScheduleNow(); | 1802 | + // sleep briefly before starting more instances |
1803 | + px4_usleep(10000); | ||
1776 | 1804 | ||
1777 | } else { | 1805 | } else { |
1778 | PX4_ERR("instance numbering problem instance: %d", actual_instance); | 1806 | PX4_ERR("instance numbering problem instance: %d", actual_instance); | ... | ... |
-
Please register or login to post a comment