Halcon如何基于已有数据创建或调整hom_mat3D三维齐次变换矩阵
基于预获取数据创建Halcon三维齐次变换矩阵的方法
Halcon中create_matrix生成的通用Matrix类型,和三维变换专用的HomMat3D是完全独立的两类数据结构,不存在隐式类型转换,直接传入hom_mat3d_*系列算子必然报类型不匹配错误。另外你之前代码里调用的hom_mat2d_compose是二维齐次矩阵合成算子,本身也不支持三维变换计算,属于接口选错。
不需要绕通用Matrix做中转,直接按以下方式创建即可:
- 如果你已经拿到了4×4齐次变换矩阵的全部16个元素值(3×3旋转矩阵+3个平移分量+固定末行[0,0,0,1]),直接以单位齐次矩阵为基底,逐元素赋值生成目标矩阵:
* 生成三维单位齐次矩阵作为基底 hom_mat3d_identity (HomMat3D) * 写入3×3旋转矩阵分量,Rxx为你从其他流程拿到的对应位置旋转值 hom_mat3d_set(HomMat3D, 0, 0, R11, HomMat3D) hom_mat3d_set(HomMat3D, 0, 1, R12, HomMat3D) hom_mat3d_set(HomMat3D, 0, 2, R13, HomMat3D) hom_mat3d_set(HomMat3D, 1, 0, R21, HomMat3D) hom_mat3d_set(HomMat3D, 1, 1, R22, HomMat3D) hom_mat3d_set(HomMat3D, 1, 2, R23, HomMat3D) hom_mat3d_set(HomMat3D, 2, 0, R31, HomMat3D) hom_mat3d_set(HomMat3D, 2, 1, R32, HomMat3D) hom_mat3d_set(HomMat3D, 2, 2, R33, HomMat3D) * 写入X/Y/Z三个方向平移分量,Tx/Ty/Tz为外部传入的平移值 hom_mat3d_set(HomMat3D, 0, 3, Tx, HomMat3D) hom_mat3d_set(HomMat3D, 1, 3, Ty, HomMat3D) hom_mat3d_set(HomMat3D, 2, 3, Tz, HomMat3D) * 齐次矩阵末行固定为[0,0,0,1],单位矩阵初始化时已自动赋值,无需修改
- 如果你之前已经把所有矩阵值存入了通用
Matrix对象,不需要重新录入原始数据,先把元素从通用矩阵中读出,再按上述逻辑赋值即可:
* 从4×4通用矩阵中读取对应位置的数值 get_value_matrix(InputMatrix, 0, 0, R11) get_value_matrix(InputMatrix, 0, 1, R12) get_value_matrix(InputMatrix, 0, 2, R13) get_value_matrix(InputMatrix, 0, 3, Tx) get_value_matrix(InputMatrix, 1, 0, R21) get_value_matrix(InputMatrix, 1, 1, R22) get_value_matrix(InputMatrix, 1, 2, R23) get_value_matrix(InputMatrix, 1, 3, Ty) get_value_matrix(InputMatrix, 2, 0, R31) get_value_matrix(InputMatrix, 2, 1, R32) get_value_matrix(InputMatrix, 2, 2, R33) get_value_matrix(InputMatrix, 2, 3, Tz)
注意事项:生成的
HomMat3D可直接通过hom_mat3d_to_pose转为位姿类型用于刚性变换计算,正式使用前建议校验旋转矩阵的正交性,避免传入非法变换值导致计算结果偏差。如果是多步变换合成,统一使用hom_mat3d_compose算子做矩阵乘法,不要混用2d系列变换接口。
内容的提问来源于stack exchange,提问作者Malinko
相关产品推荐
相关产品推荐

