@@ -42,6 +42,8 @@ using namespace time_literals;
42
42
43
43
/* * Timeout in us for trajectory data to get considered invalid */
44
44
static constexpr uint64_t TRAJECTORY_STREAM_TIMEOUT_US = 500_ms;
45
+ /* * If Flighttask fails, keep 0.5 seconds the current setpoint before going into failsafe land */
46
+ static constexpr uint64_t TIME_BEFORE_FAILSAFE = 500_ms;
45
47
46
48
const vehicle_trajectory_waypoint_s empty_trajectory_waypoint = {0 , 0 , {0 , 0 , 0 , 0 , 0 , 0 , 0 },
47
49
{ {0 , {NAN, NAN, NAN}, {NAN, NAN, NAN}, {NAN, NAN, NAN}, NAN, NAN, false , {0 , 0 , 0 }},
@@ -57,6 +59,8 @@ ObstacleAvoidance::ObstacleAvoidance(ModuleParams *parent) :
57
59
{
58
60
_desired_waypoint = empty_trajectory_waypoint;
59
61
_failsafe_position.setNaN ();
62
+ _avoidance_point_not_valid_hysteresis.set_hysteresis_time_from (false , TIME_BEFORE_FAILSAFE);
63
+
60
64
}
61
65
62
66
ObstacleAvoidance::~ObstacleAvoidance ()
@@ -99,7 +103,9 @@ void ObstacleAvoidance::injectAvoidanceSetpoints(Vector3f &pos_sp, Vector3f &vel
99
103
const bool avoidance_point_valid =
100
104
_sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].point_valid == true ;
101
105
102
- if (avoidance_data_timeout || !avoidance_point_valid) {
106
+ _avoidance_point_not_valid_hysteresis.set_state_and_update (!avoidance_point_valid, hrt_absolute_time ());
107
+
108
+ if (avoidance_data_timeout || _avoidance_point_not_valid_hysteresis.get_state ()) {
103
109
PX4_WARN (" Obstacle Avoidance system failed, loitering" );
104
110
_publishVehicleCmdDoLoiter ();
105
111
@@ -119,14 +125,17 @@ void ObstacleAvoidance::injectAvoidanceSetpoints(Vector3f &pos_sp, Vector3f &vel
119
125
_failsafe_position.setNaN ();
120
126
}
121
127
122
- pos_sp = _sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].position ;
123
- vel_sp = _sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].velocity ;
128
+ if (avoidance_point_valid) {
129
+ pos_sp = _sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].position ;
130
+ vel_sp = _sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].velocity ;
124
131
125
- if (!_ext_yaw_active) {
126
- // inject yaw setpoints only if weathervane isn't active
127
- yaw_sp = _sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].yaw ;
128
- yaw_speed_sp = _sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].yaw_speed ;
132
+ if (!_ext_yaw_active) {
133
+ // inject yaw setpoints only if weathervane isn't active
134
+ yaw_sp = _sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].yaw ;
135
+ yaw_speed_sp = _sub_vehicle_trajectory_waypoint->get ().waypoints [vehicle_trajectory_waypoint_s::POINT_0].yaw_speed ;
136
+ }
129
137
}
138
+
130
139
}
131
140
132
141
void ObstacleAvoidance::updateAvoidanceDesiredWaypoints (const Vector3f &curr_wp, const float curr_yaw,
0 commit comments