Skip to content

Commit 5cc6583

Browse files
committed
update for detected objects
update reaction analyzer update
1 parent 46a0581 commit 5cc6583

File tree

3 files changed

+75
-35
lines changed

3 files changed

+75
-35
lines changed

tools/reaction_analyzer/include/reaction_analyzer_node.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ struct NodeParams
117117
double control_cmd_buffer_time_interval;
118118
double min_jerk_for_brake_cmd;
119119
int min_number_descending_order_control_cmd;
120+
bool run_from_bag;
120121
};
121122

122123
class ReactionAnalyzerNode : public rclcpp::Node
@@ -137,7 +138,6 @@ class ReactionAnalyzerNode : public rclcpp::Node
137138
double entity_search_radius_;
138139

139140
// TEMP
140-
bool run_from_bag_{true};
141141
PointCloud2::SharedPtr msg_cloud_empty_;
142142
PointCloud2::SharedPtr msg_cloud_with_obj_;
143143

tools/reaction_analyzer/param/reaction_analyzer.param.yaml

+21-20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/**:
22
ros__parameters:
33
use_sim_time: true
4+
run_from_bag: true
45
path_bag_without_object: /home/berkay/projects/bags/awsim-bag/bag-without-car-full/rosbag2_2024_01_17-16_23_07_0.db3
56
path_bag_with_object: /home/berkay/projects/bags/awsim-bag/bag-with-car-full/rosbag2_2024_01_17-17_27_14_0.db3
67
topic_cloud: /sensing/lidar/top/pointcloud_raw_ex
@@ -54,30 +55,30 @@
5455
# vehicle_cmd_gate:
5556
# topic_name: /control/command/control_cmd
5657
# message_type: autoware_auto_control_msgs::msg::AckermannControlCommand
57-
ground_filtered_pointcloud:
58-
topic_name: /perception/obstacle_segmentation/single_frame/pointcloud_raw
59-
message_type: sensor_msgs::msg::PointCloud2
60-
obstacle_seg_pointcloud:
58+
# ground_filtered_pointcloud:
59+
# topic_name: /perception/obstacle_segmentation/single_frame/pointcloud_raw
60+
# message_type: sensor_msgs::msg::PointCloud2
61+
occupancy_grid_map_outlier:
6162
topic_name: /perception/obstacle_segmentation/pointcloud
6263
message_type: sensor_msgs::msg::PointCloud2
6364
voxel_based_compare_map_filter:
6465
topic_name: /perception/object_recognition/detection/pointcloud_map_filtered/pointcloud
6566
message_type: sensor_msgs::msg::PointCloud2
66-
# cropbox_filter_self:
67-
# topic_name: /sensing/lidar/top/self_cropped/pointcloud_ex
68-
# message_type: sensor_msgs::msg::PointCloud2
69-
# cropbox_filter_mirror:
70-
# topic_name: /sensing/lidar/top/mirror_cropped/pointcloud_ex
71-
# message_type: sensor_msgs::msg::PointCloud2
72-
# distortion_corrector:
73-
# topic_name: /sensing/lidar/top/rectified/pointcloud_ex
74-
# message_type: sensor_msgs::msg::PointCloud2
75-
# outlier_filter:
76-
# topic_name: /sensing/lidar/top/outlier_filtered/pointcloud
77-
# message_type: sensor_msgs::msg::PointCloud2
78-
# concat_pointcloud:
79-
# topic_name: /sensing/lidar/top/concatenated/pointcloud
80-
# message_type: sensor_msgs::msg::PointCloud2
81-
predicted_objects_topic:
67+
lidar_centerpoint:
68+
topic_name: /perception/object_recognition/detection/centerpoint/objects
69+
message_type: autoware_auto_perception_msgs::msg::DetectedObjects
70+
obstacle_pointcloud_based_validator:
71+
topic_name: /perception/object_recognition/detection/centerpoint/validation/objects
72+
message_type: autoware_auto_perception_msgs::msg::DetectedObjects
73+
detected_object_feature_remover:
74+
topic_name: /perception/object_recognition/detection/clustering/objects
75+
message_type: autoware_auto_perception_msgs::msg::DetectedObjects
76+
detection_by_tracker:
77+
topic_name: /perception/object_recognition/detection/detection_by_tracker/objects
78+
message_type: autoware_auto_perception_msgs::msg::DetectedObjects
79+
object_lanelet_filter:
80+
topic_name: /perception/object_recognition/detection/objects
81+
message_type: autoware_auto_perception_msgs::msg::DetectedObjects
82+
map_based_prediction:
8283
topic_name: /perception/object_recognition/objects
8384
message_type: autoware_auto_perception_msgs::msg::PredictedObjects

tools/reaction_analyzer/src/reaction_analyzer_node.cpp

+53-14
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,19 @@ void ReactionAnalyzerNode::pointcloud2OutputCallback(
110110
const auto current_odometry_ptr = odometry_;
111111
// const auto is_spawned = spawn_cmd_time_;
112112
mutex_.unlock();
113-
if (!current_odometry_ptr) return;
114113

115114
if (!std::holds_alternative<PointCloud2Buffer>(variant)) {
116115
// If the variant doesn't hold a Trajectory message yet, initialize it
117116
PointCloud2Buffer buffer(std::nullopt);
118117
variant = buffer;
118+
mutex_.lock();
119+
message_buffers_[node_name] = variant;
120+
mutex_.unlock();
119121
} else if (std::get<PointCloud2Buffer>(variant).has_value()) {
120122
// reacted
121123
return;
122124
}
125+
if (!current_odometry_ptr) return;
123126

124127
// transform pointcloud
125128
geometry_msgs::msg::TransformStamped transform_stamped{};
@@ -156,17 +159,23 @@ void ReactionAnalyzerNode::predictedObjectsOutputCallback(
156159
{
157160
mutex_.lock();
158161
auto variant = message_buffers_[node_name];
162+
const auto current_odometry_ptr = odometry_;
159163
// const auto is_spawned = spawn_cmd_time_;
160164
mutex_.unlock();
161165

162166
if (!std::holds_alternative<PredictedObjectsBuffer>(variant)) {
163167
// If the variant doesn't hold a Trajectory message yet, initialize it
164168
PredictedObjectsBuffer buffer(std::nullopt);
165169
variant = buffer;
170+
mutex_.lock();
171+
message_buffers_[node_name] = variant;
172+
mutex_.unlock();
166173
} else if (std::get<PredictedObjectsBuffer>(variant).has_value()) {
167174
// reacted
168175
return;
169176
}
177+
if (!current_odometry_ptr || msg_ptr->objects.empty()) return;
178+
170179
if (searchPredictedObjectsNearEntity(*msg_ptr)) {
171180
std::get<PredictedObjectsBuffer>(variant) = *msg_ptr;
172181
std::cout << "Reacted " << node_name << std::endl;
@@ -182,19 +191,45 @@ void ReactionAnalyzerNode::detectedObjectsOutputCallback(
182191
{
183192
mutex_.lock();
184193
auto variant = message_buffers_[node_name];
194+
const auto current_odometry_ptr = odometry_;
185195
// const auto is_spawned = spawn_cmd_time_;
186196
mutex_.unlock();
187197

188198
if (!std::holds_alternative<DetectedObjectsBuffer>(variant)) {
189199
// If the variant doesn't hold a Trajectory message yet, initialize it
190200
DetectedObjectsBuffer buffer(std::nullopt);
191201
variant = buffer;
202+
mutex_.lock();
203+
message_buffers_[node_name] = variant;
204+
mutex_.unlock();
192205
} else if (std::get<DetectedObjectsBuffer>(variant).has_value()) {
193206
// reacted
194207
return;
195208
}
196-
if (searchDetectedObjectsNearEntity(*msg_ptr)) {
209+
210+
if (!current_odometry_ptr || msg_ptr->objects.empty()) return;
211+
212+
// transform pointcloud
213+
geometry_msgs::msg::TransformStamped transform_stamped{};
214+
try {
215+
transform_stamped = tf_buffer_.lookupTransform(
216+
"map", msg_ptr->header.frame_id, this->now(), rclcpp::Duration::from_seconds(0.5));
217+
} catch (tf2::TransformException & ex) {
218+
RCLCPP_ERROR_STREAM(
219+
get_logger(), "Failed to look up transform from " << msg_ptr->header.frame_id << " to map");
220+
return;
221+
}
222+
DetectedObjects output_objs;
223+
output_objs = *msg_ptr;
224+
for (auto & obj : output_objs.objects) {
225+
geometry_msgs::msg::PoseStamped output_stamped, input_stamped;
226+
input_stamped.pose = obj.kinematics.pose_with_covariance.pose;
227+
tf2::doTransform(input_stamped, output_stamped, transform_stamped);
228+
obj.kinematics.pose_with_covariance.pose = output_stamped.pose;
229+
}
230+
if (searchDetectedObjectsNearEntity(output_objs)) {
197231
std::get<DetectedObjectsBuffer>(variant) = *msg_ptr;
232+
std::cout << "Reacted " << node_name << std::endl;
198233
}
199234
// if (!is_spawned) return;
200235
mutex_.lock();
@@ -241,6 +276,9 @@ ReactionAnalyzerNode::ReactionAnalyzerNode(rclcpp::NodeOptions options)
241276
get_parameter("observer.min_jerk_for_brake_cmd").as_double();
242277
node_params_.min_number_descending_order_control_cmd =
243278
get_parameter("observer.min_number_descending_order_control_cmd").as_int();
279+
node_params_.run_from_bag =
280+
get_parameter("run_from_bag").as_bool();
281+
244282

245283
// prepare the object which will be spawned
246284
entity_params_.x = get_parameter("test_manager.entity.x").as_double();
@@ -295,15 +333,15 @@ ReactionAnalyzerNode::ReactionAnalyzerNode(rclcpp::NodeOptions options)
295333
pub_initial_pose_ = create_publisher<geometry_msgs::msg::PoseWithCovarianceStamped>(
296334
"output/initialpose", rclcpp::QoS(1));
297335
pub_goal_pose_ = create_publisher<geometry_msgs::msg::PoseStamped>("output/goal", rclcpp::QoS(1));
298-
if (!run_from_bag_) {
336+
if (!node_params_.run_from_bag) {
299337
pub_pointcloud_ = create_publisher<PointCloud2>(
300338
"/perception/obstacle_segmentation/pointcloud", rclcpp::SensorDataQoS());
301339
}
302340

303341
pub_predicted_objects_ = create_publisher<PredictedObjects>("output/objects", rclcpp::QoS(1));
304342

305343
client_change_to_autonomous_ = create_client<ChangeOperationMode>("service/change_to_autonomous");
306-
if (run_from_bag_) {
344+
if (node_params_.run_from_bag) {
307345
// init pointcloud in bags
308346
const std::string path_bag_without_object =
309347
get_parameter("path_bag_without_object").as_string();
@@ -408,7 +446,7 @@ void ReactionAnalyzerNode::onTimer()
408446
const auto message_buffers = message_buffers_;
409447
auto spawn_cmd_time = spawn_cmd_time_;
410448
mutex_.unlock();
411-
if (!run_from_bag_) {
449+
if (!node_params_.run_from_bag) {
412450
if (!is_test_environment_created_) {
413451
initEgoForTest(initialization_state_ptr, route_state_ptr);
414452
return;
@@ -451,7 +489,7 @@ void ReactionAnalyzerNode::onTimer()
451489
return;
452490
} else {
453491
rclcpp::Duration time_diff = this->now() - last_test_environment_init_time_.value();
454-
if (time_diff > rclcpp::Duration::from_seconds(10.0)) {
492+
if (time_diff > rclcpp::Duration::from_seconds(50.0)) {
455493
if (!spawn_cmd_time) {
456494
spawn_cmd_time = this->now();
457495
mutex_.lock();
@@ -591,18 +629,18 @@ void ReactionAnalyzerNode::printResults(
591629
const std::pair<std::string, rclcpp::Time> & b) { return a.second < b.second; });
592630

593631
// first print spawn_cmd_time to first reaction
594-
std::cout << "spawn_cmd_time to " << reaction_times.begin()->first << ": "
595-
<< createDurationMs(spawn_cmd_time_.value(), reaction_times.begin()->second)
596-
<< std::endl;
632+
// std::cout << "spawn_cmd_time to " << reaction_times.begin()->first << ": "
633+
// << createDurationMs(spawn_cmd_time_.value(), reaction_times.begin()->second)
634+
// << std::endl;
597635

598-
if (reaction_times.size() < 2) return;
636+
// if (reaction_times.size() < 2) return;
599637

600-
for (size_t i = 0; i < reaction_times.size() - 1; i++) {
638+
for (size_t i = 0; i < reaction_times.size(); i++) {
601639
const auto & first_reaction = reaction_times.at(i);
602-
const auto & second_reaction = reaction_times.at(i + 1);
640+
// const auto & second_reaction = reaction_times.at(i + 1);
603641

604-
std::cout << first_reaction.first << " to " << second_reaction.first << ": "
605-
<< createDurationMs(first_reaction.second, second_reaction.second) << std::endl;
642+
std::cout << "spawn_cmd_time to " << first_reaction.first << ": "
643+
<< createDurationMs(spawn_cmd_time_.value(), first_reaction.second) << std::endl;
606644
}
607645
is_output_printed_ = true;
608646
}
@@ -1049,4 +1087,5 @@ bool ReactionAnalyzerNode::searchDetectedObjectsNearEntity(const DetectedObjects
10491087
#include <rclcpp_components/register_node_macro.hpp>
10501088

10511089
#include <utility>
1090+
10521091
RCLCPP_COMPONENTS_REGISTER_NODE(reaction_analyzer::ReactionAnalyzerNode)

0 commit comments

Comments
 (0)