From 6a86e5c44733154781e972826ad52e4a035a8d13 Mon Sep 17 00:00:00 2001
From: Pascal Leroy <pascal.h.leroy@gmail.com>
Date: Sat, 18 Dec 2021 19:15:05 +0100
Subject: [PATCH 1/2] Fix t_min to correctly handle empty segments.

---
 physics/discrete_trajectory_body.hpp | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/physics/discrete_trajectory_body.hpp b/physics/discrete_trajectory_body.hpp
index 190cd7a757..bcdf3fecd3 100644
--- a/physics/discrete_trajectory_body.hpp
+++ b/physics/discrete_trajectory_body.hpp
@@ -429,11 +429,17 @@ void DiscreteTrajectory<Frame>::Merge(DiscreteTrajectory<Frame> trajectory) {
 
 template<typename Frame>
 Instant DiscreteTrajectory<Frame>::t_min() const {
-  return segments_->front().t_min();
+  CHECK(!empty());
+  for (auto sit = segments_->begin();; ++sit) {
+    if (!sit->empty()) {
+      return sit->t_min();
+    }
+  }
 }
 
 template<typename Frame>
 Instant DiscreteTrajectory<Frame>::t_max() const {
+  CHECK(!empty());
   return segments_->back().t_max();
 }
 

From fe5e392d3ebc62291d16b79e16279268baa25300 Mon Sep 17 00:00:00 2001
From: Pascal Leroy <pascal.h.leroy@gmail.com>
Date: Mon, 20 Dec 2021 22:48:02 +0100
Subject: [PATCH 2/2] Fix t_min for a trajectory starting with empty segments.

---
 physics/discrete_trajectory_body.hpp | 8 ++++++--
 physics/discrete_trajectory_test.cpp | 6 ++++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/physics/discrete_trajectory_body.hpp b/physics/discrete_trajectory_body.hpp
index bcdf3fecd3..fb387aac9d 100644
--- a/physics/discrete_trajectory_body.hpp
+++ b/physics/discrete_trajectory_body.hpp
@@ -429,7 +429,9 @@ void DiscreteTrajectory<Frame>::Merge(DiscreteTrajectory<Frame> trajectory) {
 
 template<typename Frame>
 Instant DiscreteTrajectory<Frame>::t_min() const {
-  CHECK(!empty());
+  if (empty()) {
+    return InfiniteFuture;
+  }
   for (auto sit = segments_->begin();; ++sit) {
     if (!sit->empty()) {
       return sit->t_min();
@@ -439,7 +441,9 @@ Instant DiscreteTrajectory<Frame>::t_min() const {
 
 template<typename Frame>
 Instant DiscreteTrajectory<Frame>::t_max() const {
-  CHECK(!empty());
+  if (empty()) {
+    return InfinitePast;
+  }
   return segments_->back().t_max();
 }
 
diff --git a/physics/discrete_trajectory_test.cpp b/physics/discrete_trajectory_test.cpp
index 0b99ba2bb6..05c92639d6 100644
--- a/physics/discrete_trajectory_test.cpp
+++ b/physics/discrete_trajectory_test.cpp
@@ -32,6 +32,7 @@ using geometry::Displacement;
 using geometry::Frame;
 using geometry::Handedness;
 using geometry::Inertial;
+using geometry::InfiniteFuture;
 using geometry::Instant;
 using geometry::Velocity;
 using quantities::AngularFrequency;
@@ -523,16 +524,19 @@ TEST_F(DiscreteTrajectoryTest, ForgetBefore) {
   EXPECT_EQ(3, trajectory.segments().size());
   EXPECT_EQ(t0_ + 3 * Second, trajectory.begin()->time);
   EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time);
+  EXPECT_EQ(t0_ + 3 * Second, trajectory.t_min());
 
   trajectory.ForgetBefore(t0_ + 6.1 * Second);
   EXPECT_EQ(3, trajectory.segments().size());
   EXPECT_EQ(t0_ + 7 * Second, trajectory.begin()->time);
   EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time);
+  EXPECT_EQ(t0_ + 7 * Second, trajectory.t_min());
 
   trajectory.ForgetBefore(t0_ + 9 * Second);
   EXPECT_EQ(3, trajectory.segments().size());
   EXPECT_EQ(t0_ + 9 * Second, trajectory.begin()->time);
   EXPECT_EQ(t0_ + 14 * Second, trajectory.rbegin()->time);
+  EXPECT_EQ(t0_ + 9 * Second, trajectory.t_min());
 
   // The trajectory now has empty segments, so let's check that we can properly
   // iterate over those.
@@ -565,9 +569,11 @@ TEST_F(DiscreteTrajectoryTest, ForgetBefore) {
 
   trajectory.ForgetBefore(t0_ + 99 * Second);
   EXPECT_TRUE(trajectory.empty());
+  EXPECT_EQ(InfiniteFuture, trajectory.t_min());
 
   trajectory.ForgetBefore(trajectory.end());
   EXPECT_TRUE(trajectory.empty());
+  EXPECT_EQ(InfiniteFuture, trajectory.t_min());
 }
 
 TEST_F(DiscreteTrajectoryTest, Merge) {