Skip to content

Commit 566a60c

Browse files
maxime-clemKhalilSelyan
authored and
KhalilSelyan
committed
feat(motion_velocity_planner): use polling subscriber to efficiently get messages (#7223)
* feat(motion_velocity_planner): use polling subscriber for odometry topic Signed-off-by: Maxime CLEMENT <maxime.clement@tier4.jp> * use polling subscribers for more topics Signed-off-by: Maxime CLEMENT <maxime.clement@tier4.jp> * remove blocking mutex lock when processing traffic lights Signed-off-by: Maxime CLEMENT <maxime.clement@tier4.jp> * fix assign after return Signed-off-by: Maxime CLEMENT <maxime.clement@tier4.jp> --------- Signed-off-by: Maxime CLEMENT <maxime.clement@tier4.jp>
1 parent 02182e1 commit 566a60c

File tree

5 files changed

+85
-132
lines changed

5 files changed

+85
-132
lines changed

planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/filter_predicted_objects.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ autoware_perception_msgs::msg::PredictedObjects filter_predicted_objects(
103103
const PlannerParam & params)
104104
{
105105
autoware_perception_msgs::msg::PredictedObjects filtered_objects;
106-
filtered_objects.header = planner_data->predicted_objects->header;
107-
for (const auto & object : planner_data->predicted_objects->objects) {
106+
filtered_objects.header = planner_data->predicted_objects.header;
107+
for (const auto & object : planner_data->predicted_objects.objects) {
108108
const auto is_pedestrian =
109109
std::find_if(object.classification.begin(), object.classification.end(), [](const auto & c) {
110110
return c.label == autoware_perception_msgs::msg::ObjectClassification::PEDESTRIAN;

planning/motion_velocity_planner/autoware_motion_velocity_out_of_lane_module/src/out_of_lane_module.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -154,11 +154,11 @@ VelocityPlanningResult OutOfLaneModule::plan(
154154
tier4_autoware_utils::StopWatch<std::chrono::microseconds> stopwatch;
155155
stopwatch.tic();
156156
out_of_lane::EgoData ego_data;
157-
ego_data.pose = planner_data->current_odometry->pose;
157+
ego_data.pose = planner_data->current_odometry.pose.pose;
158158
ego_data.trajectory_points = ego_trajectory_points;
159159
ego_data.first_trajectory_idx =
160160
motion_utils::findNearestSegmentIndex(ego_trajectory_points, ego_data.pose.position);
161-
ego_data.velocity = planner_data->current_velocity->twist.linear.x;
161+
ego_data.velocity = planner_data->current_odometry.twist.twist.linear.x;
162162
ego_data.max_decel = planner_data->velocity_smoother_->getMinDecel();
163163
stopwatch.tic("calculate_trajectory_footprints");
164164
const auto current_ego_footprint =

planning/motion_velocity_planner/autoware_motion_velocity_planner_common/include/autoware_motion_velocity_planner_common/planner_data.hpp

+7-9
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@
2424
#include <autoware_perception_msgs/msg/traffic_light_group.hpp>
2525
#include <autoware_perception_msgs/msg/traffic_light_group_array.hpp>
2626
#include <geometry_msgs/msg/accel_with_covariance_stamped.hpp>
27-
#include <geometry_msgs/msg/pose_stamped.hpp>
28-
#include <geometry_msgs/msg/twist_stamped.hpp>
2927
#include <nav_msgs/msg/occupancy_grid.hpp>
28+
#include <nav_msgs/msg/odometry.hpp>
3029
#include <sensor_msgs/msg/point_cloud2.hpp>
3130
#include <std_msgs/msg/header.hpp>
3231
#include <tier4_api_msgs/msg/crosswalk_status.hpp>
@@ -60,12 +59,11 @@ struct PlannerData
6059
}
6160

6261
// msgs from callbacks that are used for data-ready
63-
geometry_msgs::msg::PoseStamped::ConstSharedPtr current_odometry;
64-
geometry_msgs::msg::TwistStamped::ConstSharedPtr current_velocity;
65-
geometry_msgs::msg::AccelWithCovarianceStamped::ConstSharedPtr current_acceleration;
66-
autoware_perception_msgs::msg::PredictedObjects::ConstSharedPtr predicted_objects;
67-
pcl::PointCloud<pcl::PointXYZ>::ConstPtr no_ground_pointcloud;
68-
nav_msgs::msg::OccupancyGrid::ConstSharedPtr occupancy_grid;
62+
nav_msgs::msg::Odometry current_odometry{};
63+
geometry_msgs::msg::AccelWithCovarianceStamped current_acceleration{};
64+
autoware_perception_msgs::msg::PredictedObjects predicted_objects{};
65+
pcl::PointCloud<pcl::PointXYZ> no_ground_pointcloud{};
66+
nav_msgs::msg::OccupancyGrid occupancy_grid{};
6967
std::shared_ptr<route_handler::RouteHandler> route_handler;
7068

7169
// nearest search
@@ -78,7 +76,7 @@ struct PlannerData
7876
std::map<lanelet::Id, TrafficSignalStamped> traffic_light_id_map_raw_;
7977
std::map<lanelet::Id, TrafficSignalStamped> traffic_light_id_map_last_observed_;
8078
std::optional<tier4_planning_msgs::msg::VelocityLimit> external_velocity_limit;
81-
tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr virtual_traffic_light_states;
79+
tier4_v2x_msgs::msg::VirtualTrafficLightStateArray virtual_traffic_light_states;
8280

8381
// velocity smoother
8482
std::shared_ptr<autoware::velocity_smoother::SmootherBase> velocity_smoother_{};

planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.cpp

+48-99
Original file line numberDiff line numberDiff line change
@@ -63,38 +63,10 @@ MotionVelocityPlannerNode::MotionVelocityPlannerNode(const rclcpp::NodeOptions &
6363
sub_trajectory_ = this->create_subscription<autoware_planning_msgs::msg::Trajectory>(
6464
"~/input/trajectory", 1, std::bind(&MotionVelocityPlannerNode::on_trajectory, this, _1),
6565
create_subscription_options(this));
66-
sub_predicted_objects_ =
67-
this->create_subscription<autoware_perception_msgs::msg::PredictedObjects>(
68-
"~/input/dynamic_objects", 1,
69-
std::bind(&MotionVelocityPlannerNode::on_predicted_objects, this, _1),
70-
create_subscription_options(this));
71-
sub_no_ground_pointcloud_ = this->create_subscription<sensor_msgs::msg::PointCloud2>(
72-
"~/input/no_ground_pointcloud", rclcpp::SensorDataQoS(),
73-
std::bind(&MotionVelocityPlannerNode::on_no_ground_pointcloud, this, _1),
74-
create_subscription_options(this));
75-
sub_vehicle_odometry_ = this->create_subscription<nav_msgs::msg::Odometry>(
76-
"~/input/vehicle_odometry", 1, std::bind(&MotionVelocityPlannerNode::on_odometry, this, _1),
77-
create_subscription_options(this));
78-
sub_acceleration_ = this->create_subscription<geometry_msgs::msg::AccelWithCovarianceStamped>(
79-
"~/input/accel", 1, std::bind(&MotionVelocityPlannerNode::on_acceleration, this, _1),
80-
create_subscription_options(this));
8166
sub_lanelet_map_ = this->create_subscription<autoware_map_msgs::msg::LaneletMapBin>(
8267
"~/input/vector_map", rclcpp::QoS(10).transient_local(),
8368
std::bind(&MotionVelocityPlannerNode::on_lanelet_map, this, _1),
8469
create_subscription_options(this));
85-
sub_traffic_signals_ =
86-
this->create_subscription<autoware_perception_msgs::msg::TrafficLightGroupArray>(
87-
"~/input/traffic_signals", 1,
88-
std::bind(&MotionVelocityPlannerNode::on_traffic_signals, this, _1),
89-
create_subscription_options(this));
90-
sub_virtual_traffic_light_states_ =
91-
this->create_subscription<tier4_v2x_msgs::msg::VirtualTrafficLightStateArray>(
92-
"~/input/virtual_traffic_light_states", 1,
93-
std::bind(&MotionVelocityPlannerNode::on_virtual_traffic_light_states, this, _1),
94-
create_subscription_options(this));
95-
sub_occupancy_grid_ = this->create_subscription<nav_msgs::msg::OccupancyGrid>(
96-
"~/input/occupancy_grid", 1, std::bind(&MotionVelocityPlannerNode::on_occupancy_grid, this, _1),
97-
create_subscription_options(this));
9870

9971
srv_load_plugin_ = create_service<LoadPlugin>(
10072
"~/service/load_plugin", std::bind(&MotionVelocityPlannerNode::on_load_plugin, this, _1, _2));
@@ -151,45 +123,59 @@ void MotionVelocityPlannerNode::on_unload_plugin(
151123
}
152124

153125
// NOTE: argument planner_data must not be referenced for multithreading
154-
bool MotionVelocityPlannerNode::is_data_ready() const
126+
bool MotionVelocityPlannerNode::update_planner_data()
155127
{
156-
const auto & d = planner_data_;
157128
auto clock = *get_clock();
158-
const auto check_with_msg = [&](const auto ptr, const auto & msg) {
129+
auto is_ready = true;
130+
const auto check_with_log = [&](const auto ptr, const auto & log) {
159131
constexpr auto throttle_duration = 3000; // [ms]
160132
if (!ptr) {
161-
RCLCPP_INFO_THROTTLE(get_logger(), clock, throttle_duration, msg);
133+
RCLCPP_INFO_THROTTLE(get_logger(), clock, throttle_duration, log);
134+
is_ready = false;
162135
return false;
163136
}
164137
return true;
165138
};
166139

167-
return check_with_msg(d.current_odometry, "Waiting for current odometry") &&
168-
check_with_msg(d.current_velocity, "Waiting for current velocity") &&
169-
check_with_msg(d.current_acceleration, "Waiting for current acceleration") &&
170-
check_with_msg(d.predicted_objects, "Waiting for predicted objects") &&
171-
check_with_msg(d.no_ground_pointcloud, "Waiting for pointcloud") &&
172-
check_with_msg(map_ptr_, "Waiting for the map") &&
173-
check_with_msg(
174-
d.velocity_smoother_, "Waiting for the initialization of the velocity smoother") &&
175-
check_with_msg(d.occupancy_grid, "Waiting for the occupancy grid");
176-
}
140+
const auto ego_state_ptr = sub_vehicle_odometry_.takeData();
141+
if (check_with_log(ego_state_ptr, "Waiting for current odometry"))
142+
planner_data_.current_odometry = *ego_state_ptr;
177143

178-
void MotionVelocityPlannerNode::on_occupancy_grid(
179-
const nav_msgs::msg::OccupancyGrid::ConstSharedPtr msg)
180-
{
181-
std::lock_guard<std::mutex> lock(mutex_);
182-
planner_data_.occupancy_grid = msg;
183-
}
144+
const auto ego_accel_ptr = sub_acceleration_.takeData();
145+
if (check_with_log(ego_accel_ptr, "Waiting for current acceleration"))
146+
planner_data_.current_acceleration = *ego_accel_ptr;
184147

185-
void MotionVelocityPlannerNode::on_predicted_objects(
186-
const autoware_perception_msgs::msg::PredictedObjects::ConstSharedPtr msg)
187-
{
188-
std::lock_guard<std::mutex> lock(mutex_);
189-
planner_data_.predicted_objects = msg;
148+
const auto predicted_objects_ptr = sub_predicted_objects_.takeData();
149+
if (check_with_log(predicted_objects_ptr, "Waiting for predicted objects"))
150+
planner_data_.predicted_objects = *predicted_objects_ptr;
151+
152+
const auto no_ground_pointcloud_ptr = sub_no_ground_pointcloud_.takeData();
153+
if (check_with_log(no_ground_pointcloud_ptr, "Waiting for pointcloud")) {
154+
const auto no_ground_pointcloud = process_no_ground_pointcloud(no_ground_pointcloud_ptr);
155+
if (no_ground_pointcloud) planner_data_.no_ground_pointcloud = *no_ground_pointcloud;
156+
}
157+
158+
const auto occupancy_grid_ptr = sub_occupancy_grid_.takeData();
159+
if (check_with_log(occupancy_grid_ptr, "Waiting for the occupancy grid"))
160+
planner_data_.occupancy_grid = *occupancy_grid_ptr;
161+
162+
// here we use bitwise operator to not short-circuit the logging messages
163+
is_ready &= check_with_log(map_ptr_, "Waiting for the map");
164+
is_ready &= check_with_log(
165+
planner_data_.velocity_smoother_, "Waiting for the initialization of the velocity smoother");
166+
167+
// optional data
168+
const auto traffic_signals_ptr = sub_traffic_signals_.takeData();
169+
if (traffic_signals_ptr) process_traffic_signals(traffic_signals_ptr);
170+
const auto virtual_traffic_light_states_ptr = sub_virtual_traffic_light_states_.takeData();
171+
if (virtual_traffic_light_states_ptr)
172+
planner_data_.virtual_traffic_light_states = *virtual_traffic_light_states_ptr;
173+
174+
return is_ready;
190175
}
191176

192-
void MotionVelocityPlannerNode::on_no_ground_pointcloud(
177+
std::optional<pcl::PointCloud<pcl::PointXYZ>>
178+
MotionVelocityPlannerNode::process_no_ground_pointcloud(
193179
const sensor_msgs::msg::PointCloud2::ConstSharedPtr msg)
194180
{
195181
geometry_msgs::msg::TransformStamped transform;
@@ -198,44 +184,16 @@ void MotionVelocityPlannerNode::on_no_ground_pointcloud(
198184
"map", msg->header.frame_id, msg->header.stamp, rclcpp::Duration::from_seconds(0.1));
199185
} catch (tf2::TransformException & e) {
200186
RCLCPP_WARN(get_logger(), "no transform found for no_ground_pointcloud: %s", e.what());
201-
return;
187+
return {};
202188
}
203189

204190
pcl::PointCloud<pcl::PointXYZ> pc;
205191
pcl::fromROSMsg(*msg, pc);
206192

207193
Eigen::Affine3f affine = tf2::transformToEigen(transform.transform).cast<float>();
208194
pcl::PointCloud<pcl::PointXYZ>::Ptr pc_transformed(new pcl::PointCloud<pcl::PointXYZ>);
209-
if (!pc.empty()) {
210-
tier4_autoware_utils::transformPointCloud(pc, *pc_transformed, affine);
211-
}
212-
213-
{
214-
std::lock_guard<std::mutex> lock(mutex_);
215-
planner_data_.no_ground_pointcloud = pc_transformed;
216-
}
217-
}
218-
219-
void MotionVelocityPlannerNode::on_odometry(const nav_msgs::msg::Odometry::ConstSharedPtr msg)
220-
{
221-
std::lock_guard<std::mutex> lock(mutex_);
222-
223-
auto current_odometry = std::make_shared<geometry_msgs::msg::PoseStamped>();
224-
current_odometry->header = msg->header;
225-
current_odometry->pose = msg->pose.pose;
226-
planner_data_.current_odometry = current_odometry;
227-
228-
auto current_velocity = std::make_shared<geometry_msgs::msg::TwistStamped>();
229-
current_velocity->header = msg->header;
230-
current_velocity->twist = msg->twist.twist;
231-
planner_data_.current_velocity = current_velocity;
232-
}
233-
234-
void MotionVelocityPlannerNode::on_acceleration(
235-
const geometry_msgs::msg::AccelWithCovarianceStamped::ConstSharedPtr msg)
236-
{
237-
std::lock_guard<std::mutex> lock(mutex_);
238-
planner_data_.current_acceleration = msg;
195+
if (!pc.empty()) tier4_autoware_utils::transformPointCloud(pc, *pc_transformed, affine);
196+
return *pc_transformed;
239197
}
240198

241199
void MotionVelocityPlannerNode::set_velocity_smoother_params()
@@ -253,11 +211,9 @@ void MotionVelocityPlannerNode::on_lanelet_map(
253211
has_received_map_ = true;
254212
}
255213

256-
void MotionVelocityPlannerNode::on_traffic_signals(
214+
void MotionVelocityPlannerNode::process_traffic_signals(
257215
const autoware_perception_msgs::msg::TrafficLightGroupArray::ConstSharedPtr msg)
258216
{
259-
std::lock_guard<std::mutex> lock(mutex_);
260-
261217
// clear previous observation
262218
planner_data_.traffic_light_id_map_raw_.clear();
263219
const auto traffic_light_id_map_last_observed_old =
@@ -290,19 +246,12 @@ void MotionVelocityPlannerNode::on_traffic_signals(
290246
}
291247
}
292248

293-
void MotionVelocityPlannerNode::on_virtual_traffic_light_states(
294-
const tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr msg)
295-
{
296-
std::lock_guard<std::mutex> lock(mutex_);
297-
planner_data_.virtual_traffic_light_states = msg;
298-
}
299-
300249
void MotionVelocityPlannerNode::on_trajectory(
301250
const autoware_planning_msgs::msg::Trajectory::ConstSharedPtr input_trajectory_msg)
302251
{
303252
std::unique_lock<std::mutex> lk(mutex_);
304253

305-
if (!is_data_ready()) {
254+
if (!update_planner_data()) {
306255
return;
307256
}
308257

@@ -367,9 +316,9 @@ autoware::motion_velocity_planner::TrajectoryPoints MotionVelocityPlannerNode::s
367316
const autoware::motion_velocity_planner::TrajectoryPoints & trajectory_points,
368317
const autoware::motion_velocity_planner::PlannerData & planner_data) const
369318
{
370-
const geometry_msgs::msg::Pose current_pose = planner_data.current_odometry->pose;
371-
const double v0 = planner_data.current_velocity->twist.linear.x;
372-
const double a0 = planner_data.current_acceleration->accel.accel.linear.x;
319+
const geometry_msgs::msg::Pose current_pose = planner_data.current_odometry.pose.pose;
320+
const double v0 = planner_data.current_odometry.twist.twist.linear.x;
321+
const double a0 = planner_data.current_acceleration.accel.accel.linear.x;
373322
const auto & external_v_limit = planner_data.external_velocity_limit;
374323
const auto & smoother = planner_data.velocity_smoother_;
375324

planning/motion_velocity_planner/autoware_motion_velocity_planner_node/src/node.hpp

+26-20
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@
2222
#include <autoware_motion_velocity_planner_node/srv/unload_plugin.hpp>
2323
#include <rclcpp/rclcpp.hpp>
2424
#include <tier4_autoware_utils/ros/logger_level_configure.hpp>
25+
#include <tier4_autoware_utils/ros/polling_subscriber.hpp>
2526
#include <tier4_autoware_utils/ros/published_time_publisher.hpp>
2627

2728
#include <autoware_map_msgs/msg/lanelet_map_bin.hpp>
2829
#include <autoware_perception_msgs/msg/predicted_objects.hpp>
30+
#include <autoware_perception_msgs/msg/traffic_signal_array.hpp>
2931
#include <autoware_planning_msgs/msg/trajectory.hpp>
3032
#include <nav_msgs/msg/occupancy_grid.hpp>
3133
#include <nav_msgs/msg/odometry.hpp>
@@ -60,31 +62,33 @@ class MotionVelocityPlannerNode : public rclcpp::Node
6062

6163
// subscriber
6264
rclcpp::Subscription<autoware_planning_msgs::msg::Trajectory>::SharedPtr sub_trajectory_;
63-
rclcpp::Subscription<autoware_perception_msgs::msg::PredictedObjects>::SharedPtr
64-
sub_predicted_objects_;
65-
rclcpp::Subscription<sensor_msgs::msg::PointCloud2>::SharedPtr sub_no_ground_pointcloud_;
66-
rclcpp::Subscription<nav_msgs::msg::Odometry>::SharedPtr sub_vehicle_odometry_;
67-
rclcpp::Subscription<geometry_msgs::msg::AccelWithCovarianceStamped>::SharedPtr sub_acceleration_;
65+
tier4_autoware_utils::InterProcessPollingSubscriber<
66+
autoware_perception_msgs::msg::PredictedObjects>
67+
sub_predicted_objects_{this, "~/input/dynamic_objects"};
68+
tier4_autoware_utils::InterProcessPollingSubscriber<sensor_msgs::msg::PointCloud2>
69+
sub_no_ground_pointcloud_{this, "~/input/no_ground_pointcloud"};
70+
tier4_autoware_utils::InterProcessPollingSubscriber<nav_msgs::msg::Odometry>
71+
sub_vehicle_odometry_{this, "~/input/vehicle_odometry"};
72+
tier4_autoware_utils::InterProcessPollingSubscriber<
73+
geometry_msgs::msg::AccelWithCovarianceStamped>
74+
sub_acceleration_{this, "~/input/accel"};
75+
tier4_autoware_utils::InterProcessPollingSubscriber<nav_msgs::msg::OccupancyGrid>
76+
sub_occupancy_grid_{this, "~/input/occupancy_grid"};
77+
tier4_autoware_utils::InterProcessPollingSubscriber<
78+
autoware_perception_msgs::msg::TrafficLightGroupArray>
79+
sub_traffic_signals_{this, "~/input/traffic_signals"};
80+
tier4_autoware_utils::InterProcessPollingSubscriber<
81+
tier4_v2x_msgs::msg::VirtualTrafficLightStateArray>
82+
sub_virtual_traffic_light_states_{this, "~/input/virtual_traffic_light_states"};
6883
rclcpp::Subscription<autoware_map_msgs::msg::LaneletMapBin>::SharedPtr sub_lanelet_map_;
69-
rclcpp::Subscription<autoware_perception_msgs::msg::TrafficLightGroupArray>::SharedPtr
70-
sub_traffic_signals_;
71-
rclcpp::Subscription<tier4_v2x_msgs::msg::VirtualTrafficLightStateArray>::SharedPtr
72-
sub_virtual_traffic_light_states_;
73-
rclcpp::Subscription<nav_msgs::msg::OccupancyGrid>::SharedPtr sub_occupancy_grid_;
7484

7585
void on_trajectory(
7686
const autoware_planning_msgs::msg::Trajectory::ConstSharedPtr input_trajectory_msg);
77-
void on_predicted_objects(
78-
const autoware_perception_msgs::msg::PredictedObjects::ConstSharedPtr msg);
79-
void on_no_ground_pointcloud(const sensor_msgs::msg::PointCloud2::ConstSharedPtr msg);
80-
void on_odometry(const nav_msgs::msg::Odometry::ConstSharedPtr msg);
81-
void on_acceleration(const geometry_msgs::msg::AccelWithCovarianceStamped::ConstSharedPtr msg);
87+
std::optional<pcl::PointCloud<pcl::PointXYZ>> process_no_ground_pointcloud(
88+
const sensor_msgs::msg::PointCloud2::ConstSharedPtr msg);
8289
void on_lanelet_map(const autoware_map_msgs::msg::LaneletMapBin::ConstSharedPtr msg);
83-
void on_traffic_signals(
90+
void process_traffic_signals(
8491
const autoware_perception_msgs::msg::TrafficLightGroupArray::ConstSharedPtr msg);
85-
void on_virtual_traffic_light_states(
86-
const tier4_v2x_msgs::msg::VirtualTrafficLightStateArray::ConstSharedPtr msg);
87-
void on_occupancy_grid(const nav_msgs::msg::OccupancyGrid::ConstSharedPtr msg);
8892

8993
// publishers
9094
rclcpp::Publisher<autoware_planning_msgs::msg::Trajectory>::SharedPtr trajectory_pub_;
@@ -118,7 +122,9 @@ class MotionVelocityPlannerNode : public rclcpp::Node
118122
std::mutex mutex_;
119123

120124
// function
121-
bool is_data_ready() const;
125+
/// @brief update the PlannerData instance with the latest messages received
126+
/// @return false if some data is not available
127+
bool update_planner_data();
122128
void insert_stop(
123129
autoware_planning_msgs::msg::Trajectory & trajectory,
124130
const geometry_msgs::msg::Point & stop_point) const;

0 commit comments

Comments
 (0)