Skip to content

Commit bfc3cf7

Browse files
committed
Apply rule of zero for Observation and do not use ptr for cloud
Signed-off-by: Fabian König <fabiankoenig@gmail.com>
1 parent 7b594b0 commit bfc3cf7

File tree

5 files changed

+27
-62
lines changed

5 files changed

+27
-62
lines changed

nav2_costmap_2d/include/nav2_costmap_2d/observation.hpp

Lines changed: 14 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -34,50 +34,24 @@
3434

3535
#include <geometry_msgs/msg/point.hpp>
3636
#include <sensor_msgs/msg/point_cloud2.hpp>
37+
#include <rclcpp/macros.hpp>
3738

3839
namespace nav2_costmap_2d
3940
{
4041

4142
/**
4243
* @brief Stores an observation in terms of a point cloud and the origin of the source
43-
* @note Tried to make members and constructor arguments const but the compiler would not accept the default
44-
* assignment operator for vector insertion!
4544
*/
4645
class Observation
4746
{
4847
public:
49-
/**
50-
* @brief Creates an empty observation
51-
*/
52-
Observation()
53-
: cloud_(new sensor_msgs::msg::PointCloud2()), obstacle_max_range_(0.0), obstacle_min_range_(0.0),
54-
raytrace_max_range_(0.0),
55-
raytrace_min_range_(0.0)
56-
{
57-
}
58-
/**
59-
* @brief A destructor
60-
*/
61-
virtual ~Observation()
62-
{
63-
delete cloud_;
64-
}
48+
RCLCPP_SMART_PTR_DEFINITIONS(Observation)
6549

6650
/**
67-
* @brief Copy assignment operator
68-
* @param obs The observation to copy
51+
* @brief Creates an empty observation
6952
*/
70-
Observation & operator=(const Observation & obs)
71-
{
72-
origin_ = obs.origin_;
73-
cloud_ = new sensor_msgs::msg::PointCloud2(*(obs.cloud_));
74-
obstacle_max_range_ = obs.obstacle_max_range_;
75-
obstacle_min_range_ = obs.obstacle_min_range_;
76-
raytrace_max_range_ = obs.raytrace_max_range_;
77-
raytrace_min_range_ = obs.raytrace_min_range_;
53+
Observation() = default;
7854

79-
return *this;
80-
}
8155

8256
/**
8357
* @brief Creates an observation from an origin point and a point cloud
@@ -89,28 +63,16 @@ class Observation
8963
* @param raytrace_min_range The range from which an observation should be able to clear via raytracing
9064
*/
9165
Observation(
92-
geometry_msgs::msg::Point & origin, const sensor_msgs::msg::PointCloud2 & cloud,
66+
geometry_msgs::msg::Point origin, sensor_msgs::msg::PointCloud2 cloud,
9367
double obstacle_max_range, double obstacle_min_range, double raytrace_max_range,
9468
double raytrace_min_range)
95-
: origin_(origin), cloud_(new sensor_msgs::msg::PointCloud2(cloud)),
69+
: origin_(std::move(origin)), cloud_(std::move(cloud)),
9670
obstacle_max_range_(obstacle_max_range), obstacle_min_range_(obstacle_min_range),
9771
raytrace_max_range_(raytrace_max_range), raytrace_min_range_(
9872
raytrace_min_range)
9973
{
10074
}
10175

102-
/**
103-
* @brief Copy constructor
104-
* @param obs The observation to copy
105-
*/
106-
Observation(const Observation & obs)
107-
: origin_(obs.origin_), cloud_(new sensor_msgs::msg::PointCloud2(*(obs.cloud_))),
108-
obstacle_max_range_(obs.obstacle_max_range_), obstacle_min_range_(obs.obstacle_min_range_),
109-
raytrace_max_range_(obs.raytrace_max_range_),
110-
raytrace_min_range_(obs.raytrace_min_range_)
111-
{
112-
}
113-
11476
/**
11577
* @brief Creates an observation from a point cloud
11678
* @param cloud The point cloud of the observation
@@ -120,15 +82,17 @@ class Observation
12082
Observation(
12183
const sensor_msgs::msg::PointCloud2 & cloud, double obstacle_max_range,
12284
double obstacle_min_range)
123-
: cloud_(new sensor_msgs::msg::PointCloud2(cloud)), obstacle_max_range_(obstacle_max_range),
124-
obstacle_min_range_(obstacle_min_range),
125-
raytrace_max_range_(0.0), raytrace_min_range_(0.0)
85+
: cloud_(std::move(cloud)), obstacle_max_range_(obstacle_max_range),
86+
obstacle_min_range_(obstacle_min_range)
12687
{
12788
}
12889

129-
geometry_msgs::msg::Point origin_;
130-
sensor_msgs::msg::PointCloud2 * cloud_;
131-
double obstacle_max_range_, obstacle_min_range_, raytrace_max_range_, raytrace_min_range_;
90+
geometry_msgs::msg::Point origin_{};
91+
sensor_msgs::msg::PointCloud2 cloud_{};
92+
double obstacle_max_range_{0.};
93+
double obstacle_min_range_{0.};
94+
double raytrace_max_range_{0.};
95+
double raytrace_min_range_{0.};
13296
};
13397

13498
} // namespace nav2_costmap_2d

nav2_costmap_2d/plugins/obstacle_layer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ ObstacleLayer::updateBounds(
510510
{
511511
const Observation & obs = *it;
512512

513-
const sensor_msgs::msg::PointCloud2 & cloud = *(obs.cloud_);
513+
const sensor_msgs::msg::PointCloud2 & cloud = obs.cloud_;
514514

515515
double sq_obstacle_max_range = obs.obstacle_max_range_ * obs.obstacle_max_range_;
516516
double sq_obstacle_min_range = obs.obstacle_min_range_ * obs.obstacle_min_range_;
@@ -686,7 +686,7 @@ ObstacleLayer::raytraceFreespace(
686686
{
687687
double ox = clearing_observation.origin_.x;
688688
double oy = clearing_observation.origin_.y;
689-
const sensor_msgs::msg::PointCloud2 & cloud = *(clearing_observation.cloud_);
689+
const sensor_msgs::msg::PointCloud2 & cloud = clearing_observation.cloud_;
690690

691691
// get the map coordinates of the origin of the sensor
692692
unsigned int x0, y0;

nav2_costmap_2d/plugins/voxel_layer.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ void VoxelLayer::updateBounds(
183183
{
184184
const Observation & obs = *it;
185185

186-
const sensor_msgs::msg::PointCloud2 & cloud = *(obs.cloud_);
186+
const sensor_msgs::msg::PointCloud2 & cloud = obs.cloud_;
187187

188188
double sq_obstacle_max_range = obs.obstacle_max_range_ * obs.obstacle_max_range_;
189189
double sq_obstacle_min_range = obs.obstacle_min_range_ * obs.obstacle_min_range_;
@@ -268,7 +268,7 @@ void VoxelLayer::raytraceFreespace(
268268
{
269269
auto clearing_endpoints_ = std::make_unique<sensor_msgs::msg::PointCloud2>();
270270

271-
if (clearing_observation.cloud_->height == 0 || clearing_observation.cloud_->width == 0) {
271+
if (clearing_observation.cloud_.height == 0 || clearing_observation.cloud_.width == 0) {
272272
return;
273273
}
274274

@@ -302,8 +302,8 @@ void VoxelLayer::raytraceFreespace(
302302
}
303303

304304
clearing_endpoints_->data.clear();
305-
clearing_endpoints_->width = clearing_observation.cloud_->width;
306-
clearing_endpoints_->height = clearing_observation.cloud_->height;
305+
clearing_endpoints_->width = clearing_observation.cloud_.width;
306+
clearing_endpoints_->height = clearing_observation.cloud_.height;
307307
clearing_endpoints_->is_dense = true;
308308
clearing_endpoints_->is_bigendian = false;
309309

@@ -322,9 +322,9 @@ void VoxelLayer::raytraceFreespace(
322322
double map_end_y = origin_y_ + getSizeInMetersY();
323323
double map_end_z = origin_z_ + getSizeInMetersZ();
324324

325-
sensor_msgs::PointCloud2ConstIterator<float> iter_x(*(clearing_observation.cloud_), "x");
326-
sensor_msgs::PointCloud2ConstIterator<float> iter_y(*(clearing_observation.cloud_), "y");
327-
sensor_msgs::PointCloud2ConstIterator<float> iter_z(*(clearing_observation.cloud_), "z");
325+
sensor_msgs::PointCloud2ConstIterator<float> iter_x(clearing_observation.cloud_, "x");
326+
sensor_msgs::PointCloud2ConstIterator<float> iter_y(clearing_observation.cloud_, "y");
327+
sensor_msgs::PointCloud2ConstIterator<float> iter_z(clearing_observation.cloud_, "z");
328328

329329
for (; iter_x != iter_x.end(); ++iter_x, ++iter_y, ++iter_z) {
330330
double wpx = *iter_x;
@@ -422,7 +422,7 @@ void VoxelLayer::raytraceFreespace(
422422

423423
if (publish_clearing_points) {
424424
clearing_endpoints_->header.frame_id = global_frame_;
425-
clearing_endpoints_->header.stamp = clearing_observation.cloud_->header.stamp;
425+
clearing_endpoints_->header.stamp = clearing_observation.cloud_.header.stamp;
426426

427427
clearing_endpoints_pub_->publish(std::move(clearing_endpoints_));
428428
}

nav2_costmap_2d/src/observation_buffer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ void ObservationBuffer::bufferCloud(const sensor_msgs::msg::PointCloud2 & cloud)
118118

119119
// now we need to remove observations from the cloud that are below
120120
// or above our height thresholds
121-
sensor_msgs::msg::PointCloud2 & observation_cloud = *(observation_list_.front().cloud_);
121+
sensor_msgs::msg::PointCloud2 & observation_cloud = (observation_list_.front().cloud_);
122122
observation_cloud.height = global_frame_cloud.height;
123123
observation_cloud.width = global_frame_cloud.width;
124124
observation_cloud.fields = global_frame_cloud.fields;

nav2_costmap_2d/test/testing_helper.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ void addObservation(
127127
p.y = oy;
128128
p.z = oz;
129129

130-
nav2_costmap_2d::Observation obs(p, cloud, obstacle_max_range, obstacle_min_range,
130+
nav2_costmap_2d::Observation obs(std::move(p), std::move(cloud), obstacle_max_range,
131+
obstacle_min_range,
131132
raytrace_max_range, raytrace_min_range);
132133
olayer->addStaticObservation(obs, marking, clearing);
133134
}

0 commit comments

Comments
 (0)