Skip to content

Commit 382ce1d

Browse files
committed
wip
Signed-off-by: Tomohito Ando <[email protected]>
1 parent 42fe0e9 commit 382ce1d

File tree

4 files changed

+37
-35
lines changed

4 files changed

+37
-35
lines changed

perception/traffic_light_arbiter/config/traffic_light_arbiter.param.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
external_time_tolerance: 5.0
44
perception_time_tolerance: 1.0
55
external_priority: false
6+
enable_signal_matching: false

perception/traffic_light_arbiter/include/traffic_light_arbiter/traffic_light_arbiter.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,12 @@ class TrafficLightArbiter : public rclcpp::Node
5353
double external_time_tolerance_;
5454
double perception_time_tolerance_;
5555
bool external_priority_;
56+
bool enable_signal_matching_;
5657

5758
TrafficSignalArray latest_perception_msg_;
5859
TrafficSignalArray latest_external_msg_;
5960

60-
SignalMatchValidator signal_match_validator_;
61+
std::unique_ptr<SignalMatchValidator> signal_match_validator_;
6162
};
6263

6364
#endif // TRAFFIC_LIGHT_ARBITER__TRAFFIC_LIGHT_ARBITER_HPP_

perception/traffic_light_arbiter/src/signal_match_validator.cpp

+22-25
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,21 @@ using TrafficSignal = autoware_perception_msgs::msg::TrafficSignal;
2121
using Element = autoware_perception_msgs::msg::TrafficSignalElement;
2222
using Time = builtin_interfaces::msg::Time;
2323

24-
// Finds a signal by its ID within a TrafficSignalArray.
24+
// Finds a signal by its ID within a TrafficSignalArray
2525
std::optional<TrafficSignal> find_signal_by_id(
2626
const TrafficSignalArray & signals, int64_t signal_id)
2727
{
2828
auto it = std::find_if(
2929
signals.signals.begin(), signals.signals.end(),
3030
[signal_id](const TrafficSignal & signal) { return signal.traffic_signal_id == signal_id; });
3131
if (it != signals.signals.end()) {
32-
return *it; // Return the found signal.
32+
return *it; // Return the found signal
3333
} else {
34-
return std::nullopt; // Return an empty optional if not found.
34+
return std::nullopt; // Return an empty optional if not found
3535
}
3636
}
3737

38-
// Creates a TrafficSignalElement with specified attributes.
38+
// Creates a TrafficSignalElement with specified attributes
3939
Element create_element(
4040
const Element::_color_type & color, const Element::_shape_type & shape,
4141
const Element::_status_type & status, const Element::_confidence_type & confidence)
@@ -49,7 +49,7 @@ Element create_element(
4949
return signal_element;
5050
}
5151

52-
// Creates unknown elements for each unique shape from two element vectors.
52+
// Creates unknown elements for each unique shape from two element vectors
5353
std::vector<Element> create_unknown_elements(
5454
const std::vector<Element> & elements1, const std::vector<Element> & elements2)
5555
{
@@ -63,21 +63,21 @@ std::vector<Element> create_unknown_elements(
6363

6464
std::vector<Element> unknown_elements;
6565
for (const auto & shape : shape_set) {
66-
// Confidence is set to a default value as it is not relevant for unknown signals.
66+
// Confidence is set to a default value as it is not relevant for unknown signals
6767
unknown_elements.emplace_back(
6868
create_element(Element::UNKNOWN, shape, Element::UNKNOWN, /* confidence */ 1.0));
6969
}
7070

7171
return unknown_elements;
7272
}
7373

74-
// Creates a 'unknown' signal with elements matching the shapes of a given signal's elements.
74+
// Creates a 'unknown' signal with elements matching the shapes of a given signal's elements
7575
TrafficSignal create_unknown_signal(const TrafficSignal & signal)
7676
{
7777
TrafficSignal unknown_signal;
7878
unknown_signal.traffic_signal_id = signal.traffic_signal_id;
7979
for (const auto & element : signal.elements) {
80-
// Confidence is set to a default value as it is not relevant for unknown signals.
80+
// Confidence is set to a default value as it is not relevant for unknown signals
8181
const auto unknown_element =
8282
create_element(Element::UNKNOWN, element.shape, Element::UNKNOWN, /* confidence */ 1.0);
8383
unknown_signal.elements.emplace_back(unknown_element);
@@ -86,12 +86,12 @@ TrafficSignal create_unknown_signal(const TrafficSignal & signal)
8686
return unknown_signal;
8787
}
8888

89-
// Creates an 'unknown' signal by combining unique shapes from two signals' elements.
89+
// Creates an 'unknown' signal by combining unique shapes from two signals' elements
9090
TrafficSignal create_unknown_signal(const TrafficSignal & signal1, const TrafficSignal & signal2)
9191
{
9292
TrafficSignal unknown_signal;
9393

94-
// Assumes that both signals have the same traffic_signal_id.
94+
// Assumes that both signals have the same traffic_signal_id
9595
unknown_signal.traffic_signal_id = signal1.traffic_signal_id;
9696

9797
const auto unknown_elements = create_unknown_elements(signal1.elements, signal2.elements);
@@ -106,25 +106,25 @@ TrafficSignal create_unknown_signal(const TrafficSignal & signal1, const Traffic
106106
bool are_all_elements_equivalent(
107107
const std::vector<Element> & signal1, const std::vector<Element> & signal2)
108108
{
109-
// Returns false if vectors have different sizes.
109+
// Returns false if vectors have different sizes
110110
if (signal1.size() != signal2.size()) {
111111
return false;
112112
}
113113

114-
// Sorts copies of the vectors by shape for comparison.
114+
// Sorts copies of the vectors by shape for comparison
115115
std::vector<Element> sorted_signal1 = signal1;
116116
std::vector<Element> sorted_signal2 = signal2;
117117
auto compare_by_shape = [](const Element & a, const Element & b) { return a.shape < b.shape; };
118118
std::sort(sorted_signal1.begin(), sorted_signal1.end(), compare_by_shape);
119119
std::sort(sorted_signal2.begin(), sorted_signal2.end(), compare_by_shape);
120120

121-
// Returns true if sorted vectors are equal.
121+
// Returns true if sorted vectors are equal
122122
return std::equal(
123123
sorted_signal1.begin(), sorted_signal1.end(), sorted_signal2.begin(), sorted_signal2.end(),
124124
[](const Element & a, const Element & b) { return a.color == b.color && a.shape == b.shape; });
125125
}
126126

127-
// Creates a set of unique signal IDs from two vectors of TrafficSignals.
127+
// Creates a set of unique signal IDs from two vectors of TrafficSignals
128128
std::unordered_set<lanelet::Id> create_signal_id_set(
129129
const std::vector<TrafficSignal> & signals1, const std::vector<TrafficSignal> & signals2)
130130
{
@@ -139,25 +139,25 @@ std::unordered_set<lanelet::Id> create_signal_id_set(
139139
return signal_id_set;
140140
}
141141

142-
// Returns the signal with the highest confidence elements, considering a external priority.
142+
// Returns the signal with the highest confidence elements, considering a external priority
143143
TrafficSignal get_highest_confidence_signal(
144144
const std::optional<TrafficSignal> & perception_signal,
145145
const std::optional<TrafficSignal> & external_signal, const bool external_priority)
146146
{
147-
// Returns the existing signal if only one of them exists.
147+
// Returns the existing signal if only one of them exists
148148
if (!perception_signal) {
149149
return *external_signal;
150150
}
151151
if (!external_signal) {
152152
return *perception_signal;
153153
}
154154

155-
// Gives priority to the external signal if external_priority is true.
155+
// Gives priority to the external signal if external_priority is true
156156
if (external_priority) {
157157
return *external_signal;
158158
}
159159

160-
// Compiles elements into a map by shape, to compare their confidences.
160+
// Compiles elements into a map by shape, to compare their confidences
161161
using Key = Element::_shape_type;
162162
std::map<Key, std::vector<Element>> shape_element_map;
163163
for (const auto & element : perception_signal->elements) {
@@ -169,10 +169,10 @@ TrafficSignal get_highest_confidence_signal(
169169

170170
TrafficSignal highest_confidence_signal;
171171

172-
// Assumes that both signals have the same traffic_signal_id.
172+
// Assumes that both signals have the same traffic_signal_id
173173
highest_confidence_signal.traffic_signal_id = perception_signal->traffic_signal_id;
174174

175-
// For each shape, finds the element with the highest confidence and adds it to the signal.
175+
// For each shape, finds the element with the highest confidence and adds it to the signal
176176
for (const auto & [shape, elements] : shape_element_map) {
177177
const auto highest_confidence_element = std::max_element(
178178
elements.begin(), elements.end(),
@@ -183,10 +183,10 @@ TrafficSignal get_highest_confidence_signal(
183183
return highest_confidence_signal;
184184
}
185185

186-
// Determines the newer of two Time stamps.
186+
// Determines the newer of two Time stamps
187187
Time get_newer_stamp(const Time & stamp1, const Time & stamp2)
188188
{
189-
// Returns stamp1 if it is newer than stamp2, otherwise returns stamp2.
189+
// Returns stamp1 if it is newer than stamp2, otherwise returns stamp2
190190
if (stamp1.sec > stamp2.sec || (stamp1.sec == stamp2.sec && stamp1.nanosec > stamp2.nanosec)) {
191191
return stamp1;
192192
} else {
@@ -242,15 +242,12 @@ autoware_perception_msgs::msg::TrafficSignalArray SignalMatchValidator::validate
242242
// Check if they have the same elements
243243
if (!util::are_all_elements_equivalent(
244244
perception_result->elements, external_result->elements)) {
245-
// RCLCPP_WARN_STREAM(rclcpp::get_logger("debug"), "Not the same signal");
246-
247245
const auto unknown_signal = util::create_unknown_signal(*perception_result, *external_result);
248246
validated_signals.signals.emplace_back(unknown_signal);
249247
continue;
250248
}
251249

252250
// Both results are same, then insert the received color
253-
// RCLCPP_WARN_STREAM(rclcpp::get_logger("debug"), "Both results are same");
254251
validated_signals.signals.emplace_back(*perception_result);
255252
}
256253

perception/traffic_light_arbiter/src/traffic_light_arbiter.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ namespace lanelet
3131
{
3232

3333
using TrafficLightConstPtr = std::shared_ptr<const TrafficLight>;
34-
using TrafficLightConstPtr = lanelet::TrafficLightConstPtr;
3534

3635
std::vector<TrafficLightConstPtr> filter_traffic_signals(const LaneletMapConstPtr map)
3736
{
@@ -73,8 +72,12 @@ TrafficLightArbiter::TrafficLightArbiter(const rclcpp::NodeOptions & options)
7372
external_time_tolerance_ = this->declare_parameter<double>("external_time_tolerance", 5.0);
7473
perception_time_tolerance_ = this->declare_parameter<double>("perception_time_tolerance", 1.0);
7574
external_priority_ = this->declare_parameter<bool>("external_priority", false);
75+
enable_signal_matching_ = this->declare_parameter<bool>("enable_signal_matching", false);
7676

77-
signal_match_validator_.setExternalPriority(external_priority_);
77+
if (enable_signal_matching_) {
78+
signal_match_validator_ = std::make_unique<SignalMatchValidator>();
79+
signal_match_validator_->setExternalPriority(external_priority_);
80+
}
7881

7982
map_sub_ = create_subscription<LaneletMapBin>(
8083
"~/sub/vector_map", rclcpp::QoS(1).transient_local(),
@@ -103,9 +106,11 @@ void TrafficLightArbiter::onMap(const LaneletMapBin::ConstSharedPtr msg)
103106
map_regulatory_elements_set_->emplace(signal->id());
104107
}
105108

106-
// Filter only pedestrian signals to distinguish them in compare function
107-
const auto pedestrian_signals = lanelet::filter_pedestrian_signals(map);
108-
signal_match_validator_.setPedestrianSignals(pedestrian_signals);
109+
if (enable_signal_matching_) {
110+
// Filter only pedestrian signals to distinguish them in compare function
111+
const auto pedestrian_signals = lanelet::filter_pedestrian_signals(map);
112+
signal_match_validator_->setPedestrianSignals(pedestrian_signals);
113+
}
109114
}
110115

111116
void TrafficLightArbiter::onPerceptionMsg(const TrafficSignalArray::ConstSharedPtr msg)
@@ -168,11 +173,9 @@ void TrafficLightArbiter::arbitrateAndPublish(const builtin_interfaces::msg::Tim
168173
}
169174
};
170175

171-
// TODO: parameter
172-
const bool validate_perception_and_external = true;
173-
if (validate_perception_and_external) {
176+
if (enable_signal_matching_) {
174177
const auto validated_signals =
175-
signal_match_validator_.validateSignals(latest_perception_msg_, latest_external_msg_);
178+
signal_match_validator_->validateSignals(latest_perception_msg_, latest_external_msg_);
176179
for (const auto & signal : validated_signals.signals) {
177180
add_signal_function(signal, false);
178181
}

0 commit comments

Comments
 (0)