Skip to content

Commit e373eec

Browse files
feat: combine concatenator with validator
Signed-off-by: Zulfaqar Azmi <zulfaqar.azmi@tier4.jp>
1 parent 4f73e2d commit e373eec

7 files changed

Lines changed: 141 additions & 38 deletions

File tree

planning/autoware_trajectory_concatenator/CMakeLists.txt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,4 @@ target_link_libraries(${PROJECT_NAME}
2020
${PROJECT_NAME}_param
2121
)
2222

23-
target_compile_options(${PROJECT_NAME} PUBLIC
24-
-Wno-error=deprecated-declarations
25-
)
26-
27-
ament_auto_package(
28-
INSTALL_TO_SHARE
29-
)
23+
ament_auto_package()

planning/autoware_trajectory_validator/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.14)
22
project(autoware_trajectory_validator)
33

44
find_package(autoware_cmake REQUIRED)
5+
find_package(autoware_trajectory_concatenator REQUIRED)
56
autoware_package()
67
pluginlib_export_plugin_description_file(autoware_trajectory_validator plugins.xml)
78

@@ -24,6 +25,10 @@ target_link_libraries(${trajectory_validator_lib_target}
2425
${PROJECT_NAME}_param
2526
)
2627

28+
ament_target_dependencies(${trajectory_validator_lib_target}
29+
autoware_trajectory_concatenator
30+
)
31+
2732
target_compile_options(${trajectory_validator_lib_target} PUBLIC
2833
-Wno-error=deprecated-declarations
2934
)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright 2026 TIER IV, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
#ifndef AUTOWARE__TRAJECTORY_VALIDATOR__PARAMETERS_HPP_
16+
#define AUTOWARE__TRAJECTORY_VALIDATOR__PARAMETERS_HPP_
17+
18+
#include <autoware_trajectory_concatenator/autoware_trajectory_concatenator_param.hpp>
19+
#include <autoware_trajectory_validator/autoware_trajectory_validator_param.hpp>
20+
#include <rclcpp/node_interfaces/node_parameters_interface.hpp>
21+
22+
namespace autoware::trajectory_validator
23+
{
24+
struct TrajectoryValidatorParam
25+
{
26+
explicit TrajectoryValidatorParam(
27+
rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_parameters_interface)
28+
: validator_params_listener(node_parameters_interface),
29+
concatenator_params_listener(node_parameters_interface)
30+
{
31+
validator_params = validator_params_listener.get_params();
32+
concatenator_params = concatenator_params_listener.get_params();
33+
}
34+
35+
validator::ParamListener validator_params_listener;
36+
validator::Params validator_params;
37+
concatenator::ParamListener concatenator_params_listener;
38+
concatenator::Params concatenator_params;
39+
40+
std::optional<std::string> update_parameters()
41+
{
42+
std::string status;
43+
if (validator_params_listener.is_old(validator_params)) {
44+
validator_params = validator_params_listener.get_params();
45+
status += "Validator parameters updated. ";
46+
}
47+
48+
if (concatenator_params_listener.is_old(concatenator_params)) {
49+
concatenator_params = concatenator_params_listener.get_params();
50+
status += "Concatenator parameters updated. ";
51+
}
52+
53+
if (status.empty()) {
54+
return std::nullopt;
55+
}
56+
57+
return status;
58+
}
59+
};
60+
} // namespace autoware::trajectory_validator
61+
62+
#endif // AUTOWARE__TRAJECTORY_VALIDATOR__PARAMETERS_HPP_

planning/autoware_trajectory_validator/include/autoware/trajectory_validator/trajectory_validator_node.hpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@
1515
#ifndef AUTOWARE__TRAJECTORY_VALIDATOR__TRAJECTORY_VALIDATOR_NODE_HPP_
1616
#define AUTOWARE__TRAJECTORY_VALIDATOR__TRAJECTORY_VALIDATOR_NODE_HPP_
1717

18+
#include "autoware/trajectory_concatenator/trajectory_concatenator.hpp"
1819
#include "autoware/trajectory_validator/evaluation_context.hpp"
1920
#include "autoware/trajectory_validator/validation_stage_report.hpp"
2021
#include "autoware/trajectory_validator/validator_interface.hpp"
2122

2223
#include <autoware/lanelet2_utils/conversion.hpp>
23-
#include <autoware_trajectory_validator/autoware_trajectory_validator_param.hpp>
24+
#include <autoware/trajectory_validator/parameters.hpp>
2425
#include <autoware_trajectory_validator/msg/metric_report.hpp>
2526
#include <autoware_trajectory_validator/msg/validation_report.hpp>
2627
#include <autoware_trajectory_validator/msg/validation_report_array.hpp>
@@ -42,9 +43,8 @@
4243
#include <geometry_msgs/msg/accel_with_covariance_stamped.hpp>
4344
#include <nav_msgs/msg/odometry.hpp>
4445

45-
#include <algorithm>
46-
#include <functional>
4746
#include <memory>
47+
#include <mutex>
4848
#include <string>
4949
#include <unordered_map>
5050
#include <vector>
@@ -79,13 +79,16 @@ class TrajectoryValidator : public rclcpp::Node
7979
*/
8080
void publishers();
8181

82+
void on_trajectories(const CandidateTrajectories::ConstSharedPtr msg);
83+
84+
void on_timer();
85+
86+
void execute_pipeline(const CandidateTrajectories & concatenated_trajectories);
8287
/**
8388
* @brief Gather the latest inputs required to run the filter plugins.
8489
*/
8590
tl::expected<EvaluationContext, std::string> take_data();
8691

87-
void process(const CandidateTrajectories::ConstSharedPtr msg);
88-
8992
void map_callback(const LaneletMapBin::ConstSharedPtr msg);
9093

9194
void load_metric(const std::string & name, const bool is_shadow_mode = false);
@@ -138,8 +141,7 @@ class TrajectoryValidator : public rclcpp::Node
138141
const std::unordered_map<std::string, double> & processing_time);
139142

140143
// Parameters
141-
validator::ParamListener listener_;
142-
validator::Params params_;
144+
TrajectoryValidatorParam params_;
143145

144146
// Plugin infrastructure
145147
pluginlib::ClassLoader<plugin::ValidatorInterface> plugin_loader_;
@@ -158,6 +160,12 @@ class TrajectoryValidator : public rclcpp::Node
158160
rclcpp::Subscription<LaneletMapBin>::SharedPtr sub_map_;
159161
rclcpp::Subscription<CandidateTrajectories>::SharedPtr sub_trajectories_;
160162

163+
rclcpp::Subscription<CandidateTrajectories>::SharedPtr sub_trajectories_generative_;
164+
rclcpp::Subscription<CandidateTrajectories>::SharedPtr sub_trajectories_backup_;
165+
166+
// Timer
167+
rclcpp::TimerBase::SharedPtr timer_;
168+
161169
// Publishers
162170
rclcpp::Publisher<CandidateTrajectories>::SharedPtr pub_trajectories_;
163171
std::shared_ptr<autoware_utils_debug::DebugPublisher> pub_validation_reports_;
@@ -170,6 +178,10 @@ class TrajectoryValidator : public rclcpp::Node
170178
autoware::vehicle_info_utils::VehicleInfo vehicle_info_;
171179
DiagnosticsInterface diagnostics_interface_{this, "trajectory_validator"};
172180
mutable std::shared_ptr<autoware_utils_debug::TimeKeeper> time_keeper_{nullptr};
181+
182+
// Concatenator state
183+
std::unique_ptr<trajectory_concatenator::TrajectoryConcatenator> concatenator_ptr_;
184+
std::mutex buffer_mutex_;
173185
};
174186

175187
} // namespace autoware::trajectory_validator

planning/autoware_trajectory_validator/launch/trajectory_validator.launch.xml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<launch>
33
<arg name="trajectory_validator_param_path" default="$(find-pkg-share autoware_trajectory_validator)/config/trajectory_validator.param.yaml"/>
4-
<arg name="input_trajectories" default="~/input/trajectories"/>
4+
<arg name="input_generative_trajectories" default="~/input/trajectories_generative"/>
5+
<arg name="input_backup_trajectories" default="~/input/trajectories_backup"/>
56
<arg name="output_trajectories" default="~/output/trajectories"/>
67
<arg name="input_vector_map" default="~/input/vector_map"/>
78
<arg name="input_odometry" default="~/input/odometry"/>
@@ -11,7 +12,8 @@
1112

1213
<node pkg="autoware_trajectory_validator" exec="autoware_trajectory_validator_node" name="trajectory_validator_node" output="screen">
1314
<param from="$(var trajectory_validator_param_path)" allow_substs="true"/>
14-
<remap from="~/input/trajectories" to="$(var input_trajectories)"/>
15+
<remap from="~/input/trajectories_generative" to="$(var input_generative_trajectories)"/>
16+
<remap from="~/input/trajectories_backup" to="$(var input_backup_trajectories)"/>
1517
<remap from="~/output/trajectories" to="$(var output_trajectories)"/>
1618
<remap from="~/input/lanelet2_map" to="$(var input_vector_map)"/>
1719
<remap from="~/input/odometry" to="$(var input_odometry)"/>

planning/autoware_trajectory_validator/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
<depend>autoware_perception_msgs</depend>
3232
<depend>autoware_planning_msgs</depend>
3333
<depend>autoware_traffic_light_utils</depend>
34+
<depend>autoware_trajectory_concatenator</depend>
3435
<depend>autoware_utils_debug</depend>
3536
<depend>autoware_utils_diagnostics</depend>
3637
<depend>autoware_utils_geometry</depend>

planning/autoware_trajectory_validator/src/trajectory_validator_node.cpp

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,20 @@ namespace autoware::trajectory_validator
3939

4040
TrajectoryValidator::TrajectoryValidator(const rclcpp::NodeOptions & options)
4141
: Node{"trajectory_validator_node", options},
42-
listener_{get_node_parameters_interface()},
43-
params_(listener_.get_params()),
42+
params_{get_node_parameters_interface()},
4443
plugin_loader_(
4544
"autoware_trajectory_validator", "autoware::trajectory_validator::plugin::ValidatorInterface"),
4645
vehicle_info_(autoware::vehicle_info_utils::VehicleInfoUtils(*this).getVehicleInfo())
4746
{
48-
const auto filters = params_.filter_names;
47+
concatenator_ptr_ =
48+
std::make_unique<trajectory_concatenator::TrajectoryConcatenator>(params_.concatenator_params);
49+
const auto filters = params_.validator_params.filter_names;
4950
for (const auto & filter : filters) {
5051
load_metric(filter);
5152
}
5253

5354
constexpr bool shadow_mode = true;
54-
for (const auto & filter : params_.shadow_mode_filter_names) {
55+
for (const auto & filter : params_.validator_params.shadow_mode_filter_names) {
5556
load_metric(filter, shadow_mode);
5657
}
5758

@@ -61,6 +62,10 @@ TrajectoryValidator::TrajectoryValidator(const rclcpp::NodeOptions & options)
6162

6263
subscribers();
6364
publishers();
65+
66+
timer_ = create_timer(
67+
this, get_clock(), std::chrono::milliseconds(30),
68+
std::bind(&TrajectoryValidator::on_timer, this));
6469
}
6570

6671
void TrajectoryValidator::subscribers()
@@ -69,9 +74,13 @@ void TrajectoryValidator::subscribers()
6974
"~/input/lanelet2_map", rclcpp::QoS{1}.transient_local(),
7075
std::bind(&TrajectoryValidator::map_callback, this, std::placeholders::_1));
7176

72-
sub_trajectories_ = create_subscription<CandidateTrajectories>(
73-
"~/input/trajectories", 1,
74-
std::bind(&TrajectoryValidator::process, this, std::placeholders::_1));
77+
sub_trajectories_generative_ = create_subscription<CandidateTrajectories>(
78+
"~/input/trajectories_generative", 1,
79+
std::bind(&TrajectoryValidator::on_trajectories, this, std::placeholders::_1));
80+
81+
sub_trajectories_backup_ = create_subscription<CandidateTrajectories>(
82+
"~/input/trajectories_backup", 1,
83+
std::bind(&TrajectoryValidator::on_trajectories, this, std::placeholders::_1));
7584
}
7685

7786
void TrajectoryValidator::publishers()
@@ -86,6 +95,13 @@ void TrajectoryValidator::publishers()
8695
pub_debug_ = std::make_shared<autoware_utils_debug::DebugPublisher>(this, "~/debug");
8796
}
8897

98+
void TrajectoryValidator::on_trajectories(const CandidateTrajectories::ConstSharedPtr msg)
99+
{
100+
// Passively update the buffer
101+
std::lock_guard<std::mutex> lock(buffer_mutex_);
102+
concatenator_ptr_->add_candidate(*msg);
103+
}
104+
89105
tl::expected<FilterContext, std::string> TrajectoryValidator::take_data()
90106
{
91107
FilterContext context;
@@ -119,29 +135,40 @@ tl::expected<FilterContext, std::string> TrajectoryValidator::take_data()
119135
return context;
120136
}
121137

122-
void TrajectoryValidator::process(const CandidateTrajectories::ConstSharedPtr msg)
138+
void TrajectoryValidator::on_timer()
123139
{
124140
autoware_utils_debug::ScopedTimeTrack st(__func__, *time_keeper_);
125141

126-
if (listener_.is_old(params_)) {
127-
params_ = listener_.get_params();
128-
for (const auto & plugin : plugins_) {
129-
plugin->update_parameters(params_);
130-
}
131-
RCLCPP_INFO(get_logger(), "Dynamic parameters updated successfully.");
132-
}
133-
134-
// 4. Instantiate and execute the stateless ValidationStage
135-
ValidationStage validation_stage(plugins_);
136-
142+
// ==========================================
143+
// 1. Data Synchronization & Parameters
144+
// ==========================================
137145
auto context_opt = take_data();
138146
if (!context_opt) {
139147
RCLCPP_WARN_THROTTLE(get_logger(), *get_clock(), 1000, "%s", context_opt.error().c_str());
140148
return;
141149
}
142150

151+
if (const auto is_params_updated = params_.update_parameters()) {
152+
for (const auto & plugin : plugins_) {
153+
plugin->update_parameters(params_.validator_params);
154+
}
155+
RCLCPP_INFO(get_logger(), "%s", is_params_updated->c_str());
156+
}
157+
158+
// ==========================================
159+
// 2. concatenated stage
160+
// ==========================================
161+
CandidateTrajectories concatenated_trajectories;
162+
{
163+
std::lock_guard<std::mutex> lock(buffer_mutex_);
164+
concatenated_trajectories = concatenator_ptr_->get_concatenated(now());
165+
}
166+
167+
diagnostics_interface_.clear();
168+
143169
const auto & context = context_opt.value();
144-
const auto report = validation_stage.process(*msg, context);
170+
ValidationStage validation_stage(plugins_);
171+
const auto report = validation_stage.process(concatenated_trajectories, context);
145172

146173
diagnostics_interface_.clear();
147174

@@ -160,7 +187,7 @@ void TrajectoryValidator::process(const CandidateTrajectories::ConstSharedPtr ms
160187

161188
// 6. Publish outputs
162189
pub_trajectories_->publish(report.valid_trajectories);
163-
update_diagnostic(*msg, report.num_feasible_trajectories);
190+
update_diagnostic(concatenated_trajectories, report.num_feasible_trajectories);
164191

165192
publish_validation_reports(report.validation_reports);
166193

@@ -197,7 +224,7 @@ void TrajectoryValidator::load_metric(const std::string & name, const bool is_sh
197224

198225
plugin->set_vehicle_info(vehicle_info_);
199226
plugin->set_shadow_mode(is_shadow_mode);
200-
plugin->update_parameters(params_);
227+
plugin->update_parameters(params_.validator_params);
201228
std::string category;
202229
size_t pos = name.find("::");
203230
if (pos != std::string::npos) {

0 commit comments

Comments
 (0)