#################################### ##FILL ME IN #################################### ## for a custom note with links: ## note =This tutorial assumes you have a working knowledge of compiling programs in ROS and you have completed the [[tf/Tutorials/Introduction to tf | Introduction to tf]] tutorial ## for the canned note of "This tutorial assumes that you have completed the previous tutorials:" just add the links 16 br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world" , turtle_name)); 16 br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world" , turtle_name)); ## note.0= ## descriptive title for the tutorial 16 br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world" , turtle_name)); ## title =Writing a tf broadcaster (C++) ## multi-line description to be displayed in search ## description = This tutorial teaches you how to broadcast coordinate frames of a robot to tf. ## the next tutorial description (optional) ## next = Writing a tf listener ## links to next tutorial (optional) ## next.0.link=[[tf/Tutorials/Writing a tf listener (C++)|(C++)]] ## next.1.link= ## what level user is this tutorial for ## level= BeginnerCategory ## keywords = #################################### <> {{{#!wiki caution tf is deprecated in favor of [[tf2]]. [[tf2]] provides a superset of the functionality of tf and is actually now the implementation under the hood. If you're just learning now it's strongly recommended to use the [[tf2/Tutorials]] instead. }}} <> <> ##introstart In the next two tutorials we will write the code to reproduce the demo from the [[tf/Tutorials/Introduction to tf|tf introduction]] tutorial. After that, the following tutorials focus on extending the demo with more advanced tf features. Before we get started, you need to create a new ros package for this project. In the sandbox folder, create a package called `learning_tf` that depends on tf, [[roscpp]], [[rospy]] and [[turtlesim]]: {{{{#!wiki buildsystem catkin {{{ $ cd %YOUR_CATKIN_WORKSPACE_HOME%/src $ catkin_create_pkg learning_tf tf roscpp rospy turtlesim }}} Build your new package before you can roscd: {{{ $ cd %YOUR_CATKIN_WORKSPACE_HOME%/ $ catkin_make $ source ./devel/setup.bash }}} }}}} {{{{#!wiki buildsystem rosbuild {{{ $ roscd tutorials $ roscreate-pkg learning_tf tf roscpp rospy turtlesim $ rosmake learning_tf }}} }}}} == How to broadcast transforms == This tutorial teaches you how to broadcast coordinate frames to tf. In this case, we want to broadcast the changing coordinate frames of the turtles, as they move around. Let's first create the source files. Go to the package we just created: {{{ $ roscd learning_tf }}} ##introend === The Code === Go to '''src/''' folder and fire up your favorite editor to paste the following code into a new file called '''`src/turtle_tf_broadcaster.cpp`'''. <> === The Code Explained === Now, let's take a look at the code that is relevant to publishing the turtle pose to tf. <> The tf package provides an implementation of a `TransformBroadcaster` to help make the task of publishing transforms easier. To use the `TransformBroadcaster`, we need to include the '''`tf/transform_broadcaster.h`''' header file. <> Here, we create a `TransformBroadcaster` object that we'll use later to send the transformations over the wire. <> Here we create a `Transform` object, and copy the information from the 2D turtle pose into the 3D transform. <> Here we set the rotation. <> This is where the real work is done. Sending a transform with a `TransformBroadcaster` requires four arguments. 1. First, we pass in the transform itself. 1. Now we need to give the transform being published a timestamp, we'll just stamp it with the current time, `ros::Time::now()`. 1. Then, we need to pass the name of the parent frame of the link we're creating, in this case `"world"` 1. Finally, we need to pass the name of the child frame of the link we're creating, in this case this is the name of the turtle itself. ''Note: sendTransform and !StampedTransform have opposite ordering of parent and child.'' == Running the broadcaster == Now that we created the code, lets compile it first. Open the `CMakeLists.txt` file, and add the following line at the bottom: {{{{#!wiki buildsystem rosbuild {{{ rosbuild_add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp) }}} Build your package: {{{ $ make }}} }}}} {{{{#!wiki buildsystem catkin {{{ add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp) target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES}) }}} Build your package; at the top folder of your catkin workspace: {{{ $ catkin_make }}} If everything went well, you should have a binary file called '''`turtle_tf_broadcaster`''' in your `devel/lib/learning_tf` folder. }}}} If so, we're ready to create a launch file for this demo. With your text editor, create a new file called '''`start_demo.launch`''', and add the following lines: {{{ }}} First, make sure you stopped the launch file from the previous tutorial (use ctrl-c). Now, you're ready to start your own turtle broadcaster demo: {{{ $ roslaunch learning_tf start_demo.launch }}} You should see the turtle sim with '''one turtle'''. ##checkingstart1 == Checking the results == Now, use the '''`tf_echo`''' tool to check if the turtle pose is actually getting broadcast to tf: {{{ $ rosrun tf tf_echo /world /turtle1 }}} This should show you the pose of the first turtle. Drive around the turtle using the arrow keys (make sure your terminal window is active, not your simulator window). If you run `tf_echo` for the transform between the world and turtle 2, you should not see a transform, because the second turtle is not there yet. However, as soon as we add the second turtle in the next tutorial, the pose of turtle 2 will be broadcast to tf. ##checkingend1 12 transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) ); 13 tf::Quaternion q; 14 q.setRPY(msg->theta, 0, 0); ##checkingstart2 To actually use the transforms broadcast to tf, you should move on to the next tutorial about creating a tf listener [[tf/Tutorials/Writing a tf listener (Python)|(Python)]] [[tf/Tutorials/Writing a tf listener (C++)|(C++)]] ##checkingend2 == Feedback == If you have any comments on this tutorial please comment below: <> ## AUTOGENERATED DO NOT DELETE ## TutorialCategory ## TutorialTurtlesim ## C++Category ## LearningCategory