From 788383d7bc74f43d8fcd977ff2a631fe8f46fa7b Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Fri, 20 Oct 2023 16:36:46 +0900 Subject: [PATCH 01/30] update Doxyfile Signed-off-by: Masaya Kataoka --- .gitignore | 2 + Doxyfile | 48 +++++++++++++++++++ .../exception.hpp | 17 ++----- 3 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 Doxyfile diff --git a/.gitignore b/.gitignore index 284e2a2d5eb..665a3b4b50c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ # log file *.log +log # files too large *.pcd @@ -20,3 +21,4 @@ latex scenario_simulator.tar site *.pyc +build diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 00000000000..19f49d9fe74 --- /dev/null +++ b/Doxyfile @@ -0,0 +1,48 @@ +PROJECT_NAME = scenario_simulator_v2 + +DOXYFILE_ENCODING = UTF-8 + +ENABLE_PREPROCESSING = YES +EXPAND_ONLY_PREDEF = YES +EXTRACT_ALL = YES +EXTRACT_ANON_NSPACES = YES +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = YES +GENERATE_HTML = YES +GENERATE_LATEX = NO +GENERATE_XML = NO + +INPUT += common/math/geometry +INPUT += common/scenario_simulator_exception + +IMAGE_PATH += common/math/geometry +IMAGE_PATH += common/scenario_simulator_exception + +EXAMPLE_PATH += common/math/geometry +EXAMPLE_PATH += common/scenario_simulator_exception + +INPUT_ENCODING = UTF-8 +MACRO_EXPANSION = YES +OUTPUT_DIRECTORY = +OUTPUT_LANGUAGE = English +PROJECT_NAME = Scenario Simulator +RECURSIVE = YES +SKIP_FUNCTION_MACROS = NO +XML_OUTPUT = build + +FILE_PATTERNS += *.hpp +FILE_PATTERNS += *.cpp +FILE_PATTERNS += *.md + +EXPAND_AS_DEFINED += TEST +EXPAND_AS_DEFINED += EXPECT_DECIMAL_EQ +EXPAND_AS_DEFINED += EXPECT_POINT_EQ +EXPAND_AS_DEFINED += EXPECT_VECTOR3_EQ +EXPAND_AS_DEFINED += EXPECT_QUATERNION_EQ +EXPAND_AS_DEFINED += EXPECT_POSE_EQ +EXPAND_AS_DEFINED += EXPECT_LANELET_POSE_EQ +EXPAND_AS_DEFINED += EXPECT_TWIST_EQ +EXPAND_AS_DEFINED += EXPECT_ACCEL_EQ +EXPAND_AS_DEFINED += EXPECT_ACTION_STATUS_EQ +EXPAND_AS_DEFINED += EXPECT_DETECTION_SENSOR_CONFIGURATION_EQ +EXPAND_AS_DEFINED += DEFINE_ERROR_CATEGORY diff --git a/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp b/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp index cd3c2252519..2fe7e130ba5 100644 --- a/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp +++ b/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp @@ -37,21 +37,16 @@ struct Error : public std::runtime_error using Error::Error; \ } -// Autoware encountered some problem that led to a simulation failure. +/// @brief Autoware encountered some problem that led to a simulation failure. DEFINE_ERROR_CATEGORY(AutowareError); -// Although there were no syntactic errors in the description of the scenario, -// differences in meaning and inconsistencies were found. +/// @brief Although there were no syntactic errors in the description of the scenario, differences in meaning and inconsistencies were found. DEFINE_ERROR_CATEGORY(SemanticError); -// A problem occurred that interfered with the continuation of the simulation. +/// @brief A problem occurred that interfered with the continuation of the simulation. DEFINE_ERROR_CATEGORY(SimulationError); -// Metric module detects specification violation in simulation. -DEFINE_ERROR_CATEGORY(SpecificationViolation); - -// There is a syntactic error in the description of the scenario. Or you are -// using a feature that is not yet supported by our implementation. +/// @brief There is a syntactic error in the description of the scenario. Or you are using a feature that is not yet supported by our implementation. DEFINE_ERROR_CATEGORY(SyntaxError); #undef DEFINE_ERROR_CATEGORY @@ -60,11 +55,7 @@ DEFINE_ERROR_CATEGORY(SyntaxError); #define THROW_SEMANTIC_ERROR(...) /* */ THROW_ERROR(common::SemanticError, __VA_ARGS__) #define THROW_SIMULATION_ERROR(...) /* */ THROW_ERROR(common::SimulationError, __VA_ARGS__) -#define THROW_SPECIFICATION_VIOLATION(...) THROW_ERROR(common::SpecificationViolation, __VA_ARGS__) #define THROW_SYNTAX_ERROR(...) /* */ THROW_ERROR(common::SyntaxError, __VA_ARGS__) - -#define SPECIFICATION_VIOLATION(...) \ - common::SpecificationViolation(__FILE__, ":", __LINE__, ": ", __VA_ARGS__) } // namespace scenario_simulator_exception } // namespace common From 296e6cd46c12341ba363a3a83dc8be61561977af Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Fri, 20 Oct 2023 17:44:30 +0900 Subject: [PATCH 02/30] update Doxyfile Signed-off-by: Masaya Kataoka --- Doxyfile | 37 ++++++++++++++----- README.md | 2 +- .../include/simple_junit/junit5.hpp | 10 ++--- external/concealer/src/task_queue.cpp | 2 +- simulation/traffic_simulator/src/api/api.cpp | 2 +- 5 files changed, 35 insertions(+), 18 deletions(-) diff --git a/Doxyfile b/Doxyfile index 19f49d9fe74..c62419a599a 100644 --- a/Doxyfile +++ b/Doxyfile @@ -1,4 +1,4 @@ -PROJECT_NAME = scenario_simulator_v2 +PROJECT_NAME = scenario_simulator_v2 C++ API DOXYFILE_ENCODING = UTF-8 @@ -12,20 +12,33 @@ GENERATE_HTML = YES GENERATE_LATEX = NO GENERATE_XML = NO +INPUT += README.md + INPUT += common/math/geometry +INPUT += common/math/arithmetic INPUT += common/scenario_simulator_exception +INPUT += common/simple_junit +INPUT += common/status_monitor +INPUT += simulation/traffic_simulator IMAGE_PATH += common/math/geometry +IMAGE_PATH += common/math/arithmetic IMAGE_PATH += common/scenario_simulator_exception +IMAGE_PATH += common/simple_junit +IMAGE_PATH += common/status_monitor +IMAGE_PATH += simulation/traffic_simulator EXAMPLE_PATH += common/math/geometry EXAMPLE_PATH += common/scenario_simulator_exception +EXAMPLE_PATH += common/math/arithmetic +EXAMPLE_PATH += common/simple_junit +EXAMPLE_PATH += common/status_monitor +EXAMPLE_PATH += simulation/traffic_simulator INPUT_ENCODING = UTF-8 MACRO_EXPANSION = YES OUTPUT_DIRECTORY = OUTPUT_LANGUAGE = English -PROJECT_NAME = Scenario Simulator RECURSIVE = YES SKIP_FUNCTION_MACROS = NO XML_OUTPUT = build @@ -34,15 +47,19 @@ FILE_PATTERNS += *.hpp FILE_PATTERNS += *.cpp FILE_PATTERNS += *.md -EXPAND_AS_DEFINED += TEST +EXPAND_AS_DEFINED += DEFINE_ERROR_CATEGORY +EXPAND_AS_DEFINED += EXPECT_ACCEL_EQ +EXPAND_AS_DEFINED += EXPECT_ACTION_STATUS_EQ EXPAND_AS_DEFINED += EXPECT_DECIMAL_EQ +EXPAND_AS_DEFINED += EXPECT_DETECTION_SENSOR_CONFIGURATION_EQ +EXPAND_AS_DEFINED += EXPECT_LANELET_POSE_EQ EXPAND_AS_DEFINED += EXPECT_POINT_EQ -EXPAND_AS_DEFINED += EXPECT_VECTOR3_EQ -EXPAND_AS_DEFINED += EXPECT_QUATERNION_EQ EXPAND_AS_DEFINED += EXPECT_POSE_EQ -EXPAND_AS_DEFINED += EXPECT_LANELET_POSE_EQ +EXPAND_AS_DEFINED += EXPECT_QUATERNION_EQ EXPAND_AS_DEFINED += EXPECT_TWIST_EQ -EXPAND_AS_DEFINED += EXPECT_ACCEL_EQ -EXPAND_AS_DEFINED += EXPECT_ACTION_STATUS_EQ -EXPAND_AS_DEFINED += EXPECT_DETECTION_SENSOR_CONFIGURATION_EQ -EXPAND_AS_DEFINED += DEFINE_ERROR_CATEGORY +EXPAND_AS_DEFINED += EXPECT_VECTOR3_EQ +EXPAND_AS_DEFINED += TEST +EXPAND_AS_DEFINED += THROW_ERROR +EXPAND_AS_DEFINED += THROW_SEMANTIC_ERROR +EXPAND_AS_DEFINED += THROW_SIMULATION_ERROR +EXPAND_AS_DEFINED += THROW_SYNTAX_ERROR diff --git a/README.md b/README.md index d11a5141925..fe536186104 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# scenario_simulator_v2 +# scenario_simulator_v2 {#mainpage} Scenario testing framework for Autoware. diff --git a/common/simple_junit/include/simple_junit/junit5.hpp b/common/simple_junit/include/simple_junit/junit5.hpp index 13e6a3376c0..12310ccadce 100644 --- a/common/simple_junit/include/simple_junit/junit5.hpp +++ b/common/simple_junit/include/simple_junit/junit5.hpp @@ -123,7 +123,7 @@ struct Error struct Properties { - // TODO + /// @todo implement `properties` in junit. }; /* @@ -137,7 +137,7 @@ struct Properties struct Property { - // TODO + /// @todo implement `property` in junit. }; /* @@ -225,7 +225,7 @@ struct SimpleTestCase current_node.append_attribute("status") = testcase.status.c_str(); } - // TODO skipped + /// @todo implement `skipped` emelent in junit. for (const auto & each : testcase.error) { current_node.append_child("error") << each; @@ -235,9 +235,9 @@ struct SimpleTestCase current_node.append_child("failure") << each; } - // TODO system-out + /// @todo implement `system-out` element in junit. - // TODO system-err + /// @todo implement `system-err` element in junit. return node; } diff --git a/external/concealer/src/task_queue.cpp b/external/concealer/src/task_queue.cpp index 80a099ea9c7..481ecdcca1e 100644 --- a/external/concealer/src/task_queue.cpp +++ b/external/concealer/src/task_queue.cpp @@ -16,7 +16,7 @@ #include #include -// TODO: pzyskowski : use conditional variables to wait for new messages instead of sleep_for +/// @todo: pzyskowski : use conditional variables to wait for new messages instead of sleep_for namespace concealer { TaskQueue::TaskQueue() diff --git a/simulation/traffic_simulator/src/api/api.cpp b/simulation/traffic_simulator/src/api/api.cpp index 77e64631b86..133147d84e1 100644 --- a/simulation/traffic_simulator/src/api/api.cpp +++ b/simulation/traffic_simulator/src/api/api.cpp @@ -215,7 +215,7 @@ bool API::updateTrafficLightsInSim() auto req = entity_manager_ptr_->generateUpdateRequestForConventionalTrafficLights(); return zeromq_client_.call(req).result().success(); } - // TODO handle response + /// @todo handle response return simulation_api_schema::UpdateTrafficLightsResponse().result().success(); } From 7606dbee4e8fac50c678746827d5aaf917094586 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Fri, 20 Oct 2023 17:47:09 +0900 Subject: [PATCH 03/30] add cpp_mock_scenarios Signed-off-by: Masaya Kataoka --- Doxyfile | 3 +++ .../src/follow_front_entity/accelerate_and_follow.cpp | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/Doxyfile b/Doxyfile index c62419a599a..d175b536f83 100644 --- a/Doxyfile +++ b/Doxyfile @@ -19,6 +19,7 @@ INPUT += common/math/arithmetic INPUT += common/scenario_simulator_exception INPUT += common/simple_junit INPUT += common/status_monitor +INPUT += mock/cpp_mock_scenarios INPUT += simulation/traffic_simulator IMAGE_PATH += common/math/geometry @@ -26,6 +27,7 @@ IMAGE_PATH += common/math/arithmetic IMAGE_PATH += common/scenario_simulator_exception IMAGE_PATH += common/simple_junit IMAGE_PATH += common/status_monitor +IMAGE_PATH += mock/cpp_mock_scenarios IMAGE_PATH += simulation/traffic_simulator EXAMPLE_PATH += common/math/geometry @@ -33,6 +35,7 @@ EXAMPLE_PATH += common/scenario_simulator_exception EXAMPLE_PATH += common/math/arithmetic EXAMPLE_PATH += common/simple_junit EXAMPLE_PATH += common/status_monitor +EXAMPLE_PATH += mock/cpp_mock_scenarios EXAMPLE_PATH += simulation/traffic_simulator INPUT_ENCODING = UTF-8 diff --git a/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp b/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp index 5827274b922..68d4ab501b1 100644 --- a/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp +++ b/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class AccelerateAndFollowScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -82,3 +84,5 @@ int main(int argc, char * argv[]) rclcpp::shutdown(); return 0; } + +} // namespace cpp_mock_scenarios From f5655e6fb3052799bb2fdb0395c094f740db6b6e Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Fri, 20 Oct 2023 17:52:13 +0900 Subject: [PATCH 04/30] add namespace Signed-off-by: Masaya Kataoka --- .../src/follow_front_entity/accelerate_and_follow.cpp | 3 +-- .../src/follow_front_entity/decelerate_and_follow.cpp | 3 +++ .../src/follow_lane/acquire_position_in_world_frame.cpp | 3 +++ .../src/follow_lane/assign_route_in_world_frame.cpp | 3 +++ mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp | 3 +++ mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp | 3 +++ mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp | 3 +++ .../src/lane_change/lanechange_left_with_id.cpp | 3 +++ mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp | 3 +++ .../src/lane_change/lanechange_linear_lateral_velocity.cpp | 3 +++ .../src/lane_change/lanechange_linear_time.cpp | 3 +++ .../src/lane_change/lanechange_longitudinal_distance.cpp | 3 +++ mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp | 3 +++ .../src/lane_change/lanechange_right_with_id.cpp | 3 +++ mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp | 3 +++ 15 files changed, 43 insertions(+), 2 deletions(-) diff --git a/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp b/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp index 68d4ab501b1..4bc4c1ac92b 100644 --- a/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp +++ b/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp @@ -74,6 +74,7 @@ class AccelerateAndFollowScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestSpeedChange("npc", 10, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { @@ -84,5 +85,3 @@ int main(int argc, char * argv[]) rclcpp::shutdown(); return 0; } - -} // namespace cpp_mock_scenarios diff --git a/mock/cpp_mock_scenarios/src/follow_front_entity/decelerate_and_follow.cpp b/mock/cpp_mock_scenarios/src/follow_front_entity/decelerate_and_follow.cpp index 8931f3a022d..9d3c5e873e1 100644 --- a/mock/cpp_mock_scenarios/src/follow_front_entity/decelerate_and_follow.cpp +++ b/mock/cpp_mock_scenarios/src/follow_front_entity/decelerate_and_follow.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class DecelerateAndFollowScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -72,6 +74,7 @@ class DecelerateAndFollowScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestSpeedChange("npc", 10, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp b/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp index abfa4eefb97..a5dc395bc4e 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class AcquirePositionInWorldFrame : public cpp_mock_scenarios::CppScenarioNode { public: @@ -61,6 +63,7 @@ class AcquirePositionInWorldFrame : public cpp_mock_scenarios::CppScenarioNode api_.requestAcquirePosition("ego", goal_pose); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp b/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp index b279d94e018..73bb12db1d1 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class AcquireRouteInWorldFrame : public cpp_mock_scenarios::CppScenarioNode { public: @@ -62,6 +64,7 @@ class AcquireRouteInWorldFrame : public cpp_mock_scenarios::CppScenarioNode api_.requestAssignRoute("ego", goal_poses); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp b/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp index b43613d90fe..2461561323f 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class CancelRequest : public cpp_mock_scenarios::CppScenarioNode { public: @@ -65,6 +67,7 @@ class CancelRequest : public cpp_mock_scenarios::CppScenarioNode api_.requestAcquirePosition("ego", goal_pose); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp b/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp index 7a2d993323c..b8a16c57291 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class FollowLaneWithOffset : public cpp_mock_scenarios::CppScenarioNode { public: @@ -62,6 +64,7 @@ class FollowLaneWithOffset : public cpp_mock_scenarios::CppScenarioNode api_.requestSpeedChange("ego", 10, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp index f8f9a375ba3..c58a490cc28 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -61,6 +63,7 @@ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestLaneChange("ego", traffic_simulator::lane_change::Direction::LEFT); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp index 5e54efbe160..9d0f00172e3 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -61,6 +63,7 @@ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestLaneChange("ego", 34513); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp index 45d11797537..a9b4e2b7d44 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -71,6 +73,7 @@ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode traffic_simulator::lane_change::Constraint::Type::LONGITUDINAL_DISTANCE, 30.0)); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp index f02af3df49b..e3eba711247 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -75,6 +77,7 @@ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode traffic_simulator::lane_change::Constraint::Type::LATERAL_VELOCITY, 1.0)); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp index 75e693f0520..d1b395c7e63 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -74,6 +76,7 @@ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode traffic_simulator::lane_change::Constraint::Type::TIME, 20.0)); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp index b0af0c5f967..92dc9221d08 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -63,6 +65,7 @@ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode traffic_simulator::lane_change::Constraint::Type::LONGITUDINAL_DISTANCE, 3.0)); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp index 17226106ff7..01dc0e457af 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeRightScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -62,6 +64,7 @@ class LaneChangeRightScenario : public cpp_mock_scenarios::CppScenarioNode // api_.requestLaneChange("ego", 34462); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp index 7682bde98fd..4b906956430 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeRightScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -61,6 +63,7 @@ class LaneChangeRightScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestLaneChange("ego", 34462); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp index 4f7ada57efe..ae4798f420b 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -74,6 +76,7 @@ class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode traffic_simulator::lane_change::Constraint::Type::TIME, 20.0)); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { From 21d62bae532fa4486b26105f64dcc4eca28a7969 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Fri, 20 Oct 2023 17:54:49 +0900 Subject: [PATCH 05/30] rename scenario classes Signed-off-by: Masaya Kataoka --- .../src/lane_change/lanechange_left_with_id.cpp | 6 +++--- .../src/lane_change/lanechange_linear.cpp | 6 +++--- .../src/lane_change/lanechange_linear_lateral_velocity.cpp | 6 +++--- .../src/lane_change/lanechange_linear_time.cpp | 6 +++--- .../src/lane_change/lanechange_longitudinal_distance.cpp | 6 +++--- mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp index 9d0f00172e3..596109da425 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLeftWithIdScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLeftScenario(const rclcpp::NodeOptions & option) + explicit LaneChangeLeftWithIdScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -69,7 +69,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp index a9b4e2b7d44..55b5f2f95f8 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLinear : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLeftScenario(const rclcpp::NodeOptions & option) + explicit LaneChangeLinear(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -79,7 +79,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp index e3eba711247..7132e3e6379 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLinearLateralVelocity : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLeftScenario(const rclcpp::NodeOptions & option) + explicit LaneChangeLinearLateralVelocity(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -83,7 +83,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp index d1b395c7e63..b239728d463 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLinearTime : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLeftScenario(const rclcpp::NodeOptions & option) + explicit LaneChangeLinearTime(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -82,7 +82,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp index 92dc9221d08..334c5d672a9 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLongitudinalDistance : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLeftScenario(const rclcpp::NodeOptions & option) + explicit LaneChangeLongitudinalDistance(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -71,7 +71,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp index ae4798f420b..902d3f777fc 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLeftScenario : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeTime : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLeftScenario(const rclcpp::NodeOptions & option) + explicit LaneChangeTime(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -82,7 +82,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; From 1188f1fabd4fe9d104b4361aff71f6e667fd336f Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Fri, 20 Oct 2023 18:02:55 +0900 Subject: [PATCH 06/30] add namespace Signed-off-by: Masaya Kataoka --- .../src/behavior_plugin/load_do_nothing_plugin.cpp | 9 ++++++--- mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp | 3 +++ .../src/collision/spawn_with_offset.cpp | 3 +++ .../src/crosswalk/stop_at_crosswalk.cpp | 3 +++ .../src/follow_lane/acquire_position_in_world_frame.cpp | 6 +++--- .../src/follow_lane/assign_route_in_world_frame.cpp | 6 +++--- .../src/follow_lane/cancel_request.cpp | 8 ++++---- 7 files changed, 25 insertions(+), 13 deletions(-) diff --git a/mock/cpp_mock_scenarios/src/behavior_plugin/load_do_nothing_plugin.cpp b/mock/cpp_mock_scenarios/src/behavior_plugin/load_do_nothing_plugin.cpp index d2c3286f44d..21f1118e5ad 100644 --- a/mock/cpp_mock_scenarios/src/behavior_plugin/load_do_nothing_plugin.cpp +++ b/mock/cpp_mock_scenarios/src/behavior_plugin/load_do_nothing_plugin.cpp @@ -26,11 +26,13 @@ #include #include +namespace cpp_mock_scenarios +{ /// @note Test case to verify if the do_nothing plugin can be loaded. -class LoadDoNothingPlugin : public cpp_mock_scenarios::CppScenarioNode +class LoadDoNothingPluginScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LoadDoNothingPlugin(const rclcpp::NodeOptions & option) + explicit LoadDoNothingPluginScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "crashing_npc", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "private_road_and_walkway_ele_fix/lanelet2_map.osm", __FILE__, false, option) @@ -62,12 +64,13 @@ class LoadDoNothingPlugin : public cpp_mock_scenarios::CppScenarioNode traffic_simulator::entity::PedestrianEntity::BuiltinBehavior::doNothing()); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp b/mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp index 90072e4c60f..e940f5ac048 100644 --- a/mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp +++ b/mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class CrashingNpcScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -69,6 +71,7 @@ class CrashingNpcScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestSpeedChange("npc", 5, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp b/mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp index 93fbf55abab..c58dd9d3241 100644 --- a/mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp +++ b/mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class SpawnWithOffsetScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -64,6 +66,7 @@ class SpawnWithOffsetScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestSpeedChange("bob", 0, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp b/mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp index 4baad67bb6c..1e2556142fd 100644 --- a/mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp +++ b/mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class StopAtCrosswalkScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -99,6 +101,7 @@ class StopAtCrosswalkScenario : public cpp_mock_scenarios::CppScenarioNode private: bool lanechange_executed_; }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp b/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp index a5dc395bc4e..c31499cb2ca 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class AcquirePositionInWorldFrame : public cpp_mock_scenarios::CppScenarioNode +class AcquirePositionInWorldFrameScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit AcquirePositionInWorldFrame(const rclcpp::NodeOptions & option) + explicit AcquirePositionInWorldFrameScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "acquire_position_in_world_frame", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", @@ -69,7 +69,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp b/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp index 73bb12db1d1..7bb617169e3 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class AcquireRouteInWorldFrame : public cpp_mock_scenarios::CppScenarioNode +class AcquireRouteInWorldFrameScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit AcquireRouteInWorldFrame(const rclcpp::NodeOptions & option) + explicit AcquireRouteInWorldFrameScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "assign_route_in_world_frame", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", @@ -70,7 +70,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp b/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp index 2461561323f..93bee6170e1 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class CancelRequest : public cpp_mock_scenarios::CppScenarioNode +class CancelRequestScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit CancelRequest(const rclcpp::NodeOptions & option) + explicit CancelRequestScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "cancel_request", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -47,7 +47,7 @@ class CancelRequest : public cpp_mock_scenarios::CppScenarioNode "ego", api_.canonicalize(traffic_simulator::helper::constructLaneletPose(34513, 30, 0, 0, 0, 0)), 3.0)) { - api_.cancelRequest("ego"); + api_.CancelRequestScenario("ego"); canceled = true; } if (api_.isInLanelet("ego", 34507, 0.1)) { @@ -73,7 +73,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; From 2dd941d3969595341fa7bced0f989cff810aab72 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Fri, 20 Oct 2023 18:13:53 +0900 Subject: [PATCH 07/30] rename scenario class Signed-off-by: Masaya Kataoka --- .../src/follow_lane/follow_with_offset.cpp | 6 +++--- .../src/lane_change/lanechange_linear.cpp | 6 +++--- .../lane_change/lanechange_linear_lateral_velocity.cpp | 6 +++--- .../src/lane_change/lanechange_linear_time.cpp | 6 +++--- .../lane_change/lanechange_longitudinal_distance.cpp | 6 +++--- .../src/lane_change/lanechange_right_with_id.cpp | 6 +++--- .../src/lane_change/lanechange_time.cpp | 6 +++--- .../get_distance_in_lane_coordinate_distance.cpp | 3 +++ .../src/measurement/get_distance_to_lane_bound.cpp | 3 +++ mock/cpp_mock_scenarios/src/merge/merge_left.cpp | 3 +++ .../src/metrics/traveled_distance.cpp | 3 +++ .../src/move_backward/move_backward.cpp | 3 +++ .../src/pedestrian/walk_straight.cpp | 3 +++ .../src/speed_planning/request_speed_change.cpp | 3 +++ .../request_speed_change_continuous_false.cpp | 9 ++++++--- .../speed_planning/request_speed_change_relative.cpp | 3 +++ .../src/speed_planning/request_speed_change_step.cpp | 9 ++++++--- .../request_speed_change_with_time_constraint.cpp | 9 ++++++--- ...equest_speed_change_with_time_constraint_linear.cpp | 10 +++++++--- ...uest_speed_change_with_time_constraint_relative.cpp | 10 +++++++--- 20 files changed, 77 insertions(+), 36 deletions(-) diff --git a/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp b/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp index b8a16c57291..17d0e6f9e79 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class FollowLaneWithOffset : public cpp_mock_scenarios::CppScenarioNode +class FollowLaneWithOffsetScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit FollowLaneWithOffset(const rclcpp::NodeOptions & option) + explicit FollowLaneWithOffsetScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "follow_lane_with_offset", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", @@ -70,7 +70,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp index 55b5f2f95f8..4808d4d65a8 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLinear : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLinearScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLinear(const rclcpp::NodeOptions & option) + explicit LaneChangeLinearScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -79,7 +79,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp index 7132e3e6379..a2370b58c72 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLinearLateralVelocity : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLinearLateralVelocityScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLinearLateralVelocity(const rclcpp::NodeOptions & option) + explicit LaneChangeLinearLateralVelocityScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -83,7 +83,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp index b239728d463..54d03773511 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLinearTime : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLinearTimeScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLinearTime(const rclcpp::NodeOptions & option) + explicit LaneChangeLinearTimeScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -82,7 +82,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp index 334c5d672a9..83d1526d82d 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeLongitudinalDistance : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeLongitudinalDistanceScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeLongitudinalDistance(const rclcpp::NodeOptions & option) + explicit LaneChangeLongitudinalDistanceScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -71,7 +71,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp index 4b906956430..05718f910f3 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeRightScenario : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeRightWithIdScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeRightScenario(const rclcpp::NodeOptions & option) + explicit LaneChangeRightWithIdScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -69,7 +69,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp index 902d3f777fc..a8f5505094d 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class LaneChangeTime : public cpp_mock_scenarios::CppScenarioNode +class LaneChangeTimeScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit LaneChangeTime(const rclcpp::NodeOptions & option) + explicit LaneChangeTimeScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "lanechange_left", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -82,7 +82,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/measurement/get_distance_in_lane_coordinate_distance.cpp b/mock/cpp_mock_scenarios/src/measurement/get_distance_in_lane_coordinate_distance.cpp index 07b457e98c6..b898cd6822b 100644 --- a/mock/cpp_mock_scenarios/src/measurement/get_distance_in_lane_coordinate_distance.cpp +++ b/mock/cpp_mock_scenarios/src/measurement/get_distance_in_lane_coordinate_distance.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class GetDistanceInLaneCoordinateScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -113,6 +115,7 @@ class GetDistanceInLaneCoordinateScenario : public cpp_mock_scenarios::CppScenar api_.requestSpeedChange("behind", 3, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/measurement/get_distance_to_lane_bound.cpp b/mock/cpp_mock_scenarios/src/measurement/get_distance_to_lane_bound.cpp index 55fdb61c80b..fd412fdcd3d 100644 --- a/mock/cpp_mock_scenarios/src/measurement/get_distance_to_lane_bound.cpp +++ b/mock/cpp_mock_scenarios/src/measurement/get_distance_to_lane_bound.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class GetDistanceToLaneBoundScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -62,6 +64,7 @@ class GetDistanceToLaneBoundScenario : public cpp_mock_scenarios::CppScenarioNod api_.requestSpeedChange("ego", 3, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/merge/merge_left.cpp b/mock/cpp_mock_scenarios/src/merge/merge_left.cpp index 9c9ae898aad..aeb4c794093 100644 --- a/mock/cpp_mock_scenarios/src/merge/merge_left.cpp +++ b/mock/cpp_mock_scenarios/src/merge/merge_left.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class MergeLeftScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -70,6 +72,7 @@ class MergeLeftScenario : public cpp_mock_scenarios::CppScenarioNode api_.setLinearVelocity("npc", 10); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp b/mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp index a7d09d94241..48246757e8b 100644 --- a/mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp +++ b/mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp @@ -31,6 +31,8 @@ #include #include +namespace cpp_mock_scenarios +{ class TraveledDistanceScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -72,6 +74,7 @@ class TraveledDistanceScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestSpeedChange("ego", 3, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp b/mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp index c921bd7e1a4..7aa58265456 100644 --- a/mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp +++ b/mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class MoveBackwardScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -60,6 +62,7 @@ class MoveBackwardScenario : public cpp_mock_scenarios::CppScenarioNode api_.requestSpeedChange("ego", -3, true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp b/mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp index a609bda48ad..ca8142b93d7 100644 --- a/mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp +++ b/mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class StopAtCrosswalkScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -96,6 +98,7 @@ class StopAtCrosswalkScenario : public cpp_mock_scenarios::CppScenarioNode private: bool lanechange_executed_; }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change.cpp index f344229a5e9..73f3b542008 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -77,6 +79,7 @@ class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_continuous_false.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_continuous_false.cpp index 2ccbd46392f..424bc97137f 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_continuous_false.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_continuous_false.cpp @@ -26,10 +26,12 @@ #include #include -class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode +namespace cpp_mock_scenarios +{ +class RequestSpeedChangeContinuousFalseScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit RequestSpeedChangeScenario(const rclcpp::NodeOptions & option) + explicit RequestSpeedChangeContinuousFalseScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "request_speed_change", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", @@ -74,12 +76,13 @@ class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode false); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_relative.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_relative.cpp index 1d9aba15648..d54ff8a5333 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_relative.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_relative.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class RequestSpeedChangeRelativeScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -75,6 +77,7 @@ class RequestSpeedChangeRelativeScenario : public cpp_mock_scenarios::CppScenari true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_step.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_step.cpp index 883d8c2f10f..dae2e9aba03 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_step.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_step.cpp @@ -26,10 +26,12 @@ #include #include -class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode +namespace cpp_mock_scenarios +{ +class RequestSpeedChangeStepScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit RequestSpeedChangeScenario(const rclcpp::NodeOptions & option) + explicit RequestSpeedChangeStepScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "request_speed_change_step", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", @@ -74,12 +76,13 @@ class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint.cpp index 0be22823823..29eb1bb0d40 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint.cpp @@ -26,10 +26,12 @@ #include #include -class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode +namespace cpp_mock_scenarios +{ +class RequestSpeedChangeWithTimeConstraintScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit RequestSpeedChangeScenario(const rclcpp::NodeOptions & option) + explicit RequestSpeedChangeWithTimeConstraintScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "request_speed_change_with_time_constraint", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", @@ -78,12 +80,13 @@ class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_linear.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_linear.cpp index e8fc5719a0b..281404a6ae2 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_linear.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_linear.cpp @@ -26,10 +26,13 @@ #include #include -class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode +namespace cpp_mock_scenarios +{ +class RequestSpeedChangeWithTimeConstraintLinearScenario +: public cpp_mock_scenarios::CppScenarioNode { public: - explicit RequestSpeedChangeScenario(const rclcpp::NodeOptions & option) + explicit RequestSpeedChangeWithTimeConstraintLinearScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "request_speed_change_with_time_constraint_linear", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", @@ -63,12 +66,13 @@ class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode false); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_relative.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_relative.cpp index d94785630c8..8e33ad28c85 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_relative.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_relative.cpp @@ -26,10 +26,13 @@ #include #include -class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode +namespace cpp_mock_scenarios +{ +class RequestSpeedChangeWithTimeConstraintRelativeScenario +: public cpp_mock_scenarios::CppScenarioNode { public: - explicit RequestSpeedChangeScenario(const rclcpp::NodeOptions & option) + explicit RequestSpeedChangeWithTimeConstraintRelativeScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "request_speed_change_with_time_constraint_relative", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", @@ -81,12 +84,13 @@ class RequestSpeedChangeScenario : public cpp_mock_scenarios::CppScenarioNode true); } }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; From 7e86e5be4ef6083d9771a4ea1249c6e9fe191b64 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Tue, 24 Oct 2023 18:01:59 +0900 Subject: [PATCH 08/30] add comment Signed-off-by: Masaya Kataoka --- Doxyfile | 4 ++++ .../include/traffic_simulator/api/api.hpp | 5 +++++ .../include/traffic_simulator/data_type/speed_change.hpp | 6 +++--- .../include/traffic_simulator/entity/entity_base.hpp | 7 ++++++- .../include/traffic_simulator/entity/entity_manager.hpp | 5 +++++ 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Doxyfile b/Doxyfile index d175b536f83..6c5f57020b6 100644 --- a/Doxyfile +++ b/Doxyfile @@ -50,7 +50,9 @@ FILE_PATTERNS += *.hpp FILE_PATTERNS += *.cpp FILE_PATTERNS += *.md +EXPAND_AS_DEFINED += DEFINE_CHECK_FUNCTION EXPAND_AS_DEFINED += DEFINE_ERROR_CATEGORY +EXPAND_AS_DEFINED += DEFINE_GETTER EXPAND_AS_DEFINED += EXPECT_ACCEL_EQ EXPAND_AS_DEFINED += EXPECT_ACTION_STATUS_EQ EXPAND_AS_DEFINED += EXPECT_DECIMAL_EQ @@ -61,6 +63,8 @@ EXPAND_AS_DEFINED += EXPECT_POSE_EQ EXPAND_AS_DEFINED += EXPECT_QUATERNION_EQ EXPAND_AS_DEFINED += EXPECT_TWIST_EQ EXPAND_AS_DEFINED += EXPECT_VECTOR3_EQ +EXPAND_AS_DEFINED += FORWARD_TO_ENTITY +EXPAND_AS_DEFINED += FORWARD_TO_ENTITY_MANAGER EXPAND_AS_DEFINED += TEST EXPAND_AS_DEFINED += THROW_ERROR EXPAND_AS_DEFINED += THROW_SEMANTIC_ERROR diff --git a/simulation/traffic_simulator/include/traffic_simulator/api/api.hpp b/simulation/traffic_simulator/include/traffic_simulator/api/api.hpp index 44b999ad8b7..093e0c17879 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/api/api.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/api/api.hpp @@ -272,6 +272,11 @@ class API const lane_change::Constraint & constraint); #define FORWARD_TO_ENTITY_MANAGER(NAME) \ + /*! \ + @brief Forward to arguments to the EntityManager::NAME function. \ + @return return value of the EntityManager::NAME function. \ + @note This function was defined by FORWARD_TO_ENTITY_MANAGER macro. \ + */ \ template \ decltype(auto) NAME(Ts &&... xs) \ { \ diff --git a/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp b/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp index 0cfa778e860..39a27c3d29e 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp @@ -24,9 +24,9 @@ namespace traffic_simulator namespace speed_change { enum class Transition { - // @todo CUBIC, + // @todo Add CUBIC transition type. LINEAR, - // @todo SINUSOIDAL, + // @todo Add SINUSOIDAL transition type. STEP, AUTO }; @@ -34,7 +34,7 @@ enum class Transition { struct Constraint { enum class Type { - // @todo DISTANCE, + // @todo Add DISTANCE constraint type. LONGITUDINAL_ACCELERATION, TIME, NONE diff --git a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp index 71c31221ed4..7626a45e906 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp @@ -61,7 +61,12 @@ class EntityBase virtual void cancelRequest(); -#define DEFINE_GETTER(NAME, TYPE, RETURN_VARIABLE) \ +#define DEFINE_GETTER(NAME, TYPE, RETURN_VARIABLE) \ + /** \ + @brief Get NAME of the entity. \ + @return NAME of the entity. \ + @note This function was defined by DEFINE_GETTER function . \ + */ \ /* */ auto get##NAME() const noexcept->TYPE { return RETURN_VARIABLE; } // clang-format off diff --git a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp index d313f84e21c..00501a7ca75 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp @@ -245,6 +245,11 @@ class EntityManager #undef FORWARD_TO_HDMAP_UTILS #define FORWARD_TO_ENTITY(IDENTIFIER, ...) \ + /*! \ + @brief Forward to arguments to the EntityBase::IDENTIFIER function. \ + @return return value of the EntityBase::IDENTIFIER function. \ + @note This function was defined by FORWARD_TO_ENTITY macro.        \ + */ \ template \ decltype(auto) IDENTIFIER(const std::string & name, Ts &&... xs) __VA_ARGS__ \ try { \ From 21bb6fe46c8f1ffa606b7003a2682d0a2878983f Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Tue, 24 Oct 2023 18:53:41 +0900 Subject: [PATCH 09/30] add simulation package Signed-off-by: Masaya Kataoka --- Doxyfile | 13 +++++++++++++ .../traffic_simulator/entity/entity_base.hpp | 3 +++ 2 files changed, 16 insertions(+) diff --git a/Doxyfile b/Doxyfile index 6c5f57020b6..fa8a77369da 100644 --- a/Doxyfile +++ b/Doxyfile @@ -20,6 +20,10 @@ INPUT += common/scenario_simulator_exception INPUT += common/simple_junit INPUT += common/status_monitor INPUT += mock/cpp_mock_scenarios +INPUT += simulation/behavior_tree_plugin +INPUT += simulation/do_nothing_plugin +INPUT += simulation/simple_sensor_simulator +INPUT += simulation/simulation_interface INPUT += simulation/traffic_simulator IMAGE_PATH += common/math/geometry @@ -28,6 +32,10 @@ IMAGE_PATH += common/scenario_simulator_exception IMAGE_PATH += common/simple_junit IMAGE_PATH += common/status_monitor IMAGE_PATH += mock/cpp_mock_scenarios +IMAGE_PATH += simulation/behavior_tree_plugin +IMAGE_PATH += simulation/do_nothing_plugin +IMAGE_PATH += simulation/simple_sensor_simulator +IMAGE_PATH += simulation/simulation_interface IMAGE_PATH += simulation/traffic_simulator EXAMPLE_PATH += common/math/geometry @@ -36,6 +44,10 @@ EXAMPLE_PATH += common/math/arithmetic EXAMPLE_PATH += common/simple_junit EXAMPLE_PATH += common/status_monitor EXAMPLE_PATH += mock/cpp_mock_scenarios +EXAMPLE_PATH += simulation/behavior_tree_plugin +EXAMPLE_PATH += simulation/do_nothing_plugin +EXAMPLE_PATH += simulation/simple_sensor_simulator +EXAMPLE_PATH += simulation/simulation_interface EXAMPLE_PATH += simulation/traffic_simulator INPUT_ENCODING = UTF-8 @@ -53,6 +65,7 @@ FILE_PATTERNS += *.md EXPAND_AS_DEFINED += DEFINE_CHECK_FUNCTION EXPAND_AS_DEFINED += DEFINE_ERROR_CATEGORY EXPAND_AS_DEFINED += DEFINE_GETTER +EXPAND_AS_DEFINED += DEFINE_GETTER_SETTER EXPAND_AS_DEFINED += EXPECT_ACCEL_EQ EXPAND_AS_DEFINED += EXPECT_ACTION_STATUS_EQ EXPAND_AS_DEFINED += EXPECT_DECIMAL_EQ diff --git a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp index 7626a45e906..f104444f7b2 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp @@ -85,6 +85,9 @@ class EntityBase #undef DEFINE_GETTER #define DEFINE_CHECK_FUNCTION(FUNCTION_NAME, BOOL_VARIABLE) \ + /** \ + @note This function was defined by DEFINE_CHECK_FUNCTION function . \ + */ \ /* */ auto FUNCTION_NAME() const->bool { return BOOL_VARIABLE; } // clang-format off From fdc10b3f8cac3164469345c9c42147d13fcf7763 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Tue, 24 Oct 2023 18:56:52 +0900 Subject: [PATCH 10/30] add concealer Signed-off-by: Masaya Kataoka --- Doxyfile | 3 +++ mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Doxyfile b/Doxyfile index fa8a77369da..e1847cf77c7 100644 --- a/Doxyfile +++ b/Doxyfile @@ -19,6 +19,7 @@ INPUT += common/math/arithmetic INPUT += common/scenario_simulator_exception INPUT += common/simple_junit INPUT += common/status_monitor +INPUT += external/concealer INPUT += mock/cpp_mock_scenarios INPUT += simulation/behavior_tree_plugin INPUT += simulation/do_nothing_plugin @@ -31,6 +32,7 @@ IMAGE_PATH += common/math/arithmetic IMAGE_PATH += common/scenario_simulator_exception IMAGE_PATH += common/simple_junit IMAGE_PATH += common/status_monitor +IMAGE_PATH += external/concealer IMAGE_PATH += mock/cpp_mock_scenarios IMAGE_PATH += simulation/behavior_tree_plugin IMAGE_PATH += simulation/do_nothing_plugin @@ -43,6 +45,7 @@ EXAMPLE_PATH += common/scenario_simulator_exception EXAMPLE_PATH += common/math/arithmetic EXAMPLE_PATH += common/simple_junit EXAMPLE_PATH += common/status_monitor +EXAMPLE_PATH += external/concealer EXAMPLE_PATH += mock/cpp_mock_scenarios EXAMPLE_PATH += simulation/behavior_tree_plugin EXAMPLE_PATH += simulation/do_nothing_plugin diff --git a/mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp b/mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp index b3dda2b5693..4f3ebd1b009 100644 --- a/mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp +++ b/mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp @@ -26,6 +26,8 @@ #include #include +namespace cpp_mock_scenarios +{ class TrafficSimulationDemoScenario : public cpp_mock_scenarios::CppScenarioNode { public: @@ -146,6 +148,7 @@ class TrafficSimulationDemoScenario : public cpp_mock_scenarios::CppScenarioNode private: bool lanechange_executed_; }; +} // namespace cpp_mock_scenarios int main(int argc, char * argv[]) { From 41ee2ec6c2bd927cdbbd4d3b8215a98b99029ef0 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Tue, 24 Oct 2023 18:59:40 +0900 Subject: [PATCH 11/30] update Doxyfile Signed-off-by: Masaya Kataoka --- Doxyfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Doxyfile b/Doxyfile index e1847cf77c7..9f3dabe0a25 100644 --- a/Doxyfile +++ b/Doxyfile @@ -69,6 +69,8 @@ EXPAND_AS_DEFINED += DEFINE_CHECK_FUNCTION EXPAND_AS_DEFINED += DEFINE_ERROR_CATEGORY EXPAND_AS_DEFINED += DEFINE_GETTER EXPAND_AS_DEFINED += DEFINE_GETTER_SETTER +EXPAND_AS_DEFINED += DEFINE_STATIC_DATA_MEMBER_DETECTOR +EXPAND_AS_DEFINED += EMPLACE EXPAND_AS_DEFINED += EXPECT_ACCEL_EQ EXPAND_AS_DEFINED += EXPECT_ACTION_STATUS_EQ EXPAND_AS_DEFINED += EXPECT_DECIMAL_EQ From 1187c84e69ef5b3125408ac93522246f98c5acf0 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Tue, 24 Oct 2023 19:03:46 +0900 Subject: [PATCH 12/30] add interpretor Signed-off-by: Masaya Kataoka --- Doxyfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Doxyfile b/Doxyfile index 9f3dabe0a25..537ca5958ee 100644 --- a/Doxyfile +++ b/Doxyfile @@ -26,6 +26,7 @@ INPUT += simulation/do_nothing_plugin INPUT += simulation/simple_sensor_simulator INPUT += simulation/simulation_interface INPUT += simulation/traffic_simulator +INPUT += openscenario/openscenario_interpreter IMAGE_PATH += common/math/geometry IMAGE_PATH += common/math/arithmetic @@ -39,6 +40,7 @@ IMAGE_PATH += simulation/do_nothing_plugin IMAGE_PATH += simulation/simple_sensor_simulator IMAGE_PATH += simulation/simulation_interface IMAGE_PATH += simulation/traffic_simulator +IMAGE_PATH += openscenario/openscenario_interpreter EXAMPLE_PATH += common/math/geometry EXAMPLE_PATH += common/scenario_simulator_exception @@ -52,6 +54,7 @@ EXAMPLE_PATH += simulation/do_nothing_plugin EXAMPLE_PATH += simulation/simple_sensor_simulator EXAMPLE_PATH += simulation/simulation_interface EXAMPLE_PATH += simulation/traffic_simulator +EXAMPLE_PATH += openscenario/openscenario_interpreter INPUT_ENCODING = UTF-8 MACRO_EXPANSION = YES @@ -65,10 +68,13 @@ FILE_PATTERNS += *.hpp FILE_PATTERNS += *.cpp FILE_PATTERNS += *.md +EXPAND_AS_DEFINED += BOILERPLATE +EXPAND_AS_DEFINED += CASE EXPAND_AS_DEFINED += DEFINE_CHECK_FUNCTION EXPAND_AS_DEFINED += DEFINE_ERROR_CATEGORY EXPAND_AS_DEFINED += DEFINE_GETTER EXPAND_AS_DEFINED += DEFINE_GETTER_SETTER +EXPAND_AS_DEFINED += DEFINE_LAZY_VISITOR EXPAND_AS_DEFINED += DEFINE_STATIC_DATA_MEMBER_DETECTOR EXPAND_AS_DEFINED += EMPLACE EXPAND_AS_DEFINED += EXPECT_ACCEL_EQ From 0f1bd5b204d4cd1aa4f26738ae2988e4acfe5cb8 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Tue, 24 Oct 2023 19:13:40 +0900 Subject: [PATCH 13/30] update doxyfile Signed-off-by: Masaya Kataoka --- Doxyfile | 11 +++++++++++ .../traffic_simulator/entity/entity_manager.hpp | 5 +++++ 2 files changed, 16 insertions(+) diff --git a/Doxyfile b/Doxyfile index 537ca5958ee..a899bd45377 100644 --- a/Doxyfile +++ b/Doxyfile @@ -27,6 +27,9 @@ INPUT += simulation/simple_sensor_simulator INPUT += simulation/simulation_interface INPUT += simulation/traffic_simulator INPUT += openscenario/openscenario_interpreter +INPUT += openscenario/openscenario_interpreter_example +INPUT += openscenario/openscenario_preprocessor +INPUT += openscenario/openscenario_visualization IMAGE_PATH += common/math/geometry IMAGE_PATH += common/math/arithmetic @@ -41,6 +44,9 @@ IMAGE_PATH += simulation/simple_sensor_simulator IMAGE_PATH += simulation/simulation_interface IMAGE_PATH += simulation/traffic_simulator IMAGE_PATH += openscenario/openscenario_interpreter +IMAGE_PATH += openscenario/openscenario_interpreter_example +IMAGE_PATH += openscenario/openscenario_preprocessor +IMAGE_PATH += openscenario/openscenario_visualization EXAMPLE_PATH += common/math/geometry EXAMPLE_PATH += common/scenario_simulator_exception @@ -55,6 +61,9 @@ EXAMPLE_PATH += simulation/simple_sensor_simulator EXAMPLE_PATH += simulation/simulation_interface EXAMPLE_PATH += simulation/traffic_simulator EXAMPLE_PATH += openscenario/openscenario_interpreter +EXAMPLE_PATH += openscenario/openscenario_interpreter_example +EXAMPLE_PATH += openscenario/openscenario_preprocessor +EXAMPLE_PATH += openscenario/openscenario_visualization INPUT_ENCODING = UTF-8 MACRO_EXPANSION = YES @@ -87,8 +96,10 @@ EXPAND_AS_DEFINED += EXPECT_POSE_EQ EXPAND_AS_DEFINED += EXPECT_QUATERNION_EQ EXPAND_AS_DEFINED += EXPECT_TWIST_EQ EXPAND_AS_DEFINED += EXPECT_VECTOR3_EQ +EXPAND_AS_DEFINED += FORWARD_GETTER_TO_TRAFFIC_LIGHT_MANAGER EXPAND_AS_DEFINED += FORWARD_TO_ENTITY EXPAND_AS_DEFINED += FORWARD_TO_ENTITY_MANAGER +EXPAND_AS_DEFINED += FORWARD_TO_HDMAP_UTILS EXPAND_AS_DEFINED += TEST EXPAND_AS_DEFINED += THROW_ERROR EXPAND_AS_DEFINED += THROW_SEMANTIC_ERROR diff --git a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp index 00501a7ca75..a69432fcc3c 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp @@ -232,6 +232,11 @@ class EntityManager } #define FORWARD_TO_HDMAP_UTILS(NAME) \ + /*! \ + @brief Forward to arguments to the HDMapUtils::NAME function. \ + @return return value of the HDMapUtils::NAME function. \ + @note This function was defined by FORWARD_TO_HDMAP_UTILS macro. \ + */ \ template \ decltype(auto) NAME(Ts &&... xs) const \ { \ From 5e823c103cbe6a87f1ca833192f7ddf1abe90a1f Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Tue, 24 Oct 2023 19:15:10 +0900 Subject: [PATCH 14/30] remove old documents Signed-off-by: Masaya Kataoka --- .github/workflows/Documentation.yaml | 73 ------------------ docs/package/About.md | 73 ------------------ docs/package/geometry/.gitignore | 2 - docs/package/geometry/Doxyfile | 38 --------- docs/package/geometry/build.sh | 5 -- docs/package/geometry/config.json | 14 ---- .../openscenario_interpreter/.gitignore | 2 - .../package/openscenario_interpreter/Doxyfile | 13 ---- .../package/openscenario_interpreter/build.sh | 5 -- .../openscenario_interpreter/config.json | 14 ---- .../openscenario_visualization/.gitignore | 2 - .../openscenario_visualization/Doxyfile | 13 ---- .../openscenario_visualization/build.sh | 5 -- .../openscenario_visualization/config.json | 14 ---- .../simple_sensor_simulator/.gitignore | 2 - docs/package/simple_sensor_simulator/Doxyfile | 13 ---- docs/package/simple_sensor_simulator/build.sh | 5 -- .../simple_sensor_simulator/config.json | 14 ---- docs/package/simulation_interface/.gitignore | 2 - docs/package/simulation_interface/Doxyfile | 13 ---- docs/package/simulation_interface/build.sh | 5 -- docs/package/simulation_interface/config.json | 14 ---- docs/package/traffic_simulator/.gitignore | 7 -- docs/package/traffic_simulator/Doxyfile | 13 ---- docs/package/traffic_simulator/build.sh | 5 -- docs/package/traffic_simulator/config.json | 14 ---- .../images/get_length_in_hermite_curve.png | Bin 154323 -> 0 bytes mkdocs.yml | 1 - 28 files changed, 381 deletions(-) delete mode 100644 docs/package/About.md delete mode 100644 docs/package/geometry/.gitignore delete mode 100644 docs/package/geometry/Doxyfile delete mode 100644 docs/package/geometry/build.sh delete mode 100644 docs/package/geometry/config.json delete mode 100644 docs/package/openscenario_interpreter/.gitignore delete mode 100644 docs/package/openscenario_interpreter/Doxyfile delete mode 100644 docs/package/openscenario_interpreter/build.sh delete mode 100644 docs/package/openscenario_interpreter/config.json delete mode 100644 docs/package/openscenario_visualization/.gitignore delete mode 100644 docs/package/openscenario_visualization/Doxyfile delete mode 100644 docs/package/openscenario_visualization/build.sh delete mode 100644 docs/package/openscenario_visualization/config.json delete mode 100644 docs/package/simple_sensor_simulator/.gitignore delete mode 100644 docs/package/simple_sensor_simulator/Doxyfile delete mode 100644 docs/package/simple_sensor_simulator/build.sh delete mode 100644 docs/package/simple_sensor_simulator/config.json delete mode 100644 docs/package/simulation_interface/.gitignore delete mode 100644 docs/package/simulation_interface/Doxyfile delete mode 100644 docs/package/simulation_interface/build.sh delete mode 100644 docs/package/simulation_interface/config.json delete mode 100644 docs/package/traffic_simulator/.gitignore delete mode 100644 docs/package/traffic_simulator/Doxyfile delete mode 100644 docs/package/traffic_simulator/build.sh delete mode 100644 docs/package/traffic_simulator/config.json delete mode 100644 docs/package/traffic_simulator/markdown/images/get_length_in_hermite_curve.png diff --git a/.github/workflows/Documentation.yaml b/.github/workflows/Documentation.yaml index c6cefd6091d..228555d819f 100644 --- a/.github/workflows/Documentation.yaml +++ b/.github/workflows/Documentation.yaml @@ -32,79 +32,6 @@ jobs: run: poetry install --no-interaction - name: Install doxygen/depends of doxybook run: sudo apt install -y doxygen wget - - name: Wget package - run: | - wget https://github.com/matusnovak/doxybook2/releases/download/v1.2.3/doxybook2-linux-amd64-v1.2.3.zip - mkdir -p ~/doxybook2 - cp -rf . ~/doxybook2 - cd ~/doxybook2 - unzip doxybook2-linux-amd64-v1.2.3.zip - # generating traffic_simulator package documentation - - name: Generate doxygen for traffic_simulator package - run: | - cd docs/package/traffic_simulator - doxygen Doxyfile - - name: Generate markdown for traffic_simulator package - run: | - export PATH="$PATH:~/doxybook2/bin" - cd docs/package/traffic_simulator - mkdir -p ./markdown/Classes - doxybook2 --input ./build/ --output ./markdown -c config.json - # generating simple_sensor_simulator package documentation - - name: Generate doxygen for simple_sensor_simulator package - run: | - cd docs/package/simple_sensor_simulator - doxygen Doxyfile - - name: Generate markdown for simple_sensor_simulator package - run: | - export PATH="$PATH:~/doxybook2/bin" - cd docs/package/simple_sensor_simulator - mkdir -p ./markdown/Classes - doxybook2 --input ./build/ --output ./markdown -c config.json - # generating simulation_interface package documentation - - name: Generate doxygen for simulation_interface package - run: | - cd docs/package/simulation_interface - doxygen Doxyfile - - name: Generate markdown for simulation_interface package - run: | - export PATH="$PATH:~/doxybook2/bin" - cd docs/package/simulation_interface - mkdir -p ./markdown/Classes - doxybook2 --input ./build/ --output ./markdown -c config.json - # generating openscenario_interpreter package documentation - - name: Generate doxygen for openscenario_interpreter package - run: | - cd docs/package/openscenario_interpreter - doxygen Doxyfile - - name: Generate markdown for openscenario_interpreter package - run: | - export PATH="$PATH:~/doxybook2/bin" - cd docs/package/openscenario_interpreter - mkdir -p ./markdown/Classes - doxybook2 --input ./build/ --output ./markdown -c config.json - # generating openscenario_visualization package documentation - - name: Generate doxygen for openscenario_visualization package - run: | - cd docs/package/openscenario_visualization - doxygen Doxyfile - - name: Generate markdown for openscenario_visualization package - run: | - export PATH="$PATH:~/doxybook2/bin" - cd docs/package/openscenario_visualization - mkdir -p ./markdown/Classes - doxybook2 --input ./build/ --output ./markdown -c config.json - # generating geometry package documentation - - name: Generate doxygen for geometry package - run: | - cd docs/package/geometry - doxygen Doxyfile - - name: Generate markdown for geometry package - run: | - export PATH="$PATH:~/doxybook2/bin" - cd docs/package/geometry - mkdir -p ./markdown/Classes - doxybook2 --input ./build/ --output ./markdown -c config.json - name: Generate documentation run: poetry run mkdocs build - name: Upload Artifact diff --git a/docs/package/About.md b/docs/package/About.md deleted file mode 100644 index d5ce2fc13ae..00000000000 --- a/docs/package/About.md +++ /dev/null @@ -1,73 +0,0 @@ -# Packages -## Simulation Packages ---- - -### Traffic Simulator Package -Traffic simulator for scenario testing. -This package includes NPC logic, API etc... - -![traffic simulator](../image/simple_demo.png "traffic simulator") - -- [Classes](/scenario_simulator_v2-docs/package/traffic_simulator/markdown/Classes) -- [Namespaces](/scenario_simulator_v2-docs/package/traffic_simulator/markdown/Namespaces) -- [Modules](/scenario_simulator_v2-docs/package/traffic_simulator/markdown/Modules) -- [Files](/scenario_simulator_v2-docs/package/traffic_simulator/markdown/Files) -- [Pages](/scenario_simulator_v2-docs/package/traffic_simulator/markdown/Pages) -- [Examples](/scenario_simulator_v2-docs/package/traffic_simulator/markdown/Examples) - -### Simple Sensor Simulator Package -Reference implementation of the simulator integrated with this package. - -![simple sensor simulator](../image/simple_sensor_simulator.png "simple sensor simulator") - -- [Classes](/scenario_simulator_v2-docs/package/simple_sensor_simulator/markdown/Classes) -- [Namespaces](/scenario_simulator_v2-docs/package/simple_sensor_simulator/markdown/Namespaces) -- [Modules](/scenario_simulator_v2-docs/package/simple_sensor_simulator/markdown/Modules) -- [Files](/scenario_simulator_v2-docs/package/simple_sensor_simulator/markdown/Files) -- [Pages](/scenario_simulator_v2-docs/package/simple_sensor_simulator/markdown/Pages) -- [Examples](/scenario_simulator_v2-docs/package/simple_sensor_simulator/markdown/Examples) - -### Simulation Interface Package -Packages provide interface between traffic simulator and sensor simulator. - -- [Classes](/scenario_simulator_v2-docs/package/simulation_interface/markdown/Classes) -- [Namespaces](/scenario_simulator_v2-docs/package/simulation_interface/markdown/Namespaces) -- [Modules](/scenario_simulator_v2-docs/package/simulation_interface/markdown/Modules) -- [Files](/scenario_simulator_v2-docs/package/simulation_interface/markdown/Files) -- [Pages](/scenario_simulator_v2-docs/package/simulation_interface/markdown/Pages) -- [Examples](/scenario_simulator_v2-docs/package/simulation_interface/markdown/Examples) - -## OpenSCENARIO Packages ---- - -### OpenSCENARIO Interpreter Package -Package for parsing .xosc file and send command to the simulator via Traffic simulator. - -- [Classes](/scenario_simulator_v2-docs/package/openscenario_interpreter/markdown/Classes) -- [Namespaces](/scenario_simulator_v2-docs/package/openscenario_interpreter/markdown/Namespaces) -- [Modules](/scenario_simulator_v2-docs/package/openscenario_interpreter/markdown/Modules) -- [Files](/scenario_simulator_v2-docs/package/openscenario_interpreter/markdown/Files) -- [Pages](/scenario_simulator_v2-docs/package/openscenario_interpreter/markdown/Pages) -- [Examples](/scenario_simulator_v2-docs/package/openscenario_interpreter/markdown/Examples) - -### OpenSCENARIO Visualization Package -Package for visualizing the result of the simulation. - -- [Classes](/scenario_simulator_v2-docs/package/openscenario_visualization/markdown/Classes) -- [Namespaces](/scenario_simulator_v2-docs/package/openscenario_visualization/markdown/Namespaces) -- [Modules](/scenario_simulator_v2-docs/package/openscenario_visualization/markdown/Modules) -- [Files](/scenario_simulator_v2-docs/package/openscenario_visualization/markdown/Files) -- [Pages](/scenario_simulator_v2-docs/package/openscenario_visualization/markdown/Pages) -- [Examples](/scenario_simulator_v2-docs/package/openscenario_visualization/markdown/Examples) - -## Math packages - -### Geometry Package -Package for calculating geometry. - -- [Classes](/scenario_simulator_v2-docs/package/geometry/markdown/Classes) -- [Namespaces](/scenario_simulator_v2-docs/package/geometry/markdown/Namespaces) -- [Modules](/scenario_simulator_v2-docs/package/geometry/markdown/Modules) -- [Files](/scenario_simulator_v2-docs/package/geometry/markdown/Files) -- [Pages](/scenario_simulator_v2-docs/package/geometry/markdown/Pages) -- [Examples](/scenario_simulator_v2-docs/package/geometry/markdown/Examples) diff --git a/docs/package/geometry/.gitignore b/docs/package/geometry/.gitignore deleted file mode 100644 index d9450061def..00000000000 --- a/docs/package/geometry/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build -markdown diff --git a/docs/package/geometry/Doxyfile b/docs/package/geometry/Doxyfile deleted file mode 100644 index d9229ab462c..00000000000 --- a/docs/package/geometry/Doxyfile +++ /dev/null @@ -1,38 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 - -ENABLE_PREPROCESSING = YES -EXPAND_ONLY_PREDEF = YES -EXTRACT_ALL = YES -EXTRACT_ANON_NSPACES = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = YES -GENERATE_HTML = YES -GENERATE_LATEX = NO -GENERATE_XML = YES -INPUT = ../../../common/math/geometry -IMAGE_PATH = ../../../common/math/geometry -EXAMPLE_PATH = ../../../common/math/geometry -INPUT_ENCODING = UTF-8 -MACRO_EXPANSION = YES -OUTPUT_DIRECTORY = -OUTPUT_LANGUAGE = English -PROJECT_NAME = Scenario Simulator -RECURSIVE = YES -SKIP_FUNCTION_MACROS = NO -XML_OUTPUT = build - -FILE_PATTERNS += *.hpp -FILE_PATTERNS += *.cpp -FILE_PATTERNS += *.md - -EXPAND_AS_DEFINED += TEST -EXPAND_AS_DEFINED += EXPECT_DECIMAL_EQ -EXPAND_AS_DEFINED += EXPECT_POINT_EQ -EXPAND_AS_DEFINED += EXPECT_VECTOR3_EQ -EXPAND_AS_DEFINED += EXPECT_QUATERNION_EQ -EXPAND_AS_DEFINED += EXPECT_POSE_EQ -EXPAND_AS_DEFINED += EXPECT_LANELET_POSE_EQ -EXPAND_AS_DEFINED += EXPECT_TWIST_EQ -EXPAND_AS_DEFINED += EXPECT_ACCEL_EQ -EXPAND_AS_DEFINED += EXPECT_ACTION_STATUS_EQ -EXPAND_AS_DEFINED += EXPECT_DETECTION_SENSOR_CONFIGURATION_EQ diff --git a/docs/package/geometry/build.sh b/docs/package/geometry/build.sh deleted file mode 100644 index 6fa6b9bfed2..00000000000 --- a/docs/package/geometry/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm -rf output -rm -rf markdown -doxygen Doxyfile -mkdir -p ./markdown/Classes -doxybook2 --input ./build/ --output ./markdown -c config.json diff --git a/docs/package/geometry/config.json b/docs/package/geometry/config.json deleted file mode 100644 index 4e0e4c6fbe3..00000000000 --- a/docs/package/geometry/config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "baseUrl": "/scenario_simulator_v2-docs/package/geometry/markdown/", - "indexInFolders": true, - "indexClassesName": "index", - "indexFilesName": "index", - "indexGroupsName": "index", - "indexNamespacesName": "index", - "indexRelatedPagesName": "index", - "indexExamplesName": "index", - "mainPageInRoot": false, - "mainPageName": "index", - "sort": true, - "linkSuffix" : "" -} diff --git a/docs/package/openscenario_interpreter/.gitignore b/docs/package/openscenario_interpreter/.gitignore deleted file mode 100644 index d9450061def..00000000000 --- a/docs/package/openscenario_interpreter/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build -markdown diff --git a/docs/package/openscenario_interpreter/Doxyfile b/docs/package/openscenario_interpreter/Doxyfile deleted file mode 100644 index 4cd3e054a2b..00000000000 --- a/docs/package/openscenario_interpreter/Doxyfile +++ /dev/null @@ -1,13 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = OpenSCENARIO Interpreter package -OUTPUT_DIRECTORY = -OUTPUT_LANGUAGE = English -ALIASES = -INPUT = ../../../openscenario/openscenario_interpreter -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.hpp *.h *.cpp *.c -GENERATE_XML = YES -GENERATE_HTML = NO -GENERATE_LATEX = NO -XML_OUTPUT = build -RECURSIVE = YES diff --git a/docs/package/openscenario_interpreter/build.sh b/docs/package/openscenario_interpreter/build.sh deleted file mode 100644 index 6fa6b9bfed2..00000000000 --- a/docs/package/openscenario_interpreter/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm -rf output -rm -rf markdown -doxygen Doxyfile -mkdir -p ./markdown/Classes -doxybook2 --input ./build/ --output ./markdown -c config.json diff --git a/docs/package/openscenario_interpreter/config.json b/docs/package/openscenario_interpreter/config.json deleted file mode 100644 index 05f5778f4de..00000000000 --- a/docs/package/openscenario_interpreter/config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "baseUrl": "/scenario_simulator_v2-docs/package/openscenario_interpreter/markdown/", - "indexInFolders": true, - "indexClassesName": "index", - "indexFilesName": "index", - "indexGroupsName": "index", - "indexNamespacesName": "index", - "indexRelatedPagesName": "index", - "indexExamplesName": "index", - "mainPageInRoot": false, - "mainPageName": "index", - "sort": true, - "linkSuffix" : "" -} diff --git a/docs/package/openscenario_visualization/.gitignore b/docs/package/openscenario_visualization/.gitignore deleted file mode 100644 index d9450061def..00000000000 --- a/docs/package/openscenario_visualization/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build -markdown diff --git a/docs/package/openscenario_visualization/Doxyfile b/docs/package/openscenario_visualization/Doxyfile deleted file mode 100644 index 7f668d47446..00000000000 --- a/docs/package/openscenario_visualization/Doxyfile +++ /dev/null @@ -1,13 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = OpenSCENARIO visualization package -OUTPUT_DIRECTORY = -OUTPUT_LANGUAGE = English -ALIASES = -INPUT = ../../../openscenario/openscenario_visualization -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.hpp *.h *.cpp *.c -GENERATE_XML = YES -GENERATE_HTML = NO -GENERATE_LATEX = NO -XML_OUTPUT = build -RECURSIVE = YES diff --git a/docs/package/openscenario_visualization/build.sh b/docs/package/openscenario_visualization/build.sh deleted file mode 100644 index 6fa6b9bfed2..00000000000 --- a/docs/package/openscenario_visualization/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm -rf output -rm -rf markdown -doxygen Doxyfile -mkdir -p ./markdown/Classes -doxybook2 --input ./build/ --output ./markdown -c config.json diff --git a/docs/package/openscenario_visualization/config.json b/docs/package/openscenario_visualization/config.json deleted file mode 100644 index e34982f06e7..00000000000 --- a/docs/package/openscenario_visualization/config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "baseUrl": "/scenario_simulator_v2-docs/package/openscenario_visualization/markdown/", - "indexInFolders": true, - "indexClassesName": "index", - "indexFilesName": "index", - "indexGroupsName": "index", - "indexNamespacesName": "index", - "indexRelatedPagesName": "index", - "indexExamplesName": "index", - "mainPageInRoot": false, - "mainPageName": "index", - "sort": true, - "linkSuffix" : "" -} diff --git a/docs/package/simple_sensor_simulator/.gitignore b/docs/package/simple_sensor_simulator/.gitignore deleted file mode 100644 index d9450061def..00000000000 --- a/docs/package/simple_sensor_simulator/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build -markdown diff --git a/docs/package/simple_sensor_simulator/Doxyfile b/docs/package/simple_sensor_simulator/Doxyfile deleted file mode 100644 index 960c1d797cb..00000000000 --- a/docs/package/simple_sensor_simulator/Doxyfile +++ /dev/null @@ -1,13 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = Simple Sensor Simulator -OUTPUT_DIRECTORY = -OUTPUT_LANGUAGE = English -ALIASES = -INPUT = ../../../simulation/simple_sensor_simulator -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.hpp *.h *.cpp *.c -GENERATE_XML = YES -GENERATE_HTML = NO -GENERATE_LATEX = NO -XML_OUTPUT = build -RECURSIVE = YES diff --git a/docs/package/simple_sensor_simulator/build.sh b/docs/package/simple_sensor_simulator/build.sh deleted file mode 100644 index 6fa6b9bfed2..00000000000 --- a/docs/package/simple_sensor_simulator/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm -rf output -rm -rf markdown -doxygen Doxyfile -mkdir -p ./markdown/Classes -doxybook2 --input ./build/ --output ./markdown -c config.json diff --git a/docs/package/simple_sensor_simulator/config.json b/docs/package/simple_sensor_simulator/config.json deleted file mode 100644 index 0ec70c64109..00000000000 --- a/docs/package/simple_sensor_simulator/config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "baseUrl": "/scenario_simulator_v2/package/simple_sensor_simulator/markdown/", - "indexInFolders": true, - "indexClassesName": "index", - "indexFilesName": "index", - "indexGroupsName": "index", - "indexNamespacesName": "index", - "indexRelatedPagesName": "index", - "indexExamplesName": "index", - "mainPageInRoot": false, - "mainPageName": "index", - "sort": true, - "linkSuffix" : "" -} diff --git a/docs/package/simulation_interface/.gitignore b/docs/package/simulation_interface/.gitignore deleted file mode 100644 index d9450061def..00000000000 --- a/docs/package/simulation_interface/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build -markdown diff --git a/docs/package/simulation_interface/Doxyfile b/docs/package/simulation_interface/Doxyfile deleted file mode 100644 index f6fd406988d..00000000000 --- a/docs/package/simulation_interface/Doxyfile +++ /dev/null @@ -1,13 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = Simulation Interface -OUTPUT_DIRECTORY = -OUTPUT_LANGUAGE = English -ALIASES = -INPUT = ../../../simulation/simulation_interface -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.hpp *.h *.cpp *.c -GENERATE_XML = YES -GENERATE_HTML = NO -GENERATE_LATEX = NO -XML_OUTPUT = build -RECURSIVE = YES diff --git a/docs/package/simulation_interface/build.sh b/docs/package/simulation_interface/build.sh deleted file mode 100644 index 6fa6b9bfed2..00000000000 --- a/docs/package/simulation_interface/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm -rf output -rm -rf markdown -doxygen Doxyfile -mkdir -p ./markdown/Classes -doxybook2 --input ./build/ --output ./markdown -c config.json diff --git a/docs/package/simulation_interface/config.json b/docs/package/simulation_interface/config.json deleted file mode 100644 index 7877cb976e4..00000000000 --- a/docs/package/simulation_interface/config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "baseUrl": "/scenario_simulator_v2-docs/package/simulation_interface/markdown/", - "indexInFolders": true, - "indexClassesName": "index", - "indexFilesName": "index", - "indexGroupsName": "index", - "indexNamespacesName": "index", - "indexRelatedPagesName": "index", - "indexExamplesName": "index", - "mainPageInRoot": false, - "mainPageName": "index", - "sort": true, - "linkSuffix" : "" -} diff --git a/docs/package/traffic_simulator/.gitignore b/docs/package/traffic_simulator/.gitignore deleted file mode 100644 index 07bf277f52c..00000000000 --- a/docs/package/traffic_simulator/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -build -markdown/Classes -markdown/Examples -markdown/Files -markdown/Modules -markdown/Namespaces -markdown/Pages diff --git a/docs/package/traffic_simulator/Doxyfile b/docs/package/traffic_simulator/Doxyfile deleted file mode 100644 index 27624460a80..00000000000 --- a/docs/package/traffic_simulator/Doxyfile +++ /dev/null @@ -1,13 +0,0 @@ -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = Scenario Simulator -OUTPUT_DIRECTORY = -OUTPUT_LANGUAGE = English -ALIASES = -INPUT = ../../../simulation/traffic_simulator -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.hpp *.h *.cpp *.c -GENERATE_XML = YES -GENERATE_HTML = NO -GENERATE_LATEX = NO -XML_OUTPUT = build -RECURSIVE = YES diff --git a/docs/package/traffic_simulator/build.sh b/docs/package/traffic_simulator/build.sh deleted file mode 100644 index 6fa6b9bfed2..00000000000 --- a/docs/package/traffic_simulator/build.sh +++ /dev/null @@ -1,5 +0,0 @@ -rm -rf output -rm -rf markdown -doxygen Doxyfile -mkdir -p ./markdown/Classes -doxybook2 --input ./build/ --output ./markdown -c config.json diff --git a/docs/package/traffic_simulator/config.json b/docs/package/traffic_simulator/config.json deleted file mode 100644 index 291a1b713cb..00000000000 --- a/docs/package/traffic_simulator/config.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "baseUrl": "/scenario_simulator_v2-docs/package/traffic_simulator/markdown/", - "indexInFolders": true, - "indexClassesName": "index", - "indexFilesName": "index", - "indexGroupsName": "index", - "indexNamespacesName": "index", - "indexRelatedPagesName": "index", - "indexExamplesName": "index", - "mainPageInRoot": false, - "mainPageName": "index", - "sort": true, - "linkSuffix" : "" -} diff --git a/docs/package/traffic_simulator/markdown/images/get_length_in_hermite_curve.png b/docs/package/traffic_simulator/markdown/images/get_length_in_hermite_curve.png deleted file mode 100644 index 481a8444a6356099fc6f37c86faa1a77dac77d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154323 zcmZ6z2RxT;`#)|(l2uX4Oob?=MP`V$P$D}dA$w(SQc?+(B)dqG%#xK+Qc1{O3E9bB z|M%JWeedVr>-CK8o6qOEuJb&Px?+>;*IiEg1D>Lfqa%9Bce)VC&TNJSh z2k!C8En_S5d6-J~NOm2Yu0wHIS+=lH>eCS2vj-_@w(@PxWnD$Lj82|vh44p`^HQpL&DrVZy)pj&Ub0uZ_uIRc-phJ-1%vs5{^w6$guuukCCjS+{!wix zqPY7%KNUo=^8i2JfB(cSo%1?=@PGbLu=B3@@5ijFSrU|VrTFj9H2Ct;RaR9g967RL z!-fqHPYcC140QJQuW)j5dURT-vd6a4`1uEJp{$#N!7R(f*(VkJ8fo>&*O*^DC&UvvG29ty;G(aHB#%QE4f)P%j(#|NPH*DIrjltjFf4V<8=0;>>;LS~kN~)_vC~enW z*cWy4{{3tE9y2s@a&qia&O5uhx>z_ku6lV<+?Vy_j`3XFuN))8h|Bl$^E)6CsUQ;R zH2LX@rL)Dk6aTk9(eK&>$6W$14`u28aQR$YtE#UbD(yPi@vFa1toTyuZzLM7qyj;`p7Nl-L8G1|}%H9zNvt3kc{MY|Iq5 z?_-gf?x6lP(7@c**7ii6KcC5&gZBS6ivztXEBUq;FJ3sV82|kFv%yYwgUm)=x)O(W z83)EVLB2hESYu;jt!-?)U%r$)sA^$*e0_+L=C-xsl9CFKjW4x^Jbd+vb2$@dQL*px z4D$vNiW@@LdTjTXl$7i=uiqxfN`GJK@@m)2>*s>Timj(rR(*NMD&7cN{=;Oc~X z5o8S>Sk(HG_r+|l%jDqJg~9@=vnDKx2~H^ zWBWkJuLmz31_IKwbL3f;iAzZAb8WkKoS(u=KGrKa`NARQn|;qkhW!kzQmvMLywmjl z&*A1udHR$ICt;Vp1lI$P*^7M>vyPAH)Kly3>@{EOGBq4>zA7R%F3xAWr4^+QZ;@G6 zTv8Hkl$cey>qx=!lP6EU8vh^}boHvQQheS&c6m#z+l&1gA7f} zTza=ewH30mveR>OrElLpZlwQ4y_^XjCLgQ9yKC1iu|Snb!^}qfsKLIdM7x?c#`si? zs!Xash04-JzR~LIbhXx#vv%z9g@=ol2C8KJNez>@T4z><3kke^n{|Fbf5}HV*;nnc zpH7?1gz|?EADoBtdUsm2NzD&gd6t@|7x4Sn4Nctpl6ULYtNMVw>9?P!z z%z!d3E>6PLbSUNd^VJ;tEQ(&c =Wc>Vloi_)@*pPzQ1A-%Bk`joKxiH3%T?kKC* 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

|y#|j%7Iij`^zk9_ReqLN9q)ObJ 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%0D*W}fbCy~gIZW%d9!WJ(t}PX3xhF4O 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 j{{J Date: Tue, 24 Oct 2023 19:18:00 +0900 Subject: [PATCH 15/30] update github actions Signed-off-by: Masaya Kataoka --- .github/workflows/Documentation.yaml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Documentation.yaml b/.github/workflows/Documentation.yaml index 228555d819f..3dda9df9fc5 100644 --- a/.github/workflows/Documentation.yaml +++ b/.github/workflows/Documentation.yaml @@ -30,8 +30,6 @@ jobs: poetry-version: "1.5.1" - name: install run: poetry install --no-interaction - - name: Install doxygen/depends of doxybook - run: sudo apt install -y doxygen wget - name: Generate documentation run: poetry run mkdocs build - name: Upload Artifact @@ -48,3 +46,18 @@ jobs: publish_dir: site keep_files: false external_repository: tier4/scenario_simulator_v2-docs + generate_api_document: + name: Generate API documentation + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v2-beta + - name: Install doxygen + run: sudo apt install -y doxygen + - name: Build document + run: doxygen Doxyfile + - name: Upload Artifact + uses: actions/upload-artifact@v2 + with: + name: api_documentation_site + path: html + retention-days: 1 From e90b122f78c1000d9a9fa99a24dab39b32e8679b Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Wed, 25 Oct 2023 11:39:48 +0900 Subject: [PATCH 16/30] fix typo Signed-off-by: Masaya Kataoka --- common/simple_junit/include/simple_junit/junit5.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/simple_junit/include/simple_junit/junit5.hpp b/common/simple_junit/include/simple_junit/junit5.hpp index 12310ccadce..410571f346d 100644 --- a/common/simple_junit/include/simple_junit/junit5.hpp +++ b/common/simple_junit/include/simple_junit/junit5.hpp @@ -225,7 +225,7 @@ struct SimpleTestCase current_node.append_attribute("status") = testcase.status.c_str(); } - /// @todo implement `skipped` emelent in junit. + /// @todo implement `skipped` element in junit. for (const auto & each : testcase.error) { current_node.append_child("error") << each; From 20212d41cc1bd1b1456d960f83b95d748f22136d Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Wed, 25 Oct 2023 11:44:49 +0900 Subject: [PATCH 17/30] add SpecificationViolation Signed-off-by: Masaya Kataoka --- .../include/scenario_simulator_exception/exception.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp b/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp index 2fe7e130ba5..da6960a3d6c 100644 --- a/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp +++ b/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp @@ -55,6 +55,7 @@ DEFINE_ERROR_CATEGORY(SyntaxError); #define THROW_SEMANTIC_ERROR(...) /* */ THROW_ERROR(common::SemanticError, __VA_ARGS__) #define THROW_SIMULATION_ERROR(...) /* */ THROW_ERROR(common::SimulationError, __VA_ARGS__) +#define THROW_SPECIFICATION_VIOLATION(...) THROW_ERROR(common::SpecificationViolation, __VA_ARGS__) #define THROW_SYNTAX_ERROR(...) /* */ THROW_ERROR(common::SyntaxError, __VA_ARGS__) } // namespace scenario_simulator_exception } // namespace common From 78fb674111efe4a997483364f45d54eb11c65c67 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Wed, 25 Oct 2023 12:39:37 +0900 Subject: [PATCH 18/30] add define error category Signed-off-by: Masaya Kataoka --- .../include/scenario_simulator_exception/exception.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp b/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp index da6960a3d6c..fe670251222 100644 --- a/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp +++ b/common/scenario_simulator_exception/include/scenario_simulator_exception/exception.hpp @@ -46,6 +46,9 @@ DEFINE_ERROR_CATEGORY(SemanticError); /// @brief A problem occurred that interfered with the continuation of the simulation. DEFINE_ERROR_CATEGORY(SimulationError); +/// @brief When simulator detects specification violation in simulation. +DEFINE_ERROR_CATEGORY(SpecificationViolation); + /// @brief There is a syntactic error in the description of the scenario. Or you are using a feature that is not yet supported by our implementation. DEFINE_ERROR_CATEGORY(SyntaxError); From 1b019c29cab968a3f1b31e00ec9b1eaca1638c2f Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Thu, 26 Oct 2023 13:14:04 +0900 Subject: [PATCH 19/30] update namespace Signed-off-by: Masaya Kataoka --- .../src/behavior_plugin/load_do_nothing_plugin.cpp | 2 +- mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mock/cpp_mock_scenarios/src/behavior_plugin/load_do_nothing_plugin.cpp b/mock/cpp_mock_scenarios/src/behavior_plugin/load_do_nothing_plugin.cpp index 21f1118e5ad..5909483d512 100644 --- a/mock/cpp_mock_scenarios/src/behavior_plugin/load_do_nothing_plugin.cpp +++ b/mock/cpp_mock_scenarios/src/behavior_plugin/load_do_nothing_plugin.cpp @@ -70,7 +70,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp b/mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp index 4f3ebd1b009..a3c311ad6a6 100644 --- a/mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp +++ b/mock/cpp_mock_scenarios/src/traffic_simulation_demo.cpp @@ -154,7 +154,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; From d1e52efa552018737ae1b51aeab410e4ae7d301f Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Thu, 26 Oct 2023 13:17:17 +0900 Subject: [PATCH 20/30] add api docs publish step Signed-off-by: Masaya Kataoka --- .github/workflows/Documentation.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/Documentation.yaml b/.github/workflows/Documentation.yaml index 3dda9df9fc5..3e0eb7a1d4b 100644 --- a/.github/workflows/Documentation.yaml +++ b/.github/workflows/Documentation.yaml @@ -61,3 +61,11 @@ jobs: name: api_documentation_site path: html retention-days: 1 + - name: Publish Documentation + # if: ${{ github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'}} + uses: peaceiris/actions-gh-pages@v3 + with: + personal_token: ${{ secrets.BLOOM_GITHUB_TOKEN }} + publish_dir: site + keep_files: false + external_repository: tier4/scenario_simulator_v2-api-docs From 69a82f1023c5e999aa48b2920f95c0c9eabb5d93 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Thu, 26 Oct 2023 13:35:01 +0900 Subject: [PATCH 21/30] fix publish_dir Signed-off-by: Masaya Kataoka --- .github/workflows/Documentation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Documentation.yaml b/.github/workflows/Documentation.yaml index 3e0eb7a1d4b..2bd58320e8e 100644 --- a/.github/workflows/Documentation.yaml +++ b/.github/workflows/Documentation.yaml @@ -66,6 +66,6 @@ jobs: uses: peaceiris/actions-gh-pages@v3 with: personal_token: ${{ secrets.BLOOM_GITHUB_TOKEN }} - publish_dir: site + publish_dir: html keep_files: false external_repository: tier4/scenario_simulator_v2-api-docs From 851166dce5549a0652a1cf0dc0549c4c2b3bf56a Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Thu, 26 Oct 2023 14:12:29 +0900 Subject: [PATCH 22/30] add link Signed-off-by: Masaya Kataoka --- README.md | 3 ++- docs/developer_guide/About.md | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fe536186104..4b541942f98 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,5 @@ Scenario testing framework for Autoware. ## Documentation -See [GitHub Pages](https://tier4.github.io/scenario_simulator_v2-docs/) +See [Documentation](https://tier4.github.io/scenario_simulator_v2-docs/) +See [C++ API Documentation](https://tier4.github.io/scenario_simulator_v2-api-docs/index.html) diff --git a/docs/developer_guide/About.md b/docs/developer_guide/About.md index 70c5c74e899..af70fcebf9a 100644 --- a/docs/developer_guide/About.md +++ b/docs/developer_guide/About.md @@ -6,6 +6,8 @@ This documentation describes the architecture design of this scenario testing fr This framework is designed for executing scenario tests with Autoware. +C++ API documentation of scenario_simulator_v2 can be seen [here](https://tier4.github.io/scenario_simulator_v2-api-docs/index.html). + **This framework is designed to easily accommodate multiple simulators and scenario description formats.** ## Simple sensor simulator From b22b4f4440b0a10b258e47f411c57f77a34f8ebd Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Thu, 26 Oct 2023 14:12:44 +0900 Subject: [PATCH 23/30] add trigger Signed-off-by: Masaya Kataoka --- .github/workflows/Documentation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Documentation.yaml b/.github/workflows/Documentation.yaml index 2bd58320e8e..2eca581e53d 100644 --- a/.github/workflows/Documentation.yaml +++ b/.github/workflows/Documentation.yaml @@ -62,7 +62,7 @@ jobs: path: html retention-days: 1 - name: Publish Documentation - # if: ${{ github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'}} + if: ${{ github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'}} uses: peaceiris/actions-gh-pages@v3 with: personal_token: ${{ secrets.BLOOM_GITHUB_TOKEN }} From 2094140c0daf2636ad0d5d34760a8905483c4d61 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Thu, 26 Oct 2023 17:10:59 +0900 Subject: [PATCH 24/30] add namespace Signed-off-by: Masaya Kataoka --- mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp b/mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp index c58dd9d3241..7210d5c8bdc 100644 --- a/mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp +++ b/mock/cpp_mock_scenarios/src/collision/spawn_with_offset.cpp @@ -72,7 +72,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; From db168472bb1a927d1e90329985069f926835bdc6 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Thu, 26 Oct 2023 17:50:57 +0900 Subject: [PATCH 25/30] fix compile error Signed-off-by: Masaya Kataoka --- mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp | 2 +- mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp | 2 +- .../src/follow_front_entity/accelerate_and_follow.cpp | 2 +- .../src/follow_front_entity/decelerate_and_follow.cpp | 2 +- .../src/follow_lane/acquire_position_in_world_frame.cpp | 3 ++- .../src/follow_lane/assign_route_in_world_frame.cpp | 2 +- mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp | 4 ++-- .../src/follow_lane/follow_with_offset.cpp | 2 +- mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp | 2 +- .../src/lane_change/lanechange_left_with_id.cpp | 2 +- .../src/lane_change/lanechange_linear.cpp | 2 +- .../src/lane_change/lanechange_linear_lateral_velocity.cpp | 3 ++- .../src/lane_change/lanechange_linear_time.cpp | 2 +- .../src/lane_change/lanechange_longitudinal_distance.cpp | 3 ++- .../cpp_mock_scenarios/src/lane_change/lanechange_right.cpp | 2 +- .../src/lane_change/lanechange_right_with_id.cpp | 2 +- mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp | 2 +- .../get_distance_in_lane_coordinate_distance.cpp | 3 ++- .../src/measurement/get_distance_to_lane_bound.cpp | 2 +- mock/cpp_mock_scenarios/src/merge/merge_left.cpp | 2 +- mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp | 2 +- mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp | 2 +- mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp | 6 +++--- .../src/speed_planning/request_speed_change.cpp | 2 +- .../request_speed_change_continuous_false.cpp | 3 ++- .../src/speed_planning/request_speed_change_relative.cpp | 3 ++- .../src/speed_planning/request_speed_change_step.cpp | 2 +- .../request_speed_change_with_time_constraint.cpp | 3 ++- .../request_speed_change_with_time_constraint_linear.cpp | 4 +++- .../request_speed_change_with_time_constraint_relative.cpp | 4 +++- 30 files changed, 44 insertions(+), 33 deletions(-) diff --git a/mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp b/mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp index e940f5ac048..f85738e8817 100644 --- a/mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp +++ b/mock/cpp_mock_scenarios/src/collision/crashing_npc.cpp @@ -77,7 +77,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp b/mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp index 1e2556142fd..3e433423821 100644 --- a/mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp +++ b/mock/cpp_mock_scenarios/src/crosswalk/stop_at_crosswalk.cpp @@ -107,7 +107,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp b/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp index 4bc4c1ac92b..d71729b2a30 100644 --- a/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp +++ b/mock/cpp_mock_scenarios/src/follow_front_entity/accelerate_and_follow.cpp @@ -80,7 +80,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/follow_front_entity/decelerate_and_follow.cpp b/mock/cpp_mock_scenarios/src/follow_front_entity/decelerate_and_follow.cpp index 9d3c5e873e1..24108503cb6 100644 --- a/mock/cpp_mock_scenarios/src/follow_front_entity/decelerate_and_follow.cpp +++ b/mock/cpp_mock_scenarios/src/follow_front_entity/decelerate_and_follow.cpp @@ -80,7 +80,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp b/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp index c31499cb2ca..e2c477b79e3 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/acquire_position_in_world_frame.cpp @@ -69,7 +69,8 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp b/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp index 7bb617169e3..3631456c15a 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/assign_route_in_world_frame.cpp @@ -70,7 +70,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp b/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp index 93bee6170e1..d21a4889826 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/cancel_request.cpp @@ -47,7 +47,7 @@ class CancelRequestScenario : public cpp_mock_scenarios::CppScenarioNode "ego", api_.canonicalize(traffic_simulator::helper::constructLaneletPose(34513, 30, 0, 0, 0, 0)), 3.0)) { - api_.CancelRequestScenario("ego"); + api_.cancelRequest("ego"); canceled = true; } if (api_.isInLanelet("ego", 34507, 0.1)) { @@ -73,7 +73,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp b/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp index 17d0e6f9e79..38bba72a680 100644 --- a/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp +++ b/mock/cpp_mock_scenarios/src/follow_lane/follow_with_offset.cpp @@ -70,7 +70,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp index c58a490cc28..e7ad9daa2a0 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left.cpp @@ -69,7 +69,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp index 596109da425..b49470be49a 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_left_with_id.cpp @@ -69,7 +69,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp index 4808d4d65a8..a22427f0691 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear.cpp @@ -79,7 +79,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp index a2370b58c72..5f81424dced 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_lateral_velocity.cpp @@ -83,7 +83,8 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp index 54d03773511..053b5d0b841 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_linear_time.cpp @@ -82,7 +82,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp index 83d1526d82d..c822a005b25 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_longitudinal_distance.cpp @@ -71,7 +71,8 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp index 01dc0e457af..491f557bd4b 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right.cpp @@ -70,7 +70,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp index 05718f910f3..9ebd20c6b51 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_right_with_id.cpp @@ -69,7 +69,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp b/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp index a8f5505094d..583d956ba9b 100644 --- a/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp +++ b/mock/cpp_mock_scenarios/src/lane_change/lanechange_time.cpp @@ -82,7 +82,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/measurement/get_distance_in_lane_coordinate_distance.cpp b/mock/cpp_mock_scenarios/src/measurement/get_distance_in_lane_coordinate_distance.cpp index b898cd6822b..4d51b8dd65c 100644 --- a/mock/cpp_mock_scenarios/src/measurement/get_distance_in_lane_coordinate_distance.cpp +++ b/mock/cpp_mock_scenarios/src/measurement/get_distance_in_lane_coordinate_distance.cpp @@ -121,7 +121,8 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/measurement/get_distance_to_lane_bound.cpp b/mock/cpp_mock_scenarios/src/measurement/get_distance_to_lane_bound.cpp index fd412fdcd3d..0ffc13ec20b 100644 --- a/mock/cpp_mock_scenarios/src/measurement/get_distance_to_lane_bound.cpp +++ b/mock/cpp_mock_scenarios/src/measurement/get_distance_to_lane_bound.cpp @@ -70,7 +70,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/merge/merge_left.cpp b/mock/cpp_mock_scenarios/src/merge/merge_left.cpp index aeb4c794093..1dd1ab4738a 100644 --- a/mock/cpp_mock_scenarios/src/merge/merge_left.cpp +++ b/mock/cpp_mock_scenarios/src/merge/merge_left.cpp @@ -78,7 +78,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp b/mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp index 48246757e8b..ee1f035b666 100644 --- a/mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp +++ b/mock/cpp_mock_scenarios/src/metrics/traveled_distance.cpp @@ -80,7 +80,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp b/mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp index 7aa58265456..33638138c07 100644 --- a/mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp +++ b/mock/cpp_mock_scenarios/src/move_backward/move_backward.cpp @@ -68,7 +68,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp b/mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp index ca8142b93d7..54478ddc5ab 100644 --- a/mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp +++ b/mock/cpp_mock_scenarios/src/pedestrian/walk_straight.cpp @@ -28,10 +28,10 @@ namespace cpp_mock_scenarios { -class StopAtCrosswalkScenario : public cpp_mock_scenarios::CppScenarioNode +class WalkStraightScenario : public cpp_mock_scenarios::CppScenarioNode { public: - explicit StopAtCrosswalkScenario(const rclcpp::NodeOptions & option) + explicit WalkStraightScenario(const rclcpp::NodeOptions & option) : cpp_mock_scenarios::CppScenarioNode( "stop_at_crosswalk", ament_index_cpp::get_package_share_directory("kashiwanoha_map") + "/map", "lanelet2_map.osm", __FILE__, false, option) @@ -104,7 +104,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change.cpp index 73f3b542008..94844fabf3f 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change.cpp @@ -85,7 +85,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_continuous_false.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_continuous_false.cpp index 424bc97137f..7a83e377531 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_continuous_false.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_continuous_false.cpp @@ -82,7 +82,8 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_relative.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_relative.cpp index d54ff8a5333..c1c14e5e77d 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_relative.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_relative.cpp @@ -83,7 +83,8 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_step.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_step.cpp index dae2e9aba03..7e6d66932bc 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_step.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_step.cpp @@ -82,7 +82,7 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint.cpp index 29eb1bb0d40..f486fcec618 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint.cpp @@ -86,7 +86,8 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared(options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_linear.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_linear.cpp index 281404a6ae2..144857533df 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_linear.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_linear.cpp @@ -72,7 +72,9 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared( + options); rclcpp::spin(component); rclcpp::shutdown(); return 0; diff --git a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_relative.cpp b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_relative.cpp index 8e33ad28c85..9336be41024 100644 --- a/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_relative.cpp +++ b/mock/cpp_mock_scenarios/src/speed_planning/request_speed_change_with_time_constraint_relative.cpp @@ -90,7 +90,9 @@ int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::NodeOptions options; - auto component = std::make_shared(options); + auto component = + std::make_shared( + options); rclcpp::spin(component); rclcpp::shutdown(); return 0; From 9f37901c125742a79c7dbcc2109da49efd404863 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Fri, 27 Oct 2023 14:14:21 +0900 Subject: [PATCH 26/30] add clang-format off Signed-off-by: Masaya Kataoka --- .../include/traffic_simulator/api/api.hpp | 2 ++ .../data_type/speed_change.hpp | 2 +- .../traffic_simulator/entity/entity_base.hpp | 24 +++++++-------- .../entity/entity_manager.hpp | 30 +++++++++++-------- 4 files changed, 32 insertions(+), 26 deletions(-) diff --git a/simulation/traffic_simulator/include/traffic_simulator/api/api.hpp b/simulation/traffic_simulator/include/traffic_simulator/api/api.hpp index 093e0c17879..d7178b7024e 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/api/api.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/api/api.hpp @@ -271,6 +271,7 @@ class API const lane_change::TrajectoryShape trajectory_shape, const lane_change::Constraint & constraint); +// clang-format off #define FORWARD_TO_ENTITY_MANAGER(NAME) \ /*! \ @brief Forward to arguments to the EntityManager::NAME function. \ @@ -284,6 +285,7 @@ class API return (*entity_manager_ptr_).NAME(std::forward(xs)...); \ } \ static_assert(true, "") + // clang-format on FORWARD_TO_ENTITY_MANAGER(asFieldOperatorApplication); FORWARD_TO_ENTITY_MANAGER(cancelRequest); diff --git a/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp b/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp index 39a27c3d29e..33c2226c444 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp @@ -34,7 +34,7 @@ enum class Transition { struct Constraint { enum class Type { - // @todo Add DISTANCE constraint type. + // @todo Add DISTANCE constraint type. LONGITUDINAL_ACCELERATION, TIME, NONE diff --git a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp index f104444f7b2..233744bb2af 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp @@ -61,15 +61,15 @@ class EntityBase virtual void cancelRequest(); -#define DEFINE_GETTER(NAME, TYPE, RETURN_VARIABLE) \ - /** \ - @brief Get NAME of the entity. \ - @return NAME of the entity. \ - @note This function was defined by DEFINE_GETTER function . \ - */ \ +// clang-format off +#define DEFINE_GETTER(NAME, TYPE, RETURN_VARIABLE) \ + /** \ + @brief Get NAME of the entity. \ + @return NAME of the entity. \ + @note This function was defined by DEFINE_GETTER function. \ + */ \ /* */ auto get##NAME() const noexcept->TYPE { return RETURN_VARIABLE; } - // clang-format off DEFINE_GETTER(BoundingBox, traffic_simulator_msgs::msg::BoundingBox, static_cast(getStatus()).bounding_box) DEFINE_GETTER(CurrentAccel, geometry_msgs::msg::Accel, static_cast(getStatus()).action_status.accel) DEFINE_GETTER(CurrentTwist, geometry_msgs::msg::Twist, static_cast(getStatus()).action_status.twist) @@ -84,13 +84,13 @@ class EntityBase // clang-format on #undef DEFINE_GETTER -#define DEFINE_CHECK_FUNCTION(FUNCTION_NAME, BOOL_VARIABLE) \ - /** \ - @note This function was defined by DEFINE_CHECK_FUNCTION function . \ - */ \ +// clang-format off +#define DEFINE_CHECK_FUNCTION(FUNCTION_NAME, BOOL_VARIABLE) \ + /** \ + @note This function was defined by DEFINE_CHECK_FUNCTION function . \ + */ \ /* */ auto FUNCTION_NAME() const->bool { return BOOL_VARIABLE; } - // clang-format off DEFINE_CHECK_FUNCTION(isNpcLogicStarted, npc_logic_started_) DEFINE_CHECK_FUNCTION(laneMatchingSucceed, status_.laneMatchingSucceed()) // clang-format on diff --git a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp index a69432fcc3c..bf4a2418a4e 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp @@ -231,6 +231,7 @@ class EntityManager v2i_traffic_light_updater_.resetUpdateRate(rate); } +// clang-format off #define FORWARD_TO_HDMAP_UTILS(NAME) \ /*! \ @brief Forward to arguments to the HDMapUtils::NAME function. \ @@ -243,26 +244,29 @@ class EntityManager return hdmap_utils_ptr_->NAME(std::forward(xs)...); \ } \ static_assert(true, "") + // clang-format on FORWARD_TO_HDMAP_UTILS(toLaneletPose); // FORWARD_TO_HDMAP_UTILS(toMapPose); #undef FORWARD_TO_HDMAP_UTILS -#define FORWARD_TO_ENTITY(IDENTIFIER, ...) \ - /*! \ - @brief Forward to arguments to the EntityBase::IDENTIFIER function. \ - @return return value of the EntityBase::IDENTIFIER function. \ - @note This function was defined by FORWARD_TO_ENTITY macro.        \ - */ \ - template \ - decltype(auto) IDENTIFIER(const std::string & name, Ts &&... xs) __VA_ARGS__ \ - try { \ - return entities_.at(name)->IDENTIFIER(std::forward(xs)...); \ - } catch (const std::out_of_range &) { \ - THROW_SEMANTIC_ERROR("entity : ", name, "does not exist"); \ - } \ +// clang-format off +#define FORWARD_TO_ENTITY(IDENTIFIER, ...) \ + /*! \ + @brief Forward to arguments to the EntityBase::IDENTIFIER function. \ + @return return value of the EntityBase::IDENTIFIER function. \ + @note This function was defined by FORWARD_TO_ENTITY macro.        \ + */ \ + template \ + decltype(auto) IDENTIFIER(const std::string & name, Ts &&... xs) __VA_ARGS__ \ + try { \ + return entities_.at(name)->IDENTIFIER(std::forward(xs)...); \ + } catch (const std::out_of_range &) { \ + THROW_SEMANTIC_ERROR("entity : ", name, "does not exist"); \ + } \ static_assert(true, "") + // clang-format on FORWARD_TO_ENTITY(asFieldOperatorApplication, const); FORWARD_TO_ENTITY(cancelRequest, ); From 60aafe1b8d14efbc26d70aa300ae6a7ca2c9f226 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Mon, 30 Oct 2023 16:20:36 +0900 Subject: [PATCH 27/30] Update simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp Co-authored-by: Tatsuya Yamasaki --- .../include/traffic_simulator/entity/entity_base.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp index 233744bb2af..68c49c9b560 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_base.hpp @@ -87,7 +87,7 @@ class EntityBase // clang-format off #define DEFINE_CHECK_FUNCTION(FUNCTION_NAME, BOOL_VARIABLE) \ /** \ - @note This function was defined by DEFINE_CHECK_FUNCTION function . \ + @note This function was defined by DEFINE_CHECK_FUNCTION function. \ */ \ /* */ auto FUNCTION_NAME() const->bool { return BOOL_VARIABLE; } From ba545a6728c22df9c7d5676ac937de52bf596186 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Mon, 30 Oct 2023 16:20:44 +0900 Subject: [PATCH 28/30] Update simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp Co-authored-by: Tatsuya Yamasaki --- .../include/traffic_simulator/data_type/speed_change.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp b/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp index 33c2226c444..e8e52c15b72 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp @@ -24,7 +24,7 @@ namespace traffic_simulator namespace speed_change { enum class Transition { - // @todo Add CUBIC transition type. + // @todo Add CUBIC transition. LINEAR, // @todo Add SINUSOIDAL transition type. STEP, From c9bf9bc764d193a8d07c708d5f65f34930e1e669 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Mon, 30 Oct 2023 16:20:51 +0900 Subject: [PATCH 29/30] Update simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp Co-authored-by: Tatsuya Yamasaki --- .../include/traffic_simulator/data_type/speed_change.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp b/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp index e8e52c15b72..3330ca8fe56 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/data_type/speed_change.hpp @@ -26,7 +26,7 @@ namespace speed_change enum class Transition { // @todo Add CUBIC transition. LINEAR, - // @todo Add SINUSOIDAL transition type. + // @todo Add SINUSOIDAL transition. STEP, AUTO }; From 54b738d014139b1d0d9b198dfd9f150e7de57037 Mon Sep 17 00:00:00 2001 From: Masaya Kataoka Date: Mon, 30 Oct 2023 16:21:04 +0900 Subject: [PATCH 30/30] Update simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp Co-authored-by: Tatsuya Yamasaki --- .../include/traffic_simulator/entity/entity_manager.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp index bf4a2418a4e..988e13d907e 100644 --- a/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp +++ b/simulation/traffic_simulator/include/traffic_simulator/entity/entity_manager.hpp @@ -256,7 +256,7 @@ class EntityManager /*! \ @brief Forward to arguments to the EntityBase::IDENTIFIER function. \ @return return value of the EntityBase::IDENTIFIER function. \ - @note This function was defined by FORWARD_TO_ENTITY macro.        \ + @note This function was defined by FORWARD_TO_ENTITY macro.         \ */ \ template \ decltype(auto) IDENTIFIER(const std::string & name, Ts &&... xs) __VA_ARGS__ \