6#include <tracetools/tracetools.h>
8#include <rclcpp/rclcpp.hpp>
9#include <std_msgs/msg/int32.hpp>
11#include <visualization_msgs/msg/marker_array.hpp>
14#include <perception_msgs/msg/ego_data.hpp>
15#include <perception_msgs/msg/object_list.hpp>
16#include <route_planning_msgs/msg/route.hpp>
17#include <trajectory_planning_msgs/msg/trajectory.hpp>
20#include <perception_msgs_utils/object_access.hpp>
21#include <route_planning_msgs_utils/route_access.hpp>
22#include <trajectory_planning_msgs_utils/trajectory_access.hpp>
25#include <tf2_ros/buffer.h>
26#include <tf2_ros/transform_listener.h>
27#include <tf2_geometry_msgs/tf2_geometry_msgs.hpp>
28#include <tf2_perception_msgs/tf2_perception_msgs.hpp>
29#include <tf2_route_planning_msgs/tf2_route_planning_msgs.hpp>
30#include <tf2_trajectory_planning_msgs/tf2_trajectory_planning_msgs.hpp>
40template <
typename T,
typename A>
41struct is_vector<std::vector<T, A>> : std::true_type {};
104 template <
typename T>
107 const std::string& description,
108 const bool add_to_auto_reconfigurable_params =
true,
109 const bool is_required =
false,
110 const bool read_only =
false,
111 const std::optional<double>& from_value = std::nullopt,
112 const std::optional<double>& to_value = std::nullopt,
113 const std::optional<double>& step_value = std::nullopt,
114 const std::string& additional_constraints =
"");
122 rcl_interfaces::msg::SetParametersResult
parametersCallback(
const std::vector<rclcpp::Parameter>& parameters);
141 bool setInitialGuess(
const std::vector<double>& x_init,
const rclcpp::Time& stamp);
183 static double wrap_angle_rad(
double angle_rad,
double min_val = -M_PI,
double max_val = M_PI);
196 const std::vector<double>& Y,
197 const double& desired_x,
199 const bool wrap_angle =
false);
206 void egoDataCallback(
const perception_msgs::msg::EgoData::ConstSharedPtr msg);
227 void routeCallback(
const route_planning_msgs::msg::Route::ConstSharedPtr msg);
245 const perception_msgs::msg::ObjectList& object_list,
246 const route_planning_msgs::msg::Route& route,
247 const trajectory_planning_msgs::msg::Trajectory& reference_trajectory,
248 const std::vector<double>& x_init);
258 const trajectory_planning_msgs::msg::Trajectory& reference_trajectory,
259 const route_planning_msgs::msg::Route& route);
267 void setOcpParameters(
const perception_msgs::msg::EgoData& ego_data,
const perception_msgs::msg::ObjectList& object_list);
277 const trajectory_planning_msgs::msg::Trajectory& reference_trajectory,
const route_planning_msgs::msg::Route& route);
285 static void keepNClosestObjects(perception_msgs::msg::ObjectList& object_list,
const int n_objects);
298 const double x,
const double y,
const double yaw,
const double length,
const double width);
305 void vizCircles(
const std::vector<double>& obstacles);
313 void vizEgoCircles(
const std::vector<double>& x_trajectory,
const std::string& model_name);
322 const std::vector<Eigen::Vector2d>& right_boundary_points);
344 virtual std::vector<double>
getBiLevelX0(
const perception_msgs::msg::EgoData& ego_data) = 0;
355 virtual std::vector<double>
getHighLevelX0(
const perception_msgs::msg::EgoData& ego_data) = 0;
366 rclcpp::Subscription<perception_msgs::msg::EgoData>::SharedPtr
ego_data_sub_;
368 rclcpp::Subscription<route_planning_msgs::msg::Route>::SharedPtr
route_sub_;
371 rclcpp::Publisher<trajectory_planning_msgs::msg::Trajectory>::SharedPtr
trajectory_pub_;
372 rclcpp::Publisher<visualization_msgs::msg::MarkerArray>::SharedPtr
circles_pub_;
374 rclcpp::Publisher<visualization_msgs::msg::MarkerArray>::SharedPtr
boundary_pub_;
static void keepNClosestObjects(perception_msgs::msg::ObjectList &object_list, const int n_objects)
Keeps the nearest forward objects and discards the remaining entries.
rclcpp::Publisher< visualization_msgs::msg::MarkerArray >::SharedPtr circles_pub_
TrajectoryOptimizationNode & operator=(const TrajectoryOptimizationNode &)=delete
Copy assignment is disabled because the node owns non-copyable runtime resources.
void printSolution(const PerformanceMetrics &metrics)
Logs solver status and optional debug statistics for the last optimization run.
void setupSolver()
Creates the acados solver instance and initializes its state buffers.
trajectory_planning_msgs::msg::Trajectory reference_trajectory_
void setup()
Creates ROS interfaces, initializes cached messages and prepares the solver.
double optimization_horizon_
rclcpp::TimerBase::SharedPtr planning_timer_
std::vector< double > xtraj_
TrajectoryOptimizationNode & operator=(TrajectoryOptimizationNode &&)=delete
Move assignment is disabled to keep solver and ROS handles bound to a single instance.
void routeCallback(const route_planning_msgs::msg::Route::ConstSharedPtr msg)
Stores the current route used for boundary constraints when enabled.
std::vector< double > cost_weights_
std::vector< int64_t > p_ref_path_shape_
void freeSolver()
Frees the acados solver and clears cached optimization results.
trajectory_planning_msgs::msg::Trajectory latest_valid_trajectory_
std::vector< double > control_guess_
uint8_t consider_boundaries_
double standstill_threshold_
perception_msgs::msg::EgoData ego_data_
void vizCircles(const std::vector< double > &obstacles)
Publishes visualization markers for the obstacle circles currently used by the optimizer.
TrajectoryOptimizationNode(const TrajectoryOptimizationNode &)=delete
Copy construction is disabled because the node owns non-copyable runtime resources.
virtual void initializeTrajectory(trajectory_planning_msgs::msg::Trajectory &trajectory)=0
Initializes an output trajectory message with the model-specific message type and size.
void logPerformance(const PerformanceMetrics &metrics)
Emits one machine-readable performance record when performance logging is enabled.
double min_prediction_probability_
std::string vehicle_frame_id_
static double wrap_angle_rad(double angle_rad, double min_val=-M_PI, double max_val=M_PI)
Wraps an angle into a configured interval.
uint8_t consider_objects_
bool high_level_stabilization_
std::vector< double > utraj_
ocp_nlp_solver * nlp_solver_
void setOcpParameters(const perception_msgs::msg::EgoData &ego_data, const perception_msgs::msg::ObjectList &object_list)
Writes stage-wise obstacle and dynamic weighting parameters into the OCP.
virtual void convertToTrajectoryMsg(trajectory_planning_msgs::msg::Trajectory &trajectory)=0
Maps the optimized state trajectory into the model-specific output message fields.
void objectListCallback(const perception_msgs::msg::ObjectList::ConstSharedPtr msg)
Stores the current object list when object handling is enabled.
ocp_nlp_config * nlp_config_
bool linearInterpolation(const std::vector< double > &X, const std::vector< double > &Y, const double &desired_x, double &output_y, const bool wrap_angle=false)
Interpolates a value from sampled data and optionally handles angle wrap-around.
bool updateOcpInputs(const perception_msgs::msg::EgoData &ego_data, const perception_msgs::msg::ObjectList &object_list, const route_planning_msgs::msg::Route &route, const trajectory_planning_msgs::msg::Trajectory &reference_trajectory, const std::vector< double > &x_init)
Transforms external inputs into the optimizer frame and writes them into the OCP.
void egoDataCallback(const perception_msgs::msg::EgoData::ConstSharedPtr msg)
Stores the latest ego state used by the optimizer.
double optimization_freq_
void vizEgoCircles(const std::vector< double > &x_trajectory, const std::string &model_name)
Publishes the ego-vehicle circle approximation used by the selected OCP model.
void planningCycle()
Runs one full planning cycle from input preparation, over solver execution, to trajectory publication...
std::vector< std::tuple< std::string, std::function< void(const rclcpp::Parameter &)> > > auto_reconfigurable_params_
bool trajectory2outputFrame(trajectory_planning_msgs::msg::Trajectory &trajectory)
Transforms the planned trajectory into the configured output frame (trajectory_frame_id_) if required...
route_planning_msgs::msg::Route route_
std::unique_ptr< tf2_ros::Buffer > tf2_buffer_
rclcpp::Subscription< route_planning_msgs::msg::Route >::SharedPtr route_sub_
rcl_interfaces::msg::SetParametersResult parametersCallback(const std::vector< rclcpp::Parameter > ¶meters)
Applies parameter updates that can be reconfigured while the node is running.
OnSetParametersCallbackHandle::SharedPtr parameters_callback_
bool performance_logging_
std::vector< double > viz_circles_
rclcpp::Publisher< visualization_msgs::msg::MarkerArray >::SharedPtr boundary_pub_
std::vector< std::pair< double, double > > normalBoundaryDistance(const trajectory_planning_msgs::msg::Trajectory &reference_trajectory, const route_planning_msgs::msg::Route &route)
Computes minimum normal distances from the reference path to the active route boundaries.
ocp_model_capsule_t ocp_capsule_
perception_msgs::msg::ObjectList object_list_
std::string trajectory_frame_id_
virtual std::vector< double > getBiLevelX0(const perception_msgs::msg::EgoData &ego_data)=0
Computes the initial optimizer state using bi-level stabilizaion based on the model-specific EgoData ...
rclcpp::Subscription< perception_msgs::msg::EgoData >::SharedPtr ego_data_sub_
TrajectoryOptimizationNode(const std::string node_name, const rclcpp::NodeOptions &options)
Initializes the base node and loads the common optimizer configuration.
rclcpp::Publisher< visualization_msgs::msg::MarkerArray >::SharedPtr ego_circles_pub_
void vizBoundaryPoints(const std::vector< Eigen::Vector2d > &left_boundary_points, const std::vector< Eigen::Vector2d > &right_boundary_points)
Publishes the boundary intersections corresponding to the distances passed to the OCP.
void declareAndLoadParameter(const std::string &name, T ¶m, const std::string &description, const bool add_to_auto_reconfigurable_params=true, const bool is_required=false, const bool read_only=false, const std::optional< double > &from_value=std::nullopt, const std::optional< double > &to_value=std::nullopt, const std::optional< double > &step_value=std::nullopt, const std::string &additional_constraints="")
Declares a ROS parameter, loads its value and optionally registers it for runtime updates.
rclcpp::Subscription< perception_msgs::msg::ObjectList >::SharedPtr object_list_sub_
std::string fixed_over_time_frame_id_
rclcpp::Time control_guess_stamp_
std::unique_ptr< PerformanceLogger > performance_logger_
void referenceTrajectoryCallback(const trajectory_planning_msgs::msg::Trajectory::ConstSharedPtr msg)
Updates the reference trajectory and optionally triggers optimization immediately.
~TrajectoryOptimizationNode() override
Releases solver resources owned by the node.
rclcpp::Publisher< trajectory_planning_msgs::msg::Trajectory >::SharedPtr trajectory_pub_
std::vector< int64_t > p_cost_weights_shape_
std::shared_ptr< tf2_ros::TransformListener > tf2_listener_
TrajectoryOptimizationNode(TrajectoryOptimizationNode &&)=delete
Move construction is disabled to keep solver and ROS handles bound to a single instance.
std::vector< int64_t > p_obstacle_circles_shape_
double d_min_obstacle_long_
std::vector< double > discretizeBB2Circles(const double x, const double y, const double yaw, const double length, const double width)
Approximates an oriented bounding box with a set of obstacle circles.
rclcpp::Subscription< trajectory_planning_msgs::msg::Trajectory >::SharedPtr reference_trajectory_sub_
double d_min_boundary_lat_
double d_min_obstacle_lat_
void setOcpGlobalParameters(const std::vector< double > &cost_weights, const trajectory_planning_msgs::msg::Trajectory &reference_trajectory, const route_planning_msgs::msg::Route &route)
Writes stage-independent data into the OCP.
bool setInitialGuess(const std::vector< double > &x_init, const rclcpp::Time &stamp)
Builds and sets a dynamically consistent NLP initial guess from the current state and cached controls...
void resetSolver()
Resets the optimizer memory while retaining the generated solver instance.
virtual std::vector< double > getHighLevelX0(const perception_msgs::msg::EgoData &ego_data)=0
Computes the initial optimizer state using high-level stabilization based on the model-specific EgoDa...
Namespace for trajectory_optimization package.
constexpr bool is_vector_v
std::variant< karl_solver_capsule *, shuttle_solver_capsule * > ocp_model_capsule_t