还要修改CMakeList.txt
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp) target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})编写launch文件 start_demo.launch
<launch> <!-- Turtlesim Node--> <node pkg="turtlesim" type="turtlesim_node" name="sim"/> <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/> <!-- Axes --> <param name="scale_linear" value="2" type="double"/> <param name="scale_angular" value="2" type="double"/> <node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" /> <node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" /> </launch>接下来就可以运行了。
在很多应用中,添加一个参考系是很有必要的,比如在一个world参考系下,有一个激光扫描节点,tf可以帮助我们将激光扫描的信息坐标装换成全局坐标。
tf消息结构
tf中的信息是一个树状的结构,world参考系是最顶端的父参考系,其他的参考系都需要向下延伸。如果我们在上文的基础上添加一个参考系,就需要让这个新的参考系成为已有三个参考系中的一个的子参考系。
建立固定参考系
以turtle1作为父参考系,建立一个新的参考系“carrot1”
/*frame_tf_broadcaster.cpp*/ #include <ros/ros.h> #include <tf/transform_broadcaster.h> 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, 1) ); br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1")); rate.sleep(); } return 0; }; /*修改CMakeList.txt add_executable(frame_tf_broadcaster src/frame_tf_broadcaster.cpp) target_link_libraries(frame_tf_broadcaster ${catkin_LIBRARIES}) */ /*修改launch文件 <node pkg="learning_tf" type="frame_tf_broadcaster" name="broadcaster_frame" /> */修改turtle_tf_listener.cpp文件
listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform); //改为 listener.lookupTransform("/turtle2", "/carrot1", ros::Time(0), transform);