Skip to content

Commit fb42fb5

Browse files
committed
* ekf2: cache AGP parameters per instance
* renaming
1 parent f63f2b2 commit fb42fb5

File tree

5 files changed

+94
-148
lines changed

5 files changed

+94
-148
lines changed

src/modules/ekf2/EKF/aid_sources/aux_global_position/aux_global_position.cpp

Lines changed: 28 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,19 @@
4040
AuxGlobalPosition::AuxGlobalPosition() : ModuleParams(nullptr)
4141
{
4242
for (int i = 0; i < MAX_AGP_IDS; i++) {
43+
_id_param_values[i] = getAgpParamInt32("ID", i);
4344
_sources[i] = new AgpSource(i, this);
4445
}
4546

46-
touchActiveAgpParams();
47+
for (int i = 0; i < MAX_AGP_IDS; i++) {
48+
if (_id_param_values[i] != 0) {
49+
_sources[i]->initParams();
50+
_sources[i]->advertise();
51+
52+
} else {
53+
break;
54+
}
55+
}
4756
}
4857

4958
AuxGlobalPosition::~AuxGlobalPosition()
@@ -54,33 +63,24 @@ AuxGlobalPosition::~AuxGlobalPosition()
5463
}
5564
}
5665

57-
void AuxGlobalPosition::touchActiveAgpParams()
66+
void AuxGlobalPosition::update(Ekf &ekf, const estimator::imuSample &imu_delayed)
5867
{
5968
for (int i = 0; i < MAX_AGP_IDS; i++) {
60-
if (getIdParam(i) != 0) {
61-
getCtrlParam(i);
62-
getModeParam(i);
63-
getDelayParam(i);
64-
getNoiseParam(i);
65-
getGateParam(i);
66-
_sources[i]->advertise();
67-
68-
} else {
69-
break;
70-
}
69+
_sources[i]->checkAndBufferData(imu_delayed);
70+
_sources[i]->update(ekf, imu_delayed);
7171
}
7272
}
7373

74-
void AuxGlobalPosition::update(Ekf &ekf, const estimator::imuSample &imu_delayed)
74+
void AuxGlobalPosition::paramsUpdated()
7575
{
76-
if (_params_updated) {
77-
touchActiveAgpParams();
78-
_params_updated = false;
79-
}
80-
8176
for (int i = 0; i < MAX_AGP_IDS; i++) {
82-
_sources[i]->checkAndBufferData(imu_delayed);
83-
_sources[i]->update(ekf, imu_delayed);
77+
_id_param_values[i] = getAgpParamInt32("ID", i);
78+
79+
if (_id_param_values[i] != 0) {
80+
_sources[i]->initParams();
81+
_sources[i]->updateParams();
82+
_sources[i]->advertise();
83+
}
8484
}
8585
}
8686

@@ -122,20 +122,6 @@ int32_t AuxGlobalPosition::getAgpParamInt32(const char *param_suffix, int instan
122122
return value;
123123
}
124124

125-
float AuxGlobalPosition::getAgpParamFloat(const char *param_suffix, int instance) const
126-
{
127-
char param_name[20] {};
128-
snprintf(param_name, sizeof(param_name), "EKF2_AGP%d_%s", instance, param_suffix);
129-
130-
float value = NAN;
131-
132-
if (param_get(param_find(param_name), &value) != 0) {
133-
PX4_ERR("failed to get %s", param_name);
134-
}
135-
136-
return value;
137-
}
138-
139125
bool AuxGlobalPosition::setAgpParamInt32(const char *param_suffix, int instance, int32_t value)
140126
{
141127
char param_name[20] {};
@@ -144,65 +130,20 @@ bool AuxGlobalPosition::setAgpParamInt32(const char *param_suffix, int instance,
144130
return param_set_no_notification(param_find(param_name), &value) == PX4_OK;
145131
}
146132

147-
int32_t AuxGlobalPosition::getCtrlParam(int instance)
148-
{
149-
if (_params_updated) {
150-
_param_values[instance].ctrl = getAgpParamInt32("CTRL", instance);
151-
}
152-
153-
return _param_values[instance].ctrl;
154-
}
155-
156-
int32_t AuxGlobalPosition::getModeParam(int instance)
157-
{
158-
if (_params_updated) {
159-
_param_values[instance].mode = getAgpParamInt32("MODE", instance);
160-
}
161-
162-
return _param_values[instance].mode;
163-
}
164-
165-
float AuxGlobalPosition::getDelayParam(int instance)
166-
{
167-
if (_params_updated) {
168-
_param_values[instance].delay = getAgpParamFloat("DELAY", instance);
169-
}
170-
171-
return _param_values[instance].delay;
172-
}
173-
174-
float AuxGlobalPosition::getNoiseParam(int instance)
175-
{
176-
if (_params_updated) {
177-
_param_values[instance].noise = getAgpParamFloat("NOISE", instance);
178-
}
179-
180-
return _param_values[instance].noise;
181-
}
182-
183-
float AuxGlobalPosition::getGateParam(int instance)
184-
{
185-
if (_params_updated) {
186-
_param_values[instance].gate = getAgpParamFloat("GATE", instance);
187-
}
188-
189-
return _param_values[instance].gate;
190-
}
191-
192133
int32_t AuxGlobalPosition::getIdParam(int instance)
193134
{
194-
if (_params_updated) {
195-
_param_values[instance].id = getAgpParamInt32("ID", instance);
196-
}
197-
198-
return _param_values[instance].id;
135+
return _id_param_values[instance];
199136
}
200137

201138
void AuxGlobalPosition::setIdParam(int instance, int32_t sensor_id)
202139
{
203140
setAgpParamInt32("ID", instance, sensor_id);
204-
_param_values[instance].id = sensor_id;
205-
_params_updated = true;
141+
_id_param_values[instance] = sensor_id;
142+
143+
if (sensor_id != 0) {
144+
_sources[instance]->initParams();
145+
_sources[instance]->advertise();
146+
}
206147
}
207148

208149
int AuxGlobalPosition::mapSensorIdToSlot(int32_t sensor_id)

src/modules/ekf2/EKF/aid_sources/aux_global_position/aux_global_position.hpp

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,37 +62,18 @@ class AuxGlobalPosition : public ModuleParams
6262

6363
float test_ratio_filtered() const;
6464
bool anySourceFusing() const;
65-
int32_t getCtrlParam(int instance);
66-
int32_t getModeParam(int instance);
67-
float getDelayParam(int instance);
68-
float getNoiseParam(int instance);
69-
float getGateParam(int instance);
7065
int32_t getIdParam(int instance);
7166
void setIdParam(int instance, int32_t sensor_id);
7267
int mapSensorIdToSlot(int32_t sensor_id);
73-
void params_updated() { _params_updated = true; }
68+
void paramsUpdated();
7469

7570
private:
76-
friend class AgpSource;
77-
7871
AgpSource *_sources[MAX_AGP_IDS];
79-
bool _params_updated{true};
8072

8173
int32_t getAgpParamInt32(const char *param_suffix, int instance) const;
82-
float getAgpParamFloat(const char *param_suffix, int instance) const;
8374
bool setAgpParamInt32(const char *param_suffix, int instance, int32_t value);
8475

85-
struct ParamValues {
86-
int32_t ctrl{0};
87-
int32_t mode{0};
88-
float delay{0.f};
89-
float noise{10.f};
90-
float gate{3.f};
91-
int32_t id{0};
92-
};
93-
94-
void touchActiveAgpParams();
95-
ParamValues _param_values[MAX_AGP_IDS] {};
76+
int32_t _id_param_values[MAX_AGP_IDS] {};
9677

9778
};
9879

src/modules/ekf2/EKF/aid_sources/aux_global_position/aux_global_position_control.cpp

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,48 @@
4040
AgpSource::AgpSource(int instance_id, AuxGlobalPosition *manager)
4141
: _agp_sub(ORB_ID(aux_global_position), instance_id)
4242
, _manager(manager)
43-
, _instance_id(instance_id) {}
43+
, _instance_id(instance_id)
44+
{
45+
}
46+
47+
void AgpSource::initParams()
48+
{
49+
if (_param_ctrl != PARAM_INVALID) {
50+
return; // Already initialized
51+
}
52+
53+
char param_name[20] {};
54+
55+
snprintf(param_name, sizeof(param_name), "EKF2_AGP%d_CTRL", _instance_id);
56+
_param_ctrl = param_find(param_name);
57+
58+
snprintf(param_name, sizeof(param_name), "EKF2_AGP%d_MODE", _instance_id);
59+
_param_mode = param_find(param_name);
60+
61+
snprintf(param_name, sizeof(param_name), "EKF2_AGP%d_DELAY", _instance_id);
62+
_param_delay = param_find(param_name);
63+
64+
snprintf(param_name, sizeof(param_name), "EKF2_AGP%d_NOISE", _instance_id);
65+
_param_noise = param_find(param_name);
66+
67+
snprintf(param_name, sizeof(param_name), "EKF2_AGP%d_GATE", _instance_id);
68+
_param_gate = param_find(param_name);
69+
70+
updateParams();
71+
}
72+
73+
void AgpSource::updateParams()
74+
{
75+
if (_param_ctrl == PARAM_INVALID) {
76+
return;
77+
}
78+
79+
param_get(_param_ctrl, &_ctrl);
80+
param_get(_param_mode, &_mode);
81+
param_get(_param_delay, &_delay);
82+
param_get(_param_noise, &_noise);
83+
param_get(_param_gate, &_gate);
84+
}
4485

4586
void AgpSource::checkAndBufferData(const estimator::imuSample &imu_delayed)
4687
{
@@ -63,7 +104,7 @@ void AgpSource::checkAndBufferData(const estimator::imuSample &imu_delayed)
63104
}
64105

65106
const int64_t time_us = aux_global_position.timestamp_sample
66-
- static_cast<int64_t>(getDelayParam() * 1000);
107+
- static_cast<int64_t>(_delay * 1000);
67108

68109
AuxGlobalPositionSample sample{};
69110
sample.time_us = time_us;
@@ -86,14 +127,14 @@ void AgpSource::update(Ekf &ekf, const estimator::imuSample &imu_delayed)
86127

87128
if (_buffer.pop_first_older_than(imu_delayed.time_us, &sample)) {
88129

89-
if (!(getCtrlParam() & static_cast<int32_t>(Ctrl::kHPos))) {
130+
if (!(_ctrl & static_cast<int32_t>(Ctrl::kHPos))) {
90131
return;
91132
}
92133

93134
const LatLonAlt position(sample.latitude, sample.longitude, sample.altitude_amsl);
94135
const Vector2f innovation = (ekf.getLatLonAlt() - position).xy(); // altitude measurements are not used
95136

96-
float pos_noise = math::max(sample.eph, getNoiseParam(), 0.01f);
137+
float pos_noise = math::max(sample.eph, _noise, 0.01f);
97138
const float pos_var = sq(pos_noise);
98139
const Vector2f pos_obs_var(pos_var, pos_var);
99140

@@ -103,7 +144,7 @@ void AgpSource::update(Ekf &ekf, const estimator::imuSample &imu_delayed)
103144
pos_obs_var, // observation variance
104145
innovation, // innovation
105146
Vector2f(ekf.getPositionVariance()) + pos_obs_var, // innovation variance
106-
math::max(getGateParam(), 1.f)); // innovation gate
147+
math::max(_gate, 1.f)); // innovation gate
107148

108149
const bool starting_conditions = PX4_ISFINITE(sample.latitude) && PX4_ISFINITE(sample.longitude)
109150
&& ekf.control_status_flags().yaw_align;
@@ -203,9 +244,9 @@ void AgpSource::update(Ekf &ekf, const estimator::imuSample &imu_delayed)
203244

204245
bool AgpSource::isResetAllowed(const Ekf &ekf) const
205246
{
206-
return ((static_cast<Mode>(getModeParam()) == Mode::kAuto)
247+
return ((static_cast<Mode>(_mode) == Mode::kAuto)
207248
&& !ekf.isOtherSourceOfHorizontalPositionAidingThan(ekf.control_status_flags().aux_gpos))
208-
|| ((static_cast<Mode>(getModeParam()) == Mode::kDeadReckoning)
249+
|| ((static_cast<Mode>(_mode) == Mode::kDeadReckoning)
209250
&& !ekf.isOtherSourceOfHorizontalAidingThan(ekf.control_status_flags().aux_gpos));
210251
}
211252

@@ -214,29 +255,4 @@ bool AgpSource::isTimedOut(uint64_t last_sensor_timestamp, uint64_t time_delayed
214255
return (last_sensor_timestamp == 0) || (last_sensor_timestamp + timeout_period < time_delayed_us);
215256
}
216257

217-
int32_t AgpSource::getCtrlParam() const
218-
{
219-
return _manager->getCtrlParam(_instance_id);
220-
}
221-
222-
int32_t AgpSource::getModeParam() const
223-
{
224-
return _manager->getModeParam(_instance_id);
225-
}
226-
227-
float AgpSource::getDelayParam() const
228-
{
229-
return _manager->getDelayParam(_instance_id);
230-
}
231-
232-
float AgpSource::getNoiseParam() const
233-
{
234-
return _manager->getNoiseParam(_instance_id);
235-
}
236-
237-
float AgpSource::getGateParam() const
238-
{
239-
return _manager->getGateParam(_instance_id);
240-
}
241-
242258
#endif // CONFIG_EKF2_AUX_GLOBAL_POSITION && MODULE_NAME

src/modules/ekf2/EKF/aid_sources/aux_global_position/aux_global_position_control.hpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838

3939
#if defined(CONFIG_EKF2_AUX_GLOBAL_POSITION) && defined(MODULE_NAME)
4040

41-
#include <lib/ringbuffer/TimestampedRingBuffer.hpp>
41+
#include <lib/parameters/param.h>
4242
#include <uORB/PublicationMulti.hpp>
4343
#include <uORB/Subscription.hpp>
4444
#include <uORB/topics/estimator_aid_source2d.h>
@@ -56,6 +56,8 @@ class AgpSource
5656
void checkAndBufferData(const estimator::imuSample &imu_delayed);
5757
void update(Ekf &ekf, const estimator::imuSample &imu_delayed);
5858
void advertise() { _aid_src_pub.advertise(); }
59+
void initParams();
60+
void updateParams();
5961

6062
float getTestRatioFiltered() const { return _test_ratio_filtered; }
6163
bool isFusing() const { return _state == State::kActive; }
@@ -105,14 +107,20 @@ class AgpSource
105107
AuxGlobalPosition *_manager;
106108
const int _instance_id;
107109

110+
param_t _param_ctrl{PARAM_INVALID};
111+
param_t _param_mode{PARAM_INVALID};
112+
param_t _param_delay{PARAM_INVALID};
113+
param_t _param_noise{PARAM_INVALID};
114+
param_t _param_gate{PARAM_INVALID};
115+
116+
int32_t _ctrl{0};
117+
int32_t _mode{0};
118+
float _delay{0.f};
119+
float _noise{10.f};
120+
float _gate{3.f};
121+
108122
bool isResetAllowed(const Ekf &ekf) const;
109123
bool isTimedOut(uint64_t last_sensor_timestamp, uint64_t time_delayed_us, uint64_t timeout_period) const;
110-
111-
int32_t getCtrlParam() const;
112-
int32_t getModeParam() const;
113-
float getDelayParam() const;
114-
float getNoiseParam() const;
115-
float getGateParam() const;
116124
};
117125

118126
#endif // CONFIG_EKF2_AUX_GLOBAL_POSITION && MODULE_NAME

src/modules/ekf2/EKF/ekf.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ void Ekf::updateParameters()
420420

421421
#if defined(CONFIG_EKF2_AUX_GLOBAL_POSITION) && defined(MODULE_NAME)
422422

423-
_aux_global_position.params_updated();
423+
_aux_global_position.paramsUpdated();
424424
#endif // CONFIG_EKF2_AUX_GLOBAL_POSITION
425425
}
426426

0 commit comments

Comments
 (0)