108 void startWarm(
double position_offset_m,
double initial_velocity_mps);
120 [[nodiscard]]
const std::vector<LinearMotionTelemetry>&
getTelemetry()
const {
return telemetry_; }
132 void captureInitialPose();
141 [[nodiscard]] std::pair<double, double> projectBodyFrame()
const;
144 double max_velocity_{0.0};
145 std::unique_ptr<foundation::PidController> heading_pid_;
146 ProfiledPIDController profiled_pid_;
147 Eigen::Vector2d initial_position_m_{Eigen::Vector2d::Zero()};
148 double initial_heading_rad_{0.0};
149 bool finished_{
false};
150 bool suppress_hard_stop_{
false};
151 double position_offset_m_{0.0};
152 double speed_scale_{1.0};
153 double heading_scale_{1.0};
154 int unsaturated_cycles_{0};
157 double prev_primary_position_{0.0};
158 double filtered_velocity_{0.0};
159 static constexpr double kVelocityFilterAlpha{0.3};
160 static constexpr double kSettlingVelocity{0.02};
163 std::optional<double> omega_override_{};
166 double prev_omega_cmd_{0.0};
169 double elapsed_time_{0.0};
175 static constexpr size_t kMaxTelemetrySamples{3000};
176 std::vector<LinearMotionTelemetry> telemetry_;