forked from Archive/PX4-Autopilot
PositionSmoothing: guard division by zero
Note that the unit test also passes without thechange. But the VelocitySmoothing's local_time would get NAN. This would leads to wrong trajectory calculations.
This commit is contained in:
parent
11cca72ef1
commit
53076b9863
|
@ -279,9 +279,14 @@ void PositionSmoothing::_generateTrajectory(
|
|||
Vector2f drone_to_trajectory_xy(position_trajectory_xy - position_xy);
|
||||
float position_error = drone_to_trajectory_xy.length();
|
||||
|
||||
float time_stretch = 1.f - math::constrain(position_error / _max_allowed_horizontal_error, 0.f, 1.f);
|
||||
float time_stretch = 1.f;
|
||||
|
||||
// Only stretch time if there's no division by zero and the drone isn't ahead of the position setpoint
|
||||
if ((_max_allowed_horizontal_error > FLT_EPSILON)
|
||||
&& drone_to_trajectory_xy.dot(vel_traj_xy) >= 0) {
|
||||
time_stretch = 1.f - math::constrain(position_error / _max_allowed_horizontal_error, 0.f, 1.f);
|
||||
}
|
||||
|
||||
// Don't stretch time if the drone is ahead of the position setpoint
|
||||
if (drone_to_trajectory_xy.dot(vel_traj_xy) < 0.f) {
|
||||
time_stretch = 1.f;
|
||||
}
|
||||
|
|
|
@ -2,6 +2,26 @@
|
|||
|
||||
#include <motion_planning/PositionSmoothing.hpp>
|
||||
|
||||
TEST(PositionSmoothingBasicTest, AllZeroCase)
|
||||
{
|
||||
PositionSmoothing position_smoothing;
|
||||
PositionSmoothing::PositionSmoothingSetpoints out;
|
||||
|
||||
position_smoothing.generateSetpoints(
|
||||
Vector3f(),
|
||||
{Vector3f(), Vector3f(), Vector3f()},
|
||||
Vector3f(),
|
||||
0.f,
|
||||
false,
|
||||
out
|
||||
);
|
||||
|
||||
EXPECT_EQ(out.jerk, Vector3f());
|
||||
EXPECT_EQ(out.acceleration, Vector3f());
|
||||
EXPECT_EQ(out.velocity, Vector3f());
|
||||
EXPECT_EQ(out.position, Vector3f());
|
||||
EXPECT_EQ(out.unsmoothed_velocity, Vector3f());
|
||||
}
|
||||
|
||||
static constexpr float MAX_JERK = 4.f;
|
||||
static constexpr float MAX_ACCELERATION = 3.f;
|
||||
|
|
Loading…
Reference in New Issue