TF报错及解决方法 Error: TF_DENORMALIZED_QUATERNION

1. Problem

用HDL做定位时会出现如下报错,然后就没办法继续run了,卡在这,然后出现如下报错:

Error: TF_DENORMALIZED_QUATERNION: Ignoring transform for
child_frame_id “odom” from authority “unknown_publisher” because of an
invalid quaternion in the transform (0.0 0.0 0.983641 0.122190)

qua

2. Solution

从报错中可以看出,提示的是四元数出问题了,关键就是说没有归一化,发布TF有严格的要求,四元数必须归一化,也就是xyzw平方和等于1,如果不等于就报上述的错,简单算一下,上述报错提示的四元数是: (0.0 0.0 0.983641 0.122190), 即 0.98364 1 2 + 0.12219 0 2 = 0.982480012981 0.983641^2 + 0.122190 ^2 =0.982480012981 0.9836412+0.1221902=0.982480012981 ,明显不等于1,所以就会出现上述问题,解决方法也简单,在输出之前做个归一化处理即可:

         Eigen::Quaterniond quatern = {0.0 0.0 0.983641 0.122190}; // w x y z
         quatern.normalize();
         odom_trans.transform.rotation.x = quatern.x();
         odom_trans.transform.rotation.y = quatern.y();
         odom_trans.transform.rotation.z = quatern.z();
         odom_trans.transform.rotation.w = quatern.w();
         odom_trans.header.stamp = stamp;
         odom_trans.header.frame_id = "map";
         odom_trans.child_frame_id = odom_child_frame_id;
         tf_broadcaster.sendTransform(odom_trans);

用Eigen的库函数可以快速得到结果,也可以直接自己写个归一化公式处理,比如:
x x 2 + y 2 + z 2 + w 2 = 0 \frac{x}{ \sqrt{x^2+y^2+z^2+w^2}}=0 x2+y2+z2+w2 x=0
y x 2 + y 2 + z 2 + w 2 = 0 \frac{y}{ \sqrt{x^2+y^2+z^2+w^2}}=0 x2+y2+z2+w2 y=0
z x 2 + y 2 + z 2 + w 2 = 0.983641 0.982480012981 = 0.9923725907873522 \frac{z}{ \sqrt{x^2+y^2+z^2+w^2}}=\frac{0.983641}{0.982480012981}=0.9923725907873522 x2+y2+z2+w2 z=0.9824800129810.983641=0.9923725907873522
w x 2 + y 2 + z 2 + w 2 = 0.122190 0.982480012981 = 0.12327465698187301 \frac{w}{ \sqrt{x^2+y^2+z^2+w^2}}=\frac{0.122190}{0.982480012981}=0.12327465698187301 x2+y2+z2+w2 w=0.9824800129810.122190=0.12327465698187301

引起这个问题的原因是之前改了hdl里面的算法部分,修改了输出的四元数,默认不会出现roll和pitch的情况,所以四元数的x和y都设成0,但是修改了这个后,又忘了重新给修改后的四元数归一化再输出,就出现了上述的报错。

在这里感谢实验室里的好伙伴,yongji,发现了解决办法
困扰了挺久,原来是漏了归一化的原因。如果遇到类似报错,也应该从这个角度去检查,应该很快能定位到问题所在。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值