当前位置:网站首页>autoware中ndtmatching功能加载点云图坐标系修正的问题
autoware中ndtmatching功能加载点云图坐标系修正的问题
2022-07-29 01:25:00 【qq_278667286】
autoware中ndtmatching加载点云图坐标系修正的问题
autoware中点云和矢量(高精)地图都是map系
我们建图实践时创建点云图与场地不符
如果对位修正方法采用创建一个新的系如map3d来容纳点云
然后修改发布map3d到world的变换使 点云与场地对齐
坐标系如图:
如图,地面红框为场地边界,淡蓝色为墙面标记
加载点云的坐标系为map3d,经过调整map3d到world(map)系的变换,点云已与场地重合。
但此时运行ndt_matching,给初始位置后会定位失败。
为了解决这个问题,就需要更改一下ndtmatching加载点云时对点云的处理,即把map3d的点云转到map下。
主要代码:
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);
}
添加转换后的定位效果
map_callback点云话题的回调函数
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;
}
}
边栏推荐
- Stonedb invites you to participate in the open source community monthly meeting!
- 物联网开发--MQTT消息服务器EMQX
- Try to understand the essence of low code platform design from another angle
- Make logic an optimization example in sigma DSP - data distributor
- Anti crawler mechanism solution: JS code generates random strings locally
- Force deduction brush question (2): sum of three numbers
- Flexible layout single selection
- DSP vibration seat
- 2022年编程语言排名,官方数据来了,让人大开眼界
- 解决使用ESlint时,和vetur冲突导致保存变双引号,结尾逗号等
猜你喜欢
随机推荐
[the road of Exile - Chapter 6]
Secret skill winter tide branding skill matching
数学建模——自来水管道铺设问题
[circuit design] convert AC AC to DC
[UE4] replay game playback for ue4.26
Mobile communication -- simulation model of error control system based on convolutional code
QT memory management tips
leetcode/乘积小于K 的连续子数组的个数
[electronic components] constant voltage, amplify the current of the load (triode knowledge summary)
Jetpack--了解ViewModel和LiveData的使用
How to prevent all kinds of affiliated fraud?
数学建模——带相变材料的低温防护服御寒仿真模拟
[the road of Exile - Chapter 7]
Related function records about string processing (long-term update)
Leetcode exercise - Sword finger offer 45. arrange the array into the smallest number
[golang] use select {}
Verilog procedure assignment statements: blocking & non blocking
LM13丨形态量化-动量周期分析
As long as I run fast enough, it won't catch me. How does a high school student achieve a 70% salary increase under the epidemic?
Js DOM2 和 DOM3









