上传了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分别表示输入和输出点云。
//在这里,它们是相同的,因此变换是“就地”进行的,即变换后的结果会直接覆盖原始点云数据。
}