Eigen 编译错误 error: static assertion failed: you_performed_an_invalid_transformation_conversion

在ROS中使用getGlobalLinkTransform()时遇到类型转换错误,返回值应为Eigen::Isometry3d,实际得到Eigen::Affine3d。解决方法是正确进行Affine3d到Isometry3d的转换,注意Isometry3d的旋转矩阵赋值需用linear,而非rotation。

最近在使用ros中的一个运动学正解函数getGlobalLinkTransform()时碰到了如上问题,官方文档中该函数的返回值是Eigen::Isometry3d,因此定义了对应的数据类型来接受该返回值,但是编译报错,告诉我出现了类型转换的错误, 明明是同一种类型哪来的类型转换?

  • getGlobalLinkTransform() 官方文档:
    在这里插入图片描述
  • 调用:
const Eigen::Isometry3d& end_effector_state = kinematic_state->getGlobalLinkTransform("wrist_3_link");
  • 编译报错:
error: static assertion failed: you_performed_an_invalid_transformation_conversion
  • 虽然百思不得骑姐,但还是无聊的查看了一下函数的输出类型:

竟然是Eigen::Affine3d!!!

  • 试了试Eigen::Affine3d:
    const Eigen::Affine3d& end_effector_state = kinematic_state->getGlobalLinkTransform("wrist_3_link");
    ROS_INFO("use datatype Affine3d");
    ROS_INFO_STREAM("Translation: \n" << end_effector_state.translation() << "\n");
    ROS_INFO_STREAM("Rotation: \n" << end_effector_state.rotation() << "\n");
  • 编译通过,并且能正确输出Affine3d的translation和rotation。

既然是这个问题,那就类型转换一下吧,没想到还是坑。。。

概括来说,Affine3d转换成Isometry3d必须遵循如下格式:

Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.linear() = a.rotation();

这个Isometry3d的旋转矩阵赋值还必须是用linear,不能用rotation,因为rotation是只读属性,而输出的时候用rotation或者linear都行。

这点破事…一下午,都是泪…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值