当前位置:网站首页>The problem of modifying the coordinate system of point cloud image loaded by ndtmatching function in autoware
The problem of modifying the coordinate system of point cloud image loaded by ndtmatching function in autoware
2022-07-29 02:11:00 【qq_ two hundred and seventy-eight million six hundred and sixty】
autoware in ndtmatching Loading point cloud image coordinate system correction problem
autoware Midpoint cloud and vector ( Hyperfine ) Maps are map system
In our mapping practice, the point cloud map created is inconsistent with the site
If the alignment correction method is adopted, create a new system, such as map3d To accommodate some clouds
Then modify the release map3d To world The transformation of makes Align the point cloud with the site
The coordinate system is shown in the figure : Pictured , The red box on the ground is the site boundary , Light blue marks the wall
The coordinate system of the loaded point cloud is map3d, After adjustment map3d To world(map) Transformation of systems , The point cloud has coincided with the site .
But at this time ndt_matching, After giving the initial position, the positioning will fail .
To solve this problem , It needs to be changed ndtmatching Processing of point cloud when loading it , Namely the map3d Point cloud of goes to map Next .
Main code :
if (input->header.frame_id == “map3d”)
{
tf::TransformListener local_transform_listener;
try
{
ros::Time now = ros::Time(0);
local_transform_listener.waitForTransform(“/map”, “/map3d”, now, ros::Duration(10.0));
local_transform_listener.lookupTransform(“/map”, “map3d”, now, local_transform_map_map3d);
}
catch (tf::TransformException& ex)
{
ROS_ERROR(“%s”, ex.what());
}
pcl_ros::transformPointCloud(map, map, local_transform_map_map3d);
}
Add the positioning effect after conversion
map_callback Callback function of point cloud topic
static void map_callback(const sensor_msgs::PointCloud2::ConstPtr& input)
{
// if (map_loaded == 0)
if (points_map_num != input->width)
{
std::cout << "Update points_map." << std::endl;
points_map_num = input->width;
// Convert the data type(from sensor_msgs to pcl).
pcl::fromROSMsg(*input, map);
//zzz20220722----------------------------begin
if (input->header.frame_id == "map3d")
{
tf::TransformListener local_transform_listener;
try
{
ros::Time now = ros::Time(0);
local_transform_listener.waitForTransform("/map", "/map3d", now, ros::Duration(10.0));
local_transform_listener.lookupTransform("/map", "map3d", now, local_transform_map_map3d);
}
catch (tf::TransformException& ex)
{
ROS_ERROR("%s", ex.what());
}
pcl_ros::transformPointCloud(map, map, local_transform_map_map3d);
}
//zzz20220722----------------------------end
if (_use_local_transform == true)
{
tf::TransformListener local_transform_listener;
try
{
ros::Time now = ros::Time(0);
local_transform_listener.waitForTransform("/map", "/world", now, ros::Duration(10.0));
local_transform_listener.lookupTransform("/map", "world", now, local_transform);
}
catch (tf::TransformException& ex)
{
ROS_ERROR("%s", ex.what());
}
pcl_ros::transformPointCloud(map, map, local_transform.inverse());
}
pcl::PointCloud<pcl::PointXYZ>::Ptr map_ptr(new pcl::PointCloud<pcl::PointXYZ>(map));
// Setting point cloud to be aligned to.
if (_method_type == MethodType::PCL_GENERIC)
{
pcl::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ> new_ndt;
pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud(new pcl::PointCloud<pcl::PointXYZ>);
new_ndt.setResolution(ndt_res);
new_ndt.setInputTarget(map_ptr);
new_ndt.setMaximumIterations(max_iter);
new_ndt.setStepSize(step_size);
new_ndt.setTransformationEpsilon(trans_eps);
new_ndt.align(*output_cloud, Eigen::Matrix4f::Identity());
pthread_mutex_lock(&mutex);
ndt = new_ndt;
pthread_mutex_unlock(&mutex);
}
else if (_method_type == MethodType::PCL_ANH)
{
cpu::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ> new_anh_ndt;
new_anh_ndt.setResolution(ndt_res);
new_anh_ndt.setInputTarget(map_ptr);
new_anh_ndt.setMaximumIterations(max_iter);
new_anh_ndt.setStepSize(step_size);
new_anh_ndt.setTransformationEpsilon(trans_eps);
pcl::PointCloud<pcl::PointXYZ>::Ptr dummy_scan_ptr(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointXYZ dummy_point;
dummy_scan_ptr->push_back(dummy_point);
new_anh_ndt.setInputSource(dummy_scan_ptr);
new_anh_ndt.align(Eigen::Matrix4f::Identity());
pthread_mutex_lock(&mutex);
anh_ndt = new_anh_ndt;
pthread_mutex_unlock(&mutex);
}
#ifdef CUDA_FOUND
else if (_method_type == MethodType::PCL_ANH_GPU)
{
std::shared_ptr<gpu::GNormalDistributionsTransform> new_anh_gpu_ndt_ptr =
std::make_shared<gpu::GNormalDistributionsTransform>();
new_anh_gpu_ndt_ptr->setResolution(ndt_res);
new_anh_gpu_ndt_ptr->setInputTarget(map_ptr);
new_anh_gpu_ndt_ptr->setMaximumIterations(max_iter);
new_anh_gpu_ndt_ptr->setStepSize(step_size);
new_anh_gpu_ndt_ptr->setTransformationEpsilon(trans_eps);
pcl::PointCloud<pcl::PointXYZ>::Ptr dummy_scan_ptr(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointXYZ dummy_point;
dummy_scan_ptr->push_back(dummy_point);
new_anh_gpu_ndt_ptr->setInputSource(dummy_scan_ptr);
new_anh_gpu_ndt_ptr->align(Eigen::Matrix4f::Identity());
pthread_mutex_lock(&mutex);
anh_gpu_ndt_ptr = new_anh_gpu_ndt_ptr;
pthread_mutex_unlock(&mutex);
}
#endif
#ifdef USE_PCL_OPENMP
else if (_method_type == MethodType::PCL_OPENMP)
{
pcl_omp::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ> new_omp_ndt;
pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud(new pcl::PointCloud<pcl::PointXYZ>);
new_omp_ndt.setResolution(ndt_res);
new_omp_ndt.setInputTarget(map_ptr);
new_omp_ndt.setMaximumIterations(max_iter);
new_omp_ndt.setStepSize(step_size);
new_omp_ndt.setTransformationEpsilon(trans_eps);
new_omp_ndt.align(*output_cloud, Eigen::Matrix4f::Identity());
pthread_mutex_lock(&mutex);
omp_ndt = new_omp_ndt;
pthread_mutex_unlock(&mutex);
}
#endif
map_loaded = 1;
}
}
边栏推荐
- Jetpack--了解ViewModel和LiveData的使用
- Promise solves asynchrony
- Related function records about string processing (long-term update)
- 点击按钮,下滑到指定的位置
- Mathematical modeling -- Optimization of picking in warehouse
- Introduction to shared data center agent
- ASCII code table
- QT source code analysis -- QObject (4)
- Try to understand the essence of low code platform design from another angle
- Know that Chuangyu is listed in many fields of ccsip 2022 panorama
猜你喜欢
Add graceful annotations to latex formula; "Data science" interview questions collection of RI Gai; College Students' computer self-study guide; Personal firewall; Cutting edge materials / papers | sh
[云原生]微服务架构是什么
Ciscn 2022 central China Misc
Basic working principle and LTSpice simulation of 6T SRAM
Stonedb invites you to participate in the open source community monthly meeting!
What is the function of data parsing?
12. < tag dynamic programming and subsequence, subarray> lt.72. edit distance
Why can't Bi software do correlation analysis
「活动推荐」冲冲冲!2022 国际开源节有新内容
Thirty years of MPEG audio coding
随机推荐
druid. The performance of IO + tranquility real-time tasks is summarized with the help of 2020 double 11
[云原生]微服务架构是什么
Detailed explanation of IVX low code platform series -- Overview (II)
数学建模——派出所选址
“蔚来杯“2022牛客暑期多校训练营2,签到题GJK
Ignore wechat font settings
JVM内存溢出在线分析Dump文件以及在线分析打开.hprof文件得出JVM运行报告jvisualvm怎么在线分析
Force deduction brush question (2): sum of three numbers
Monadic linear function perceptron: Rosenblatt perceptron
2022年编程语言排名,官方数据来了,让人大开眼界
Semiconductor chip industry chain
Force deduction brush question (1): sum of two numbers
mobile-picker.js
The number of consecutive subarrays whose leetcode/ product is less than k
Leetcode exercise - Sword finger offer 45. arrange the array into the smallest number
Form verification hidden input box is displayed before verification
Click back to the top JS
Establish an engineering template based on STM32 in keil -- detailed steps
[UE4] replay game playback for ue4.26
Nine days later, we are together to focus on the new development of audio and video and mystery technology