mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-22 19:33:34 +08:00
rtl: integrate dataman cache
This commit is contained in:
+104
-26
@@ -67,6 +67,90 @@ RTL::RTL(Navigator *navigator) :
|
||||
_param_rover_cruise_speed = param_find("GND_SPEED_THR_SC");
|
||||
}
|
||||
|
||||
void RTL::run()
|
||||
{
|
||||
bool success;
|
||||
|
||||
switch (_dataman_state) {
|
||||
|
||||
case DatamanState::UpdateRequestWait:
|
||||
|
||||
if (_initiate_safe_points_updated) {
|
||||
_initiate_safe_points_updated = false;
|
||||
_dataman_state = DatamanState::Read;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case DatamanState::Read:
|
||||
|
||||
_dataman_state = DatamanState::ReadWait;
|
||||
success = _dataman_client.readAsync(DM_KEY_SAFE_POINTS, 0, reinterpret_cast<uint8_t *>(&_stats),
|
||||
sizeof(mission_stats_entry_s));
|
||||
|
||||
if (!success) {
|
||||
_error_state = DatamanState::Read;
|
||||
_dataman_state = DatamanState::Error;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case DatamanState::ReadWait:
|
||||
|
||||
_dataman_client.update();
|
||||
|
||||
if (_dataman_client.lastOperationCompleted(success)) {
|
||||
|
||||
if (!success) {
|
||||
_error_state = DatamanState::ReadWait;
|
||||
_dataman_state = DatamanState::Error;
|
||||
|
||||
} else if (_update_counter != _stats.update_counter) {
|
||||
|
||||
_update_counter = _stats.update_counter;
|
||||
_safe_points_updated = false;
|
||||
|
||||
_dataman_cache.invalidate();
|
||||
|
||||
if (_dataman_cache.size() != _stats.num_items) {
|
||||
_dataman_cache.resize(_stats.num_items);
|
||||
}
|
||||
|
||||
for (int index = 1; index <= _dataman_cache.size(); ++index) {
|
||||
_dataman_cache.load(DM_KEY_SAFE_POINTS, index);
|
||||
}
|
||||
|
||||
_dataman_state = DatamanState::Load;
|
||||
|
||||
} else {
|
||||
_dataman_state = DatamanState::UpdateRequestWait;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case DatamanState::Load:
|
||||
|
||||
_dataman_cache.update();
|
||||
|
||||
if (!_dataman_cache.isLoading()) {
|
||||
_dataman_state = DatamanState::UpdateRequestWait;
|
||||
_safe_points_updated = true;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case DatamanState::Error:
|
||||
PX4_ERR("Safe points update failed! state: %" PRIu8, static_cast<uint8_t>(_error_state));
|
||||
_dataman_state = DatamanState::UpdateRequestWait;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void RTL::on_inactivation()
|
||||
{
|
||||
if (_navigator->get_precland()->is_activated()) {
|
||||
@@ -178,40 +262,34 @@ void RTL::find_RTL_destination()
|
||||
return;
|
||||
}
|
||||
|
||||
// compare to safe landing positions
|
||||
mission_safe_point_s closest_safe_point {};
|
||||
mission_stats_entry_s stats;
|
||||
bool success = _dataman_client.readSync(DM_KEY_SAFE_POINTS, 0, reinterpret_cast<uint8_t *>(&stats),
|
||||
sizeof(mission_stats_entry_s));
|
||||
int num_safe_points = 0;
|
||||
|
||||
if (success) {
|
||||
num_safe_points = stats.num_items;
|
||||
}
|
||||
|
||||
// check if a safe point is closer than home or landing
|
||||
int closest_index = 0;
|
||||
|
||||
for (int current_seq = 1; current_seq <= num_safe_points; ++current_seq) {
|
||||
mission_safe_point_s mission_safe_point;
|
||||
if (_safe_points_updated) {
|
||||
|
||||
success = _dataman_client.readSync(DM_KEY_SAFE_POINTS, current_seq, reinterpret_cast<uint8_t *>(&mission_safe_point),
|
||||
sizeof(mission_safe_point_s));
|
||||
for (int current_seq = 1; current_seq <= _dataman_cache.size(); ++current_seq) {
|
||||
mission_safe_point_s mission_safe_point;
|
||||
|
||||
if (!success) {
|
||||
PX4_ERR("dm_read failed");
|
||||
continue;
|
||||
}
|
||||
bool success = _dataman_cache.loadWait(DM_KEY_SAFE_POINTS, current_seq,
|
||||
reinterpret_cast<uint8_t *>(&mission_safe_point),
|
||||
sizeof(mission_safe_point_s));
|
||||
|
||||
// TODO: take altitude into account for distance measurement
|
||||
dlat = mission_safe_point.lat - global_position.lat;
|
||||
dlon = mission_safe_point.lon - global_position.lon;
|
||||
double dist_squared = coord_dist_sq(dlat, dlon);
|
||||
if (!success) {
|
||||
PX4_ERR("dm_read failed");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (dist_squared < min_dist_squared) {
|
||||
closest_index = current_seq;
|
||||
min_dist_squared = dist_squared;
|
||||
closest_safe_point = mission_safe_point;
|
||||
// TODO: take altitude into account for distance measurement
|
||||
dlat = mission_safe_point.lat - global_position.lat;
|
||||
dlon = mission_safe_point.lon - global_position.lon;
|
||||
double dist_squared = coord_dist_sq(dlat, dlon);
|
||||
|
||||
if (dist_squared < min_dist_squared) {
|
||||
closest_index = current_seq;
|
||||
min_dist_squared = dist_squared;
|
||||
closest_safe_point = mission_safe_point;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user