Skip to content

Commit 79c7757

Browse files
committed
protect shared error state. make counter atomic. make configurable bool atomic
1 parent 67d847b commit 79c7757

File tree

2 files changed

+36
-16
lines changed

2 files changed

+36
-16
lines changed

elevation_mapping_cupy/include/elevation_mapping_cupy/elevation_mapping_ros.hpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class ElevationMappingNode {
5353
void readParameters();
5454
void setupMapPublishers();
5555
void pointcloudCallback(const sensor_msgs::PointCloud2& cloud);
56-
void publishAsPointCloud(const grid_map::GridMap& map);
56+
void publishAsPointCloud(const grid_map::GridMap& map) const;
5757
bool getSubmap(grid_map_msgs::GetGridMap::Request& request, grid_map_msgs::GetGridMap::Response& response);
5858
bool checkSafety(elevation_map_msgs::CheckSafety::Request& request, elevation_map_msgs::CheckSafety::Response& response);
5959
bool initializeMap(elevation_map_msgs::Initialize::Request& request, elevation_map_msgs::Initialize::Response& response);
@@ -64,16 +64,17 @@ class ElevationMappingNode {
6464
void updateVariance(const ros::TimerEvent&);
6565
void updateTime(const ros::TimerEvent&);
6666
void updateGridMap(const ros::TimerEvent&);
67-
void publishNormalAsArrow(const grid_map::GridMap& map);
67+
void publishNormalAsArrow(const grid_map::GridMap& map) const;
6868
void initializeWithTF();
6969
void publishMapToOdom(double error);
7070
void publishStatistics(const ros::TimerEvent&);
7171
void publishMapOfIndex(int index);
7272

73-
visualization_msgs::Marker vectorToArrowMarker(const Eigen::Vector3d& start, const Eigen::Vector3d& end, const int id);
73+
visualization_msgs::Marker vectorToArrowMarker(const Eigen::Vector3d& start, const Eigen::Vector3d& end, const int id) const;
7474
ros::NodeHandle nh_;
7575
std::vector<ros::Subscriber> pointcloudSubs_;
7676
std::vector<ros::Publisher> mapPubs_;
77+
tf::TransformBroadcaster tfBroadcaster_;
7778
ros::Publisher alivePub_;
7879
ros::Publisher pointPub_;
7980
ros::Publisher normalPub_;
@@ -117,17 +118,20 @@ class ElevationMappingNode {
117118
grid_map::GridMap gridMap_;
118119
std::atomic_bool isGridmapUpdated_; // needs to be atomic (read is not protected by mapMutex_)
119120

121+
std::mutex errorMutex_; // protects positionError_, and orientationError_
120122
double positionError_;
121123
double orientationError_;
124+
122125
double positionAlpha_;
123126
double orientationAlpha_;
127+
124128
double recordableFps_;
125-
bool enablePointCloudPublishing_;
129+
std::atomic_bool enablePointCloudPublishing_;
126130
bool enableNormalArrowPublishing_;
127131
bool enableDriftCorrectedTFPublishing_;
128132
bool useInitializerAtStart_;
129133
double initializeTfGridSize_;
130-
int pointCloudProcessCounter_;
134+
std::atomic_int pointCloudProcessCounter_;
131135
};
132136

133137
} // namespace elevation_mapping_cupy

elevation_mapping_cupy/src/elevation_mapping_ros.cpp

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ ElevationMappingNode::ElevationMappingNode(ros::NodeHandle& nh)
3636
std::vector<std::string> pointcloud_topics;
3737
std::vector<std::string> map_topics;
3838
double recordableFps, updateVarianceFps, timeInterval, updatePoseFps, updateGridMapFps, publishStatisticsFps;
39+
bool enablePointCloudPublishing(false);
3940

4041
nh.param<std::vector<std::string>>("pointcloud_topics", pointcloud_topics, {"points"});
4142
nh.getParam("publishers", publishers);
@@ -55,10 +56,13 @@ ElevationMappingNode::ElevationMappingNode(ros::NodeHandle& nh)
5556
nh.param<double>("initialize_tf_grid_size", initializeTfGridSize_, 0.5);
5657
nh.param<double>("map_acquire_fps", updateGridMapFps, 5.0);
5758
nh.param<double>("publish_statistics_fps", publishStatisticsFps, 1.0);
58-
nh.param<bool>("enable_pointcloud_publishing", enablePointCloudPublishing_, false);
59+
nh.param<bool>("enable_pointcloud_publishing", enablePointCloudPublishing, false);
5960
nh.param<bool>("enable_normal_arrow_publishing", enableNormalArrowPublishing_, false);
6061
nh.param<bool>("enable_drift_corrected_TF_publishing", enableDriftCorrectedTFPublishing_, false);
6162
nh.param<bool>("use_initializer_at_start", useInitializerAtStart_, false);
63+
64+
enablePointCloudPublishing_ = enablePointCloudPublishing;
65+
6266
for (const auto& pointcloud_topic : pointcloud_topics) {
6367
ros::Subscriber sub = nh_.subscribe(pointcloud_topic, 1, &ElevationMappingNode::pointcloudCallback, this);
6468
pointcloudSubs_.push_back(sub);
@@ -230,16 +234,25 @@ void ElevationMappingNode::pointcloudCallback(const sensor_msgs::PointCloud2& cl
230234
ROS_ERROR("%s", ex.what());
231235
return;
232236
}
233-
map_.input(pointCloud, transformationSensorToMap.rotation(), transformationSensorToMap.translation(), positionError_, orientationError_);
237+
238+
double positionError{0.0};
239+
double orientationError{0.0};
240+
{
241+
std::lock_guard<std::mutex> lock(errorMutex_);
242+
positionError = positionError_;
243+
orientationError = orientationError_;
244+
}
245+
246+
map_.input(pointCloud, transformationSensorToMap.rotation(), transformationSensorToMap.translation(), positionError, orientationError);
234247

235248
if (enableDriftCorrectedTFPublishing_) {
236249
publishMapToOdom(map_.get_additive_mean_error());
237250
}
238251

239252
ROS_DEBUG_THROTTLE(1.0, "ElevationMap processed a point cloud (%i points) in %f sec.", static_cast<int>(pointCloud->size()),
240253
(ros::Time::now() - start).toSec());
241-
ROS_DEBUG_THROTTLE(1.0, "positionError: %f ", positionError_);
242-
ROS_DEBUG_THROTTLE(1.0, "orientationError: %f ", orientationError_);
254+
ROS_DEBUG_THROTTLE(1.0, "positionError: %f ", positionError);
255+
ROS_DEBUG_THROTTLE(1.0, "orientationError: %f ", orientationError);
243256
// This is used for publishing as statistics.
244257
pointCloudProcessCounter_++;
245258
}
@@ -263,16 +276,20 @@ void ElevationMappingNode::updatePose(const ros::TimerEvent&) {
263276
transformTf.getRotation().w());
264277
lowpassPosition_ = positionAlpha_ * position3 + (1 - positionAlpha_) * lowpassPosition_;
265278
lowpassOrientation_ = orientationAlpha_ * orientation + (1 - orientationAlpha_) * lowpassOrientation_;
266-
positionError_ = (position3 - lowpassPosition_).norm();
267-
orientationError_ = (orientation - lowpassOrientation_).norm();
279+
{
280+
std::lock_guard<std::mutex> lock(errorMutex_);
281+
positionError_ = (position3 - lowpassPosition_).norm();
282+
orientationError_ = (orientation - lowpassOrientation_).norm();
283+
}
284+
268285
if (useInitializerAtStart_) {
269286
ROS_INFO("Clearing map with initializer.");
270287
initializeWithTF();
271288
useInitializerAtStart_ = false;
272289
}
273290
}
274291

275-
void ElevationMappingNode::publishAsPointCloud(const grid_map::GridMap& map) {
292+
void ElevationMappingNode::publishAsPointCloud(const grid_map::GridMap& map) const {
276293
sensor_msgs::PointCloud2 msg;
277294
grid_map::GridMapRosConverter::toPointCloud(map, "elevation", msg);
278295
pointPub_.publish(msg);
@@ -519,7 +536,7 @@ bool ElevationMappingNode::initializeMap(elevation_map_msgs::Initialize::Request
519536
return true;
520537
}
521538

522-
void ElevationMappingNode::publishNormalAsArrow(const grid_map::GridMap& map) {
539+
void ElevationMappingNode::publishNormalAsArrow(const grid_map::GridMap& map) const {
523540
auto startTime = ros::Time::now();
524541

525542
const auto& normalX = map["normal_x"];
@@ -549,7 +566,7 @@ void ElevationMappingNode::publishNormalAsArrow(const grid_map::GridMap& map) {
549566
}
550567

551568
visualization_msgs::Marker ElevationMappingNode::vectorToArrowMarker(const Eigen::Vector3d& start, const Eigen::Vector3d& end,
552-
const int id) {
569+
const int id) const {
553570
visualization_msgs::Marker marker;
554571
marker.header.frame_id = mapFrameId_;
555572
marker.header.stamp = ros::Time::now();
@@ -580,13 +597,12 @@ visualization_msgs::Marker ElevationMappingNode::vectorToArrowMarker(const Eigen
580597
}
581598

582599
void ElevationMappingNode::publishMapToOdom(double error) {
583-
static tf::TransformBroadcaster br;
584600
tf::Transform transform;
585601
transform.setOrigin(tf::Vector3(0.0, 0.0, error));
586602
tf::Quaternion q;
587603
q.setRPY(0, 0, 0);
588604
transform.setRotation(q);
589-
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), mapFrameId_, correctedMapFrameId_));
605+
tfBroadcaster_.sendTransform(tf::StampedTransform(transform, ros::Time::now(), mapFrameId_, correctedMapFrameId_));
590606
}
591607

592608
} // namespace elevation_mapping_cupy

0 commit comments

Comments
 (0)