using namespace Eigen;
int readStreamFile(
const std::string &stream_file,
std::vector<std::vector<Eigen::Vector3f>> &cloud_p)
{
std::ifstream inFile(stream_file, std::ios::in | std::ios::binary);
if (!inFile)
{
std::cout << "readstreamfile filed ..." << std::endl;
return -1;
}
uint64_t time_m;
int head = 0;
int source_num_temp;
int obs_num_temp;
while (1)
{
if (head == 0)
{
if (!inFile.read((char *)&time_m, sizeof(uint64_t)))
break;
head++;
continue;
}
else if (head == 1)
{
if (!inFile.read((char *)&source_num_temp, sizeof(int)))
break;
head++;
continue;
}
else if (head == 2)
{
if (!inFile.read((char *)&obs_num_temp, sizeof(int)))
break;
head++;
continue;
}
else
{
std::vector<Eigen::Vector3f> cloud(source_num_temp);
for (int i = 0; i < source_num_temp; i++)
{
float pt[3];
if (!inFile.read((char *)pt, 3 * sizeof(float)))
{
break;
}
cloud[i][0] = pt[0];
cloud[i][1] = pt[1];
cloud[i][2] = pt[2];
}
std::vector<Eigen::Vector3f> obs_cloud(obs_num_temp);
for (int i = 0; i < obs_num_temp; i++)
{
float pt[3];
if (!inFile.read((char *)pt, 3 * sizeof(float)))
{
return -1;
}
obs_cloud[i][0] = pt[0];
obs_cloud[i][1] = pt[1];
obs_cloud[i][2] = pt[2];
}
cloud_p.push_back(cloud);
head = 0;
source_num_temp = 0;
obs_num_temp = 0;
}
}
inFile.close();
return 0;
}
int fitPlane(const std::vector<Eigen::Vector3f> & in_points) {
Eigen::Quaterniond q =
Eigen::AngleAxisd(0, Eigen::Vector3d::Unit(2)) *
Eigen::AngleAxisd((-3.1515926/4.0), Eigen::Vector3d::Unit(1)) *
Eigen::AngleAxisd(0, Eigen::Vector3d::Unit(0));
int count = in_points.size();
//解最小二乘解问题
Eigen::MatrixXf A(count, 4); //(行,列)
for (int i = 0; i < count; i++)
{
Eigen::Vector3f temp = q.cast<float>() * in_points[i];
A(i, 0) = static_cast<float>(temp.x());
A(i, 1) = static_cast<float>(temp.y());
A(i, 2) = static_cast<float>(temp.z());
A(i, 3) = 1.0f;
}
Eigen::JacobiSVD<Eigen::MatrixXf> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);
Eigen::MatrixXf V = svd.matrixV(), U = svd.matrixU();
//Eigen::Matrix3f S = U.inverse() * A * V.transpose().inverse(); // S = U^-1 * A * VT * -1
//float A = V(0, 3);
//float B = V(1, 3);
//float C = V(2, 3);
//float D = V(3, 3);
std::cout << V << std::endl;
Eigen::Vector3f normal(V(0, 3), V(1, 3), V(2, 3));
return 0;
}
int main1515() {
std::string stream_file = "./cloud_stream_11.stream";
std::vector<std::vector<Eigen::Vector3f>> cloud_p;
int ret = readStreamFile(stream_file, cloud_p);
float box[6] = { -1.0,1.0,-1.0,1.0,-0.3, 0.3 };
std::ofstream file_xyz("./test.xyz");
std::vector<Eigen::Vector3f> in_points;
for (size_t i = 0; i < 10; i++)
{
for (size_t j = 0; j < cloud_p[i].size(); j++)
{
if (cloud_p[i][j].x() > box[0] &&
cloud_p[i][j].x() < box[1] &&
cloud_p[i][j].y() > box[2] &&
cloud_p[i][j].y() < box[3] &&
cloud_p[i][j].z() > box[4] &&
cloud_p[i][j].z() < box[5]) {
file_xyz << cloud_p[i][j].x() << " " << cloud_p[i][j].y() << " " << cloud_p[i][j].z() << "\n";
in_points.emplace_back(cloud_p[i][j]);
}
}
}
file_xyz.close();
fitPlane(in_points);
return 0;
}