顶部图片
022-23715128

联系方式

CONTACT
  • 公众号
    新浪微博
  • 中国 ● 天津

    联系地址:天津市西青区华鼎高科技发展中心

  • 公司座机:022-23715128

    24小时热线:15522534786

    联系QQ:2085429559

    公司邮箱:gvt@techlego.com

当前位置: 首页 > 新闻资讯 > 行业新闻 >
新闻资讯NEWS

日期:2024-07-12 15:27 浏览次数: 作者:来高科技
如何通过SDK获取两个坐标系之间的旋转矩阵和平移向量 分享到:

 

在三维扫描应用中,获取两个坐标系之间的旋转矩阵和平移向量是一项至关重要的技术。它不仅用于将不同视角下的扫描数据准确对齐,还在多设备数据拼接融合、几何校准、机器人控制和场景理解等方面发挥着关键作用。通过准确的坐标转换和对齐,可以大地提高三维扫描数据的精度和实用性,从而在多个领域中实现更准确的测量和提升分析效率。

计算两个坐标系之间的旋转矩阵和平移向量的函数原型如下:

double get_rt_by_pt_pairs(const pos3f* pts1, const pos3f* pts2, int total, double m[3][3], double t[3]);

参数pts1为坐标系1下的点坐标

参数pts2 为坐标系2下的点坐标

参数total 为配对点的数量

参数double m[3][3] 为计算后的旋转矩阵

参数double t[3] 为计算后的平移向量

1

定义一个坐标系数组

2

定义一个空的坐标系数组

3

定义一个旋转矩阵和平移向量

4

计算坐标一经过旋转平移后的坐标系2 

5

计算两个坐标系之间的旋转矩阵和平移向量并输出

以上我们完成了获取两个坐标系之间的旋转矩阵和平移向量的操作,有了这个功能就能够有效地解决数据对齐、误差校正和坐标变换等多方面的问题。这不仅提升了扫描数据的精度和可靠性,还为项目高效推进提供了强有力的支持。

源代码

int  main()

{

//通过IP端口创建协议

auto protocol = techlego::create_binary_protocol(L"localhost", 5252);

//通过协议创建客户端

auto client = techlego::h_scan3d_client::make_shared(protocol);

//坐标系1下的点坐标

std::array<techlego::pos3f, 4>points1 = {

{ {-65.4562 ,-54.4644,378.7092},

{-65.3003 ,-54.4709 ,378.7567},

{-15.7148 ,-14.9020,380.3256 },

{-65.2903 ,- 54.4111 ,378.7333} } };

//坐标系2下的点坐标

std::array<techlego::pos3f, 4>points2 = {};

// 构建绕Z轴旋转45度的旋转矩阵

Eigen::AngleAxisd angle_axis(M_PI / 4, Eigen::Vector3d(0, 0, 1));

Eigen::Matrix3d m = angle_axis.toRotationMatrix();

// 构建平移向量

Eigen::Vector3d translate_vector(1, 3, 4);

// 对坐标系1中的点应用之前构建的旋转矩阵和平移向量,得到坐标系2下的该点

for (int i = 0; i < points1.size(); i++)

{

// 用变换矩阵对坐标进行变换

// 点在坐标系1下坐标

Eigen::Vector3d point(points1[i].m_x, points1[i].m_y, points1[i].m_z);

// 变换,相当于【旋转矩阵*坐标+平移向量】

Eigen::Vector3d point_after_trans = m * point + translate_vector;

std::cout << "变换后的坐标为:" << std::endl << point_after_trans.transpose() << std::endl;

points2[i].m_x = point_after_trans(0);

points2[i].m_y = point_after_trans(1);

points2[i].m_z = point_after_trans(2);

}

//输入,配对点的数量

int total = static_cast<int>(points1.size());

//输出,旋转矩阵

//输出,平移向量

double mm[3][3] = { 0 }, t[3] = { 0 };

//由点对获取坐标系1变换到坐标系2下的旋转矩阵和平移向量

auto pairs = techlego::am::get_rt_by_pt_pairs(points2.data(), points1.data(), total, mm, t);

std::cout << "原旋转矩阵:\n" << m << "\n";

std::cout << "原平移向量:" << translate_vector.transpose()  << "\n";

std::cout << "解得的旋转矩阵:";

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 3; j++)

{

std::cout << " " << mm[i][j] << '\t';

}

std::cout << std::endl;

}

std::cout << "解得的平移向量:";

for (int i = 0; i < 3; i++)

{

std::cout << t[i] << " ";

}

std::cout << "\n各个点对距离的平方和:" << pairs << std::endl;

return 0;

}

 

 
 

官网视频号·点击视频·关注我们

 


 

经典案例

 

多机联动扫描系统助力嫦娥五号构建月表地形

 

喷漆自动化三维视觉全流程

 

混凝土立方试块尺寸三维检测全流程

↙“点击下方”查看更多精彩内容

  • 上一篇:优化导入:构建高效点云数据处理工作流
  • 下一篇:光源亮度可调性:优化三维扫描数据质量
  • 相关推荐 NEWS More>