关于目前ICP算法的理解和总结

关于目前ICP算法的理解和总结

基本概念之配准

有两个点集,source和target,target不变,source经过旋转(Rotation)和平移(Translation)甚至加上尺度(Scale)变换,使得变换后的source点集尽量和target点集重合,这个变换的过程就叫点集配准。

两个点集的对应,输出通常是一个4×4刚性变换矩阵:代表旋转和平移,它应用于源数据集,结果是完全与目标数据集匹配。下图是“双对应”算法中一次迭代的步骤:


image.png

对两个数据源a,b匹配运算步骤如下:

  1. 从其中一个数据源a出发,分析其最能代表两个数据源场景共同点的关键点k
  2. 在每个关键点ki处,算出一个特征描述子fi
  3. 从这组特征描述子{fi}和他们在a和b中的XYZ坐标位置,基于fi和xyz的相似度,找出一组对应
  4. 由于实际数据源是有噪的,所以不是所有的对应都有效,这就需要一步一步排除对匹配起负作用的对应
    从剩下的较好对应中,估计出一个变换

icp优化思路

首先icp是一步一步迭代得到较好的结果,解的过程其实是一个优化问题,并不能达到绝对正解。这个过程中求两个点云之间变换矩阵是最重要的,PCL里是用奇异值分解SVD实现的

从上面的icp流程中我们可以看到的可以用不同的算法对1、2、3这三个步骤进行优化

关于PLICP调研和优化方案,后续给出

目前我们的代码中的重要参数如下,需要我们设置的参数为加粗部分

inline void inline void setSearchMethodTarget(const KdTreePtr &tree) kdtree

加速搜索,还有一个Target的函数,用法与之一致。

inline void setInputSource (constPointCloudSourceConstPtr &cloud)

需要匹配的点云。

inline void setInputTarget (constPointCloudTargetConstPtr &cloud)

基准点云,也就是从Source到Target的匹配。

inline void setMaxCorrespondenceDistance (doubledistance_threshold) 

忽略在此距离之外的点,如果两个点云距离较大,这个值要设的大一些(PCL默认距离单位是m)。目前我们的launch文件中mcpd设置的大小为0.05

inline void setTransformationEpsilon (doubleepsilon) 

第2个约束,这个值一般设为1e-6或者更小。(目前在launch文件中并没有设置,代码1e-6,这个值可以更小)

inline void setEuclideanFitnessEpsilon (doubleepsilon) 

第3个约束,前后两次迭代误差的差值。(目前在launch文件中并没有设置,代码1e-6,太小,可优化)

inline void setMaximumIterations (intnr_iterations) 

第1个约束,迭代次数,几十上百都可能出现。目前在launch文件中maxIterations为250

inline void align (PointCloudSource &output)

输出配准后点云。

inline Matrix4 getFinalTransformation () 

获取最终的转换矩阵。

bool ScanMatch::icp(const pcl::PointCloud<pcl::PointXYZ>::Ptr &scan_cloud,
                    const pcl::PointCloud<pcl::PointXYZ>::Ptr &map_cloud, tf2::Transform &pose_corrections_out) {
    pose_corrections_out = tf2::Transform::getIdentity();
    pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> reg;
    //第2个约束,这个值一般设为1e-6或者更小
    reg.setTransformationEpsilon(1e-6);
    //第3个约束,前后两次迭代误差的差值
    reg.setEuclideanFitnessEpsilon(1e-6);
    //忽略在此距离之外的点,如果两个点云距离较大,这个值要设的大一些
    reg.setMaxCorrespondenceDistance(0.02);//0.02
    // 第1个约束,迭代次数,几十上百都可能出现
    reg.setMaximumIterations(maxIterations_);
    //进行RANSAC迭代
    reg.setRANSACIterations(maxIterations_);
    //剔除错误估计,可用 RANSAC 算法,或减少数量
    reg.setRANSACOutlierRejectionThreshold(0.05);
    //设置查找近邻时是否双向搜索
    reg.setUseReciprocalCorrespondences(true);
    {
        pcl::search::KdTree<pcl::PointXYZ>::Ptr target_pointcloud_search_method(
            new pcl::search::KdTree<pcl::PointXYZ>());
        target_pointcloud_search_method->setInputCloud(map_cloud);
        reg.setInputTarget(map_cloud);
        reg.setSearchMethodTarget(target_pointcloud_search_method, true);
    }

    pcl::search::KdTree<pcl::PointXYZ>::Ptr reference_pointcloud_search_method(new pcl::search::KdTree<pcl::PointXYZ>());
    reference_pointcloud_search_method->setInputCloud(map_cloud);
    {
        pcl::search::KdTmree<pcl::PointXYZ>::Ptr source_pointcloud_search_method(new pcl::search::KdTree<pcl::PointXYZ>());
        source_pointcloud_search_method->setInputCloud(scan_cloud);
        reg.setSearchMethodSource(source_pointcloud_search_method, true);
        reg.setInputSource(scan_cloud);
    }
    pcl::PointCloud<pcl::PointXYZ>::Ptr unused(new pcl::PointCloud<pcl::PointXYZ>());
    //调用该函数开配准
    reg.align(*unused);
    const Eigen::Matrix4f &transf = reg.getFinalTransformation();
    tf::Transform tf;
    matrixAsTransfrom(transf, tf);
    if (reg.hasConverged()) {
        tfToTF2(tf, pose_corrections_out);
    }
    return false;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容