5
5
#include < pcl/point_types.h>
6
6
#include < pcl_conversions/pcl_conversions.h>
7
7
#include < exception>
8
+ #include < tf/transform_listener.h>
9
+ #include < pcl_ros/transforms.h>
10
+ #include < pcl/point_types.h>
11
+ #include < pcl/kdtree/kdtree_flann.h>
12
+ #include < geometry_msgs/TransformStamped.h>
8
13
9
14
using namespace std ;
10
15
@@ -23,71 +28,66 @@ class PointCloudMerger {
23
28
private:
24
29
ros::NodeHandle nh_;
25
30
ros::Subscriber LiDAR_sub, D435i_sub;
31
+ tf::TransformListener listener_LiDAR, listener_D435i;
26
32
ros::Publisher merged_pub_;
27
33
pcl::PointCloud<pcl::PointXYZ>::Ptr LiDAR_pcl, D435i_pcl;
34
+ tf::StampedTransform transform_LiDAR, transform_D435i;
28
35
};
29
36
30
- PointCloudMerger::PointCloudMerger () : nh_(" ~" ) {
37
+ PointCloudMerger::PointCloudMerger () : nh_(" ~" ){
31
38
LiDAR_sub = nh_.subscribe (" /prometheus/sensors/3Dlidar_scan" , 1 , &PointCloudMerger::LiDAR_cb, this );
32
39
D435i_sub = nh_.subscribe (" /camera/depth/color/points" , 1 , &PointCloudMerger::D435i_cb, this );
33
40
merged_pub_ = nh_.advertise <sensor_msgs::PointCloud2>(" /prometheus/merged_pcl" , 1 );
34
41
35
42
LiDAR_pcl.reset (new pcl::PointCloud<pcl::PointXYZ>());
36
43
D435i_pcl.reset (new pcl::PointCloud<pcl::PointXYZ>());
37
44
45
+ listener_LiDAR.waitForTransform (" base_link" , " 3Dlidar_link" , ros::Time (0 ), ros::Duration (0.05 ));
46
+ listener_D435i.waitForTransform (" base_link" , " D435i::camera_depth_frame" , ros::Time (0 ), ros::Duration (0.05 ));
47
+
38
48
// 设置cout的精度为小数点后两位
39
49
std::cout << std::fixed << std::setprecision (2 );
40
50
41
51
std::cout << " [mapping] merge_pcl initialized!" << std::endl;
42
52
}
43
53
44
54
void PointCloudMerger::LiDAR_cb (const sensor_msgs::PointCloud2ConstPtr& msg) {
45
- try {
46
- cout << " LiDAR received!" << endl;
55
+ cout << " LiDAR received!" << endl;
47
56
48
57
pcl::fromROSMsg (*msg, *LiDAR_pcl);
58
+ // 转换LiDAR点云到base_link坐标系
59
+ pcl_ros::transformPointCloud (" base_link" , *LiDAR_pcl, *LiDAR_pcl, listener_LiDAR);
60
+
49
61
mergePointClouds ();
50
- } catch (const std::exception & e) {
51
- ROS_ERROR_STREAM (" Exception in LiDAR_cb: " << e.what ());
52
- }
53
62
}
54
63
55
64
void PointCloudMerger::D435i_cb (const sensor_msgs::PointCloud2ConstPtr& msg) {
56
- try {
57
65
cout << " D435i received!" << endl;
58
66
59
67
pcl::fromROSMsg (*msg, *D435i_pcl);
68
+ // 转换D435i点云到base_link坐标系
69
+ pcl_ros::transformPointCloud (" base_link" , *D435i_pcl, *D435i_pcl, listener_D435i);
70
+
60
71
mergePointClouds ();
61
- } catch (const std::exception & e) {
62
- ROS_ERROR_STREAM (" Exception in D435i_cb: " << e.what ());
63
- }
64
72
}
65
73
66
74
void PointCloudMerger::mergePointClouds () {
67
- try {
68
- cout << " Merging point clouds!" << endl;
69
-
70
75
pcl::PointCloud<pcl::PointXYZ>::Ptr merged_pcl;
71
76
merged_pcl.reset (new pcl::PointCloud<pcl::PointXYZ>());
72
77
73
- // merged_pcl->points.reserve(LiDAR_pcl->size() + D435i_pcl->size());
74
- merged_pcl->header = LiDAR_pcl->header ;
75
-
76
- cout << merged_pcl->header << endl;
78
+ merged_pcl->header .seq = LiDAR_pcl->header .seq ;
79
+ merged_pcl->header .stamp = LiDAR_pcl->header .stamp ;
80
+ merged_pcl->header .frame_id = " base_link" ;
77
81
78
82
*merged_pcl += *LiDAR_pcl;
79
83
*merged_pcl += *D435i_pcl;
80
84
81
85
sensor_msgs::PointCloud2 merged_cloud_msg;
82
86
pcl::toROSMsg (*merged_pcl, merged_cloud_msg);
83
87
84
- merged_cloud_msg.header .frame_id = " map" ;
85
88
merged_pub_.publish (merged_cloud_msg);
86
89
87
90
cout << " Merged pcl published!" << endl;
88
- } catch (const std::exception & e) {
89
- ROS_ERROR_STREAM (" Exception in mergePointClouds: " << e.what ());
90
- }
91
91
}
92
92
93
93
int main (int argc, char ** argv) {
@@ -96,4 +96,4 @@ int main(int argc, char** argv) {
96
96
97
97
ros::spin ();
98
98
return 0 ;
99
- }
99
+ }
0 commit comments