@@ -265,7 +265,7 @@ void EKF2::AdvertiseTopics()
265265
266266#if defined(CONFIG_EKF2_AIRSPEED)
267267
268- if (_param_ekf2_arsp_thr.get () > 0 . f ) {
268+ if (_param_ekf2_arsp_thr.get () > 0 ) {
269269 _estimator_aid_src_airspeed_pub.advertise ();
270270 }
271271
@@ -987,7 +987,7 @@ void EKF2::initFusionControl()
987987 _num_sensor_table = 0 ;
988988
989989 auto add = [this , sens_en](FusionSensor & sensor, uint8_t sens_en_bit, uint8_t sensor_id,
990- int8_t instance, param_t param, int32_t disabled_val = 0 ) {
990+ int8_t instance, param_t param, uint8_t disabled_val = 0 ) {
991991 if (_num_sensor_table < MAX_SENSOR_TABLE) {
992992 sensor.enabled = sens_en & (1 << sens_en_bit);
993993 int32_t param_val = disabled_val;
@@ -996,20 +996,21 @@ void EKF2::initFusionControl()
996996 param_get (param, ¶m_val);
997997 }
998998
999- sensor.intended = sensor.enabled ? param_val : disabled_val;
999+ sensor.intended = sensor.enabled ? static_cast < uint8_t >( param_val) : disabled_val;
10001000 _sensor_table[_num_sensor_table++] = {&sensor, param, sens_en_bit, sensor_id, instance, disabled_val};
10011001 }
10021002 };
10031003
1004- // bit layout: 0=GPS 1 =OF 2 =EV 3..6 =AGP0..3 7 =BARO 8 =RNG 9 =DRAG 10 =MAG 11=IMU
1004+ // bit layout: 0..1=GPS0..1 2 =OF 3 =EV 4..7 =AGP0..3 8 =BARO 9 =RNG 10 =DRAG 11 =MAG 12=ASPD
10051005#if defined(CONFIG_EKF2_GNSS)
1006- add (_fc.gps , 0 , vehicle_command_s::FUSION_SOURCE_GPS, -1 , _param_ekf2_gps_ctrl.handle ());
1006+ add (_fc.gps , 0 , vehicle_command_s::FUSION_SOURCE_GPS, -1 , _param_ekf2_gps_ctrl.handle ());
1007+ // TODO: gps[1] reserved — no param yet, add second GPS instance here when multi-GPS CTRL is implemented
10071008#endif
10081009#if defined(CONFIG_EKF2_OPTICAL_FLOW)
1009- add (_fc.of , 1 , vehicle_command_s::FUSION_SOURCE_OF, -1 , _param_ekf2_of_ctrl.handle ());
1010+ add (_fc.of , 2 , vehicle_command_s::FUSION_SOURCE_OF, -1 , _param_ekf2_of_ctrl.handle ());
10101011#endif
10111012#if defined(CONFIG_EKF2_EXTERNAL_VISION)
1012- add (_fc.ev , 2 , vehicle_command_s::FUSION_SOURCE_EV, -1 , _param_ekf2_ev_ctrl.handle ());
1013+ add (_fc.ev , 3 , vehicle_command_s::FUSION_SOURCE_EV, -1 , _param_ekf2_ev_ctrl.handle ());
10131014#endif
10141015#if defined(CONFIG_EKF2_AUX_GLOBAL_POSITION)
10151016
@@ -1020,24 +1021,26 @@ void EKF2::initFusionControl()
10201021 const param_t param_agp_ctrl = param_find_no_notification (param_name);
10211022
10221023 if (param_used (param_agp_ctrl) > 0 ) {
1023- add (_fc.agp [i], 3 + i, vehicle_command_s::FUSION_SOURCE_AGP, static_cast <int8_t >(i), param_agp_ctrl);
1024+ add (_fc.agp [i], 4 + i, vehicle_command_s::FUSION_SOURCE_AGP, static_cast <int8_t >(i), param_agp_ctrl);
10241025 }
10251026 }
10261027
10271028#endif
10281029#if defined(CONFIG_EKF2_BAROMETER)
1029- add (_fc.baro , 7 , vehicle_command_s::FUSION_SOURCE_BARO, -1 , _param_ekf2_baro_ctrl.handle ());
1030+ add (_fc.baro , 8 , vehicle_command_s::FUSION_SOURCE_BARO, -1 , _param_ekf2_baro_ctrl.handle ());
10301031#endif
10311032#if defined(CONFIG_EKF2_RANGE_FINDER)
1032- add (_fc.rng , 8 , vehicle_command_s::FUSION_SOURCE_RNG, -1 , _param_ekf2_rng_ctrl.handle ());
1033+ add (_fc.rng , 9 , vehicle_command_s::FUSION_SOURCE_RNG, -1 , _param_ekf2_rng_ctrl.handle ());
10331034#endif
10341035#if defined(CONFIG_EKF2_DRAG_FUSION)
1035- add (_fc.drag , 9 , vehicle_command_s::FUSION_SOURCE_DRAG, -1 , _param_ekf2_drag_ctrl.handle ());
1036+ add (_fc.drag , 10 , vehicle_command_s::FUSION_SOURCE_DRAG, -1 , _param_ekf2_drag_ctrl.handle ());
10361037#endif
10371038#if defined(CONFIG_EKF2_MAGNETOMETER)
1038- add (_fc.mag , 10 , vehicle_command_s::FUSION_SOURCE_MAG, -1 , _param_ekf2_mag_type.handle (), 5 );
1039+ add (_fc.mag , 11 , vehicle_command_s::FUSION_SOURCE_MAG, -1 , _param_ekf2_mag_type.handle (), 5 );
1040+ #endif
1041+ #if defined(CONFIG_EKF2_AIRSPEED)
1042+ add (_fc.aspd , 12 , vehicle_command_s::FUSION_SOURCE_ASPD, -1 , _param_ekf2_arsp_thr.handle ());
10391043#endif
1040- add (_fc.imu , 11 , vehicle_command_s::FUSION_SOURCE_IMU, -1 , _param_ekf2_imu_ctrl.handle ());
10411044}
10421045
10431046void EKF2::updateFusionIntended ()
@@ -1050,12 +1053,14 @@ void EKF2::updateFusionIntended()
10501053 param_get (e.param , ¶m_val);
10511054 }
10521055
1053- e.sensor ->intended = e.sensor ->enabled ? param_val : e.disabled_val ;
1056+ e.sensor ->intended = e.sensor ->enabled ? static_cast < uint8_t >( param_val) : e.disabled_val ;
10541057 }
10551058}
10561059
10571060void EKF2::handleSensorFusionCommand (const vehicle_command_s &cmd, vehicle_command_ack_s &ack)
10581061{
1062+ ack.result = vehicle_command_ack_s::VEHICLE_CMD_RESULT_UNSUPPORTED;
1063+
10591064 const uint8_t sensor = static_cast <uint8_t >(cmd.param1 );
10601065 const uint8_t instance = PX4_ISFINITE (cmd.param2 ) ? static_cast <uint8_t >(cmd.param2 ) : 0 ;
10611066 const bool enable = (static_cast <int32_t >(cmd.param3 ) == 1 );
@@ -1071,14 +1076,12 @@ void EKF2::handleSensorFusionCommand(const vehicle_command_s &cmd, vehicle_comma
10711076 param_get (e.param , ¶m_val);
10721077 }
10731078
1074- e.sensor ->intended = enable ? param_val : e.disabled_val ;
1079+ e.sensor ->intended = enable ? static_cast < uint8_t >( param_val) : e.disabled_val ;
10751080 updateSensEnParam (e.sens_en_bit , enable);
10761081 ack.result = vehicle_command_ack_s::VEHICLE_CMD_RESULT_ACCEPTED;
10771082 return ;
10781083 }
10791084 }
1080-
1081- ack.result = vehicle_command_ack_s::VEHICLE_CMD_RESULT_UNSUPPORTED;
10821085}
10831086
10841087void EKF2::updateSensEnParam (uint8_t bit, bool enable)
@@ -2016,7 +2019,7 @@ void EKF2::PublishStatus(const hrt_abstime ×tamp)
20162019void EKF2::PublishFusionControl (const hrt_abstime ×tamp)
20172020{
20182021 estimator_fusion_control_s msg{};
2019- msg.gps_intended = _fc.gps .intended ;
2022+ msg.gps_intended [ 0 ] = _fc.gps .intended ;
20202023 msg.of_intended = _fc.of .intended ;
20212024 msg.ev_intended = _fc.ev .intended ;
20222025
@@ -2028,10 +2031,20 @@ void EKF2::PublishFusionControl(const hrt_abstime ×tamp)
20282031 msg.rng_intended = _fc.rng .intended ;
20292032 msg.drag_intended = _fc.drag .intended ;
20302033 msg.mag_intended = _fc.mag .intended ;
2031- msg.imu_intended = _fc.imu .intended ;
2034+ msg.aspd_intended = _fc.aspd .intended ;
2035+
2036+ const auto &cs = _ekf.control_status_flags ();
2037+ msg.gps_active = (cs.gnss_pos || cs.gps_hgt || cs.gnss_vel || cs.gnss_yaw ) ? 1u : 0u ; // TODO: per-instance active tracking
2038+ msg.of_active = cs.opt_flow ;
2039+ msg.ev_active = cs.ev_pos || cs.ev_hgt || cs.ev_vel || cs.ev_yaw ;
2040+ msg.baro_active = cs.baro_hgt ;
2041+ msg.rng_active = cs.rng_hgt ;
2042+ msg.drag_active = (_fc.drag .intended > 0 ) && cs.wind && cs.in_air && !cs.fake_pos ;
2043+ msg.mag_active = cs.mag ;
2044+ msg.aspd_active = cs.fuse_aspd ;
20322045
20332046#if defined(CONFIG_EKF2_AUX_GLOBAL_POSITION)
2034- msg.agp_active = _ekf.getAgpFusingBitmask ();
2047+ msg.agp_active = _ekf.getAgpFusingBitmask ();
20352048#endif
20362049
20372050 msg.timestamp = _replay_mode ? timestamp : hrt_absolute_time ();
0 commit comments