Skip to content

Commit fb12a44

Browse files
authored
Merge pull request #1150 from tier4/use-v2i-in-planning
feat(behavior_velocity_planner.traffic_light): use v2i in planning
2 parents 4ca8408 + c36c197 commit fb12a44

File tree

12 files changed

+104
-0
lines changed

12 files changed

+104
-0
lines changed

launch/tier4_planning_launch/launch/scenario_planning/lane_driving/behavior_planning/behavior_planning.launch.xml

+1
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@
228228
<remap from="~/input/vector_map_inside_area_filtered_pointcloud" to="vector_map_inside_area_filtered/pointcloud"/>
229229
<remap from="~/input/external_velocity_limit_mps" to="/planning/scenario_planning/max_velocity_default"/>
230230
<remap from="~/input/traffic_signals" to="$(var input_traffic_light_topic_name)"/>
231+
<remap from="~/input/traffic_signals_raw_v2i" to="/v2i/external/v2i_traffic_light_info"/>
231232
<remap from="~/input/virtual_traffic_light_states" to="$(var input_virtual_traffic_light_topic_name)"/>
232233
<remap from="~/input/occupancy_grid" to="/perception/occupancy_grid_map/map"/>
233234
<remap from="~/output/path" to="path"/>

planning/behavior_velocity_planner/launch/behavior_velocity_planner.launch.xml

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
<remap from="~/input/traffic_signals" to="/perception/traffic_light_recognition/traffic_signals"/>
4444
<remap from="~/input/virtual_traffic_light_states" to="/perception/virtual_traffic_light_states"/>
4545
<remap from="~/input/occupancy_grid" to="/perception/occupancy_grid_map/map"/>
46+
<remap from="~/input/traffic_signals_raw_v2i" to="/v2i/external/v2i_traffic_light_info"/>
4647
<remap from="~/output/path" to="path"/>
4748
<remap from="~/output/stop_reasons" to="/planning/scenario_planning/status/stop_reasons"/>
4849
<remap from="~/output/infrastructure_commands" to="/planning/scenario_planning/status/infrastructure_commands"/>

planning/behavior_velocity_planner/package.xml

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
<depend>diagnostic_msgs</depend>
4242
<depend>eigen</depend>
4343
<depend>geometry_msgs</depend>
44+
<depend>jpn_signal_v2i_msgs</depend>
4445
<depend>lanelet2_extension</depend>
4546
<depend>libboost-dev</depend>
4647
<depend>motion_utils</depend>

planning/behavior_velocity_planner/src/node.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,11 @@ BehaviorVelocityPlannerNode::BehaviorVelocityPlannerNode(const rclcpp::NodeOptio
108108
"~/input/traffic_signals", 1,
109109
std::bind(&BehaviorVelocityPlannerNode::onTrafficSignals, this, _1),
110110
createSubscriptionOptions(this));
111+
sub_traffic_signals_raw_v2i_ =
112+
this->create_subscription<jpn_signal_v2i_msgs::msg::TrafficLightInfo>(
113+
"~/input/traffic_signals_raw_v2i", 1,
114+
std::bind(&BehaviorVelocityPlannerNode::onTrafficSignalsRawV2I, this, _1),
115+
createSubscriptionOptions(this));
111116
sub_external_velocity_limit_ = this->create_subscription<VelocityLimit>(
112117
"~/input/external_velocity_limit_mps", rclcpp::QoS{1}.transient_local(),
113118
std::bind(&BehaviorVelocityPlannerNode::onExternalVelocityLimit, this, _1));
@@ -330,6 +335,21 @@ void BehaviorVelocityPlannerNode::onTrafficSignals(
330335
}
331336
}
332337

338+
void BehaviorVelocityPlannerNode::onTrafficSignalsRawV2I(
339+
const jpn_signal_v2i_msgs::msg::TrafficLightInfo::ConstSharedPtr msg)
340+
{
341+
std::lock_guard<std::mutex> lock(mutex_);
342+
343+
for (const auto & car_light : msg->car_lights) {
344+
for (const auto & state : car_light.states) {
345+
TrafficSignalTimeToRedStamped time_to_red;
346+
time_to_red.stamp = msg->header.stamp;
347+
time_to_red.time_to_red = car_light.min_rest_time_to_red;
348+
planner_data_.traffic_light_time_to_red_id_map[state.traffic_signal_id] = time_to_red;
349+
}
350+
}
351+
}
352+
333353
void BehaviorVelocityPlannerNode::onExternalVelocityLimit(const VelocityLimit::ConstSharedPtr msg)
334354
{
335355
std::lock_guard<std::mutex> lock(mutex_);

planning/behavior_velocity_planner/src/node.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#include <autoware_auto_perception_msgs/msg/predicted_objects.hpp>
2828
#include <autoware_auto_planning_msgs/msg/path.hpp>
2929
#include <autoware_auto_planning_msgs/msg/path_with_lane_id.hpp>
30+
#include <jpn_signal_v2i_msgs/msg/extra_traffic_signal.hpp>
31+
#include <jpn_signal_v2i_msgs/msg/traffic_light_info.hpp>
3032
#include <nav_msgs/msg/occupancy_grid.hpp>
3133
#include <nav_msgs/msg/odometry.hpp>
3234
#include <sensor_msgs/msg/point_cloud2.hpp>
@@ -71,6 +73,8 @@ class BehaviorVelocityPlannerNode : public rclcpp::Node
7173
rclcpp::Subscription<autoware_auto_mapping_msgs::msg::HADMapBin>::SharedPtr sub_lanelet_map_;
7274
rclcpp::Subscription<autoware_perception_msgs::msg::TrafficSignalArray>::SharedPtr
7375
sub_traffic_signals_;
76+
rclcpp::Subscription<jpn_signal_v2i_msgs::msg::TrafficLightInfo>::SharedPtr
77+
sub_traffic_signals_raw_v2i_;
7478
rclcpp::Subscription<tier4_v2x_msgs::msg::VirtualTrafficLightStateArray>::SharedPtr
7579
sub_virtual_traffic_light_states_;
7680
rclcpp::Subscription<nav_msgs::msg::OccupancyGrid>::SharedPtr sub_occupancy_grid_;
@@ -86,6 +90,7 @@ class BehaviorVelocityPlannerNode : public rclcpp::Node
8690
void onLaneletMap(const autoware_auto_mapping_msgs::msg::HADMapBin::ConstSharedPtr msg);
8791
void onTrafficSignals(
8892
const autoware_perception_msgs::msg::TrafficSignalArray::ConstSharedPtr msg);
93+
void onTrafficSignalsRawV2I(const jpn_signal_v2i_msgs::msg::TrafficLightInfo::ConstSharedPtr msg);
8994
void onVirtualTrafficLightStates(
9095
const tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr msg);
9196
void onOccupancyGrid(const nav_msgs::msg::OccupancyGrid::ConstSharedPtr msg);

planning/behavior_velocity_planner_common/include/behavior_velocity_planner_common/planner_data.hpp

+11
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
#include <algorithm>
4242
#include <deque>
43+
#include <limits>
4344
#include <map>
4445
#include <memory>
4546
#include <optional>
@@ -78,6 +79,7 @@ struct PlannerData
7879
// other internal data
7980
std::map<int, TrafficSignalStamped> traffic_light_id_map;
8081
std::optional<tier4_planning_msgs::msg::VelocityLimit> external_velocity_limit;
82+
std::map<int, TrafficSignalTimeToRedStamped> traffic_light_time_to_red_id_map;
8183
tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr virtual_traffic_light_states;
8284

8385
// velocity smoother
@@ -132,6 +134,15 @@ struct PlannerData
132134
}
133135
return std::make_shared<TrafficSignalStamped>(traffic_light_id_map.at(id));
134136
}
137+
138+
std::optional<TrafficSignalTimeToRedStamped> getRestTimeToRedSignal(const int id) const
139+
{
140+
try {
141+
return traffic_light_time_to_red_id_map.at(id);
142+
} catch (std::out_of_range &) {
143+
return std::nullopt;
144+
}
145+
}
135146
};
136147
} // namespace behavior_velocity_planner
137148

planning/behavior_velocity_planner_common/include/behavior_velocity_planner_common/utilization/util.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,12 @@ struct TrafficSignalStamped
5656
autoware_perception_msgs::msg::TrafficSignal signal;
5757
};
5858

59+
struct TrafficSignalTimeToRedStamped
60+
{
61+
builtin_interfaces::msg::Time stamp;
62+
double time_to_red;
63+
};
64+
5965
using Pose = geometry_msgs::msg::Pose;
6066
using Point2d = tier4_autoware_utils::Point2d;
6167
using LineString2d = tier4_autoware_utils::LineString2d;

planning/behavior_velocity_planner_common/package.xml

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<depend>eigen</depend>
2929
<depend>geometry_msgs</depend>
3030
<depend>interpolation</depend>
31+
<depend>jpn_signal_v2i_msgs</depend>
3132
<depend>lanelet2_extension</depend>
3233
<depend>motion_utils</depend>
3334
<depend>motion_velocity_smoother</depend>

planning/behavior_velocity_traffic_light_module/config/traffic_light.param.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@
77
yellow_lamp_period: 2.75
88
enable_pass_judge: true
99
enable_rtc: false # If set to true, the scene modules require approval from the rtc (request to cooperate) function. If set to false, the modules can be executed without requiring rtc approval
10+
11+
v2i:
12+
use_rest_time: true
13+
last_time_allowed_to_pass: 2.0 # relative time against at the time of turn to red
14+
velocity_threshold: 0.5 # change the decision logic whether the current velocity is faster or not
15+
required_time_to_departure: 3.0 # prevent low speed pass

planning/behavior_velocity_traffic_light_module/src/manager.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ TrafficLightModuleManager::TrafficLightModuleManager(rclcpp::Node & node)
4343
planner_param_.enable_pass_judge = getOrDeclareParameter<bool>(node, ns + ".enable_pass_judge");
4444
planner_param_.yellow_lamp_period =
4545
getOrDeclareParameter<double>(node, ns + ".yellow_lamp_period");
46+
planner_param_.v2i_use_rest_time = getOrDeclareParameter<bool>(node, ns + ".v2i.use_rest_time");
47+
planner_param_.v2i_last_time_allowed_to_pass =
48+
getOrDeclareParameter<double>(node, ns + ".v2i.last_time_allowed_to_pass");
49+
planner_param_.v2i_velocity_threshold =
50+
getOrDeclareParameter<double>(node, ns + ".v2i.velocity_threshold");
51+
planner_param_.v2i_required_time_to_departure =
52+
getOrDeclareParameter<double>(node, ns + ".v2i.required_time_to_departure");
53+
4654
pub_tl_state_ = node.create_publisher<autoware_perception_msgs::msg::TrafficSignal>(
4755
"~/output/traffic_signal", 1);
4856
}

planning/behavior_velocity_traffic_light_module/src/scene.cpp

+38
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,28 @@ bool TrafficLightModule::modifyPathVelocity(PathWithLaneId * path, StopReason *
231231
// Check if stop is coming.
232232
const bool is_stop_signal = isStopSignal();
233233

234+
// Decide if stop or proceed using the remaining time to red signal
235+
const auto rest_time_to_red_signal =
236+
planner_data_->getRestTimeToRedSignal(traffic_light_reg_elem_.id());
237+
if (
238+
planner_param_.v2i_use_rest_time && rest_time_to_red_signal &&
239+
!isDataTimeout(rest_time_to_red_signal->stamp)) {
240+
const double rest_time_allowed_to_go_ahead =
241+
rest_time_to_red_signal->time_to_red - planner_param_.v2i_last_time_allowed_to_pass;
242+
243+
const double ego_v = planner_data_->current_velocity->twist.linear.x;
244+
if (ego_v >= planner_param_.v2i_velocity_threshold) {
245+
if (ego_v * rest_time_allowed_to_go_ahead <= signed_arc_length_to_stop_point) {
246+
*path = insertStopPose(input_path, stop_line_point_idx, stop_line_point, stop_reason);
247+
}
248+
} else {
249+
if (rest_time_allowed_to_go_ahead < planner_param_.v2i_required_time_to_departure) {
250+
*path = insertStopPose(input_path, stop_line_point_idx, stop_line_point, stop_reason);
251+
}
252+
}
253+
return true;
254+
}
255+
234256
// Update stop signal received time
235257
if (is_stop_signal) {
236258
if (!stop_signal_received_time_ptr_) {
@@ -298,6 +320,9 @@ void TrafficLightModule::updateTrafficSignal()
298320
TrafficSignalStamped signal;
299321
if (!findValidTrafficSignal(signal)) {
300322
// Don't stop if it never receives traffic light topic.
323+
// Reset looking_tl_state
324+
looking_tl_state_.elements.clear();
325+
looking_tl_state_.traffic_signal_id = 0;
301326
return;
302327
}
303328

@@ -476,4 +501,17 @@ bool TrafficLightModule::hasTrafficLightShape(
476501
return it_lamp != tl_state.elements.end();
477502
}
478503

504+
bool TrafficLightModule::isDataTimeout(const rclcpp::Time & data_time) const
505+
{
506+
const auto now = clock_->now();
507+
const bool is_data_timeout = (now - data_time).seconds() > planner_param_.tl_state_timeout;
508+
if (is_data_timeout) {
509+
RCLCPP_WARN_STREAM_THROTTLE(
510+
logger_, *clock_, 5000 /* ms */,
511+
"data is timeout. time diff: " << (now - data_time).seconds());
512+
}
513+
514+
return is_data_timeout;
515+
}
516+
479517
} // namespace behavior_velocity_planner

planning/behavior_velocity_traffic_light_module/src/scene.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ class TrafficLightModule : public SceneModuleInterface
6363
double yellow_lamp_period;
6464
double stop_time_hysteresis;
6565
bool enable_pass_judge;
66+
bool v2i_use_rest_time;
67+
double v2i_last_time_allowed_to_pass;
68+
double v2i_velocity_threshold;
69+
double v2i_required_time_to_departure;
6670
};
6771

6872
public:
@@ -108,6 +112,8 @@ class TrafficLightModule : public SceneModuleInterface
108112

109113
void updateTrafficSignal();
110114

115+
bool isDataTimeout(const rclcpp::Time & data_time) const;
116+
111117
// Lane id
112118
const int64_t lane_id_;
113119

0 commit comments

Comments
 (0)