Skip to content

Commit 8c70042

Browse files
committed
PR6976
Signed-off-by: Mamoru Sobue <mamoru.sobue@tier4.jp>
1 parent d47430c commit 8c70042

File tree

5 files changed

+104
-105
lines changed

5 files changed

+104
-105
lines changed

common/tier4_autoware_utils/include/tier4_autoware_utils/ros/polling_subscriber.hpp

+18-16
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
#include <rclcpp/rclcpp.hpp>
1919

20+
#include <memory>
21+
#include <stdexcept>
2022
#include <string>
2123

2224
namespace tier4_autoware_utils
@@ -27,37 +29,37 @@ class InterProcessPollingSubscriber
2729
{
2830
private:
2931
typename rclcpp::Subscription<T>::SharedPtr subscriber_;
30-
std::optional<T> data_;
32+
typename T::SharedPtr data_;
3133

3234
public:
33-
explicit InterProcessPollingSubscriber(rclcpp::Node * node, const std::string & topic_name)
35+
explicit InterProcessPollingSubscriber(
36+
rclcpp::Node * node, const std::string & topic_name, const rclcpp::QoS & qos = rclcpp::QoS{1})
3437
{
3538
auto noexec_callback_group =
3639
node->create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive, false);
3740
auto noexec_subscription_options = rclcpp::SubscriptionOptions();
3841
noexec_subscription_options.callback_group = noexec_callback_group;
3942

4043
subscriber_ = node->create_subscription<T>(
41-
topic_name, rclcpp::QoS{1},
44+
topic_name, qos,
4245
[node]([[maybe_unused]] const typename T::ConstSharedPtr msg) { assert(false); },
4346
noexec_subscription_options);
44-
};
45-
bool updateLatestData()
46-
{
47-
rclcpp::MessageInfo message_info;
48-
T tmp;
49-
// The queue size (QoS) must be 1 to get the last message data.
50-
if (subscriber_->take(tmp, message_info)) {
51-
data_ = tmp;
47+
if (qos.get_rmw_qos_profile().depth > 1) {
48+
throw std::invalid_argument(
49+
"InterProcessPollingSubscriber will be used with depth > 1, which may cause inefficient "
50+
"serialization while updateLatestData()");
5251
}
53-
return data_.has_value();
5452
};
55-
const T & getData() const
53+
typename T::ConstSharedPtr takeData()
5654
{
57-
if (!data_.has_value()) {
58-
throw std::runtime_error("Bad_optional_access in class InterProcessPollingSubscriber");
55+
auto new_data = std::make_shared<T>();
56+
rclcpp::MessageInfo message_info;
57+
const bool success = subscriber_->take(*new_data, message_info);
58+
if (success) {
59+
data_ = new_data;
5960
}
60-
return data_.value();
61+
62+
return data_;
6163
};
6264
};
6365

control/autonomous_emergency_braking/include/autonomous_emergency_braking/node.hpp

+18-10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <pcl_ros/transforms.hpp>
2121
#include <rclcpp/rclcpp.hpp>
2222
#include <tier4_autoware_utils/geometry/geometry.hpp>
23+
#include <tier4_autoware_utils/ros/polling_subscriber.hpp>
2324
#include <vehicle_info_util/vehicle_info_util.hpp>
2425

2526
#include <autoware_auto_planning_msgs/msg/trajectory.hpp>
@@ -224,18 +225,28 @@ class CollisionDataKeeper
224225
rclcpp::Clock::SharedPtr clock_;
225226
};
226227

228+
static rclcpp::SensorDataQoS SingleDepthSensorQoS()
229+
{
230+
rclcpp::SensorDataQoS qos;
231+
qos.get_rmw_qos_profile().depth = 1;
232+
return qos;
233+
}
234+
227235
class AEB : public rclcpp::Node
228236
{
229237
public:
230238
explicit AEB(const rclcpp::NodeOptions & node_options);
231239

232240
// subscriber
233-
rclcpp::Subscription<PointCloud2>::SharedPtr sub_point_cloud_;
234-
rclcpp::Subscription<VelocityReport>::SharedPtr sub_velocity_;
235-
rclcpp::Subscription<Imu>::SharedPtr sub_imu_;
236-
rclcpp::Subscription<Trajectory>::SharedPtr sub_predicted_traj_;
237-
rclcpp::Subscription<AutowareState>::SharedPtr sub_autoware_state_;
238-
241+
tier4_autoware_utils::InterProcessPollingSubscriber<PointCloud2> sub_point_cloud_{
242+
this, "~/input/pointcloud", SingleDepthSensorQoS()};
243+
tier4_autoware_utils::InterProcessPollingSubscriber<VelocityReport> sub_velocity_{
244+
this, "~/input/velocity"};
245+
tier4_autoware_utils::InterProcessPollingSubscriber<Imu> sub_imu_{this, "~/input/imu"};
246+
tier4_autoware_utils::InterProcessPollingSubscriber<Trajectory> sub_predicted_traj_{
247+
this, "~/input/predicted_trajectory"};
248+
tier4_autoware_utils::InterProcessPollingSubscriber<AutowareState> sub_autoware_state_{
249+
this, "/autoware/state"};
239250
// publisher
240251
rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr pub_obstacle_pointcloud_;
241252
rclcpp::Publisher<MarkerArray>::SharedPtr debug_ego_path_publisher_; // debug
@@ -245,15 +256,12 @@ class AEB : public rclcpp::Node
245256

246257
// callback
247258
void onPointCloud(const PointCloud2::ConstSharedPtr input_msg);
248-
void onVelocity(const VelocityReport::ConstSharedPtr input_msg);
249259
void onImu(const Imu::ConstSharedPtr input_msg);
250260
void onTimer();
251-
void onPredictedTrajectory(const Trajectory::ConstSharedPtr input_msg);
252-
void onAutowareState(const AutowareState::ConstSharedPtr input_msg);
253261
rcl_interfaces::msg::SetParametersResult onParameter(
254262
const std::vector<rclcpp::Parameter> & parameters);
255263

256-
bool isDataReady();
264+
bool fetchLatestData();
257265

258266
// main function
259267
void onCheckCollision(DiagnosticStatusWrapper & stat);

control/autonomous_emergency_braking/src/node.cpp

+15-39
Original file line numberDiff line numberDiff line change
@@ -105,27 +105,6 @@ AEB::AEB(const rclcpp::NodeOptions & node_options)
105105
vehicle_info_(vehicle_info_util::VehicleInfoUtil(*this).getVehicleInfo()),
106106
collision_data_keeper_(this->get_clock())
107107
{
108-
// Subscribers
109-
{
110-
sub_point_cloud_ = this->create_subscription<PointCloud2>(
111-
"~/input/pointcloud", rclcpp::SensorDataQoS(),
112-
std::bind(&AEB::onPointCloud, this, std::placeholders::_1));
113-
114-
sub_velocity_ = this->create_subscription<VelocityReport>(
115-
"~/input/velocity", rclcpp::QoS{1}, std::bind(&AEB::onVelocity, this, std::placeholders::_1));
116-
117-
sub_imu_ = this->create_subscription<Imu>(
118-
"~/input/imu", rclcpp::QoS{1}, std::bind(&AEB::onImu, this, std::placeholders::_1));
119-
120-
sub_predicted_traj_ = this->create_subscription<Trajectory>(
121-
"~/input/predicted_trajectory", rclcpp::QoS{1},
122-
std::bind(&AEB::onPredictedTrajectory, this, std::placeholders::_1));
123-
124-
sub_autoware_state_ = this->create_subscription<AutowareState>(
125-
"/autoware/state", rclcpp::QoS{1},
126-
std::bind(&AEB::onAutowareState, this, std::placeholders::_1));
127-
}
128-
129108
// Publisher
130109
{
131110
pub_obstacle_pointcloud_ =
@@ -229,11 +208,6 @@ void AEB::onTimer()
229208
updater_.force_update();
230209
}
231210

232-
void AEB::onVelocity(const VelocityReport::ConstSharedPtr input_msg)
233-
{
234-
current_velocity_ptr_ = input_msg;
235-
}
236-
237211
void AEB::onImu(const Imu::ConstSharedPtr input_msg)
238212
{
239213
// transform imu
@@ -253,17 +227,6 @@ void AEB::onImu(const Imu::ConstSharedPtr input_msg)
253227
tf2::doTransform(input_msg->angular_velocity, *angular_velocity_ptr_, transform_stamped);
254228
}
255229

256-
void AEB::onPredictedTrajectory(
257-
const autoware_auto_planning_msgs::msg::Trajectory::ConstSharedPtr input_msg)
258-
{
259-
predicted_traj_ptr_ = input_msg;
260-
}
261-
262-
void AEB::onAutowareState(const AutowareState::ConstSharedPtr input_msg)
263-
{
264-
autoware_state_ = input_msg;
265-
}
266-
267230
void AEB::onPointCloud(const PointCloud2::ConstSharedPtr input_msg)
268231
{
269232
PointCloud::Ptr pointcloud_ptr(new PointCloud);
@@ -316,29 +279,42 @@ void AEB::onPointCloud(const PointCloud2::ConstSharedPtr input_msg)
316279
obstacle_ros_pointcloud_ptr_->header = input_msg->header;
317280
}
318281

319-
bool AEB::isDataReady()
282+
bool AEB::fetchLatestData()
320283
{
321284
const auto missing = [this](const auto & name) {
322285
RCLCPP_INFO_SKIPFIRST_THROTTLE(get_logger(), *get_clock(), 5000, "[AEB] waiting for %s", name);
323286
return false;
324287
};
325288

289+
current_velocity_ptr_ = sub_velocity_.takeData();
326290
if (!current_velocity_ptr_) {
327291
return missing("ego velocity");
328292
}
329293

294+
const auto pointcloud_ptr = sub_point_cloud_.takeData();
295+
if (!pointcloud_ptr) {
296+
return missing("object pointcloud message");
297+
}
298+
onPointCloud(pointcloud_ptr);
330299
if (!obstacle_ros_pointcloud_ptr_) {
331300
return missing("object pointcloud");
332301
}
333302

303+
const auto imu_ptr = sub_imu_.takeData();
304+
if (use_imu_path_ && !imu_ptr) {
305+
return missing("imu message");
306+
}
307+
onImu(imu_ptr);
334308
if (use_imu_path_ && !angular_velocity_ptr_) {
335309
return missing("imu");
336310
}
337311

312+
predicted_traj_ptr_ = sub_predicted_traj_.takeData();
338313
if (use_predicted_trajectory_ && !predicted_traj_ptr_) {
339314
return missing("control predicted trajectory");
340315
}
341316

317+
autoware_state_ = sub_autoware_state_.takeData();
342318
if (!autoware_state_) {
343319
return missing("autoware_state");
344320
}
@@ -375,7 +351,7 @@ bool AEB::checkCollision(MarkerArray & debug_markers)
375351
using colorTuple = std::tuple<double, double, double, double>;
376352

377353
// step1. check data
378-
if (!isDataReady()) {
354+
if (!fetchLatestData()) {
379355
return false;
380356
}
381357

planning/obstacle_cruise_planner/include/obstacle_cruise_planner/node.hpp

+14-8
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,19 @@ class ObstacleCruisePlannerNode : public rclcpp::Node
5555
const std::vector<TrajectoryPoint> & traj_points,
5656
const vehicle_info_util::VehicleInfo & vehicle_info,
5757
const geometry_msgs::msg::Pose & current_ego_pose, const double lat_margin = 0.0) const;
58-
std::vector<Obstacle> convertToObstacles(const std::vector<TrajectoryPoint> & traj_points) const;
58+
std::vector<Obstacle> convertToObstacles(
59+
const Odometry & odometry, const PredictedObjects & objects,
60+
const std::vector<TrajectoryPoint> & traj_points) const;
5961
std::tuple<std::vector<StopObstacle>, std::vector<CruiseObstacle>, std::vector<SlowDownObstacle>>
6062
determineEgoBehaviorAgainstObstacles(
63+
const Odometry & odometry, const PredictedObjects & objecrts,
6164
const std::vector<TrajectoryPoint> & traj_points, const std::vector<Obstacle> & obstacles);
6265
std::vector<TrajectoryPoint> decimateTrajectoryPoints(
63-
const std::vector<TrajectoryPoint> & traj_points) const;
66+
const Odometry & odometry, const std::vector<TrajectoryPoint> & traj_points) const;
6467
std::optional<StopObstacle> createStopObstacle(
65-
const std::vector<TrajectoryPoint> & traj_points, const std::vector<Polygon2d> & traj_polys,
66-
const Obstacle & obstacle, const double precise_lateral_dist) const;
68+
const Odometry & odometry, const std::vector<TrajectoryPoint> & traj_points,
69+
const std::vector<Polygon2d> & traj_polys, const Obstacle & obstacle,
70+
const double precise_lateral_dist) const;
6771
bool isStopObstacle(const uint8_t label) const;
6872
bool isInsideCruiseObstacle(const uint8_t label) const;
6973
bool isOutsideCruiseObstacle(const uint8_t label) const;
@@ -88,12 +92,14 @@ class ObstacleCruisePlannerNode : public rclcpp::Node
8892
bool isObstacleCrossing(
8993
const std::vector<TrajectoryPoint> & traj_points, const Obstacle & obstacle) const;
9094
double calcCollisionTimeMargin(
91-
const std::vector<PointWithStamp> & collision_points,
95+
const Odometry & odometry, const std::vector<PointWithStamp> & collision_points,
9296
const std::vector<TrajectoryPoint> & traj_points, const bool is_driving_forward) const;
9397
std::optional<SlowDownObstacle> createSlowDownObstacle(
94-
const std::vector<TrajectoryPoint> & traj_points, const Obstacle & obstacle,
95-
const double precise_lat_dist);
96-
PlannerData createPlannerData(const std::vector<TrajectoryPoint> & traj_points) const;
98+
const Odometry & odometry, const std::vector<TrajectoryPoint> & traj_points,
99+
const Obstacle & obstacle, const double precise_lat_dist);
100+
PlannerData createPlannerData(
101+
const Odometry & odometry, const AccelWithCovarianceStamped & acc,
102+
const std::vector<TrajectoryPoint> & traj_points) const;
97103

98104
void checkConsistency(
99105
const rclcpp::Time & current_time, const PredictedObjects & predicted_objects,

0 commit comments

Comments
 (0)