本教程将演示怎样对tf树添加额外的坐标系。这与以前讲的tf broadcaster十分相似,而且会显示tf的优点。
很多任务很容易想到内部坐标系,如在激光扫描的中心更容易推理坐标系中的激光。tf允许你定义每个激光坐标系的在你系统中的坐标。tf 将将采取所有额外的坐标系转换。
tf建立了frames的树形结构,在这个结构中不允许闭环,意思是一个frame只能有一个父母,但是它可以有很多孩子,这个例子中包含了三个frame:world,turtle1和turtle2,其中turtle1和turtle2是world的孩子,如果我们想要建立一个新的frame,这个新的frame需要成为这三个frame的其中一个的孩子
roscd learning_tf
#include
#include
int main(int argc, char** argv){
ros::init(argc, argv, "my_tf_broadcaster");
ros::NodeHandle node;
tf::TransformBroadcaster br;
tf::Transform transform;
ros::Rate rate(10.0);
while (node.ok()){
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0) );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1"));
rate.sleep();
}
return 0;
};
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0) );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1"));
一个新的frame名称为carrot1,它的父母是turtle1,它距离父母的距离是在y侧即在左侧2米
编辑CMakeLists.txt
add_executable(frame_tf_broadcaster src/frame_tf_broadcaster.cpp)
target_link_libraries(frame_tf_broadcaster ${catkin_LIBRARIES})
roslaunch learning_tf start_demo.launch
检查结果,将
turtle_tf_listener.cpp进行修改
listener.lookupTransform("/turtle2", "/carrot1",
ros::Time(0), transform);
roslaunch learning_tf start_demo.launch
transform.setOrigin( tf::Vector3(2.0*sin(ros::Time::now().toSec()), 2.0*cos(ros::Time::now().toSec()), 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0) );