@@ -49,16 +49,117 @@ std::vector<typename rclcpp::Subscription<T>::SharedPtr> init_factors(
4949}
5050
5151template <class T >
52- T merge_factors (const rclcpp::Time stamp, const std::vector<typename T::ConstSharedPtr > & factors)
52+ std::vector<T> convert (const std::vector<PlanningFactor > & factors)
5353{
54- T message;
54+ static_assert (sizeof (T) == 0 , " Only specializations of convert can be used." );
55+ throw std::logic_error (" Only specializations of convert can be used." );
56+ }
57+
58+ template <>
59+ std::vector<VelocityFactor> convert (const std::vector<PlanningFactor> & factors)
60+ {
61+ std::vector<VelocityFactor> velocity_factors;
62+
63+ for (const auto & factor : factors) {
64+ if (factor.behavior != PlanningFactor::SLOW_DOWN && factor.behavior != PlanningFactor::STOP) {
65+ continue ;
66+ }
67+
68+ if (factor.control_points .empty ()) {
69+ continue ;
70+ }
71+
72+ if (conversion_map.count (factor.module ) == 0 ) {
73+ continue ;
74+ }
75+
76+ VelocityFactor velocity_factor;
77+ velocity_factor.behavior = conversion_map.at (factor.module );
78+ velocity_factor.pose = factor.control_points .front ().pose ;
79+ velocity_factor.distance = factor.control_points .front ().distance ;
80+
81+ velocity_factors.push_back (velocity_factor);
82+ }
83+
84+ return velocity_factors;
85+ }
86+
87+ template <>
88+ std::vector<SteeringFactor> convert (const std::vector<PlanningFactor> & factors)
89+ {
90+ std::vector<SteeringFactor> steering_factors;
91+
92+ for (const auto & factor : factors) {
93+ if (
94+ factor.behavior != PlanningFactor::SHIFT_RIGHT &&
95+ factor.behavior != PlanningFactor::SHIFT_LEFT &&
96+ factor.behavior != PlanningFactor::TURN_RIGHT &&
97+ factor.behavior != PlanningFactor::TURN_LEFT) {
98+ continue ;
99+ }
100+
101+ if (factor.control_points .size () < 2 ) {
102+ continue ;
103+ }
104+
105+ if (conversion_map.count (factor.module ) == 0 ) {
106+ continue ;
107+ }
108+
109+ SteeringFactor steering_factor;
110+ steering_factor.behavior = conversion_map.at (factor.module );
111+ steering_factor.direction = direction_map.at (factor.behavior );
112+ steering_factor.pose = std::array<geometry_msgs::msg::Pose, 2 >{
113+ factor.control_points .front ().pose , factor.control_points .back ().pose };
114+ steering_factor.distance = std::array<float , 2 >{
115+ factor.control_points .front ().distance , factor.control_points .back ().distance };
116+
117+ steering_factors.push_back (steering_factor);
118+ }
119+
120+ return steering_factors;
121+ }
122+
123+ template <class T >
124+ T merge_factors (
125+ const rclcpp::Time stamp, const std::vector<PlanningFactorArray::ConstSharedPtr> & factors)
126+ {
127+ static_assert (sizeof (T) == 0 , " Only specializations of merge_factors can be used." );
128+ throw std::logic_error (" Only specializations of merge_factors can be used." );
129+ }
130+
131+ template <>
132+ VelocityFactorArray merge_factors (
133+ const rclcpp::Time stamp, const std::vector<PlanningFactorArray::ConstSharedPtr> & factors)
134+ {
135+ VelocityFactorArray message;
136+ message.header .stamp = stamp;
137+ message.header .frame_id = " map" ;
138+
139+ for (const auto & factor : factors) {
140+ if (!factor) {
141+ continue ;
142+ }
143+
144+ concat<VelocityFactor>(message.factors , convert<VelocityFactor>(factor->factors ));
145+ }
146+ return message;
147+ }
148+
149+ template <>
150+ SteeringFactorArray merge_factors (
151+ const rclcpp::Time stamp, const std::vector<PlanningFactorArray::ConstSharedPtr> & factors)
152+ {
153+ SteeringFactorArray message;
55154 message.header .stamp = stamp;
56155 message.header .frame_id = " map" ;
57156
58157 for (const auto & factor : factors) {
59- if (factor) {
60- concat (message. factors , factor-> factors ) ;
158+ if (! factor) {
159+ continue ;
61160 }
161+
162+ concat<SteeringFactor>(message.factors , convert<SteeringFactor>(factor->factors ));
62163 }
63164 return message;
64165}
@@ -70,46 +171,32 @@ PlanningNode::PlanningNode(const rclcpp::NodeOptions & options) : Node("planning
70171 stop_duration_ = declare_parameter<double >(" stop_duration" , 1.0 );
71172 stop_checker_ = std::make_unique<VehicleStopChecker>(this , stop_duration_ + 1.0 );
72173
73- std::vector<std::string> velocity_factor_topics = {
74- " /planning/velocity_factors/blind_spot" ,
75- " /planning/velocity_factors/crosswalk" ,
76- " /planning/velocity_factors/detection_area" ,
77- " /planning/velocity_factors/dynamic_obstacle_stop" ,
78- " /planning/velocity_factors/intersection" ,
79- " /planning/velocity_factors/merge_from_private" ,
80- " /planning/velocity_factors/no_stopping_area" ,
81- " /planning/velocity_factors/obstacle_stop" ,
82- " /planning/velocity_factors/obstacle_cruise" ,
83- " /planning/velocity_factors/occlusion_spot" ,
84- " /planning/velocity_factors/run_out" ,
85- " /planning/velocity_factors/stop_line" ,
86- " /planning/velocity_factors/surround_obstacle" ,
87- " /planning/velocity_factors/traffic_light" ,
88- " /planning/velocity_factors/virtual_traffic_light" ,
89- " /planning/velocity_factors/walkway" ,
90- " /planning/velocity_factors/motion_velocity_planner" ,
91- " /planning/velocity_factors/static_obstacle_avoidance" ,
92- " /planning/velocity_factors/dynamic_obstacle_avoidance" ,
93- " /planning/velocity_factors/avoidance_by_lane_change" ,
94- " /planning/velocity_factors/lane_change_left" ,
95- " /planning/velocity_factors/lane_change_right" ,
96- " /planning/velocity_factors/start_planner" ,
97- " /planning/velocity_factors/goal_planner" };
98-
99- std::vector<std::string> steering_factor_topics = {
100- " /planning/steering_factor/static_obstacle_avoidance" ,
101- " /planning/steering_factor/dynamic_obstacle_avoidance" ,
102- " /planning/steering_factor/avoidance_by_lane_change" ,
103- " /planning/steering_factor/intersection" ,
104- " /planning/steering_factor/lane_change_left" ,
105- " /planning/steering_factor/lane_change_right" ,
106- " /planning/steering_factor/start_planner" ,
107- " /planning/steering_factor/goal_planner" };
108-
109- sub_velocity_factors_ =
110- init_factors<VelocityFactorArray>(this , velocity_factors_, velocity_factor_topics);
111- sub_steering_factors_ =
112- init_factors<SteeringFactorArray>(this , steering_factors_, steering_factor_topics);
174+ std::vector<std::string> factor_topics = {
175+ " /planning/planning_factors/blind_spot" ,
176+ " /planning/planning_factors/crosswalk" ,
177+ " /planning/planning_factors/detection_area" ,
178+ " /planning/planning_factors/dynamic_obstacle_stop" ,
179+ " /planning/planning_factors/intersection" ,
180+ " /planning/planning_factors/merge_from_private" ,
181+ " /planning/planning_factors/no_stopping_area" ,
182+ " /planning/planning_factors/obstacle_cruise_planner" ,
183+ " /planning/planning_factors/occlusion_spot" ,
184+ " /planning/planning_factors/run_out" ,
185+ " /planning/planning_factors/stop_line" ,
186+ " /planning/planning_factors/surround_obstacle_checker" ,
187+ " /planning/planning_factors/traffic_light" ,
188+ " /planning/planning_factors/virtual_traffic_light" ,
189+ " /planning/planning_factors/walkway" ,
190+ " /planning/planning_factors/motion_velocity_planner" ,
191+ " /planning/planning_factors/static_obstacle_avoidance" ,
192+ " /planning/planning_factors/dynamic_obstacle_avoidance" ,
193+ " /planning/planning_factors/avoidance_by_lane_change" ,
194+ " /planning/planning_factors/lane_change_left" ,
195+ " /planning/planning_factors/lane_change_right" ,
196+ " /planning/planning_factors/start_planner" ,
197+ " /planning/planning_factors/goal_planner" };
198+
199+ sub_factors_ = init_factors<PlanningFactorArray>(this , factors_, factor_topics);
113200
114201 const auto adaptor = autoware::component_interface_utils::NodeAdaptor (this );
115202 adaptor.init_pub (pub_velocity_factors_);
@@ -139,8 +226,8 @@ void PlanningNode::on_kinematic_state(const KinematicState::ConstSharedPtr msg)
139226void PlanningNode::on_timer ()
140227{
141228 using autoware_adapi_v1_msgs::msg::VelocityFactor;
142- auto velocity = merge_factors<VelocityFactorArray>(now (), velocity_factors_ );
143- auto steering = merge_factors<SteeringFactorArray>(now (), steering_factors_ );
229+ auto velocity = merge_factors<VelocityFactorArray>(now (), factors_ );
230+ auto steering = merge_factors<SteeringFactorArray>(now (), factors_ );
144231
145232 // Set the distance if it is nan.
146233 if (trajectory_ && kinematic_state_) {
0 commit comments