坐标转换记录

一、坐标发送两种方式:

1、tftree发送;

2、广播方式:(ros代码)

 static tf::TransformBroadcaster br;

 tf::Transform transform;

 transform.setOrigin( tf::Vector3(0.0, 3.0, 10.0) );

 tf::Quaternion q;

 ros::Time input_time = input->header.stamp;

 q.setRPY(0, 0, 0.0);

 transform.setRotation(q);

 br.sendTransform(tf::StampedTransform(transform, input_time, "velodyne", "global"));  //parent ,child


其中sendTransform中第三个参数为父坐标,第四个参数为子坐标。


二、坐标接收方式:

1、直接查询方法:

tf::StampedTransform transform2;

  try{

      tran->lookupTransform("/base_link", "/velodyne_32e_link",                                    //destination_frame, original_frame,

                              ros::Time(0), transform2);

    }

    catch (tf::TransformException &ex) {

      ROS_ERROR("%s",ex.what());

      ros::Duration(1.0).sleep();

    }

  cout << transform2.getOrigin().x() << transform2.getOrigin().y() << transform2.getOrigin().z() <

如果无坐标可收,会立即报error。

2、通过waitForTransform接收坐标

tran->waitForTransform("/global", "/velodyne", input_time, ros::Duration(10.0));

其中第一个参数为destination_frame,第二个参数为original_frame。函数可设置等待接收时间,超过时间即报error。

三、坐标接收后进行坐标转换。

转换方法较多,点云转换如下:

pcl_ros::transformPointCloud("/velodyne", *cloud, *newBox, *tran);

其中第一个参数为目标坐标系,第二个参数为original pointcloud,第三个参数为 destination pointcloud。

第四个参数为接收到的坐标,正变换、逆变换 都包含其中,如global跟velodyne坐标的相互转换如下:

pcl_ros::transformPointCloud("/global", bBoxes[i], newBox, *tran);

pcl_ros::transformPointCloud("/velodyne", visBBs[i], visEgoBB, *tran);

你可能感兴趣的:(坐标转换记录)