diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 256b617116432..a6cdc58f03e94 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -205,7 +205,7 @@ planning/sampling_based_planner/frenet_planner/** maxime.clement@tier4.jp
planning/sampling_based_planner/path_sampler/** maxime.clement@tier4.jp
planning/sampling_based_planner/sampler_common/** maxime.clement@tier4.jp
planning/scenario_selector/** fumiya.watanabe@tier4.jp satoshi.ota@tier4.jp shumpei.wakabayashi@tier4.jp taiki.tanaka@tier4.jp takamasa.horibe@tier4.jp takayuki.murooka@tier4.jp tomoya.kimura@tier4.jp
-planning/static_centerline_optimizer/** kosuke.takeuchi@tier4.jp takayuki.murooka@tier4.jp
+planning/static_centerline_generator/** kosuke.takeuchi@tier4.jp takayuki.murooka@tier4.jp
planning/surround_obstacle_checker/** satoshi.ota@tier4.jp
sensing/gnss_poser/** anh.nguyen.2@tier4.jp kento.yabuuchi.2@tier4.jp koji.minoda@tier4.jp masahiro.sakamoto@tier4.jp ryu.yamamoto@tier4.jp shintaro.sakoda@tier4.jp taiki.yamada@tier4.jp yamato.ando@tier4.jp
sensing/image_diagnostics/** dai.nguyen@tier4.jp
diff --git a/build_depends.repos b/build_depends.repos
index f7b3f12484015..5a12a67dbd346 100644
--- a/build_depends.repos
+++ b/build_depends.repos
@@ -41,3 +41,8 @@ repositories:
type: git
url: https://github.com/MORAI-Autonomous/MORAI-ROS2_morai_msgs.git
version: main
+ #vehicle
+ vehicle/sample_vehicle_launch:
+ type: git
+ url: https://github.com/autowarefoundation/sample_vehicle_launch.git
+ version: main
diff --git a/common/global_parameter_loader/CMakeLists.txt b/common/global_parameter_loader/CMakeLists.txt
index e67ae1a5c06fc..eaca44c515452 100644
--- a/common/global_parameter_loader/CMakeLists.txt
+++ b/common/global_parameter_loader/CMakeLists.txt
@@ -4,6 +4,11 @@ project(global_parameter_loader)
find_package(autoware_cmake REQUIRED)
autoware_package()
+if(BUILD_TESTING)
+ file(GLOB_RECURSE test_files test/*.cpp)
+ ament_add_ros_isolated_gtest(test_global_params_launch ${test_files})
+endif()
+
ament_auto_package(
INSTALL_TO_SHARE
launch
diff --git a/common/global_parameter_loader/package.xml b/common/global_parameter_loader/package.xml
index 4c2568b9aec98..78d08e4038250 100644
--- a/common/global_parameter_loader/package.xml
+++ b/common/global_parameter_loader/package.xml
@@ -10,8 +10,10 @@
ament_cmake_autoautoware_cmake
- vehicle_info_util
+ sample_vehicle_description
+ vehicle_info_util
+ ament_cmake_rosament_lint_autoautoware_lint_common
diff --git a/common/global_parameter_loader/test/test_global_params_launch.cpp b/common/global_parameter_loader/test/test_global_params_launch.cpp
new file mode 100644
index 0000000000000..2b33a695253ff
--- /dev/null
+++ b/common/global_parameter_loader/test/test_global_params_launch.cpp
@@ -0,0 +1,44 @@
+// Copyright 2023 The Autoware Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include
+
+#include
+#include
+#include
+
+TEST(TestLaunchFile, test_launch_file)
+{
+ // Define the path of Python launch file
+ std::string global_params_launch_path = "global_params.launch.py";
+
+ // Define the parameters you want to pass to the launch file
+ std::string use_sim_time_param = "false";
+ std::string vehicle_model_param = "sample_vehicle";
+ // Construct the command to run the Python launch script with parameters
+ std::string command = "ros2 launch global_parameter_loader " + global_params_launch_path +
+ " use_sim_time:=" + use_sim_time_param +
+ " vehicle_model:=" + vehicle_model_param;
+
+ // Use the system() function to execute the command
+ int result = std::system(command.c_str());
+ // Check the result of running the launch file
+ EXPECT_EQ(result, 0);
+}
+
+int main(int argc, char * argv[])
+{
+ testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/common/tier4_autoware_utils/include/tier4_autoware_utils/ros/polling_subscriber.hpp b/common/tier4_autoware_utils/include/tier4_autoware_utils/ros/polling_subscriber.hpp
new file mode 100644
index 0000000000000..f8d5baaf02777
--- /dev/null
+++ b/common/tier4_autoware_utils/include/tier4_autoware_utils/ros/polling_subscriber.hpp
@@ -0,0 +1,66 @@
+// Copyright 2024 TIER IV, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef TIER4_AUTOWARE_UTILS__ROS__POLLING_SUBSCRIBER_HPP_
+#define TIER4_AUTOWARE_UTILS__ROS__POLLING_SUBSCRIBER_HPP_
+
+#include
+
+#include
+
+namespace tier4_autoware_utils
+{
+
+template
+class InterProcessPollingSubscriber
+{
+private:
+ typename rclcpp::Subscription::SharedPtr subscriber_;
+ std::optional data_;
+
+public:
+ explicit InterProcessPollingSubscriber(rclcpp::Node * node, const std::string & topic_name)
+ {
+ auto noexec_callback_group =
+ node->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive, false);
+ auto noexec_subscription_options = rclcpp::SubscriptionOptions();
+ noexec_subscription_options.callback_group = noexec_callback_group;
+
+ subscriber_ = node->create_subscription(
+ topic_name, rclcpp::QoS{1},
+ [node]([[maybe_unused]] const typename T::ConstSharedPtr msg) { assert(false); },
+ noexec_subscription_options);
+ };
+ bool updateLatestData()
+ {
+ rclcpp::MessageInfo message_info;
+ T tmp;
+ // The queue size (QoS) must be 1 to get the last message data.
+ if (subscriber_->take(tmp, message_info)) {
+ data_ = tmp;
+ }
+ return data_.has_value();
+ };
+ const T & getData() const
+ {
+ if (!data_.has_value()) {
+ throw std::runtime_error("Bad_optional_access in class InterProcessPollingSubscriber");
+ }
+ return data_.value();
+ };
+};
+
+} // namespace tier4_autoware_utils
+
+#endif // TIER4_AUTOWARE_UTILS__ROS__POLLING_SUBSCRIBER_HPP_
diff --git a/evaluator/perception_online_evaluator/CMakeLists.txt b/evaluator/perception_online_evaluator/CMakeLists.txt
index f9cc0f4fa256c..e1cd0546ea94a 100644
--- a/evaluator/perception_online_evaluator/CMakeLists.txt
+++ b/evaluator/perception_online_evaluator/CMakeLists.txt
@@ -31,6 +31,7 @@ target_link_libraries(${PROJECT_NAME}_node glog::glog)
if(BUILD_TESTING)
ament_add_ros_isolated_gtest(test_${PROJECT_NAME}
test/test_perception_online_evaluator_node.cpp
+ TIMEOUT 180
)
target_link_libraries(test_${PROJECT_NAME}
${PROJECT_NAME}_node
diff --git a/evaluator/perception_online_evaluator/README.md b/evaluator/perception_online_evaluator/README.md
index c0e2a516cf948..4fcd4fdf9cc84 100644
--- a/evaluator/perception_online_evaluator/README.md
+++ b/evaluator/perception_online_evaluator/README.md
@@ -11,6 +11,58 @@ This module allows for the evaluation of how accurately perception results are g
- Calculates lateral deviation between the predicted path and the actual traveled trajectory.
- Calculates lateral deviation between the smoothed traveled trajectory and the perceived position to evaluate the stability of lateral position recognition.
- Calculates yaw deviation between the smoothed traveled trajectory and the perceived position to evaluate the stability of yaw recognition.
+- Calculates yaw rate based on the yaw of the object received in the previous cycle to evaluate the stability of the yaw rate recognition.
+
+### Predicted Path Deviation / Predicted Path Deviation Variance
+
+Compare the predicted path of past objects with their actual traveled path to determine the deviation. For each object, calculate the mean distance between the predicted path points and the corresponding points on the actual path, up to the specified time step. In other words, this calculates the Average Displacement Error (ADE). The target object to be evaluated is the object from $T_N$ seconds ago, where $T_N$ is the maximum value of the prediction time horizon $[T_1, T_2, ..., T_N]$.
+
+![path_deviation_each_object](./images/path_deviation_each_object.drawio.svg)
+
+$$
+\begin{align}
+n_{points} = T / dt \\
+ADE = \Sigma_{i=1}^{n_{points}} d_i / n_{points} \\
+Var = \Sigma_{i=1}^{n_{points}} (d_i - ADE)^2 / n_{points}
+\end{align}
+$$
+
+- $n_{points}$ : Number of points in the predicted path
+- $T$ : Time horizon for prediction evaluation.
+- $dt$ : Time interval of the predicted path
+- $d_i$ : Distance between the predicted path and the actual traveled path at path point $i$
+- $ADE$ : Mean deviation of the predicted path for the target object.
+- $Var$ : Variance of the predicted path deviation for the target object.
+
+The final predicted path deviation metrics are calculated by averaging the mean deviation of the predicted path for all objects of the same class, and then calculating the mean, maximum, and minimum values of the mean deviation.
+
+![path_deviation](./images/path_deviation.drawio.svg)
+
+$$
+\begin{align}
+ADE_{mean} = \Sigma_{j=1}^{n_{objects}} ADE_j / n_{objects} \\
+ADE_{max} = max(ADE_j) \\
+ADE_{min} = min(ADE_j)
+\end{align}
+$$
+
+$$
+\begin{align}
+Var_{mean} = \Sigma_{j=1}^{n_{objects}} Var_j / n_{objects} \\
+Var_{max} = max(Var_j) \\
+Var_{min} = min(Var_j)
+\end{align}
+$$
+
+- $n_{objects}$ : Number of objects
+- $ADE_{mean}$ : Mean deviation of the predicted path through all objects
+- $ADE_{max}$ : Maximum deviation of the predicted path through all objects
+- $ADE_{min}$ : Minimum deviation of the predicted path through all objects
+- $Var_{mean}$ : Mean variance of the predicted path deviation through all objects
+- $Var_{max}$ : Maximum variance of the predicted path deviation through all objects
+- $Var_{min}$ : Minimum variance of the predicted path deviation through all objects
+
+The actual metric name is determined by the object class and time horizon. For example, `predicted_path_deviation_variance_CAR_5.00`
## Inputs / Outputs
diff --git a/evaluator/perception_online_evaluator/images/path_deviation.drawio.svg b/evaluator/perception_online_evaluator/images/path_deviation.drawio.svg
new file mode 100644
index 0000000000000..0ff07f2808ea4
--- /dev/null
+++ b/evaluator/perception_online_evaluator/images/path_deviation.drawio.svg
@@ -0,0 +1,534 @@
+
diff --git a/evaluator/perception_online_evaluator/images/path_deviation_each_object.drawio.svg b/evaluator/perception_online_evaluator/images/path_deviation_each_object.drawio.svg
new file mode 100644
index 0000000000000..39a69b5f198e9
--- /dev/null
+++ b/evaluator/perception_online_evaluator/images/path_deviation_each_object.drawio.svg
@@ -0,0 +1,1208 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+