@@ -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
551568visualization_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
582599void 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