基于pcl的点云坐标转换

上传了6个点在两个不同坐标系下的坐标值:一个是在工件点云坐标系下(source_points),另一个是在相同位置下的机器人坐标系下(target_points)。这些点的坐标值将用于计算一个最佳的旋转和平移矩阵,该矩阵将点云从工件的坐标系转换到机器人的坐标系。

	// 添加源点
	source_points.push_back(PointT(37.6786, -71.077599, 299.89999));
	source_points.push_back(PointT(39.246101, -23.3113, 300.10001));
	source_points.push_back(PointT(43.0051, 24.843901, 300.5));
	source_points.push_back(PointT(91.015602, -68.386299, 303));
	source_points.push_back(PointT(89.527603, -22.694401, 300.10001));
	source_points.push_back(PointT(89.665604, 23.2805, 292.5));

	// 添加目标点
	target_points.push_back(PointT(84.739, 7.419, 2));
	target_points.push_back(PointT(85.785, 50.5305, 2));
	target_points.push_back(PointT(86.831, 93.642, 2));
	target_points.push_back(PointT(138.214, 4.466, 2));
	target_points.push_back(PointT(137.009, 49.7845, 2));
	target_points.push_back(PointT(135.804, 95.103, 2));

将点云坐标格式转换成Eigen::Vector3f坐标格式(Eigen::Vector3f是一个三维向量,包含了点的x、y、z坐标,用于矩阵运算时更加高效。),还包括将这些坐标对添加到一个结构中,即cl::TransformationFromCorrespondences结构体,为矩阵变换做准备。

	pcl::TransformationFromCorrespondences tfc;
	for (size_t i = 0; i < source_points.size(); ++i) {
		tfc.add(source_points[i].getVector3fMap(), target_points[i].getVector3fMap());
	}

   使用最小二乘法,计算出一个最优的旋转和平移矩阵

//计算并获取变换矩阵
    Eigen::Matrix4f transformation_matrix = tfc.getTransformation().matrix();          //计算变换矩阵
    std::cout << "Transformation Matrix:\n" << transformation_matrix << std::endl;    //获取变换矩阵

保持矩阵运算的统一性和便利性,通常为 [0 0 0 1]

对点云中的每一个点应用变换

// 将变换矩阵应用于点云
void applyTransformation(const PointCloudT::Ptr &cloud, const Eigen::Matrix4f &transform) {
	pcl::transformPointCloud(*cloud, *cloud, transform);//前后两个*cloud分别表示输入和输出点云。
														//在这里,它们是相同的,因此变换是“就地”进行的,即变换后的结果会直接覆盖原始点云数据。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值