平面点云匹配姿态计算

平面点云匹配姿态计算

本来想写个ICP的,发现用不着。。
对于已经对应好的点云,直接使用第一点与中心点进行变换姿态估计就可以了;
如果想精度更准确些,那就依次加入第二点,第三点….直到达到最终误差限;

#include "stdafx.h"
#include <eigen/dense>
#include <iostream>
#define M_T  M_PI / 180
bool getRT(Eigen::MatrixXf src0, Eigen::MatrixXf src1, Eigen::MatrixXf &Rr, Eigen::MatrixXf &Tr, float &error)
{
    Rr = Eigen::MatrixXf::Identity(2, 2); 
    Tr = Eigen::MatrixXf::Zero(2, 1); 
    Eigen::MatrixXf center0 = Eigen::MatrixXf::Zero(2, 1); 
    Eigen::MatrixXf center1 = Eigen::MatrixXf::Zero(2, 1); 
    Eigen::MatrixXf t0 = Eigen::MatrixXf(2, 1); 
    Eigen::MatrixXf t1 = Eigen::MatrixXf(2, 1); 
    float theta = 0; 

    center0(0, 0) = src0.col(0).sum() / src0.rows(); 
    center0(1, 0) = src0.col(1).sum() / src0.rows(); 
    center1(0, 0) = src1.col(0).sum() / src1.rows(); 
    center1(1, 0) = src1.col(1).sum() / src1.rows(); 
    t0 = center0 - src0.row(0).transpose(); 
    t1 = center1 - src1.row(0).transpose(); 
    theta = acosf((t0(0, 0) * t1(0, 0) + t0(1, 0) * t1(1, 0)) / (t0.norm() * t1.norm())); 

    Rr << cosf(theta), sinf(theta), -sinf(theta), cosf(theta); 
    Rr = Rr.inverse(); 
    src1 = src1 * Rr; 
    center0(0, 0) = src0.col(0).sum() / src0.rows(); 
    center0(1, 0) = src0.col(1).sum() / src0.rows(); 
    center1(0, 0) = src1.col(0).sum() / src1.rows(); 
    center1(1, 0) = src1.col(1).sum() / src1.rows(); 
    Tr = center0 - center1; 
    error = 0; 
    src1.col(0) = src1.col(0).array() + Tr(0, 0); 
    src1.col(1) = src1.col(1).array() + Tr(1, 0); 
    for (int i = 0; i < src0.rows(); ++i)
    {
        error += (src0.row(i) - src1.row(i)).norm(); 
    }
    return true; 
}
int _tmain(int argc, _TCHAR* argv[])
{
    int r = 10; 
    int c = 10; 
    int N = r * c; 
    float theta = 20.0; 
    float sx = 10; 
    float sy = 20; 
    Eigen::MatrixXf src0 = Eigen::MatrixXf::Zero(N, 2); 
    Eigen::MatrixXf src1 = Eigen::MatrixXf::Zero(N, 2); 

    for (int i = 0; i < N; ++i)
    {
        src0(i, 0) = i / c; 
        src0(i, 1) = i % c; 
    }
    Eigen::MatrixXf R = Eigen::MatrixXf::Identity(2, 2); 
    R << cosf(theta * M_T), sinf(theta * M_T),
        -sinf(theta * M_T), cosf(theta * M_T); 
    src1 = src0 * R; 
    src1.col(0) = src1.col(0).array() + sx; 
    src1.col(1) = src1.col(1).array() + sy; 
    std::cout << src0 << "\n\n"; 
    std::cout << src1 << "\n\n"; 
    Eigen::MatrixXf Rr, Tr; 
    float error;
    getRT(src0, src1, Rr, Tr, error); 
    std::cout << error << "\n\n"; 
    src1 = (src1 * Rr); 
    src1.col(0) = src1.col(0).array() + Tr(0, 0); 
    src1.col(1) = src1.col(1).array() + Tr(1, 0); 
    std::cout << src1 << "\n\n"; 
    getchar(); 
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Halcon 的点云位姿可以通过以下几种方式设置: 1. 通过相机的内外参数和三维点的坐标,使用三维重建函数计算点云位姿。 2. 通过手动输入点云的位置和方向,使用函数`PoseToHomMat3D`进行设置。 3. 对已经获得的点云数据进行对齐,以确定点云位姿。 具体使用方法请参考 Halcon 官方文档和教程,或者请联系 Halcon 技术支持团队。 ### 回答2: Halcon是一种强大的图像处理软件,它也可以处理点云数据。在Halcon中设置点云位姿需要以下步骤: 1. 加载点云数据:首先,需要将点云数据导入到Halcon中。可以通过打开点云文件(例如.pcd、.ply等)、从传感器读取点云数据或者根据其他图像处理结果生成点云数据。 2. 可视化点云数据:可以使用Halcon的可视化工具将点云数据显示在图像窗口中。这样可以检查点云数据是否正确加载,并且可以观察点云的形状、密度等信息。 3. 定义标定板或特征点:如果需要进行位姿设置,需要定义标定板或选择点云中的特征点。标定板是一个已知形状和位置信息的平面,通过识别标定板上的特征点,可以计算点云位姿。特征点可以是点云中的任意明显的特征,通过检测和匹配特征点,同样可以计算点云位姿。 4. 执行位姿设置:使用Halcon的位姿设置工具,在图像窗口中选择或标定好的标定板或特征点,然后执行位姿设置操作。Halcon会根据选定的点云数据和标定信息计算点云位姿,并将结果显示在图像窗口中。 5. 应用位姿信息:一旦得到了点云位姿信息,可以根据需要对点云数据进行进一步处理。比如,可以将位姿信息应用于目标定位、三维重建、姿态分析等应用场景中。 总之,在Halcon中设置点云位姿需要加载点云数据,可视化显示点云,定义标定板或特征点,执行位姿设置操作,并应用位姿信息。这些步骤可以帮助用户在Halcon中准确地设置点云位姿
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值