Re: [ros-users] tf::Vector3 to look at tf::Quaternion

Forside
Vedhæftede filer:
Indlæg som e-mail
+ (text/plain)
+ (text/html)
Slet denne besked
Besvar denne besked
Skribent: User discussions
Dato:  
Til: User discussions
Emne: Re: [ros-users] tf::Vector3 to look at tf::Quaternion
I usually do something along that line: First create the three axis
using cross products and then use them to fill a GL-like rotation matrix
that is then converted to a Quaternion:

     btMatrix3x3 rot(x_axis.x(), y_axis.x(), z_axis.x(),
                      x_axis.y(), y_axis.y(), z_axis.y(),
                     x_axis.z(), y_axis.z(), z_axis.z());
     btQuaternion rot_quat;
     rot.getRotation(rot_quat);


-tom

On 03/31/2012 01:23 PM, Gonçalo Cabrita wrote:
> Hi everyone!
>
> My program uses a Kinect to extract cylinders using PCL and draws them
> in rviz, or at least its supposed to! The problem is that the model
> from PCL provides me with a Vector3 that represents the axis of the
> cylinder and to draw it as a Marker on rviz I need to convert this
> into a quaternion. I also have access to a random point along the axis
> of the cylinder so I made the following function to extract the top
> and bottom points of the axis of the cylinder:
>
> void getMinMax3DalongAxis(const PointCloud::ConstPtr& cloud, PointT * 
> max_pt, PointT * min_pt, PointT * axis_point, tf::Vector3 * normal)
> {
>     PointT max_p = *axis_point;
> double max_t = 0.0;
>     PointT min_p = *axis_point;
> double min_t = 0.0;

>
>
>     BOOST_FOREACH(const PointT& pt, cloud->points)
>     {
> // First we convert pt into a point p along the axis on the same plane 
> perpendicular to the axis
> double t = (normal->x()*(pt.x-axis_point->x) + 
> normal->y()*(pt.y-axis_point->y) + 
> normal->z()*(pt.z-axis_point->z))/(pow(normal->x(),2) + 
> pow(normal->y(),2) + pow(normal->z(),2));

>
>
>         PointT p;
>         p.x = axis_point->x + normal->x() * t;
>         p.y = axis_point->y + normal->y() * t;
>         p.z = axis_point->z + normal->z() * t;

>
>
> // Now we check if the point is min or max using the result of the 
> parametric equations
> if(t>max_t)
>         {
>             max_t = t;
>             max_p = p;
>         }
> if(t<min_t)
>         {
>             min_t = t;
>             min_p = p;
>         }
>     }

>
>
>     *max_pt = max_p;
>     *min_pt = min_p;
> }

>
> I believe this to be working properly as I am showing the returned
> dots as spheres on rviz. The problem I believe lies on the conversion
> I'm making from the Vector3 to Quaternion. I am aware that both things
> cannot hold the same information, I am trying to calculate the look at
> quaternion given to me by the vector that represents the axis of the
> cylinder that provides me a direction and not a rotation. This is the
> piece of software that I believe is resulting in a bad representation
> of the cylinder in rviz:
>
>     // Calculate the look at quaternion of the cylinder axis
>     tf::Vector3 base_vector(base_pt.x, base_pt.y, base_pt.z);
>     base_vector.normalized();
>     tf::Vector3 top_vector(top_pt.x, top_pt.y, top_pt.z);
>     top_vector.normalized();
>     tf::Vector3 cross_vector = base_vector.cross(top_vector);
>     tf::Quaternion q(cross_vector, base_vector.dot(top_vector) + 1.0);
>     q.normalize();
>     geometry_msgs::Quaternion cylinder_orientation;
>     tf::quaternionTFToMsg(q, cylinder_orientation);

>
> Would this be a good question of answers.ros.og? Perhaps if I make it
> more general in terms of the conversion between Vector3 and a look at
> Quaternion?
>
> Thanks in advance,
>
> Gonçalo Cabrita
>
>
> _______________________________________________
> ros-users mailing list
>
> https://code.ros.org/mailman/listinfo/ros-users