坐标转换记录
一、坐标发送两种方式:
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() <<endl;
如果无坐标可收,会立即报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);