[Rock-dev] RigidBodyState detecting invalid orientations

Javier Hidalgo Carrió javier.hidalgo_carrio at dfki.de
Fri Jun 29 17:58:59 CEST 2012


On 06/29/2012 05:20 PM, Alexander Duda wrote:
> On 06/29/2012 05:02 PM, Javier Hidalgo Carrió wrote:
>> +1
>> Since Orientation is a Eigen::Quaternion we could even use the norm() 
>> method.
>>
>> Javier.
>>
>> Scalar 
>> <http://eigen.tuxfamily.org/dox/classEigen_1_1QuaternionBase.html#a844358c46408e878e60c4026c52eb1e9> 
>> norm 	( 	
>> 	) 	const|[inline]|
>>
>> *Returns:*
>>     the norm of the quaternion's coefficients 
>>
>> *See also:*
>>     QuaternionBase::squaredNorm()
>>     <http://eigen.tuxfamily.org/dox/classEigen_1_1QuaternionBase.html#a8699d72c996ca6cb4673e810fe3a616c>,
>>     MatrixBase::norm()
>>     <http://eigen.tuxfamily.org/dox/classEigen_1_1MatrixBase.html#a0be1b433c65ce9d92c81a4718daf54e5>
>>
>>
>>
> I think you do not gain so much from this functions as you will get a 
> scalar which you have to sum anyway. Do you know if there is a 
> function which checks if the quaternion is valid?
>
I don't know any valid method. Having no-normalized quaternion is 
sometimes common (e.g, passing a quaternion through a EKF) and 
normalization needs to be done.
> fabs(ori.w()*ori.w()+ori.x()*ori.x()+ori.y()*ori.y()+ori.z()*ori.z()-1.0) 
> < 1e-6
>
What should be the error threshold to define if a quaternion is valid or 
not? Perhaps norm() does some round to 1.00...
> Alex
>> On 06/29/2012 04:53 PM, Alexander Duda wrote:
>>> Hi,
>>>
>>> the base type samples::RigidBodyState has a function to check if the
>>> orientation is valid.
>>> At the moment it only checks if the values of the quaternion
>>> representing the orientation are different to NaN.
>>>
>>> I propose that we also add a check that the quaternion is an unit
>>> quaternion because otherwise wrongly initialised orientations might lead
>>> to strange transformation matrices and vanishing objects in OSG.
>>>
>>> Any opinions?
>>>
>>> Alex
>>>
>>>           static bool isValidValue(base::Orientation const& ori)
>>>           {
>>>               return !base::isNaN(ori.w()) &&
>>>                   !base::isNaN(ori.x()) &&
>>>                   !base::isNaN(ori.y()) &&
>>>                   !base::isNaN(ori.z()) &&
>>>                   
>>> ori.w()*ori.w()+ori.x()*ori.x()+ori.y()*ori.y()+ori.z()*ori.z()-1e6 < 1;
>>>           }
>>>
>>
>>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.dfki.de/pipermail/rock-dev/attachments/20120629/9c961579/attachment.htm 


More information about the Rock-dev mailing list