ポイントのセットに最適なフィッティング平面を見つけることを試みており、SVDを使用してax+by+cz+d=0
の平面方程式を計算しています。SVDを使用して最良のフィッティング平面方程式を計算する際にエラーが発生する
私はSVDを実装して正常に飛行機に乗ることができましたが、d
を計算することができません。
掘り出した後、計算した重心を式に戻してd
と計算しましたが、間違った値になっています。私はこれをRANSACメソッドと比較しているので、これは間違った値であると確信しています。
私は取得しています結果は
pcl::ModelCoefficients normal_extractor::plane_est_svd(pcl::PointCloud<pcl::PointXYZ>::ConstPtr point_cloud)
{
Eigen::MatrixXd points_3D(3,point_cloud->width);
//assigning the points from point cloud to matrix
for (int i=0;i<point_cloud->width;i++)
{
points_3D(0,i) = point_cloud->at(i).x;
points_3D(1,i) = point_cloud->at(i).y;
points_3D(2,i) = point_cloud->at(i).z;
}
// calcaulating the centroid of the pointcloud
Eigen::MatrixXd centroid = points_3D.rowwise().mean();
//std::cout<<"The centroid of the pointclouds is given by:\t"<<centroid<<std::endl;
//subtract the centroid from points
points_3D.row(0).array() -= centroid(0);
points_3D.row(1).array() -= centroid(1);
points_3D.row(2).array() -= centroid(2);
//calculate the SVD of points_3D matrix
Eigen::JacobiSVD<Eigen::MatrixXd> svd(points_3D,Eigen::ComputeFullU);
Eigen::MatrixXd U_MAT = svd.matrixU();
//std::cout<<"U matrix transpose is:"<<U_MAT<<std::endl<<std::endl<<"U matrix is:"<<svd.matrixU()<<std::endl;
/*********************************************************************************************
* caculating d by sybstituting the centroid back in the quation
* aCx+bCy+cCz = -d
********************************************************************************************/
//double d = -((U_MAT(0,2)*points_3D(0,1))+ (U_MAT(1,2)*points_3D(1,1)) + (U_MAT(1,2)*points_3D(1,2)));
double d = -((U_MAT(0,2)*centroid(0))+ (U_MAT(1,2)*centroid(1)) + (U_MAT(1,2)*centroid(2)));
pcl::ModelCoefficients normals;
normals.values.push_back(U_MAT(0,2));
normals.values.push_back(U_MAT(1,2));
normals.values.push_back(U_MAT(2,2));
normals.values.push_back(d);
return(normals);
}
を次のように私のコードの実装がある
RANSAC方法:
a = -0.0584306 b = 0.0358117 c = 0.997649 d = -0.161604
SVD方法:
a = 0.0584302 b = -0.0357721 c = -0.99765 d = 0.00466139
から結果、私法線方向が逆転しているにもかかわらず、法線はちょうど良いと考えられますが、d
の値は正しくありません。私はどこが間違っているのか分からない。どんな助けでも本当に感謝しています。
事前に感謝..
場合 ' d'が正しく計算されていない場合は、使用している式を確認してください。最後の言葉( 'U_MAT(1,2)* centroid(2)')は正しくありません( 'U_MAT(2、2)')? – 1201ProgramAlarm
はい、もちろん、ありがとうございます。何らかの理由で、私はそれに選択的に盲目的でした。 @ 1201ProgramAlarmもう一度ありがとうございます。 – spacemanspiff