swh:1:snp:67458089460e0f4324e7769efad93379abfcf654
Tip revision: 8cf122b9c7f7403efe90dca3b0af0ebfec10b26d authored by jzhzhang on 07 January 2024, 04:10:10 UTC
Update pose_estimation.cpp
Update pose_estimation.cpp
Tip revision: 8cf122b
data_types.h
#ifndef ROSEFUSION_DATA_TYPES_H
#define ROSEFUSION_DATA_TYPES_H
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wall"
#pragma GCC diagnostic ignored "-Wextra"
#pragma GCC diagnostic ignored "-Weffc++"
#include <cuda_runtime.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/core/cuda.hpp>
#include <Eigen/Eigen>
#include <time.h>
#else
#include <cuda_runtime.h>
#include <opencv2/core/cuda.hpp>
#include <Eigen/Dense>
#endif
using cv::cuda::GpuMat;
namespace rosefusion {
struct CameraParameters {
int image_width {0};
int image_height {0};
float focal_x {.0};
float focal_y {.0};
float principal_x {.0};
float principal_y {.0};
CameraParameters(const std::string &camera_file)
{
cv::FileStorage cameraSetting(camera_file.c_str(),cv::FileStorage::READ);
cameraSetting["Camera.fx"]>>focal_x;
cameraSetting["Camera.fy"]>>focal_y;
cameraSetting["Camera.cx"]>>principal_x;
cameraSetting["Camera.cy"]>>principal_y;
cameraSetting["Camera.width"]>>image_width;
cameraSetting["Camera.height"]>>image_height;
cameraSetting.release();
}
};
struct PointCloud {
cv::Mat vertices;
cv::Mat normals;
cv::Mat color;
int num_points;
};
struct ControllerConfiguration {
int max_iteration {20};
std::string PST_path {"~"};
float scaling_coefficient1 {0.12};
float scaling_coefficient2 {0.12};
float init_fitness {0.5};
float momentum {0.9};
bool scaling_inherit_directly {false};
bool save_trajectory {false};
bool save_scene {false};
bool render_surface {false};
ControllerConfiguration(const std::string &config_file){
cv::FileStorage controllerSetting(config_file.c_str(),cv::FileStorage::READ);
controllerSetting["PST_path"]>>PST_path;
max_iteration=controllerSetting["max_iteration"];
scaling_coefficient1=controllerSetting["scaling_coefficient1"];
scaling_coefficient2=controllerSetting["scaling_coefficient2"];
init_fitness=controllerSetting["init_fitness"];
momentum=controllerSetting["momentum"];
scaling_inherit_directly=bool(int(controllerSetting["scaling_inherit_directly"]));
save_trajectory=bool(int(controllerSetting["save_trajectory"]));
save_scene=bool(int(controllerSetting["save_scene"]));
render_surface=bool(int(controllerSetting["render_surface"]));
}
};
struct DataConfiguration {
int3 volume_size { make_int3(812, 512, 812) };
float voxel_scale { 30.f };
float3 init_pos { volume_size.x / 2 * voxel_scale, volume_size.x / 2 * voxel_scale , volume_size.x / 2 * voxel_scale };
float truncation_distance { 120.f };
float depth_cutoff_distance { 8000.f };
int pointcloud_buffer_size { 3 * 2000000 };
std::string result_path {"~/"};
std::string seq_file {"~/"};
std::string seq_name {"~/"};
DataConfiguration(const std::string &config_file){
cv::FileStorage dataSetting(config_file.c_str(),cv::FileStorage::READ);
std::string temp_str;
dataSetting["result_path"]>>result_path;
voxel_scale=dataSetting["voxel_size"];
truncation_distance=dataSetting["truncated_size"];
int voxel_x=dataSetting["voxel_x"];
int voxel_y=dataSetting["voxel_y"];
int voxel_z=dataSetting["voxel_z"];
volume_size=make_int3(voxel_x,voxel_y,voxel_z);
float init_x=dataSetting["init_x"];
float init_y=dataSetting["init_y"];
float init_z=dataSetting["init_z"];
float init_pos_x=volume_size.x / 2 * voxel_scale - init_x;
float init_pos_y=volume_size.y / 2 * voxel_scale - init_y;
float init_pos_z=volume_size.z / 2 * voxel_scale - init_z;
init_pos=make_float3(init_pos_x,init_pos_y,init_pos_z);
dataSetting["seq_path"]>>seq_file;
dataSetting["name"]>>seq_name;
dataSetting.release();
}
};
namespace internal {
struct FrameData {
GpuMat depth_map;
GpuMat color_map;
GpuMat vertex_map;
GpuMat normal_map;
GpuMat shading_buffer;
explicit FrameData(const int image_height,const int image_width)
{
depth_map = cv::cuda::createContinuous(image_height, image_width, CV_32FC1);
color_map = cv::cuda::createContinuous(image_height, image_width, CV_8UC3);
vertex_map = cv::cuda::createContinuous(image_height, image_width, CV_32FC3);
normal_map = cv::cuda::createContinuous(image_height, image_width, CV_32FC3);
shading_buffer = cv::cuda::createContinuous(image_height, image_width, CV_8UC3);
}
};
struct VolumeData {
GpuMat tsdf_volume;
GpuMat weight_volume;
GpuMat color_volume;
int3 volume_size;
float voxel_scale;
VolumeData(const int3 _volume_size, const float _voxel_scale) :
tsdf_volume(cv::cuda::createContinuous(_volume_size.y * _volume_size.z, _volume_size.x, CV_16SC1)),
weight_volume(cv::cuda::createContinuous(_volume_size.y * _volume_size.z, _volume_size.x, CV_16SC1)),
color_volume(cv::cuda::createContinuous(_volume_size.y * _volume_size.z, _volume_size.x, CV_8UC3)),
volume_size(_volume_size), voxel_scale(_voxel_scale)
{
tsdf_volume.setTo(32767);
weight_volume.setTo(0);
color_volume.setTo(0);
}
};
struct QuaternionData{
std::vector<GpuMat> q;
std::vector<cv::Mat> q_trans;
int num=20;
QuaternionData(std::vector<int> particle_level, std::string PST_path):
q(60),q_trans(60)
{
for (int i=0;i<num;i++){
q_trans[i]=cv::Mat(particle_level[0],6,CV_32FC1);
q[i]=cv::cuda::createContinuous(particle_level[0], 6, CV_32FC1);
q_trans[i]=cv::imread(PST_path+"pst_10240_"+std::to_string(i)+".tiff",cv::IMREAD_ANYCOLOR | cv::IMREAD_ANYDEPTH);
q_trans[i].ptr<float>(0)[0]=0;
q_trans[i].ptr<float>(0)[1]=0;
q_trans[i].ptr<float>(0)[2]=0;
q_trans[i].ptr<float>(0)[3]=0;
q_trans[i].ptr<float>(0)[4]=0;
q_trans[i].ptr<float>(0)[5]=0;
q[i].upload(q_trans[i]);
}
for (int i=num;i<num*2;i++){
q_trans[i]=cv::Mat(particle_level[1],6,CV_32FC1);
q[i]=cv::cuda::createContinuous(particle_level[1], 6, CV_32FC1);
q_trans[i]=cv::imread(PST_path+"pst_3072_"+std::to_string(i-20)+".tiff",cv::IMREAD_ANYCOLOR | cv::IMREAD_ANYDEPTH);
q_trans[i].ptr<float>(0)[0]=0;
q_trans[i].ptr<float>(0)[1]=0;
q_trans[i].ptr<float>(0)[2]=0;
q_trans[i].ptr<float>(0)[3]=0;
q_trans[i].ptr<float>(0)[4]=0;
q_trans[i].ptr<float>(0)[5]=0;
q[i].upload(q_trans[i]);
}
for (int i=num*2;i<num*3;i++){
q_trans[i]=cv::Mat(particle_level[2],6,CV_32FC1);
q[i]=cv::cuda::createContinuous(particle_level[2], 6, CV_32FC1);
q_trans[i]=cv::imread(PST_path+"pst_1024_"+std::to_string(i-40)+".tiff",cv::IMREAD_ANYCOLOR | cv::IMREAD_ANYDEPTH);
q_trans[i].ptr<float>(0)[0]=0;
q_trans[i].ptr<float>(0)[1]=0;
q_trans[i].ptr<float>(0)[2]=0;
q_trans[i].ptr<float>(0)[3]=0;
q_trans[i].ptr<float>(0)[4]=0;
q_trans[i].ptr<float>(0)[5]=0;
q[i].upload(q_trans[i]);
}
}
};
struct SearchData{
std::vector<GpuMat> gpu_search_count;
std::vector<cv::Mat> search_count;
std::vector<GpuMat> gpu_search_value;
std::vector<cv::Mat> search_value;
SearchData(std::vector<int> particle_level):
gpu_search_count(3),search_count(3),gpu_search_value(3),search_value(3)
{
search_count[0]=cv::Mat::zeros(particle_level[0],1,CV_32FC1);
search_count[1]=cv::Mat::zeros(particle_level[1],1,CV_32FC1);
search_count[2]=cv::Mat::zeros(particle_level[2],1,CV_32FC1);
gpu_search_count[0]=cv::cuda::createContinuous(particle_level[0], 1, CV_32FC1);
gpu_search_count[1]=cv::cuda::createContinuous(particle_level[1], 1, CV_32FC1);
gpu_search_count[2]=cv::cuda::createContinuous(particle_level[2], 1, CV_32FC1);
search_value[0]=cv::Mat::zeros(particle_level[0],1,CV_32FC1);
search_value[1]=cv::Mat::zeros(particle_level[1],1,CV_32FC1);
search_value[2]=cv::Mat::zeros(particle_level[2],1,CV_32FC1);
gpu_search_value[0]=cv::cuda::createContinuous(particle_level[0], 1, CV_32FC1);
gpu_search_value[1]=cv::cuda::createContinuous(particle_level[1], 1, CV_32FC1);
gpu_search_value[2]=cv::cuda::createContinuous(particle_level[2], 1, CV_32FC1);
}
};
struct CloudData {
GpuMat vertices;
GpuMat normals;
GpuMat color;
cv::Mat host_vertices;
cv::Mat host_normals;
cv::Mat host_color;
int* point_num;
int host_point_num;
explicit CloudData(const int max_number) :
vertices{cv::cuda::createContinuous(1, max_number, CV_32FC3)},
normals{cv::cuda::createContinuous(1, max_number, CV_32FC3)},
color{cv::cuda::createContinuous(1, max_number, CV_8UC3)},
host_vertices{}, host_normals{}, host_color{}, point_num{nullptr}, host_point_num{}
{
vertices.setTo(0.f);
normals.setTo(0.f);
color.setTo(0.f);
cudaMalloc(&point_num, sizeof(int));
cudaMemset(point_num, 0, sizeof(int));
}
CloudData(const CloudData&) = delete;
CloudData& operator=(const CloudData& data) = delete;
void download()
{
vertices.download(host_vertices);
normals.download(host_normals);
color.download(host_color);
cudaMemcpy(&host_point_num, point_num, sizeof(int), cudaMemcpyDeviceToHost);
}
};
}
}
#endif